#ifndef included_ArrayClass_hpp #define included_ArrayClass_hpp #include "common/Array.h" #include "common/Utilities.h" #include #include #include template void DeleteArray( TYPE* x ) { delete [] x; } /******************************************************** * Constructors * ********************************************************/ template Array::Array( ) { d_ndim = 0; d_length = 0; for (size_t i=0; i Array::Array( size_t N ) { allocate(std::vector(1,N)); } template Array::Array( size_t N_rows, size_t N_columns ) { std::vector N(2); N[0] = N_rows; N[1] = N_columns; allocate(N); } template Array::Array( size_t N1, size_t N2, size_t N3 ) { std::vector N(3); N[0] = N1; N[1] = N2; N[2] = N3; allocate(N); } template Array::Array( const std::vector& N ) { allocate(N); } template void Array::allocate( const std::vector& N ) { d_ndim = N.size(); d_length = 1; for (size_t i=0; i 0 ) d_ptr = std::shared_ptr(new TYPE[d_length],DeleteArray); d_data = d_ptr.get(); if ( d_length>0 && d_data==NULL ) ERROR("Failed to allocate array"); } template Array::Array( const Array& rhs ): d_ndim(rhs.d_ndim), d_length(rhs.d_length), d_data(NULL) { allocate( std::vector(rhs.d_N,rhs.d_N+rhs.d_ndim) ); for (size_t i=0; i Array& Array::operator=( const Array& rhs ) { if ( this == &rhs ) return *this; this->allocate( rhs.size() ); for (size_t i=0; id_data[i] = rhs.d_data[i]; return *this; } template Array::~Array( ) { } /******************************************************** * Resize the array * ********************************************************/ template void Array::resize( size_t N ) { resize(std::vector(1,N)); } template void Array::resize( size_t N1, size_t N2 ) { std::vector N(2); N[0] = N1; N[1] = N2; resize(N); } template void Array::resize( size_t N1, size_t N2, size_t N3 ) { std::vector N(3); N[0] = N1; N[1] = N2; N[2] = N3; resize(N); } template void Array::resize( const std::vector& N ) { // Check if the array actually changed size size_t new_length = 1; for (size_t i=0; i N1(ndim_max,1), N2(ndim_max,1); for (int d=0; d old_data = d_ptr; // Allocate new data allocate(N); // Copy the old values if ( d_length > 0 ) { ASSERT(sizeof(d_N)/sizeof(size_t)==4); TYPE *data1 = old_data.get(); TYPE *data2 = d_data; for (size_t m=0; m void Array::reshape( const std::vector& N ) { size_t new_length = 1; for (size_t i=0; i bool Array::operator==( const Array& rhs ) const { if ( this==&rhs ) return true; if ( d_length!=rhs.d_length ) return false; bool match = true; for (size_t i=0; i std::shared_ptr > Array::view( size_t N, std::shared_ptr data ) { view(std::vector(1,N),data); } template std::shared_ptr > Array::view( size_t N1, size_t N2, std::shared_ptr data ) { std::vector N(2); N[0] = N1; N[1] = N2; view(N,data); } template std::shared_ptr > Array::view( size_t N1, size_t N2, size_t N3, std::shared_ptr data ) { std::vector N(3); N[0] = N1; N[1] = N2; N[2] = N3; view(N,data); } template std::shared_ptr > Array::constView( size_t N, std::shared_ptr data ) { constView(std::vector(1,N),data); } template std::shared_ptr > Array::constView( size_t N1, size_t N2, std::shared_ptr data ) { std::vector N(2); N[0] = N1; N[1] = N2; constView(N,data); } template std::shared_ptr > Array::constView( size_t N1, size_t N2, size_t N3, std::shared_ptr data ) { std::vector N(3); N[0] = N1; N[1] = N2; N[2] = N3; constView(N,data); } template std::shared_ptr > Array::view( const std::vector& N, std::shared_ptr data ) { std::shared_ptr > array(new Array()); array->d_ndim = N.size(); array->d_length = 1; for (size_t i=0; id_N[i] = N[i]; array->d_length *= N[i]; } array->d_ptr = data; array->d_data = array->d_ptr.get(); return array; } template std::shared_ptr > Array::constView( const std::vector& N, std::shared_ptr data ) { return view(N,std::const_pointer_cast(data)); } /******************************************************** * Convert array types * ********************************************************/ template template std::shared_ptr > Array::convert( std::shared_ptr > array ) { std::shared_ptr > array2( new Array(array->size()) ); array2.copy( *array ); return array2; } template template std::shared_ptr > Array::convert( std::shared_ptr > array ) { return Array::convert( std::const_pointer_cast >(array) ); } template template void Array::copy( const Array& array ) { resize( array.size() ); const TYPE2 *src = array.get(); for (size_t i=0; i(src[i]); } template template void Array::copy( const TYPE2* src ) { for (size_t i=0; i(src[i]); } template void Array::fill( const TYPE& value ) { for (size_t i=0; i inline void Array::swap( Array& rhs ) { std::swap(d_ndim,rhs.d_ndim); std::swap(d_length,rhs.d_length); std::swap(d_data,rhs.d_data); std::swap(d_ptr,rhs.d_ptr); size_t N[4] = {d_N[0],d_N[1],d_N[2],d_N[3]}; memcpy(d_N,rhs.d_N,sizeof(d_N)); memcpy(rhs.d_N,N,sizeof(d_N)); } /******************************************************** * Simple math operations * ********************************************************/ template bool Array::NaNs( ) const { bool test = false; for (size_t i=0; i TYPE Array::min( ) const { TYPE x = std::numeric_limits::max(); for (size_t i=0; i TYPE Array::max( ) const { TYPE x = std::numeric_limits::min(); for (size_t i=0; i TYPE Array::sum( ) const { TYPE x = 0; for (size_t i=0; i std::shared_ptr > Array::sum( int dir ) const { std::vector size_ans = size(); std::shared_ptr > ans( new Array(size_ans) ); size_t N1=1, N2=1, N3=1; for (int d=0; dd_data; for (int i3=0; i3