diff --git a/src/include/ranges/srange.h b/src/include/ranges/srange.h new file mode 100644 index 0000000..25ecc68 --- /dev/null +++ b/src/include/ranges/srange.h @@ -0,0 +1,124 @@ +// -*- C++ -*- + +#ifndef __cxz_srange_h__ +#define __cxz_srange_h__ + +#include "base/base.h" +#include "ranges/index_base.h" +#include "ranges/range_base.h" +#include "xpr/xpr.h" + +namespace CNORXZ +{ + template + class SIndex : public IndexInterface,MetaT> + { + public: + typedef IndexInterface,MetaT> IB; + typedef SRange RangeType; + typedef MetaT MetaType; + + SIndex(const RangePtr& range, SizeT pos = 0); + + SIndex& operator=(SizeT lexpos); + SIndex& operator++(); + SIndex& operator--(); + SIndex operator+(Int n) const; + SIndex operator-(Int n) const; + SIndex& operator+=(Int n); + SIndex& operator-=(Int n); + + SizeT lex() const; + SPos pmax() const; + SPos lmax() const; + IndexId<0> id() const; + + const MetaT& operator*() const; + + SizeT dim() const; // = 1 + Sptr range() const; + + template + UPos stepSize(const IndexId& id) const; + + String stringMeta() const; + const MetaT& meta() const; + SIndex& at(const MetaT& metaPos); + decltype(auto) xpr(const Sptr>& _this) const; + + template + decltype(auto) format(const Sptr& ind) const; + + template + decltype(auto) slice(const Sptr& ind) const; + + template + decltype(auto) ifor(const Xpr& xpr, F&& f) const; + + private: + Sptr mRangePtr; + const MetaT* mMetaPtr; + }; + + template + decltype(auto) operator*(const Sptr>& a, const Sptr& b); + + template + class SRangeFactory : public RangeFactoryBase + { + public: + SRangeFactory(const Arr& space); + SRangeFactory(Arr&& space); + SRangeFactory(const Arr& space, const RangePtr& ref); + SRangeFactory(Arr&& space, const RangePtr& ref); + + private: + SRangeFactory() = default; + virtual void make() override final; + + Arr mSpace; + RangePtr mRef; + }; + + template + class SRange : public RangeInterface> + { + public: + typedef RangeBase RB; + typedef SIndex IndexType; + + friend SRangeFactory; + + virtual SizeT size() const override final; + virtual SizeT dim() const override final; + virtual String stringMeta(SizeT pos) const override final; + virtual const TypeInfo& type() const override final; + virtual const TypeInfo& metaType() const override final; + virtual RangePtr extend(const RangePtr& r) const override final; + + const MetaType& get(SizeT pos) const; + const MetaType* get() const; + SizeT getMeta(const MetaType& metaPos) const; + + private: + + SRange() = default; + SRange(const SRange& in) = delete; + SRange(const Arr& space); + SRange(Arr&& space); + + Arr mSpace; + + virtual Vector key() const override final; + + SERIALIZATION_FUNCTIONS_NOPUB; + }; + + template + struct RangeCast> + { + static Sptr> func(const RangePtr& r); + }; +} + +#endif