re-enable index ifor

This commit is contained in:
Christian Zimmermann 2022-10-16 23:05:48 +02:00
parent 6fc3a50fa9
commit b0d002b7b1
23 changed files with 231 additions and 222 deletions

View file

@ -6,29 +6,11 @@
namespace CNORXZ namespace CNORXZ
{ {
/* template <class PosT, class Xpr>
template <class Expr> decltype(auto) CIndex::ifor(const PosT& step, const Xpr& xpr) const
auto CRange::ifor(SizeT step, Expr ex) const
-> For<CIndex,Expr>
{ {
return For<CIndex,Expr>(this, step, ex); return For<0,PosT,Xpr>(this->max(), this->id(), step, xpr);
} }
*/
/*
template <class Expr>
auto CRange::iforh(SizeT step, Expr ex) const
-> For<CIndex,Expr,ForType::HIDDEN>
{
}
template <class Expr>
auto CRange::pifor(SizeT step, Expr ex) const
-> PFor<CIndex,Expr>
{
}
*/
} }
#endif #endif

View file

@ -5,6 +5,7 @@
#include "base/base.h" #include "base/base.h"
#include "ranges/index_base.h" #include "ranges/index_base.h"
#include "ranges/range_base.h" #include "ranges/range_base.h"
#include "xpr/xpr.h"
namespace CNORXZ namespace CNORXZ
{ {
@ -25,6 +26,9 @@ namespace CNORXZ
CIndex& operator+=(Int n); CIndex& operator+=(Int n);
CIndex& operator-=(Int n); CIndex& operator-=(Int n);
SizeT max() const;
IndexId<0> id() const;
SizeT operator*() const; SizeT operator*() const;
SizeT operator->() const; SizeT operator->() const;
@ -33,25 +37,15 @@ namespace CNORXZ
SizeT dim() const; // = 1 SizeT dim() const; // = 1
Sptr<RangeType> range() const; Sptr<RangeType> range() const;
SizeT getStepSize(PtrId iptr) const; UPos stepSize(const IndexId<0>& id) const;
String stringMeta() const; String stringMeta() const;
SizeT meta() const; SizeT meta() const;
CIndex& at(const SizeT& metaPos); CIndex& at(const SizeT& metaPos);
//template <class Expr> template <class PosT, class Xpr>
//auto ifor(SizeT step, Expr ex) const decltype(auto) ifor(const PosT& step, const Xpr& xpr) const;
// -> For<CIndex,Expr>;
/*
template <class Expr>
auto iforh(SizeT step, Expr ex) const
-> For<CIndex<SizeT>,Expr,ForType::HIDDEN>;
template <class Expr>
auto pifor(SizeT step, Expr ex) const
-> PFor<CIndex<SizeT>,Expr>;
*/
private: private:
Sptr<RangeType> mRangePtr; Sptr<RangeType> mRangePtr;
}; };

View file

@ -11,7 +11,6 @@ namespace CNORXZ
IndexInterface<DIndex,DType>(i.pos()), IndexInterface<DIndex,DType>(i.pos()),
mI(std::make_shared<XIndex<Index,Meta>>(i)) mI(std::make_shared<XIndex<Index,Meta>>(i))
{} {}
} }
#endif #endif

View file

@ -5,6 +5,7 @@
#include "base/base.h" #include "base/base.h"
#include "range_base.h" #include "range_base.h"
#include "index_base.h" #include "index_base.h"
#include "xpr/xpr.h"
namespace CNORXZ namespace CNORXZ
{ {
@ -31,6 +32,9 @@ namespace CNORXZ
DIndex& operator+=(Int n); DIndex& operator+=(Int n);
DIndex& operator-=(Int n); DIndex& operator-=(Int n);
SizeT max() const;
IndexId<0> id() const;
DType operator*() const; DType operator*() const;
DType operator->() const; DType operator->() const;
@ -39,14 +43,14 @@ namespace CNORXZ
SizeT dim() const; SizeT dim() const;
RangePtr range() const; RangePtr range() const;
SizeT getStepSize(PtrId iptr) const;
UPos stepSize(const IndexId<0>& id) const;
String stringMeta() const; String stringMeta() const;
DType meta() const; DType meta() const;
DIndex& at(const DType& meta); DIndex& at(const DType& meta);
//DExpr ifor(SizeT step, DExpr ex) const; DXpr ifor(const UPos& step, const DXpr& xpr) const;
//DExpr iforh(SizeT step, DExpr ex) const;
private: private:
XIndexPtr mI; XIndexPtr mI;

View file

@ -5,6 +5,8 @@
#include "base/base.h" #include "base/base.h"
#include "range_base.h" #include "range_base.h"
#include "xpr/index_id.h"
#include "xpr/xpr_base.h"
namespace CNORXZ namespace CNORXZ
{ {
@ -29,6 +31,7 @@ namespace CNORXZ
SizeT pos() const; SizeT pos() const;
SizeT max() const { return THIS().max(); } SizeT max() const { return THIS().max(); }
PtrId ptrId() const; PtrId ptrId() const;
decltype(auto) id() const { return THIS().id(); }
bool operator==(const IndexInterface& in) const; bool operator==(const IndexInterface& in) const;
bool operator!=(const IndexInterface& in) const; bool operator!=(const IndexInterface& in) const;
@ -44,21 +47,17 @@ namespace CNORXZ
SizeT dim() const { return THIS().dim(); } SizeT dim() const { return THIS().dim(); }
decltype(auto) range() const { return THIS().range(); } decltype(auto) range() const { return THIS().range(); }
SizeT getStepSize(PtrId iptr) const { return THIS().getStepSize(iptr); }
//SizeT getStepSize(SizeT n) const { return THIS().getStepSize(n); } template <SizeT J>
decltype(auto) stepSize(const IndexId<J>& id) const { return THIS().stepSize(id); }
String stringMeta() const { return THIS().stringMeta(); } String stringMeta() const { return THIS().stringMeta(); }
decltype(auto) meta() const { return THIS().meta(); } decltype(auto) meta() const { return THIS().meta(); }
I& at(const MetaType& meta) { return THIS().at(meta); } I& at(const MetaType& meta) { return THIS().at(meta); }
/*
template <class Expr>
auto ifor(SizeT step, const Expr ex) const
{ return THIS().template ifor<Expr>(step,ex); }
template <class Expr> template <class PosT, class Xpr>
auto iforh(SizeT step, const Expr ex) const decltype(auto) ifor(const PosT& step, const Xpr& xpr) const { return THIS().ifor(step,xpr); }
{ return THIS().template iforh<Expr>(step,ex); }
*/
protected: protected:
SizeT mPos = 0; SizeT mPos = 0;

View file

@ -12,24 +12,20 @@ namespace CNORXZ
Index(i) {} Index(i) {}
template <class Index, SizeT L> template <class Index, SizeT L>
template <SizeT L1> IndexId<L> LIndex<Index,L>::id() const
auto LIndex<Index,L>::getStaticStepSize(PtrId iptr) const
{ {
if constexpr(L == 0 or L1 == 0){ return IndexId<L>(this->ptrId());
return this->getStepSize(iptr); }
template <class Index, SizeT L>
template <SizeT I>
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);
} }
else { else {
if constexpr(L == L1){ return this->id() == id ? SPos<1>() : SPos<0>();
CXZ_ASSERT(iptr == this->ptrId(),
"got two different indices with the same static label " << L);
return SPos<1>();
}
else {
CXZ_ASSERT(iptr == this->ptrId(),
"got two equal indices with the different static label " << L
<< " and " << L1);
return SPos<0>();
}
} }
} }

View file

@ -5,6 +5,7 @@
#include "base/base.h" #include "base/base.h"
#include "ranges/index_base.h" #include "ranges/index_base.h"
#include "ranges/range_base.h" #include "ranges/range_base.h"
#include "xpr/xpr.h"
namespace CNORXZ namespace CNORXZ
{ {
@ -20,8 +21,10 @@ namespace CNORXZ
LIndex(const Index& i); LIndex(const Index& i);
LIndex(Index&& i); LIndex(Index&& i);
template <SizeT L1> IndexId<L> id() const;
auto getStaticStepSize(PtrId iptr) const;
template <SizeT I>
decltype(auto) stepSize(const IndexId<I>& id) const;
}; };
} }

View file

@ -6,6 +6,7 @@
#include "base/base.h" #include "base/base.h"
#include "range_base.h" #include "range_base.h"
#include "index_base.h" #include "index_base.h"
#include "xpr/xpr.h"
namespace CNORXZ namespace CNORXZ
{ {
@ -46,6 +47,9 @@ namespace CNORXZ
MIndex& operator+=(Int n); MIndex& operator+=(Int n);
MIndex& operator-=(Int n); MIndex& operator-=(Int n);
SizeT max() const;
decltype(auto) id() const;
SizeT operator*() const; SizeT operator*() const;
SizeT operator->() const; SizeT operator->() const;
@ -54,22 +58,17 @@ namespace CNORXZ
SizeT dim(); SizeT dim();
Sptr<RangeType> range(); Sptr<RangeType> range();
SizeT getStepSize(PtrId iptr) const;
template <SizeT I>
decltype(auto) stepSize(const IndexId<I>& id) const;
String stringMeta() const; String stringMeta() const;
MetaType meta() const; MetaType meta() const;
MIndex& at(const MetaType& metaPos); MIndex& at(const MetaType& metaPos);
/* template <class PosT, class Xpr>
template <class Exprs> auto ifor(const PosT& step, const Xpr& xpr) const;
auto ifor(SizeT step, Exprs exs) const;
template <class Exprs>
auto iforh(SizeT step, Exprs exs) const;
template <class Exprs>
auto pifor(SizeT step, Exprs exs) const;
*/
private: private:
MIndex() = default; MIndex() = default;

View file

@ -6,6 +6,7 @@
#include <algorithm> #include <algorithm>
#include "urange.h" #include "urange.h"
#include "xpr/for.h"
namespace CNORXZ namespace CNORXZ
{ {
@ -67,6 +68,18 @@ namespace CNORXZ
return *this; return *this;
} }
template <typename MetaType>
SizeT UIndex<MetaType>::max() const
{
return mRangePtr->size();
}
template <typename MetaType>
IndexId<0> UIndex<MetaType>::id() const
{
return IndexId<0>(this->ptrId());
}
template <typename MetaType> template <typename MetaType>
const MetaType& UIndex<MetaType>::operator*() const const MetaType& UIndex<MetaType>::operator*() const
{ {
@ -125,37 +138,19 @@ namespace CNORXZ
} }
template <typename MetaType> template <typename MetaType>
SizeT UIndex<MetaType>::getStepSize(PtrId iptr) const template <SizeT I>
UPos UIndex<MetaType>::stepSize(const IndexId<I>& id) const
{ {
return iptr == this->ptrId() ? 1 : 0; return UPos(id == this->id() ? 1 : 0);
}
/*
template <typename MetaType>
template <class Expr>
auto UIndex<MetaType>::ifor(size_t step, Expr ex) const
-> For<URange<MetaType>,Expr>
{
return For<UIndex<MetaType>,Expr>(this, step, ex);
} }
template <typename MetaType> template <typename MetaType>
template <class Expr> template <class PosT, class Xpr>
auto UIndex<MetaType>::iforh(size_t step, Expr ex) const decltype(auto) UIndex<MetaType>::ifor(const PosT step, Xpr xpr) const
-> For<URange<MetaType>,Expr,ForType::HIDDEN>
{ {
return For<UIndex<MetaType>,Expr,ForType::HIDDEN>(this, step, ex); return For<0,PosT,Xpr>(this->max(), this->id(), step, xpr);
} }
template <typename MetaType>
template <class Expr>
auto UIndex<MetaType>::pifor(size_t step, Expr ex) const
-> PFor<URange<MetaType>,Expr>
{
return PFor<UIndex<MetaType>,Expr>(this, step, ex);
}
*/
/********************** /**********************
* URangeFactory * * URangeFactory *
**********************/ **********************/

View file

@ -6,7 +6,7 @@
#include "base/base.h" #include "base/base.h"
#include "ranges/index_base.h" #include "ranges/index_base.h"
#include "ranges/range_base.h" #include "ranges/range_base.h"
#include "xpr/for_type.h" #include "xpr/xpr.h"
namespace CNORXZ namespace CNORXZ
{ {
@ -29,6 +29,9 @@ namespace CNORXZ
UIndex& operator+=(Int n); UIndex& operator+=(Int n);
UIndex& operator-=(Int n); UIndex& operator-=(Int n);
SizeT max() const;
IndexId<0> id() const;
const MetaType& operator*() const; const MetaType& operator*() const;
const MetaType* operator->() const; const MetaType* operator->() const;
@ -37,24 +40,17 @@ namespace CNORXZ
SizeT dim() const; // = 1 SizeT dim() const; // = 1
Sptr<RangeType> range() const; Sptr<RangeType> range() const;
SizeT getStepSize(PtrId iptr) const;
template <SizeT I>
UPos stepSize(const IndexId<I>& id) const;
String stringMeta() const; String stringMeta() const;
const MetaType& meta() const; const MetaType& meta() const;
UIndex& at(const MetaType& metaPos); UIndex& at(const MetaType& metaPos);
/*
template <class Expr>
auto ifor(SizeT step, Expr ex) const
-> For<UIndex<MetaType>,Expr>;
template <class Expr> template <class PosT, class Xpr>
auto iforh(SizeT step, Expr ex) const decltype(auto) ifor(const PosT step, Xpr xpr) const;
-> For<UIndex<MetaType>,Expr,ForType::HIDDEN>;
template <class Expr>
auto pifor(SizeT step, Expr ex) const
-> PFor<UIndex<MetaType>,Expr>;
*/
private: private:
Sptr<RangeType> mRangePtr; Sptr<RangeType> mRangePtr;
const MetaType* mMetaPtr; const MetaType* mMetaPtr;

View file

@ -78,6 +78,18 @@ namespace CNORXZ
return *this; return *this;
} }
template <class Index, typename Meta>
SizeT XIndex<Index,Meta>::max() const
{
return mI->max();
}
template <class Index, typename Meta>
IndexId<0> XIndex<Index,Meta>::id() const
{
return IndexId<0>(mI->id().id());
}
template <class Index, typename Meta> template <class Index, typename Meta>
DType XIndex<Index,Meta>::operator*() const DType XIndex<Index,Meta>::operator*() const
{ {
@ -117,9 +129,9 @@ namespace CNORXZ
} }
template <class Index, typename Meta> template <class Index, typename Meta>
SizeT XIndex<Index,Meta>::getStepSize(PtrId iptr) const UPos XIndex<Index,Meta>::stepSize(const IndexId<0>& id) const
{ {
return mI->getStepSize(iptr); return mI->stepSize(id);
} }
template <class Index, typename Meta> template <class Index, typename Meta>
@ -141,19 +153,13 @@ namespace CNORXZ
mI->at(std::any_cast<const Meta&>(meta.get())); mI->at(std::any_cast<const Meta&>(meta.get()));
return *this; return *this;
} }
/*
template <class Index, typename Meta>
DExpr XIndex<Index,Meta>::ifor(SizeT step, DExpr ex) const
{
return mI->ifor(step, ex);
}
template <class Index, typename Meta> template <class Index, typename Meta>
DExpr XIndex<Index,Meta>::iforh(SizeT step, DExpr ex) const DXpr XIndex<Index,Meta>::ifor(const UPos& step, const DXpr& xpr) const
{ {
return mI->iforh(step, ex); return DXpr(mI->ifor(step, xpr));
} }
*/
} }
#endif #endif

View file

@ -5,6 +5,7 @@
#include "base/base.h" #include "base/base.h"
#include "range_base.h" #include "range_base.h"
#include "index_base.h" #include "index_base.h"
#include "xpr/xpr.h"
namespace CNORXZ namespace CNORXZ
{ {
@ -24,6 +25,9 @@ namespace CNORXZ
virtual XIndexBase& operator+=(Int n) = 0; virtual XIndexBase& operator+=(Int n) = 0;
virtual XIndexBase& operator-=(Int n) = 0; virtual XIndexBase& operator-=(Int n) = 0;
virtual SizeT max() const = 0;
virtual IndexId<0> id() const = 0;
virtual DType operator*() const = 0; virtual DType operator*() const = 0;
virtual DType operator->() const = 0; virtual DType operator->() const = 0;
@ -32,15 +36,13 @@ namespace CNORXZ
virtual SizeT dim() const = 0; virtual SizeT dim() const = 0;
virtual RangePtr range() const = 0; virtual RangePtr range() const = 0;
virtual SizeT getStepSize(PtrId iptr) const = 0; virtual UPos stepSize(const IndexId<0>& id) 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 DXpr ifor(const UPos& step, const DXpr& xpr) const = 0;
//virtual DExpr iforh(SizeT step, DExpr ex) const = 0;
// ...!!!
}; };
//Sptr<XIndexBase>& operator++(Sptr<XIndexBase>& i); //Sptr<XIndexBase>& operator++(Sptr<XIndexBase>& i);
@ -72,6 +74,9 @@ namespace CNORXZ
virtual XIndex& operator+=(Int n) override final; virtual XIndex& operator+=(Int n) override final;
virtual XIndex& operator-=(Int n) override final; virtual XIndex& operator-=(Int n) override final;
virtual SizeT max() const override final;
virtual IndexId<0> id() const override final;
virtual DType operator*() const override final; virtual DType operator*() const override final;
virtual DType operator->() const override final; virtual DType operator->() const override final;
@ -80,15 +85,13 @@ namespace CNORXZ
virtual SizeT dim() const override final; virtual SizeT dim() const override final;
virtual RangePtr range() const override final; virtual RangePtr range() const override final;
virtual SizeT getStepSize(PtrId iptr) const override final; virtual UPos stepSize(const IndexId<0>& id) const override final;
virtual String stringMeta() const override final; virtual String stringMeta() const override final;
virtual DType meta() const override final; virtual DType meta() const override final;
virtual XIndexBase& at(const DType& meta) override final; virtual XIndexBase& at(const DType& meta) override final;
//virtual DExpr ifor(SizeT step, DExpr ex) const override final; virtual DXpr ifor(const UPos& step, const DXpr& xpr) const override final;
//virtual DExpr iforh(SizeT step, DExpr ex) const override final;
// ....!!!!
private: private:
IndexPtr<Index,Meta> mI; IndexPtr<Index,Meta> mI;

View file

@ -12,18 +12,20 @@ namespace CNORXZ
* For * * For *
***********/ ***********/
template <SizeT L, class Xpr> template <SizeT L, class PosT, class Xpr>
constexpr For<L,Xpr>::For(SizeT size, const IndexId<L>& id, SizeT step, const Xpr& xpr) : constexpr For<L,PosT,Xpr>::For(SizeT size, const IndexId<L>& id, const PosT& step, const Xpr& xpr) :
mSize(size), mSize(size),
mId(id), mId(id),
mStep(step),
mXpr(xpr), mXpr(xpr),
mStep(step),
mExt(mXpr.rootSteps(mId)) mExt(mXpr.rootSteps(mId))
{} {
static_assert(is_pos_type<PosT>::value, "got non-pos type");
}
template <SizeT L, class Xpr> template <SizeT L, class PosT, class Xpr>
template <class PosT1, class PosT2> template <class PosT1, class PosT2>
inline SizeT For<L,Xpr>::operator()(const PosT1& mlast, const PosT2& last) const inline SizeT For<L,PosT,Xpr>::operator()(const PosT1& mlast, const PosT2& last) const
{ {
for(SizeT i = 0; i != mSize; ++i){ for(SizeT i = 0; i != mSize; ++i){
const auto mpos = mlast + mStep * UPos(i); const auto mpos = mlast + mStep * UPos(i);
@ -33,63 +35,65 @@ namespace CNORXZ
return 0; return 0;
} }
template <SizeT L, class Xpr> template <SizeT L, class PosT, class Xpr>
inline SizeT For<L,Xpr>::operator()() const inline SizeT For<L,PosT,Xpr>::operator()() const
{ {
for(SizeT i = 0; i != mSize; ++i){ for(SizeT i = 0; i != mSize; ++i){
const SizeT mpos = mStep * UPos(i); const auto mpos = mStep * UPos(i);
const auto pos = mExt * UPos(i); const auto pos = mExt * UPos(i);
mXpr(mpos, pos); mXpr(mpos, pos);
} }
return 0; return 0;
} }
template <SizeT L, class Xpr> template <SizeT L, class PosT, class Xpr>
template <SizeT I> template <SizeT I>
inline decltype(auto) For<L,Xpr>::rootSteps(const IndexId<I>& id) const inline decltype(auto) For<L,PosT,Xpr>::rootSteps(const IndexId<I>& id) const
{ {
return mXpr.rootSteps(id); return mXpr.rootSteps(id);
} }
/************* /************
* SLFor * * SFor *
*************/ ************/
template <SizeT N, SizeT L, SizeT S, class Xpr> template <SizeT N, SizeT L, class PosT, class Xpr>
constexpr SLFor<N,L,S,Xpr>::SLFor(const IndexId<L>& id, const Xpr& xpr) : constexpr SFor<N,L,PosT,Xpr>::SFor(const IndexId<L>& id, const PosT& step, const Xpr& xpr) :
mId(id), mId(id),
mStep(step),
mXpr(xpr), mXpr(xpr),
mExt(mXpr.RootSteps(mId)) mExt(mXpr.RootSteps(mId))
{} {
static_assert(is_pos_type<PosT>::value, "got non-pos type");
}
template <SizeT N, SizeT L, SizeT S, class Xpr> template <SizeT N, SizeT L, class PosT, class Xpr>
template <class PosT1, class PosT2> template <class PosT1, class PosT2>
constexpr SizeT SLFor<N,L,S,Xpr>::operator()(const PosT1& mlast, const PosT2& last) const constexpr SizeT SFor<N,L,PosT,Xpr>::operator()(const PosT1& mlast, const PosT2& last) const
{ {
return exec<0>(mlast, last); return exec<0>(mlast, last);
} }
template <SizeT N, SizeT L, SizeT S, class Xpr> template <SizeT N, SizeT L, class PosT, class Xpr>
constexpr SizeT SLFor<N,L,S,Xpr>::operator()() const constexpr SizeT SFor<N,L,PosT,Xpr>::operator()() const
{ {
return exec<0>(); return exec<0>();
} }
template <SizeT N, SizeT L, SizeT S, class Xpr> template <SizeT N, SizeT L, class PosT, class Xpr>
template <SizeT I> template <SizeT I>
constexpr decltype(auto) SLFor<N,L,S,Xpr>::rootSteps(const IndexId<I>& id) const constexpr decltype(auto) SFor<N,L,PosT,Xpr>::rootSteps(const IndexId<I>& id) const
{ {
return mXpr.rootSteps(id); return mXpr.rootSteps(id);
} }
template <SizeT N, SizeT L, SizeT S, class Xpr> template <SizeT N, SizeT L, class PosT, class Xpr>
template <SizeT I, class PosT1, class PosT2> template <SizeT I, class PosT1, class PosT2>
constexpr SizeT SLFor<N,L,S,Xpr>::exec(const PosT1& mlast, const PosT2& last) const constexpr SizeT SFor<N,L,PosT,Xpr>::exec(const PosT1& mlast, const PosT2& last) const
{ {
constexpr SPos<I> i; constexpr SPos<I> i;
constexpr SPos<S> step; const auto mpos = mlast + mStep * i;
const auto mpos = mlast + step * i;
const auto pos = last + mExt * i; const auto pos = last + mExt * i;
mXpr(mpos, pos); mXpr(mpos, pos);
if constexpr(I < N-1){ if constexpr(I < N-1){
@ -100,13 +104,12 @@ namespace CNORXZ
} }
} }
template <SizeT N, SizeT L, SizeT S, class Xpr> template <SizeT N, SizeT L, class PosT, class Xpr>
template <SizeT I> template <SizeT I>
constexpr SizeT SLFor<N,L,S,Xpr>::exec() const constexpr SizeT SFor<N,L,PosT,Xpr>::exec() const
{ {
constexpr SPos<I> i; constexpr SPos<I> i;
constexpr SPos<S> step; const auto mpos = mStep * i;
const auto mpos = step * i;
const auto pos = mExt * i; const auto pos = mExt * i;
mXpr(mpos, pos); mXpr(mpos, pos);
if constexpr(I < N-1){ if constexpr(I < N-1){
@ -121,18 +124,24 @@ namespace CNORXZ
* TFor * * TFor *
************/ ************/
template <SizeT L, class Xpr> template <SizeT L, class PosT, class Xpr>
constexpr TFor<L,Xpr>::TFor(SizeT size, const IndexId<L>& id, SizeT step, const Xpr& xpr) : constexpr TFor<L,PosT,Xpr>::TFor(SizeT size, const IndexId<L>& id, const PosT& step, const Xpr& xpr) :
mSize(size), mSize(size),
mId(id), mId(id),
mStep(step), mStep(step),
mXpr(xpr), mXpr(xpr),
mExt(mXpr.rootSteps(mId)) mExt(mXpr.rootSteps(mId))
{} {
static_assert(is_pos_type<PosT>::value, "got non-pos type");
if constexpr(is_static_pos_type<PosT>::value){
static_assert(step.val() != 0, "step has to be non-zero for TPos");
}
CXZ_ASSERT(step.val() != 0, "step has to be non-zero for TPos");
}
template <SizeT L, class Xpr> template <SizeT L, class PosT, class Xpr>
template <class PosT1, class PosT2> template <class PosT1, class PosT2>
inline SizeT TFor<L,Xpr>::operator()(const PosT1& mlast, const PosT2& last) const inline SizeT TFor<L,PosT,Xpr>::operator()(const PosT1& mlast, const PosT2& last) const
{ {
int i = 0; int i = 0;
#pragma omp parallel shared(mXpr) private(i) #pragma omp parallel shared(mXpr) private(i)
@ -148,8 +157,8 @@ namespace CNORXZ
return 0; return 0;
} }
template <SizeT L, class Xpr> template <SizeT L, class PosT, class Xpr>
inline SizeT TFor<L,Xpr>::operator()() const inline SizeT TFor<L,PosT,Xpr>::operator()() const
{ {
int i = 0; int i = 0;
#pragma omp parallel shared(mXpr) private(i) #pragma omp parallel shared(mXpr) private(i)
@ -165,9 +174,9 @@ namespace CNORXZ
return 0; return 0;
} }
template <SizeT L, class Xpr> template <SizeT L, class PosT, class Xpr>
template <SizeT I> template <SizeT I>
inline decltype(auto) TFor<L,Xpr>::rootSteps(const IndexId<I>& id) const inline decltype(auto) TFor<L,PosT,Xpr>::rootSteps(const IndexId<I>& id) const
{ {
return mXpr.rootSteps(id); return mXpr.rootSteps(id);
} }

View file

@ -8,13 +8,13 @@
namespace CNORXZ namespace CNORXZ
{ {
template <SizeT L, class Xpr> template <SizeT L, class PosT, class Xpr>
class For : public XprInterface<For<L,Xpr>> class For : public XprInterface<For<L,PosT,Xpr>>
{ {
public: public:
DEFAULT_MEMBERS(For); DEFAULT_MEMBERS(For);
constexpr For(SizeT size, const IndexId<L>& id, SizeT step, const Xpr& xpr); constexpr For(SizeT size, const IndexId<L>& id, const PosT& step, const Xpr& xpr);
template <class PosT1, class PosT2> template <class PosT1, class PosT2>
inline SizeT operator()(const PosT1& mlast, const PosT2& last) const; inline SizeT operator()(const PosT1& mlast, const PosT2& last) const;
@ -28,20 +28,20 @@ namespace CNORXZ
SizeT mSize = 0; SizeT mSize = 0;
IndexId<L> mId; IndexId<L> mId;
Xpr mXpr; Xpr mXpr;
UPos mStep; PosT mStep; // one-dim
typedef decltype(mXpr.rootSteps(mId)) PosT; typedef decltype(mXpr.rootSteps(mId)) XPosT;
PosT mExt; XPosT mExt;
}; };
// unrolled loop: // unrolled loop:
template <SizeT N, SizeT L, SizeT S, class Xpr> template <SizeT N, SizeT L, class PosT, class Xpr>
class SLFor : public XprInterface<SLFor<N,L,S,Xpr>> class SFor : public XprInterface<SFor<N,L,PosT,Xpr>>
{ {
public: public:
DEFAULT_MEMBERS(SLFor); DEFAULT_MEMBERS(SFor);
constexpr SLFor(const IndexId<L>& id, const Xpr& xpr); constexpr SFor(const IndexId<L>& id, const PosT& step, const Xpr& xpr);
template <class PosT1, class PosT2> template <class PosT1, class PosT2>
constexpr SizeT operator()(const PosT1& mlast, const PosT2& last) const; constexpr SizeT operator()(const PosT1& mlast, const PosT2& last) const;
@ -61,20 +61,21 @@ namespace CNORXZ
IndexId<L> mId; IndexId<L> mId;
Xpr mXpr; Xpr mXpr;
typedef decltype(mXpr.RootSteps(mId)) PosT; PosT mStep;
PosT mExt; typedef decltype(mXpr.RootSteps(mId)) XPosT;
XPosT mExt;
}; };
// multi-threading // multi-threading
template <SizeT L, class Xpr> template <SizeT L, class PosT, class Xpr>
class TFor : public XprInterface<TFor<L,Xpr>> class TFor : public XprInterface<TFor<L,PosT,Xpr>>
{ {
public: public:
DEFAULT_MEMBERS(TFor); DEFAULT_MEMBERS(TFor);
constexpr TFor(SizeT size, const IndexId<L>& id, SizeT step, const Xpr& xpr); constexpr TFor(SizeT size, const IndexId<L>& id, const PosT& step, const Xpr& xpr);
template <class PosT1, class PosT2> template <class PosT1, class PosT2>
inline SizeT operator()(const PosT1& mlast, const PosT2& last) const; inline SizeT operator()(const PosT1& mlast, const PosT2& last) const;
@ -88,9 +89,9 @@ namespace CNORXZ
SizeT mSize = 0; SizeT mSize = 0;
IndexId<L> mId = 0; IndexId<L> mId = 0;
Xpr mXpr; Xpr mXpr;
UPos mStep; PosT mStep;
typedef decltype(mXpr.rootSteps(mId)) PosT; typedef decltype(mXpr.rootSteps(mId)) XPosT;
PosT mExt; XPosT mExt;
}; };

View file

@ -8,7 +8,7 @@ namespace CNORXZ
{ {
template <SizeT I> template <SizeT I>
explicit constexpr IndexId<I>::IndexId(PtrId id) : constexpr IndexId<I>::IndexId(PtrId id) :
mId(id) mId(id)
{} {}

View file

@ -1,4 +1,6 @@
#include "vpos_type.cc.h" #include "vpos_type.cc.h"
#include "pos_type.cc.h" #include "pos_type.cc.h"
#include "xpr_base.cc.h"
#include "for.cc.h" #include "for.cc.h"
#include "index_id.cc.h"

View file

@ -1,6 +1,8 @@
#include "vpos_type.h" #include "vpos_type.h"
#include "pos_type.h" #include "pos_type.h"
#include "xpr_base.h"
#include "for.h" #include "for.h"
#include "index_id.h"
#include "xpr.cc.h" #include "xpr.cc.h"

View file

@ -37,7 +37,7 @@ namespace CNORXZ
template <class Xpr> template <class Xpr>
DPos VXpr<Xpr>::vrootSteps(const IndexId<0>& id) const DPos VXpr<Xpr>::vrootSteps(const IndexId<0>& id) const
{ {
return DPos(this->rootSteps(ptrId)); return DPos(this->rootSteps(id));
} }
/************ /************
@ -45,15 +45,13 @@ namespace CNORXZ
************/ ************/
template <class Xpr> template <class Xpr>
explicit DXpr::DXpr(const Xpr& a) : DXpr::DXpr(const Xpr& a) :
ObjHandle<VXprBase>(VXpr<Xpr>(a)) ObjHandle<VXprBase>(std::make_unique<VXpr<Xpr>>(a))
{} {}
template <class PosT> inline SizeT DXpr::operator()(const UPos& mlast, const DPos& last) const
inline SizeT DXpr::operator()(const UPos& mlast, const PosT& last) const
{ {
DPosRef dlast(&last); return mC->vexec(mlast, last);
return mC->vexec(mlast, dlast);
} }
inline SizeT DXpr::operator()() const inline SizeT DXpr::operator()() const
@ -64,7 +62,7 @@ namespace CNORXZ
template <SizeT I> template <SizeT I>
inline DPos DXpr::rootSteps(const IndexId<I>& id) const inline DPos DXpr::rootSteps(const IndexId<I>& id) const
{ {
return mC->rootSteps(IndexId<0>(id.id())); return mC->vrootSteps(IndexId<0>(id.id()));
} }
} }

View file

@ -64,8 +64,7 @@ namespace CNORXZ
template <class Xpr> template <class Xpr>
explicit DXpr(const Xpr& a); explicit DXpr(const Xpr& a);
template <class PosT> inline SizeT operator()(const UPos& mlast, const DPos& last) const;
inline SizeT operator()(const UPos& mlast, const PosT& last) const;
inline SizeT operator()() const; inline SizeT operator()() const;
template <SizeT I> template <SizeT I>

View file

@ -6,6 +6,7 @@
#include "range_base.h" #include "range_base.h"
#include "index_base.h" #include "index_base.h"
#include "xindex.h" #include "xindex.h"
#include "xpr/xpr.h"
namespace CNORXZ namespace CNORXZ
{ {
@ -33,6 +34,9 @@ namespace CNORXZ
YIndex& operator+=(Int n); YIndex& operator+=(Int n);
YIndex& operator-=(Int n); YIndex& operator-=(Int n);
SizeT max() const;
IndexId<0> id() const;
DType operator*() const; DType operator*() const;
DType operator->() const; DType operator->() const;
@ -41,14 +45,13 @@ namespace CNORXZ
SizeT dim() const; SizeT dim() const;
Sptr<YRange> range() const; Sptr<YRange> range() const;
SizeT getStepSize(PtrId iptr) const; UPos stepSize(const IndexId<0> id) const;
String stringMeta() const; String stringMeta() const;
DType meta() const; DType meta() const;
YIndex& at(const DType& meta); YIndex& at(const DType& meta);
//DExpr ifor(SizeT step, DExpr ex) const; DXpr ifor(const UPos& step, const DXpr& xpr) const;
//DExpr iforh(SizeT step, DExpr ex) const;
private: private:

View file

@ -51,6 +51,16 @@ namespace CNORXZ
return *this; return *this;
} }
SizeT CIndex::max() const
{
return mRangePtr->size();
}
IndexId<0> CIndex::id() const
{
return IndexId<0>(this->ptrId());
}
SizeT CIndex::operator*() const SizeT CIndex::operator*() const
{ {
return IB::mPos; return IB::mPos;
@ -83,9 +93,9 @@ namespace CNORXZ
return mRangePtr; return mRangePtr;
} }
SizeT CIndex::getStepSize(PtrId iptr) const UPos CIndex::stepSize(const IndexId<0>& id) const
{ {
return iptr == this->ptrId() ? 1 : 0; return UPos(id == this->id() ? 1 : 0);
} }
String CIndex::stringMeta() const String CIndex::stringMeta() const

View file

@ -116,9 +116,9 @@ namespace CNORXZ
return mI->range(); return mI->range();
} }
SizeT DIndex::getStepSize(PtrId iptr) const UPos DIndex::stepSize(const IndexId<0>& id) const
{ {
return mI->getStepSize(iptr); return mI->stepSize(id);
} }
String DIndex::stringMeta() const String DIndex::stringMeta() const
@ -138,7 +138,9 @@ namespace CNORXZ
return *this; return *this;
} }
//DExpr DIndex::ifor(SizeT step, DExpr ex) const; DXpr DIndex::ifor(const UPos& step, const DXpr& xpr) const
//DExpr DIndex::iforh(SizeT step, DExpr ex) const; {
return DXpr(mI->ifor(step, xpr));
}
} }

View file

@ -86,6 +86,20 @@ namespace CNORXZ
return *this; return *this;
} }
SizeT YIndex::max() const
{
SizeT o = 1;
for(auto& i: mIs){
o *= i->max();
}
return o;
}
IndexId<0> YIndex::id() const
{
return IndexId<0>(this->ptrId());
}
DType YIndex::operator*() const DType YIndex::operator*() const
{ {
assert(0); assert(0);
@ -122,11 +136,11 @@ namespace CNORXZ
return mRangePtr; return mRangePtr;
} }
SizeT YIndex::getStepSize(PtrId iptr) const UPos YIndex::stepSize(const IndexId<0> id) const
{ {
assert(0); assert(0);
// sub inds !!! // sub inds !!!
return 0; return UPos(0);
} }
String YIndex::stringMeta() const String YIndex::stringMeta() const
@ -156,19 +170,12 @@ namespace CNORXZ
} }
return *this; return *this;
} }
/*
DExpr YIndex::ifor(SizeT step, DExpr ex) const
{
assert(0);
return DExpr();
}
DExpr YIndex::iforh(SizeT step, DExpr ex) const DXpr YIndex::ifor(const UPos& step, const DXpr& xpr) const
{ {
assert(0); assert(0);
return DExpr(); return DXpr();
} }
*/
/********************** /**********************
* YRangeFactory * * YRangeFactory *