// -*- 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; protected: virtual bool linkLower(IndefinitIndexBase* toLink); virtual size_t evaluate(const MultiIndex& in) const override; IndexPack mIPack; public: DEFAULT_MEMBERS(MultiIndex); 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; 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 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; virtual MultiRangeType type() const override; virtual MultiIndex begin() const override; virtual MultiIndex end() const override; protected: SpaceType mSpace; }; } #include "multi_range.cc" #endif