From bd6f15156b9dfa2c1ff7a9ca2622ed70489612fb Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Thu, 15 Jun 2023 00:41:17 +0200 Subject: [PATCH] WIP: fix test errors... --- src/include/operation/extensions/reg.cc.h | 41 ++++++++++++----------- src/include/operation/extensions/reg.h | 7 ++++ src/include/xpr/pos_type.cc.h | 39 +++++++++++++++++++-- src/include/xpr/pos_type.h | 17 +++++++--- src/tests/operation_unit_test.cc | 8 ++--- 5 files changed, 81 insertions(+), 31 deletions(-) diff --git a/src/include/operation/extensions/reg.cc.h b/src/include/operation/extensions/reg.cc.h index 85dd00e..3ff3596 100644 --- a/src/include/operation/extensions/reg.cc.h +++ b/src/include/operation/extensions/reg.cc.h @@ -33,6 +33,7 @@ namespace CNORXZ { constexpr SizeT N = epos_size::value; static_assert(is_epos_type::value, "got non-epos-type"); + static_assert(pos_type_is_consecutive::value, "no write access for non-consecutive"); if constexpr(pos_type_is_consecutive::value){ return *reinterpret_cast*>(d); } @@ -117,32 +118,32 @@ namespace CNORXZ constexpr decltype(auto) PlusCC::eval(const Consecutive& a, const Consecutive& b) { - return consecFunc( [](const auto& x, const auto& y) { return x + y; }, a, b ); + return consecFunc( [](const auto& x, const auto& y) { return x + y; }, a, b ); } template constexpr decltype(auto) PlusCC::aeval(Consecutive& o, const Consecutive& a) { - return consecFuncA( [](auto& x, const auto& y) { return x += y; }, o, a ); + return consecFuncA( [](auto& x, const auto& y) { return x += y; }, o, a ); } template constexpr decltype(auto) PlusCX::eval(const Consecutive& a, const X& b) { - return consecFunc( [](const auto& x, const auto& y) { return x + y; }, a, b ); + return consecFunc( [](const auto& x, const auto& y) { return x + y; }, a, b ); } template constexpr decltype(auto) PlusCX::eval(const X& a, const Consecutive& b) { - return consecFunc( [](const auto& x, const auto& y) { return x + y; }, a, b ); + return consecFunc( [](const auto& x, const auto& y) { return x + y; }, a, b ); } template constexpr decltype(auto) PlusCX::aeval(Consecutive& o, const X& a) { - return consecFuncA( [](auto& x, const auto& y) { return x += y; }, o, a ); + return consecFuncA( [](auto& x, const auto& y) { return x += y; }, o, a ); } /******************************* @@ -152,31 +153,31 @@ namespace CNORXZ template constexpr decltype(auto) MinusCC::eval(const Consecutive& a, const Consecutive& b) { - return consecFunc( [](const auto& x, const auto& y) { return x - y; }, a, b ); + return consecFunc( [](const auto& x, const auto& y) { return x - y; }, a, b ); } template constexpr decltype(auto) MinusCX::eval(const Consecutive& a, const X& b) { - return consecFunc( [](const auto& x, const auto& y) { return x - y; }, a, b ); + return consecFunc( [](const auto& x, const auto& y) { return x - y; }, a, b ); } template constexpr decltype(auto) MinusCX::eval(const X& a, const Consecutive& b) { - return consecFunc( [](const auto& x, const auto& y) { return x - y; }, a, b ); + return consecFunc( [](const auto& x, const auto& y) { return x - y; }, a, b ); } template constexpr decltype(auto) MinusCC::aeval(Consecutive& o, const Consecutive& a) { - return consecFuncA( [](auto& x, const auto& y) { return x -= y; }, o, a ); + return consecFuncA( [](auto& x, const auto& y) { return x -= y; }, o, a ); } template constexpr decltype(auto) MinusCX::aeval(Consecutive& o, const X& a) { - return consecFuncA( [](auto& x, const auto& y) { return x -= y; }, o, a ); + return consecFuncA( [](auto& x, const auto& y) { return x -= y; }, o, a ); } /*********************************** @@ -186,31 +187,31 @@ namespace CNORXZ template constexpr decltype(auto) MultipliesCC::eval(const Consecutive& a, const Consecutive& b) { - return consecFunc( [](const auto& x, const auto& y) { return x * y; }, a, b ); + return consecFunc( [](const auto& x, const auto& y) { return x * y; }, a, b ); } template constexpr decltype(auto) MultipliesCX::eval(const Consecutive& a, const X& b) { - return consecFunc( [](const auto& x, const auto& y) { return x * y; }, a, b ); + return consecFunc( [](const auto& x, const auto& y) { return x * y; }, a, b ); } template constexpr decltype(auto) MultipliesCX::eval(const X& a, const Consecutive& b) { - return consecFunc( [](const auto& x, const auto& y) { return x * y; }, a, b ); + return consecFunc( [](const auto& x, const auto& y) { return x * y; }, a, b ); } template constexpr decltype(auto) MultipliesCC::aeval(Consecutive& o, const Consecutive& a) { - return consecFuncA( [](const auto& x, const auto& y) { return x *= y; }, o, a ); + return consecFuncA( [](const auto& x, const auto& y) { return x *= y; }, o, a ); } template constexpr decltype(auto) MultipliesCX::aeval(Consecutive& o, const X& a) { - return consecFuncA( [](const auto& x, const auto& y) { return x *= y; }, o, a ); + return consecFuncA( [](const auto& x, const auto& y) { return x *= y; }, o, a ); } /********************************* @@ -220,31 +221,31 @@ namespace CNORXZ template constexpr decltype(auto) DividesCC::eval(const Consecutive& a, const Consecutive& b) { - return consecFunc( [](const auto& x, const auto& y) { return x / y; }, a, b ); + return consecFunc( [](const auto& x, const auto& y) { return x / y; }, a, b ); } template constexpr decltype(auto) DividesCX::eval(const Consecutive& a, const X& b) { - return consecFunc( [](const auto& x, const auto& y) { return x / y; }, a, b ); + return consecFunc( [](const auto& x, const auto& y) { return x / y; }, a, b ); } template constexpr decltype(auto) DividesCX::eval(const X& a, const Consecutive& b) { - return consecFunc( [](const auto& x, const auto& y) { return x / y; }, a, b ); + return consecFunc( [](const auto& x, const auto& y) { return x / y; }, a, b ); } template constexpr decltype(auto) DividesCC::aeval(Consecutive& o, const Consecutive& a) { - return consecFuncA( [](const auto& x, const auto& y) { return x /= y; }, o, a ); + return consecFuncA( [](const auto& x, const auto& y) { return x /= y; }, o, a ); } template constexpr decltype(auto) DividesCX::aeval(Consecutive& o, const X& a) { - return consecFuncA( [](const auto& x, const auto& y) { return x /= y; }, o, a ); + return consecFuncA( [](const auto& x, const auto& y) { return x /= y; }, o, a ); } } diff --git a/src/include/operation/extensions/reg.h b/src/include/operation/extensions/reg.h index f03b848..2421301 100644 --- a/src/include/operation/extensions/reg.h +++ b/src/include/operation/extensions/reg.h @@ -13,6 +13,13 @@ namespace CNORXZ struct Consecutive { T mD[N]; + Consecutive& operator=(const Consecutive& a) + { + iter<0,N>([&](auto i) { mD[i] = a.mD[i]; VCHECK(mD[i]); }, NoF{} ); + return *this; + } + + Consecutive& operator=(Consecutive&& a) = delete; }; template diff --git a/src/include/xpr/pos_type.cc.h b/src/include/xpr/pos_type.cc.h index 4370e70..d11f4da 100644 --- a/src/include/xpr/pos_type.cc.h +++ b/src/include/xpr/pos_type.cc.h @@ -586,6 +586,37 @@ namespace CNORXZ mP(os...) {} + template + template + constexpr decltype(auto) EPos::operator+(const PosT& a) const + { + return iter<0,sizeof...(OPosTs)> + ( [&](auto i) { return std::get(mP); }, + [&](const auto&... e) { return EPos + (BPosT::operator+(a),e...); } ); + } + + template + template + constexpr decltype(auto) EPos::operator*(const PosT& a) const + { + return iter<0,sizeof...(OPosTs)> + ( [&](auto i) { return std::get(mP); }, + [&](const auto&... e) { return EPos + (BPosT::operator*(a),e...); } ); + } + + template + template + constexpr decltype(auto) EPos::operator()(const PosT& a) const + { + return iter<0,sizeof...(OPosTs)> + ( [&](auto i) { return std::get(mP); }, + [&](const auto&... e) { return EPos + (BPosT::operator()(a),e...); } ); + } + + template constexpr decltype(auto) EPos::val() const { @@ -635,11 +666,13 @@ namespace CNORXZ return mkiEPos(a, b, std::make_index_sequence{}); } - template - decltype(auto) MkEPos,OPosT,N>::mk(const MPos& a, const OPosT& b) + template + decltype(auto) MkEPos,MPos,N>::mk(const MPos& a, const MPos& b) { const BPosT& ax = static_cast(a); - return MPos(ax,b)),NPosT>(mkEPos(ax,b), a.next()); + const OPosT& bx = static_cast(b); + return MPos(ax,bx)),decltype(mkEPos(a.next(),b.next()))> + (mkEPos(ax,bx), mkEPos(a.next(),b.next())); } template diff --git a/src/include/xpr/pos_type.h b/src/include/xpr/pos_type.h index c345a53..357eb4e 100644 --- a/src/include/xpr/pos_type.h +++ b/src/include/xpr/pos_type.h @@ -276,6 +276,15 @@ namespace CNORXZ constexpr EPos(const BPosT& b, const OPosTs&... os); constexpr EPos(BPosT&& b, OPosTs&&... os); + template + constexpr decltype(auto) operator+(const PosT& a) const; + + template + constexpr decltype(auto) operator*(const PosT& a) const; + + template + constexpr decltype(auto) operator()(const PosT& a) const; + constexpr decltype(auto) val() const; constexpr decltype(auto) next() const; @@ -345,10 +354,10 @@ namespace CNORXZ static decltype(auto) mk(const BPosT& a, const OPosT& b); }; - template - struct MkEPos,OPosT,N> + template + struct MkEPos,MPos,N> { - static decltype(auto) mk(const MPos& a, const OPosT& b); + static decltype(auto) mk(const MPos& a, const MPos& b); }; template @@ -406,7 +415,7 @@ namespace CNORXZ template struct epos_size> { - static constexpr SizeT value = epos_size::value * epos_size::value; + static constexpr SizeT value = epos_size::value; }; template diff --git a/src/tests/operation_unit_test.cc b/src/tests/operation_unit_test.cc index cc480db..2167c3d 100644 --- a/src/tests/operation_unit_test.cc +++ b/src/tests/operation_unit_test.cc @@ -56,8 +56,8 @@ namespace SizeT off = 20; mData1 = Numbers::get(off, mSize1); mData2 = Numbers::get(off += mSize1 , mSize2); - mData11 = Numbers::get(off += mSize2, mSize1*mSize1); - mData12 = Numbers::get(off += mSize1*mSize1, mSize1*mSize2); + mData11 = Numbers::get(off += mSize2, mSize1*mSize2); + mData12 = Numbers::get(off += mSize1*mSize2, mSize1*mSize2); auto cr1 = CRangeFactory(mSize1).create(); auto cr2 = CRangeFactory(mSize2).create(); mCI1i = std::make_shared(cr1); @@ -108,8 +108,8 @@ namespace SizeT off = 20; mData1 = Numbers::get(off, mSize1); mData2 = Numbers::get(off += mSize1 , mSize2); - mData11 = Numbers::get(off += mSize2, mSize1*mSize1); - mData12 = Numbers::get(off += mSize1*mSize1, mSize1*mSize2); + mData11 = Numbers::get(off += mSize2, mSize1*mSize2); + mData12 = Numbers::get(off += mSize1*mSize2, mSize1*mSize2); auto cr1 = CRangeFactory(mSize1).create(); auto cr2 = CRangeFactory(mSize2).create(); mCI1i = std::make_shared(cr1);