EIndex: new inheritance structure: SIndex<S> -> LIndex<SIndex<S>,L> -> EIndex<S,L>
This commit is contained in:
parent
52517675a5
commit
ba02601b97
5 changed files with 100 additions and 29 deletions
|
@ -3,23 +3,47 @@
|
||||||
#define __cxz_eindex_cc_h__
|
#define __cxz_eindex_cc_h__
|
||||||
|
|
||||||
#include "eindex.h"
|
#include "eindex.h"
|
||||||
|
#include "lindex.h"
|
||||||
|
#include "srange.h"
|
||||||
|
|
||||||
namespace CNORXZ
|
namespace CNORXZ
|
||||||
{
|
{
|
||||||
|
|
||||||
template <typename MetaT, SizeT S>
|
template <typename MetaT, SizeT S, SizeT L>
|
||||||
EIndex<MetaT,S>::EIndex(const SIndex<MetaT,S>& i) :
|
EIndex<MetaT,S,L>::EIndex(const Sptr<LIndex<SIndex<MetaT,S>,L>>& i) :
|
||||||
SIndex<MetaT,S>(i) {}
|
LIndex<SIndex<MetaT,S>,L>(*i),
|
||||||
|
mLI(i)
|
||||||
|
{}
|
||||||
|
|
||||||
template <typename MetaT, SizeT S>
|
template <typename MetaT, SizeT S, SizeT L>
|
||||||
EIndex<MetaT,S>::EIndex(SIndex<MetaT,S>&& i) :
|
|
||||||
SIndex<MetaT,S>(i) {}
|
|
||||||
|
|
||||||
template <typename MetaT, SizeT S>
|
|
||||||
template <class Xpr, class F>
|
template <class Xpr, class F>
|
||||||
decltype(auto) EIndex<MetaT,S>::ifor(const Xpr& xpr, F&& f) const
|
decltype(auto) EIndex<MetaT,S,L>::ifor(const Xpr& xpr, F&& f) const
|
||||||
{
|
{
|
||||||
return EFor<S,0,Xpr>(this->id(), xpr, std::forward<F>(f));
|
return EFor<S,L,Xpr>(mLI->id(), xpr, std::forward<F>(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S, SizeT L, class I1>
|
||||||
|
decltype(auto) operator*(const Sptr<EIndex<MetaT,S,L>>& a, const Sptr<I1>& b)
|
||||||
|
{
|
||||||
|
return iptrMul(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename MetaT, SizeT S, SizeT L>
|
||||||
|
decltype(auto) eindexPtr(const Sptr<LIndex<SIndex<MetaT,S>,L>>& i)
|
||||||
|
{
|
||||||
|
return std::make_shared<EIndex<MetaT,S>>(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <SizeT L, typename MetaType, SizeT S>
|
||||||
|
decltype(auto) eindexPtr(const Sptr<SIndex<MetaT,S>,L>& i)
|
||||||
|
{
|
||||||
|
return eindexPtr( lindexPtr<L>( i ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S, SizeT L>
|
||||||
|
decltype(auto) eindexPtr(const Sptr<SIndex<MetaT,S>,L>& i, CSizeT<L> l)
|
||||||
|
{
|
||||||
|
return eindexPtr<l>( i );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,21 +9,37 @@
|
||||||
|
|
||||||
namespace CNORXZ
|
namespace CNORXZ
|
||||||
{
|
{
|
||||||
template <typename MetaT, SizeT S>
|
|
||||||
class EIndex : public SIndex<MetaT,S>
|
template <typename MetaT, SizeT S, SizeT L>
|
||||||
|
class EIndex : public LIndex<SIndex<MetaT,S>,L>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef typename SIndex<MetaT,S>::IB IB;
|
typedef typename LIndex<SIndex<MetaT,S>,L>::IB IB;
|
||||||
typedef typename SIndex<MetaT,S>::RangeType RangeType;
|
typedef typename LIndex<SIndex<MetaT,S>,L>::RangeType RangeType;
|
||||||
|
|
||||||
DEFAULT_MEMBERS(EIndex);
|
DEFAULT_MEMBERS(EIndex);
|
||||||
EIndex(const SIndex<MetaT,S>& i);
|
EIndex(const LIndex<SIndex<MetaT,S>,L>& i);
|
||||||
EIndex(SIndex<MetaT,S>&& i);
|
EIndex(LIndex<SIndex<MetaT,S>,L>&& i);
|
||||||
|
|
||||||
template <class Xpr, class F>
|
template <class Xpr, class F>
|
||||||
decltype(auto) ifor(const Xpr& xpr, F&& f) const;
|
decltype(auto) ifor(const Xpr& xpr, F&& f) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Sptr<LIndex<SIndex<MetaT,S>,L>> mLI;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S, SizeT L, class I1>
|
||||||
|
decltype(auto) operator*(const Sptr<EIndex<MetaType,S>>& a, const Sptr<I1>& b);
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S, SizeT L>
|
||||||
|
decltype(auto) eindexPtr(const Sptr<LIndex<SIndex<MetaT,S>,L>>& i);
|
||||||
|
|
||||||
|
template <SizeT L, typename MetaType, SizeT S>
|
||||||
|
decltype(auto) eindexPtr(const Sptr<SIndex<MetaT,S>,L>& i);
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S, SizeT L>
|
||||||
|
decltype(auto) eindexPtr(const Sptr<SIndex<MetaT,S>,L>& i, CSizeT<L> l);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -7,17 +7,15 @@
|
||||||
namespace CNORXZ
|
namespace CNORXZ
|
||||||
{
|
{
|
||||||
template <class Index, SizeT L>
|
template <class Index, SizeT L>
|
||||||
LIndex<Index,L>::LIndex(const Index& i) :
|
LIndex<Index,L>::LIndex(const Sptr<Index>& i) :
|
||||||
Index(i) {}
|
Index(*i),
|
||||||
|
mI(i)
|
||||||
template <class Index, SizeT L>
|
{}
|
||||||
LIndex<Index,L>::LIndex(Index&& i) :
|
|
||||||
Index(i) {}
|
|
||||||
|
|
||||||
template <class Index, SizeT L>
|
template <class Index, SizeT L>
|
||||||
IndexId<L> LIndex<Index,L>::id() const
|
IndexId<L> LIndex<Index,L>::id() const
|
||||||
{
|
{
|
||||||
return IndexId<L>(this->ptrId());
|
return IndexId<L>(mI->ptrId());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Index, SizeT L>
|
template <class Index, SizeT L>
|
||||||
|
@ -25,13 +23,35 @@ namespace CNORXZ
|
||||||
decltype(auto) LIndex<Index,L>::stepSize(const IndexId<I>& id) const
|
decltype(auto) LIndex<Index,L>::stepSize(const IndexId<I>& id) const
|
||||||
{
|
{
|
||||||
if constexpr(L == 0 or I == 0){
|
if constexpr(L == 0 or I == 0){
|
||||||
return UPos(this->id() == id ? 1 : 0);
|
return UPos(mI->id() == id ? 1 : 0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return this->id() == id ? SPos<1>() : SPos<0>();
|
if constexpr(L == I) {
|
||||||
|
return SPos<1>();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return SPos<0>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class Index, SizeT L, class I1>
|
||||||
|
decltype(auto) operator*(const Sptr<LIndex<Index,L>>& a, const Sptr<I1>& b)
|
||||||
|
{
|
||||||
|
return iptrMul(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <SizeT L, class Index>
|
||||||
|
decltype(auto) lindexPtr(const Sptr<Index>& i)
|
||||||
|
{
|
||||||
|
return LIndex<Index,L>( i );
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Index, SizeT L>
|
||||||
|
decltype(auto) lindexPtr(const Sptr<Index>& i, CSizeT<L> l)
|
||||||
|
{
|
||||||
|
return lindexPtr<l>( i );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,15 +18,26 @@ namespace CNORXZ
|
||||||
typedef typename Index::RangeType RangeType;
|
typedef typename Index::RangeType RangeType;
|
||||||
|
|
||||||
DEFAULT_MEMBERS(LIndex);
|
DEFAULT_MEMBERS(LIndex);
|
||||||
LIndex(const Index& i);
|
LIndex(const Sptr<Index>& i);
|
||||||
LIndex(Index&& i);
|
|
||||||
|
|
||||||
IndexId<L> id() const;
|
IndexId<L> id() const;
|
||||||
|
|
||||||
template <SizeT I>
|
template <SizeT I>
|
||||||
decltype(auto) stepSize(const IndexId<I>& id) const;
|
decltype(auto) stepSize(const IndexId<I>& id) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Sptr<Index> mI;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <class Index, SizeT L, class I1>
|
||||||
|
decltype(auto) operator*(const Sptr<LIndex<Index,L>>& a, const Sptr<I1>& b);
|
||||||
|
|
||||||
|
template <SizeT L, class Index>
|
||||||
|
decltype(auto) lindexPtr(const Sptr<Index>& i);
|
||||||
|
|
||||||
|
template <class Index, SizeT L>
|
||||||
|
decltype(auto) lindexPtr(const Sptr<Index>& i, CSizeT<L> l);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -393,7 +393,7 @@ namespace CNORXZ
|
||||||
constexpr EFor<N,L,Xpr,F>::EFor(const IndexId<L>& id, const Xpr& xpr, F&& f) :
|
constexpr EFor<N,L,Xpr,F>::EFor(const IndexId<L>& id, const Xpr& xpr, F&& f) :
|
||||||
mId(id),
|
mId(id),
|
||||||
mXpr(xpr),
|
mXpr(xpr),
|
||||||
mExt(mXpr.RootSteps(mId)),
|
mExt(mXpr.rootSteps(mId)),
|
||||||
mF(std::forward<F>(f))
|
mF(std::forward<F>(f))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue