#include "slice.h" namespace MultiArrayTools { /******************* * 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(0); // think about carefully!!!! 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 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; PackNum:: template mkSliceBlocks,SRanges...>(blocks, mIndex, op); 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; PackNum:: template mkSliceBlocks,SRanges...>(blocks, mIndex, op); mSl.format(blocks); mSl.mData = op.data(); return *this; } template template ConstSliceDef& ConstSliceDef::operator=(const OperationRoot& op) { std::array blocks; PackNum:: template mkSliceBlocks,SRanges...>(blocks, mIndex, op); mSl.format(blocks); mSl.mData = op.data(); return *this; } } // end namespace MultiArrayTools