ext -> pos, expressions...

This commit is contained in:
Christian Zimmermann 2022-09-12 16:48:45 +02:00
parent 10db0908e0
commit 796bb50118
5 changed files with 251 additions and 253 deletions

View file

@ -13,6 +13,9 @@ namespace CNORXZ
template <typename T> template <typename T>
ObjHandle<T>::ObjHandle(const T& a) : mC(std::make_unique<T>(a)) {} ObjHandle<T>::ObjHandle(const T& a) : mC(std::make_unique<T>(a)) {}
template <typename T>
ObjHandle<T>::ObjHandle(const Uptr<T>& a) : mC(a) {}
template <typename T> template <typename T>
ObjHandle<T>::ObjHandle(const ObjHandle& a) : mC(std::make_unique<T>(*a.mC)) {} ObjHandle<T>::ObjHandle(const ObjHandle& a) : mC(std::make_unique<T>(*a.mC)) {}

View file

@ -12,13 +12,14 @@ namespace CNORXZ
template <typename T> template <typename T>
class ObjHandle class ObjHandle
{ {
private: protected:
std::unique_ptr<T> mC; Uptr<T> mC;
public: public:
ObjHandle(); ObjHandle();
ObjHandle(const T& a); ObjHandle(const T& a);
ObjHandle(const Uptr<T>& a);
ObjHandle(const ObjHandle& a); ObjHandle(const ObjHandle& a);
ObjHandle(ObjHandle&& a); ObjHandle(ObjHandle&& a);
ObjHandle& operator=(const ObjHandle& a); ObjHandle& operator=(const ObjHandle& a);

View file

@ -63,6 +63,26 @@ namespace CNORXZ
template <typename T> template <typename T>
class Allocator; class Allocator;
// definition: ranges/xfor/exttype.h
class VPosBase;
// definition: ranges/xfor/exttype.h
template <class PosT>
class PosInterface;
// definition: ranges/xfor/exttype.h
class DPos;
// definition: ranges/xfor/exttype.h
class VPos;
// definition: ranges/xfor/exttype.h
template <class PosT>
class MPos;
// definition: ranges/xfor/exttype.h
class NPos;
// definition: ranges/range_base.h // definition: ranges/range_base.h
class RangeBase; class RangeBase;

View file

@ -10,126 +10,161 @@ namespace CNORXZInternal
// Dynamic Ext: ObjHandl<ExtBase> // Dynamic Ext: ObjHandl<ExtBase>
// In For Expr: try to resolve until some upper limit // In For Expr: try to resolve until some upper limit
struct None; class VPosBase
class ExtBase
{ {
public: public:
ExtBase() = default; DEFAULT_MEMBERS(VPosBase);
ExtBase(const ExtBase& in) = default;
ExtBase(ExtBase&& in) = default;
ExtBase& operator=(const ExtBase& in) = default;
ExtBase& operator=(ExtBase&& in) = default;
virtual size_t size() const = 0;
virtual const size_t& val() const = 0;
virtual bool operator==(const ExtBase& in) const = 0;
virtual bool operator==(size_t in) const = 0;
virtual std::shared_ptr<ExtBase> operator+(const ExtBase& in) const = 0;
virtual std::shared_ptr<ExtBase> operator*(size_t in) const = 0;
virtual void zero() = 0;
virtual std::shared_ptr<ExtBase> deepCopy() const = 0;
template <class ExtType>
const ExtType& expl() const;
virtual SizeT vsize() const = 0;
virtual const SizeT& vval() const = 0;
virtual VPosBase& vzero() = 0;
virtual Uptr<VPosBase> vextend(const DPos& a) const = 0;
virtual Uptr<VPosBase> vextend(const MPos<NPos>& a) const = 0;
}; };
typedef std::shared_ptr<ExtBase> DExt; template <class PosT>
class PosInterface
{
public:
DEFAULT_MEMBERS(PosInterface);
template <class ExtType> PosT& THIS() { return static_cast<PosT&>(*this); }
class ExtT : public ExtBase const PosT& THIS() const { return static_cast<const PosT&>(*this); }
inline SizeT size() const { THIS().size(); }
inline const SizeT& val() const { THIS().val(); }
inline auto next() const { THIS().next(); }
inline bool operator==(const PosInterface<PosT>& a) const { return val() == a.val() and next() == a.next(); }
inline bool operator!=(const PosInterface<PosT>& a) const { return val() != a.val() or next() != a.next(); }
inline bool operator==(SizeT a) const { return val() == a and next() == a; }
inline bool operator!=(SizeT a) const { return val() != a or next() != a; }
inline PosInterface<PosT> operator+(const PosInterface<PosT>& a) const { return PosT(val()+a.val(), next()+a.next()); }
inline PosInterface<PosT> operator*(SizeT a) const { return PosT(val()*a, next()*a); }
inline PosInterface<PosT>& zero() { return THIS().zero(); }
template <class P>
inline auto extend(const PosInterface<P>& a) const { return THIS().extend(a); }
};
class DPos : public ObjHandle<VPosBase>,
public PosInterface<DPos>
{
public:
DEFAULT_MEMBERS(DPos);
DPos(Uptr<VPosBase> a) : ObjHandle<VPosBase>(a) {}
template <class PosT>
DPos(const PosT& a) : ObjHandle<VPosBase>( std::make_unique<PosT>(a) ) {}
inline SizeT size() const { return mC->vsize(); }
inline const SizeT& val() const { return mC->vval(); }
inline DPos& zero() { mC->vzero(); return *this; }
template <class P>
inline DPos extend(const PosInterface<P>& a) const
{ /* append MPos<NPos> in static for loop over entries */ }
};
/*
template <class PosT>
class VPos : public VPosBase
{ {
private: private:
ExtType mExt; PosT mExt;
public: public:
static constexpr size_t SIZE = ExtType::SIZE;
static constexpr size_t NUM = ExtType::NUM;
ExtT() = default; DEFAULT_MEMBERS(VPos);
ExtT(const ExtT& in) = default;
ExtT(ExtT&& in) = default;
ExtT& operator=(const ExtT& in) = default;
ExtT& operator=(ExtT&& in) = default;
ExtT(const ExtType& in) : mExt(in) {} VPos(const PosT& in) : mExt(in) {}
virtual std::shared_ptr<ExtBase> deepCopy() const override final { return std::make_shared<ExtT<ExtType>>(mExt); } virtual SizeT size() const override final { return sizeof(PosT)/sizeof(size_t); }
//const PosT& ext() const { return mExt; }
virtual size_t size() const override final { return sizeof(ExtType)/sizeof(size_t); } virtual const SizeT& val() const override final { return mExt.val(); }
const ExtType& ext() const { return mExt; }
virtual const size_t& val() const override final { return mExt.val(); }
virtual void zero() override final { mExt.zero(); } virtual void zero() override final { mExt.zero(); }
virtual bool operator==(const ExtBase& in) const override final virtual bool operator==(const VPosBase& in) const override final
{ return mExt == dynamic_cast<const ExtT<ExtType>&>(in).mExt; } { return mExt == dynamic_cast<const VPos<PosT>&>(in).mExt; }
virtual bool operator==(size_t in) const override final virtual bool operator==(SizeT in) const override final
{ return mExt == in; } { return mExt == in; }
virtual DExt operator+(const ExtBase& in) const override final virtual DExt operator+(const VPosBase& in) const override final
{ return std::make_shared<ExtT<ExtType>>( mExt + dynamic_cast<const ExtT<ExtType>&>(in).mExt ); } { return std::make_shared<VPos<PosT>>( mExt + dynamic_cast<const VPos<PosT>&>(in).mExt ); }
virtual DExt operator*(size_t in) const override final virtual DExt operator*(size_t in) const override final
{ return std::make_shared<ExtT<ExtType>>( mExt * in ); } { return std::make_shared<VPos<PosT>>( mExt * in ); }
};
*/
template <class PosT>
class VPos : public VPosBase, public PosT
{
public:
DEFAULT_MEMBERS(VPos);
VPos(const PosInterface<PosT>& a) : PosT(a.THIS()) {}
virtual SizeT vsize() const override final { return THIS().size(); }
virtual const SizeT& vval() const override final { return THIS().val(); }
virtual VPos& vzero() override final { THIS().zero(); return *this; }
virtual Uptr<VPosBase> vextend(const DPos& a) const override final
{ return std::make_unique<VPosBase>( THIS().extend(a) ); }
virtual Uptr<VPosBase> vextend(const MPos<NPos>& a) const override final
{ return std::make_unique<VPosBase>( THIS().extend(a) ); } // ??? if that works it would be a miracle ???
// .... probably I need to define a static instanciation limit...
}; };
template <class ExtType> template <class PosT>
DExt mkDExt(const ExtT<ExtType>& in) DPos mkDExt(const VPos<PosT>& in)
{ {
return std::make_shared<ExtT<ExtType>>(in); return std::make_shared<VPos<PosT>>(in);
} }
template <class ExtType> template <class PosT>
ExtT<ExtType> mkExtT(const ExtType& in) VPos<PosT> mkVPos(const PosT& in)
{ {
return ExtT<ExtType>(in); return VPos<PosT>(in);
} }
template <class X> template <class PosT>
class MExt class MPos
{ {
private: private:
size_t mExt = 0u; SizeT mExt = 0u;
X mNext; PosT mNext;
public: public:
static constexpr size_t NUM = X::SIZE; //static constexpr SizeT NUM = PosT::SIZE;
static constexpr size_t SIZE = NUM + 1; //static constexpr SizeT SIZE = NUM + 1;
MExt() = default; DEFAULT_MEMBERS(MPos);
MExt(const MExt& in) = default;
MExt& operator=(const MExt& in) = default;
MExt(MExt&& in) = default;
MExt& operator=(MExt&& in) = default;
inline MExt(size_t ext, X next); inline MPos(SizeT ext, PosT next);
template <class Z> template <class Z>
inline MExt(size_t y, const Z& z); inline MPos(SizeT y, const Z& z);
template <class Y, class Z> template <class Y, class Z>
inline MExt(const Y& y, const Z& z); inline MPos(const Y& y, const Z& z);
template <size_t N> template <size_t N>
inline MExt(const std::array<size_t,N>& arr); inline MPos(const Arr<SizeT,N>& arr);
template <class Y> template <class Y>
inline MExt(const MExt<Y>& y); inline MPos(const MPos<Y>& y);
inline void zero(); inline void zero();
inline const size_t& val() const; inline const SizeT& val() const;
inline const X& next() const; inline const PosT& next() const;
template <size_t N> template <size_t N>
inline auto nn() const; inline auto nn() const;
inline bool operator==(const MExt& in) const inline bool operator==(const MPos& in) const
{ {
return mExt == in.mExt and mNext == in.mNext; return mExt == in.mExt and mNext == in.mNext;
} }
@ -139,89 +174,71 @@ namespace CNORXZInternal
return mExt == in and mNext == in; return mExt == in and mNext == in;
} }
inline MExt operator+(const MExt& in) const; inline MPos operator+(const MPos& in) const;
inline MExt operator+(const None& in) const; inline MPos operator+(const NPos& in) const;
inline MExt operator*(size_t in) const; inline MPos operator*(size_t in) const;
template <class Y> template <class Y>
auto extend(const Y& y) const -> MExt<decltype(mNext.extend(y))> auto extend(const Y& y) const -> MPos<decltype(mNext.extend(y))>
{ return MExt<decltype(mNext.extend(y))>(mExt, mNext.extend(y)); } { return MPos<decltype(mNext.extend(y))>(mExt, mNext.extend(y)); }
std::string stype() const { return std::string("E[") + mNext.stype() + "]"; }
}; };
struct None class NPos : public PosInterface<NPos>
{ {
size_t VAL = 0; private:
None() = default; SizeT VAL = 0;
None(const None& in) = default; public:
None(None&& in) = default;
None& operator=(const None& in) = default; DEFAULT_MEMBERS(NPos);
None& operator=(None&& in) = default;
template <class Y> template <class Y>
None(const Y& y) {} NPos(const Y& y) {}
static constexpr size_t SIZE = 0; //static constexpr SizeT SIZE = 0;
inline bool operator==(const None& in) const inline const SizeT& val() const { assert(0); return VAL; }
{ inline bool operator==(const NPos& in) const { return true; }
return true; inline bool operator==(SizeT in) const { return true; }
} inline NPos operator+(const NPos& in) const { return NPos(); }
inline NPos operator*(size_t in) const { return NPos(); }
inline bool operator==(size_t in) const
{
return true; // CHECK!!!
}
inline None operator+(const None& in) const { return None(); }
inline None operator*(size_t in) const { return None(); }
inline const size_t& val() const { assert(0); return VAL; }
inline void zero() {} inline void zero() {}
template <class Y> template <class Y>
Y extend(const Y& y) const Y extend(const Y& y) const
{ return y; } { return y; }
std::string stype() const { return std::string("N"); }
}; };
template <> template <>
class MExt<None> class MPos<NPos> : public PosInterface<MPos<NPos>>
{ {
private: private:
SizeT mExt = 0u;
size_t mExt = 0u;
public: public:
//static constexpr size_t NUM = 0;
//static constexpr size_t SIZE = NUM + 1;
static constexpr size_t NUM = 0; DEFAULT_MEMBERS(MPos);
static constexpr size_t SIZE = NUM + 1;
MExt() = default; inline MPos(size_t ext);
MExt(const MExt& in) = default;
MExt& operator=(const MExt& in) = default;
MExt(MExt&& in) = default;
MExt& operator=(MExt&& in) = default;
inline MExt(size_t ext); inline MPos(size_t y, const NPos& z) : mExt(y) {}
inline MExt(size_t y, const None& z) : mExt(y) {}
template <class Z> template <class Z>
inline MExt(size_t y, const Z& z); inline MPos(size_t y, const Z& z);
template <class Y, class Z> template <class Y, class Z>
inline MExt(const Y& y, const Z& z); inline MPos(const Y& y, const Z& z);
template <size_t N> template <size_t N>
inline MExt(const std::array<size_t,N>& arr); inline MPos(const std::array<size_t,N>& arr);
template <class Y> template <class Y>
inline MExt(const MExt<Y>& y); inline MPos(const MPos<Y>& y);
inline bool operator==(const MExt& in) const inline bool operator==(const MPos& in) const
{ {
return mExt == in.mExt; return mExt == in.mExt;
} }
@ -232,94 +249,28 @@ namespace CNORXZInternal
} }
inline const size_t& val() const; inline const size_t& val() const;
inline None next() const { return None(); } inline NPos next() const { return NPos(); }
inline void zero(); inline void zero();
template <size_t N> template <size_t N>
inline auto nn() const; inline auto nn() const;
inline MExt operator+(const MExt& in) const; inline MPos operator+(const MPos& in) const;
inline MExt operator+(const None& in) const; inline MPos operator+(const NPos& in) const;
inline MExt operator*(size_t in) const; inline MPos operator*(size_t in) const;
template <class Y> template <class Y>
auto extend(const Y& y) const -> MExt<Y> auto extend(const Y& y) const -> MPos<Y>
{ return MExt<Y>(mExt,y); } { return MPos<Y>(mExt,y); }
std::string stype() const { return std::string("E[N]"); }
}; };
template <class X> inline MPos<NPos> mkExt(SizeT s) { return MPos<NPos>(s); }
class DExtTX
{
private:
mutable DExt mDExt;
X mNext;
template <class Y>
friend class DExtTX;
public:
static constexpr size_t NUM = X::SIZE;
static constexpr size_t SIZE = NUM + 1;
DExtTX() { mDExt = std::make_shared<ExtT<None>>(); }
DExtTX(const DExtTX& in) : mNext(in.mNext)
{ mDExt = in.mDExt->deepCopy(); }
DExtTX(DExtTX&& in) : mNext(in.mNext)
{ mDExt = in.mDExt->deepCopy(); }
DExtTX& operator=(const DExtTX& in) { mNext = in.mNext; mDExt = in.mDExt->deepCopy(); return *this; }
DExtTX& operator=(DExtTX&& in) { mNext = in.mNext; mDExt = in.mDExt->deepCopy(); return *this; }
explicit DExtTX(const DExt& in) : mDExt(in) {}
bool operator==(const DExtTX& in) const
{ return *mDExt == *in.mDExt and mNext == in.mNext; }
bool operator==(size_t in) const
{ return *mDExt == in and mNext == in; }
template <class Y>
DExtTX(const DExtTX<Y>& in) : mDExt(in.mDExt), mNext(in.mNext) {}
DExtTX(const DExt& y, const X& x) : mDExt(y->deepCopy()),
mNext(x) {}
virtual size_t size() const { return mDExt->size(); }
inline const DExt& get() const { return mDExt; }
inline DExtTX<None> reduce() const { return DExtTX<None>(mDExt,None(0)); }
inline DExtTX operator+(const DExtTX& in) const
{ if (not mDExt) return in; else return DExtTX( (*mDExt) + (*in.mDExt), mNext + in.mNext ); }
inline DExtTX operator*(size_t in) const
{ if (not mDExt) return *this; else return DExtTX((*mDExt) * in, mNext * in); }
template <class ExtType>
inline const ExtType& expl() const
{ if(mDExt == nullptr) mDExt = std::make_shared<ExtT<ExtType>>(); assert(mDExt != nullptr); return mDExt->expl<ExtType>(); }
template <class Y>
inline auto extend(const Y& y) const -> DExtTX<decltype(mNext.extend(y))>
{ return DExtTX<decltype(mNext.extend(y))>(mDExt, mNext.extend(y)); }
inline const size_t& val() const { return mDExt->val(); }
inline const X& next() const { return mNext; }
inline void zero() { mDExt->zero(); }
template <size_t N>
inline auto nn() const;
};
typedef DExtTX<None> DExtT;
inline MExt<None> mkExt(size_t s) { return MExt<None>(s); }
template <size_t I, class X> template <size_t I, class X>
auto getX(const MExt<X>& et) auto getX(const MPos<X>& et)
{ {
if constexpr(I == 0){ if constexpr(I == 0){
return et; return et;
@ -330,7 +281,7 @@ namespace CNORXZInternal
} }
template <size_t I, class X> template <size_t I, class X>
auto getX(const DExtTX<X>& et) auto getX(const DVPosX<X>& et)
{ {
if constexpr(I == 0){ if constexpr(I == 0){
return et; return et;
@ -341,26 +292,26 @@ namespace CNORXZInternal
} }
template <size_t I> template <size_t I>
auto getX(const None& et) auto getX(const NPos& et)
{ {
static_assert(I == 0); static_assert(I == 0);
return et; return et;
} }
template <size_t I, class X> template <size_t I, class X>
size_t get(const MExt<X>& et) size_t get(const MPos<X>& et)
{ {
return getX<I>(et).get(); return getX<I>(et).get();
} }
template <size_t I, class X> template <size_t I, class X>
size_t get(const DExtTX<X>& et) size_t get(const DVPosX<X>& et)
{ {
return getX<I>(et).get(); return getX<I>(et).get();
} }
template <size_t I> template <size_t I>
size_t get(const None& et) size_t get(const NPos& et)
{ {
return getX<I>(et).get(); return getX<I>(et).get();
} }
@ -375,42 +326,42 @@ namespace CNORXZInternal
{ {
template <class X> template <class X>
inline MExt<X>::MExt(size_t ext, X next) : mExt(ext), mNext(next) {} inline MPos<X>::MPos(size_t ext, X next) : mExt(ext), mNext(next) {}
template <class X> template <class X>
template <size_t N> template <size_t N>
inline MExt<X>::MExt(const std::array<size_t,N>& arr) : inline MPos<X>::MPos(const std::array<size_t,N>& arr) :
mExt(std::get<NUM>(arr)), mNext(arr) {} mExt(std::get<NUM>(arr)), mNext(arr) {}
template <class X> template <class X>
template <class Z> template <class Z>
inline MExt<X>::MExt(size_t y, const Z& z) : inline MPos<X>::MPos(size_t y, const Z& z) :
mExt(z.val()), mNext(z.val(), z.next()) {} mExt(z.val()), mNext(z.val(), z.next()) {}
template <class X> template <class X>
template <class Y, class Z> template <class Y, class Z>
inline MExt<X>::MExt(const Y& y, const Z& z) : inline MPos<X>::MPos(const Y& y, const Z& z) :
mExt(y.val()), mNext(y.next(), z) {} mExt(y.val()), mNext(y.next(), z) {}
template <class X> template <class X>
template <class Y> template <class Y>
inline MExt<X>::MExt(const MExt<Y>& y) : inline MPos<X>::MPos(const MPos<Y>& y) :
mExt(y.val()), mNext(y.next()) {} mExt(y.val()), mNext(y.next()) {}
template <class X> template <class X>
inline const size_t& MExt<X>::val() const inline const size_t& MPos<X>::val() const
{ {
return mExt; return mExt;
} }
template <class X> template <class X>
inline const X& MExt<X>::next() const inline const X& MPos<X>::next() const
{ {
return mNext; return mNext;
} }
template <class X> template <class X>
inline void MExt<X>::zero() inline void MPos<X>::zero()
{ {
mExt = 0u; mExt = 0u;
mNext.zero(); mNext.zero();
@ -418,91 +369,91 @@ namespace CNORXZInternal
template <class X> template <class X>
template <size_t N> template <size_t N>
inline auto MExt<X>::nn() const inline auto MPos<X>::nn() const
{ {
return getX<N>(*this); return getX<N>(*this);
} }
template <class X> template <class X>
inline MExt<X> MExt<X>::operator+(const MExt<X>& in) const inline MPos<X> MPos<X>::operator+(const MPos<X>& in) const
{ {
return MExt<X>(mExt + in.val(), mNext + in.next()); return MPos<X>(mExt + in.val(), mNext + in.next());
} }
template <class X> template <class X>
inline MExt<X> MExt<X>::operator+(const None& in) const inline MPos<X> MPos<X>::operator+(const NPos& in) const
{ {
return *this; return *this;
} }
template <class X> template <class X>
inline MExt<X> MExt<X>::operator*(size_t in) const inline MPos<X> MPos<X>::operator*(size_t in) const
{ {
return MExt<X>(mExt * in, mNext * in); return MPos<X>(mExt * in, mNext * in);
} }
//template <> //template <>
inline MExt<None>::MExt(size_t ext) : mExt(ext) {} inline MPos<NPos>::MPos(size_t ext) : mExt(ext) {}
//template <> //template <>
template <class Z> template <class Z>
inline MExt<None>::MExt(size_t y, const Z& z) : inline MPos<NPos>::MPos(size_t y, const Z& z) :
mExt(z.val()) {} mExt(z.val()) {}
//template <> //template <>
template <class Y, class Z> template <class Y, class Z>
inline MExt<None>::MExt(const Y& y, const Z& z) : inline MPos<NPos>::MPos(const Y& y, const Z& z) :
mExt(y.val()) {} mExt(y.val()) {}
//template <> //template <>
template <size_t N> template <size_t N>
inline MExt<None>::MExt(const std::array<size_t,N>& arr) : inline MPos<NPos>::MPos(const std::array<size_t,N>& arr) :
mExt(std::get<NUM>(arr)) {} mExt(std::get<NUM>(arr)) {}
template <class Y> template <class Y>
inline MExt<None>::MExt(const MExt<Y>& y) : inline MPos<NPos>::MPos(const MPos<Y>& y) :
mExt(y.val()) {} mExt(y.val()) {}
//template <> //template <>
inline void MExt<None>::zero() inline void MPos<NPos>::zero()
{ {
mExt = 0u; mExt = 0u;
} }
template <size_t N> template <size_t N>
inline auto MExt<None>::nn() const inline auto MPos<NPos>::nn() const
{ {
return getX<N>(*this); return getX<N>(*this);
} }
inline const size_t& MExt<None>::val() const inline const size_t& MPos<NPos>::val() const
{ {
return mExt; return mExt;
} }
//template <> //template <>
inline MExt<None> MExt<None>::operator+(const MExt<None>& in) const inline MPos<NPos> MPos<NPos>::operator+(const MPos<NPos>& in) const
{ {
return MExt<None>(mExt + in.val()); return MPos<NPos>(mExt + in.val());
} }
inline MExt<None> MExt<None>::operator+(const None& in) const inline MPos<NPos> MPos<NPos>::operator+(const NPos& in) const
{ {
return *this; return *this;
} }
//template <> //template <>
inline MExt<None> MExt<None>::operator*(size_t in) const inline MPos<NPos> MPos<NPos>::operator*(size_t in) const
{ {
return MExt<None>(mExt * in); return MPos<NPos>(mExt * in);
} }
template <class X> template <class X>
template <size_t N> template <size_t N>
inline auto DExtTX<X>::nn() const inline auto DVPosX<X>::nn() const
{ {
return getX<N>(*this); return getX<N>(*this);
} }

View file

@ -14,39 +14,62 @@ namespace CNORXZ
// 'HIDDEN FOR' CLASS for nested for loops in contractions a.s.o. // 'HIDDEN FOR' CLASS for nested for loops in contractions a.s.o.
// (NO COUNTING OF MASTER POSITION !!!!!) // (NO COUNTING OF MASTER POSITION !!!!!)
template <class Expr, class Pos> template <class Xpr, class PosT>
class ExpressionInterface class ExprInterface
{ {
public: public:
DEFAULT_MEMBERS(ExpressionInterface); DEFAULT_MEMBERS(ExprInterface);
Expr& THIS() { return static_cast<Expr&>(*this); } Xpr& THIS() { return static_cast<Xpr&>(*this); }
const Expr& THIS() const { return static_cast<const Expr&>(*this); } const Xpr& THIS() const { return static_cast<const Expr&>(*this); }
Sptr<Expr> copy() const { THIS().copy(); } //Sptr<Expr> copy() const { THIS().copy(); }
void operator(SizeT mlast, Pos last) { THIS()(mlast, last); } void operator()(SizeT mlast, PosT last) { THIS()(mlast, last); }
void operator(SizeT mlast = 0) { THIS()(mlast); } void operator()(SizeT mlast = 0) { THIS()(mlast); }
Pos rootSteps(PtrId ptrId = 0) const { return THIS().rootSteps(ptrId); } PosT rootSteps(PtrId ptrId = 0) const { return THIS().rootSteps(ptrId); }
Pos extension() const { return THIS().extenrion(); } PosT extension() const { return THIS().extenrion(); }
}; };
class XprBase : public ExpressionInterface<XprBase,Dext> class VExprBase
{ {
public: public:
DEFAULT_MEMBERS(VExprBase);
DEFAULT_MEMBERS(XprBase); virtual void vexec(SizeT mlast, PosT last) = 0;
virtual void vexec(SizeT mlast) = 0;
virtual Sptr<XprBase> copy() const = 0; virtual DPos vrootSteps(PtrId ptrId) const = 0;
virtual DPos vextension() const = 0;
virtual void operator()(SizeT mlast, DExt last) = 0;
virtual void operator()(SizeT mlast) = 0;
virtual DExt rootSteps(PtrId iPtrNum = 0) const = 0;
virtual DExt extension() const = 0;
}; };
template <class Xpr>
class VExpr : public VExprBase, public Xpr
{
public:
DEFAULT_MEMBERS(VExpr);
VExpr(const ExprInterface<Xpr>& a) : Xpr(a.THIS()) {}
virtual void vexec(SizeT mlast, PosT last) override final { THIS()(mlast,last); }
virtual void vexec(SizeT mlast) override final { THIS()(mlast); }
virtual DPos vrootSteps(PtrId ptrId) const override final { return THIS().rootSteps(ptrId); }
virtual DPos vextension() const override final { return THIS().extension(); }
};
class DExpr : public ObjHandle<VExprBase>,
public ExprInterface<DExpr>
{
public:
DEFAULT_MEMBERS(DExpr);
inline void operator()(SizeT mlast, DPos last) { mC->vexec(mlast, last); }
inline void operator()(SizeT mlast) { mC->vexec(mlast); }
inline DPos rootSteps(PtrId ptrId) const { return mC->vrootSteps(ptrId); }
inline DPos extension() const { return mC->vextension(); }
};
template <ForType FT = ForType::DEFAULT> template <ForType FT = ForType::DEFAULT>
struct PosForward struct PosForward
@ -100,7 +123,7 @@ namespace CNORXZ
static constexpr size_t LAYER = Expr::LAYER + 1; static constexpr size_t LAYER = Expr::LAYER + 1;
static constexpr size_t SIZE = Expr::SIZE + 1; static constexpr size_t SIZE = Expr::SIZE + 1;
static constexpr size_t NHLAYER = Expr::NHLAYER + 1; //static constexpr size_t NHLAYER = Expr::NHLAYER + 1;
DEFAULT_MEMBERS_X(SubExpr); DEFAULT_MEMBERS_X(SubExpr);
@ -121,7 +144,7 @@ namespace CNORXZ
auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType; auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType;
auto extension() const -> ExtType; auto extension() const -> ExtType;
}; };
/*
template <ForType FT, size_t LAYER> template <ForType FT, size_t LAYER>
struct NHLayer struct NHLayer
{ {
@ -151,7 +174,7 @@ namespace CNORXZ
return Expr::LAYER; return Expr::LAYER;
} }
}; };
*/
template <class IndexClass, class Expr, ForType FT, size_t DIV> template <class IndexClass, class Expr, ForType FT, size_t DIV>
class For : public ExpressionBase class For : public ExpressionBase
{ {
@ -175,8 +198,8 @@ namespace CNORXZ
static constexpr size_t LAYER = Expr::LAYER + 1; static constexpr size_t LAYER = Expr::LAYER + 1;
static constexpr size_t SIZE = Expr::SIZE; static constexpr size_t SIZE = Expr::SIZE;
static constexpr size_t MAX = RangeType::SIZE / DIV; //static constexpr size_t MAX = RangeType::SIZE / DIV;
static constexpr size_t NHLAYER = (FT == ForType::HIDDEN) ? 0 : Expr::NHLAYER + 1; //static constexpr size_t NHLAYER = (FT == ForType::HIDDEN) ? 0 : Expr::NHLAYER + 1;
DEFAULT_MEMBERS(For); DEFAULT_MEMBERS(For);