diff --git a/src/include/ranges/mrange.cc.h b/src/include/ranges/mrange.cc.h index f8ef5bf..28732bb 100644 --- a/src/include/ranges/mrange.cc.h +++ b/src/include/ranges/mrange.cc.h @@ -482,17 +482,14 @@ namespace CNORXZ template RangePtr GMIndex::prange(const MIndex& end) const { - CXZ_ERROR("IMPLEMENT!!!"); - return nullptr; - /* - return ifor<0,NI> + return iter<0,NI> ( [&](auto i) { - typedef typename std::remove_reference::type::RangeType RangeT; + typedef typename std::remove_reference::type::RangeType RangeT; return std::dynamic_pointer_cast( mIPack[i]->prange( *end.pack()[i] ) ); }, [](const auto&... e) { return mrange(e...); } ); - */ + } template diff --git a/src/include/ranges/prange.cc.h b/src/include/ranges/prange.cc.h index cfb4b18..021e2cb 100644 --- a/src/include/ranges/prange.cc.h +++ b/src/include/ranges/prange.cc.h @@ -126,8 +126,15 @@ namespace CNORXZ template RangePtr PIndex::prange(const PIndex& end) const { - CXZ_ERROR("IMPLEMENT!!!"); - return nullptr; + CXZ_ASSERT(end > *this, "got end index position smaller than begin index position"); + auto oi = *orig(); + auto oend = *end.orig(); + const SizeT beginPos = oi.lex(); + Vector parts(oend.lex()-beginPos); + for(auto i = oi; i != oend; ++i){ + parts[i.lex()-beginPos] = i.lex(); + } + return CNORXZ::prange(mRangePtr->orig(), parts); } template @@ -206,6 +213,12 @@ namespace CNORXZ return *this; } + template + const Sptr& PIndex::orig() const + { + return mOrig; + } + /************************ * PIndex (private) * ************************/ @@ -302,7 +315,7 @@ namespace CNORXZ } template - RangePtr PRange::orig() const + Sptr PRange::orig() const { return mRange; } diff --git a/src/include/ranges/prange.h b/src/include/ranges/prange.h index 7251bd7..fab6ca6 100644 --- a/src/include/ranges/prange.h +++ b/src/include/ranges/prange.h @@ -104,7 +104,7 @@ namespace CNORXZ virtual const TypeInfo& metaType() const override final; virtual RangePtr extend(const RangePtr& r) const override final; - RangePtr orig() const; + Sptr orig() const; const Vector& parts() const; RangePtr derive() const; diff --git a/src/include/ranges/srange.cc.h b/src/include/ranges/srange.cc.h index 5d27de6..0f72b9e 100644 --- a/src/include/ranges/srange.cc.h +++ b/src/include/ranges/srange.cc.h @@ -3,6 +3,7 @@ #define __cxz_range_cc_h__ #include "srange.h" +#include "prange.h" namespace CNORXZ { @@ -144,8 +145,13 @@ namespace CNORXZ template RangePtr SIndex::prange(const SIndex& end) const { - CXZ_ERROR("IMPLEMENT!!!"); - return nullptr; + CXZ_ASSERT(end > *this, "got end index position smaller than begin index position"); + const SizeT beginPos = lex(); + Vector parts(end.lex()-beginPos); + for(auto i = *this; i != end; ++i){ + parts[i.lex()-beginPos] = i.lex(); + } + return CNORXZ::prange(mRangePtr, parts); } template diff --git a/src/include/ranges/srange.h b/src/include/ranges/srange.h index 9aafb39..5757ac3 100644 --- a/src/include/ranges/srange.h +++ b/src/include/ranges/srange.h @@ -65,34 +65,35 @@ namespace CNORXZ const MetaT* mMetaPtr; }; - template - decltype(auto) operator*(const Sptr>& a, const Sptr& b); + template + decltype(auto) operator*(const Sptr>& a, const Sptr& b); - template + 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); + 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; + Arr mSpace; RangePtr mRef; }; - template - class SRange : public RangeInterface> + template + class SRange : public RangeInterface> { public: typedef RangeBase RB; - typedef SIndex IndexType; + typedef SIndex IndexType; + typedef MetaT MetaType; - friend SRangeFactory; + friend SRangeFactory; virtual SizeT size() const override final; virtual SizeT dim() const override final; @@ -101,28 +102,28 @@ namespace CNORXZ 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; + const MetaT& get(SizeT pos) const; + const MetaT* get() const; + SizeT getMeta(const MetaT& metaPos) const; private: SRange() = default; SRange(const SRange& in) = delete; - SRange(const Arr& space); - SRange(Arr&& space); + SRange(const Arr& space); + SRange(Arr&& space); - Arr mSpace; + Arr mSpace; virtual Vector key() const override final; SERIALIZATION_FUNCTIONS_NOPUB; }; - template - struct RangeCast> + template + struct RangeCast> { - static Sptr> func(const RangePtr& r); + static Sptr> func(const RangePtr& r); }; }