65 template<
typename T,
typename ...ArgTypes>
66 T*
New(
const char* allocationTag, ArgTypes&&... args)
68 void *rawMemory =
Malloc(allocationTag,
sizeof(T));
70 T *constructedMemory =
new (rawMemory) T(std::forward<ArgTypes>(args)...);
71 return constructedMemory;
81 if (pointerToT ==
nullptr)
93 return std::is_class<T>::value;
99 return !std::is_trivially_destructible<T>::value;
107 T*
NewArray(std::size_t amount,
const char* allocationTag)
111 bool constructMembers = ShouldConstructArrayMembers<T>();
112 bool trackMemberCount = ShouldDestroyArrayMembers<T>();
115 std::size_t allocationSize = amount *
sizeof(T);
116 if (trackMemberCount)
118 allocationSize +=
sizeof(std::size_t);
121 void* rawMemory =
Malloc(allocationTag, allocationSize);
122 T* pointerToT =
nullptr;
124 if (trackMemberCount)
126 std::size_t* pointerToAmount =
reinterpret_cast<std::size_t*
>(rawMemory);
127 *pointerToAmount = amount;
128 pointerToT =
reinterpret_cast<T*
>(
reinterpret_cast<void*
>(pointerToAmount + 1));
132 pointerToT =
reinterpret_cast<T*
>(rawMemory);
135 if (constructMembers)
137 for (std::size_t i = 0; i < amount; ++i)
139 new (pointerToT + i) T;
156 if (pointerToTArray ==
nullptr)
161 bool destroyMembers = ShouldDestroyArrayMembers<T>();
162 void* rawMemory =
nullptr;
166 std::size_t *pointerToAmount =
reinterpret_cast<std::size_t *
>(
reinterpret_cast<void *
>(pointerToTArray)) - 1;
167 std::size_t amount = *pointerToAmount;
169 for (std::size_t i = amount; i > 0; --i)
171 (pointerToTArray + i - 1)->~T();
173 rawMemory =
reinterpret_cast<void *
>(pointerToAmount);
177 rawMemory =
reinterpret_cast<void *
>(pointerToTArray);
191 template<class U, class = typename std::enable_if<std::is_convertible<U *, T *>::value,
void>::type>
198 static_assert(0 <
sizeof(T),
"can't delete an incomplete type");
203 template<
typename T >
using UniquePtr = std::unique_ptr< T, Deleter< T > >;
209 template<
typename T,
typename ...ArgTypes>
212 return UniquePtr<T>(Aws::New<T>(allocationTag, std::forward<ArgTypes>(args)...));
220 template<class U, class = typename std::enable_if<std::is_convertible<U *, T *>::value,
void>::type>
227 static_assert(0 <
sizeof(T),
"can't delete an incomplete type");
232 template<
typename T >
using UniqueArrayPtr = std::unique_ptr< T, ArrayDeleter< T > >;
238 template<
typename T,
typename ...ArgTypes>
241 return UniqueArrayPtr<T>(Aws::NewArray<T>(amount, allocationTag, std::forward<ArgTypes>(args)...));
void DeleteArray(T *pointerToTArray)
bool ShouldConstructArrayMembers()
void Delete(T *pointerToT)
bool ShouldDestroyArrayMembers()
UniqueArrayPtr< T > MakeUniqueArray(std::size_t amount, const char *allocationTag, ArgTypes &&...args)
void operator()(T *pointerToT) const
ArrayDeleter(const ArrayDeleter< U > &)
AWS_CORE_API void ShutdownAWSMemorySystem(void)
UniquePtr< T > MakeUnique(const char *allocationTag, ArgTypes &&...args)
std::unique_ptr< T, ArrayDeleter< T > > UniqueArrayPtr
AWS_CORE_API void InitializeAWSMemorySystem(MemorySystemInterface &memorySystem)
AWS_CORE_API MemorySystemInterface * GetMemorySystem()
void operator()(T *pointerToTArray) const
AWS_CORE_API void Free(void *memoryPtr)
T * New(const char *allocationTag, ArgTypes &&...args)
std::unique_ptr< T, Deleter< T > > UniquePtr
T * NewArray(std::size_t amount, const char *allocationTag)
AWS_CORE_API void * Malloc(const char *allocationTag, size_t allocationSize)
JSON (JavaScript Object Notation).
Deleter(const Deleter< U > &)