24 #ifndef MXNET_RUNTIME_MEMORY_H_
25 #define MXNET_RUNTIME_MEMORY_H_
29 #include <type_traits>
40 template <
typename T,
typename... Args>
59 template <
typename Derived>
68 template <
typename T,
typename... Args>
70 using Handler =
typename Derived::template Handler<T>;
71 static_assert(std::is_base_of<Object, T>::value,
"make can only be used to create Object");
72 T* ptr = Handler::New(
static_cast<Derived*
>(
this), std::forward<Args>(args)...);
73 ptr->type_index_ = T::RuntimeTypeIndex();
74 ptr->deleter_ = Handler::Deleter();
85 template <
typename ArrayType,
typename ElemType,
typename... Args>
87 using Handler =
typename Derived::template ArrayHandler<ArrayType, ElemType>;
88 static_assert(std::is_base_of<Object, ArrayType>::value,
89 "make_inplace_array can only be used to create Object");
91 Handler::New(
static_cast<Derived*
>(
this), num_elems, std::forward<Args>(args)...);
92 ptr->type_index_ = ArrayType::RuntimeTypeIndex();
93 ptr->deleter_ = Handler::Deleter();
101 template <
typename T>
104 using StorageType =
typename std::aligned_storage<
sizeof(T),
alignof(T)>::type;
106 template <
typename... Args>
122 new (data) T(std::forward<Args>(args)...);
123 return reinterpret_cast<T*
>(data);
131 static void Deleter_(
Object* objptr) {
135 T* tptr =
static_cast<T*
>(objptr);
146 template <
typename ArrayType,
typename ElemType>
149 using StorageType =
typename std::aligned_storage<
sizeof(ArrayType),
alignof(ArrayType)>::type;
151 static_assert(
alignof(ArrayType) %
alignof(ElemType) == 0 &&
152 sizeof(ArrayType) %
alignof(ElemType) == 0,
153 "element alignment constraint");
155 template <
typename... Args>
170 size_t requested_size = num_elems *
sizeof(ElemType) +
sizeof(ArrayType);
171 size_t num_storage_slots = (requested_size + unit - 1) / unit;
173 new (data) ArrayType(std::forward<Args>(args)...);
174 return reinterpret_cast<ArrayType*
>(data);
182 static void Deleter_(
Object* objptr) {
186 ArrayType* tptr =
static_cast<ArrayType*
>(objptr);
191 tptr->ArrayType::~ArrayType();
198 template <
typename T,
typename... Args>
203 template <
typename ArrayType,
typename ElemType,
typename... Args>
206 std::forward<Args>(args)...);
211 #endif // MXNET_RUNTIME_MEMORY_H_