#ifndef __slice_h__ #define __slice_h__ #include "multi_array_base.h" #include "multi_array_operation.h" namespace MultiArrayTools { template class Slice : public MutableMultiArrayBase { public: typedef ContainerRange CRange; typedef MultiArrayBase MAB; typedef ContainerIndex IType; DEFAULT_MEMBERS(Slice); Slice(T* data, const std::shared_ptr&... ranges); virtual const T& operator[](const IType& i) const override; virtual T& operator[](const IType& i) override; virtual const T& at(const typename IType::MetaType& meta) const override; virtual T& at(const typename IType::MetaType& meta) override; virtual const T* data() const override; virtual T* data() override; virtual bool isSlice() const override; virtual auto begin() const -> IType override; virtual auto end() const -> IType override; template auto define(const std::shared_ptr&... inds) -> SliceDef >; private: T* mData; }; } // end namespace MultiArrayTools /* ========================= * * --- TEMPLATE CODE --- * * ========================= */ namespace MultiArrayTools { /************* * Slice * *************/ template Slice::Slice(T* data, const std::shared_ptr&... ranges) : 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 { return mData[ begin().at(meta).pos() ]; } template T& Slice::at(const typename IType::MetaType& meta) { 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; i = 0; //i = mStartPos; return i.setData(data()); } template auto Slice::end() const -> Slice::IType { IType i = MAB::mProtoI; i = i.max(); // CHECK !!! //i = std::get(mBlockSizes); return i.setData(data()); } } // end namespace MultiArrayTools #endif