pos: ignore epos in fpos types
This commit is contained in:
parent
f674407a38
commit
758bc89307
2 changed files with 61 additions and 21 deletions
|
@ -151,6 +151,7 @@ namespace CNORXZ
|
|||
if constexpr(is_epos_type<PosT>::value){
|
||||
return in*(*this);
|
||||
}
|
||||
else {
|
||||
if constexpr(std::is_same<PosT,SPos<0>>::value){
|
||||
return SPos<0>{};
|
||||
}
|
||||
|
@ -158,10 +159,15 @@ namespace CNORXZ
|
|||
return UPos(mExt * in.val());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <class PosT>
|
||||
constexpr decltype(auto) UPos::operator()(const PosT& in) const
|
||||
{
|
||||
if constexpr(is_epos_type<PosT>::value){
|
||||
return in*(*this);
|
||||
}
|
||||
else {
|
||||
if constexpr(std::is_same<PosT,SPos<0>>::value){
|
||||
return SPos<0>{};
|
||||
}
|
||||
|
@ -169,6 +175,7 @@ namespace CNORXZ
|
|||
return UPos(mExt * in.val());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <class PosT>
|
||||
constexpr decltype(auto) UPos::extend(const PosT& p1) const
|
||||
|
@ -211,16 +218,26 @@ namespace CNORXZ
|
|||
}
|
||||
|
||||
template <class PosT>
|
||||
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<PosT>::value){
|
||||
return FPos(mExt * a.scal().val(), mMap);
|
||||
}
|
||||
else {
|
||||
return FPos(mExt * a.val(), mMap);
|
||||
}
|
||||
}
|
||||
|
||||
template <class PosT1>
|
||||
constexpr decltype(auto) FPos::operator()(const PosT1& a) const
|
||||
{
|
||||
if constexpr(is_epos_type<PosT1>::value){
|
||||
return UPos(mExt * mMap[a.scal().val()]);
|
||||
}
|
||||
else {
|
||||
return UPos(mExt * mMap[a.val()]);
|
||||
}
|
||||
}
|
||||
|
||||
template <class PosT>
|
||||
constexpr decltype(auto) FPos::extend(const PosT& a) const
|
||||
|
@ -305,12 +322,22 @@ namespace CNORXZ
|
|||
constexpr decltype(auto) SFPos<N,Ms...>::operator*(const PosT& a) const
|
||||
{
|
||||
if constexpr(is_static_pos_type<PosT>::value){
|
||||
if constexpr(is_epos_type<PosT>::value){
|
||||
return SFPos<N*a.scal().val(),Ms...>();
|
||||
}
|
||||
else {
|
||||
return SFPos<N*a.val(),Ms...>();
|
||||
}
|
||||
}
|
||||
else {
|
||||
if constexpr(is_epos_type<PosT>::value){
|
||||
return FPos(N * a.scal().val(), &sMs[0]);
|
||||
}
|
||||
else {
|
||||
return FPos(N * a.val(), &sMs[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <SizeT N, SizeT... Ms>
|
||||
template <class PosT>
|
||||
|
@ -318,13 +345,23 @@ namespace CNORXZ
|
|||
{
|
||||
if constexpr(is_static_pos_type<PosT>::value){
|
||||
constexpr Arr<SizeT,sizeof...(Ms)> ms({ Ms... });
|
||||
if constexpr(is_epos_type<PosT>::value){
|
||||
return SPos<N*std::get<a.scal().val()>(ms)>();
|
||||
}
|
||||
else {
|
||||
return SPos<N*std::get<a.val()>(ms)>();
|
||||
}
|
||||
}
|
||||
else {
|
||||
constexpr Arr<SizeT,sizeof...(Ms)> ms({ Ms... });
|
||||
if constexpr(is_epos_type<PosT>::value){
|
||||
return UPos(N * ms[a.scal().val()]);
|
||||
}
|
||||
else {
|
||||
return UPos(N * ms[a.val()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <SizeT N, SizeT... Ms>
|
||||
template <class PosT>
|
||||
|
@ -673,7 +710,8 @@ namespace CNORXZ
|
|||
{
|
||||
return iter<0,sizeof...(OPosTs)>
|
||||
( [&](auto i) { return std::get<i>(mP); },
|
||||
[&](const auto&... e) { return EPos<decltype(BPosT::operator*(a)),OPosTs...>
|
||||
[&](const auto&... e) { return EPos<decltype(BPosT::operator*(a)),
|
||||
decltype(e*a)...>
|
||||
(BPosT::operator*(a),e*a...); } );
|
||||
}
|
||||
|
||||
|
@ -683,7 +721,8 @@ namespace CNORXZ
|
|||
{
|
||||
return iter<0,sizeof...(OPosTs)>
|
||||
( [&](auto i) { return std::get<i>(mP); },
|
||||
[&](const auto&... e) { return EPos<decltype(BPosT::operator()(a)),OPosTs...>
|
||||
[&](const auto&... e) { return EPos<decltype(BPosT::operator()(a)),
|
||||
decltype(e*a)...>
|
||||
(BPosT::operator()(a),e*a...); } );
|
||||
}
|
||||
|
||||
|
@ -694,12 +733,13 @@ namespace CNORXZ
|
|||
return ival(std::index_sequence_for<OPosTs...>{});
|
||||
}
|
||||
|
||||
/*
|
||||
template <class BPosT, class... OPosTs>
|
||||
constexpr decltype(auto) EPos<BPosT,OPosTs...>::next() const
|
||||
{
|
||||
return inext(std::index_sequence_for<OPosTs...>{});
|
||||
}
|
||||
|
||||
*/
|
||||
template <class BPosT, class... OPosTs>
|
||||
constexpr decltype(auto) EPos<BPosT,OPosTs...>::scal() const
|
||||
{
|
||||
|
@ -724,7 +764,7 @@ namespace CNORXZ
|
|||
return Arr<SizeT,is.size()> { (BPosT::val()+std::get<Is>(mP).val())... };
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
template <class BPosT, class... OPosTs>
|
||||
template <SizeT... Is>
|
||||
constexpr decltype(auto) EPos<BPosT,OPosTs...>::inext(std::index_sequence<Is...> is) const
|
||||
|
@ -732,7 +772,7 @@ namespace CNORXZ
|
|||
typedef EPos<decltype(next()),decltype(std::get<Is>(mP).next())...> OEPosT;
|
||||
return OEPosT(BPosT::next(), std::get<Is>(mP).next()...);
|
||||
}
|
||||
|
||||
*/
|
||||
/*===============================+
|
||||
| Traits and Helper-Classes |
|
||||
+===============================*/
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue