#ifndef __cxz_slice_h__ #define __cxz_slice_h__ #include "cxz_array_base.h" #include "cxz_operation.h" namespace CNORXZ { template class ConstSlice : public ArrayBase { public: typedef ContainerRange CRange; typedef ArrayBase MAB; typedef ConstContainerIndex IType; using ArrayBase::operator(); using ArrayBase::operator[]; DEFAULT_MEMBERS(ConstSlice); ConstSlice(const std::tuple...>& ranges, const T* data = nullptr); ConstSlice(const std::shared_ptr&... ranges, const T* data = nullptr); ConstSlice(const ArrayBase& ma, SIZET... sizes); virtual const T& operator[](const IType& i) const final; virtual const T& at(const typename IType::MetaType& meta) const override; virtual const T* data() const override; virtual bool isSlice() const override; virtual auto begin() const -> IType override; virtual auto end() const -> IType override; virtual std::shared_ptr > anonymous(bool slice = false) const override; auto define(const std::shared_ptr&... inds) -> ConstSliceDef; private: friend ConstSliceDef; void format(const std::array& blocks); const T* mData; }; template class Slice : public MutableArrayBase { public: typedef ContainerRange CRange; typedef ArrayBase MAB; typedef ConstContainerIndex IType; using ArrayBase::operator(); using MutableArrayBase::operator(); using ArrayBase::operator[]; using MutableArrayBase::operator[]; DEFAULT_MEMBERS(Slice); Slice(const std::tuple...>& ranges, T* data = nullptr); Slice(const std::shared_ptr&... ranges, T* data = nullptr); Slice& operator=(T val); virtual const T& operator[](const IType& i) const final; virtual T& operator[](const IType& i) final; 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; virtual std::shared_ptr > anonymous(bool slice = false) const override; //virtual std::shared_ptr > anonymousMove() override; auto define(const std::shared_ptr&... inds) -> SliceDef; private: friend SliceDef; void format(const std::array& blocks); T* mData; }; template class SliceDef { public: typedef ConstContainerIndex IType; template static Slice mkSlice( const typename Slice::IndexType& ind, const Op& op ) { Slice out(ind->range()->space(), &*ind); std::array ff; sfor_pn<0,sizeof...(SRanges)> ( [&](auto i) { std::get(ff) = op.rootSteps(reinterpret_cast ( ind.template getPtr().get())).val(); return 0; } ); out.format(ff); return out; } private: IType mIndex; Slice& mSl; SliceDef() = default; public: SliceDef(Slice& sl, const std::shared_ptr&... inds); template SliceDef& operator=(const OperationRoot& op); }; template class ConstSliceDef { public: typedef ConstContainerIndex IType; template static ConstSlice mkSlice( const typename ConstSlice::IndexType& ind, const Op& op ) { ConstSlice out(ind->range()->space(), &*ind); std::array ff; sfor_pn<0,sizeof...(SRanges)> ( [&](auto i) { std::get(ff) = op.rootSteps(reinterpret_cast ( ind.template getPtr().get())).val(); return 0; } ); out.format(ff); return out; } private: IType mIndex; ConstSlice& mSl; ConstSliceDef() = default; public: ConstSliceDef(ConstSlice& csl, const std::shared_ptr&... inds); template ConstSliceDef& operator=(const ConstOperationRoot& op); template ConstSliceDef& operator=(const OperationRoot& op); }; template ConstSlice mkSlice( const typename ConstSlice::IndexType& ind, const Op& op ) { return ConstSliceDef::mkSlice(ind, op); } template Slice mkSlice( const typename Slice::IndexType& ind, const Op& op ) { return SliceDef::mkSlice(ind, op); } } // end namespace CNORXZ /* ========================= * * --- TEMPLATE CODE --- * * ========================= */ #endif