diff --git a/src/include/array/aindex.h b/src/include/array/aindex.h index 9cc8599..1fde22c 100644 --- a/src/include/array/aindex.h +++ b/src/include/array/aindex.h @@ -4,7 +4,6 @@ #include "ranges/range_base.h" #include "ranges/index_base.h" -#include "ranges/xfor/xfor.h" #include "ranges/xindex.h" #include "ranges/yrange.h" diff --git a/src/include/base/types.h b/src/include/base/types.h index f66f028..aed952f 100644 --- a/src/include/base/types.h +++ b/src/include/base/types.h @@ -85,21 +85,31 @@ namespace CNORXZ template class CPosInterface; - // definition: ranges/xfor/pos_type.h - template - class PosInterface; - - // definition: ranges/xfor/pos_type.h + // definition: ranges/xfor/vpos_type.h class VPosBase; - // definition: ranges/xfor/pos_type.h + // definition: ranges/xfor/vpos_type.h template class VPos; - // definition: ranges/xfor/pos_type.h + // definition: ranges/xfor/vpos_type.h template class VPosRef; + // definition: ranges/xfor/pos_type.h + class UPos; + + // definition: ranges/xfor/pos_type.h + template + class SPos; + + // definition: ranges/xfor/pos_type.h + class FPos; + + // definition: ranges/xfor/pos_type.h + template + class SFPos; + // definition: ranges/xfor/pos_type.h class DPos; @@ -107,7 +117,7 @@ namespace CNORXZ class DPosRef; // definition: ranges/xfor/pos_type.h - template + template class MPos; // definition: ranges/xfor/pos_type.h diff --git a/src/include/operation/cxz_operation.h b/src/include/operation/cxz_operation.h index 39f1951..166cb7b 100644 --- a/src/include/operation/cxz_operation.h +++ b/src/include/operation/cxz_operation.h @@ -16,7 +16,6 @@ #include "ranges/rheader.h" #include "arith.h" -#include "xfor/xfor.h" #include "type_operations.h" #include "op_expressions.h" #include "access.h" diff --git a/src/include/operation/op_expressions.h b/src/include/operation/op_expressions.h index f8fc7f2..8a8482a 100644 --- a/src/include/operation/op_expressions.h +++ b/src/include/operation/op_expressions.h @@ -2,7 +2,6 @@ #ifndef __cxz_op_expressions__ #define __cxz_op_expressions__ -#include "xfor/xfor.h" #include "access.h" namespace CNORXZ diff --git a/src/include/ranges/crange.h b/src/include/ranges/crange.h index d9245db..be29515 100644 --- a/src/include/ranges/crange.h +++ b/src/include/ranges/crange.h @@ -6,7 +6,6 @@ #include "ranges/index_base.h" #include "ranges/range_base.h" //#include "xfor/for_type.h" -#include "xfor/xfor.h" namespace CNORXZ { diff --git a/src/include/ranges/dindex.h b/src/include/ranges/dindex.h index 52ee13e..22b9d61 100644 --- a/src/include/ranges/dindex.h +++ b/src/include/ranges/dindex.h @@ -40,7 +40,6 @@ namespace CNORXZ SizeT dim() const; RangePtr range() const; SizeT getStepSize(PtrId iptr) const; - Int getOffset(PtrId iptr) const; String stringMeta() const; DType meta() const; diff --git a/src/include/ranges/index_base.h b/src/include/ranges/index_base.h index 0bf2e5a..23be09c 100644 --- a/src/include/ranges/index_base.h +++ b/src/include/ranges/index_base.h @@ -5,7 +5,6 @@ #include "base/base.h" #include "range_base.h" -#include "xfor/xfor.h" namespace CNORXZ { @@ -47,7 +46,6 @@ namespace CNORXZ auto range() const { return THIS().range(); } SizeT getStepSize(PtrId iptr) const { return THIS().getStepSize(iptr); } //SizeT getStepSize(SizeT n) const { return THIS().getStepSize(n); } - Int getOffset(PtrId iptr) const { return THIS().getOffset(iptr); } String stringMeta() const { return THIS().stringMeta(); } auto meta() const { return THIS().meta(); } diff --git a/src/include/ranges/mrange.h b/src/include/ranges/mrange.h index f73af3d..19c7b18 100644 --- a/src/include/ranges/mrange.h +++ b/src/include/ranges/mrange.h @@ -55,7 +55,6 @@ namespace CNORXZ SizeT dim(); Sptr range(); SizeT getStepSize(PtrId iptr) const; - Int getOffset(PtrId iptr) const; String stringMeta() const; MetaType meta() const; diff --git a/src/include/ranges/urange.cc.h b/src/include/ranges/urange.cc.h index d8da929..ddf6f94 100644 --- a/src/include/ranges/urange.cc.h +++ b/src/include/ranges/urange.cc.h @@ -130,11 +130,6 @@ namespace CNORXZ return iptr == this->ptrId() ? 1 : 0; } - template - Int UIndex::getOffset(PtrId iptr) const - { - return 0; - } /* template template diff --git a/src/include/ranges/urange.h b/src/include/ranges/urange.h index 3780bc6..0773621 100644 --- a/src/include/ranges/urange.h +++ b/src/include/ranges/urange.h @@ -38,7 +38,6 @@ namespace CNORXZ SizeT dim() const; // = 1 Sptr range() const; SizeT getStepSize(PtrId iptr) const; - Int getOffset(PtrId iptr) const; String stringMeta() const; const MetaType& meta() const; diff --git a/src/include/ranges/xfor/iloop.h b/src/include/ranges/xfor/iloop.h index 8c74ae9..fc2fcfb 100644 --- a/src/include/ranges/xfor/iloop.h +++ b/src/include/ranges/xfor/iloop.h @@ -7,7 +7,6 @@ #include #include #include -#include "xfor.h" namespace CNORXZInternal { diff --git a/src/include/ranges/xfor/pos_type.cc.h b/src/include/ranges/xfor/pos_type.cc.h index e373f81..517f0f9 100644 --- a/src/include/ranges/xfor/pos_type.cc.h +++ b/src/include/ranges/xfor/pos_type.cc.h @@ -62,12 +62,12 @@ namespace CNORXZ constexpr UPos::UPos(SizeT ext) : mExt(ext) {} - inline SizeT UPos::size() const + constexpr SizeT UPos::size() const { return 1; } - inline const SizeT& UPos::val() const + constexpr const SizeT& UPos::val() const { return mExt; } @@ -90,14 +90,6 @@ namespace CNORXZ return MPos(*this, p1); } - template - inline UPos& UPos::set(const CPosInterface& a, const CPosInterface& b, - const CPosInterface& c) - { - (*this) = a + b*c; - return *this; - } - /************ * FPos * ************/ @@ -109,26 +101,27 @@ namespace CNORXZ return 1; } - inline const SizeT& FPos::val() const + constexpr const SizeT& FPos::val() const { return mExt; } template - inline UPos FPos::operator+(const CPosInterface& a) const + constexpr UPos FPos::operator+(const CPosInterface& a) const { return UPos(mExt + a.val()); } - inline UPos FPos::operator*(const CPosInterface& a) const + template + constexpr UPos FPos::operator*(const CPosInterface& a) const { return UPos(mExt * mMap[a.val()]); } template - inline auto FPos::extend(const CPosInterface& a) const + constexpr auto FPos::extend(const CPosInterface& a) const { - return MPos(*this,a); + return MPos(*this,a); } /************* @@ -158,8 +151,8 @@ namespace CNORXZ template constexpr auto SFPos::operator*(const SPos& a) const { - static constexpr Array ms({ Ms... }); - return SPos(ms)>; + constexpr Arr ms({ Ms... }); + return SPos(ms)>(); } template @@ -171,7 +164,7 @@ namespace CNORXZ template constexpr auto SFPos::operator*(const UPos& a) const { - static constexpr Array ms({ Ms... }); + constexpr Arr ms({ Ms... }); return UPos(N * ms[a.val()]); } @@ -188,12 +181,11 @@ namespace CNORXZ ************/ inline DPos::DPos(Uptr&& a) : - ObjHandle(std::forward>(a)), - mNextRef(mC->next()) + ObjHandle(std::forward>(a)) {} template - inline DPos::DPos(const PosT& a) : + inline DPos::DPos(const CPosInterface& a) : ObjHandle( std::make_unique(a) ) {} @@ -202,180 +194,134 @@ namespace CNORXZ return mC->vsize(); } - inline const SizeT& DPos::val() const + inline SizeT DPos::val() const { return mC->vval(); } - inline const DPosRef& DPos::next() const + inline DPosRef DPos::next() const { - return mNextRef; + return DPosRef(mC->vnext()); } - template - inline auto DPos::operator+(const MPos& a) const - { - return MPos(val()+a.val(), next()+a.next()); - } - - inline auto DPos::operator+(const UPos& a) const - { - return UPos(mC->val() + a.val()); - } - - inline auto DPos::operator+(const DPos& a) const - { - return DPos((*mC) + (*a)); - } - - inline auto DPos::operator+(const DPosRef& a) const - { - return DPos((*mC) + (*a)); - } - - inline auto DPos::operator*(SizeT a) const - { - return DPos((*mC)*a); - } - template - inline DPos DPos::extend(const PosT1& a) const + inline DPos DPos::operator+(const CPosInterface& a) const { - Uptr out = mC->vextend() - + return DPos(mC->vplus(VPosRef(&a))); // check memory safety!!! } - - template - inline PosInterface& DPos::set(const CPosInterface& a, const CPosInterface& b, sizeT c) + + template + inline DPos DPos::operator*(const CPosInterface& a) const { - mC->setVal( a.val() + b.val()*c ) ; - mC->vnext()->set(a.next(),b.next(),c); - return *this; + return DPos(mC->vtimes(VPosRef(&a))); // check memory safety!!! + } + + template + inline DPos DPos::extend(const CPosInterface& a) const + { + return DPos(mC->vextend(a)); } - + /*************** * DPosRef * ***************/ inline DPosRef::DPosRef(const VPosBase* c) : - mC(c), mNextRef(mC->vnext()) + mC(c) {} - inline const T& DPosRef::operator*() const - { - return *mC; - } - - inline const T* DPosRef::operator->() const - { - return mC; - } - - inline sizeT DPosRef::size() const + inline SizeT DPosRef::size() const { return mC->vsize(); } - inline const SizeT& DPosRef::val() const + inline SizeT DPosRef::val() const { - return mC->vsize(); + return mC->vval(); } - inline const DPosRef& DPosRef::next() const + inline DPosRef DPosRef::next() const { - return mNextRef; + return DPosRef(mC->vnext()); } - template - inline auto DPosRef::operator+(const MPos& a) const + template + inline DPos DPosRef::operator+(const CPosInterface& a) const { - return MPos(val()+a.val(), next()+a.next()); + return DPos(mC->vplus(VPosRef(&a))); // check memory safety!!! + } + + template + inline DPos DPosRef::operator*(const CPosInterface& a) const + { + return DPos(mC->vtimes(VPosRef(&a))); // check memory safety!!! + } + + template + inline DPos DPosRef::extend(const CPosInterface& a) const + { + return DPos(mC->vextend(a)); } - inline auto DPosRef::operator+(const UPos& a) const - { - return UPos(val()+a.val()); - } - - inline auto DPosRef::operator+(const DPos& a) const - { - return DPos((*mC)+(*a)); - } - - inline auto DPosRef::operator+(const DPosRef& a) const - { - return DPos((*mC)+(*a)); - } - - inline auto DPosRef::operator*(SizeT a) const - { - return DPos((*mC)*a); - } /************ * MPos * ************/ - template - inline MPos::MPos(SizeT ext, PosT next) : mExt(ext), mNext(next) {} - - template - template - inline MPos::MPos(SizeT y, const PosT1& z) : - mExt(z.val()), mNext(z.val(), z.next()) {} - - template template - inline MPos::MPos(const PosT1& y, const PosT2& z) : - mExt(y.val()), mNext(y.next(), z) {} + constexpr MPos::MPos(const CPosInterface& first, + const CPosInterface& next) : + mFirst(first), mNext(next) + {} - template - template - inline MPos::MPos(const MPos& y) : - mExt(y.val()), mNext(y.next()) {} - - template - inline const SizeT& MPos::val() const + template + constexpr SizeT MPos::size() const { - return mExt; + return mFirst.size() + mNext.size(); } - template - inline const PosT& MPos::next() const + template + constexpr auto MPos::val() const + { + return mFirst.val(); + } + + template + constexpr const PosT1& MPos::first() const + { + return mFirst; + } + + template + constexpr const PosT2& MPos::next() const { return mNext; } - template - inline MPos MPos::operator+(const MPos& in) const - { - return MPos(mExt + in.val(), mNext + in.next()); - } - - template - inline MPos MPos::operator+(const UPos& in) const - { - return MPos(mExt + in.val(), mNext); - } - - template - inline MPos MPos::operator*(SizeT in) const - { - return MPos(mExt * in, mNext * in); - } - - template - template - inline auto MPos::extend(const PosInterface& y) const - { return MPos(mExt, mNext.extend(y)); } - - template template - inline PosInterface& MPos::set(const CPosInterface& a, - const CPosInterface& b, sizeT c) - { return *this = a + b*c; } - //{ mExt = a.val() + b.val()*c ; mNext.set(a.next(),b.next(),c); return *this; } + template + constexpr auto MPos::operator+(const MPos& a) const + { + typedef decltype(first()+a.first()) PosT5; + typedef decltype(next()+a.next()) PosT6; + return MPos(first()+a.first(), next()+a.next()); + } + template + template + constexpr auto MPos::operator*(const CPosInterface& a) const + { + typedef decltype(first()*a) PosT5; + typedef decltype(next()*a) PosT6; + return MPos(first()*a, next()*a); + } + + template + template + constexpr auto MPos::extend(const CPosInterface& p) const + { + return MPos,PosT3>(*this,p); + } } diff --git a/src/include/ranges/xfor/pos_type.h b/src/include/ranges/xfor/pos_type.h index 51f0439..9b1fa5a 100644 --- a/src/include/ranges/xfor/pos_type.h +++ b/src/include/ranges/xfor/pos_type.h @@ -27,27 +27,8 @@ namespace CNORXZ inline auto extend(const CPosInterface

& a) const { return THIS().extend(a); } }; - template - class PosInterface : public CPosInterface - { - public: - typedef CPosInterface PI; - - DEFAULT_MEMBERS(PosInterface); - - template - inline PosInterface& set(const CPosInterface& a, const CPosInterface& b, - const CPosInterface& c) - { return PI::THIS().set(a,b,c); } - - template - inline PosInterface& operator()(const CPosInterface& a, const CPosInterface& b, - const CPosInterface& c) - { return set(a,b,c); } - }; - template - class SPos : public CPosInterface + class SPos : public CPosInterface> { public: constexpr SPos() = default; @@ -67,7 +48,7 @@ namespace CNORXZ constexpr auto extend(const CPosInterface& a) const; }; - class UPos : public PosInterface + class UPos : public CPosInterface { private: SizeT mExt = 0; @@ -77,8 +58,8 @@ namespace CNORXZ constexpr UPos(SizeT ext); - inline SizeT size() const; - inline const SizeT& val() const; + constexpr SizeT size() const; + constexpr const SizeT& val() const; template constexpr UPos operator+(const CPosInterface& a) const; @@ -89,9 +70,6 @@ namespace CNORXZ template constexpr auto extend(const CPosInterface& y) const; - template - inline UPos& set(const CPosInterface& a, const CPosInterface& b, - const CPosInterface& c); }; class FPos : public CPosInterface @@ -106,20 +84,20 @@ namespace CNORXZ inline FPos(SizeT ext, const SizeT* map); constexpr SizeT size() const; - inline const SizeT& val() const; + constexpr const SizeT& val() const; template - inline UPos operator+(const CPosInterface& a) const; + constexpr UPos operator+(const CPosInterface& a) const; template - inline UPos operator*(const CPosInterface& a) const; + constexpr UPos operator*(const CPosInterface& a) const; template - inline auto extend(const CPosInterface& a) const; + constexpr auto extend(const CPosInterface& a) const; }; template - class SFPos : public CPosInterface + class SFPos : public CPosInterface> { public: constexpr SFPos() = default; @@ -140,67 +118,54 @@ namespace CNORXZ }; class DPos : public ObjHandle, - public PosInterface + public CPosInterface { - private: - DPosRef mNextRef; public: DEFAULT_MEMBERS(DPos); inline DPos(Uptr&& a); template - inline DPos(const PosT& a); + inline DPos(const CPosInterface& a); inline SizeT size() const; - inline const SizeT& val() const; - inline const DPosRef& next() const; - - template - inline auto operator+(const MPos& a) const; - - inline auto operator+(const UPos& a) const; - inline auto operator+(const DPos& a) const; - inline auto operator+(const DPosRef& a) const; - inline auto operator*(SizeT a) const; + inline SizeT val() const; + inline DPosRef next() const; template - inline DPos extend(const PosT1& a) const; + inline DPos operator+(const CPosInterface& a) const; + + template + inline DPos operator*(const CPosInterface& a) const; + + template + inline DPos extend(const CPosInterface& a) const; - template - inline PosInterface& set(const CPosInterface& a, - const CPosInterface& b, sizeT c); }; class DPosRef : public CPosInterface { private: - DPosRef mNextRef; const VPosBase* mC; public: DEFAULT_MEMBERS(DPosRef); inline DPosRef(const VPosBase* c); - inline const T& operator*() const; - inline const T* operator->() const; - - inline sizeT size() const; - inline const SizeT& val() const; - inline const DPosRef& next() const; - - template - inline auto operator+(const MPos& a) const; - - inline auto operator+(const UPos& a) const; - inline auto operator+(const DPos& a) const; - inline auto operator+(const DPosRef& a) const; - inline auto operator*(SizeT a) const; + inline SizeT size() const; + inline SizeT val() const; + inline DPosRef next() const; template - inline DPos extend(const PosT1& a) const; + inline DPos operator+(const CPosInterface& a) const; + + template + inline DPos operator*(const CPosInterface& a) const; + + template + inline DPos extend(const CPosInterface& a) const; }; template - class MPos : public PosInterface> + class MPos : public CPosInterface> { private: @@ -208,27 +173,25 @@ namespace CNORXZ PosT2 mNext; public: - - //static constexpr SizeT NUM = PosT::SIZE; - //static constexpr SizeT SIZE = NUM + 1; - DEFAULT_MEMBERS(MPos); constexpr MPos(const CPosInterface& first, const CPosInterface& next); - inline const SizeT& val() const; - inline const PosT& next() const; - - inline auto operator+(const MPos& in) const; - inline auto operator*(SizeT in) const; - - template - inline auto extend(const PosInterface& y) const; + constexpr SizeT size() const; + constexpr auto val() const; + constexpr const PosT1& first() const; + constexpr const PosT2& next() const; template - inline PosInterface& set(const CPosInterface& a, - const CPosInterface& b, sizeT c); + constexpr auto operator+(const MPos& a) const; + + template + constexpr auto operator*(const CPosInterface& a) const; + + template + constexpr auto extend(const CPosInterface& p) const; + }; diff --git a/src/include/ranges/xfor/vpos_type.cc.h b/src/include/ranges/xfor/vpos_type.cc.h index 4e42dd8..56c8c7e 100644 --- a/src/include/ranges/xfor/vpos_type.cc.h +++ b/src/include/ranges/xfor/vpos_type.cc.h @@ -11,7 +11,7 @@ namespace CNORXZ ****************/ template - UPtr VPosBase::vextend(const SPos& a) const + Uptr VPosBase::vextend(const SPos& a) const { return this->vextend(UPos(N)); } @@ -21,8 +21,8 @@ namespace CNORXZ ************/ template - VPos::VPos(const PosInterface& a) : - PosT(a.THIS()), + VPos::VPos(const CPosInterface& a) : + PosT(a.THIS()) {} template @@ -38,7 +38,7 @@ namespace CNORXZ } template - const SizeT& VPos::vval() const + SizeT VPos::vval() const { return PosT::THIS().val(); } @@ -55,12 +55,30 @@ namespace CNORXZ return nullptr; } + template + Uptr VPos::vplus(const VPosBase* a) const + { + return std::make_unique>((*this) + DPosRef(a)); + } + + template + Uptr VPos::vtimes(const VPosBase* a) const + { + return std::make_unique>((*this) * UPos(a->vval())); + } + template Uptr VPos::vextend(const DPos& a) const { return std::make_unique>(*this,a); } + template + Uptr VPos::vextend(const DPosRef& a) const + { + return std::make_unique>(*this,a); + } + template Uptr VPos::vextend(const UPos& a) const { @@ -79,9 +97,9 @@ namespace CNORXZ ******************/ template - VPos>::VPos(const PosInterface>& a) : + VPos>::VPos(const CPosInterface>& a) : MPos(a.THIS()), - mFRef(&mFirst), mNRef(&mNext) + mFRef(&MPosT::mFirst), mNRef(&MPosT::mNext) {} template @@ -114,6 +132,18 @@ namespace CNORXZ return mNRef; } + template + Uptr VPos>::vplus(const VPosBase* a) const + { + return std::make_unique>((*this) + DPosRef(a)); + } + + template + Uptr VPos>::vtimes(const VPosBase* a) const + { + return std::make_unique>((*this) * UPos(a->vval())); + } + template Uptr VPos>::vextend(const DPos& a) const { @@ -143,8 +173,8 @@ namespace CNORXZ ***************/ template - VPosRef::VPosRef(const PosT* c) : - mC(c), mNextRef(&mC->next()) + VPosRef::VPosRef(const CPosInterface* c) : + mC(c) {} template @@ -160,29 +190,47 @@ namespace CNORXZ } template - const SizeT& VPosRef::vval() const + SizeT VPosRef::vval() const { return mC->val(); } template - const VPosBase& VPosRef::vget() const + const VPosBase* VPosRef::vget() const { return this; } template - const VPosBase& VPosRef::vnext() const + const VPosBase* VPosRef::vnext() const { return nullptr; } + template + Uptr VPosRef::vplus(const VPosBase* a) const + { + return std::make_unique>((*mC) + DPosRef(a)); + } + + template + Uptr VPosRef::vtimes(const VPosBase* a) const + { + return std::make_unique>((*mC) * UPos(a->vval())); + } + template Uptr VPosRef::vextend(const DPos& a) const { return std::make_unique>(*mC,a); } - + + template + Uptr VPosRef::vextend(const DPosRef& a) const + { + return std::make_unique>(*mC,a); + } + template Uptr VPosRef::vextend(const UPos& a) const { @@ -200,7 +248,7 @@ namespace CNORXZ *********************/ template - VPosRef>::VPosRef(const PosT* c) : + VPosRef>::VPosRef(const CPosInterface>* c) : mC(c), mFRef(&c->get()), mNRef(&c->next()) {} @@ -234,6 +282,18 @@ namespace CNORXZ return mNRef; } + template + Uptr VPosRef>::vplus(const VPosBase* a) const + { + return std::make_unique>((*mC) + DPosRef(a)); + } + + template + Uptr VPosRef>::vtimes(const VPosBase* a) const + { + return std::make_unique>((*mC) * UPos(a->vval())); + } + template Uptr VPosRef>::vextend(const DPos& a) const { diff --git a/src/include/ranges/xfor/vpos_type.h b/src/include/ranges/xfor/vpos_type.h index 068f478..658ac93 100644 --- a/src/include/ranges/xfor/vpos_type.h +++ b/src/include/ranges/xfor/vpos_type.h @@ -13,21 +13,18 @@ namespace CNORXZ virtual Uptr copy() const = 0; virtual SizeT vsize() const = 0; - virtual const SizeT& vval() const = 0; + virtual SizeT vval() const = 0; virtual const VPosBase* vget() const = 0; virtual const VPosBase* vnext() const = 0; virtual Uptr vplus(const VPosBase* a) const = 0; - virtual Uptr vtimes(SizeT a) const = 0; + virtual Uptr vtimes(const VPosBase* a) const = 0; virtual Uptr vextend(const DPos& a) const = 0; virtual Uptr vextend(const DPosRef& a) const = 0; virtual Uptr vextend(const UPos& a) const = 0; virtual Uptr vextend(const FPos& a) const = 0; template - UPtr vextend(const SPos& a) const - { - return this->vextend(UPos(N)); - } + Uptr vextend(const SPos& a) const; }; template @@ -36,13 +33,15 @@ namespace CNORXZ public: DEFAULT_MEMBERS(VPos); - VPos(const PosInterface& a); + VPos(const CPosInterface& a); virtual Uptr copy() const override final; virtual SizeT vsize() const override final; virtual SizeT vval() const override final; virtual const VPosBase* vget() const override final; virtual const VPosBase* vnext() const override final; + virtual Uptr vplus(const VPosBase* a) const override final; + virtual Uptr vtimes(const VPosBase* a) const override final; virtual Uptr vextend(const DPos& a) const override final; virtual Uptr vextend(const DPosRef& a) const override final; virtual Uptr vextend(const UPos& a) const override final; @@ -59,13 +58,15 @@ namespace CNORXZ typedef MPos MPosT; DEFAULT_MEMBERS(VPos); - VPos(const PosInterface>& a); + VPos(const CPosInterface>& a); virtual Uptr copy() const override final; virtual SizeT vsize() const override final; virtual SizeT vval() const override final; virtual const VPosBase* vget() const override final; virtual const VPosBase* vnext() const override final; + virtual Uptr vplus(const VPosBase* a) const override final; + virtual Uptr vtimes(const VPosBase* a) const override final; virtual Uptr vextend(const DPos& a) const override final; virtual Uptr vextend(const DPosRef& a) const override final; virtual Uptr vextend(const UPos& a) const override final; @@ -80,13 +81,15 @@ namespace CNORXZ public: DEFAULT_MEMBERS(VPosRef); - VPosRef(const PosT* c); + VPosRef(const CPosInterface* c); virtual Uptr copy() const override final; virtual SizeT vsize() const override final; virtual SizeT vval() const override final; virtual const VPosBase* vget() const override final; virtual const VPosBase* vnext() const override final; + virtual Uptr vplus(const VPosBase* a) const override final; + virtual Uptr vtimes(const VPosBase* a) const override final; virtual Uptr vextend(const DPos& a) const override final; virtual Uptr vextend(const DPosRef& a) const override final; virtual Uptr vextend(const UPos& a) const override final; @@ -105,13 +108,15 @@ namespace CNORXZ typedef MPos MPosT; DEFAULT_MEMBERS(VPosRef); - VPosRef(const PosT* c); + VPosRef(const CPosInterface>* c); virtual Uptr copy() const override final; virtual SizeT vsize() const override final; virtual SizeT vval() const override final; virtual const VPosBase* vget() const override final; virtual const VPosBase* vnext() const override final; + virtual Uptr vplus(const VPosBase* a) const override final; + virtual Uptr vtimes(const VPosBase* a) const override final; virtual Uptr vextend(const DPos& a) const override final; virtual Uptr vextend(const DPosRef& a) const override final; virtual Uptr vextend(const UPos& a) const override final; diff --git a/src/include/ranges/xfor/xf.h b/src/include/ranges/xfor/xf.h new file mode 100644 index 0000000..dadd253 --- /dev/null +++ b/src/include/ranges/xfor/xf.h @@ -0,0 +1,627 @@ + +#ifndef __cxz_xfor_h__ +#define __cxz_xfor_h__ + +#include + +#include "base/base.h" +#include "for_type.h" +#include "for_utils.h" +#include "exttype.h" + +namespace CNORXZ +{ + // 'HIDDEN FOR' CLASS for nested for loops in contractions a.s.o. + // (NO COUNTING OF MASTER POSITION !!!!!) + + template + class ExprInterface + { + public: + DEFAULT_MEMBERS(ExprInterface); + + Xpr& THIS() { return static_cast(*this); } + const Xpr& THIS() const { return static_cast(*this); } + + //Sptr copy() const { THIS().copy(); } + + void operator()(SizeT mlast, PosT last) { THIS()(mlast, last); } + void operator()(SizeT mlast = 0) { THIS()(mlast); } + + PosT rootSteps(PtrId ptrId = 0) const { return THIS().rootSteps(ptrId); } + PosT extension() const { return THIS().extenrion(); } + }; + + class VExprBase + { + public: + DEFAULT_MEMBERS(VExprBase); + + virtual Uptr copy() const = 0; + + virtual void vexec(SizeT mlast, DPos last) = 0; + virtual void vexec(SizeT mlast) = 0; + + virtual DPos vrootSteps(PtrId ptrId) const = 0; + virtual DPos vextension() const = 0; + }; + + template + class VExpr : public VExprBase, public Xpr + { + public: + typedef ExprInterface EI; + DEFAULT_MEMBERS(VExpr); + VExpr(const ExprInterface& a) : Xpr(a.THIS()) {} + + virtual Uptr copy() const override final { return std::make_unique(*this); } + + virtual void vexec(SizeT mlast, DPos last) override final { EI::THIS()(mlast,last); } + virtual void vexec(SizeT mlast) override final { EI::THIS()(mlast); } + + virtual DPos vrootSteps(PtrId ptrId) const override final { return EI::THIS().rootSteps(ptrId); } + virtual DPos vextension() const override final { return EI::THIS().extension(); } + }; + + class DExpr : public ObjHandle, + public ExprInterface + { + public: + DEFAULT_MEMBERS(DExpr); + + inline void operator()(SizeT mlast, DPos last) { mC->vexec(mlast, last); } + inline void operator()(SizeT mlast) { mC->vexec(mlast); } + + inline DPos rootSteps(PtrId ptrId) const { return mC->vrootSteps(ptrId); } + inline DPos extension() const { return mC->vextension(); } + }; + /* + template + struct PosForward + { + static inline size_t valuex(size_t last, size_t step, size_t pos) + { + return last + pos * step; + } + + static inline size_t value(size_t last, size_t max, size_t pos) + { + return last * max + pos; + } + }; + + template <> + struct PosForward + { + static inline size_t valuex(size_t last, size_t step, size_t pos) + { + return last; + } + + static inline size_t value(size_t last, size_t max, size_t pos) + { + return last; + } + }; + + template + class SubExpr : public ExpressionBase + { + private: + SubExpr() = default; + + const IndexClass* mIndPtr; + PtrId mSIPtr; + size_t mSPos; + size_t mMax; + + Expr mExpr; + typedef decltype(mkExt(0).extend(mExpr.rootSteps())) ExtType; + ExtType mExt; + + const Vector* mSubSet; + + mutable ExtType mRootSteps; + + public: + typedef ExpressionBase EB; + + static constexpr size_t LAYER = Expr::LAYER + 1; + static constexpr size_t SIZE = Expr::SIZE + 1; + //static constexpr size_t NHLAYER = Expr::NHLAYER + 1; + + DEFAULT_MEMBERS_X(SubExpr); + + SubExpr(const Sptr& indPtr, + std::intptr_t siptr, + const vector* subset, Expr expr); + + SubExpr(const IndexClass* indPtr, std::intptr_t siptr, + const vector* subset, Expr expr); + + inline void operator()(size_t mlast, DExt last) override final; + inline void operator()(size_t mlast, ExtType last) ; + inline void operator()(size_t mlast = 0) override final; + + DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final; + DExt dExtension() const override final; + + auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType; + auto extension() const -> ExtType; + }; + + template + struct NHLayer + { + template + static constexpr size_t get() + { + return Expr::NHLAYER + 1; + } + }; + + template + struct NHLayer + { + template + static constexpr size_t get() + { + return 0; + } + }; + + template <> + struct NHLayer + { + template + static constexpr size_t get() + { + return Expr::LAYER; + } + }; + + template + class For : public ExpressionBase + { + private: + For() = default; + + typedef typename IndexClass::RangeType RangeType; + const IndexClass* mIndPtr; + size_t mSPos; + size_t mMax; + size_t mStep; + + Expr mExpr; + typedef decltype(mExpr.rootSteps()) ExtType; + ExtType mExt; + + mutable ExtType mRootSteps; + + public: + typedef ExpressionBase EB; + + static constexpr size_t LAYER = Expr::LAYER + 1; + static constexpr size_t SIZE = Expr::SIZE; + //static constexpr size_t MAX = RangeType::SIZE / DIV; + //static constexpr size_t NHLAYER = (FT == ForType::HIDDEN) ? 0 : Expr::NHLAYER + 1; + + DEFAULT_MEMBERS(For); + + For(const Sptr& indPtr, + size_t step, Expr expr); + + For(const IndexClass* indPtr, + size_t step, Expr expr); + + inline void operator()(size_t mlast, DExt last) override final; + inline void operator()(size_t mlast, ExtType last) ; + inline void operator()(size_t mlast = 0) override final; + + PFor parallel() const; + + DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final; + DExt dExtension() const override final; + + auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType; + auto extension() const -> ExtType; + + }; + + class DynamicExpression : public ExpressionBase + { + private: + + size_t mThreadId = 0; + Sptr mNext; + + DynamicExpression() : mThreadId(omp_get_thread_num()) {} + public: + + static constexpr size_t LAYER = 0; + static constexpr size_t SIZE = 0; + static constexpr size_t NHLAYER = 0; + + DynamicExpression(const DynamicExpression& in) : + mThreadId(omp_get_thread_num()), + mNext( (static_cast(in.mThreadId) == omp_get_thread_num()) ? + in.mNext : in.mNext->deepCopy()) {} + DynamicExpression(DynamicExpression&& in) : + mThreadId(omp_get_thread_num()), + mNext( (static_cast(in.mThreadId) == omp_get_thread_num()) ? + in.mNext : in.mNext->deepCopy()) {} + DynamicExpression& operator=(const DynamicExpression& in) + { + mThreadId = omp_get_thread_num(); + mNext = (static_cast(in.mThreadId) == omp_get_thread_num()) ? + in.mNext : in.mNext->deepCopy(); + return *this; + } + + DynamicExpression& operator=(DynamicExpression&& in) + { + mThreadId = omp_get_thread_num(); + mNext = (static_cast(in.mThreadId) == omp_get_thread_num()) ? + in.mNext : in.mNext->deepCopy(); + return *this; + } + + DynamicExpression(const Sptr& next) : + mNext(next) + {} + + template + DynamicExpression(const ExpressionBase& next) : + mNext(std::make_shared(next)) + {} + + template + DynamicExpression(Expr ex) : mNext( std::make_shared(ex) ) {} + + virtual Sptr deepCopy() const override final + { + return std::make_shared(*this); + } + + inline void operator()(size_t mlast, DExt last) override final; + inline void operator()(size_t mlast, DExtT last) { (*this)(mlast,last.get()); } + inline void operator()(size_t mlast = 0) override final; + + inline DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final; + inline DExt dExtension() const override final; + + inline DExtT rootSteps(std::intptr_t iPtrNum = 0) const { return DExtT(dRootSteps(iPtrNum)); } + inline DExtT extension() const { return DExtT(dExtension()); } + + }; + + */ +} + +/* ========================= * + * --- TEMPLATE CODE --- * + * ========================= */ + + +namespace CNORXZ +{ + + /***************** + * F o r * + *****************/ + /* + template + For::For(const Sptr& indPtr, + size_t step, Expr expr) : + mIndPtr(indPtr.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step), + mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast( mIndPtr ))) + { + assert(mMax % DIV == 0); + assert(mIndPtr != nullptr); + } + + template + For::For(const IndexClass* indPtr, + size_t step, Expr expr) : + mIndPtr(indPtr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step), + mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast( mIndPtr ))) + { + //VCHECK(mMax); + //VCHECK(DIV); + //assert(mMax % DIV == 0); + assert(mIndPtr != nullptr); + } + + template + inline void For::operator()(size_t mlast, DExt last) + { + operator()(mlast, std::dynamic_pointer_cast>(last)->ext()); + //operator()(mlast, *reinterpret_cast(last.first)); + } + + template + inline void For::operator()(size_t mlast, + ExtType last) + { + typedef typename IndexClass::RangeType RangeType; + for(size_t pos = 0u; pos != ForBound::template bound(mMax); ++pos){ + const size_t mnpos = PosForward::valuex(mlast, mStep, pos); + const ExtType npos = last + mExt*pos; + mExpr(mnpos, npos); + } + } + + template + inline void For::operator()(size_t mlast) + { + typedef typename IndexClass::RangeType RangeType; + ExtType last = rootSteps(); + last.zero(); + for(size_t pos = 0u; pos != ForBound::template bound(mMax); ++pos){ + const size_t mnpos = PosForward::valuex(mlast, mStep, pos); + const ExtType npos = last + mExt*pos; + mExpr(mnpos, npos); + } + } + + + template + auto For::rootSteps(std::intptr_t iPtrNum) const + -> ExtType + { + return mExpr.rootSteps(iPtrNum); + } + + template + auto For::extension() const + -> ExtType + { + return mExt; + } + + template + DExt For::dRootSteps(std::intptr_t iPtrNum) const + { + return std::make_shared>(rootSteps(iPtrNum)); + //mRootSteps = rootSteps(iPtrNum); + //return std::make_pair(reinterpret_cast(&mRootSteps), + // sizeof(ExtType)/sizeof(size_t)); + } + + template + DExt For::dExtension() const + { + return std::make_shared>(mExt); + //return std::make_pair(reinterpret_cast(&mExt), + // sizeof(ExtType)/sizeof(size_t)); + } + + template + PFor For::parallel() const + { + static_assert(FT == ForType::DEFAULT, "hidden for not parallelizable"); + return PFor(mIndPtr, mStep, mExpr); + } + */ + /****************** + * P F o r * + ******************/ + /* + template + PFor::PFor(const Sptr& indPtr, + size_t step, Expr expr) : + mIndPtr(indPtr.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step), + mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast( mIndPtr ))) + { + //assert(mMax % DIV == 0); + assert(mIndPtr != nullptr); + } + + template + PFor::PFor(const IndexClass* indPtr, + size_t step, Expr expr) : + mIndPtr(indPtr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step), + mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast( mIndPtr ))) + { + assert(mMax % DIV == 0); + assert(mIndPtr != nullptr); + } + + template + inline void PFor::operator()(size_t mlast, DExt last) + { + operator()(mlast, std::dynamic_pointer_cast>(last)->ext()); + //operator()(mlast, *reinterpret_cast(last.first)); + } + + template + inline void PFor::operator()(size_t mlast, + ExtType last) + { + CHECK; + typedef typename IndexClass::RangeType RangeType; + int pos = 0; + size_t mnpos = 0; + ExtType npos; +#pragma omp parallel shared(mExpr) private(pos,mnpos,npos) + { + auto expr = mExpr; +#pragma omp for nowait + for(pos = 0; pos < static_cast(ForBound::template bound(mMax)); pos++){ + mnpos = PosForward::valuex(mlast, mStep, pos); + npos = last + mExt*static_cast(pos); + expr(mnpos, npos); + } + } + } + + template + inline void PFor::operator()(size_t mlast) + { + CHECK; + ExtType last = rootSteps(); + last.zero(); + int pos = 0; + size_t mnpos = 0; + ExtType npos = rootSteps(); + npos.zero(); +#pragma omp parallel shared(mExpr) private(pos,mnpos,npos) + { + auto expr = mExpr; +#pragma omp for nowait + for(pos = 0; pos < static_cast(ForBound::template bound(mMax)); pos++){ + mnpos = PosForward::valuex(mlast, mStep, pos); + npos = last + mExt*static_cast(pos); + expr(mnpos, npos); + } + } + } + + + template + auto PFor::rootSteps(std::intptr_t iPtrNum) const + -> ExtType + { + return mExpr.rootSteps(iPtrNum); + } + + template + auto PFor::extension() const + -> ExtType + { + return mExt; + } + + template + DExt PFor::dRootSteps(std::intptr_t iPtrNum) const + { + return std::make_shared>(rootSteps(iPtrNum)); + //mRootSteps = rootSteps(iPtrNum); + //return std::make_pair(reinterpret_cast(&mRootSteps), + // sizeof(ExtType)/sizeof(size_t)); + } + + template + DExt PFor::dExtension() const + { + return std::make_shared>(mExt); + //return std::make_pair(reinterpret_cast(&mExt), + // sizeof(ExtType)/sizeof(size_t)); + } + */ + + /**************** + * SubExpr * + ****************/ + /* + template + SubExpr::SubExpr(const Sptr& indPtr, + std::intptr_t siptr, + const vector* subset, Expr expr) : + mIndPtr(indPtr.get()), mSIPtr(siptr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), + mExpr(expr), + mExt( mkExt(0).extend( mExpr.rootSteps( reinterpret_cast( mIndPtr )) ) ), + mSubSet(subset) + { + assert(mIndPtr != nullptr); + } + + template + SubExpr::SubExpr(const IndexClass* indPtr, std::intptr_t siptr, + const vector* subset, Expr expr) : + mIndPtr(indPtr), mSIPtr(siptr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), + mExpr(expr), + mExt( mkExt(0).extend( mExpr.rootSteps( reinterpret_cast( mIndPtr )) ) ), + mSubSet(subset) + { + assert(mIndPtr != nullptr); + } + + template + inline void SubExpr::operator()(size_t mlast, DExt last) + { + operator()(mlast, std::dynamic_pointer_cast>(last)->ext()); + //operator()(mlast, *reinterpret_cast(last.first)); + } + + template + inline void SubExpr::operator()(size_t mlast, + ExtType last) + { + const size_t pos = (*mSubSet)[last.val()]; + const size_t mnpos = mlast; + const ExtType npos = last + mExt*pos; + mExpr(mnpos, getX<1>( npos )); + } + + template + inline void SubExpr::operator()(size_t mlast) + { + ExtType last = rootSteps(); + last.zero(); + const size_t pos = (*mSubSet)[last.val()]; + const size_t mnpos = mlast; + const ExtType npos = last + mExt*pos; + mExpr(mnpos, getX<1>( npos )); + } + + + template + auto SubExpr::rootSteps(std::intptr_t iPtrNum) const + -> ExtType + { + return mkExt(iPtrNum == mSIPtr ? 1 : 0).extend(mExpr.rootSteps(iPtrNum)); + } + + template + auto SubExpr::extension() const + -> ExtType + { + return mExt; + } + + template + DExt SubExpr::dRootSteps(std::intptr_t iPtrNum) const + { + return std::make_shared>(rootSteps(iPtrNum)); + //mRootSteps = rootSteps(iPtrNum); + //return std::make_pair(reinterpret_cast(&mRootSteps), + //sizeof(ExtType)/sizeof(size_t)); + } + + template + DExt SubExpr::dExtension() const + { + return std::make_shared>(mExt); + //return std::make_pair(reinterpret_cast(&mExt), + // sizeof(ExtType)/sizeof(size_t)); + } + */ + /*************************** + * DynamicExpression * + ***************************/ + /* + inline void DynamicExpression::operator()(size_t mlast, DExt last) + { + (*mNext)(mlast,last); + } + + inline void DynamicExpression::operator()(size_t mlast) + { + (*mNext)(mlast); + } + + inline DExt DynamicExpression::dRootSteps(std::intptr_t iPtrNum) const + { + return mNext->dRootSteps(iPtrNum); + } + + inline DExt DynamicExpression::dExtension() const + { + return mNext->dExtension(); + } + + */ +} // namespace CNORXZInternal + +#endif diff --git a/src/include/ranges/xfor/xfor.cc.h b/src/include/ranges/xfor/xfor.cc.h new file mode 100644 index 0000000..7682a98 --- /dev/null +++ b/src/include/ranges/xfor/xfor.cc.h @@ -0,0 +1,3 @@ + +#include "vpos_type.cc.h" +#include "pos_type.cc.h" diff --git a/src/include/ranges/xfor/xfor.h b/src/include/ranges/xfor/xfor.h index dadd253..5fef8ae 100644 --- a/src/include/ranges/xfor/xfor.h +++ b/src/include/ranges/xfor/xfor.h @@ -1,627 +1,5 @@ -#ifndef __cxz_xfor_h__ -#define __cxz_xfor_h__ +#include "vpos_type.h" +#include "pos_type.h" -#include - -#include "base/base.h" -#include "for_type.h" -#include "for_utils.h" -#include "exttype.h" - -namespace CNORXZ -{ - // 'HIDDEN FOR' CLASS for nested for loops in contractions a.s.o. - // (NO COUNTING OF MASTER POSITION !!!!!) - - template - class ExprInterface - { - public: - DEFAULT_MEMBERS(ExprInterface); - - Xpr& THIS() { return static_cast(*this); } - const Xpr& THIS() const { return static_cast(*this); } - - //Sptr copy() const { THIS().copy(); } - - void operator()(SizeT mlast, PosT last) { THIS()(mlast, last); } - void operator()(SizeT mlast = 0) { THIS()(mlast); } - - PosT rootSteps(PtrId ptrId = 0) const { return THIS().rootSteps(ptrId); } - PosT extension() const { return THIS().extenrion(); } - }; - - class VExprBase - { - public: - DEFAULT_MEMBERS(VExprBase); - - virtual Uptr copy() const = 0; - - virtual void vexec(SizeT mlast, DPos last) = 0; - virtual void vexec(SizeT mlast) = 0; - - virtual DPos vrootSteps(PtrId ptrId) const = 0; - virtual DPos vextension() const = 0; - }; - - template - class VExpr : public VExprBase, public Xpr - { - public: - typedef ExprInterface EI; - DEFAULT_MEMBERS(VExpr); - VExpr(const ExprInterface& a) : Xpr(a.THIS()) {} - - virtual Uptr copy() const override final { return std::make_unique(*this); } - - virtual void vexec(SizeT mlast, DPos last) override final { EI::THIS()(mlast,last); } - virtual void vexec(SizeT mlast) override final { EI::THIS()(mlast); } - - virtual DPos vrootSteps(PtrId ptrId) const override final { return EI::THIS().rootSteps(ptrId); } - virtual DPos vextension() const override final { return EI::THIS().extension(); } - }; - - class DExpr : public ObjHandle, - public ExprInterface - { - public: - DEFAULT_MEMBERS(DExpr); - - inline void operator()(SizeT mlast, DPos last) { mC->vexec(mlast, last); } - inline void operator()(SizeT mlast) { mC->vexec(mlast); } - - inline DPos rootSteps(PtrId ptrId) const { return mC->vrootSteps(ptrId); } - inline DPos extension() const { return mC->vextension(); } - }; - /* - template - struct PosForward - { - static inline size_t valuex(size_t last, size_t step, size_t pos) - { - return last + pos * step; - } - - static inline size_t value(size_t last, size_t max, size_t pos) - { - return last * max + pos; - } - }; - - template <> - struct PosForward - { - static inline size_t valuex(size_t last, size_t step, size_t pos) - { - return last; - } - - static inline size_t value(size_t last, size_t max, size_t pos) - { - return last; - } - }; - - template - class SubExpr : public ExpressionBase - { - private: - SubExpr() = default; - - const IndexClass* mIndPtr; - PtrId mSIPtr; - size_t mSPos; - size_t mMax; - - Expr mExpr; - typedef decltype(mkExt(0).extend(mExpr.rootSteps())) ExtType; - ExtType mExt; - - const Vector* mSubSet; - - mutable ExtType mRootSteps; - - public: - typedef ExpressionBase EB; - - static constexpr size_t LAYER = Expr::LAYER + 1; - static constexpr size_t SIZE = Expr::SIZE + 1; - //static constexpr size_t NHLAYER = Expr::NHLAYER + 1; - - DEFAULT_MEMBERS_X(SubExpr); - - SubExpr(const Sptr& indPtr, - std::intptr_t siptr, - const vector* subset, Expr expr); - - SubExpr(const IndexClass* indPtr, std::intptr_t siptr, - const vector* subset, Expr expr); - - inline void operator()(size_t mlast, DExt last) override final; - inline void operator()(size_t mlast, ExtType last) ; - inline void operator()(size_t mlast = 0) override final; - - DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final; - DExt dExtension() const override final; - - auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType; - auto extension() const -> ExtType; - }; - - template - struct NHLayer - { - template - static constexpr size_t get() - { - return Expr::NHLAYER + 1; - } - }; - - template - struct NHLayer - { - template - static constexpr size_t get() - { - return 0; - } - }; - - template <> - struct NHLayer - { - template - static constexpr size_t get() - { - return Expr::LAYER; - } - }; - - template - class For : public ExpressionBase - { - private: - For() = default; - - typedef typename IndexClass::RangeType RangeType; - const IndexClass* mIndPtr; - size_t mSPos; - size_t mMax; - size_t mStep; - - Expr mExpr; - typedef decltype(mExpr.rootSteps()) ExtType; - ExtType mExt; - - mutable ExtType mRootSteps; - - public: - typedef ExpressionBase EB; - - static constexpr size_t LAYER = Expr::LAYER + 1; - static constexpr size_t SIZE = Expr::SIZE; - //static constexpr size_t MAX = RangeType::SIZE / DIV; - //static constexpr size_t NHLAYER = (FT == ForType::HIDDEN) ? 0 : Expr::NHLAYER + 1; - - DEFAULT_MEMBERS(For); - - For(const Sptr& indPtr, - size_t step, Expr expr); - - For(const IndexClass* indPtr, - size_t step, Expr expr); - - inline void operator()(size_t mlast, DExt last) override final; - inline void operator()(size_t mlast, ExtType last) ; - inline void operator()(size_t mlast = 0) override final; - - PFor parallel() const; - - DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final; - DExt dExtension() const override final; - - auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType; - auto extension() const -> ExtType; - - }; - - class DynamicExpression : public ExpressionBase - { - private: - - size_t mThreadId = 0; - Sptr mNext; - - DynamicExpression() : mThreadId(omp_get_thread_num()) {} - public: - - static constexpr size_t LAYER = 0; - static constexpr size_t SIZE = 0; - static constexpr size_t NHLAYER = 0; - - DynamicExpression(const DynamicExpression& in) : - mThreadId(omp_get_thread_num()), - mNext( (static_cast(in.mThreadId) == omp_get_thread_num()) ? - in.mNext : in.mNext->deepCopy()) {} - DynamicExpression(DynamicExpression&& in) : - mThreadId(omp_get_thread_num()), - mNext( (static_cast(in.mThreadId) == omp_get_thread_num()) ? - in.mNext : in.mNext->deepCopy()) {} - DynamicExpression& operator=(const DynamicExpression& in) - { - mThreadId = omp_get_thread_num(); - mNext = (static_cast(in.mThreadId) == omp_get_thread_num()) ? - in.mNext : in.mNext->deepCopy(); - return *this; - } - - DynamicExpression& operator=(DynamicExpression&& in) - { - mThreadId = omp_get_thread_num(); - mNext = (static_cast(in.mThreadId) == omp_get_thread_num()) ? - in.mNext : in.mNext->deepCopy(); - return *this; - } - - DynamicExpression(const Sptr& next) : - mNext(next) - {} - - template - DynamicExpression(const ExpressionBase& next) : - mNext(std::make_shared(next)) - {} - - template - DynamicExpression(Expr ex) : mNext( std::make_shared(ex) ) {} - - virtual Sptr deepCopy() const override final - { - return std::make_shared(*this); - } - - inline void operator()(size_t mlast, DExt last) override final; - inline void operator()(size_t mlast, DExtT last) { (*this)(mlast,last.get()); } - inline void operator()(size_t mlast = 0) override final; - - inline DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final; - inline DExt dExtension() const override final; - - inline DExtT rootSteps(std::intptr_t iPtrNum = 0) const { return DExtT(dRootSteps(iPtrNum)); } - inline DExtT extension() const { return DExtT(dExtension()); } - - }; - - */ -} - -/* ========================= * - * --- TEMPLATE CODE --- * - * ========================= */ - - -namespace CNORXZ -{ - - /***************** - * F o r * - *****************/ - /* - template - For::For(const Sptr& indPtr, - size_t step, Expr expr) : - mIndPtr(indPtr.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step), - mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast( mIndPtr ))) - { - assert(mMax % DIV == 0); - assert(mIndPtr != nullptr); - } - - template - For::For(const IndexClass* indPtr, - size_t step, Expr expr) : - mIndPtr(indPtr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step), - mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast( mIndPtr ))) - { - //VCHECK(mMax); - //VCHECK(DIV); - //assert(mMax % DIV == 0); - assert(mIndPtr != nullptr); - } - - template - inline void For::operator()(size_t mlast, DExt last) - { - operator()(mlast, std::dynamic_pointer_cast>(last)->ext()); - //operator()(mlast, *reinterpret_cast(last.first)); - } - - template - inline void For::operator()(size_t mlast, - ExtType last) - { - typedef typename IndexClass::RangeType RangeType; - for(size_t pos = 0u; pos != ForBound::template bound(mMax); ++pos){ - const size_t mnpos = PosForward::valuex(mlast, mStep, pos); - const ExtType npos = last + mExt*pos; - mExpr(mnpos, npos); - } - } - - template - inline void For::operator()(size_t mlast) - { - typedef typename IndexClass::RangeType RangeType; - ExtType last = rootSteps(); - last.zero(); - for(size_t pos = 0u; pos != ForBound::template bound(mMax); ++pos){ - const size_t mnpos = PosForward::valuex(mlast, mStep, pos); - const ExtType npos = last + mExt*pos; - mExpr(mnpos, npos); - } - } - - - template - auto For::rootSteps(std::intptr_t iPtrNum) const - -> ExtType - { - return mExpr.rootSteps(iPtrNum); - } - - template - auto For::extension() const - -> ExtType - { - return mExt; - } - - template - DExt For::dRootSteps(std::intptr_t iPtrNum) const - { - return std::make_shared>(rootSteps(iPtrNum)); - //mRootSteps = rootSteps(iPtrNum); - //return std::make_pair(reinterpret_cast(&mRootSteps), - // sizeof(ExtType)/sizeof(size_t)); - } - - template - DExt For::dExtension() const - { - return std::make_shared>(mExt); - //return std::make_pair(reinterpret_cast(&mExt), - // sizeof(ExtType)/sizeof(size_t)); - } - - template - PFor For::parallel() const - { - static_assert(FT == ForType::DEFAULT, "hidden for not parallelizable"); - return PFor(mIndPtr, mStep, mExpr); - } - */ - /****************** - * P F o r * - ******************/ - /* - template - PFor::PFor(const Sptr& indPtr, - size_t step, Expr expr) : - mIndPtr(indPtr.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step), - mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast( mIndPtr ))) - { - //assert(mMax % DIV == 0); - assert(mIndPtr != nullptr); - } - - template - PFor::PFor(const IndexClass* indPtr, - size_t step, Expr expr) : - mIndPtr(indPtr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step), - mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast( mIndPtr ))) - { - assert(mMax % DIV == 0); - assert(mIndPtr != nullptr); - } - - template - inline void PFor::operator()(size_t mlast, DExt last) - { - operator()(mlast, std::dynamic_pointer_cast>(last)->ext()); - //operator()(mlast, *reinterpret_cast(last.first)); - } - - template - inline void PFor::operator()(size_t mlast, - ExtType last) - { - CHECK; - typedef typename IndexClass::RangeType RangeType; - int pos = 0; - size_t mnpos = 0; - ExtType npos; -#pragma omp parallel shared(mExpr) private(pos,mnpos,npos) - { - auto expr = mExpr; -#pragma omp for nowait - for(pos = 0; pos < static_cast(ForBound::template bound(mMax)); pos++){ - mnpos = PosForward::valuex(mlast, mStep, pos); - npos = last + mExt*static_cast(pos); - expr(mnpos, npos); - } - } - } - - template - inline void PFor::operator()(size_t mlast) - { - CHECK; - ExtType last = rootSteps(); - last.zero(); - int pos = 0; - size_t mnpos = 0; - ExtType npos = rootSteps(); - npos.zero(); -#pragma omp parallel shared(mExpr) private(pos,mnpos,npos) - { - auto expr = mExpr; -#pragma omp for nowait - for(pos = 0; pos < static_cast(ForBound::template bound(mMax)); pos++){ - mnpos = PosForward::valuex(mlast, mStep, pos); - npos = last + mExt*static_cast(pos); - expr(mnpos, npos); - } - } - } - - - template - auto PFor::rootSteps(std::intptr_t iPtrNum) const - -> ExtType - { - return mExpr.rootSteps(iPtrNum); - } - - template - auto PFor::extension() const - -> ExtType - { - return mExt; - } - - template - DExt PFor::dRootSteps(std::intptr_t iPtrNum) const - { - return std::make_shared>(rootSteps(iPtrNum)); - //mRootSteps = rootSteps(iPtrNum); - //return std::make_pair(reinterpret_cast(&mRootSteps), - // sizeof(ExtType)/sizeof(size_t)); - } - - template - DExt PFor::dExtension() const - { - return std::make_shared>(mExt); - //return std::make_pair(reinterpret_cast(&mExt), - // sizeof(ExtType)/sizeof(size_t)); - } - */ - - /**************** - * SubExpr * - ****************/ - /* - template - SubExpr::SubExpr(const Sptr& indPtr, - std::intptr_t siptr, - const vector* subset, Expr expr) : - mIndPtr(indPtr.get()), mSIPtr(siptr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), - mExpr(expr), - mExt( mkExt(0).extend( mExpr.rootSteps( reinterpret_cast( mIndPtr )) ) ), - mSubSet(subset) - { - assert(mIndPtr != nullptr); - } - - template - SubExpr::SubExpr(const IndexClass* indPtr, std::intptr_t siptr, - const vector* subset, Expr expr) : - mIndPtr(indPtr), mSIPtr(siptr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), - mExpr(expr), - mExt( mkExt(0).extend( mExpr.rootSteps( reinterpret_cast( mIndPtr )) ) ), - mSubSet(subset) - { - assert(mIndPtr != nullptr); - } - - template - inline void SubExpr::operator()(size_t mlast, DExt last) - { - operator()(mlast, std::dynamic_pointer_cast>(last)->ext()); - //operator()(mlast, *reinterpret_cast(last.first)); - } - - template - inline void SubExpr::operator()(size_t mlast, - ExtType last) - { - const size_t pos = (*mSubSet)[last.val()]; - const size_t mnpos = mlast; - const ExtType npos = last + mExt*pos; - mExpr(mnpos, getX<1>( npos )); - } - - template - inline void SubExpr::operator()(size_t mlast) - { - ExtType last = rootSteps(); - last.zero(); - const size_t pos = (*mSubSet)[last.val()]; - const size_t mnpos = mlast; - const ExtType npos = last + mExt*pos; - mExpr(mnpos, getX<1>( npos )); - } - - - template - auto SubExpr::rootSteps(std::intptr_t iPtrNum) const - -> ExtType - { - return mkExt(iPtrNum == mSIPtr ? 1 : 0).extend(mExpr.rootSteps(iPtrNum)); - } - - template - auto SubExpr::extension() const - -> ExtType - { - return mExt; - } - - template - DExt SubExpr::dRootSteps(std::intptr_t iPtrNum) const - { - return std::make_shared>(rootSteps(iPtrNum)); - //mRootSteps = rootSteps(iPtrNum); - //return std::make_pair(reinterpret_cast(&mRootSteps), - //sizeof(ExtType)/sizeof(size_t)); - } - - template - DExt SubExpr::dExtension() const - { - return std::make_shared>(mExt); - //return std::make_pair(reinterpret_cast(&mExt), - // sizeof(ExtType)/sizeof(size_t)); - } - */ - /*************************** - * DynamicExpression * - ***************************/ - /* - inline void DynamicExpression::operator()(size_t mlast, DExt last) - { - (*mNext)(mlast,last); - } - - inline void DynamicExpression::operator()(size_t mlast) - { - (*mNext)(mlast); - } - - inline DExt DynamicExpression::dRootSteps(std::intptr_t iPtrNum) const - { - return mNext->dRootSteps(iPtrNum); - } - - inline DExt DynamicExpression::dExtension() const - { - return mNext->dExtension(); - } - - */ -} // namespace CNORXZInternal - -#endif +#include "xfor.cc.h" diff --git a/src/include/ranges/xindex.cc.h b/src/include/ranges/xindex.cc.h index fb2bc3f..e352b47 100644 --- a/src/include/ranges/xindex.cc.h +++ b/src/include/ranges/xindex.cc.h @@ -122,12 +122,6 @@ namespace CNORXZ return mI->getStepSize(iptr); } - template - Int XIndex::getOffset(PtrId iptr) const - { - return mI->getOffset(iptr); - } - template String XIndex::stringMeta() const { diff --git a/src/include/ranges/xindex.h b/src/include/ranges/xindex.h index 3f67e56..3096328 100644 --- a/src/include/ranges/xindex.h +++ b/src/include/ranges/xindex.h @@ -33,7 +33,6 @@ namespace CNORXZ virtual SizeT dim() const = 0; virtual RangePtr range() const = 0; virtual SizeT getStepSize(PtrId iptr) const = 0; - virtual Int getOffset(PtrId iptr) const = 0; virtual String stringMeta() const = 0; virtual DType meta() const = 0; @@ -82,7 +81,6 @@ namespace CNORXZ virtual SizeT dim() const override final; virtual RangePtr range() const override final; virtual SizeT getStepSize(PtrId iptr) const override final; - virtual Int getOffset(PtrId iptr) const override final; virtual String stringMeta() const override final; virtual DType meta() const override final; diff --git a/src/include/ranges/yrange.h b/src/include/ranges/yrange.h index 8a2c3c4..55e8328 100644 --- a/src/include/ranges/yrange.h +++ b/src/include/ranges/yrange.h @@ -6,7 +6,6 @@ #include "range_base.h" #include "index_base.h" #include "xindex.h" -#include "xfor/xfor.h" namespace CNORXZ { @@ -43,7 +42,6 @@ namespace CNORXZ SizeT dim() const; Sptr range() const; SizeT getStepSize(PtrId iptr) const; - Int getOffset(PtrId iptr) const; String stringMeta() const; DType meta() const; diff --git a/src/lib/ranges/crange.cc b/src/lib/ranges/crange.cc index e66953b..9938730 100644 --- a/src/lib/ranges/crange.cc +++ b/src/lib/ranges/crange.cc @@ -88,11 +88,6 @@ namespace CNORXZ return iptr == this->ptrId() ? 1 : 0; } - Int CIndex::getOffset(PtrId iptr) const - { - return 0; - } - String CIndex::stringMeta() const { return toString(IB::mPos); diff --git a/src/lib/ranges/dindex.cc b/src/lib/ranges/dindex.cc index 0a5bcf8..726ee95 100644 --- a/src/lib/ranges/dindex.cc +++ b/src/lib/ranges/dindex.cc @@ -121,11 +121,6 @@ namespace CNORXZ return mI->getStepSize(iptr); } - Int DIndex::getOffset(PtrId iptr) const - { - return mI->getOffset(iptr); - } - String DIndex::stringMeta() const { return mI->stringMeta(); diff --git a/src/lib/ranges/yrange.cc b/src/lib/ranges/yrange.cc index e283ac6..1535606 100644 --- a/src/lib/ranges/yrange.cc +++ b/src/lib/ranges/yrange.cc @@ -129,13 +129,6 @@ namespace CNORXZ return 0; } - Int YIndex::getOffset(PtrId iptr) const - { - assert(0); - // sub inds !!! - return 0; - } - String YIndex::stringMeta() const { String out = "["; diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index c1f90ec..941f1c2 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -12,10 +12,15 @@ add_library(test_lib STATIC ${test_SOURCES}) #target_link_libraries(iutest ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} cnorxz) #add_test(NAME iutest COMMAND iutest) +add_executable(xfutest xfor_unit_test.cc) +add_dependencies(xfutest cnorxz) +target_link_libraries(xfutest ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} cnorxz test_lib) +add_test(NAME xfutest COMMAND xfutest) + add_executable(rutest range_unit_test.cc) add_dependencies(rutest cnorxz) target_link_libraries(rutest ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} cnorxz test_lib) -add_test(NAME rutest COMMAND dautest) +add_test(NAME rutest COMMAND rutest) #add_executable(autest ranges/anonymous_unit_test.cc) #add_dependencies(autest cnorxz) diff --git a/src/tests/range_unit_test.cc b/src/tests/range_unit_test.cc index 6fed16a..e5ca76b 100644 --- a/src/tests/range_unit_test.cc +++ b/src/tests/range_unit_test.cc @@ -8,7 +8,8 @@ //#include "cnorxz.h" #include "ranges/ranges.h" -namespace { +namespace +{ using namespace CNORXZ; diff --git a/src/tests/xfor_unit_test.cc b/src/tests/xfor_unit_test.cc new file mode 100644 index 0000000..4704993 --- /dev/null +++ b/src/tests/xfor_unit_test.cc @@ -0,0 +1,60 @@ + +#include "gtest/gtest.h" + +#include "ranges/xfor/xfor.h" + +namespace +{ + using namespace CNORXZ; + + class Pos_Test : public ::testing::Test + { + protected: + Pos_Test() + { + mUp1 = UPos(7); + mUp2 = UPos(3); + } + + UPos mUp1; + UPos mUp2; + SPos<4> mS4p; + SPos<2> mS2p; + }; + + TEST_F(Pos_Test, Basics) + { + EXPECT_EQ( mUp1.size(), 1 ); + EXPECT_EQ( mUp2.size(), 1 ); + EXPECT_EQ( mS4p.size(), 1 ); + EXPECT_EQ( mS2p.size(), 1 ); + + EXPECT_EQ( mUp1.val(), 7 ); + EXPECT_EQ( mUp2.val(), 3 ); + EXPECT_EQ( mS4p.val(), 4 ); + EXPECT_EQ( mS2p.val(), 2 ); + + auto s6p = mS4p + mS2p; + auto s8p = mS4p * mS2p; + auto up3 = mS4p * mUp1; + auto up4 = mUp1 * mS2p; + auto up5 = mS4p + mUp1; + auto up6 = mUp1 + mS2p; + + EXPECT_EQ( s6p.size(), 1 ); + EXPECT_EQ( s8p.size(), 1 ); + EXPECT_EQ( up3.size(), 1 ); + EXPECT_EQ( up4.size(), 1 ); + EXPECT_EQ( up5.size(), 1 ); + EXPECT_EQ( up6.size(), 1 ); + + EXPECT_EQ( s6p.val(), 6 ); + EXPECT_EQ( s8p.val(), 8 ); + EXPECT_EQ( up3.val(), 4*7 ); + EXPECT_EQ( up4.val(), 7*2 ); + EXPECT_EQ( up5.val(), 4+7 ); + EXPECT_EQ( up6.val(), 7+2 ); + + } +} +