#include "slice.h" namespace CNORXZ { /******************* * ConstSlice * *******************/ template void ConstSlice::format(const std::array& blocks) { MAB::mProtoI->format(blocks); } template ConstSlice::ConstSlice(const std::tuple...>& ranges, const T* data) : MultiArrayBase(ranges), mData(data) { MAB::mInit = true; } template ConstSlice::ConstSlice(const std::shared_ptr&... ranges, const T* data) : MultiArrayBase(ranges...), mData(data) { MAB::mInit = true; } template ConstSlice::ConstSlice(const MultiArrayBase& ma, SIZET... sizes) : MultiArrayBase ( ma.range()->template get<0>().template scast(sizes...)->space() ), mData( ma.data() ) { MAB::mInit = true; } template const T& ConstSlice::operator[](const IType& i) const { //assert(i.sliceMode()); // -> compare objects !!!!! assert(i.container() == reinterpret_cast(this)); return mData[ i.pos() ]; } template const T& ConstSlice::at(const typename IType::MetaType& meta) const { //auto x = begin().at(meta); //VCHECK(x.pos()); return mData[ begin().at(meta).pos() ]; } template const T* ConstSlice::data() const { return mData; } template bool ConstSlice::isSlice() const { return true; } template auto ConstSlice::begin() const -> ConstSlice::IType { IType i(*MAB::mProtoI,true); i = 0; //i = mStartPos; return i.setData(data()); } template auto ConstSlice::end() const -> ConstSlice::IType { IType i(*MAB::mProtoI,true); i = i.max(); // CHECK !!! //i = std::get(mBlockSizes); return i.setData(data()); } template std::shared_ptr > ConstSlice::anonymous(bool slice) const { assert(slice); assert(not MAB::mProtoI->sliceMode()); // only originally ordered slices! AnonymousRangeFactory arf(MAB::mRange->space()); return std::make_shared > ( std::dynamic_pointer_cast( arf.create() ), data() ); return nullptr; } template auto ConstSlice::define(const std::shared_ptr&... inds) -> ConstSliceDef { return ConstSliceDef(*this, inds...); } /************** * Slice * **************/ template void Slice::format(const std::array& blocks) { MAB::mProtoI->format(blocks); } template Slice::Slice(const std::shared_ptr&... ranges, T* data) : MutableMultiArrayBase(ranges...), mData(data) {} template Slice::Slice(const std::tuple...>& ranges, T* data) : MutableMultiArrayBase(ranges), mData(data) { MAB::mInit = true; } template Slice& Slice::operator=(T val) { OperationRoot opr(data(), begin()); OperationValue opv(val); opr = opv; return *this; } template const T& Slice::operator[](const IType& i) const { //assert(i.sliceMode()); // -> compare objects !!!!! assert(i.container() == reinterpret_cast(this)); return mData[ i.pos() ]; } template T& Slice::operator[](const IType& i) { //assert(i.sliceMode()); assert(i.container() == reinterpret_cast(this)); return mData[ i.pos() ]; } template const T& Slice::at(const typename IType::MetaType& meta) const { //auto x = begin().at(meta); //VCHECK(x.pos()); return mData[ begin().at(meta).pos() ]; } template T& Slice::at(const typename IType::MetaType& meta) { //auto x = begin().at(meta); //VCHECK(x.pos()); return mData[ begin().at(meta).pos() ]; } template const T* Slice::data() const { return mData; } template T* Slice::data() { return mData; } template bool Slice::isSlice() const { return true; } template auto Slice::begin() const -> Slice::IType { IType i(*MAB::mProtoI,true); i = 0; //i = mStartPos; return i.setData(data()); } template auto Slice::end() const -> Slice::IType { IType i(*MAB::mProtoI,true); i = i.max(); // CHECK !!! //i = std::get(mBlockSizes); return i.setData(data()); } template std::shared_ptr > Slice::anonymous(bool slice) const { assert(0); // think about carefully!!!! return nullptr; } /* template std::shared_ptr > Slice::anonymousMove() { assert(0); // think about carefully!!!! return nullptr; } */ template auto Slice::define(const std::shared_ptr&... inds) -> SliceDef { return SliceDef(*this, inds...); } template SliceDef::SliceDef(Slice& sl, const std::shared_ptr&... inds) : mIndex(sl.begin()), mSl(sl) { mIndex(inds...); } template template SliceDef& SliceDef::operator=(const OperationRoot& op) { std::array blocks; sfor_pn<0,sizeof...(SRanges)> ( [&](auto i) { std::get(blocks) = op.rootSteps(reinterpret_cast ( mIndex.template getPtr().get())).val(); return 0; } ); mSl.format(blocks); mSl.mData = op.data(); return *this; } template ConstSliceDef::ConstSliceDef(ConstSlice& sl, const std::shared_ptr&... inds) : mIndex(sl.begin()), mSl(sl) { mIndex(inds...); } template template ConstSliceDef& ConstSliceDef::operator=(const ConstOperationRoot& op) { std::array blocks; sfor_pn<0,sizeof...(SRanges)> ( [&](auto i) { std::get(blocks) = op.rootSteps(reinterpret_cast ( mIndex.template getPtr().get())).val(); return 0; } ); mSl.format(blocks); mSl.mData = op.data(); return *this; } template template ConstSliceDef& ConstSliceDef::operator=(const OperationRoot& op) { std::array blocks; sfor_pn<0,sizeof...(SRanges)> ( [&](auto i) { std::get(blocks) = op.rootSteps(reinterpret_cast ( mIndex.template getPtr().get())).val(); return 0; } ); mSl.format(blocks); mSl.mData = op.data(); return *this; } } // end namespace CNORXZ