From 758bc893078d0d5cb9a334572690311dd30896f6 Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Tue, 23 Jul 2024 20:42:10 +0200 Subject: [PATCH] pos: ignore epos in fpos types --- src/include/xpr/pos_type.cc.h | 78 ++++++++++++++++++++++++++--------- src/include/xpr/pos_type.h | 4 +- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/src/include/xpr/pos_type.cc.h b/src/include/xpr/pos_type.cc.h index afe5366..a4ff1a0 100644 --- a/src/include/xpr/pos_type.cc.h +++ b/src/include/xpr/pos_type.cc.h @@ -151,22 +151,29 @@ namespace CNORXZ if constexpr(is_epos_type::value){ return in*(*this); } - if constexpr(std::is_same>::value){ - return SPos<0>{}; - } else { - return UPos(mExt * in.val()); + if constexpr(std::is_same>::value){ + return SPos<0>{}; + } + else { + return UPos(mExt * in.val()); + } } } template constexpr decltype(auto) UPos::operator()(const PosT& in) const { - if constexpr(std::is_same>::value){ - return SPos<0>{}; + if constexpr(is_epos_type::value){ + return in*(*this); } else { - return UPos(mExt * in.val()); + if constexpr(std::is_same>::value){ + return SPos<0>{}; + } + else { + return UPos(mExt * in.val()); + } } } @@ -211,15 +218,25 @@ namespace CNORXZ } template - constexpr decltype(auto) FPos::operator*(const PosT& in) const + constexpr decltype(auto) FPos::operator*(const PosT& a) const { - return FPos(mExt * in.val(), mMap); + if constexpr(is_epos_type::value){ + return FPos(mExt * a.scal().val(), mMap); + } + else { + return FPos(mExt * a.val(), mMap); + } } template constexpr decltype(auto) FPos::operator()(const PosT1& a) const { - return UPos(mExt * mMap[a.val()]); + if constexpr(is_epos_type::value){ + return UPos(mExt * mMap[a.scal().val()]); + } + else { + return UPos(mExt * mMap[a.val()]); + } } template @@ -305,10 +322,20 @@ namespace CNORXZ constexpr decltype(auto) SFPos::operator*(const PosT& a) const { if constexpr(is_static_pos_type::value){ - return SFPos(); + if constexpr(is_epos_type::value){ + return SFPos(); + } + else { + return SFPos(); + } } else { - return FPos(N * a.val(), &sMs[0]); + if constexpr(is_epos_type::value){ + return FPos(N * a.scal().val(), &sMs[0]); + } + else { + return FPos(N * a.val(), &sMs[0]); + } } } @@ -318,11 +345,21 @@ namespace CNORXZ { if constexpr(is_static_pos_type::value){ constexpr Arr ms({ Ms... }); - return SPos(ms)>(); + if constexpr(is_epos_type::value){ + return SPos(ms)>(); + } + else { + return SPos(ms)>(); + } } else { constexpr Arr ms({ Ms... }); - return UPos(N * ms[a.val()]); + if constexpr(is_epos_type::value){ + return UPos(N * ms[a.scal().val()]); + } + else { + return UPos(N * ms[a.val()]); + } } } @@ -673,7 +710,8 @@ namespace CNORXZ { return iter<0,sizeof...(OPosTs)> ( [&](auto i) { return std::get(mP); }, - [&](const auto&... e) { return EPos + [&](const auto&... e) { return EPos (BPosT::operator*(a),e*a...); } ); } @@ -683,7 +721,8 @@ namespace CNORXZ { return iter<0,sizeof...(OPosTs)> ( [&](auto i) { return std::get(mP); }, - [&](const auto&... e) { return EPos + [&](const auto&... e) { return EPos (BPosT::operator()(a),e*a...); } ); } @@ -694,12 +733,13 @@ namespace CNORXZ return ival(std::index_sequence_for{}); } + /* template constexpr decltype(auto) EPos::next() const { return inext(std::index_sequence_for{}); } - + */ template constexpr decltype(auto) EPos::scal() const { @@ -724,7 +764,7 @@ namespace CNORXZ return Arr { (BPosT::val()+std::get(mP).val())... }; } } - + /* template template constexpr decltype(auto) EPos::inext(std::index_sequence is) const @@ -732,7 +772,7 @@ namespace CNORXZ typedef EPos(mP).next())...> OEPosT; return OEPosT(BPosT::next(), std::get(mP).next()...); } - + */ /*===============================+ | Traits and Helper-Classes | +===============================*/ diff --git a/src/include/xpr/pos_type.h b/src/include/xpr/pos_type.h index 8eba226..e07a61b 100644 --- a/src/include/xpr/pos_type.h +++ b/src/include/xpr/pos_type.h @@ -307,7 +307,7 @@ namespace CNORXZ constexpr decltype(auto) operator()(const PosT& a) const; constexpr decltype(auto) val() const; - constexpr decltype(auto) next() const; + //constexpr decltype(auto) next() const; constexpr decltype(auto) scal() const; @@ -385,7 +385,7 @@ namespace CNORXZ template decltype(auto) mkEPos(const BPosT& a, const OPosT& b); - + template decltype(auto) mkiEPos(const BPosT& a, const OPosT& b, std::index_sequence is);