// -*- C++ -*- #ifndef __single_range_h__ #define __single_range_h__ #include #include #include "base_def.h" #include "index_base.h" #include "range_base.h" namespace MultiArrayTools { template class SingleIndex : public IndexBase > { public: typedef IndexBase > IB; typedef IndefinitIndexBase IIB; DEFAULT_MEMBERS(SingleIndex); // find better solution !!! SingleIndex(RangeBase > const* range, const U& upos, size_t disambig); SingleIndex(RangeBase > const* range, size_t pos); //virtual SingleIndex& operator=(const U& upos); virtual SingleIndex& operator=(size_t pos) override; virtual SingleIndex& operator++() override; virtual SingleIndex& operator--() override; virtual SingleIndex& operator+=(int n) override; virtual SingleIndex& operator-=(int n) override; virtual bool operator==(const SingleIndex& i); virtual bool operator!=(const SingleIndex& i); virtual MultiRangeType rangeType() const override; virtual U getMetaPos() const; virtual SingleIndex& atMeta(const U& metaPos); virtual size_t dim() const override; // = 1 virtual void copyPos(const SingleIndex& in) override; virtual size_t giveSubStepSize(IndefinitIndexBase* subIndex) override; //virtual void eval() override; //virtual bool virt() const override { return false; } protected: virtual size_t evaluate(const SingleIndex& in) const override; }; template class SingleRange : public RangeBase > { public: typedef typename RangeBase >::IndexType IndexType; DEFAULT_MEMBERS(SingleRange); SingleRange(const std::vector& space); static SingleRange oType() { return SingleRange(); } virtual size_t size() const override; //U get(size_t pos) const; const U& get(size_t pos) const; size_t getMeta(const U& metaPos) const; virtual MultiRangeType type() const override; SingleIndex begin() const override; SingleIndex end() const override; protected: std::vector mSpace; }; // specializaions template <> class SingleRange : public RangeBase > { public: typedef typename RangeBase >::IndexType IndexType; DEFAULT_MEMBERS(SingleRange); SingleRange(size_t ext); static SingleRange oType() { return SingleRange(); } virtual size_t size() const override; int get(size_t pos) const; size_t getMeta(int metaPos) const; virtual MultiRangeType type() const override; SingleIndex begin() const override; SingleIndex end() const override; protected: size_t mExt; }; template <> class SingleRange : public RangeBase > { public: typedef typename RangeBase >::IndexType IndexType; DEFAULT_MEMBERS(SingleRange); SingleRange(size_t ext); static SingleRange oType() { return SingleRange(); } virtual size_t size() const override; size_t get(size_t pos) const; size_t getMeta(size_t metaPos) const; virtual MultiRangeType type() const override; SingleIndex begin() const override; SingleIndex end() const override; protected: size_t mExt; }; template <> class SingleRange : public RangeBase > { public: typedef typename RangeBase >::IndexType IndexType; DEFAULT_MEMBERS(SingleRange); SingleRange(size_t num); static SingleRange oType() { return SingleRange(); } virtual size_t size() const override; size_t get(size_t pos) const; size_t getMeta(size_t metaPos) const; virtual MultiRangeType type() const override; SingleIndex begin() const override; SingleIndex end() const override; protected: size_t mNum; }; enum class VET { VALUE = 0, ERROR = 1 }; std::ostream& operator<<(std::ostream& os, VET vet); template <> class SingleRange : public RangeBase > { public: typedef typename RangeBase >::IndexType IndexType; DEFAULT_MEMBERS(SingleRange); static SingleRange oType() { return SingleRange(); } virtual size_t size() const override; VET get(size_t pos) const; size_t getMeta(VET metaPos) const; virtual MultiRangeType type() const override; SingleIndex begin() const override; SingleIndex end() const override; }; template <> class SingleRange : public RangeBase > { public: typedef typename RangeBase >::IndexType IndexType; DEFAULT_MEMBERS(SingleRange); static SingleRange oType() { return SingleRange(); } virtual size_t size() const override; size_t get(size_t pos) const; size_t getMeta(size_t metaPos) const; virtual MultiRangeType type() const override; SingleIndex begin() const override; SingleIndex end() const override; }; } #include "single_range.cc" #endif