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__
|
||||
|
||||
#include "eindex.h"
|
||||
#include "lindex.h"
|
||||
#include "srange.h"
|
||||
|
||||
namespace CNORXZ
|
||||
{
|
||||
|
||||
template <typename MetaT, SizeT S>
|
||||
EIndex<MetaT,S>::EIndex(const SIndex<MetaT,S>& i) :
|
||||
SIndex<MetaT,S>(i) {}
|
||||
template <typename MetaT, SizeT S, SizeT L>
|
||||
EIndex<MetaT,S,L>::EIndex(const Sptr<LIndex<SIndex<MetaT,S>,L>>& i) :
|
||||
LIndex<SIndex<MetaT,S>,L>(*i),
|
||||
mLI(i)
|
||||
{}
|
||||
|
||||
template <typename MetaT, SizeT S>
|
||||
EIndex<MetaT,S>::EIndex(SIndex<MetaT,S>&& i) :
|
||||
SIndex<MetaT,S>(i) {}
|
||||
|
||||
template <typename MetaT, SizeT S>
|
||||
template <typename MetaT, SizeT S, SizeT L>
|
||||
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
|
||||
{
|
||||
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:
|
||||
typedef typename SIndex<MetaT,S>::IB IB;
|
||||
typedef typename SIndex<MetaT,S>::RangeType RangeType;
|
||||
typedef typename LIndex<SIndex<MetaT,S>,L>::IB IB;
|
||||
typedef typename LIndex<SIndex<MetaT,S>,L>::RangeType RangeType;
|
||||
|
||||
DEFAULT_MEMBERS(EIndex);
|
||||
EIndex(const SIndex<MetaT,S>& i);
|
||||
EIndex(SIndex<MetaT,S>&& i);
|
||||
EIndex(const LIndex<SIndex<MetaT,S>,L>& i);
|
||||
EIndex(LIndex<SIndex<MetaT,S>,L>&& i);
|
||||
|
||||
template <class Xpr, class F>
|
||||
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
|
||||
|
|
|
@ -7,17 +7,15 @@
|
|||
namespace CNORXZ
|
||||
{
|
||||
template <class Index, SizeT L>
|
||||
LIndex<Index,L>::LIndex(const Index& i) :
|
||||
Index(i) {}
|
||||
|
||||
template <class Index, SizeT L>
|
||||
LIndex<Index,L>::LIndex(Index&& i) :
|
||||
Index(i) {}
|
||||
LIndex<Index,L>::LIndex(const Sptr<Index>& i) :
|
||||
Index(*i),
|
||||
mI(i)
|
||||
{}
|
||||
|
||||
template <class Index, SizeT L>
|
||||
IndexId<L> LIndex<Index,L>::id() const
|
||||
{
|
||||
return IndexId<L>(this->ptrId());
|
||||
return IndexId<L>(mI->ptrId());
|
||||
}
|
||||
|
||||
template <class Index, SizeT L>
|
||||
|
@ -25,13 +23,35 @@ namespace CNORXZ
|
|||
decltype(auto) LIndex<Index,L>::stepSize(const IndexId<I>& id) const
|
||||
{
|
||||
if constexpr(L == 0 or I == 0){
|
||||
return UPos(this->id() == id ? 1 : 0);
|
||||
return UPos(mI->id() == id ? 1 : 0);
|
||||
}
|
||||
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
|
||||
|
|
|
@ -18,15 +18,26 @@ namespace CNORXZ
|
|||
typedef typename Index::RangeType RangeType;
|
||||
|
||||
DEFAULT_MEMBERS(LIndex);
|
||||
LIndex(const Index& i);
|
||||
LIndex(Index&& i);
|
||||
LIndex(const Sptr<Index>& i);
|
||||
|
||||
IndexId<L> id() const;
|
||||
|
||||
template <SizeT I>
|
||||
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
|
||||
|
|
|
@ -393,7 +393,7 @@ namespace CNORXZ
|
|||
constexpr EFor<N,L,Xpr,F>::EFor(const IndexId<L>& id, const Xpr& xpr, F&& f) :
|
||||
mId(id),
|
||||
mXpr(xpr),
|
||||
mExt(mXpr.RootSteps(mId)),
|
||||
mExt(mXpr.rootSteps(mId)),
|
||||
mF(std::forward<F>(f))
|
||||
{}
|
||||
|
||||
|
|
Loading…
Reference in a new issue