srange.cc.h (casts missing...)
This commit is contained in:
parent
3c98377e2d
commit
3f8c7aacc3
1 changed files with 294 additions and 0 deletions
294
src/include/ranges/srange.cc.h
Normal file
294
src/include/ranges/srange.cc.h
Normal file
|
@ -0,0 +1,294 @@
|
||||||
|
|
||||||
|
#ifndef __cxz_range_cc_h__
|
||||||
|
#define __cxz_range_cc_h__
|
||||||
|
|
||||||
|
#include "srange.h"
|
||||||
|
|
||||||
|
namespace CNORXZ
|
||||||
|
{
|
||||||
|
/**************
|
||||||
|
* SIndex *
|
||||||
|
**************/
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SIndex<Meta,S>::SIndex(const RangePtr& range, SizeT pos) :
|
||||||
|
IndexInterface<SIndex<MetaT,S>,MetaT>(pos),
|
||||||
|
mRangePtr(rangeCast<RangeType>(range)),
|
||||||
|
mMetaPtr(&mRangePtr->get(0))
|
||||||
|
{
|
||||||
|
CXZ_ASSERT(mRangePtr->size() == S, "got range of size " << mRangePtr->size()
|
||||||
|
<< ", expected " << S);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SIndex& SIndex<Meta,S>::operator=(SizeT lexpos)
|
||||||
|
{
|
||||||
|
IB::mPos = lexpos;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SIndex& SIndex<Meta,S>::operator++()
|
||||||
|
{
|
||||||
|
++IB::mPos;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SIndex& SIndex<Meta,S>::operator--()
|
||||||
|
{
|
||||||
|
--IB::mPos;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SIndex SIndex<Meta,S>::operator+(Int n) const
|
||||||
|
{
|
||||||
|
return SIndex(mRangePtr, IB::mPos + n);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SIndex SIndex<Meta,S>::operator-(Int n) const
|
||||||
|
{
|
||||||
|
return SIndex(mRangePtr, IB::mPos - n);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SIndex& SIndex<Meta,S>::operator+=(Int n)
|
||||||
|
{
|
||||||
|
IB::mPos += n;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SIndex& SIndex<Meta,S>::operator-=(Int n)
|
||||||
|
{
|
||||||
|
IB::mPos -= n;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SizeT SIndex<Meta,S>::lex() const
|
||||||
|
{
|
||||||
|
return IB::mPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SPos<S> SIndex<Meta,S>::pmax() const
|
||||||
|
{
|
||||||
|
return SPos<S>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SPos<S> SIndex<Meta,S>::lmax() const
|
||||||
|
{
|
||||||
|
return SPos<S>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
IndexId<0> SIndex<Meta,S>::id() const
|
||||||
|
{
|
||||||
|
return IndexId<0>(this->ptrId());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
const MetaT& SIndex<Meta,S>::operator*() const
|
||||||
|
{
|
||||||
|
return mMetaPtr[IB::mPos];
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SizeT SIndex<Meta,S>::dim() const
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
Sptr<RangeType> SIndex<Meta,S>::range() const
|
||||||
|
{
|
||||||
|
return mRangePtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
template <SizeT I>
|
||||||
|
UPos SIndex<Meta,S>::stepSize(const IndexId<I>& id) const
|
||||||
|
{
|
||||||
|
return UPos(id == this->id() ? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
String SIndex<Meta,S>::stringMeta() const
|
||||||
|
{
|
||||||
|
return toString(this->meta());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
const MetaT& SIndex<Meta,S>::meta() const
|
||||||
|
{
|
||||||
|
return mMetaPtr[IB::mPos];
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
SIndex& SIndex<Meta,S>::at(const MetaT& metaPos)
|
||||||
|
{
|
||||||
|
(*this) = mRangePtr->getMeta(metaPos);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
decltype(auto) SIndex<Meta,S>::xpr(const Sptr<SIndex<MetaType,S>>& _this) const
|
||||||
|
{
|
||||||
|
return coproot(mMetaPtr,_this);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
template <class Index>
|
||||||
|
decltype(auto) SIndex<Meta,S>::format(const Sptr<Index>& ind) const
|
||||||
|
{
|
||||||
|
return ind;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
template <class Index>
|
||||||
|
decltype(auto) SIndex<Meta,S>::slice(const Sptr<Index>& ind) const
|
||||||
|
{
|
||||||
|
if(ind != nullptr){
|
||||||
|
if(ind->dim() != 0) {
|
||||||
|
return Sptr<SIndex<MetaType,S>>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return std::make_shared<SIndex<MetaType,S>>(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
template <class Xpr, class F>
|
||||||
|
decltype(auto) SIndex<Meta,S>::ifor(const Xpr& xpr, F&& f) const
|
||||||
|
{
|
||||||
|
return SFor<S,0,Xpr,F>(this->id(), xpr, std::forward<F>(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S, class I1>
|
||||||
|
decltype(auto) operator*(const Sptr<SIndex<MetaType,S>>& a, const Sptr<I1>& b)
|
||||||
|
{
|
||||||
|
return iptrMul(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*********************
|
||||||
|
* SRangeFactory *
|
||||||
|
*********************/
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S>
|
||||||
|
SRangeFactory<MetaType,S>::SRangeFactory(const Arr<MetaType,S>& space) :
|
||||||
|
mSpace(space) {}
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S>
|
||||||
|
SRangeFactory<MetaType,S>::SRangeFactory(Arr<MetaType,S>&& space)
|
||||||
|
mSpace(std::forward<Arr<MetaType,S>>(space)) {}
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S>
|
||||||
|
SRangeFactory<MetaType,S>::SRangeFactory(const Arr<MetaType,S>& space, const RangePtr& ref) :
|
||||||
|
mSpace(space), mRef(ref) {}
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S>
|
||||||
|
SRangeFactory<MetaType,S>::SRangeFactory(Arr<MetaType,S>&& space, const RangePtr& ref) :
|
||||||
|
mSpace(std::forward<Arr<MetaType,S>>(space)), mRef(ref) {}
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S>
|
||||||
|
void SRangeFactory<MetaType,S>::make()
|
||||||
|
{
|
||||||
|
const auto& info = typeid(SRange<MetaType,S>);
|
||||||
|
if(mRef != nullptr) {
|
||||||
|
mProd = this->fromCreated(info, {mRef->id()});
|
||||||
|
}
|
||||||
|
if(mProd == nullptr){
|
||||||
|
RangePtr key = mProd = std::shared_ptr<SRange<MetaType,S>>
|
||||||
|
( new SRange<MetaType,S>( std::move(mSpace) ) );
|
||||||
|
if(mRef != nullptr) { key = mRef; }
|
||||||
|
this->addToCreated(info, { key->id() }, mProd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************
|
||||||
|
* SRange *
|
||||||
|
**************/
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S>
|
||||||
|
SRange<MetaType,S>::SRange(const Arr<MetaType,S>& space) :
|
||||||
|
RangeInterface<SRange<MetaType,S>>(),
|
||||||
|
mSpace(space)
|
||||||
|
{
|
||||||
|
std::sort(mSpace.begin(), mSpace.end(), std::less<MetaType>());
|
||||||
|
auto itdupl = std::adjacent_find(mSpace.begin(), mSpace.end());
|
||||||
|
CXZ_ASSERT(itdupl == mSpace.end(), "found duplicate: " << *itdupl);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S>
|
||||||
|
SRange<MetaType,S>::SRange(Arr<MetaType,S>&& space) :
|
||||||
|
RangeInterface<SRange<MetaType,S>>(),
|
||||||
|
mSpace(std::forward<Arr<MetaType,S>>(space))
|
||||||
|
{
|
||||||
|
std::sort(mSpace.begin(), mSpace.end(), std::less<MetaType>());
|
||||||
|
auto itdupl = std::adjacent_find(mSpace.begin(), mSpace.end());
|
||||||
|
CXZ_ASSERT(itdupl == mSpace.end(), "found duplicate: " << *itdupl);
|
||||||
|
}
|
||||||
|
|
||||||
|
SizeT SRange<MetaType,S>::size() const
|
||||||
|
{
|
||||||
|
return S;
|
||||||
|
}
|
||||||
|
|
||||||
|
SizeT SRange<MetaType,S>::dim() const
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
String SRange<MetaType,S>::stringMeta(SizeT pos) const
|
||||||
|
{
|
||||||
|
return toString(mSpace[pos]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const TypeInfo& SRange<MetaType,S>::type() const
|
||||||
|
{
|
||||||
|
return typeid(SRange<MetaType,S>);
|
||||||
|
}
|
||||||
|
|
||||||
|
const TypeInfo& SRange<MetaType,S>::metaType() const
|
||||||
|
{
|
||||||
|
return typeid(MetaType);
|
||||||
|
}
|
||||||
|
|
||||||
|
RangePtr SRange<MetaType,S>::extend(const RangePtr& r) const
|
||||||
|
{
|
||||||
|
// TODO: check for selected static sizes of SRange -> return SRange!!!
|
||||||
|
auto rx = rangeCast<URange<MetaType>>(r);
|
||||||
|
Vector<MetaType> space(mSpace.begin(), mSpace.end());
|
||||||
|
space.insert(space.end(), rx->mSpace.begin(), rx->mSpace.end());
|
||||||
|
return URangeFactory<MetaType>( space ).create();
|
||||||
|
}
|
||||||
|
|
||||||
|
const MetaType& SRange<MetaType,S>::get(SizeT pos) const;
|
||||||
|
{
|
||||||
|
return mSpace[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
const MetaType* SRange<MetaType,S>::get() const;
|
||||||
|
{
|
||||||
|
return mSpace.data();
|
||||||
|
}
|
||||||
|
|
||||||
|
SizeT SRange<MetaType,S>::getMeta(const MetaType& metaPos) const;
|
||||||
|
{
|
||||||
|
auto b = mSpace.begin();
|
||||||
|
auto e = mSpace.end();
|
||||||
|
return std::lower_bound(b, e, meta, std::less<MetaType>()) - b;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector<Uuid> SRange<MetaType,S>::key() const
|
||||||
|
{
|
||||||
|
return Vector<Uuid> { this->id() };
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue