DPos/DPosRef: -> static scalar; replace next() by sub()
This commit is contained in:
parent
f68c02565d
commit
e3fe04d5da
3 changed files with 31 additions and 200 deletions
|
@ -7,28 +7,6 @@
|
||||||
|
|
||||||
namespace CNORXZ
|
namespace CNORXZ
|
||||||
{
|
{
|
||||||
/****************
|
|
||||||
* VPosBase *
|
|
||||||
****************/
|
|
||||||
/*
|
|
||||||
template <SizeT N>
|
|
||||||
inline Uptr<VPosBase> VPosBase::vextend(const SPos<N>& a) const
|
|
||||||
{
|
|
||||||
return this->vextend(UPos(N));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <SizeT N, SizeT... Ms>
|
|
||||||
inline Uptr<VPosBase> VPosBase::vextend(const SFPos<N,Ms...>& a) const
|
|
||||||
{
|
|
||||||
return this->vextend(static_cast<FPos>(a));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class PosT1, class PosT2>
|
|
||||||
inline Uptr<VPosBase> VPosBase::vextend(const MPos<PosT1,PosT2>& a) const
|
|
||||||
{
|
|
||||||
return this->vextend(static_cast<const PosT1&>(a))->vextend(a.next());
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/************
|
/************
|
||||||
* VPos *
|
* VPos *
|
||||||
************/
|
************/
|
||||||
|
@ -88,35 +66,7 @@ namespace CNORXZ
|
||||||
typedef decltype((*this)(UPos(a->vval()))) OPosT;
|
typedef decltype((*this)(UPos(a->vval()))) OPosT;
|
||||||
return std::make_unique<VPos<OPosT>>( (*this)(UPos(a->vval())) );
|
return std::make_unique<VPos<OPosT>>( (*this)(UPos(a->vval())) );
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
template <class PosT>
|
|
||||||
Uptr<VPosBase> VPos<PosT>::vextend(const UPos& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(this->extend(a)) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(this->extend(a));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class PosT>
|
|
||||||
Uptr<VPosBase> VPos<PosT>::vextend(const FPos& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(this->extend(a)) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(this->extend(a));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class PosT>
|
|
||||||
Uptr<VPosBase> VPos<PosT>::vextend(const DPos& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(this->extend(a)) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(this->extend(a));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class PosT>
|
|
||||||
Uptr<VPosBase> VPos<PosT>::vextend(const DPosRef& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(this->extend(DPos(a))) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(this->extend(DPos(a)));
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/******************
|
/******************
|
||||||
* VPos<MPos> *
|
* VPos<MPos> *
|
||||||
******************/
|
******************/
|
||||||
|
@ -190,8 +140,8 @@ namespace CNORXZ
|
||||||
template <class PosT1, class PosT2>
|
template <class PosT1, class PosT2>
|
||||||
Uptr<VPosBase> VPos<MPos<PosT1,PosT2>>::vplus(const VPosBase* a) const
|
Uptr<VPosBase> VPos<MPos<PosT1,PosT2>>::vplus(const VPosBase* a) const
|
||||||
{
|
{
|
||||||
typedef decltype((*this) + DPosRef(a)) OPosT;
|
typedef decltype((*this) + PosFromVPos<MPos<PosT1,PosT2>>::make(a)) OPosT;
|
||||||
return std::make_unique<VPos<OPosT>>((*this) + DPosRef(a));
|
return std::make_unique<VPos<OPosT>>((*this) + PosFromVPos<MPos<PosT1,PosT2>>::make(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class PosT1, class PosT2>
|
template <class PosT1, class PosT2>
|
||||||
|
@ -207,35 +157,7 @@ namespace CNORXZ
|
||||||
typedef decltype( (*this)(UPos(a->vval())) ) OPosT;
|
typedef decltype( (*this)(UPos(a->vval())) ) OPosT;
|
||||||
return std::make_unique<VPos<OPosT>>( (*this)(UPos(a->vval())) );
|
return std::make_unique<VPos<OPosT>>( (*this)(UPos(a->vval())) );
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
template <class PosT1, class PosT2>
|
|
||||||
Uptr<VPosBase> VPos<MPos<PosT1,PosT2>>::vextend(const UPos& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(this->extend(DPos(a))) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(this->extend(DPos(a)));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class PosT1, class PosT2>
|
|
||||||
Uptr<VPosBase> VPos<MPos<PosT1,PosT2>>::vextend(const FPos& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(this->extend(DPos(a))) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(this->extend(DPos(a)));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class PosT1, class PosT2>
|
|
||||||
Uptr<VPosBase> VPos<MPos<PosT1,PosT2>>::vextend(const DPos& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(this->extend(a)) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(this->extend(a));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class PosT1, class PosT2>
|
|
||||||
Uptr<VPosBase> VPos<MPos<PosT1,PosT2>>::vextend(const DPosRef& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(this->extend(DPos(a))) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(this->extend(DPos(a)));
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/***************
|
/***************
|
||||||
* VPosRef *
|
* VPosRef *
|
||||||
***************/
|
***************/
|
||||||
|
@ -295,35 +217,7 @@ namespace CNORXZ
|
||||||
typedef decltype( (*mC)(UPos(a->vval())) ) OPosT;
|
typedef decltype( (*mC)(UPos(a->vval())) ) OPosT;
|
||||||
return std::make_unique<VPos<OPosT>>( (*mC)(UPos(a->vval())) );
|
return std::make_unique<VPos<OPosT>>( (*mC)(UPos(a->vval())) );
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
template <class PosT>
|
|
||||||
Uptr<VPosBase> VPosRef<PosT>::vextend(const UPos& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(mC->extend(a)) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(mC->extend(a));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class PosT>
|
|
||||||
Uptr<VPosBase> VPosRef<PosT>::vextend(const FPos& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(mC->extend(a)) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(mC->extend(a));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class PosT>
|
|
||||||
Uptr<VPosBase> VPosRef<PosT>::vextend(const DPos& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(mC->extend(a)) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(mC->extend(a));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class PosT>
|
|
||||||
Uptr<VPosBase> VPosRef<PosT>::vextend(const DPosRef& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(mC->extend(DPos(a))) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(mC->extend(DPos(a)));
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/*********************
|
/*********************
|
||||||
* VPosRef<MPos> *
|
* VPosRef<MPos> *
|
||||||
*********************/
|
*********************/
|
||||||
|
@ -376,8 +270,8 @@ namespace CNORXZ
|
||||||
template <class PosT1, class PosT2>
|
template <class PosT1, class PosT2>
|
||||||
Uptr<VPosBase> VPosRef<MPos<PosT1,PosT2>>::vplus(const VPosBase* a) const
|
Uptr<VPosBase> VPosRef<MPos<PosT1,PosT2>>::vplus(const VPosBase* a) const
|
||||||
{
|
{
|
||||||
typedef decltype((*mC) + DPosRef(a)) OPosT;
|
typedef decltype((*mC) + PosFromVPos<MPos<PosT1,PosT2>>::make(a)) OPosT;
|
||||||
return std::make_unique<VPos<OPosT>>((*mC) + DPosRef(a));
|
return std::make_unique<VPos<OPosT>>((*mC) + PosFromVPos<MPos<PosT1,PosT2>>::make(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class PosT1, class PosT2>
|
template <class PosT1, class PosT2>
|
||||||
|
@ -393,35 +287,25 @@ namespace CNORXZ
|
||||||
typedef decltype( (*mC)(UPos(a->vval())) ) OPosT;
|
typedef decltype( (*mC)(UPos(a->vval())) ) OPosT;
|
||||||
return std::make_unique<VPos<OPosT>>( (*mC)(UPos(a->vval())) );
|
return std::make_unique<VPos<OPosT>>( (*mC)(UPos(a->vval())) );
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
template <class PosT1, class PosT2>
|
/*******************
|
||||||
Uptr<VPosBase> VPosRef<MPos<PosT1,PosT2>>::vextend(const UPos& a) const
|
* PosFromVPos *
|
||||||
|
*******************/
|
||||||
|
|
||||||
|
template <class PosT>
|
||||||
|
inline decltype(auto) PosFromVPos<PosT>::make(const VPosBase* a)
|
||||||
{
|
{
|
||||||
typedef decltype(mC->extend(DPos(a))) OPosT;
|
return PosT(a->vval());
|
||||||
return std::make_unique<VPos<OPosT>>(mC->extend(DPos(a)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class PosT1, class PosT2>
|
template <class PosT1, class PosT2>
|
||||||
Uptr<VPosBase> VPosRef<MPos<PosT1,PosT2>>::vextend(const FPos& a) const
|
inline decltype(auto) PosFromVPos<MPos<PosT1,PosT2>>::make(const VPosBase* a)
|
||||||
{
|
{
|
||||||
typedef decltype(mC->extend(DPos(a))) OPosT;
|
#if CXZ_DEBUG
|
||||||
return std::make_unique<VPos<OPosT>>(mC->extend(DPos(a)));
|
CXZ_ASSERT(a->vnext() != nullptr, "VPos does not match required size");
|
||||||
|
#endif
|
||||||
|
return MPos<PosT1,PosT2>(a->vval(), PosFromVPos<PosT2>::make(a->vnext()));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class PosT1, class PosT2>
|
|
||||||
Uptr<VPosBase> VPosRef<MPos<PosT1,PosT2>>::vextend(const DPos& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(mC->extend(a)) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(mC->extend(a));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class PosT1, class PosT2>
|
|
||||||
Uptr<VPosBase> VPosRef<MPos<PosT1,PosT2>>::vextend(const DPosRef& a) const
|
|
||||||
{
|
|
||||||
typedef decltype(mC->extend(DPos(a))) OPosT;
|
|
||||||
return std::make_unique<VPos<OPosT>>(mC->extend(DPos(a)));
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
#include "base/base.h"
|
#include "base/base.h"
|
||||||
|
|
||||||
#define MAX_VMPOS_DEPTH 4
|
|
||||||
|
|
||||||
namespace CNORXZ
|
namespace CNORXZ
|
||||||
{
|
{
|
||||||
class VPosBase
|
class VPosBase
|
||||||
|
@ -21,20 +19,6 @@ namespace CNORXZ
|
||||||
virtual Uptr<VPosBase> vplus(const VPosBase* a) const = 0;
|
virtual Uptr<VPosBase> vplus(const VPosBase* a) const = 0;
|
||||||
virtual Uptr<VPosBase> vtimes(const VPosBase* a) const = 0;
|
virtual Uptr<VPosBase> vtimes(const VPosBase* a) const = 0;
|
||||||
virtual Uptr<VPosBase> vexec(const VPosBase* a) const = 0;
|
virtual Uptr<VPosBase> vexec(const VPosBase* a) const = 0;
|
||||||
//virtual Uptr<VPosBase> vextend(const UPos& a) const = 0;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const FPos& a) const = 0;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const DPos& a) const = 0;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const DPosRef& a) const = 0;
|
|
||||||
/*
|
|
||||||
template <SizeT N>
|
|
||||||
inline Uptr<VPosBase> vextend(const SPos<N>& a) const;
|
|
||||||
|
|
||||||
template <SizeT N, SizeT... Ms>
|
|
||||||
inline Uptr<VPosBase> vextend(const SFPos<N,Ms...>& a) const;
|
|
||||||
|
|
||||||
template <class PosT1, class PosT2>
|
|
||||||
inline Uptr<VPosBase> vextend(const MPos<PosT1,PosT2>& a) const;
|
|
||||||
*/
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class PosT>
|
template <class PosT>
|
||||||
|
@ -53,10 +37,6 @@ namespace CNORXZ
|
||||||
virtual Uptr<VPosBase> vplus(const VPosBase* a) const override final;
|
virtual Uptr<VPosBase> vplus(const VPosBase* a) const override final;
|
||||||
virtual Uptr<VPosBase> vtimes(const VPosBase* a) const override final;
|
virtual Uptr<VPosBase> vtimes(const VPosBase* a) const override final;
|
||||||
virtual Uptr<VPosBase> vexec(const VPosBase* a) const override final;
|
virtual Uptr<VPosBase> vexec(const VPosBase* a) const override final;
|
||||||
//virtual Uptr<VPosBase> vextend(const UPos& a) const override final;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const FPos& a) const override final;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const DPos& a) const override final;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const DPosRef& a) const override final;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class PosT1, class PosT2>
|
template <class PosT1, class PosT2>
|
||||||
|
@ -81,10 +61,6 @@ namespace CNORXZ
|
||||||
virtual Uptr<VPosBase> vplus(const VPosBase* a) const override final;
|
virtual Uptr<VPosBase> vplus(const VPosBase* a) const override final;
|
||||||
virtual Uptr<VPosBase> vtimes(const VPosBase* a) const override final;
|
virtual Uptr<VPosBase> vtimes(const VPosBase* a) const override final;
|
||||||
virtual Uptr<VPosBase> vexec(const VPosBase* a) const override final;
|
virtual Uptr<VPosBase> vexec(const VPosBase* a) const override final;
|
||||||
//virtual Uptr<VPosBase> vextend(const UPos& a) const override final;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const FPos& a) const override final;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const DPos& a) const override final;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const DPosRef& a) const override final;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class PosT>
|
template <class PosT>
|
||||||
|
@ -105,10 +81,6 @@ namespace CNORXZ
|
||||||
virtual Uptr<VPosBase> vplus(const VPosBase* a) const override final;
|
virtual Uptr<VPosBase> vplus(const VPosBase* a) const override final;
|
||||||
virtual Uptr<VPosBase> vtimes(const VPosBase* a) const override final;
|
virtual Uptr<VPosBase> vtimes(const VPosBase* a) const override final;
|
||||||
virtual Uptr<VPosBase> vexec(const VPosBase* a) const override final;
|
virtual Uptr<VPosBase> vexec(const VPosBase* a) const override final;
|
||||||
//virtual Uptr<VPosBase> vextend(const UPos& a) const override final;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const FPos& a) const override final;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const DPos& a) const override final;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const DPosRef& a) const override final;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -133,10 +105,6 @@ namespace CNORXZ
|
||||||
virtual Uptr<VPosBase> vplus(const VPosBase* a) const override final;
|
virtual Uptr<VPosBase> vplus(const VPosBase* a) const override final;
|
||||||
virtual Uptr<VPosBase> vtimes(const VPosBase* a) const override final;
|
virtual Uptr<VPosBase> vtimes(const VPosBase* a) const override final;
|
||||||
virtual Uptr<VPosBase> vexec(const VPosBase* a) const override final;
|
virtual Uptr<VPosBase> vexec(const VPosBase* a) const override final;
|
||||||
//virtual Uptr<VPosBase> vextend(const UPos& a) const override final;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const FPos& a) const override final;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const DPos& a) const override final;
|
|
||||||
//virtual Uptr<VPosBase> vextend(const DPosRef& a) const override final;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -180,6 +148,17 @@ namespace CNORXZ
|
||||||
class VPosRef<DPosRef>
|
class VPosRef<DPosRef>
|
||||||
{};
|
{};
|
||||||
|
|
||||||
|
template <class PosT>
|
||||||
|
struct PosFromVPos
|
||||||
|
{
|
||||||
|
static inline decltype(auto) make(const VPosBase* a);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class PosT1, class PosT2>
|
||||||
|
struct PosFromVPos<MPos<PosT1,PosT2>>
|
||||||
|
{
|
||||||
|
static inline decltype(auto) make(const VPosBase* a);
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -157,38 +157,6 @@ namespace
|
||||||
EXPECT_EQ(dp5.sub().val(), mS4p.val() * mUp1.val());
|
EXPECT_EQ(dp5.sub().val(), mS4p.val() * mUp1.val());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(Pos_Test, DynExtend)
|
|
||||||
{/*
|
|
||||||
DPos dp1(mkMPos(static_cast<UPos>(mS2p), mUp1));
|
|
||||||
DPos dp2(mkMPos(mUp2, static_cast<UPos>(mS4p)));
|
|
||||||
auto dp3 = dp1.extend(mUp2);
|
|
||||||
auto dp4 = dp2.extend(mS2p);
|
|
||||||
auto dp5 = dp3 + dp4;
|
|
||||||
DPos dp01(mUp1);
|
|
||||||
auto dp6 = dp3 * dp01;
|
|
||||||
|
|
||||||
EXPECT_EQ( dp3.size(), 3u );
|
|
||||||
EXPECT_EQ( dp4.size(), 3u );
|
|
||||||
|
|
||||||
EXPECT_EQ( dp3.val(), mS2p.val() );
|
|
||||||
EXPECT_EQ( dp3.next().val(), mUp1.val() );
|
|
||||||
EXPECT_EQ( dp3.next().next().val(), mUp2.val() );
|
|
||||||
|
|
||||||
EXPECT_EQ( dp4.val(), mUp2.val() );
|
|
||||||
EXPECT_EQ( dp4.next().val(), mS4p.val() );
|
|
||||||
EXPECT_EQ( dp4.next().next().val(), mS2p.val() );
|
|
||||||
|
|
||||||
EXPECT_EQ( dp5.size(), 3u );
|
|
||||||
EXPECT_EQ( dp6.size(), 3u );
|
|
||||||
|
|
||||||
EXPECT_EQ( dp5.val(), dp3.val() + dp4.val() );
|
|
||||||
EXPECT_EQ( dp5.next().val(), dp3.next().val() + dp4.next().val() );
|
|
||||||
EXPECT_EQ( dp5.next().next().val(), dp3.next().next().val() + dp4.next().next().val() );
|
|
||||||
|
|
||||||
EXPECT_EQ( dp6.val(), dp3.val() * dp01.val() );
|
|
||||||
EXPECT_EQ( dp6.next().val(), dp3.next().val() * dp01.val() );
|
|
||||||
EXPECT_EQ( dp6.next().next().val(), dp3.next().next().val() * dp01.val() );
|
|
||||||
*/}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
|
|
Loading…
Reference in a new issue