MUDA
Loading...
Searching...
No Matches
field_entry_view_matrix.inl
1namespace muda
2{
3template <bool IsConst, typename T, FieldEntryLayout Layout, int M, int N>
4class FieldEntryViewBase : public FieldEntryViewCore<IsConst, T, Layout, M, N>
5{
8
9 template <typename U>
10 using auto_const_t = typename Base::template auto_const_t<U>;
11
12 public:
13 using Base::Base;
17 using ElementType = Eigen::Matrix<T, M, N>;
18
19 using ConstMatrixMap = typename Base::ConstMatMap;
20 using ThisMatrixMap = typename Base::ThisMatMap;
21
22
23 MUDA_GENERIC FieldEntryViewBase(const Base& base)
24 : Base(base)
25 {
26 }
27
28 MUDA_GENERIC auto as_const() const
29 {
30 return ConstView{this->m_core, Base::offset(), Base::size()};
31 }
32 MUDA_GENERIC operator ConstView() const { return as_const(); }
33
34
35 MUDA_GENERIC auto_const_t<T>* data(int i, int row_index, int col_index)
36 {
37 return Base::data(i, row_index, col_index);
38 }
39
40 MUDA_GENERIC const T* data(int i, int row_index, int col_index) const
41 {
42 return remove_const(this)->data(i, row_index, col_index);
43 }
44
45 MUDA_GENERIC auto subview(int offset) const
46 {
47 return ConstView{this->m_core, this->m_offset + offset, this->m_size - offset};
48 }
49
50 MUDA_GENERIC auto subview(int offset, int size) const
51 {
52 return ConstView{this->m_core, this->m_offset + offset, size};
53 }
54
55 MUDA_GENERIC auto subview(int offset)
56 {
57 return ThisView{this->m_core, this->m_offset + offset, this->m_size - offset};
58 }
59
60 MUDA_GENERIC auto subview(int offset, int size)
61 {
62 return ThisView{this->m_core, this->m_offset + offset, size};
63 }
64
65 /**********************************************************************************
66 * Entry View As Iterator
67 ***********************************************************************************/
68
70 {
71 ThisMatrixMap map;
72
73 public:
74 MUDA_GENERIC DummyPointer(ThisMatrixMap map)
75 : map(map)
76 {
77 }
78 MUDA_GENERIC auto operator*() { return map; }
79 };
80
81 // Random Access Iterator Interface
82 using value_type = ElementType;
83 using reference = ThisMatrixMap;
84 using pointer = DummyPointer;
85 using iterator_category = std::random_access_iterator_tag;
86 using difference_type = size_t;
87
88 MUDA_GENERIC ThisView operator+(int i)
89 {
90 return ThisView{this->m_core, this->m_offset + i, this->m_size - i, typename Base::AsIterator{}};
91 }
92 MUDA_GENERIC ConstView operator+(int i) const
93 {
94 return remove_const(*this).operator+(i).as_const();
95 }
96 MUDA_GENERIC reference operator*() { return (*this)[0]; }
97
98 MUDA_GENERIC auto operator[](int i)
99 {
100 return ThisMatrixMap{data(i, 0, 0), this->m_stride};
101 }
102 MUDA_GENERIC auto operator[](int i) const
103 {
104 return ConstMatrixMap{data(i, 0, 0), this->m_stride};
105 }
106};
107
108template <typename T, FieldEntryLayout Layout, int M, int N>
109class CFieldEntryView : public FieldEntryViewBase<true, T, Layout, M, N>
110{
112
113 public:
114 using Base::Base;
118 using ElementType = typename Base::ElementType;
119
120 MUDA_GENERIC CFieldEntryView(const Base& base)
121 : Base(base)
122 {
123 }
124
125 MUDA_GENERIC auto as_const() const { return *this; }
126 MUDA_GENERIC operator ConstView() const { return as_const(); }
127
128 MUDA_GENERIC auto subview(int offset) const
129 {
130 return ConstView{Base::subview(offset)};
131 }
132
133 MUDA_GENERIC auto subview(int offset, int size) const
134 {
135 return ConstView{Base::subview(offset, size)};
136 }
137
138 MUDA_GENERIC auto subview(int offset)
139 {
140 return ThisView{Base::subview(offset)};
141 }
142
143 MUDA_GENERIC auto subview(int offset, int size)
144 {
145 return ThisView{Base::subview(offset, size)};
146 }
147
148 MUDA_HOST void copy_to(BufferView<ElementType> dst) const;
149};
150
151
152template <typename T, FieldEntryLayout Layout, int M, int N>
153class FieldEntryView : public FieldEntryViewBase<false, T, Layout, M, N>
154{
156
157 public:
158 using Base::Base;
162 using ElementType = typename Base::ElementType;
163
164 MUDA_GENERIC FieldEntryView(const Base& base)
165 : Base(base)
166 {
167 }
168
169 MUDA_GENERIC ConstView as_const() const
170 {
171 return ConstView{Base::as_const()};
172 }
173 MUDA_GENERIC operator ConstView() const { return as_const(); }
174
175 MUDA_GENERIC auto subview(int offset) const
176 {
177 return ConstView{Base::subview(offset)};
178 }
179
180 MUDA_GENERIC auto subview(int offset, int size) const
181 {
182 return ConstView{Base::subview(offset, size)};
183 }
184
185 MUDA_GENERIC auto subview(int offset)
186 {
187 return ThisView{Base::subview(offset)};
188 }
189
190 MUDA_GENERIC auto subview(int offset, int size)
191 {
192 return ThisView{Base::subview(offset, size)};
193 }
194
195 template <FieldEntryLayout SrcLayout>
196 MUDA_HOST void copy_from(CFieldEntryView<T, SrcLayout, M, N> src);
197 MUDA_HOST void copy_from(CBufferView<ElementType> src);
198 MUDA_HOST void copy_to(BufferView<ElementType> src) const
199 {
200 as_const().copy_to(src);
201 }
202 MUDA_HOST void fill(const ElementType& value);
203};
204} // namespace muda
205
206#include <muda/ext/field/field_entry_launch.h>
207
208namespace muda
209{
210template <typename T, FieldEntryLayout Layout, int M, int N>
211template <FieldEntryLayout SrcLayout>
212MUDA_HOST void FieldEntryView<T, Layout, M, N>::copy_from(CFieldEntryView<T, SrcLayout, M, N> src)
213{
214 FieldEntryLaunch() //
215 .copy(*this, src)
216 .wait();
217}
218
219template <typename T, FieldEntryLayout Layout, int M, int N>
220MUDA_HOST void FieldEntryView<T, Layout, M, N>::copy_from(CBufferView<ElementType> src)
221{
222 FieldEntryLaunch() //
223 .copy(*this, src)
224 .wait();
225}
226
227template <typename T, FieldEntryLayout Layout, int M, int N>
228MUDA_HOST void CFieldEntryView<T, Layout, M, N>::copy_to(BufferView<ElementType> dst) const
229{
230 FieldEntryLaunch() //
231 .copy(dst, *this)
232 .wait();
233}
234
235template <typename T, FieldEntryLayout Layout, int M, int N>
236MUDA_HOST void FieldEntryView<T, Layout, M, N>::fill(const ElementType& value)
237{
238 FieldEntryLaunch() //
239 .fill(*this, value)
240 .wait();
241}
242} // namespace muda
Definition field_entry_view_matrix.inl:110
Definition field_entry_view_matrix.inl:70
Definition field_entry_view_matrix.inl:5
Definition field_entry_view.h:16
Definition field_entry_view_matrix.inl:154
Definition field_entry_viewer_matrix.inl:5
Definition field_entry_view.h:59