EIndex: new inheritance structure: SIndex<S> -> LIndex<SIndex<S>,L> -> EIndex<S,L>

This commit is contained in:
Christian Zimmermann 2023-06-04 22:14:26 +02:00
parent 52517675a5
commit ba02601b97
5 changed files with 100 additions and 29 deletions

View file

@ -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 );
}
}

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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))
{}