// -*- 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 std::tuple...> IndexPack; typedef std::tuple MetaType; typedef IndexInterface IndexI; public: MultiIndex() = default; // NO DEFAULT HERE !!! // ( have to assign sub-indices (ptr!) correctly ) MultiIndex(const MultiIndex& in); MultiIndex& operator=(const MultiIndex& in); template MultiIndex(const std::shared_ptr& range); 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))&; const IndexBase& get(size_t n) const; virtual MetaType meta() const override; virtual MultiIndex& at(const MetaType& metaPos) override; virtual size_t dim() const override; protected: IndexPack mIPack; }; /************************* * MultiRangeFactory * *************************/ template class MultiRangeFactory : public RangeFactoryBase { public: typedef MultiRange oType; MultiRangeFactory() = delete; MultiRangeFactory(const std::shared_ptr&... rs); MultiRangeFactory(const MultiRange::SpaceType& space); virtual std::shared_ptr create() override; }; /****************** * MultiRange * ******************/ template class MultiRange : public RangeInterface > { public: typedef std::tuple...> SpaceType; typedef typename RangeInterface >::IndexType IndexType; static const size_t dim = sizeof...(Ranges); template // !!! auto get() const ->; //typename std::tuple_element...> >::type const& getRange() const; virtual size_t dim() const override; virtual size_t size() const override; const SpaceType& space() const; virtual typename IndexType begin() const override; virtual typename IndexType end() const override; virtual std::shared_ptr index() const override; friend MultiRangeFactory; 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; }; } #include "multi_range.cc" #endif