// -*- C++ -*- #ifndef __single_range_h__ #define __single_range_h__ #include #include #include #include "base_def.h" #include "index_base.h" #include "range_base.h" namespace MultiArrayTools { template class SingleIndex : public IndexInterface { public: DEFAULT_MEMBERS(SingleIndex); template SingleIndex(const std::shared_ptr >& range); virtual SingleIndex& operator=(size_t pos) override; virtual SingleIndex& operator++() override; virtual SingleIndex& operator--() override; virtual U meta() const; virtual SingleIndex& at(const U& metaPos); virtual size_t dim() const override; // = 1 virtual bool last() const override; virtual bool first() const override; }; template class SingleRangeFactory : public RangeFactoryBase { public: typedef SingleRange oType; SingleRangeFactory() = delete; SingleRangeFactory(const std::vector& space); std::shared_ptr create(); }; template class SingleRange : public RangeInterface > { public: typedef typename RangeBase >::IndexType IndexType; virtual size_t size() const override; const U& get(size_t pos) const; size_t getMeta(const U& metaPos) const; virtual SingleIndex begin() const override; virtual SingleIndex end() const override; friend SingleRangeFactory; protected: SingleRange() = delete; SingleRange(const SingleRange& in) = delete; SingleRange(const std::vector& space); std::vector mSpace; }; // specializaions template <> class SingleRange : public RangeBase > { public: typedef typename RangeBase >::IndexType IndexType; 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: SingleRange(size_t ext); size_t mExt; }; template <> class SingleRange : public RangeBase > { public: typedef typename RangeBase >::IndexType IndexType; 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: SingleRange(size_t ext); size_t mExt; }; template <> class SingleRange : public RangeBase > { public: typedef typename RangeBase >::IndexType IndexType; 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: SingleRange(size_t num); 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; 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; 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