From 0bfee171e06441bb94c02fe292d5f0f086224341 Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Sat, 20 Jan 2024 22:38:15 +0100 Subject: [PATCH] add POpRoot class + prange: implement xpr() --- src/include/operation/op_types.cc.h | 91 +++++++++++++++++++++-------- src/include/operation/op_types.h | 30 ++++++++++ src/include/ranges/prange.cc.h | 51 ++++++++-------- 3 files changed, 121 insertions(+), 51 deletions(-) diff --git a/src/include/operation/op_types.cc.h b/src/include/operation/op_types.cc.h index ad673a1..1dc514f 100644 --- a/src/include/operation/op_types.cc.h +++ b/src/include/operation/op_types.cc.h @@ -10,9 +10,9 @@ namespace CNORXZ { - /********************** - * COpInterface * - **********************/ + /*====================+ + | COpInterface | + +====================*/ template template @@ -37,9 +37,9 @@ namespace CNORXZ } - /********************* - * OpInterface * - *********************/ + /*===================+ + | OpInterface | + +===================*/ template template @@ -56,9 +56,9 @@ namespace CNORXZ } - /*************** - * COpRoot * - ***************/ + /*=============+ + | COpRoot | + +=============*/ template constexpr COpRoot::COpRoot(const CArrayBase& a, const Sptr& ind) : @@ -123,9 +123,52 @@ namespace CNORXZ return COpRoot(a, ind); } - /**************** - * OpCont * - ****************/ + /*=============+ + | POpRoot | + +=============*/ + + template + constexpr POpRoot::POpRoot(const Sptr& ind, const SizeT* parts, Op&& op) : + mIndex(ind), + mFp(1,parts), + mOp(std::forward(op)) + {} + + template + template + constexpr decltype(auto) POpRoot::operator()(const PosT& pos) const + { + return mOp(mFp(pos)); + } + + template + constexpr decltype(auto) POpRoot::operator()() const + { + return mOp(mFp(SPos<0>())); + } + + template + template + constexpr decltype(auto) POpRoot::rootSteps(const IndexId& id) const + { + return mIndex->stepSize(id); + } + + template + constexpr decltype(auto) POpRoot::data() const + { + return mOp->data(); + } + + template + constexpr decltype(auto) poproot(const Sptr& ind, const SizeT* parts, Op&& op) + { + return POpRoot(ind, parts, std::forward(op)); + } + + /*==============+ + | OpCont | + +==============*/ template constexpr OpCont::OpCont(const Sptr& ind) : @@ -236,9 +279,9 @@ namespace CNORXZ return mC.data(); } - /**************** - * OpRoot * - ****************/ + /*==============+ + | OpRoot | + +==============*/ template constexpr OpRoot::OpRoot(ArrayBase& a, const Sptr& ind) : @@ -327,9 +370,9 @@ namespace CNORXZ return OpRoot(a, ind); } - /******************* - * Operation * - *******************/ + /*=================+ + | Operation | + +=================*/ template constexpr Operation::Operation(F&& f, const Ops&... ops) : @@ -411,9 +454,9 @@ namespace CNORXZ } } - /********************* - * Contraction * - *********************/ + /*===================+ + | Contraction | + +===================*/ template constexpr Contraction::Contraction(CXpr&& cxpr) : @@ -447,9 +490,9 @@ namespace CNORXZ return Contraction( i->ifor( op, f ) ); } - /************************ - * various functions * - ************************/ + /*======================+ + | various functions | + +======================*/ template constexpr decltype(auto) indexOp(const Sptr& i) diff --git a/src/include/operation/op_types.h b/src/include/operation/op_types.h index 2b76f28..ce0fa4a 100644 --- a/src/include/operation/op_types.h +++ b/src/include/operation/op_types.h @@ -97,6 +97,36 @@ namespace CNORXZ template constexpr decltype(auto) coproot(const T* a, const Sptr& ind); + template + class POpRoot : public COpInterface> + { + public: + typedef COpInterface> OI; + + constexpr POpRoot() = default; + + constexpr POpRoot(const Sptr& ind, const SizeT* parts, Op&& op); + + template + constexpr decltype(auto) operator()(const PosT& pos) const; + + constexpr decltype(auto) operator()() const; + + template + constexpr decltype(auto) rootSteps(const IndexId& id) const; + + constexpr decltype(auto) data() const; + + private: + + Sptr mIndex; + FPos mFp; + Op mOp; + }; + + template + constexpr decltype(auto) poproot(const Sptr& ind, const SizeT* parts, Op&& op); + template class OpCont : public OpInterface> { diff --git a/src/include/ranges/prange.cc.h b/src/include/ranges/prange.cc.h index 9d2b47e..96a24e0 100644 --- a/src/include/ranges/prange.cc.h +++ b/src/include/ranges/prange.cc.h @@ -2,10 +2,9 @@ /** @file include/ranges/prange.cc.h - @brief ... + @brief PRange, PRangeFactory and PIndex implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ @@ -18,9 +17,9 @@ namespace CNORXZ { - /************** - * PIndex * - **************/ + /*============+ + | PIndex | + +============*/ template PIndex::PIndex(const RangePtr& range, SizeT pos) : @@ -206,9 +205,7 @@ namespace CNORXZ template decltype(auto) PIndex::xpr(const Sptr>& _this) const { - CXZ_ERROR("implement!!!"); - //return poperation( _this, mOrig, mRangePtr->parts(), mOrig->xpr(mOrig) ); - return mOrig->xpr(mOrig); + return poproot( _this, mRangePtr->parts(), mOrig->xpr(mOrig) ); } template @@ -246,9 +243,9 @@ namespace CNORXZ return mOrig; } - /************************ - * PIndex (private) * - ************************/ + /*======================+ + | PIndex (private) | + +======================*/ template void PIndex::mkPos() @@ -264,9 +261,9 @@ namespace CNORXZ CXZ_ERROR("meta position '" << toString(mOrig->meta()) << "' not part of range"); } - /*************************** - * PIndex (non-member) * - ***************************/ + /*=========================+ + | PIndex (non-member) | + +=========================*/ template decltype(auto) operator*(const Sptr>& a, const Sptr& b) @@ -274,9 +271,9 @@ namespace CNORXZ return iptrMul(a, b); } - /********************* - * PRangeFactory * - *********************/ + /*===================+ + | PRangeFactory | + +===================*/ template PRangeFactory::PRangeFactory(const Sptr& range, const Vector& _parts) : @@ -301,9 +298,9 @@ namespace CNORXZ } } - /************** - * PRange * - **************/ + /*============+ + | PRange | + +============*/ template SizeT PRange::size() const @@ -378,9 +375,9 @@ namespace CNORXZ } - /************************ - * PRange (private) * - ************************/ + /*======================+ + | PRange (private) | + +======================*/ template PRange::PRange(const Sptr& range, const Vector& _parts) : @@ -396,9 +393,9 @@ namespace CNORXZ return Vector { mRange->id() }; } - /**************************** - * non-member functions * - ****************************/ + /*==========================+ + | non-member functions | + +==========================*/ template RangePtr prange(const Sptr& range, const Vector& parts)