index: add prange member function
This commit is contained in:
parent
db6b0a14ec
commit
301967288f
18 changed files with 223 additions and 147 deletions
|
@ -69,7 +69,7 @@ namespace CNORXZ
|
|||
{
|
||||
auto ai = itLexSave(begin);
|
||||
auto aj = itLexSave(end);
|
||||
return std::make_shared<CSlice>(subcube(ai,aj), this, ai.format(), ai.pos());
|
||||
return std::make_shared<CSlice>(ai.prange(aj), this, ai.format(), ai.pos());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
|
|
@ -47,6 +47,8 @@ namespace CNORXZ
|
|||
CIndex& at(const SizeT& metaPos);
|
||||
COpRoot<SizeT,CIndex> xpr(const Sptr<CIndex>& _this) const;
|
||||
|
||||
RangePtr prange(const CIndex& end) const;
|
||||
|
||||
SizeT deepFormat() const;
|
||||
/*
|
||||
template <class Index>
|
||||
|
|
|
@ -54,6 +54,7 @@ namespace CNORXZ
|
|||
DType meta() const;
|
||||
DIndex& at(const DType& meta);
|
||||
DXpr<SizeT> xpr(const Sptr<DIndex>& _this) const;
|
||||
RangePtr prange(const DIndex& end) const;
|
||||
Vector<SizeT> deepFormat() const;
|
||||
|
||||
DXpr<SizeT> ifor(const DXpr<SizeT>& xpr, std::function<SizeT(SizeT,SizeT)>&& f) const;
|
||||
|
|
|
@ -54,6 +54,8 @@ namespace CNORXZ
|
|||
decltype(auto) meta() const { return THIS().meta(); }
|
||||
I& at(const MetaType& meta) { return THIS().at(meta); }
|
||||
decltype(auto) xpr(const Sptr<I>& _this) const { return THIS().xpr(_this); }
|
||||
|
||||
RangePtr prange(const IndexInterface& end) const { return THIS().prange(end.THIS()); }
|
||||
/*
|
||||
template <class Index>
|
||||
decltype(auto) formatTo(const Sptr<Index>& ind) const { return ind->formatFrom(THIS()); }
|
||||
|
|
|
@ -479,6 +479,22 @@ namespace CNORXZ
|
|||
return mLexFormat;
|
||||
}
|
||||
|
||||
template <class FormatT, class... Indices>
|
||||
RangePtr GMIndex<FormatT,Indices...>::prange(const MIndex<Indices...>& end) const
|
||||
{
|
||||
CXZ_ERROR("IMPLEMENT!!!");
|
||||
return nullptr;
|
||||
/*
|
||||
return ifor<0,NI>
|
||||
( [&](auto i) {
|
||||
typedef typename std::remove_reference<decltype(mIPack[i])>::type::RangeType RangeT;
|
||||
return std::dynamic_pointer_cast<RangeT>( mIPack[i]->prange( *end.pack()[i] ) );
|
||||
},
|
||||
[](const auto&... e) { return mrange(e...); }
|
||||
);
|
||||
*/
|
||||
}
|
||||
|
||||
template <class FormatT, class... Indices>
|
||||
auto GMIndex<FormatT,Indices...>::deepFormat() const
|
||||
{
|
||||
|
|
|
@ -81,6 +81,7 @@ namespace CNORXZ
|
|||
const SPack<Indices...>& pack() const;
|
||||
const auto& format() const;
|
||||
const auto& lexFormat() const;
|
||||
RangePtr prange(const MIndex<Indices...>& end) const;
|
||||
auto deepFormat() const;
|
||||
GMIndex& setFormat(const FormatT& bs);
|
||||
|
||||
|
|
|
@ -123,6 +123,19 @@ namespace CNORXZ
|
|||
}
|
||||
}
|
||||
|
||||
template <class IndexT>
|
||||
RangePtr PIndex<IndexT>::prange(const PIndex<IndexT>& end) const
|
||||
{
|
||||
CXZ_ERROR("IMPLEMENT!!!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template <class IndexT>
|
||||
decltype(auto) PIndex<IndexT>::deepFormat() const
|
||||
{
|
||||
return mOrig->deepFormat();
|
||||
}
|
||||
|
||||
template <class IndexT>
|
||||
String PIndex<IndexT>::stringMeta() const
|
||||
{
|
||||
|
@ -208,7 +221,7 @@ namespace CNORXZ
|
|||
}
|
||||
++IB::mPos;
|
||||
}
|
||||
CXZ_ERROR("meta position '" << mOrig->meta() << "' not part of range");
|
||||
CXZ_ERROR("meta position '" << toString(mOrig->meta()) << "' not part of range");
|
||||
}
|
||||
|
||||
/***************************
|
||||
|
@ -327,22 +340,16 @@ namespace CNORXZ
|
|||
return Vector<Uuid> { mRange->id() };
|
||||
}
|
||||
|
||||
|
||||
/****************************
|
||||
* non-member functions *
|
||||
****************************/
|
||||
|
||||
template <class I, typename M>
|
||||
RangePtr prange(const IndexInterface<I,M>& begin, const IndexInterface<I,M>& end)
|
||||
|
||||
template <class RangeT>
|
||||
RangePtr prange(const Sptr<RangeT>& range, const Vector<SizeT>& parts)
|
||||
{
|
||||
Vector<SizeT> parts(end-begin);
|
||||
const SizeT off = begin.pos();
|
||||
for(auto i = begin.THIS(); i != end.THIS(); ++i){
|
||||
parts[i.pos()-off] = i.pos();
|
||||
}
|
||||
return begin.range()->partial(parts); // implement!!!!
|
||||
//return PRangeFactory<typename I::RangeType>(begin.range(), parts).create();
|
||||
return PRangeFactory<RangeT>(range,parts).create();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -41,6 +41,8 @@ namespace CNORXZ
|
|||
|
||||
template <SizeT I>
|
||||
UPos stepSize(const IndexId<I>& id) const;
|
||||
RangePtr prange(const PIndex<IndexT>& end) const;
|
||||
decltype(auto) deepFormat() const;
|
||||
|
||||
String stringMeta() const;
|
||||
decltype(auto) meta() const;
|
||||
|
@ -118,8 +120,8 @@ namespace CNORXZ
|
|||
Vector<SizeT> mParts;
|
||||
};
|
||||
|
||||
template <class I, typename M>
|
||||
RangePtr prange(const IndexInterface<I,M>& begin, const IndexInterface<I,M>& end);
|
||||
template <class RangeT>
|
||||
RangePtr prange(const Sptr<RangeT>& range, const Vector<SizeT>& parts);
|
||||
|
||||
} // namespace CNORXZ
|
||||
|
||||
|
|
|
@ -141,6 +141,13 @@ namespace CNORXZ
|
|||
return coproot(mMetaPtr,_this);
|
||||
}
|
||||
|
||||
template <typename MetaT, SizeT S>
|
||||
RangePtr SIndex<MetaT,S>::prange(const SIndex<MetaType,S>& end) const
|
||||
{
|
||||
CXZ_ERROR("IMPLEMENT!!!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template <typename MetaT, SizeT S>
|
||||
SizeT SIndex<MetaT,S>::deepFormat() const
|
||||
{
|
||||
|
|
|
@ -48,6 +48,7 @@ namespace CNORXZ
|
|||
SIndex& at(const MetaT& metaPos);
|
||||
decltype(auto) xpr(const Sptr<SIndex<MetaType,S>>& _this) const;
|
||||
|
||||
RangePtr prange(const SIndex<MetaType,S>& end) const;
|
||||
SizeT deepFormat() const;
|
||||
/*
|
||||
template <class Index>
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include <algorithm>
|
||||
|
||||
#include "urange.h"
|
||||
#include "prange.h"
|
||||
#include "index_mul.h"
|
||||
#include "xpr/for.h"
|
||||
#include "operation/op_types.h"
|
||||
|
@ -17,136 +18,148 @@ namespace CNORXZ
|
|||
* UIndex *
|
||||
*****************/
|
||||
|
||||
template <typename MetaType>
|
||||
UIndex<MetaType>::UIndex(const RangePtr& range, SizeT pos) :
|
||||
IndexInterface<UIndex<MetaType>,MetaType>(pos),
|
||||
template <typename MetaT>
|
||||
UIndex<MetaT>::UIndex(const RangePtr& range, SizeT pos) :
|
||||
IndexInterface<UIndex<MetaT>,MetaT>(pos),
|
||||
mRangePtr(rangeCast<RangeType>(range)),
|
||||
mMetaPtr(&mRangePtr->get(0))
|
||||
{}
|
||||
|
||||
template <typename MetaType>
|
||||
UIndex<MetaType>& UIndex<MetaType>::operator=(size_t lexpos)
|
||||
template <typename MetaT>
|
||||
UIndex<MetaT>& UIndex<MetaT>::operator=(size_t lexpos)
|
||||
{
|
||||
IB::mPos = lexpos;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
UIndex<MetaType>& UIndex<MetaType>::operator++()
|
||||
template <typename MetaT>
|
||||
UIndex<MetaT>& UIndex<MetaT>::operator++()
|
||||
{
|
||||
++IB::mPos;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
UIndex<MetaType>& UIndex<MetaType>::operator--()
|
||||
template <typename MetaT>
|
||||
UIndex<MetaT>& UIndex<MetaT>::operator--()
|
||||
{
|
||||
--IB::mPos;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
UIndex<MetaType> UIndex<MetaType>::operator+(Int n) const
|
||||
template <typename MetaT>
|
||||
UIndex<MetaT> UIndex<MetaT>::operator+(Int n) const
|
||||
{
|
||||
return UIndex(mRangePtr, IB::mPos + n);
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
UIndex<MetaType> UIndex<MetaType>::operator-(Int n) const
|
||||
template <typename MetaT>
|
||||
UIndex<MetaT> UIndex<MetaT>::operator-(Int n) const
|
||||
{
|
||||
return UIndex(mRangePtr, IB::mPos - n);
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
UIndex<MetaType>& UIndex<MetaType>::operator+=(Int n)
|
||||
template <typename MetaT>
|
||||
UIndex<MetaT>& UIndex<MetaT>::operator+=(Int n)
|
||||
{
|
||||
IB::mPos += n;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
UIndex<MetaType>& UIndex<MetaType>::operator-=(Int n)
|
||||
template <typename MetaT>
|
||||
UIndex<MetaT>& UIndex<MetaT>::operator-=(Int n)
|
||||
{
|
||||
IB::mPos -= n;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
SizeT UIndex<MetaType>::lex() const
|
||||
template <typename MetaT>
|
||||
SizeT UIndex<MetaT>::lex() const
|
||||
{
|
||||
return IB::mPos;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
UPos UIndex<MetaType>::pmax() const
|
||||
template <typename MetaT>
|
||||
UPos UIndex<MetaT>::pmax() const
|
||||
{
|
||||
return UPos(mRangePtr->size());
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
UPos UIndex<MetaType>::lmax() const
|
||||
template <typename MetaT>
|
||||
UPos UIndex<MetaT>::lmax() const
|
||||
{
|
||||
return UPos(mRangePtr->size());
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
IndexId<0> UIndex<MetaType>::id() const
|
||||
template <typename MetaT>
|
||||
IndexId<0> UIndex<MetaT>::id() const
|
||||
{
|
||||
return IndexId<0>(this->ptrId());
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
const MetaType& UIndex<MetaType>::operator*() const
|
||||
template <typename MetaT>
|
||||
const MetaT& UIndex<MetaT>::operator*() const
|
||||
{
|
||||
return mMetaPtr[IB::mPos];
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
String UIndex<MetaType>::stringMeta() const
|
||||
template <typename MetaT>
|
||||
String UIndex<MetaT>::stringMeta() const
|
||||
{
|
||||
return toString(this->meta());
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
const MetaType& UIndex<MetaType>::meta() const
|
||||
template <typename MetaT>
|
||||
const MetaT& UIndex<MetaT>::meta() const
|
||||
{
|
||||
return mMetaPtr[IB::mPos];
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
UIndex<MetaType>& UIndex<MetaType>::at(const MetaType& metaPos)
|
||||
template <typename MetaT>
|
||||
UIndex<MetaT>& UIndex<MetaT>::at(const MetaT& metaPos)
|
||||
{
|
||||
(*this) = mRangePtr->getMeta(metaPos);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
decltype(auto) UIndex<MetaType>::xpr(const Sptr<UIndex<MetaType>>& _this) const
|
||||
template <typename MetaT>
|
||||
decltype(auto) UIndex<MetaT>::xpr(const Sptr<UIndex<MetaT>>& _this) const
|
||||
{
|
||||
return coproot(mMetaPtr,_this);
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
SizeT UIndex<MetaType>::deepFormat() const
|
||||
template <typename MetaT>
|
||||
RangePtr UIndex<MetaT>::prange(const UIndex<MetaT>& end) const
|
||||
{
|
||||
CXZ_ASSERT(end > *this, "got end index position smaller than begin index position");
|
||||
const SizeT beginPos = lex();
|
||||
Vector<SizeT> parts(end.lex()-beginPos);
|
||||
for(auto i = *this; i != end; ++i){
|
||||
parts[i.lex()-beginPos] = i.lex();
|
||||
}
|
||||
return CNORXZ::prange(mRangePtr, parts);
|
||||
}
|
||||
|
||||
template <typename MetaT>
|
||||
SizeT UIndex<MetaT>::deepFormat() const
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
size_t UIndex<MetaType>::dim() const // = 1
|
||||
template <typename MetaT>
|
||||
size_t UIndex<MetaT>::dim() const // = 1
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
Sptr<URange<MetaType>> UIndex<MetaType>::range() const
|
||||
template <typename MetaT>
|
||||
Sptr<URange<MetaT>> UIndex<MetaT>::range() const
|
||||
{
|
||||
return mRangePtr;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
template <typename MetaT>
|
||||
template <SizeT I>
|
||||
decltype(auto) UIndex<MetaType>::stepSize(const IndexId<I>& id) const
|
||||
decltype(auto) UIndex<MetaT>::stepSize(const IndexId<I>& id) const
|
||||
{
|
||||
if constexpr(I != 0){
|
||||
return SPos<0>();
|
||||
|
@ -156,34 +169,34 @@ namespace CNORXZ
|
|||
}
|
||||
}
|
||||
/*
|
||||
template <typename MetaType>
|
||||
template <typename MetaT>
|
||||
template <class Index>
|
||||
decltype(auto) UIndex<MetaType>::formatFrom(const Index& ind) const
|
||||
decltype(auto) UIndex<MetaT>::formatFrom(const Index& ind) const
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
template <typename MetaT>
|
||||
template <class Index>
|
||||
decltype(auto) UIndex<MetaType>::slice(const Sptr<Index>& ind) const
|
||||
decltype(auto) UIndex<MetaT>::slice(const Sptr<Index>& ind) const
|
||||
{
|
||||
if(ind != nullptr){
|
||||
if(ind->dim() != 0) {
|
||||
return Sptr<UIndex<MetaType>>();
|
||||
return Sptr<UIndex<MetaT>>();
|
||||
}
|
||||
}
|
||||
return std::make_shared<UIndex<MetaType>>(*this);
|
||||
return std::make_shared<UIndex<MetaT>>(*this);
|
||||
}
|
||||
*/
|
||||
template <typename MetaType>
|
||||
template <typename MetaT>
|
||||
template <class Xpr, class F>
|
||||
decltype(auto) UIndex<MetaType>::ifor(const Xpr& xpr, F&& f) const
|
||||
decltype(auto) UIndex<MetaT>::ifor(const Xpr& xpr, F&& f) const
|
||||
{
|
||||
return For<0,Xpr,F>(this->pmax().val(), this->id(), xpr, std::forward<F>(f));
|
||||
}
|
||||
|
||||
template <typename MetaType, class I1>
|
||||
decltype(auto) operator*(const Sptr<UIndex<MetaType>>& a, const Sptr<I1>& b)
|
||||
template <typename MetaT, class I1>
|
||||
decltype(auto) operator*(const Sptr<UIndex<MetaT>>& a, const Sptr<I1>& b)
|
||||
{
|
||||
return iptrMul(a, b);
|
||||
}
|
||||
|
@ -192,32 +205,32 @@ namespace CNORXZ
|
|||
* URangeFactory *
|
||||
**********************/
|
||||
|
||||
template <typename MetaType>
|
||||
URangeFactory<MetaType>::URangeFactory(const Vector<MetaType>& space) :
|
||||
template <typename MetaT>
|
||||
URangeFactory<MetaT>::URangeFactory(const Vector<MetaT>& space) :
|
||||
mSpace(space) {}
|
||||
|
||||
template <typename MetaType>
|
||||
URangeFactory<MetaType>::URangeFactory(Vector<MetaType>&& space) :
|
||||
template <typename MetaT>
|
||||
URangeFactory<MetaT>::URangeFactory(Vector<MetaT>&& space) :
|
||||
mSpace(space) {}
|
||||
|
||||
template <typename MetaType>
|
||||
URangeFactory<MetaType>::URangeFactory(const Vector<MetaType>& space, const RangePtr& ref) :
|
||||
template <typename MetaT>
|
||||
URangeFactory<MetaT>::URangeFactory(const Vector<MetaT>& space, const RangePtr& ref) :
|
||||
mSpace(space), mRef(ref) {}
|
||||
|
||||
template <typename MetaType>
|
||||
URangeFactory<MetaType>::URangeFactory(Vector<MetaType>&& space, const RangePtr& ref) :
|
||||
template <typename MetaT>
|
||||
URangeFactory<MetaT>::URangeFactory(Vector<MetaT>&& space, const RangePtr& ref) :
|
||||
mSpace(space), mRef(ref) {}
|
||||
|
||||
template <typename MetaType>
|
||||
void URangeFactory<MetaType>::make()
|
||||
template <typename MetaT>
|
||||
void URangeFactory<MetaT>::make()
|
||||
{
|
||||
const auto& info = typeid(URange<MetaType>);
|
||||
const auto& info = typeid(URange<MetaT>);
|
||||
if(mRef != nullptr) {
|
||||
mProd = this->fromCreated(info, {mRef->id()});
|
||||
}
|
||||
if(mProd == nullptr){
|
||||
RangePtr key = mProd = std::shared_ptr<URange<MetaType>>
|
||||
( new URange<MetaType>( std::move(mSpace) ) );
|
||||
RangePtr key = mProd = std::shared_ptr<URange<MetaT>>
|
||||
( new URange<MetaT>( std::move(mSpace) ) );
|
||||
if(mRef != nullptr) { key = mRef; }
|
||||
this->addToCreated(info, { key->id() }, mProd);
|
||||
}
|
||||
|
@ -227,88 +240,88 @@ namespace CNORXZ
|
|||
* URange *
|
||||
***************/
|
||||
|
||||
template <typename MetaType>
|
||||
URange<MetaType>::URange(const Vector<MetaType>& space) :
|
||||
RangeInterface<URange<MetaType>>(),
|
||||
template <typename MetaT>
|
||||
URange<MetaT>::URange(const Vector<MetaT>& space) :
|
||||
RangeInterface<URange<MetaT>>(),
|
||||
mSpace(space)
|
||||
{
|
||||
std::sort(mSpace.begin(), mSpace.end(), std::less<MetaType>());
|
||||
std::sort(mSpace.begin(), mSpace.end(), std::less<MetaT>());
|
||||
auto itdupl = std::adjacent_find(mSpace.begin(), mSpace.end());
|
||||
CXZ_ASSERT(itdupl == mSpace.end(), "found duplicate: " << *itdupl);
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
URange<MetaType>::URange(Vector<MetaType>&& space) :
|
||||
RangeInterface<URange<MetaType>>(),
|
||||
template <typename MetaT>
|
||||
URange<MetaT>::URange(Vector<MetaT>&& space) :
|
||||
RangeInterface<URange<MetaT>>(),
|
||||
mSpace(space)
|
||||
{
|
||||
std::sort(mSpace.begin(), mSpace.end(), std::less<MetaType>());
|
||||
std::sort(mSpace.begin(), mSpace.end(), std::less<MetaT>());
|
||||
auto itdupl = std::adjacent_find(mSpace.begin(), mSpace.end());
|
||||
CXZ_ASSERT(itdupl == mSpace.end(), "found duplicate: " << toString(*itdupl));
|
||||
}
|
||||
|
||||
|
||||
template <typename MetaType>
|
||||
const MetaType& URange<MetaType>::get(SizeT pos) const
|
||||
template <typename MetaT>
|
||||
const MetaT& URange<MetaT>::get(SizeT pos) const
|
||||
{
|
||||
return mSpace[pos];
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
const MetaType* URange<MetaType>::get() const
|
||||
template <typename MetaT>
|
||||
const MetaT* URange<MetaT>::get() const
|
||||
{
|
||||
return mSpace.data();
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
SizeT URange<MetaType>::getMeta(const MetaType& meta) const
|
||||
template <typename MetaT>
|
||||
SizeT URange<MetaT>::getMeta(const MetaT& meta) const
|
||||
{
|
||||
auto b = mSpace.begin();
|
||||
auto e = mSpace.end();
|
||||
return std::lower_bound(b, e, meta, std::less<MetaType>()) - b;
|
||||
return std::lower_bound(b, e, meta, std::less<MetaT>()) - b;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
SizeT URange<MetaType>::size() const
|
||||
template <typename MetaT>
|
||||
SizeT URange<MetaT>::size() const
|
||||
{
|
||||
return mSpace.size();
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
SizeT URange<MetaType>::dim() const
|
||||
template <typename MetaT>
|
||||
SizeT URange<MetaT>::dim() const
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
String URange<MetaType>::stringMeta(SizeT pos) const
|
||||
template <typename MetaT>
|
||||
String URange<MetaT>::stringMeta(SizeT pos) const
|
||||
{
|
||||
return toString(this->get(pos));
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
const TypeInfo& URange<MetaType>::type() const
|
||||
template <typename MetaT>
|
||||
const TypeInfo& URange<MetaT>::type() const
|
||||
{
|
||||
return typeid(URange<MetaType>);
|
||||
return typeid(URange<MetaT>);
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
const TypeInfo& URange<MetaType>::metaType() const
|
||||
template <typename MetaT>
|
||||
const TypeInfo& URange<MetaT>::metaType() const
|
||||
{
|
||||
return typeid(MetaType);
|
||||
return typeid(MetaT);
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
RangePtr URange<MetaType>::extend(const RangePtr& r) const
|
||||
template <typename MetaT>
|
||||
RangePtr URange<MetaT>::extend(const RangePtr& r) const
|
||||
{
|
||||
auto rx = rangeCast<URange<MetaType>>(r);
|
||||
auto rx = rangeCast<URange<MetaT>>(r);
|
||||
auto space = mSpace;
|
||||
space.insert(space.end(), rx->mSpace.begin(), rx->mSpace.end());
|
||||
return URangeFactory<MetaType>( space ).create();
|
||||
return URangeFactory<MetaT>( space ).create();
|
||||
}
|
||||
|
||||
template <typename MetaType>
|
||||
Vector<Uuid> URange<MetaType>::key() const
|
||||
template <typename MetaT>
|
||||
Vector<Uuid> URange<MetaT>::key() const
|
||||
{
|
||||
return Vector<Uuid> { this->id() };
|
||||
}
|
||||
|
@ -317,30 +330,30 @@ namespace CNORXZ
|
|||
* Range Casts *
|
||||
*******************/
|
||||
|
||||
template <typename MetaType>
|
||||
template <typename MetaT>
|
||||
struct URangeCast
|
||||
{
|
||||
template <typename T>
|
||||
static inline Sptr<URange<MetaType>> transform(const RangePtr& r)
|
||||
static inline Sptr<URange<MetaT>> transform(const RangePtr& r)
|
||||
{
|
||||
if(r->type() == typeid(URange<T>)){
|
||||
auto rr = std::dynamic_pointer_cast<URange<T>>(r);
|
||||
Vector<MetaType> v(rr->size());
|
||||
Vector<MetaT> v(rr->size());
|
||||
std::transform(rr->begin(), rr->end(), v.begin(),
|
||||
[](const T& x) { return static_cast<MetaType>(x); } );
|
||||
return std::dynamic_pointer_cast<URange<MetaType>>
|
||||
( URangeFactory<MetaType>(std::move(v)).create() );
|
||||
[](const T& x) { return static_cast<MetaT>(x); } );
|
||||
return std::dynamic_pointer_cast<URange<MetaT>>
|
||||
( URangeFactory<MetaT>(std::move(v)).create() );
|
||||
}
|
||||
else {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
static inline Sptr<URange<MetaType>> cast(const RangePtr& r)
|
||||
static inline Sptr<URange<MetaT>> cast(const RangePtr& r)
|
||||
{
|
||||
static_assert(std::is_fundamental<MetaType>::value, "got non-fundamental type");
|
||||
static_assert(std::is_fundamental<MetaT>::value, "got non-fundamental type");
|
||||
CXZ_ASSERT(r->dim() == 1, "range cast into URange<Int>: source range must have dim = 1, got " << r->dim());
|
||||
Sptr<URange<MetaType>> o = nullptr;
|
||||
Sptr<URange<MetaT>> o = nullptr;
|
||||
o = transform<SizeT>(r); if(o) return o;
|
||||
o = transform<Int>(r); if(o) return o;
|
||||
o = transform<LInt>(r); if(o) return o;
|
||||
|
@ -415,11 +428,11 @@ namespace CNORXZ
|
|||
};
|
||||
|
||||
|
||||
template <typename MetaType>
|
||||
Sptr<URange<MetaType>> RangeCast<URange<MetaType>>::func(const RangePtr& r)
|
||||
template <typename MetaT>
|
||||
Sptr<URange<MetaT>> RangeCast<URange<MetaT>>::func(const RangePtr& r)
|
||||
{
|
||||
if constexpr(std::is_fundamental<MetaType>::value or is_vector<MetaType>::value){
|
||||
return URangeCast<MetaType>::cast(r);
|
||||
if constexpr(std::is_fundamental<MetaT>::value or is_vector<MetaT>::value){
|
||||
return URangeCast<MetaT>::cast(r);
|
||||
}
|
||||
else {
|
||||
CXZ_ERROR("no range cast available for input range '" << r->type().name() << "'");
|
||||
|
|
|
@ -55,6 +55,8 @@ namespace CNORXZ
|
|||
UIndex& at(const MetaT& metaPos);
|
||||
decltype(auto) xpr(const Sptr<UIndex<MetaType>>& _this) const;
|
||||
|
||||
RangePtr prange(const UIndex<MetaType>& end) const;
|
||||
|
||||
SizeT deepFormat() const;
|
||||
/*
|
||||
template <class Index>
|
||||
|
@ -94,12 +96,13 @@ namespace CNORXZ
|
|||
RangePtr mRef;
|
||||
};
|
||||
|
||||
template <typename MetaType>
|
||||
class URange : public RangeInterface<URange<MetaType>>
|
||||
template <typename MetaT>
|
||||
class URange : public RangeInterface<URange<MetaT>>
|
||||
{
|
||||
public:
|
||||
typedef RangeBase RB;
|
||||
typedef UIndex<MetaType> IndexType;
|
||||
typedef UIndex<MetaT> IndexType;
|
||||
typedef MetaT MetaType;
|
||||
|
||||
friend URangeFactory<MetaType>;
|
||||
|
||||
|
|
|
@ -127,6 +127,12 @@ namespace CNORXZ
|
|||
return mI->stepSize(id);
|
||||
}
|
||||
|
||||
template <class Index, typename Meta>
|
||||
RangePtr XIndex<Index,Meta>::prange(const XIndexPtr& end) const
|
||||
{
|
||||
return mI->prange( *std::dynamic_pointer_cast<Index>(end) );
|
||||
}
|
||||
|
||||
template <class Index, typename Meta>
|
||||
Vector<SizeT> XIndex<Index,Meta>::deepFormat() const
|
||||
{
|
||||
|
|
|
@ -38,6 +38,7 @@ namespace CNORXZ
|
|||
virtual SizeT dim() const = 0;
|
||||
virtual RangePtr range() const = 0;
|
||||
virtual UPos stepSize(const IndexId<0>& id) const = 0;
|
||||
virtual RangePtr prange(const XIndexPtr& end) const = 0;
|
||||
virtual Vector<SizeT> deepFormat() const = 0;
|
||||
//virtual Vector<XIndexPtr> pack() const = 0;
|
||||
//virtual Vector<SizeT> format() const = 0;
|
||||
|
@ -92,6 +93,7 @@ namespace CNORXZ
|
|||
virtual SizeT dim() const override final;
|
||||
virtual RangePtr range() const override final;
|
||||
virtual UPos stepSize(const IndexId<0>& id) const override final;
|
||||
virtual RangePtr prange(const XIndexPtr& end) const override final;
|
||||
virtual Vector<SizeT> deepFormat() const override final;
|
||||
//virtual Vector<XIndexPtr> pack() const override final;
|
||||
//virtual Vector<SizeT> format() const override final;
|
||||
|
|
|
@ -66,6 +66,7 @@ namespace CNORXZ
|
|||
YIndex& operator()();
|
||||
|
||||
const DPack& pack() const;
|
||||
RangePtr prange(const YIndex& end) const;
|
||||
Vector<SizeT> deepFormat() const;
|
||||
const YFormat& format() const;
|
||||
const YFormat& lexFormat() const;
|
||||
|
@ -160,10 +161,7 @@ namespace CNORXZ
|
|||
static Sptr<YRange> func(const RangePtr& r);
|
||||
};
|
||||
|
||||
template <>
|
||||
RangePtr prange(const IndexInterface<YIndex,Vector<DType>>& begin,
|
||||
const IndexInterface<YIndex,Vector<DType>>& end);
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
|
||||
#include "ranges/ranges.h"
|
||||
#include "ranges/prange.h"
|
||||
#include "operation/operation.h"
|
||||
|
||||
namespace CNORXZ
|
||||
|
@ -115,6 +116,17 @@ namespace CNORXZ
|
|||
}
|
||||
return coproot(m.data(), _this);
|
||||
}
|
||||
|
||||
RangePtr CIndex::prange(const CIndex& end) const
|
||||
{
|
||||
CXZ_ASSERT(end > *this, "got end index position smaller than begin index position");
|
||||
const SizeT beginPos = lex();
|
||||
Vector<SizeT> parts(end.lex() - beginPos);
|
||||
for(auto i = *this; i != end; ++i){
|
||||
parts[i.lex()-beginPos] = i.lex();
|
||||
}
|
||||
return CNORXZ::prange(mRangePtr, parts);
|
||||
}
|
||||
|
||||
SizeT CIndex::deepFormat() const
|
||||
{
|
||||
|
|
|
@ -167,6 +167,11 @@ namespace CNORXZ
|
|||
return mI->xpr(_this->xptr());
|
||||
}
|
||||
|
||||
RangePtr DIndex::prange(const DIndex& end) const
|
||||
{
|
||||
return mI->prange( end.xptr() );
|
||||
}
|
||||
|
||||
Vector<SizeT> DIndex::deepFormat() const
|
||||
{
|
||||
return mI->deepFormat();
|
||||
|
|
|
@ -368,6 +368,17 @@ namespace CNORXZ
|
|||
return mIs;
|
||||
}
|
||||
|
||||
RangePtr YIndex::prange(const YIndex& end) const
|
||||
{
|
||||
CXZ_ASSERT(dim() == end.dim(), "end index has different number of dimensions ("
|
||||
<< end.dim() << ") than begin index (" << dim() << ")");
|
||||
Vector<RangePtr> v(dim());
|
||||
for(SizeT i = 0; i != dim(); ++i){
|
||||
v[i] = mIs[i]->prange( end.pack()[i] );
|
||||
}
|
||||
return YRangeFactory(v).create();
|
||||
}
|
||||
|
||||
Vector<SizeT> YIndex::deepFormat() const
|
||||
{
|
||||
Vector<Vector<SizeT>> dfv(mIs.size());
|
||||
|
@ -561,17 +572,4 @@ namespace CNORXZ
|
|||
return std::dynamic_pointer_cast<YRange>( YRangeFactory({r}).create() );
|
||||
}
|
||||
|
||||
template <>
|
||||
RangePtr prange(const IndexInterface<YIndex,Vector<DType>>& begin,
|
||||
const IndexInterface<YIndex,Vector<DType>>& end)
|
||||
{
|
||||
CXZ_WARNING("YRange specialization"); // test
|
||||
const SizeT dim = begin.range()->dim();
|
||||
Vector<RangePtr> v(dim);
|
||||
for(SizeT i = 0; i != dim; ++i){
|
||||
v[i] = prange( DIndex(begin.THIS().pack()[i]), DIndex(end.THIS().pack()[i]) );
|
||||
}
|
||||
return YRangeFactory(v).create();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue