#include "cxz_array_base.h" namespace CNORXZ { /********************** * ArrayBase * **********************/ template ArrayBase::ArrayBase(const ArrayBase& in) : mInit(in.mInit), mRange(in.mRange) { if(mRange){ mProtoI = std::make_shared( mRange, reinterpret_cast(this) ); } } template ArrayBase::ArrayBase(ArrayBase&& in) : mInit(in.mInit), mRange(in.mRange) { if(mRange){ mProtoI = std::make_shared( mRange, reinterpret_cast(this) ); } } template ArrayBase& ArrayBase::operator=(const ArrayBase& in) { mInit = in.mInit; mRange = in.mRange; if(mRange){ mProtoI = std::make_shared( mRange, reinterpret_cast(this) ); } return *this; } template ArrayBase& ArrayBase::operator=(ArrayBase&& in) { mInit = in.mInit; mRange = in.mRange; if(mRange){ mProtoI = std::make_shared( mRange, reinterpret_cast(this) ); } return *this; } template ArrayBase::ArrayBase(const std::shared_ptr&... ranges) { ContainerRangeFactory crf(ranges...); mRange = std::dynamic_pointer_cast >( crf.create() ); mProtoI = std::make_shared( mRange, reinterpret_cast(this) ); } template ArrayBase::ArrayBase(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& ArrayBase::operator[](const ConstContainerIndex& i) { IndexType ii(*mProtoI); ii = i; return (*this)[ii]; } template const T& ArrayBase::operator[](const std::tuple...>& is) const { IndexType ii(*mProtoI); ii(is); return (*this)[ii]; } template size_t ArrayBase::size() const { return mRange->size(); } template typename ArrayBase::CIndexType ArrayBase::begin() const { return cbegin(); } template typename ArrayBase::CIndexType ArrayBase::end() const { return end(); } template typename ArrayBase::CIndexType ArrayBase::cbegin() const { CIndexType i(*mProtoI,true); i = 0; return i.setData(data()); } template typename ArrayBase::CIndexType ArrayBase::cend() const { CIndexType i(*mProtoI,true); i = i.max(); return i.setData(data()); } template const std::shared_ptr::CRange>& ArrayBase::range() const { return mRange; } template bool ArrayBase::isConst() const { return true; } template ConstOperationRoot ArrayBase::operator()(const std::shared_ptr&... inds) const { return ConstOperationRoot(*this, inds...); } template ConstOperationRoot ArrayBase::op(const std::shared_ptr& ind) const { return ConstOperationRoot(data(), *ind); } template template ConstOperationRoot ArrayBase::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 ArrayBase::isInit() const { return mInit; } template template auto ArrayBase::getRangePtr() const -> decltype(mRange->template getPtr()) { return mRange->template getPtr(); } /****************************** * MutableArrayBase * ******************************/ template MutableArrayBase::MutableArrayBase(const std::shared_ptr&... ranges) : ArrayBase(ranges...) {} template MutableArrayBase::MutableArrayBase(const typename CRange::Space& space) : ArrayBase(space) {} template template T& MutableArrayBase::operator[](const ConstContainerIndex& i) { IndexType ii(*MAB::mProtoI); ii = i; return (*this)[ii]; } template T& MutableArrayBase::operator[](const std::tuple...>& is) { IndexType ii(*MAB::mProtoI,this->data()); ii(is); return (*this)[ii]; } template typename MutableArrayBase::IndexType MutableArrayBase::begin() { IndexType i(*MAB::mProtoI,this->data(),true); i = 0; return i.setData(data()); } template typename MutableArrayBase::IndexType MutableArrayBase::end() { IndexType i(*MAB::mProtoI,this->data(),true); i = i.max(); return i.setData(data()); } template bool MutableArrayBase::isConst() const { return false; } template OperationRoot MutableArrayBase::operator()(const std::shared_ptr&... inds) { return OperationRoot(*this, inds...); } template OperationRoot MutableArrayBase::op(const std::shared_ptr& ind) { return OperationRoot(data(), *ind); } template ConstOperationRoot MutableArrayBase::operator()(const std::shared_ptr&... inds) const { return ConstOperationRoot(*this, inds...); } template ConstOperationRoot MutableArrayBase::op(const std::shared_ptr& ind) const { return ConstOperationRoot(data(), *ind); } template template OperationRoot MutableArrayBase::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 MutableArrayBase::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 CNORXZ