18 #ifndef viskores_cont_internal_DeviceAdapterMemoryManager_h
19 #define viskores_cont_internal_DeviceAdapterMemoryManager_h
42 struct TransferredBuffer;
47 struct BufferInfoInternals;
51 class VISKORES_CONT_EXPORT BufferInfo
88 using Deleter = void(
void* container);
92 using Reallocater = void(
void*& memory,
106 Reallocater reallocater);
121 detail::BufferInfoInternals* Internals;
135 struct TransferredBuffer
139 BufferInfo::Deleter* Delete;
140 BufferInfo::Reallocater* Reallocate;
146 VISKORES_CONT_EXPORT
VISKORES_CONT viskores::cont::internal::BufferInfo AllocateOnHost(
154 class VISKORES_CONT_EXPORT DeviceAdapterMemoryManagerBase
161 VISKORES_CONT virtual viskores::cont::internal::BufferInfo Allocate(
166 VISKORES_CONT void Reallocate(viskores::cont::internal::BufferInfo& buffer,
171 ManageArray(
void* memory,
174 viskores::cont::internal::BufferInfo::Deleter deleter,
175 viskores::cont::internal::BufferInfo::Reallocater reallocater)
const;
182 VISKORES_CONT virtual viskores::cont::internal::BufferInfo CopyHostToDevice(
183 const viskores::cont::internal::BufferInfo& src)
const = 0;
188 const viskores::cont::internal::BufferInfo& src,
189 const viskores::cont::internal::BufferInfo& dest)
const = 0;
193 VISKORES_CONT virtual viskores::cont::internal::BufferInfo CopyDeviceToHost(
194 const viskores::cont::internal::BufferInfo& src)
const = 0;
199 const viskores::cont::internal::BufferInfo& src,
200 const viskores::cont::internal::BufferInfo& dest)
const = 0;
204 VISKORES_CONT virtual viskores::cont::internal::BufferInfo CopyDeviceToDevice(
205 const viskores::cont::internal::BufferInfo& src)
const = 0;
210 const viskores::cont::internal::BufferInfo& src,
211 const viskores::cont::internal::BufferInfo& dest)
const = 0;
230 VISKORES_CONT virtual void CopyDeviceToDeviceRawPointer(
const void* src,
242 VISKORES_CONT virtual void DeleteRawPointer(
void*)
const = 0;
251 template <
typename DeviceAdapterTag>
252 class DeviceAdapterMemoryManager;
256 VISKORES_CONT_EXPORT
VISKORES_CONT void HostReallocate(
void*&,
262 VISKORES_CONT_EXPORT
VISKORES_CONT void InvalidRealloc(
void*&,
269 template <
typename T>
270 VISKORES_CONT inline void SimpleArrayDeleter(
void* container_)
272 T* container =
reinterpret_cast<T*
>(container_);
278 template <
typename T>
279 VISKORES_CONT inline void SimpleArrayReallocater(
void*& memory,
289 if ((newSize > ((3 * oldSize) / 4)) && (newSize <= oldSize))
294 void* newBuffer =
new T[
static_cast<std::size_t
>(newSize) /
sizeof(T)];
295 std::memcpy(newBuffer, memory,
static_cast<std::size_t
>(newSize < oldSize ? newSize : oldSize));
297 if (memory !=
nullptr)
299 SimpleArrayDeleter<T>(memory);
302 memory = container = newBuffer;
307 template <
typename T>
310 T* container =
reinterpret_cast<T*
>(container_);
314 template <
typename T,
typename Allocator>
317 CastDeleter<std::vector<T, Allocator>>(container);
320 template <
typename T,
typename Allocator>
321 VISKORES_CONT inline void StdVectorReallocater(
void*& memory,
326 using vector_type = std::vector<T, Allocator>;
327 vector_type* vector =
reinterpret_cast<vector_type*
>(container);
331 vector->resize(
static_cast<std::size_t
>(newSize));
332 memory = vector->data();
338 #endif //viskores_cont_internal_DeviceAdapterMemoryManager_h