some improvements... certainly further ones are possible
This commit is contained in:
parent
5492521c76
commit
1c55afd55f
6 changed files with 76 additions and 105 deletions
|
@ -18,7 +18,7 @@ namespace MultiArrayTools
|
||||||
size_t IndefinitIndexBase::pos() const
|
size_t IndefinitIndexBase::pos() const
|
||||||
{
|
{
|
||||||
//assert(not virt());
|
//assert(not virt());
|
||||||
return mPos;
|
return static_cast<size_t>( mPos );
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& IndefinitIndexBase::name() const
|
const std::string& IndefinitIndexBase::name() const
|
||||||
|
@ -85,18 +85,32 @@ namespace MultiArrayTools
|
||||||
{
|
{
|
||||||
//assert(not virt());
|
//assert(not virt());
|
||||||
mPos = pos;
|
mPos = pos;
|
||||||
//evalMajor();
|
|
||||||
if(linked()){
|
if(linked()){
|
||||||
mLinked->setPos(mPos);
|
mLinked->setPos(mPos);
|
||||||
mLinked->evalMajor();
|
mLinked->evalMajor();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t IndefinitIndexBase::outOfRange() const
|
void IndefinitIndexBase::setPosRel(int relPos)
|
||||||
{
|
{
|
||||||
//assert(not virt());
|
mPos += relPos;
|
||||||
int res = pos() - max() + 1;
|
if(linked()){
|
||||||
return res > 0 ? static_cast<size_t>(res) : 0;
|
mLinked->setPosRel(relPos);
|
||||||
|
mLinked->evalMajor(relPos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int IndefinitIndexBase::outOfRange() const
|
||||||
|
{
|
||||||
|
if(mPos < 0){
|
||||||
|
return mPos;
|
||||||
|
}
|
||||||
|
else if(mPos >= static_cast<int>( max() ) ){
|
||||||
|
return mPos - max() + 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IndefinitIndexBase::toNull() const
|
bool IndefinitIndexBase::toNull() const
|
||||||
|
@ -115,13 +129,13 @@ namespace MultiArrayTools
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IndefinitIndexBase::evalMajor(size_t stepSize, int num)
|
void IndefinitIndexBase::evalMajor(int num)
|
||||||
{
|
{
|
||||||
//assert(not virt());
|
//assert(not virt());
|
||||||
//CHECK;
|
//CHECK;
|
||||||
if(not master()){
|
if(not master()){
|
||||||
//int start = mMajor->pos();
|
//int start = mMajor->pos();
|
||||||
mMajor->setPos( num * stepSize , this);
|
mMajor->setPosRel( num * mMajorStep);
|
||||||
//VCHECK(static_cast<int>( mMajor->pos() ) - start);
|
//VCHECK(static_cast<int>( mMajor->pos() ) - start);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,16 +50,16 @@ namespace MultiArrayTools
|
||||||
|
|
||||||
// does NOT include sub-index update routine !!
|
// does NOT include sub-index update routine !!
|
||||||
// relative position to current
|
// relative position to current
|
||||||
virtual void setPos(int relPos, IndefinitIndexBase* subIndex) = 0;
|
virtual void setPosRel(int relPos);
|
||||||
|
|
||||||
virtual size_t max() const = 0;
|
virtual size_t max() const = 0;
|
||||||
virtual size_t outOfRange() const;
|
virtual int outOfRange() const;
|
||||||
|
|
||||||
virtual bool toNull() const;
|
virtual bool toNull() const;
|
||||||
|
|
||||||
virtual void eval() = 0;
|
virtual void eval() = 0;
|
||||||
virtual void evalMajor();
|
virtual void evalMajor();
|
||||||
virtual void evalMajor(size_t stepSize, int num);
|
virtual void evalMajor(int num);
|
||||||
virtual bool master();
|
virtual bool master();
|
||||||
|
|
||||||
virtual void subOrd(IndefinitIndexBase* major);
|
virtual void subOrd(IndefinitIndexBase* major);
|
||||||
|
@ -72,7 +72,7 @@ namespace MultiArrayTools
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
std::string mName;
|
std::string mName;
|
||||||
size_t mPos;
|
int mPos;
|
||||||
size_t mMajorStep;
|
size_t mMajorStep;
|
||||||
|
|
||||||
IndefinitIndexBase* mLinked = nullptr;
|
IndefinitIndexBase* mLinked = nullptr;
|
||||||
|
|
|
@ -78,14 +78,19 @@ namespace MultiArrayTools
|
||||||
inline void plus(MultiIndex& index, size_t digit, int num)
|
inline void plus(MultiIndex& index, size_t digit, int num)
|
||||||
{
|
{
|
||||||
IndefinitIndexBase& si = index.get(digit);
|
IndefinitIndexBase& si = index.get(digit);
|
||||||
//si.setPos( num, &index );
|
si.setPosRel(num);
|
||||||
//si.setPos( -num, &index );
|
//si.setPos( si.pos() + num );
|
||||||
si.setPos( si.pos() + num );
|
|
||||||
size_t oor = si.outOfRange();
|
size_t oor = si.outOfRange();
|
||||||
if(oor and digit != 0){
|
if(digit){
|
||||||
|
if(oor > 0){
|
||||||
plus(index, digit - 1, 1);
|
plus(index, digit - 1, 1);
|
||||||
plus(index, digit, -si.max());
|
plus(index, digit, -si.max());
|
||||||
}
|
}
|
||||||
|
else if(oor < 0){
|
||||||
|
plus(index, digit - 1, -1);
|
||||||
|
plus(index, digit, si.max());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <size_t N>
|
template <size_t N>
|
||||||
|
@ -273,6 +278,35 @@ namespace MultiArrayTools
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <size_t N>
|
||||||
|
struct IndexPackSetter
|
||||||
|
{
|
||||||
|
template <class IndexPack>
|
||||||
|
static void setIndexPack(IndexPack& iPack, size_t pos)
|
||||||
|
{
|
||||||
|
auto i = std::get<N>(iPack);
|
||||||
|
const size_t ownPos = pos % i.max();
|
||||||
|
i = ownPos;
|
||||||
|
if(ownPos == pos){
|
||||||
|
IndexPackSetter<N-1>::setIndexPack(iPack, (pos - ownPos) / i.max() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct IndexPackSetter<0>
|
||||||
|
{
|
||||||
|
template <class IndexPack>
|
||||||
|
static void setIndexPack(IndexPack& iPack, size_t pos)
|
||||||
|
{
|
||||||
|
auto i = std::get<0>(iPack);
|
||||||
|
const size_t ownPos = pos % i.max();
|
||||||
|
i = ownPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class... Indices>
|
template <class... Indices>
|
||||||
|
@ -324,46 +358,35 @@ namespace MultiArrayTools
|
||||||
IIB::mPos = evaluate(*this);
|
IIB::mPos = evaluate(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
template <class... Indices>
|
|
||||||
MultiIndex<Indices...>::~MultiIndex()
|
|
||||||
{
|
|
||||||
IndexSubOrder<sizeof...(Indices)-1>::subOrd(mIPack, nullptr);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
template <class... Indices>
|
template <class... Indices>
|
||||||
MultiIndex<Indices...>& MultiIndex<Indices...>::operator++()
|
MultiIndex<Indices...>& MultiIndex<Indices...>::operator++()
|
||||||
{
|
{
|
||||||
//CHECK;
|
|
||||||
plus(*this, sizeof...(Indices)-1, 1);
|
plus(*this, sizeof...(Indices)-1, 1);
|
||||||
setPos(1, this);
|
IIB::setPosRel(1);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class... Indices>
|
template <class... Indices>
|
||||||
MultiIndex<Indices...>& MultiIndex<Indices...>::operator--()
|
MultiIndex<Indices...>& MultiIndex<Indices...>::operator--()
|
||||||
{
|
{
|
||||||
// !!! >|< (0 does not make sense)
|
plus(*this, sizeof...(Indices)-1, -1);
|
||||||
plus(*this, 0, -1);
|
IIB::setPosRel(-1);
|
||||||
setPos(-1, this);
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class... Indices>
|
template <class... Indices>
|
||||||
MultiIndex<Indices...>& MultiIndex<Indices...>::operator+=(int n)
|
MultiIndex<Indices...>& MultiIndex<Indices...>::operator+=(int n)
|
||||||
{
|
{
|
||||||
//CHECK;
|
plus(*this, sizeof...(Indices)-1, n);
|
||||||
plus(*this, sizeof...(Indices)-1, 1);
|
IIB::setPosRel(n);
|
||||||
setPos(n, this);
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class... Indices>
|
template <class... Indices>
|
||||||
MultiIndex<Indices...>& MultiIndex<Indices...>::operator-=(int n)
|
MultiIndex<Indices...>& MultiIndex<Indices...>::operator-=(int n)
|
||||||
{
|
{
|
||||||
// !!! >|<
|
plus(*this, sizeof...(Indices)-1, -n);
|
||||||
plus(*this, 0, 0-n);
|
IIB::setPosRel(-n);
|
||||||
setPos(-n, this);
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -383,7 +406,7 @@ namespace MultiArrayTools
|
||||||
IndefinitIndexBase& MultiIndex<Indices...>::operator=(size_t pos)
|
IndefinitIndexBase& MultiIndex<Indices...>::operator=(size_t pos)
|
||||||
{
|
{
|
||||||
IIB::setPos( pos );
|
IIB::setPos( pos );
|
||||||
//setIndexPack(mIPack, pos); // -> implement !!!
|
IndexPackSetter<sizeof...(Indices)-1>::setIndexPack(mIPack, pos);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,17 +594,6 @@ namespace MultiArrayTools
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class... Indices>
|
|
||||||
void MultiIndex<Indices...>::setPos(int relPos, IndefinitIndexBase* subIndex)
|
|
||||||
{
|
|
||||||
IIB::mPos += relPos;
|
|
||||||
IIB::evalMajor(IIB::mMajorStep, relPos);
|
|
||||||
if(IIB::linked()){
|
|
||||||
IIB::mLinked->setPos(relPos, subIndex);
|
|
||||||
//IIB::mLinked->evalMajor(IIB::mMajorStep, relPos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class... Indices>
|
template <class... Indices>
|
||||||
size_t MultiIndex<Indices...>::giveSubStepSize(IndefinitIndexBase* subIndex)
|
size_t MultiIndex<Indices...>::giveSubStepSize(IndefinitIndexBase* subIndex)
|
||||||
{
|
{
|
||||||
|
@ -601,48 +613,6 @@ namespace MultiArrayTools
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
template <class... Indices>
|
|
||||||
void MultiIndex<Indices...>::eval()
|
|
||||||
{
|
|
||||||
IIB::setPos( evaluate( *this ) );
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
template <size_t N>
|
|
||||||
struct RangeAssigner
|
|
||||||
{
|
|
||||||
template <class... Indices>
|
|
||||||
static void assignRange(const RangeBase<MultiIndex<Indices...> >& multiRange,
|
|
||||||
MultiIndex<Indices...>& multiIndex)
|
|
||||||
{
|
|
||||||
multiIndex.template getIndex<N>().assignRange(nullptr &multiRange.template getRange<N>());
|
|
||||||
RangeAssigner<N-1>::assignRange(multiRange, multiIndex);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct RangeAssigner<0>
|
|
||||||
{
|
|
||||||
template <class... Indices>
|
|
||||||
static void assignRange(const RangeBase<MultiIndex<Indices...> >& multiRange,
|
|
||||||
MultiIndex<Indices...>& multiIndex)
|
|
||||||
{
|
|
||||||
multiIndex.template getIndex<0>().assignRange(nullptr &multiRange.template getRange<0>());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class... Indices>
|
|
||||||
void MultiIndex<Indices...>::assignRange(RangeBase<MultiIndex<Indices...> > const* range)
|
|
||||||
{
|
|
||||||
if(IB::toNull()){
|
|
||||||
IB::mRange = range;
|
|
||||||
}
|
|
||||||
MultiIndex<Indices...>& thisRef = *this;
|
|
||||||
RangeAssigner<sizeof...(Indices)-1>::assignRange(*range, thisRef);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
/******************
|
/******************
|
||||||
* MultiRange *
|
* MultiRange *
|
||||||
******************/
|
******************/
|
||||||
|
|
|
@ -85,7 +85,6 @@ namespace MultiArrayTools
|
||||||
virtual void copyPos(const MultiIndex<Indices...>& in) override;
|
virtual void copyPos(const MultiIndex<Indices...>& in) override;
|
||||||
|
|
||||||
virtual IndefinitIndexBase* getLinked(const std::string& name) override;
|
virtual IndefinitIndexBase* getLinked(const std::string& name) override;
|
||||||
virtual void setPos(int relPos, IndefinitIndexBase* subIndex) override;
|
|
||||||
virtual size_t giveSubStepSize(IndefinitIndexBase* subIndex) override;
|
virtual size_t giveSubStepSize(IndefinitIndexBase* subIndex) override;
|
||||||
|
|
||||||
//virtual void eval() override;
|
//virtual void eval() override;
|
||||||
|
|
|
@ -110,13 +110,13 @@ namespace MultiArrayTools
|
||||||
template <typename U, RangeType TYPE>
|
template <typename U, RangeType TYPE>
|
||||||
bool SingleIndex<U,TYPE>::operator==(const SingleIndex<U,TYPE>& i)
|
bool SingleIndex<U,TYPE>::operator==(const SingleIndex<U,TYPE>& i)
|
||||||
{
|
{
|
||||||
return IB::mRange == i.mRange and IIB::pos() == i.mPos;
|
return IB::mRange == i.mRange and IIB::pos() == static_cast<size_t>( i.mPos );
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename U, RangeType TYPE>
|
template <typename U, RangeType TYPE>
|
||||||
bool SingleIndex<U,TYPE>::operator!=(const SingleIndex<U,TYPE>& i)
|
bool SingleIndex<U,TYPE>::operator!=(const SingleIndex<U,TYPE>& i)
|
||||||
{
|
{
|
||||||
return IB::mRange != i.mRange or IIB::pos() != i.mPos;
|
return IB::mRange != i.mRange or IIB::pos() != static_cast<size_t>( i.mPos );
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename U, RangeType TYPE>
|
template <typename U, RangeType TYPE>
|
||||||
|
@ -173,17 +173,6 @@ namespace MultiArrayTools
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename U, RangeType TYPE>
|
|
||||||
void SingleIndex<U,TYPE>::setPos(int relPos, IndefinitIndexBase* subIndex)
|
|
||||||
{
|
|
||||||
IIB::mPos += relPos;
|
|
||||||
IIB::evalMajor(IIB::mMajorStep, relPos);
|
|
||||||
if(IIB::linked()){
|
|
||||||
IIB::mLinked->setPos(relPos, subIndex);
|
|
||||||
//IIB::mLinked->evalMajor(IIB::mMajorStep, relPos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename U, RangeType TYPE>
|
template <typename U, RangeType TYPE>
|
||||||
size_t SingleIndex<U,TYPE>::giveSubStepSize(IndefinitIndexBase* subIndex)
|
size_t SingleIndex<U,TYPE>::giveSubStepSize(IndefinitIndexBase* subIndex)
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,7 +52,6 @@ namespace MultiArrayTools
|
||||||
virtual void copyPos(const SingleIndex& in) override;
|
virtual void copyPos(const SingleIndex& in) override;
|
||||||
|
|
||||||
virtual IndefinitIndexBase* getLinked(const std::string& name) override;
|
virtual IndefinitIndexBase* getLinked(const std::string& name) override;
|
||||||
virtual void setPos(int relPos, IndefinitIndexBase* subIndex) override;
|
|
||||||
virtual size_t giveSubStepSize(IndefinitIndexBase* subIndex) override;
|
virtual size_t giveSubStepSize(IndefinitIndexBase* subIndex) override;
|
||||||
|
|
||||||
//virtual void eval() override;
|
//virtual void eval() override;
|
||||||
|
|
Loading…
Reference in a new issue