diff --git a/src/include/ranges/dynamic_range.h b/src/include/ranges/dynamic_range.h index c8a9020..c98d474 100644 --- a/src/include/ranges/dynamic_range.h +++ b/src/include/ranges/dynamic_range.h @@ -32,7 +32,7 @@ namespace MultiArrayTools const DynamicMetaElem& operator[](size_t pos) const; }; - + class IndexWrapperBase { public: @@ -69,48 +69,23 @@ namespace MultiArrayTools virtual size_t getStepSize(size_t n) = 0; virtual std::intptr_t get() const = 0; - - template - auto ifor(size_t step, Expr ex) - -> DynamicalExpression; - template - auto iforh(size_t step, Expr ex) - -> DynamicalExpression; }; typedef IndexWrapperBase IndexW; - template - class MakeForBase - { - public: - virtual DynamicalExpression ifor(size_t step, Expr ex) const = 0; - virtual DynamicalExpression iforh(size_t step, Expr ex) const = 0; - }; - - template - class MakeFor : public MakeForBase - { - private: - std::shared_ptr mI; - MakeFor() = default; - public: - MakeFor(const std::shared_ptr& i); - - virtual DynamicalExpression ifor(size_t step, Expr ex) const override; - virtual DynamicalExpression iforh(size_t step, Expr ex) const override; - }; - template class IndexWrapper : public IndexWrapperBase { - private: + protected: IndexWrapper() = default; - + + private: std::shared_ptr mI; public: + static constexpr size_t EXPRMAX = IndexWrapperBase::EXPRMAX; + IndexWrapper(const IndexWrapper& in) = default; IndexWrapper(IndexWrapper&& in) = default; IndexWrapper& operator=(const IndexWrapper& in) = default; @@ -143,13 +118,14 @@ namespace MultiArrayTools virtual size_t getStepSize(size_t n) final { return mI->getStepSize(n); } - virtual std::intptr_t get() const final { return reinterpret_cast(mI.get()); } - }; + virtual std::intptr_t get() const final { return reinterpret_cast(mI.get()); } + }; + class DynamicIndex : public IndexInterface { private: - std::vector> mIVec; + std::vector,size_t>> mIVec; public: typedef IndexInterface IB; typedef DynamicMetaT MetaType; @@ -306,42 +282,24 @@ namespace MultiArrayTools namespace MultiArrayTools { /************************* - * IndexWrapperBase * + * IndexForWrapper * *************************/ - template - auto IndexWrapperBase::ifor(size_t step, Expr ex) + template + auto IndexForWrapper::ifor(size_t step, Expr ex) -> DynamicalExpression - { - - } - - template - auto IndexWrapperBase::iforh(size_t step, Expr ex) - -> DynamicalExpression - { - - } - - /**************** - * MakeFor * - ****************/ - - template - MakeFor::MakeFor(const Index& i) : mI(i) {} - - template - DynamicalExpression MakeFor::ifor(size_t step, Expr ex) const { return DynamicalExpression(std::make_shared>(mI,step,ex)); } - - template - DynamicalExpression MakeFor::iforh(size_t step, Expr ex) const + + template + auto IndexForWrapper::iforh(size_t step, Expr ex) + -> DynamicalExpression { return DynamicalExpression(std::make_shared>(mI,step,ex)); } - + + /*********************** * DynamicRange * ***********************/ @@ -452,7 +410,24 @@ namespace MultiArrayTools return std::dynamic_pointer_cast >( mrf.create() ); } + template + auto DynamicIndex::ifor(size_t step, Expr ex) const + -> DynamicalExpression + { + //for... + ExpressionHolder epxr(ex); // derived from ExpressionBase; just to resolve underlying types! + IVec[0].first->ifor( ... mIVec[i].first->ifor(expr) ); + // ... + } + + template + auto DynamicIndex::iforh(size_t step, Expr ex) const + -> DynamicalExpression + { + //for... + // ... + } } diff --git a/src/include/xfor/xfor.h b/src/include/xfor/xfor.h index 70217b3..5c9ac9e 100644 --- a/src/include/xfor/xfor.h +++ b/src/include/xfor/xfor.h @@ -15,22 +15,10 @@ namespace MultiArrayHelper // 'HIDDEN FOR' CLASS for nested for loops in contractions a.s.o. // (NO COUNTING OF MASTER POSITION !!!!!) - template + typedef std::pair DExt; + class ExpressionBase { - public: - static constexpr size_t LAYER = Expr::LAYER + 1; - static constexpr size_t SIZE = Expr::SIZE; - - protected: - Expr mExpr; - - public: - typedef decltype(mExpr.rootSteps()) ExtType; - - protected: - ExtType mExt; - public: ExpressionBase() = default; @@ -39,14 +27,12 @@ namespace MultiArrayHelper ExpressionBase& operator=(const ExpressionBase& in) = default; ExpressionBase& operator=(ExpressionBase&& in) = default; - ExpressionBase(ExtType ext, Expr&& expr); - ExpressionBase(ExtType ext); - - virtual void operator()(size_t mlast, ExtType last) const = 0; + virtual void operator()(size_t mlast, DExt last) const = 0; virtual void operator()(size_t mlast = 0) const = 0; - auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType; - auto extension() const -> ExtType; + virtual DExt dRootSteps(std::intptr_t iPtrNum = 0) const = 0; + virtual DExt dExtension() const = 0; + }; @@ -99,7 +85,7 @@ namespace MultiArrayHelper }; template - class SingleExpression : public ExpressionBase + class SingleExpression : public ExpressionBase { private: SingleExpression() = default; @@ -108,10 +94,12 @@ namespace MultiArrayHelper size_t mSPos; size_t mMax; + Expr mExpr; + typedef decltype(mExpr.rootSteps()) ExtType; + ExtType mExt; + public: - typedef ExpressionBase EB; - using EB::rootSteps; - typedef typename ExpressionBase::ExtType ExtType; + typedef ExpressionBase EB; static constexpr size_t LAYER = Expr::LAYER + 1; static constexpr size_t SIZE = Expr::SIZE; @@ -128,13 +116,19 @@ namespace MultiArrayHelper Expr expr); - inline void operator()(size_t mlast, ExtType last) const override final; + inline void operator()(size_t mlast, DExt last) const override final; + inline void operator()(size_t mlast, ExtType last) const; inline void operator()(size_t mlast = 0) const 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 - class For : public ExpressionBase + class For : public ExpressionBase { private: For() = default; @@ -144,10 +138,14 @@ namespace MultiArrayHelper size_t mMax; size_t mStep; + Expr mExpr; + typedef decltype(mExpr.rootSteps()) ExtType; + ExtType mExt; + + mutable ExtType mRootSteps; + public: - typedef ExpressionBase EB; - using EB::rootSteps; - typedef typename ExpressionBase::ExtType ExtType; + typedef ExpressionBase EB; static constexpr size_t LAYER = Expr::LAYER + 1; static constexpr size_t SIZE = Expr::SIZE; @@ -163,9 +161,16 @@ namespace MultiArrayHelper For(const IndexClass* indPtr, size_t step, Expr expr); - inline void operator()(size_t mlast, ExtType last) const override final; + inline void operator()(size_t mlast, DExt last) const override final; + inline void operator()(size_t mlast, ExtType last) const; inline void operator()(size_t mlast = 0) const 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 @@ -174,18 +179,17 @@ namespace MultiArrayHelper template <> inline size_t exceptMax<1>(size_t max) { return 1; } - template - class DynamicalExpression : public ExpressionBase + class DynamicalExpression : public ExpressionBase { private: DynamicalExpression() = default; - std::shared_ptr> mNext; + std::shared_ptr mNext; public: - typedef ExpressionBase EB; + typedef ExpressionBase EB; using EB::rootSteps; - typedef typename ExpressionBase::ExtType ExtType; + typedef typename ExpressionBase::ExtType ExtType; static constexpr size_t LAYER = Expr::LAYER + 1; static constexpr size_t SIZE = Expr::SIZE; @@ -195,11 +199,14 @@ namespace MultiArrayHelper DynamicalExpression& operator=(const DynamicalExpression& in) = default; DynamicalExpression& operator=(DynamicalExpression&& in) = default; - DynamicalExpression(const std::shared_ptr>& next); + DynamicalExpression(const std::shared_ptr& next); - inline void operator()(size_t mlast, ExtType last) const override final; + inline void operator()(size_t mlast, DExt last) const override final; inline void operator()(size_t mlast = 0) const override final; - + + DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final; + DExt dExtension() const override final; + }; } // namespace MultiArrayHelper @@ -218,29 +225,16 @@ namespace MultiArrayHelper **********************/ template - ExpressionBase::ExpressionBase(ExtType ext, Expr&& expr) : + ExpressionBase::ExpressionBase(ExtType ext, Expr&& expr) : mExpr(std::forward(expr)), mExt(ext) {} template - ExpressionBase::ExpressionBase(ExtType ext) : + ExpressionBase::ExpressionBase(ExtType ext) : mExt(ext) {} - template - auto ExpressionBase::rootSteps(std::intptr_t iPtrNum) const - -> ExtType - { - return mExpr.rootSteps(iPtrNum); - } - - template - auto ExpressionBase::extension() const - -> ExtType - { - return mExt; - } /***************** * F o r * @@ -249,9 +243,8 @@ namespace MultiArrayHelper template For::For(const std::shared_ptr& indPtr, size_t step, Expr expr) : - ExpressionBase(expr.rootSteps( reinterpret_cast( indPtr.get() )), - std::forward(expr)), - mIndPtr(indPtr.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step) + mIndPtr(indPtr.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step), + mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast( mIndPtr ))) { assert(mIndPtr != nullptr); //VCHECK(mIndPtr->id()); @@ -261,15 +254,19 @@ namespace MultiArrayHelper template For::For(const IndexClass* indPtr, size_t step, Expr expr) : - ExpressionBase(expr.rootSteps( reinterpret_cast( indPtr ) ), - std::forward(expr)), - mIndPtr(indPtr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), - mStep(step) + mIndPtr(indPtr.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step), + mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast( mIndPtr ))) { assert(mIndPtr != nullptr); //VCHECK(mIndPtr->id()); //VCHECK(mIndPtr->max()); } + + template + inline void For::operator()(size_t mlast, DExt last) const + { + operator()(mlast, *reinterpret_cast(last)); + } template inline void For::operator()(size_t mlast, @@ -299,6 +296,35 @@ namespace MultiArrayHelper } } + + 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 = 0) const + { + mRootSteps = rootSteps(iPtrNum); + return std::make_pair(reinterpret_cast(&mRootSteps), + sizeof(ExtType)/sizeof(size_t)); + } + + template + DExt For::dExtension() const + { + return std::make_pair(reinterpret_cast(&mExt), + sizeof(ExtType)/sizeof(size_t)); + } /************************ * SingleExpression * @@ -307,9 +333,8 @@ namespace MultiArrayHelper template SingleExpression::SingleExpression(const std::shared_ptr& indPtr, Expr expr) : - ExpressionBase(expr.rootSteps( reinterpret_cast( indPtr.get() )), - std::forward(expr)), - mIndPtr(indPtr.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()) + mIndPtr(indPtr.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), + mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast( mIndPtr ))) { assert(mIndPtr != nullptr); //VCHECK(mIndPtr->id()); @@ -319,15 +344,20 @@ namespace MultiArrayHelper template SingleExpression::SingleExpression(const IndexClass* indPtr, Expr expr) : - ExpressionBase(expr.rootSteps( reinterpret_cast( indPtr ) ), - std::forward(expr)), - mIndPtr(indPtr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()) + mIndPtr(indPtr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), + mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast( mIndPtr ))) { assert(mIndPtr != nullptr); //VCHECK(mIndPtr->id()); //VCHECK(mIndPtr->max()); } - + + template + inline void SingleExpression::operator()(size_t mlast, DExt last) const + { + operator()(mlast, *reinterpret_cast(last)); + } + template inline void SingleExpression::operator()(size_t mlast, ExtType last) const @@ -350,6 +380,34 @@ namespace MultiArrayHelper EB::mExpr(mlast, last); } + template + auto SingleExpression::rootSteps(std::intptr_t iPtrNum) const + -> ExtType + { + return mExpr.rootSteps(iPtrNum); + } + + template + auto SingleExpression::extension() const + -> ExtType + { + return mExt; + } + + template + DExt SingleExpression::dRootSteps(std::intptr_t iPtrNum = 0) const + { + mRootSteps = rootSteps(iPtrNum); + return std::make_pair(reinterpret_cast(&mRootSteps), + sizeof(ExtType)/sizeof(size_t)); + } + + template + DExt SingleExpression::dExtension() const + { + return std::make_pair(reinterpret_cast(&mExt), + sizeof(ExtType)/sizeof(size_t)); + } /*************************** * DynamicalExpression * @@ -357,8 +415,7 @@ namespace MultiArrayHelper template DynamicalExpression:: - DynamicalExpression(const std::shared_ptr>& next) : - ExpressionBase(next->extension()), + DynamicalExpression(const std::shared_ptr& next) : mNext(next) {} @@ -374,6 +431,18 @@ namespace MultiArrayHelper (*mNext)(mlast); } + template + DExt DynamicalExpression::dRootSteps(std::intptr_t iPtrNum = 0) const + { + return mNext->dRootSteps(iPtrNum); + } + + template + DExt DynamicalExpression::dExtension() const + { + return mNext->dExtension(); + } + } // namespace MultiArrayHelper