fixes in dynamic index (ForMaker) + set offset of operation by given index

This commit is contained in:
Christian Zimmermann 2018-12-02 22:08:51 +01:00
parent 7331ff608f
commit bdabee1335
3 changed files with 52 additions and 16 deletions

View file

@ -185,6 +185,7 @@ namespace MultiArrayTools
{
//VCHECK(ma.data());
mIndex(indices...);
mOff = mIndex.pos();
}
template <typename T, class... Ranges>
@ -196,13 +197,17 @@ namespace MultiArrayTools
mMaPtr(maptr)
{
mIndex(indices...);
mOff = mIndex.pos();
}
template <typename T, class... Ranges>
ConstOperationRoot<T,Ranges...>::
ConstOperationRoot(const T* data, const IndexType& ind) :
mDataPtr(data),
mIndex( ind ) { }
mIndex( ind )
{
mOff = mIndex.pos();
}
template <typename T, class... Ranges>
template <class ET>
@ -335,13 +340,17 @@ namespace MultiArrayTools
mIndex( ma.begin() )
{
mIndex(indices...);
mOff = mIndex.pos();
}
template <typename T, class... Ranges>
OperationRoot<T,Ranges...>::
OperationRoot(T* data, const IndexType& ind) :
mDataPtr(data),
mIndex( ind ) { }
mIndex( ind )
{
mOff = mIndex.pos();
}
template <typename T, class... Ranges>
template <class OpClass>

View file

@ -201,10 +201,24 @@ namespace MultiArrayTools
return *this;
}
template <class EC>
DynamicIndex<EC>& DynamicIndex<EC>::sync()
{
size_t sv = 1;
IB::mPos = 0;
for(size_t i = 0; i != mIVec.size(); ++i){
auto& x = mIVec[mIVec.size()-i-1];
IB::mPos += x.first->pos() * sv;
sv *= x.first->max();
}
return *this;
}
template <class EC>
DynamicIndex<EC>& DynamicIndex<EC>::operator()(const IVecT& ivec)
{
mIVec = ivec;
sync();
return *this;
}
@ -215,6 +229,7 @@ namespace MultiArrayTools
for(size_t i = 0; i != mIVec.size(); ++i){
mIVec[i].first = ivec[i];
}
sync();
return *this;
}
@ -229,6 +244,7 @@ namespace MultiArrayTools
for(size_t i = 0; i != mIVec.size(); ++i){
mIVec[i].first = tmp[i];
}
sync();
return *this;
}
@ -349,17 +365,18 @@ namespace MultiArrayTools
const IVecT& ivec, bool hidden = false)
-> ExpressionHolder<Expr>
{
if(i != 0){
if(i == 0) {
auto& ii = *ivec[0].first;
return hidden ? ii.iforh(step*ivec[i].second, ex) :
ii.ifor(step*ivec[i].second, ex);
}
else {
auto& ii = *ivec[i].first;
return mk(i-1, step,
(hidden ? ii.iforh(step*ivec[i].second, ex) :
ii.ifor(step*ivec[i].second, ex)),
ivec, hidden);
}
else {
auto& ii = *ivec[0].first;
return hidden ? ii.iforh(step*ivec[i].second, ex) :
ii.ifor(step*ivec[i].second, ex);
}
}
};
@ -386,19 +403,27 @@ namespace MultiArrayTools
template <class Expr>
ExpressionHolder<Expr> DynamicIndex<EC>::ifor(size_t step, Expr ex) const
{
if(mIVec.size() == 1){
return mIVec.back().first->ifori(step,ex);
}
else {
return ForMaker<Expr>::mk(mIVec.size()-2, step, mIVec.back().first->ifori(step,ex),
mIVec);
}
}
template <class EC>
template <class Expr>
ExpressionHolder<Expr> DynamicIndex<EC>::iforh(size_t step, Expr ex) const
{
if(mIVec.size() == 1){
return mIVec.back().first->iforhi(step,ex);
}
else {
return ForMaker<Expr>::mk(mIVec.size()-2, step, mIVec.back().first->iforhi(step,ex),
mIVec, true);
}
}
/***********************
* DynamicRange *

View file

@ -202,6 +202,8 @@ namespace MultiArrayTools
template <class... Indices>
DynamicIndex& operator()(const std::shared_ptr<Indices>&... is);
DynamicIndex<EC>& sync();
int pp(std::intptr_t idxPtrNum);
int mm(std::intptr_t idxPtrNum);