35 #ifndef NEKTAR_LIB_UTILITIES_BASIC_UTILS_ARRAY_POLICIES_HPP
36 #define NEKTAR_LIB_UTILITIES_BASIC_UTILS_ARRAY_POLICIES_HPP
38 #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,
const ObjectType& initValue)
66 std::fill_n(data, itemsToCreate, initValue);
69 static void Initialize(ObjectType* data,
size_t itemsToCreate,
const ObjectType* initValue)
71 std::copy(initValue, initValue + itemsToCreate, data);
85 template<
typename ObjectType>
88 typename std::enable_if<!std::is_fundamental<ObjectType>::value>::type>
94 static void Initialize(ObjectType* data,
size_t itemsToCreate)
98 [](ObjectType *element) {
new (element) ObjectType; });
105 static void Initialize(ObjectType* data,
size_t itemsToCreate,
const ObjectType& initValue)
109 [&](ObjectType *element) {
new (element) ObjectType(initValue); });
112 static void Initialize(ObjectType* data,
size_t itemsToCreate,
const ObjectType* initValue)
116 [&](ObjectType *element) {
new (element) ObjectType(*initValue); initValue++; });
120 template<
typename CreateType>
123 size_t nextObjectToCreate = 0;
126 for(
size_t i = 0; i < itemsToCreate; ++i)
128 ObjectType* memLocation = &data[i];
130 ++nextObjectToCreate;
135 for(
size_t i = 0; i < nextObjectToCreate; ++i)
137 ObjectType* memLocation = &data[nextObjectToCreate - i - 1];
138 memLocation->~ObjectType();
146 template<
typename ObjectType,
typename enabled =
void>
149 template<
typename ObjectType>
151 typename std::enable_if<std::is_fundamental<ObjectType>::value>::type>
154 static void Destroy(ObjectType* data,
size_t itemsToDestroy)
156 boost::ignore_unused(data, itemsToDestroy);
160 template<
typename ObjectType>
162 typename std::enable_if<!std::is_fundamental<ObjectType>::value>::type>
165 static void Destroy(ObjectType* data,
size_t itemsToDestroy)
167 for(
size_t i = 0; i < itemsToDestroy; ++i)
169 ObjectType* memLocation = &data[itemsToDestroy - i - 1];
170 memLocation->~ObjectType();
175 template<
typename Dim,
typename DataType,
typename ExtentListType>
176 std::shared_ptr<boost::multi_array_ref<DataType, Dim::Value> >
179 typedef boost::multi_array_ref<DataType, Dim::Value> ArrayType;
180 size_t size = std::accumulate(extent.begin(), extent.end(), 1,
181 std::multiplies<size_t>());
184 [=](boost::multi_array_ref<DataType, Dim::Value> *ptr) {
185 boost::ignore_unused(ptr);
192 template<
typename DataType>
193 std::shared_ptr<boost::multi_array_ref<DataType, 1> >
196 std::vector<size_t> extents = { d1 };
197 return CreateStorage<OneD, DataType>(extents);
200 template<
typename DataType>
201 std::shared_ptr<boost::multi_array_ref<DataType, 2> >
204 std::vector<size_t> extents = { d1, d2 };
205 return CreateStorage<TwoD, DataType>(extents);
208 template<
typename DataType>
209 std::shared_ptr<boost::multi_array_ref<DataType, 3> >
212 std::vector<size_t> extents = { d1, d2, d3 };
213 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)