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