35 #ifndef NEKTAR_LIB_UTILITIES_BASIC_UTILS_SHARED_ARRAY_HPP 36 #define NEKTAR_LIB_UTILITIES_BASIC_UTILS_SHARED_ARRAY_HPP 44 #include <boost/core/ignore_unused.hpp> 45 #include <boost/multi_array.hpp> 52 template<
typename Dim,
typename DataType>
56 template<
typename DataType>
62 void (*m_callback)(
void *);
81 m_pythonInfo(nullptr),
97 explicit Array(
size_t dim1Size) :
99 m_pythonInfo(nullptr),
102 m_capacity( dim1Size ),
120 Array(
size_t dim1Size,
const DataType& initValue) :
122 m_pythonInfo(nullptr),
125 m_capacity( dim1Size ),
141 Array(
size_t dim1Size,
const DataType* data) :
143 m_pythonInfo(nullptr),
146 m_capacity( dim1Size ),
166 m_pythonInfo(rhs.m_pythonInfo),
169 m_capacity(rhs.m_capacity),
171 m_count(rhs.m_count),
172 m_offset(rhs.m_offset)
184 Array(
size_t dim1Size, DataType* data,
void* memory_pointer,
void (*python_decrement)(
void *)) :
186 m_capacity( dim1Size ),
191 m_count =
new size_t();
194 m_pythonInfo =
new PythonInfo *();
195 *m_pythonInfo =
new PythonInfo();
196 (*m_pythonInfo)->m_callback = python_decrement;
197 (*m_pythonInfo)->m_pyObject = memory_pointer;
204 m_pythonInfo(rhs.m_pythonInfo),
207 m_capacity(rhs.m_capacity),
209 m_count(rhs.m_count),
210 m_offset(rhs.m_offset)
217 if( m_count ==
nullptr )
226 if (*m_pythonInfo ==
nullptr)
233 (*m_pythonInfo)->m_callback((*m_pythonInfo)->m_pyObject);
234 delete *m_pythonInfo;
257 if (*m_pythonInfo ==
nullptr)
262 else if ((*rhs.m_pythonInfo) !=
nullptr && (*m_pythonInfo)->m_pyObject != (*rhs.m_pythonInfo)->m_pyObject)
264 (*m_pythonInfo)->m_callback((*m_pythonInfo)->m_pyObject);
265 delete *m_pythonInfo;
284 m_pythonInfo = rhs.m_pythonInfo;
289 const_iterator
begin()
const {
return m_data + m_offset; }
290 const_iterator
end()
const {
return m_data + m_offset + m_size; }
295 std::string(
"Element ") + std::to_string(i) +
296 std::string(
" requested in an array of size ") +
297 std::to_string(m_size));
298 return *( m_data + i + m_offset );
302 const element*
get()
const {
return m_data + m_offset; }
305 const element*
data()
const {
return m_data + m_offset; }
324 const element* start =
get();
325 const element* end = start + m_size;
327 const element* rhs_start = rhs.
get();
328 const element* rhs_end = rhs_start + rhs.
num_elements();
330 return (rhs_start >= start && rhs_start <= end) ||
331 (rhs_end >= start && rhs_end <= end);
337 return *m_pythonInfo !=
nullptr;
340 void ToPythonArray(
void* memory_pointer,
void (*python_decrement)(
void *))
342 *m_pythonInfo =
new PythonInfo();
343 (*m_pythonInfo)->m_callback = python_decrement;
344 (*m_pythonInfo)->m_pyObject = memory_pointer;
348 template<
typename T1,
typename T2>
372 PythonInfo **m_pythonInfo;
408 m_count =
new size_t();
411 m_pythonInfo =
new PythonInfo*();
412 *m_pythonInfo =
nullptr;
420 result.m_offset += offset;
421 result.m_size = rhs.m_size - offset;
429 template<
typename DataType>
437 typedef typename ArrayType::index
index;
453 Array(
size_t dim1Size,
size_t dim2Size) :
459 Array(
size_t dim1Size,
size_t dim2Size,
const DataType& initValue) :
465 Array(
size_t dim1Size,
size_t dim2Size,
const DataType* data) :
487 const_iterator
begin()
const {
return m_data->begin(); }
488 const_iterator
end()
const {
return m_data->end(); }
489 const_reference
operator[](index i)
const {
return (*m_data)[i]; }
490 const element*
get()
const {
return m_data->data(); }
491 const element*
data()
const {
return m_data->data(); }
493 const size_type*
shape()
const {
return m_data->shape(); }
496 size_t GetRows()
const {
return m_data->shape()[0]; }
522 template<
typename DataType>
543 Array(
size_t dim1Size,
const DataType& initValue) :
544 BaseType(dim1Size, initValue)
548 Array(
size_t dim1Size,
const DataType* data) :
549 BaseType(dim1Size, data)
554 BaseType(dim1Size, rhs)
559 BaseType(dim1Size, rhs.data())
569 BaseType(rhs.num_elements(), rhs.data())
574 Array(
size_t dim1Size, DataType* data,
void* memory_pointer,
void (*python_decrement)(
void *)) :
575 BaseType(dim1Size, data, memory_pointer, python_decrement)
579 void ToPythonArray(
void* memory_pointer,
void (*python_decrement)(
void *))
581 BaseType::ToPythonArray(memory_pointer, python_decrement);
587 BaseType::operator=(rhs);
601 iterator
begin() {
return this->m_data + this->m_offset; }
604 iterator
end() {
return this->m_data + this->m_offset + this->m_size; }
606 using BaseType::operator[];
609 ASSERTL1(static_cast<size_type>(i) < this->num_elements(),
610 std::string(
"Element ") + std::to_string(i) +
611 std::string(
" requested in an array of size ") +
612 std::to_string(this->num_elements()));
618 element*
get() {
return this->m_data + this->m_offset; }
620 using BaseType::data;
621 element*
data() {
return this->m_data + this->m_offset; }
623 template<
typename T1>
626 template<
typename T1,
typename T3>
635 boost::ignore_unused(a);
640 ASSERTL1(newSize <= this->m_capacity,
"Can't change an array size to something larger than its capacity.");
641 this->m_size = newSize;
649 template<
typename DataType>
666 Array(
size_t dim1Size,
size_t dim2Size) :
667 BaseType(dim1Size, dim2Size)
671 Array(
size_t dim1Size,
size_t dim2Size,
const DataType& initValue) :
672 BaseType(dim1Size, dim2Size, initValue)
676 Array(
size_t dim1Size,
size_t dim2Size,
const DataType* data) :
677 BaseType(dim1Size, dim2Size, data)
688 BaseType::operator=(rhs);
692 using BaseType::begin;
693 iterator
begin() {
return this->m_data->begin(); }
696 iterator
end() {
return this->m_data->end(); }
698 using BaseType::operator[];
702 element*
get() {
return this->m_data->data(); }
704 using BaseType::data;
705 element*
data() {
return this->m_data->data(); }
716 template<
typename T1,
typename T2>
719 if( lhs.num_elements() != rhs.num_elements() )
724 if( lhs.data() == rhs.data() )
729 for(
unsigned int i = 0; i < lhs.num_elements(); ++i)
731 if( lhs[i] != rhs[i] )
740 template<
typename T1,
typename T2>
743 return !(lhs ==
rhs);
746 template<
typename DataType>
752 template<
typename DataType>
764 template<
typename ConstDataType,
typename DataType>
772 std::copy(source.data(), source.data() + source.num_elements(), dest.
data());
775 template<
typename ConstDataType,
typename DataType>
795 template<
typename DataType>
801 template<
typename DataType>
804 return !(lhs ==
rhs);
807 namespace LibUtilities
812 = { NullNekDoubleVector };
816 #endif //NEKTAR_LIB_UTILITIES_BASIC_UTILS_SHARED_ARRAY_HPP
Array(size_t dim1Size, size_t dim2Size)
Array(size_t dim1Size, size_t dim2Size)
Constructs a 2 dimensional array. The elements of the array are not initialized.
#define ASSERTL0(condition, msg)
std::shared_ptr< boost::multi_array_ref< DataType, Dim::Value > > CreateStorage(const ExtentListType &extent)
size_t GetCount() const
Returns the array's reference counter.
Array(const Array< TwoD, DataType > &rhs)
Array(size_t dim1Size, const DataType *data)
Creates a 1D array a copies data into it.
const DataType * const_iterator
BaseType::element element
static Array< OneD, NekDouble > NullNekDouble1DArray
const element * get() const
Returns a c-style pointer to the underlying array.
Array(size_t dim1Size, size_t dim2Size, const DataType &initValue)
Array(const Array< OneD, DataType > &rhs)
Array(const Array< TwoD, const DataType > &rhs)
2D array with garbage collection and bounds checking.
Array(size_t dim1Size, size_t dim2Size, const DataType *data)
static void RawDeallocate(DataType *array, size_t NumberOfElements)
Deallocates memory allocated from RawAllocate.
ArrayType::iterator iterator
Array()
Creates an empty array.
static DataType * RawAllocate(size_t NumberOfElements)
Allocates a chunk of raw, uninitialized memory, capable of holding NumberOfElements objects...
ArrayType::const_reference const_reference
Array< TwoD, DataType > & operator=(const Array< TwoD, DataType > &rhs)
Array(size_t dim1Size, const Array< OneD, DataType > &rhs)
ArrayType::size_type size_type
const_iterator end() const
Array(size_t dim1Size)
Creates an array of size dim1Size.
BaseType::iterator iterator
void ChangeSize(size_t newSize)
const_iterator begin() const
static Array< OneD, T > CreateWithOffset(const Array< OneD, T > &rhs, size_t offset)
ArrayType::element element
bool operator==(const Array< OneD, NekDouble > &lhs, const Array< OneD, NekDouble > &rhs)
size_t GetOffset() const
Returns the array's offset.
bool Overlaps(const Array< OneD, const DataType > &rhs) const
Returns true is this array and rhs overlap.
size_t GetColumns() const
ArrayType::reference reference
size_t num_dimensions() const
Returns 1.
Array(const Array< OneD, const DataType > &rhs)
Array(size_t dim1Size, const DataType &initValue)
Creates a 1D array with each element initialized to an initial value.
BaseType::size_type size_type
const element * data() const
Returns a c-style pointer to the underlying array.
std::shared_ptr< ArrayType > m_data
Array(size_t dim1Size, const DataType &initValue)
static std::vector< NekDouble > NullNekDoubleVector
Array< TwoD, const DataType > & operator=(const Array< TwoD, const DataType > &rhs)
Array< OneD, const DataType > & operator=(const Array< OneD, const DataType > &rhs)
Creates a reference to rhs.
static const NekDouble kNekZeroTol
boost::multi_array_ref< DataType, 2 > ArrayType
Array(size_t dim1Size, size_t dim2Size, const DataType &initValue)
AllowWrappingOfConstArrays
const_reference operator[](index i) const
Array(const Array< OneD, const DataType > &rhs)
Creates a reference to rhs.
bool operator!=(const Array< OneD, T1 > &lhs, const Array< OneD, T2 > &rhs)
#define LIB_UTILITIES_EXPORT
void CopyArrayN(const Array< OneD, ConstDataType > &source, Array< OneD, DataType > &dest, unsigned int n)
const_iterator begin() const
static std::vector< std::vector< NekDouble > > NullVectorNekDoubleVector
const_iterator end() const
static std::vector< unsigned int > NullUnsignedIntVector
Array< OneD, const DataType > BaseType
static Array< OneD, DataType > CreateWithOffset(const Array< OneD, DataType > &rhs, unsigned int offset)
void CopyArray(const Array< OneD, ConstDataType > &source, Array< OneD, DataType > &dest)
Array(size_t dim1Size, const DataType *data)
size_t num_elements() const
BaseType::reference reference
BaseType::size_type size_type
Array(size_t dim1Size, const Array< OneD, const DataType > &rhs)
Creates a 1D array that references rhs.
const DataType & const_reference
const_reference operator[](size_t i) const
size_t num_dimensions() const
ArrayType::const_iterator const_iterator
BaseType::element element
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs
Array< OneD, const DataType >::const_iterator begin() const
BaseType::reference reference
size_t num_elements() const
Returns the array's size.
reference operator[](index i)
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayofArray
const element * data() const
static Array< OneD, int > NullInt1DArray
Array< OneD, DataType > & operator=(const Array< OneD, DataType > &rhs)
1D Array of constant elements with garbage collection and bounds checking.
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Array(const Array< OneD, const DataType > &rhs, AllowWrappingOfConstArrays a)
Array< OneD, DataType > operator+(const Array< OneD, DataType > &lhs, size_t offset)
reference operator[](size_t i)
Array< TwoD, const DataType > BaseType
void CreateStorage(size_t size)
BaseType::iterator iterator
Array(size_t dim1Size, size_t dim2Size, const DataType *data)
Array(size_t dim1Size, const Array< OneD, const DataType > &rhs)
bool IsEqual(const Array< OneD, const NekDouble > &lhs, const Array< OneD, const NekDouble > &rhs, NekDouble tol)
const size_type * shape() const