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,
72 "make can only be used to create Object");
73 T* ptr = Handler::New(static_cast<Derived*>(
this),
74 std::forward<Args>(args)...);
75 ptr->type_index_ = T::RuntimeTypeIndex();
76 ptr->deleter_ = Handler::Deleter();
87 template<
typename ArrayType,
typename ElemType,
typename... Args>
89 using Handler =
typename Derived::template ArrayHandler<ArrayType, ElemType>;
90 static_assert(std::is_base_of<Object, ArrayType>::value,
91 "make_inplace_array can only be used to create Object");
92 ArrayType* ptr = Handler::New(static_cast<Derived*>(
this),
94 std::forward<Args>(args)...);
95 ptr->type_index_ = ArrayType::RuntimeTypeIndex();
96 ptr->deleter_ = Handler::Deleter();
108 using StorageType =
typename std::aligned_storage<sizeof(T), alignof(T)>::type;
110 template<
typename... Args>
126 new (data) T(std::forward<Args>(args)...);
127 return reinterpret_cast<T*
>(data);
135 static void Deleter_(
Object* objptr) {
139 T* tptr =
static_cast<T*
>(objptr);
150 template<
typename ArrayType,
typename ElemType>
153 using StorageType =
typename std::aligned_storage<sizeof(ArrayType), alignof(ArrayType)>::type;
155 static_assert(
alignof(ArrayType) %
alignof(ElemType) == 0 &&
156 sizeof(ArrayType) %
alignof(ElemType) == 0,
157 "element alignment constraint");
159 template<
typename... Args>
174 size_t requested_size = num_elems *
sizeof(ElemType) +
sizeof(ArrayType);
175 size_t num_storage_slots = (requested_size + unit - 1) / unit;
177 new (data) ArrayType(std::forward<Args>(args)...);
178 return reinterpret_cast<ArrayType*
>(data);
186 static void Deleter_(
Object* objptr) {
190 ArrayType* tptr =
static_cast<ArrayType*
>(objptr);
195 tptr->ArrayType::~ArrayType();
202 template<
typename T,
typename... Args>
207 template<
typename ArrayType,
typename ElemType,
typename... Args>
210 num_elems, std::forward<Args>(args)...);
215 #endif // MXNET_RUNTIME_MEMORY_H_ typename std::aligned_storage< sizeof(ArrayType), alignof(ArrayType)>::type StorageType
Definition: memory.h:153
typename std::aligned_storage< sizeof(T), alignof(T)>::type StorageType
Definition: memory.h:108
namespace of mxnet
Definition: api_registry.h:33
A custom smart pointer for Object.
Definition: object.h:345
ObjectPtr< T > make_object(Args &&...args)
Make a new object using the allocator.
Definition: memory.h:69
ObjectPtr< T > make_object(Args &&...args)
Allocate an object using default allocator.
Definition: memory.h:203
static T * New(SimpleObjAllocator *, Args &&...args)
Definition: memory.h:111
static ArrayType * New(SimpleObjAllocator *, size_t num_elems, Args &&...args)
Definition: memory.h:160
base class of all object containers.
Definition: object.h:149
Base class of object allocators that implements make. Use curiously recurring template pattern...
Definition: memory.h:60
A managed object in MXNet runtime.
static Object::FDeleter Deleter()
Definition: memory.h:181
ObjectPtr< ArrayType > make_inplace_array(size_t num_elems, Args &&...args)
Definition: memory.h:88
void(* FDeleter)(Object *self)
Object deleter.
Definition: object.h:155
static Object::FDeleter Deleter()
Definition: memory.h:130
ObjectPtr< ArrayType > make_inplace_array_object(size_t num_elems, Args &&...args)
Definition: memory.h:208