// -*- C++ -*- #ifndef __multi_range_h__ #define __multi_range_h__ #include #include #include "base_def.h" #include "range_base.h" #include "index_base.h" namespace MultiArrayTools { template class MultiIndex : public IndexBase > { public: typedef std::tuple IndexPack; typedef IndefinitIndexBase IIB; typedef IndexBase > IB; typedef std::tuple MetaType; protected: virtual bool linkLower(IndefinitIndexBase* toLink); virtual size_t evaluate(const MultiIndex& in) const override; IndexPack mIPack; public: MultiIndex() = default; // NO DEFAULT HERE !!! // ( have to subord sub-indices (mMajor) correctly, and not only copy their mMajor pointer to 'in' // which is not major any more in copies!! ) MultiIndex(const MultiIndex& in); MultiIndex& operator=(const MultiIndex& in); MultiIndex(RangeBase > const* range); MultiIndex(RangeBase > const* range, Indices&&... inds); MultiIndex(RangeBase > const* range, const IndexPack& ipack); //virtual ~MultiIndex(); virtual MultiIndex& operator++() override; virtual MultiIndex& operator--() override; virtual MultiIndex& operator+=(int n) override; virtual MultiIndex& operator-=(int n) override; bool operator==(const MultiIndex& in); bool operator!=(const MultiIndex& in); virtual IIB& operator=(size_t pos) override; virtual MultiRangeType rangeType() const override; template typename std::tuple_element >::type& getIndex(); template typename std::tuple_element >::type const& getIndex() const; IndefinitIndexBase& get(size_t n); const IndefinitIndexBase& get(size_t n) const; MetaType getMetaPos() const; MultiIndex& atMeta(const MetaType& metaPos); MultiIndex& operator()(Indices&&... inds); MultiIndex& operator()(const Indices&... inds); virtual void name(const Name& nm) override; // dimension of MultiRange; includes ALL degrees of freedom virtual size_t dim() const override; virtual bool link(IndefinitIndexBase* toLink) override; virtual void linkTo(IndefinitIndexBase* target) override; virtual void copyPos(const MultiIndex& in) override; //virtual void eval() override; //virtual bool virt() const override { return false; } //virtual void assignRange(RangeBase > const* range) override; }; /***************************** * IndexGetter Functions * ****************************/ template class MultiRange : public RangeBase > { public: typedef std::tuple SpaceType; DEFAULT_MEMBERS(MultiRange); MultiRange(const Ranges&... rs); static const size_t dim = sizeof...(Ranges); template auto getRange() -> decltype( std::get(SpaceType()) ); template auto getRange() const -> decltype( std::get(SpaceType()) ); size_t size() const override; const SpaceType& space() const; virtual MultiRangeType type() const override; virtual MultiIndex begin() const override; virtual MultiIndex end() const override; protected: SpaceType mSpace; }; } #include "multi_range.cc" #endif