crange.basic test works
This commit is contained in:
parent
a10770b4f1
commit
4212ed7ee9
7 changed files with 188 additions and 25 deletions
|
@ -15,6 +15,7 @@ namespace CNORXZ
|
||||||
DType::DType(const T& d) : mD(d)
|
DType::DType(const T& d) : mD(d)
|
||||||
{
|
{
|
||||||
_mkToStr<T>();
|
_mkToStr<T>();
|
||||||
|
_mkComp<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -22,6 +23,7 @@ namespace CNORXZ
|
||||||
{
|
{
|
||||||
mD = d;
|
mD = d;
|
||||||
_mkToStr<T>();
|
_mkToStr<T>();
|
||||||
|
_mkComp<T>();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,10 +45,10 @@ namespace CNORXZ
|
||||||
else {
|
else {
|
||||||
auto& at = std::any_cast<const T&>(a);
|
auto& at = std::any_cast<const T&>(a);
|
||||||
auto& dt = std::any_cast<const T&>(mD);
|
auto& dt = std::any_cast<const T&>(mD);
|
||||||
if(std::equal_to(dt,at)){
|
if(std::equal_to<T>{}(dt,at)){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if(std::less(dt,at)){
|
else if(std::less<T>{}(dt,at)){
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace CNORXZ
|
||||||
template <typename T>
|
template <typename T>
|
||||||
DType& operator=(const T& d);
|
DType& operator=(const T& d);
|
||||||
|
|
||||||
std::string str() const { return mToStr(); }
|
String str() const { return mToStr(); }
|
||||||
const std::any& get() const { return mD; }
|
const std::any& get() const { return mD; }
|
||||||
|
|
||||||
bool operator==(const DType& a) const { return mComp(a.mD) == 0; }
|
bool operator==(const DType& a) const { return mComp(a.mD) == 0; }
|
||||||
|
|
|
@ -100,6 +100,36 @@ namespace CNORXZ
|
||||||
assert(mPtrId == reinterpret_cast<PtrId>(this));
|
assert(mPtrId == reinterpret_cast<PtrId>(this));
|
||||||
return mPtrId;
|
return mPtrId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************
|
||||||
|
* Non-member functions *
|
||||||
|
****************************/
|
||||||
|
|
||||||
|
template <class I, typename MetaType>
|
||||||
|
IndexPtr<I,MetaType>& operator++(const IndexPtr<I,MetaType>& i)
|
||||||
|
{
|
||||||
|
++(*i);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class I, typename MetaType>
|
||||||
|
IndexPtr<I,MetaType>& operator--(const IndexPtr<I,MetaType>& i)
|
||||||
|
{
|
||||||
|
--(*i);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class I, typename MetaType>
|
||||||
|
IndexPtr<I,MetaType> operator+(const IndexPtr<I,MetaType>& i, Int n)
|
||||||
|
{
|
||||||
|
return std::make_shared<IndexInterface<I,MetaType>>( *i + n );
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class I, typename MetaType>
|
||||||
|
IndexPtr<I,MetaType> operator-(const IndexPtr<I,MetaType>& i, Int n)
|
||||||
|
{
|
||||||
|
return std::make_shared<IndexInterface<I,MetaType>>( *i - n );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -59,6 +59,9 @@ namespace CNORXZ
|
||||||
auto iforh(SizeT step, const Expr ex) const
|
auto iforh(SizeT step, const Expr ex) const
|
||||||
{ return THIS().template iforh<Expr>(step,ex); }
|
{ return THIS().template iforh<Expr>(step,ex); }
|
||||||
*/
|
*/
|
||||||
|
protected:
|
||||||
|
SizeT mPos = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend I; // why not protected???!!!
|
friend I; // why not protected???!!!
|
||||||
|
|
||||||
|
@ -70,10 +73,15 @@ namespace CNORXZ
|
||||||
IndexInterface& operator=(IndexInterface&& in);
|
IndexInterface& operator=(IndexInterface&& in);
|
||||||
IndexInterface(SizeT pos);
|
IndexInterface(SizeT pos);
|
||||||
|
|
||||||
SizeT mPos = 0;
|
|
||||||
PtrId mPtrId = 0;
|
PtrId mPtrId = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class I, typename MetaType>
|
||||||
|
IndexPtr<I,MetaType>& operator++(const IndexPtr<I,MetaType>& i);
|
||||||
|
|
||||||
|
template <class I, typename MetaType>
|
||||||
|
IndexPtr<I,MetaType>& operator--(const IndexPtr<I,MetaType>& i);
|
||||||
|
|
||||||
// to define relative indices:
|
// to define relative indices:
|
||||||
template <class I, typename MetaType>
|
template <class I, typename MetaType>
|
||||||
IndexPtr<I,MetaType> operator+(const IndexPtr<I,MetaType>& i, Int n);
|
IndexPtr<I,MetaType> operator+(const IndexPtr<I,MetaType>& i, Int n);
|
||||||
|
|
|
@ -6,21 +6,26 @@
|
||||||
|
|
||||||
namespace CNORXZ
|
namespace CNORXZ
|
||||||
{
|
{
|
||||||
|
|
||||||
/**************
|
/**************
|
||||||
* XIndex *
|
* XIndex *
|
||||||
**************/
|
**************/
|
||||||
|
|
||||||
template <class Index, typename Meta>
|
template <class Index, typename Meta>
|
||||||
XIndex<Index,Meta>::XIndex(const IndexPtr<Index,Meta>& i) : mI(i) {}
|
XIndex<Index,Meta>::XIndex(const IndexPtr<Index,Meta>& i) :
|
||||||
|
XIndexBase(i->pos()),
|
||||||
|
mI(i) {}
|
||||||
|
|
||||||
template <class Index, typename Meta>
|
template <class Index, typename Meta>
|
||||||
XIndex<Index,Meta>::XIndex(const IndexInterface<Index,Meta>& i) :
|
XIndex<Index,Meta>::XIndex(const IndexInterface<Index,Meta>& i) :
|
||||||
|
XIndexBase(i.pos()),
|
||||||
mI(std::make_shared<Index>(i.THIS())) {}
|
mI(std::make_shared<Index>(i.THIS())) {}
|
||||||
|
|
||||||
template <class Index, typename Meta>
|
template <class Index, typename Meta>
|
||||||
XIndex<Index,Meta>& XIndex<Index,Meta>::operator=(SizeT pos)
|
XIndex<Index,Meta>& XIndex<Index,Meta>::operator=(SizeT pos)
|
||||||
{
|
{
|
||||||
*mI = pos;
|
*mI = pos;
|
||||||
|
IB::mPos = mI->pos();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +33,7 @@ namespace CNORXZ
|
||||||
XIndex<Index,Meta>& XIndex<Index,Meta>::operator++()
|
XIndex<Index,Meta>& XIndex<Index,Meta>::operator++()
|
||||||
{
|
{
|
||||||
++(*mI);
|
++(*mI);
|
||||||
|
IB::mPos = mI->pos();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,19 +41,64 @@ namespace CNORXZ
|
||||||
XIndex<Index,Meta>& XIndex<Index,Meta>::operator--()
|
XIndex<Index,Meta>& XIndex<Index,Meta>::operator--()
|
||||||
{
|
{
|
||||||
--(*mI);
|
--(*mI);
|
||||||
|
IB::mPos = mI->pos();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class Index, typename Meta>
|
||||||
|
Sptr<XIndexBase> XIndex<Index,Meta>::operator+(Int n) const
|
||||||
|
{
|
||||||
|
return std::make_shared<XIndex<Index,Meta>>(*mI + n);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Index, typename Meta>
|
||||||
|
Sptr<XIndexBase> XIndex<Index,Meta>::operator-(Int n) const
|
||||||
|
{
|
||||||
|
return std::make_shared<XIndex<Index,Meta>>(*mI - n);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Index, typename Meta>
|
||||||
|
XIndex<Index,Meta>& XIndex<Index,Meta>::operator+=(Int n)
|
||||||
|
{
|
||||||
|
(*mI) += n;
|
||||||
|
IB::mPos = mI->pos();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Index, typename Meta>
|
||||||
|
XIndex<Index,Meta>& XIndex<Index,Meta>::operator-=(Int n)
|
||||||
|
{
|
||||||
|
(*mI) -= n;
|
||||||
|
IB::mPos = mI->pos();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Index, typename Meta>
|
||||||
|
DType XIndex<Index,Meta>::operator*() const
|
||||||
|
{
|
||||||
|
return DType(*(*mI));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Index, typename Meta>
|
||||||
|
DType XIndex<Index,Meta>::operator->() const
|
||||||
|
{
|
||||||
|
return DType(*(*mI));
|
||||||
|
}
|
||||||
|
|
||||||
template <class Index, typename Meta>
|
template <class Index, typename Meta>
|
||||||
Int XIndex<Index,Meta>::pp(PtrId idxPtrNum)
|
Int XIndex<Index,Meta>::pp(PtrId idxPtrNum)
|
||||||
{
|
{
|
||||||
return mI->pp(idxPtrNum);
|
Int out = mI->pp(idxPtrNum);
|
||||||
|
IB::mPos = mI->pos();
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Index, typename Meta>
|
template <class Index, typename Meta>
|
||||||
Int XIndex<Index,Meta>::mm(PtrId idxPtrNum)
|
Int XIndex<Index,Meta>::mm(PtrId idxPtrNum)
|
||||||
{
|
{
|
||||||
return mI->mm(idxPtrNum);
|
Int out = mI->mm(idxPtrNum);
|
||||||
|
IB::mPos = mI->pos();
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Index, typename Meta>
|
template <class Index, typename Meta>
|
||||||
|
@ -56,6 +107,12 @@ namespace CNORXZ
|
||||||
return mI->dim();
|
return mI->dim();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class Index, typename Meta>
|
||||||
|
RangePtr XIndex<Index,Meta>::range() const
|
||||||
|
{
|
||||||
|
return mI->range();
|
||||||
|
}
|
||||||
|
|
||||||
template <class Index, typename Meta>
|
template <class Index, typename Meta>
|
||||||
SizeT XIndex<Index,Meta>::getStepSize(SizeT n) const
|
SizeT XIndex<Index,Meta>::getStepSize(SizeT n) const
|
||||||
{
|
{
|
||||||
|
@ -79,6 +136,7 @@ namespace CNORXZ
|
||||||
{
|
{
|
||||||
// check!!!
|
// check!!!
|
||||||
mI->at(std::any_cast<const Meta&>(meta.get()));
|
mI->at(std::any_cast<const Meta&>(meta.get()));
|
||||||
|
IB::mPos = mI->pos();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -12,48 +12,82 @@ namespace CNORXZ
|
||||||
class XIndexBase : public IndexInterface<XIndexBase,DType>
|
class XIndexBase : public IndexInterface<XIndexBase,DType>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef IndexInterface<XIndexBase,DType> IB;
|
||||||
|
|
||||||
DEFAULT_MEMBERS(XIndexBase);
|
DEFAULT_MEMBERS(XIndexBase);
|
||||||
|
XIndexBase(SizeT pos) : IndexInterface<XIndexBase,DType>(pos) {}
|
||||||
|
|
||||||
virtual XIndexBase& operator=(SizeT pos) = 0;
|
virtual XIndexBase& operator=(SizeT pos) = 0;
|
||||||
virtual XIndexBase& operator++() = 0;
|
virtual XIndexBase& operator++() = 0;
|
||||||
virtual XIndexBase& operator--() = 0;
|
virtual XIndexBase& operator--() = 0;
|
||||||
|
virtual Sptr<XIndexBase> operator+(Int n) const = 0;
|
||||||
|
virtual Sptr<XIndexBase> operator-(Int n) const = 0;
|
||||||
|
virtual XIndexBase& operator+=(Int n) = 0;
|
||||||
|
virtual XIndexBase& operator-=(Int n) = 0;
|
||||||
|
|
||||||
|
virtual DType operator*() const = 0;
|
||||||
|
virtual DType operator->() const = 0;
|
||||||
|
|
||||||
virtual Int pp(PtrId idxPtrNum) = 0;
|
virtual Int pp(PtrId idxPtrNum) = 0;
|
||||||
virtual Int mm(PtrId idxPtrNum) = 0;
|
virtual Int mm(PtrId idxPtrNum) = 0;
|
||||||
virtual size_t dim() const = 0;
|
|
||||||
virtual size_t getStepSize(SizeT n) const = 0;
|
virtual SizeT dim() const = 0;
|
||||||
|
virtual RangePtr range() const = 0;
|
||||||
|
virtual SizeT getStepSize(SizeT n) const = 0;
|
||||||
|
|
||||||
virtual String stringMeta() const = 0;
|
virtual String stringMeta() const = 0;
|
||||||
virtual DType meta() const = 0;
|
virtual DType meta() const = 0;
|
||||||
virtual XIndexBase& at(const DType& meta) = 0;
|
virtual XIndexBase& at(const DType& meta) = 0;
|
||||||
|
|
||||||
//virtual DExpr ifor(SizeT step, DExpr ex) const = 0;
|
//virtual DExpr ifor(SizeT step, DExpr ex) const = 0;
|
||||||
//virtual DExpr iforh(SizeT step, DExpr ex) const = 0;
|
//virtual DExpr iforh(SizeT step, DExpr ex) const = 0;
|
||||||
// ...!!!
|
// ...!!!
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//Sptr<XIndexBase>& operator++(Sptr<XIndexBase>& i);
|
||||||
|
//Sptr<XIndexBase>& operator--(Sptr<XIndexBase>& i);
|
||||||
|
|
||||||
// MultiIndex Wrapper:
|
// MultiIndex Wrapper:
|
||||||
template <class Index, typename Meta>
|
template <class Index, typename Meta>
|
||||||
class XIndex : public XIndexBase
|
class XIndex : public XIndexBase
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
IndexPtr<Index,Meta> mI;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
typedef XIndexBase XIB;
|
||||||
|
typedef XIB::IB IB;
|
||||||
|
|
||||||
DEFAULT_MEMBERS(XIndex);
|
DEFAULT_MEMBERS(XIndex);
|
||||||
XIndex(const IndexPtr<Index,Meta>& i);
|
XIndex(const IndexPtr<Index,Meta>& i);
|
||||||
XIndex(const IndexInterface<Index,Meta>& i);
|
XIndex(const IndexInterface<Index,Meta>& i);
|
||||||
|
|
||||||
virtual XIndex& operator=(SizeT pos) override;
|
virtual XIndex& operator=(SizeT pos) override final;
|
||||||
virtual XIndex& operator++() override;
|
virtual XIndex& operator++() override final;
|
||||||
virtual XIndex& operator--() override;
|
virtual XIndex& operator--() override final;
|
||||||
virtual Int pp(PtrId idxPtrNum) override;
|
virtual Sptr<XIndexBase> operator+(Int n) const override final;
|
||||||
virtual Int mm(PtrId idxPtrNum) override;
|
virtual Sptr<XIndexBase> operator-(Int n) const override final;
|
||||||
virtual SizeT dim() const override;
|
virtual XIndex& operator+=(Int n) override final;
|
||||||
virtual SizeT getStepSize(SizeT n) const override;
|
virtual XIndex& operator-=(Int n) override final;
|
||||||
virtual String stringMeta() const override;
|
|
||||||
virtual DType meta() const override;
|
virtual DType operator*() const override final;
|
||||||
virtual XIndexBase& at(const DType& meta) override;
|
virtual DType operator->() const override final;
|
||||||
//virtual DExpr ifor(SizeT step, DExpr ex) const override;
|
|
||||||
//virtual DExpr iforh(SizeT step, DExpr ex) const override;
|
virtual Int pp(PtrId idxPtrNum) override final;
|
||||||
|
virtual Int mm(PtrId idxPtrNum) override final;
|
||||||
|
|
||||||
|
virtual SizeT dim() const override final;
|
||||||
|
virtual RangePtr range() const override final;
|
||||||
|
virtual SizeT getStepSize(SizeT n) const override final;
|
||||||
|
|
||||||
|
virtual String stringMeta() const override final;
|
||||||
|
virtual DType meta() const override final;
|
||||||
|
virtual XIndexBase& at(const DType& meta) override final;
|
||||||
|
|
||||||
|
//virtual DExpr ifor(SizeT step, DExpr ex) const override final;
|
||||||
|
//virtual DExpr iforh(SizeT step, DExpr ex) const override final;
|
||||||
// ....!!!!
|
// ....!!!!
|
||||||
|
|
||||||
|
private:
|
||||||
|
IndexPtr<Index,Meta> mI;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,9 +27,40 @@ namespace {
|
||||||
TEST_F(CR_Test, Basics)
|
TEST_F(CR_Test, Basics)
|
||||||
{
|
{
|
||||||
auto cr = CRangeFactory(mSize).create();
|
auto cr = CRangeFactory(mSize).create();
|
||||||
|
auto crx = std::dynamic_pointer_cast<CRange>(cr);
|
||||||
EXPECT_EQ(cr->size(), mSize);
|
EXPECT_EQ(cr->size(), mSize);
|
||||||
|
EXPECT_EQ(crx->size(), mSize);
|
||||||
|
|
||||||
|
EXPECT_EQ(crx->begin() != crx->end(), true);
|
||||||
|
EXPECT_EQ(crx->begin().pos(), 0);
|
||||||
|
EXPECT_EQ(crx->end().pos(), mSize);
|
||||||
|
|
||||||
|
EXPECT_EQ(*cr->begin() != *cr->end(), true);
|
||||||
|
EXPECT_EQ(cr->begin()->pos(), 0);
|
||||||
|
EXPECT_EQ(cr->end()->pos(), mSize);
|
||||||
|
|
||||||
|
|
||||||
|
SizeT cnt = 0;
|
||||||
|
auto endxi = cr->end();
|
||||||
|
for(auto xi = cr->begin(); *xi != *endxi; ++(*xi)){
|
||||||
|
EXPECT_EQ(xi->pos(), cnt);
|
||||||
|
EXPECT_EQ(*(*xi), cnt);
|
||||||
|
++cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
SizeT cnt2 = 0;
|
||||||
|
for(auto x: *crx){
|
||||||
|
EXPECT_EQ(x, cnt2++);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// UR_Test
|
// UR_Test
|
||||||
// RCast_Test
|
// RCast_Test
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
::testing::InitGoogleTest(&argc, argv);
|
||||||
|
return RUN_ALL_TESTS();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue