index prototype in each ma instance + simplify op-index initialization procedure
This commit is contained in:
parent
516f2ed3a4
commit
219a267995
4 changed files with 51 additions and 71 deletions
|
@ -60,7 +60,7 @@ namespace MultiArrayTools
|
||||||
protected:
|
protected:
|
||||||
bool mInit = false;
|
bool mInit = false;
|
||||||
std::shared_ptr<CRange> mRange;
|
std::shared_ptr<CRange> mRange;
|
||||||
|
std::shared_ptr<IndexType> mProtoI;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T, class... SRanges>
|
template <typename T, class... SRanges>
|
||||||
|
@ -116,6 +116,7 @@ namespace MultiArrayTools
|
||||||
{
|
{
|
||||||
ContainerRangeFactory<T,SRanges...> crf(ranges...);
|
ContainerRangeFactory<T,SRanges...> crf(ranges...);
|
||||||
mRange = std::dynamic_pointer_cast<ContainerRange<T,SRanges...> >( crf.create() );
|
mRange = std::dynamic_pointer_cast<ContainerRange<T,SRanges...> >( crf.create() );
|
||||||
|
mProtoI = std::make_shared<IndexType>( mRange );
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class... SRanges>
|
template <typename T, class... SRanges>
|
||||||
|
@ -123,6 +124,7 @@ namespace MultiArrayTools
|
||||||
{
|
{
|
||||||
ContainerRangeFactory<T,SRanges...> crf(space);
|
ContainerRangeFactory<T,SRanges...> crf(space);
|
||||||
mRange = std::dynamic_pointer_cast<ContainerRange<T,SRanges...> >( crf.create() );
|
mRange = std::dynamic_pointer_cast<ContainerRange<T,SRanges...> >( crf.create() );
|
||||||
|
mProtoI = std::make_shared<IndexType>( mRange );
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class... SRanges>
|
template <typename T, class... SRanges>
|
||||||
|
@ -134,14 +136,17 @@ namespace MultiArrayTools
|
||||||
template <typename T, class... SRanges>
|
template <typename T, class... SRanges>
|
||||||
typename MultiArrayBase<T,SRanges...>::IndexType MultiArrayBase<T,SRanges...>::begin() const
|
typename MultiArrayBase<T,SRanges...>::IndexType MultiArrayBase<T,SRanges...>::begin() const
|
||||||
{
|
{
|
||||||
IndexType i = mRange->begin();
|
IndexType i(*mProtoI);
|
||||||
|
i = 0;
|
||||||
return i.setData(data());
|
return i.setData(data());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class... SRanges>
|
template <typename T, class... SRanges>
|
||||||
typename MultiArrayBase<T,SRanges...>::IndexType MultiArrayBase<T,SRanges...>::end() const
|
typename MultiArrayBase<T,SRanges...>::IndexType MultiArrayBase<T,SRanges...>::end() const
|
||||||
{
|
{
|
||||||
IndexType i = mRange->end();
|
IndexType i(*mProtoI);
|
||||||
|
i = i.max();
|
||||||
|
//i = mRange->size();
|
||||||
return i.setData(data());
|
return i.setData(data());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,7 +154,8 @@ namespace MultiArrayTools
|
||||||
typename MultiArrayBase<T,SRanges...>::IndexType
|
typename MultiArrayBase<T,SRanges...>::IndexType
|
||||||
MultiArrayBase<T,SRanges...>::beginIndex() const
|
MultiArrayBase<T,SRanges...>::beginIndex() const
|
||||||
{
|
{
|
||||||
IndexType i = mRange->begin();
|
IndexType i(*mProtoI);
|
||||||
|
i = 0;
|
||||||
return i.setData(data());
|
return i.setData(data());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,7 +163,9 @@ namespace MultiArrayTools
|
||||||
typename MultiArrayBase<T,SRanges...>::IndexType
|
typename MultiArrayBase<T,SRanges...>::IndexType
|
||||||
MultiArrayBase<T,SRanges...>::endIndex() const
|
MultiArrayBase<T,SRanges...>::endIndex() const
|
||||||
{
|
{
|
||||||
IndexType i = mRange->end();
|
IndexType i(*mProtoI);
|
||||||
|
i = i.max();
|
||||||
|
//i = mRange->size();
|
||||||
return i.setData(data());
|
return i.setData(data());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -95,13 +95,15 @@ namespace MultiArrayTools
|
||||||
typedef T value_type;
|
typedef T value_type;
|
||||||
typedef OperationBase<T> OB;
|
typedef OperationBase<T> OB;
|
||||||
typedef ContainerRange<T,Ranges...> CRange;
|
typedef ContainerRange<T,Ranges...> CRange;
|
||||||
typedef typename MultiRange<Ranges...>::IndexType IndexType;
|
typedef ContainerIndex<T,typename Ranges::IndexType...> IndexType;
|
||||||
|
//typedef typename MultiRange<Ranges...>::IndexType IndexType;
|
||||||
|
|
||||||
OperationMaster(MutableMultiArrayBase<T,Ranges...>& ma, const OpClass& second,
|
OperationMaster(MutableMultiArrayBase<T,Ranges...>& ma, const OpClass& second,
|
||||||
std::shared_ptr<typename CRange::IndexType>& index);
|
IndexType& index);
|
||||||
|
|
||||||
OperationMaster(MutableMultiArrayBase<T,Ranges...>& ma, const OpClass& second,
|
OperationMaster(MutableMultiArrayBase<T,Ranges...>& ma, const OpClass& second,
|
||||||
std::shared_ptr<typename CRange::IndexType>& index,
|
//std::shared_ptr<IndexType>& index,
|
||||||
|
IndexType& index,
|
||||||
const IndexInfo* blockIndex);
|
const IndexInfo* blockIndex);
|
||||||
|
|
||||||
inline void set(size_t pos, T val) { mDataPtr[pos] = val; }
|
inline void set(size_t pos, T val) { mDataPtr[pos] = val; }
|
||||||
|
@ -110,12 +112,11 @@ namespace MultiArrayTools
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::shared_ptr<IndexType> mkIndex(std::shared_ptr<typename CRange::IndexType>& index);
|
|
||||||
void performAssignment(std::intptr_t blockIndexNum);
|
void performAssignment(std::intptr_t blockIndexNum);
|
||||||
OpClass const& mSecond;
|
OpClass const& mSecond;
|
||||||
MutableMultiArrayBase<T,Ranges...>& mArrayRef;
|
MutableMultiArrayBase<T,Ranges...>& mArrayRef;
|
||||||
T* mDataPtr;
|
T* mDataPtr;
|
||||||
std::shared_ptr<IndexType> mIndex;
|
IndexType mIndex;
|
||||||
IndexInfo mIInfo;
|
IndexInfo mIInfo;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -130,7 +131,7 @@ namespace MultiArrayTools
|
||||||
typedef OperationBase<T> OB;
|
typedef OperationBase<T> OB;
|
||||||
typedef OperationTemplate<T,ConstOperationRoot<T,Ranges...> > OT;
|
typedef OperationTemplate<T,ConstOperationRoot<T,Ranges...> > OT;
|
||||||
typedef ContainerRange<T,Ranges...> CRange;
|
typedef ContainerRange<T,Ranges...> CRange;
|
||||||
typedef typename CRange::IndexType IndexType;
|
typedef ContainerIndex<T,typename Ranges::IndexType...> IndexType;
|
||||||
|
|
||||||
static constexpr size_t SIZE = 1;
|
static constexpr size_t SIZE = 1;
|
||||||
|
|
||||||
|
@ -147,13 +148,10 @@ namespace MultiArrayTools
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::shared_ptr<IndexType>
|
|
||||||
mkIndex(const MultiArrayBase<T,Ranges...>& ma,
|
|
||||||
const std::shared_ptr<typename Ranges::IndexType>&... indices);
|
|
||||||
|
|
||||||
MultiArrayBase<T,Ranges...> const& mArrayRef;
|
MultiArrayBase<T,Ranges...> const& mArrayRef;
|
||||||
const T* mDataPtr;
|
const T* mDataPtr;
|
||||||
std::shared_ptr<IndexType> mIndex;
|
//std::shared_ptr<IndexType> mIndex;
|
||||||
|
IndexType mIndex;
|
||||||
IndexInfo mIInfo;
|
IndexInfo mIInfo;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -166,7 +164,7 @@ namespace MultiArrayTools
|
||||||
typedef OperationBase<T> OB;
|
typedef OperationBase<T> OB;
|
||||||
typedef OperationTemplate<T,OperationRoot<T,Ranges...> > OT;
|
typedef OperationTemplate<T,OperationRoot<T,Ranges...> > OT;
|
||||||
typedef ContainerRange<T,Ranges...> CRange;
|
typedef ContainerRange<T,Ranges...> CRange;
|
||||||
typedef typename CRange::IndexType IndexType;
|
typedef ContainerIndex<T,typename Ranges::IndexType...> IndexType;
|
||||||
|
|
||||||
static constexpr size_t SIZE = 1;
|
static constexpr size_t SIZE = 1;
|
||||||
|
|
||||||
|
@ -186,13 +184,9 @@ namespace MultiArrayTools
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::shared_ptr<IndexType>
|
|
||||||
mkIndex(const MultiArrayBase<T,Ranges...>& ma,
|
|
||||||
const std::shared_ptr<typename Ranges::IndexType>&... indices);
|
|
||||||
|
|
||||||
MutableMultiArrayBase<T,Ranges...>& mArrayRef;
|
MutableMultiArrayBase<T,Ranges...>& mArrayRef;
|
||||||
T* mDataPtr;
|
T* mDataPtr;
|
||||||
std::shared_ptr<IndexType> mIndex;
|
IndexType mIndex;
|
||||||
IndexInfo mIInfo;
|
IndexInfo mIInfo;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -387,9 +381,9 @@ namespace MultiArrayTools
|
||||||
template <typename T, class OpClass, class... Ranges>
|
template <typename T, class OpClass, class... Ranges>
|
||||||
OperationMaster<T,OpClass,Ranges...>::
|
OperationMaster<T,OpClass,Ranges...>::
|
||||||
OperationMaster(MutableMultiArrayBase<T,Ranges...>& ma, const OpClass& second,
|
OperationMaster(MutableMultiArrayBase<T,Ranges...>& ma, const OpClass& second,
|
||||||
std::shared_ptr<typename CRange::IndexType>& index) :
|
IndexType& index) :
|
||||||
mSecond(second), mArrayRef(ma), mDataPtr(mArrayRef.data()),
|
mSecond(second), mArrayRef(ma), mDataPtr(mArrayRef.data()),
|
||||||
mIndex(mkIndex(index)), mIInfo(*mIndex)
|
mIndex(index), mIInfo(mIndex)
|
||||||
{
|
{
|
||||||
performAssignment(0);
|
performAssignment(0);
|
||||||
}
|
}
|
||||||
|
@ -397,32 +391,19 @@ namespace MultiArrayTools
|
||||||
template <typename T, class OpClass, class... Ranges>
|
template <typename T, class OpClass, class... Ranges>
|
||||||
OperationMaster<T,OpClass,Ranges...>::
|
OperationMaster<T,OpClass,Ranges...>::
|
||||||
OperationMaster(MutableMultiArrayBase<T,Ranges...>& ma, const OpClass& second,
|
OperationMaster(MutableMultiArrayBase<T,Ranges...>& ma, const OpClass& second,
|
||||||
std::shared_ptr<typename CRange::IndexType>& index,
|
IndexType& index,
|
||||||
const IndexInfo* blockIndex) :
|
const IndexInfo* blockIndex) :
|
||||||
mSecond(second), mArrayRef(ma), mDataPtr(mArrayRef.data()),
|
mSecond(second), mArrayRef(ma), mDataPtr(mArrayRef.data()),
|
||||||
mIndex(mkIndex(index)), mIInfo(*mIndex)
|
mIndex(index), mIInfo(mIndex)
|
||||||
{
|
{
|
||||||
performAssignment(0);
|
performAssignment(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class OpClass, class... Ranges>
|
|
||||||
std::shared_ptr<typename OperationMaster<T,OpClass,Ranges...>::IndexType>
|
|
||||||
OperationMaster<T,OpClass,Ranges...>::
|
|
||||||
mkIndex(std::shared_ptr<typename CRange::IndexType>& index)
|
|
||||||
{
|
|
||||||
MultiRangeFactory<Ranges...> mrf( index->range() );
|
|
||||||
std::shared_ptr<MultiRange<Ranges...> > mr =
|
|
||||||
std::dynamic_pointer_cast<MultiRange<Ranges...> >( mrf.create() );
|
|
||||||
auto i = std::make_shared<IndexType>( mr->begin() );
|
|
||||||
(*i) = *index;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, class OpClass, class... Ranges>
|
template <typename T, class OpClass, class... Ranges>
|
||||||
void OperationMaster<T,OpClass,Ranges...>::performAssignment(std::intptr_t blockIndexNum)
|
void OperationMaster<T,OpClass,Ranges...>::performAssignment(std::intptr_t blockIndexNum)
|
||||||
{
|
{
|
||||||
AssignmentExpr ae(*this, mSecond); // Expression to be executed within loop
|
AssignmentExpr ae(*this, mSecond); // Expression to be executed within loop
|
||||||
const auto loop = mSecond.template loop<decltype(mIndex->ifor(ae))>( mIndex->ifor(ae) );
|
const auto loop = mSecond.template loop<decltype(mIndex.ifor(ae))>( mIndex.ifor(ae) );
|
||||||
// hidden Loops outside ! -> auto vectorizable
|
// hidden Loops outside ! -> auto vectorizable
|
||||||
loop(); // execute overall loop(s) and so internal hidden loops and so the inherited expressions
|
loop(); // execute overall loop(s) and so internal hidden loops and so the inherited expressions
|
||||||
}
|
}
|
||||||
|
@ -443,18 +424,10 @@ namespace MultiArrayTools
|
||||||
ConstOperationRoot(const MultiArrayBase<T,Ranges...>& ma,
|
ConstOperationRoot(const MultiArrayBase<T,Ranges...>& ma,
|
||||||
const std::shared_ptr<typename Ranges::IndexType>&... indices) :
|
const std::shared_ptr<typename Ranges::IndexType>&... indices) :
|
||||||
mArrayRef(ma), mDataPtr(mArrayRef.data()),
|
mArrayRef(ma), mDataPtr(mArrayRef.data()),
|
||||||
mIndex( mkIndex(ma,indices...) ), mIInfo(*mIndex)
|
//mIndex( mkIndex(ma,indices...) ), mIInfo(*mIndex)
|
||||||
{}
|
mIndex( ma.begin() ), mIInfo(mIndex)
|
||||||
|
|
||||||
template <typename T, class... Ranges>
|
|
||||||
std::shared_ptr<typename ConstOperationRoot<T,Ranges...>::IndexType>
|
|
||||||
ConstOperationRoot<T,Ranges...>::
|
|
||||||
mkIndex(const MultiArrayBase<T,Ranges...>& ma,
|
|
||||||
const std::shared_ptr<typename Ranges::IndexType>&... indices)
|
|
||||||
{
|
{
|
||||||
auto i = std::make_shared<IndexType>( ma.range() );
|
mIndex(indices...);
|
||||||
(*mIndex)(indices...);
|
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class... Ranges>
|
template <typename T, class... Ranges>
|
||||||
|
@ -467,7 +440,7 @@ namespace MultiArrayTools
|
||||||
template <typename T, class... Ranges>
|
template <typename T, class... Ranges>
|
||||||
MExt<void> ConstOperationRoot<T,Ranges...>::rootSteps(std::intptr_t iPtrNum) const
|
MExt<void> ConstOperationRoot<T,Ranges...>::rootSteps(std::intptr_t iPtrNum) const
|
||||||
{
|
{
|
||||||
return MExt<void>(getStepSize( mIndex->info(), iPtrNum ));
|
return MExt<void>(getStepSize( mIndex.info(), iPtrNum ));
|
||||||
//return MExt<void>(getStepSize( getRootIndices( mIndex->info() ), iPtrNum ));
|
//return MExt<void>(getStepSize( getRootIndices( mIndex->info() ), iPtrNum ));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,20 +461,11 @@ namespace MultiArrayTools
|
||||||
OperationRoot(MutableMultiArrayBase<T,Ranges...>& ma,
|
OperationRoot(MutableMultiArrayBase<T,Ranges...>& ma,
|
||||||
const std::shared_ptr<typename Ranges::IndexType>&... indices) :
|
const std::shared_ptr<typename Ranges::IndexType>&... indices) :
|
||||||
mArrayRef(ma), mDataPtr(mArrayRef.data()),
|
mArrayRef(ma), mDataPtr(mArrayRef.data()),
|
||||||
mIndex( mkIndex( ma, indices... ) ), mIInfo(*mIndex)
|
mIndex( ma.begin() ), mIInfo(mIndex)
|
||||||
{}
|
|
||||||
|
|
||||||
template <typename T, class... Ranges>
|
|
||||||
std::shared_ptr<typename OperationRoot<T,Ranges...>::IndexType>
|
|
||||||
OperationRoot<T,Ranges...>::
|
|
||||||
mkIndex(const MultiArrayBase<T,Ranges...>& ma,
|
|
||||||
const std::shared_ptr<typename Ranges::IndexType>&... indices)
|
|
||||||
{
|
{
|
||||||
auto i = std::make_shared<IndexType>( ma.range() );
|
mIndex(indices...);
|
||||||
(*mIndex)(indices...);
|
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class... Ranges>
|
template <typename T, class... Ranges>
|
||||||
template <class OpClass>
|
template <class OpClass>
|
||||||
OperationMaster<T,OpClass,Ranges...> OperationRoot<T,Ranges...>::operator=(const OpClass& in)
|
OperationMaster<T,OpClass,Ranges...> OperationRoot<T,Ranges...>::operator=(const OpClass& in)
|
||||||
|
@ -519,7 +483,7 @@ namespace MultiArrayTools
|
||||||
template <typename T, class... Ranges>
|
template <typename T, class... Ranges>
|
||||||
MExt<void> OperationRoot<T,Ranges...>::rootSteps(std::intptr_t iPtrNum) const
|
MExt<void> OperationRoot<T,Ranges...>::rootSteps(std::intptr_t iPtrNum) const
|
||||||
{
|
{
|
||||||
return MExt<void>(getStepSize( mIndex->info(), iPtrNum ));
|
return MExt<void>(getStepSize( mIndex.info(), iPtrNum ));
|
||||||
//return MExt<void>(getStepSize( getRootIndices( mIndex->info() ), iPtrNum ));
|
//return MExt<void>(getStepSize( getRootIndices( mIndex->info() ), iPtrNum ));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,9 @@ namespace MultiArrayTools
|
||||||
static size_t totalDim() { return mkTotalDim<Indices...>(); }
|
static size_t totalDim() { return mkTotalDim<Indices...>(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
ContainerIndex() = default;
|
||||||
|
|
||||||
bool mNonTrivialBlocks = false;
|
bool mNonTrivialBlocks = false;
|
||||||
bool mExternControl = false;
|
bool mExternControl = false;
|
||||||
IndexPack mIPack;
|
IndexPack mIPack;
|
||||||
|
@ -42,7 +44,8 @@ namespace MultiArrayTools
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ContainerIndex() = delete;
|
ContainerIndex(const ContainerIndex& in) = default;
|
||||||
|
ContainerIndex& operator=(const ContainerIndex& in) = default;
|
||||||
|
|
||||||
template <class MRange>
|
template <class MRange>
|
||||||
ContainerIndex(const std::shared_ptr<MRange>& range);
|
ContainerIndex(const std::shared_ptr<MRange>& range);
|
||||||
|
@ -50,7 +53,7 @@ namespace MultiArrayTools
|
||||||
template <class MRange>
|
template <class MRange>
|
||||||
ContainerIndex(const std::shared_ptr<MRange>& range,
|
ContainerIndex(const std::shared_ptr<MRange>& range,
|
||||||
const std::array<size_t,sizeof...(Indices)+1>& blockSizes);
|
const std::array<size_t,sizeof...(Indices)+1>& blockSizes);
|
||||||
|
|
||||||
template <size_t N>
|
template <size_t N>
|
||||||
auto get() const -> decltype( *std::get<N>( mIPack ) )&;
|
auto get() const -> decltype( *std::get<N>( mIPack ) )&;
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,7 @@ namespace {
|
||||||
|
|
||||||
typedef ContainerRangeFactory<double,M3Range,SRange> CRF;
|
typedef ContainerRangeFactory<double,M3Range,SRange> CRF;
|
||||||
typedef CRF::oType CRange;
|
typedef CRF::oType CRange;
|
||||||
|
typedef ContainerIndex<double,M3Range::IndexType,SRange::IndexType> CIndex;
|
||||||
|
|
||||||
IndexTest()
|
IndexTest()
|
||||||
{
|
{
|
||||||
|
@ -182,9 +183,13 @@ namespace {
|
||||||
EXPECT_EQ(cr2ptr->size(), 12u);
|
EXPECT_EQ(cr2ptr->size(), 12u);
|
||||||
|
|
||||||
auto mi = mstrptr->begin();
|
auto mi = mstrptr->begin();
|
||||||
auto ci1 = cr1ptr->begin();
|
//auto ci1 = cr1ptr->begin();
|
||||||
auto ci2 = cr2ptr->begin();
|
CIndex ci1(cr1ptr);
|
||||||
|
ci1 = 0;
|
||||||
|
//auto ci2 = cr2ptr->begin();
|
||||||
|
CIndex ci2(cr2ptr);
|
||||||
|
ci2 = 0;
|
||||||
|
|
||||||
EXPECT_EQ(ci1.max(), 16u);
|
EXPECT_EQ(ci1.max(), 16u);
|
||||||
EXPECT_EQ(ci2.max(), 12u);
|
EXPECT_EQ(ci2.max(), 12u);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue