54 using ThatClass = DualUniqueArray<DataType>;
62 virtual ~IModifierImpl() =
default;
67 virtual void resize(
Int32 new_size) = 0;
68 virtual void endUpdate() = 0;
75 friend class DualUniqueArray<DataType>;
79 explicit Modifier(IModifierImpl* p)
93 void resize(
Int32 new_size) { m_p->resize(new_size); }
97 IModifierImpl* m_p =
nullptr;
103 friend class DualUniqueArray<DataType>;
107 explicit HostModifier(ThatClass* data)
108 : Modifier(&data->m_array_modifier)
118 ThatClass* m_data =
nullptr;
123 class NumArrayModifierImpl
124 :
public IModifierImpl
126 friend class DualUniqueArray<DataType>;
130 NumArrayModifierImpl(ThatClass* v)
138 void resize(Int32 new_size)
override
140 m_data->resizeDevice(new_size);
142 void endUpdate()
override
144 m_data->endUpdate(
true);
149 ThatClass* m_data =
nullptr;
152 class UniqueArrayModifierImpl
153 :
public IModifierImpl
155 friend class DualUniqueArray<DataType>;
159 UniqueArrayModifierImpl(ThatClass* v)
162 SmallSpan<DataType> view()
override
164 return m_data->m_array.view();
166 void resize(
Int32 new_size)
override
168 m_data->m_array.resize(new_size);
170 void endUpdate()
override
172 m_data->endUpdate(
false);
177 ThatClass* m_data =
nullptr;
183 : m_numarray_modifier(this)
184 , m_array_modifier(this)
187 explicit DualUniqueArray(IMemoryAllocator* a)
190 m_array = UniqueArray<DataType>(a);
195 SmallSpan<const DataType> hostSmallSpan()
const {
return m_array.view(); }
196 ConstArrayView<DataType> hostView()
const {
return m_array.view(); }
198 void reserve(
Int64 capacity)
200 m_array.reserve(capacity);
202 void resizeHost(
Int32 new_size)
204 m_array.resize(new_size);
205 m_is_valid_numarray =
false;
207 void fillHost(
const DataType& value)
210 m_is_valid_numarray =
false;
212 void resizeDevice(
Int32 new_size)
214 _checkCreateNumArray();
215 m_device_array->resize(new_size);
216 m_is_valid_array =
false;
221 m_is_valid_numarray =
false;
223 Int64 size()
const {
return m_array.size(); }
224 SmallSpan<const DataType> view(
bool is_device)
228 SmallSpan<const DataType> v = *(m_device_array.get());
232 return hostSmallSpan();
235 void sync(
bool is_device)
238 _checkUpdateDeviceView();
241 _checkUpdateHostView();
246 m_is_valid_array =
true;
247 m_is_valid_numarray =
false;
249 void endUpdate(
bool is_device)
251 m_is_valid_array = !is_device;
252 m_is_valid_numarray = is_device;
257 _checkCreateNumArray();
258 return Modifier(&m_numarray_modifier);
269 UniqueArray<DataType> m_array;
270 std::unique_ptr<NumArrayType> m_device_array;
271 SmallSpan<DataType> m_device_view;
272 NumArrayModifierImpl m_numarray_modifier;
273 UniqueArrayModifierImpl m_array_modifier;
274 bool m_is_valid_array =
true;
275 bool m_is_valid_numarray =
false;
279 void _checkUpdateDeviceView()
281 if (!m_is_valid_numarray) {
282 _checkCreateNumArray();
283 MDSpan<DataType, MDDim1> s(m_array.data(), ArrayIndex<1>(m_array.size()));
284 m_device_array->copy(s);
285 m_is_valid_numarray =
true;
287 m_device_view = *(m_device_array.get());
289 void _checkUpdateHostView()
291 if (!m_is_valid_array) {
292 _checkCreateNumArray();
293 SmallSpan<const DataType> device_view = *(m_device_array.get());
294 m_array.resize(device_view.size());
296 m_is_valid_array =
true;
299 void _checkCreateNumArray()
301 if (!m_device_array) {
302 m_device_array = std::make_unique<NumArrayType>(eMemoryRessource::Device);
303 if (m_is_valid_array)
304 m_device_array->resize(m_array.size());
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converts the view into an array of non-modifiable bytes.
Impl::SpanTypeFromSize< std::byte, SizeType >::SpanType asWritableBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converts the view into an array of modifiable bytes.