#include "multi_array_base.h" namespace MultiArrayTools { /********************** * MultiArrayBase * **********************/ template MultiArrayBase::MultiArrayBase(const MultiArrayBase& in) : mInit(in.mInit), mRange(in.mRange) { if(mRange){ mProtoI = std::make_shared( mRange, reinterpret_cast(this) ); } } template MultiArrayBase::MultiArrayBase(MultiArrayBase&& in) : mInit(in.mInit), mRange(in.mRange) { if(mRange){ mProtoI = std::make_shared( mRange, reinterpret_cast(this) ); } } template MultiArrayBase& MultiArrayBase::operator=(const MultiArrayBase& in) { mInit = in.mInit; mRange = in.mRange; if(mRange){ mProtoI = std::make_shared( mRange, reinterpret_cast(this) ); } return *this; } template MultiArrayBase& MultiArrayBase::operator=(MultiArrayBase&& in) { mInit = in.mInit; mRange = in.mRange; if(mRange){ mProtoI = std::make_shared( mRange, reinterpret_cast(this) ); } return *this; } template MultiArrayBase::MultiArrayBase(const std::shared_ptr&... ranges) { ContainerRangeFactory crf(ranges...); mRange = std::dynamic_pointer_cast >( crf.create() ); mProtoI = std::make_shared( mRange, reinterpret_cast(this) ); } template MultiArrayBase::MultiArrayBase(const typename CRange::Space& space) { ContainerRangeFactory crf(space); mRange = std::dynamic_pointer_cast >( crf.create() ); mProtoI = std::make_shared( mRange, reinterpret_cast(this) ); } template template const T& MultiArrayBase::operator[](const ConstContainerIndex& i) { IndexType ii(*mProtoI); ii = i; return (*this)[ii]; } template const T& MultiArrayBase::operator[](const std::tuple...>& is) const { IndexType ii(*mProtoI); ii(is); return (*this)[ii]; } template size_t MultiArrayBase::size() const { return mRange->size(); } template typename MultiArrayBase::IndexType MultiArrayBase::begin() const { IndexType i(*mProtoI,true); i = 0; return i.setData(data()); } template typename MultiArrayBase::IndexType MultiArrayBase::end() const { IndexType i(*mProtoI,true); i = i.max(); //i = mRange->size(); return i.setData(data()); } template typename MultiArrayBase::IndexType MultiArrayBase::beginIndex() const { IndexType i(*mProtoI,true); i = 0; return i.setData(data()); } template typename MultiArrayBase::IndexType MultiArrayBase::endIndex() const { IndexType i(*mProtoI,true); i = i.max(); //i = mRange->size(); return i.setData(data()); } template const std::shared_ptr::CRange>& MultiArrayBase::range() const { return mRange; } template bool MultiArrayBase::isConst() const { return true; } template ConstOperationRoot MultiArrayBase::operator()(const std::shared_ptr&... inds) const { return ConstOperationRoot(*this, inds...); } template ConstOperationRoot MultiArrayBase::op(const std::shared_ptr& ind) const { return ConstOperationRoot(data(), *ind); } template template ConstOperationRoot MultiArrayBase::m(const std::shared_ptr&... inds) const { static_assert(sizeof...(SRanges) == sizeof...(MappedRanges), "number of mapped ranges must be equal to number of original ranges"); return ConstOperationRoot(*this, inds...); } template bool MultiArrayBase::isInit() const { return mInit; } template template auto MultiArrayBase::getRangePtr() const -> decltype(mRange->template getPtr()) { return mRange->template getPtr(); } /****************************** * MutableMultiArrayBase * ******************************/ template MutableMultiArrayBase::MutableMultiArrayBase(const std::shared_ptr&... ranges) : MultiArrayBase(ranges...) {} template MutableMultiArrayBase::MutableMultiArrayBase(const typename CRange::Space& space) : MultiArrayBase(space) {} /* template typename MutableMultiArrayBase::IndexType MutableMultiArrayBase::begin() { auto i = mRange->begin(); return i.setData(data()); } template typename MutableMultiArrayBase::IndexType MutableMultiArrayBase::end() { auto i = mRange->end(); return i.setData(data()); } */ template template T& MutableMultiArrayBase::operator[](const ConstContainerIndex& i) { IndexType ii(*MAB::mProtoI); ii = i; return (*this)[ii]; } template T& MutableMultiArrayBase::operator[](const std::tuple...>& is) { IndexType ii(*MAB::mProtoI); ii(is); return (*this)[ii]; } template bool MutableMultiArrayBase::isConst() const { return false; } template OperationRoot MutableMultiArrayBase::operator()(const std::shared_ptr&... inds) { return OperationRoot(*this, inds...); } template OperationRoot MutableMultiArrayBase::op(const std::shared_ptr& ind) { return OperationRoot(data(), *ind); } template ConstOperationRoot MutableMultiArrayBase::operator()(const std::shared_ptr&... inds) const { return ConstOperationRoot(*this, inds...); } template ConstOperationRoot MutableMultiArrayBase::op(const std::shared_ptr& ind) const { return ConstOperationRoot(data(), *ind); } template template OperationRoot MutableMultiArrayBase::m(const std::shared_ptr&... inds) { static_assert(sizeof...(SRanges) == sizeof...(MappedRanges), "number of mapped ranges must be equal to number of original ranges"); return OperationRoot(*this, inds...); } template template ConstOperationRoot MutableMultiArrayBase::m(const std::shared_ptr&... inds) const { static_assert(sizeof...(SRanges) == sizeof...(MappedRanges), "number of mapped ranges must be equal to number of original ranges"); return ConstOperationRoot(*this, inds...); } } // end namespace MultiArrayTools