// -*- C++ -*- #ifndef __multi_range_h__ #define __multi_range_h__ #include #include #include #include "base_def.h" #include "range_base.h" #include "index_base.h" namespace MultiArrayTools { template class MultiIndex : public IndexInterface > { public: typedef IndexBase IB; typedef std::tuple...> IndexPack; typedef std::tuple MetaType; typedef IndexInterface IndexI; typedef MultiRange RangeType; protected: IndexPack mIPack; std::array mBlockSizes; public: MultiIndex() = delete; // NO DEFAULT HERE !!! // ( have to assign sub-indices (ptr!) correctly ) //MultiIndex(const MultiIndex& in); //MultiIndex& operator=(const MultiIndex& in); MultiIndex& operator=(ContainerIndex& ci); template MultiIndex(const std::shared_ptr& range); virtual IndexType type() const override; virtual MultiIndex& operator++() override; virtual MultiIndex& operator--() override; virtual MultiIndex& operator=(size_t pos) override; template MultiIndex& up(); template MultiIndex& down(); template auto get() const -> decltype( *std::get( mIPack ) )&; template auto getPtr() const -> decltype( std::get( mIPack ) )&; const IndexBase& get(size_t n) const; virtual std::shared_ptr getPtr(size_t n) const override; virtual MetaType meta() const override; virtual MultiIndex& at(const MetaType& metaPos) override; virtual bool first() const override; virtual bool last() const override; virtual size_t dim() const override; std::shared_ptr range() const; virtual MultiIndex& lock(std::shared_ptr& idx) override; // raplace instances (in contrast to its analogon in ContainerIndex // MultiIndices CANNOT be influences be its subindices, so there is // NO foreign/external controll) // Do NOT share index instances between two or more MultiIndex instances MultiIndex& operator()(std::shared_ptr&... indices); virtual std::string id() const override { return std::string("mul") + std::to_string(IB::mId); } }; /************************* * MultiRangeFactory * *************************/ template class MultiRangeFactory : public RangeFactoryBase { public: typedef MultiRange oType; MultiRangeFactory() = delete; MultiRangeFactory(const std::shared_ptr&... rs); MultiRangeFactory(const typename MultiRange::SpaceType& space); MultiRangeFactory(const std::shared_ptr >& cr); virtual std::shared_ptr create() override; }; /****************** * MultiRange * ******************/ template class MultiRange : public RangeInterface > { public: typedef RangeBase RB; typedef std::tuple...> SpaceType; typedef typename RangeInterface >::IndexType IndexType; protected: MultiRange() = delete; MultiRange(const MultiRange& in) = delete; MultiRange& operator=(const MultiRange& in) = delete; MultiRange(const std::shared_ptr&... rs); MultiRange(const SpaceType& space); SpaceType mSpace; public: static const size_t sdim = sizeof...(Ranges); template auto get() const -> decltype( *std::get( mSpace ) )&; template auto getPtr() const -> decltype( std::get( mSpace ) )&; virtual size_t dim() const override; virtual size_t size() const override; const SpaceType& space() const; virtual IndexType begin() const override; virtual IndexType end() const override; virtual std::shared_ptr index() const override; friend MultiRangeFactory; }; } #include "multi_range.cc" #endif