35 #ifndef NEKTAR_LIB_UTILITIES_BASIC_UTILS_ARRAY_POLICIES_HPP
36 #define NEKTAR_LIB_UTILITIES_BASIC_UTILS_ARRAY_POLICIES_HPP
39 #include <type_traits>
43 #include <boost/core/ignore_unused.hpp>
44 #include <boost/multi_array.hpp>
48 template <
typename ObjectType,
typename enabled =
void>
53 template <
typename ObjectType>
56 typename std::enable_if<std::is_fundamental<ObjectType>::value>::type>
59 static void Initialize(ObjectType *data,
size_t itemsToCreate)
61 boost::ignore_unused(data, itemsToCreate);
64 static void Initialize(ObjectType *data,
size_t itemsToCreate,
65 const ObjectType &initValue)
67 std::fill_n(data, itemsToCreate, initValue);
70 static void Initialize(ObjectType *data,
size_t itemsToCreate,
71 const ObjectType *initValue)
73 std::copy(initValue, initValue + itemsToCreate, data);
87 template <
typename ObjectType>
90 typename std::enable_if<!std::is_fundamental<ObjectType>::value>::type>
96 static void Initialize(ObjectType *data,
size_t itemsToCreate)
98 DoInitialization(data, itemsToCreate,
99 [](ObjectType *element) {
new (element) ObjectType; });
106 static void Initialize(ObjectType *data,
size_t itemsToCreate,
107 const ObjectType &initValue)
109 DoInitialization(data, itemsToCreate, [&](ObjectType *element) {
110 new (element) ObjectType(initValue);
114 static void Initialize(ObjectType *data,
size_t itemsToCreate,
115 const ObjectType *initValue)
117 DoInitialization(data, itemsToCreate, [&](ObjectType *element) {
118 new (element) ObjectType(*initValue);
124 template <
typename CreateType>
128 size_t nextObjectToCreate = 0;
131 for (
size_t i = 0; i < itemsToCreate; ++i)
133 ObjectType *memLocation = &data[i];
135 ++nextObjectToCreate;
140 for (
size_t i = 0; i < nextObjectToCreate; ++i)
142 ObjectType *memLocation = &data[nextObjectToCreate - i - 1];
143 memLocation->~ObjectType();
150 template <
typename ObjectType,
typename enabled =
void>
153 template <
typename ObjectType>
156 typename std::enable_if<std::is_fundamental<ObjectType>::value>::type>
159 static void Destroy(ObjectType *data,
size_t itemsToDestroy)
161 boost::ignore_unused(data, itemsToDestroy);
165 template <
typename ObjectType>
168 typename std::enable_if<!std::is_fundamental<ObjectType>::value>::type>
171 static void Destroy(ObjectType *data,
size_t itemsToDestroy)
173 for (
size_t i = 0; i < itemsToDestroy; ++i)
175 ObjectType *memLocation = &data[itemsToDestroy - i - 1];
176 memLocation->~ObjectType();
181 template <
typename Dim,
typename DataType,
typename ExtentListType>
182 std::shared_ptr<boost::multi_array_ref<DataType, Dim::Value>>
CreateStorage(
183 const ExtentListType &extent)
185 typedef boost::multi_array_ref<DataType, Dim::Value> ArrayType;
186 size_t size = std::accumulate(extent.begin(), extent.end(), 1,
187 std::multiplies<size_t>());
190 [=](boost::multi_array_ref<DataType, Dim::Value> *ptr) {
191 boost::ignore_unused(ptr);
198 template <
typename DataType>
199 std::shared_ptr<boost::multi_array_ref<DataType, 1>>
CreateStorage(
size_t d1)
201 std::vector<size_t> extents = {d1};
202 return CreateStorage<OneD, DataType>(extents);
205 template <
typename DataType>
206 std::shared_ptr<boost::multi_array_ref<DataType, 2>>
CreateStorage(
size_t d1,
209 std::vector<size_t> extents = {d1, d2};
210 return CreateStorage<TwoD, DataType>(extents);
213 template <
typename DataType>
214 std::shared_ptr<boost::multi_array_ref<DataType, 3>>
CreateStorage(
size_t d1,
218 std::vector<size_t> extents = {d1, d2, d3};
219 return CreateStorage<ThreeD, DataType>(extents);
static void Destroy(ObjectType *data, size_t itemsToDestroy)
static void Destroy(ObjectType *data, size_t itemsToDestroy)
static void DoInitialization(ObjectType *data, size_t itemsToCreate, const CreateType &f)
static void Initialize(ObjectType *data, size_t itemsToCreate, const ObjectType &initValue)
Initalize each element in the array with ObjectType's copy constructor.
static void Initialize(ObjectType *data, size_t itemsToCreate)
Initalize each element in the array with ObjectType's default constructor.
static void Initialize(ObjectType *data, size_t itemsToCreate, const ObjectType *initValue)
static void Initialize(ObjectType *data, size_t itemsToCreate)
static void Initialize(ObjectType *data, size_t itemsToCreate, const ObjectType &initValue)
static void Initialize(ObjectType *data, size_t itemsToCreate, const ObjectType *initValue)
static std::shared_ptr< DataType > AllocateSharedPtrD(const DeallocatorType &d, const Args &...args)
static void RawDeallocate(DataType *array, size_t NumberOfElements)
Deallocates memory allocated from RawAllocate.
static DataType * RawAllocate(size_t NumberOfElements)
Allocates a chunk of raw, uninitialized memory, capable of holding NumberOfElements objects.
The above copyright notice and this permission notice shall be included.
std::shared_ptr< boost::multi_array_ref< DataType, Dim::Value > > CreateStorage(const ExtentListType &extent)