// -*- 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(Indices&&... inds); MultiIndex(const IndexPack& ipack); virtual MultiIndex& operator++() override; virtual MultiIndex& operator--() override; virtual MultiIndex& operator+=(int n) override; virtual MultiIndex& operator-=(int n) override; virtual IIB& operator=(size_t pos) override; virtual MultiRangeType rangeType() const override; template auto getIndex() -> decltype(std::get(mIPack))&; template auto getIndex() const -> const decltype(std::get(mIPack))&; IndefinitIndexBase& get(size_t n); const IndefinitIndexBase& get(size_t n) const; MultiIndex& operator()(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; }; 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