// -*- 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: DEFAULT_MEMBERS(MultiIndex); typedef std::tuple IndexPack; static size_t sMult = sizeof...(Indices); virtual MultiIndex& operator++() override; virtual MultiIndex& operator--() override; virtual MultiIndex& operator+=(int n) override; virtual MultiIndex& operator-=(int n) override; template auto& getIndex() -> decltype(std::get(mIPack)); template const auto& getIndex() const -> decltype(std::get(mIPack)); IndefinitIndexBase& getIndex(size_t n); const IndefinitIndexBase& getIndex(size_t n) const; // dimension of MultiRange virtual size_t dim() const override; // implement !!! virtual bool link(IndefinitIndexBase* toLink) override; virtual void linkTo(IndefinitIndexBase* target) override; protected: virtual bool linkLower(IndefinitIndexBase* toLink); virtual size_t evaluate(const MultiIndex& in) const override; IndexPack mIPack; }; template class MultiRange : public RangeBase > { public: DEFAULT_MEMBERS(MultiRange); static size_t dim = sizeof...(Ranges); template auto get() -> decltype( std::get(mSpace) ); protected: std::tuple mSpace; }; } #include "multi_range.cc" #endif