// -*- C++ -*- #ifndef __index_base_h__ #define __index_base_h__ #include #include #include #include "base_def.h" #include "range_base.h" #include "name.h" namespace MultiArrayTools { class IndefinitIndexBase { public: DEFAULT_MEMBERS(IndefinitIndexBase); virtual ~IndefinitIndexBase(); virtual IndefinitIndexBase& operator=(size_t pos) = 0; virtual IndefinitIndexBase& operator++() = 0; virtual IndefinitIndexBase& operator--() = 0; virtual IndefinitIndexBase& operator+=(int n) = 0; virtual IndefinitIndexBase& operator-=(int n) = 0; // Make this somehow better... !!! //virtual bool operator==(const IndefinitIndexBase& i) = 0; //virtual bool operator!=(const IndefinitIndexBase& i) = 0; virtual size_t dim() const = 0; virtual size_t pos() const; virtual const std::string& name() const; virtual void name(const std::string& str); virtual void name(const Name& nm); virtual MultiRangeType rangeType() const = 0; virtual bool link(IndefinitIndexBase* toLink); virtual void freeLinked(); virtual bool linked() const; virtual void linkTo(IndefinitIndexBase* target) = 0; virtual void setPos(size_t pos); virtual size_t max() const; virtual size_t outOfRange() const; virtual bool toNull() const; virtual void eval() = 0; virtual void evalMajor(); virtual bool master(); virtual void subOrd(IndefinitIndexBase* major); //virtual bool virt() const { return true; } protected: std::string mName; size_t mPos; IndefinitIndexBase* mLinked = nullptr; IndefinitIndexBase* mMajor = nullptr; IndefinitIndexBase* mSoftLinked = nullptr; }; template class IndexBase : public IndefinitIndexBase { public: typedef IndefinitIndexBase IIB; DEFAULT_MEMBERS(IndexBase); IndexBase(RangeBase const* range); //virtual size_t pos() const override; // = mPos; implement !!! virtual size_t max() const override; virtual bool toNull() const override; virtual void assignRange(RangeBase const* range); virtual void eval() override; virtual void copyPos(const Index& in) = 0; protected: // translate index into position virtual size_t evaluate(const Index& in) const = 0; RangeBase const* mRange; }; } #include "index_base.cc" #endif