WIP: pos type operations

This commit is contained in:
Christian Zimmermann 2024-07-12 19:16:55 +02:00
parent 3086bf54ab
commit f674407a38
2 changed files with 111 additions and 113 deletions

View file

@ -34,13 +34,6 @@ namespace CNORXZ
return N; return N;
} }
template <SizeT N>
template <SizeT N1>
constexpr decltype(auto) SPos<N>::operator+(const SPos<N1>& a) const
{
return SPos<N+N1>();
}
template <SizeT N> template <SizeT N>
template <SizeT N1> template <SizeT N1>
constexpr decltype(auto) SPos<N>::operator-(const SPos<N1>& a) const constexpr decltype(auto) SPos<N>::operator-(const SPos<N1>& a) const
@ -49,30 +42,29 @@ namespace CNORXZ
} }
template <SizeT N> template <SizeT N>
template <SizeT N1> template <class PosT>
constexpr decltype(auto) SPos<N>::operator*(const SPos<N1>& a) const constexpr decltype(auto) SPos<N>::operator+(const PosT& a) const
{ {
return SPos<N*N1>(); if constexpr(is_epos_type<PosT>::value){
a+(*this);
} }
else if constexpr(is_static_pos_type<PosT>::value){
template <SizeT N> return SPos<N+a.val()>{};
template <SizeT N1>
constexpr decltype(auto) SPos<N>::operator()(const SPos<N1>& a) const
{
return SPos<N*N1>();
} }
else {
template <SizeT N>
constexpr decltype(auto) SPos<N>::operator+(const UPos& a) const
{
return UPos(N+a.val()); return UPos(N+a.val());
} }
}
template <SizeT N> template <SizeT N>
constexpr decltype(auto) SPos<N>::operator*(const UPos& a) const template <class PosT>
constexpr decltype(auto) SPos<N>::operator*(const PosT& a) const
{ {
if constexpr(N == 0) { if constexpr(N == 0) {
return SPos<0>(); return SPos<0>{};
}
else if constexpr(is_static_pos_type<PosT>::value){
return SPos<N*a.val()>{};
} }
else { else {
return UPos(N*a.val()); return UPos(N*a.val());
@ -80,10 +72,14 @@ namespace CNORXZ
} }
template <SizeT N> template <SizeT N>
constexpr decltype(auto) SPos<N>::operator()(const UPos& a) const template <class PosT>
constexpr decltype(auto) SPos<N>::operator()(const PosT& a) const
{ {
if constexpr(N == 0) { if constexpr(N == 0) {
return SPos<0>(); return SPos<0>{};
}
else if constexpr(is_static_pos_type<PosT>::value){
return SPos<N*a.val()>{};
} }
else { else {
return UPos(N*a.val()); return UPos(N*a.val());
@ -135,8 +131,13 @@ namespace CNORXZ
template <class PosT> template <class PosT>
constexpr UPos UPos::operator+(const PosT& in) const constexpr UPos UPos::operator+(const PosT& in) const
{ {
if constexpr(is_epos_type<PosT>::value){
return in+(*this);
}
else {
return UPos(mExt + in.val()); return UPos(mExt + in.val());
} }
}
template <class PosT> template <class PosT>
constexpr UPos UPos::operator-(const PosT& in) const constexpr UPos UPos::operator-(const PosT& in) const
@ -144,26 +145,29 @@ namespace CNORXZ
return UPos(mExt - in.val()); return UPos(mExt - in.val());
} }
constexpr SPos<0> UPos::operator*(const SPos<0>& a) const template <class PosT>
constexpr decltype(auto) UPos::operator*(const PosT& in) const
{ {
return SPos<0>(); if constexpr(is_epos_type<PosT>::value){
return in*(*this);
}
if constexpr(std::is_same<PosT,SPos<0>>::value){
return SPos<0>{};
}
else {
return UPos(mExt * in.val());
}
} }
template <class PosT> template <class PosT>
constexpr UPos UPos::operator*(const PosT& in) const constexpr decltype(auto) UPos::operator()(const PosT& in) const
{ {
if constexpr(std::is_same<PosT,SPos<0>>::value){
return SPos<0>{};
}
else {
return UPos(mExt * in.val()); return UPos(mExt * in.val());
} }
constexpr SPos<0> UPos::operator()(const SPos<0>& a) const
{
return SPos<0>();
}
template <class PosT>
constexpr UPos UPos::operator()(const PosT& in) const
{
return UPos(mExt * in.val());
} }
template <class PosT> template <class PosT>
@ -207,13 +211,13 @@ namespace CNORXZ
} }
template <class PosT> template <class PosT>
constexpr FPos FPos::operator*(const PosT& in) const constexpr decltype(auto) FPos::operator*(const PosT& in) const
{ {
return FPos(mExt * in.val(), mMap); return FPos(mExt * in.val(), mMap);
} }
template <class PosT1> template <class PosT1>
constexpr UPos FPos::operator()(const PosT1& a) const constexpr decltype(auto) FPos::operator()(const PosT1& a) const
{ {
return UPos(mExt * mMap[a.val()]); return UPos(mExt * mMap[a.val()]);
} }
@ -285,45 +289,42 @@ namespace CNORXZ
} }
template <SizeT N, SizeT... Ms> template <SizeT N, SizeT... Ms>
template <SizeT N1> template <class PosT>
constexpr auto SFPos<N,Ms...>::operator+(const SPos<N1>& a) const constexpr decltype(auto) SFPos<N,Ms...>::operator+(const PosT& a) const
{ {
return SPos<N+N1>(); if constexpr(is_static_pos_type<PosT>::value){
return SPos<N+a.val()>();
}
else {
return UPos(N + a.val());
}
} }
template <SizeT N, SizeT... Ms> template <SizeT N, SizeT... Ms>
template <SizeT N1> template <class PosT>
constexpr auto SFPos<N,Ms...>::operator*(const SPos<N1>& a) const constexpr decltype(auto) SFPos<N,Ms...>::operator*(const PosT& a) const
{ {
return SFPos<N*N1,Ms...>(); if constexpr(is_static_pos_type<PosT>::value){
return SFPos<N*a.val(),Ms...>();
}
else {
return FPos(N * a.val(), &sMs[0]);
}
} }
template <SizeT N, SizeT... Ms> template <SizeT N, SizeT... Ms>
template <SizeT N1> template <class PosT>
constexpr auto SFPos<N,Ms...>::operator()(const SPos<N1>& a) const constexpr decltype(auto) SFPos<N,Ms...>::operator()(const PosT& a) const
{ {
if constexpr(is_static_pos_type<PosT>::value){
constexpr Arr<SizeT,sizeof...(Ms)> ms({ Ms... }); constexpr Arr<SizeT,sizeof...(Ms)> ms({ Ms... });
return SPos<N*std::get<a.val()>(ms)>(); return SPos<N*std::get<a.val()>(ms)>();
} }
else {
template <SizeT N, SizeT... Ms>
constexpr auto SFPos<N,Ms...>::operator+(const UPos& a) const
{
return UPos(N + a.val());
}
template <SizeT N, SizeT... Ms>
constexpr auto SFPos<N,Ms...>::operator*(const UPos& a) const
{
return FPos(N * a.val(), &sMs[0]);
}
template <SizeT N, SizeT... Ms>
constexpr auto SFPos<N,Ms...>::operator()(const UPos& a) const
{
constexpr Arr<SizeT,sizeof...(Ms)> ms({ Ms... }); constexpr Arr<SizeT,sizeof...(Ms)> ms({ Ms... });
return UPos(N * ms[a.val()]); return UPos(N * ms[a.val()]);
} }
}
template <SizeT N, SizeT... Ms> template <SizeT N, SizeT... Ms>
template <class PosT> template <class PosT>

View file

@ -28,18 +28,17 @@ namespace CNORXZ
constexpr SizeT size() const; constexpr SizeT size() const;
constexpr SizeT val() const; constexpr SizeT val() const;
template <SizeT N1>
constexpr decltype(auto) operator+(const SPos<N1>& a) const;
template <SizeT N1> template <SizeT N1>
constexpr decltype(auto) operator-(const SPos<N1>& a) const; constexpr decltype(auto) operator-(const SPos<N1>& a) const;
template <SizeT N1>
constexpr decltype(auto) operator*(const SPos<N1>& a) const;
template <SizeT N1>
constexpr decltype(auto) operator()(const SPos<N1>& a) const;
constexpr decltype(auto) operator+(const UPos& a) const; template <class PosT>
constexpr decltype(auto) operator*(const UPos& a) const; constexpr decltype(auto) operator+(const PosT& a) const;
constexpr decltype(auto) operator()(const UPos& a) const;
template <class PosT>
constexpr decltype(auto) operator*(const PosT& a) const;
template <class PosT>
constexpr decltype(auto) operator()(const PosT& a) const;
template <class PosT> template <class PosT>
constexpr decltype(auto) extend(const PosT& a) const; constexpr decltype(auto) extend(const PosT& a) const;
@ -69,15 +68,15 @@ namespace CNORXZ
template <class PosT> template <class PosT>
constexpr UPos operator-(const PosT& a) const; constexpr UPos operator-(const PosT& a) const;
constexpr SPos<0> operator*(const SPos<0>& a) const; //constexpr SPos<0> operator*(const SPos<0>& a) const;
template <class PosT> template <class PosT>
constexpr UPos operator*(const PosT& a) const; constexpr decltype(auto) operator*(const PosT& a) const;
constexpr SPos<0> operator()(const SPos<0>& a) const; //constexpr SPos<0> operator()(const SPos<0>& a) const;
template <class PosT> template <class PosT>
constexpr UPos operator()(const PosT& a) const; constexpr decltype(auto) operator()(const PosT& a) const;
template <class PosT> template <class PosT>
constexpr decltype(auto) extend(const PosT& a) const; constexpr decltype(auto) extend(const PosT& a) const;
@ -107,10 +106,10 @@ namespace CNORXZ
constexpr UPos operator+(const PosT1& a) const; constexpr UPos operator+(const PosT1& a) const;
template <class PosT1> template <class PosT1>
constexpr FPos operator*(const PosT1& a) const; constexpr decltype(auto) operator*(const PosT1& a) const;
template <class PosT> template <class PosT>
constexpr UPos operator()(const PosT& a) const; constexpr decltype(auto) operator()(const PosT& a) const;
template <class PosT> template <class PosT>
constexpr decltype(auto) extend(const PosT& a) const; constexpr decltype(auto) extend(const PosT& a) const;
@ -138,16 +137,14 @@ namespace CNORXZ
constexpr SizeT size() const; constexpr SizeT size() const;
constexpr SizeT val() const; constexpr SizeT val() const;
template <SizeT N1> template <class PosT>
constexpr auto operator+(const SPos<N1>& a) const; constexpr decltype(auto) operator+(const PosT& a) const;
template <SizeT N1>
constexpr auto operator*(const SPos<N1>& a) const;
template <SizeT N1>
constexpr auto operator()(const SPos<N1>& a) const;
constexpr auto operator+(const UPos& a) const; template <class PosT>
constexpr auto operator*(const UPos& a) const; constexpr decltype(auto) operator*(const PosT& a) const;
constexpr auto operator()(const UPos& a) const;
template <class PosT>
constexpr decltype(auto) operator()(const PosT& a) const;
template <class PosT> template <class PosT>
constexpr decltype(auto) extend(const PosT& a) const; constexpr decltype(auto) extend(const PosT& a) const;