im com (block type scanning routines...)
This commit is contained in:
parent
aa803b81f2
commit
fbcdfd7580
10 changed files with 206 additions and 10 deletions
|
@ -41,6 +41,12 @@ namespace MultiArrayTools
|
|||
IB::mPos = PackNum<sizeof...(Indices)-1>::makePos(mIPack);
|
||||
}
|
||||
|
||||
template <class... Indices>
|
||||
IndexType ContainerIndex<Indices...>::type() const
|
||||
{
|
||||
return IndexType::CONT;
|
||||
}
|
||||
|
||||
template <class... Indices>
|
||||
ContainerIndex<Indices...>& ContainerIndex<Indices...>::operator++()
|
||||
{
|
||||
|
@ -116,6 +122,17 @@ namespace MultiArrayTools
|
|||
{
|
||||
return std::get<N>( mIPack );
|
||||
}
|
||||
|
||||
template <class... Indices>
|
||||
std::shared_ptr<const IndexBase> ContainerIndex<Indices...>::getPtr(size_t n) const
|
||||
{
|
||||
if(n >= sizeof...(Indices)){
|
||||
assert(0);
|
||||
// throw !!
|
||||
}
|
||||
ContainerIndex<Indices...> const* t = this;
|
||||
return PackNum<sizeof...(Indices)-1>::getIndexPtr(*t, n);
|
||||
}
|
||||
|
||||
template <class... Indices>
|
||||
bool ContainerIndex<Indices...>::first() const
|
||||
|
|
|
@ -38,6 +38,8 @@ namespace MultiArrayTools
|
|||
template <class MRange>
|
||||
ContainerIndex(const std::shared_ptr<MRange>& range);
|
||||
|
||||
virtual IndexType type() const override;
|
||||
|
||||
virtual ContainerIndex& operator++() override;
|
||||
virtual ContainerIndex& operator--() override;
|
||||
virtual ContainerIndex& operator=(size_t pos) override;
|
||||
|
@ -57,6 +59,8 @@ namespace MultiArrayTools
|
|||
|
||||
template <size_t N>
|
||||
auto getPtr() const -> decltype( std::get<N>( mIPack ) )&;
|
||||
|
||||
virtual std::shared_ptr<const IndexBase> getPtr(size_t n) const override;
|
||||
|
||||
ContainerIndex& operator()(const std::shared_ptr<Indices>&... inds); // control via external indices
|
||||
|
||||
|
|
|
@ -19,6 +19,12 @@ namespace MultiArrayTools
|
|||
++id;
|
||||
return id;
|
||||
}
|
||||
|
||||
enum class IndexType{
|
||||
SINGLE = 0,
|
||||
MULTI = 1,
|
||||
CONT = 2
|
||||
};
|
||||
|
||||
class IndexBase
|
||||
{
|
||||
|
@ -31,6 +37,8 @@ namespace MultiArrayTools
|
|||
|
||||
IndexBase(const std::shared_ptr<RangeBase>& range, size_t pos);
|
||||
virtual ~IndexBase() = default;
|
||||
|
||||
virtual IndexType type() const = 0;
|
||||
|
||||
virtual IndexBase& operator=(size_t pos) = 0;
|
||||
virtual IndexBase& operator++() = 0;
|
||||
|
@ -45,6 +53,8 @@ namespace MultiArrayTools
|
|||
|
||||
virtual bool last() const = 0;
|
||||
virtual bool first() const = 0;
|
||||
|
||||
virtual std::shared_ptr<const IndexBase> getPtr(size_t n) const = 0;
|
||||
|
||||
virtual operator size_t() const;
|
||||
|
||||
|
|
|
@ -8,7 +8,43 @@ namespace MultiArrayTools
|
|||
{
|
||||
using namespace MultiArrayHelper;
|
||||
}
|
||||
|
||||
|
||||
void seekIndexInst(std::shared_ptr<const IndexBase> i, std::vector<std::shared_ptr<const IndexBase> >& ivec)
|
||||
{
|
||||
for(size_t inum = 0; inum != i->range()->dim(); ++inum){
|
||||
auto ii = i->getPtr(inum);
|
||||
if(ii->type() == IndexType::MULTI){
|
||||
seekIndexInst(ii, ivec);
|
||||
}
|
||||
ivec.push_back(ii);
|
||||
}
|
||||
}
|
||||
|
||||
BlockType getBlockType(std::shared_ptr<const IndexBase> i,
|
||||
std::shared_ptr<const IndexBase> j, bool first)
|
||||
{
|
||||
BlockType out = BlockType::VALUE;
|
||||
for(size_t inum = 0; inum != i->range()->dim(); ++inum){
|
||||
if(ii == j){
|
||||
if(inum == 0){
|
||||
out = BlockType::BLOCK;
|
||||
}
|
||||
else {
|
||||
out = BlockType::SPLIT;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if(ii->type() == IndexType::MULTI){
|
||||
BlockType tmp = getBlockType(ii, j, ivec);
|
||||
if(tmp != BlockType::VALUE){
|
||||
out = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
/*********************************
|
||||
* MultiArrayOperationBase *
|
||||
*********************************/
|
||||
|
@ -86,6 +122,20 @@ namespace MultiArrayTools
|
|||
{
|
||||
return mArrayRef.data()[ mIndex->pos() ];
|
||||
}
|
||||
|
||||
template <typename T, class... Ranges>
|
||||
std::vector<BlockType> OperationMaster<T,Ranges...>::block(const std::shared_ptr<IndexBase>& blockIndex) const
|
||||
{
|
||||
// seek index with smallest number of SPLITs !!!
|
||||
|
||||
}
|
||||
|
||||
template <typename T, class... Ranges>
|
||||
OperationMaster<T,Ranges...>& OperationMaster<T,Ranges...>::block() const
|
||||
{
|
||||
mBlockPtr->set( &mArrayRef[ (*mIndex) ] );
|
||||
return *this;
|
||||
}
|
||||
|
||||
/****************************
|
||||
* ConstOperationRoot *
|
||||
|
@ -104,7 +154,21 @@ namespace MultiArrayTools
|
|||
template <typename T, class... Ranges>
|
||||
const BlockBase<T>& ConstOperationRoot<T,Ranges...>::get() const
|
||||
{
|
||||
return mArrayRef[ (*mIndex)() ];
|
||||
block();
|
||||
return *mBlockPtr;
|
||||
}
|
||||
|
||||
template <typename T, class... Ranges>
|
||||
std::vector<BlockType> ConstOperationRoot<T,Ranges...>::block(const std::shared_ptr<IndexBase>& blockIndex) const
|
||||
{
|
||||
// !!!
|
||||
}
|
||||
|
||||
template <typename T, class... Ranges>
|
||||
ConstOperationRoot<T,Ranges...>& ConstOperationRoot<T,Ranges...>::block() const
|
||||
{
|
||||
mBlockPtr->set( &mArrayRef[ (*mIndex)() ] );
|
||||
return *this;
|
||||
}
|
||||
|
||||
/***********************
|
||||
|
@ -130,15 +194,30 @@ namespace MultiArrayTools
|
|||
template <typename T, class... Ranges>
|
||||
const BlockBase<T>& OperationRoot<T,Ranges...>::get() const
|
||||
{
|
||||
return mArrayRef[ (*mIndex)() ];
|
||||
block();
|
||||
return *mBlockPtr;
|
||||
}
|
||||
|
||||
template <typename T, class... Ranges>
|
||||
BlockBase<T>& OperationRoot<T,Ranges...>::get()
|
||||
{
|
||||
return mArrayRef[ (*mIndex)() ];
|
||||
block();
|
||||
return *mBlockPtr; // issue: const !!!
|
||||
}
|
||||
|
||||
template <typename T, class... Ranges>
|
||||
std::vector<BlockType> OperationRoot<T,Ranges...>::block(const std::shared_ptr<IndexBase>& blockIndex) const
|
||||
{
|
||||
// !!!
|
||||
}
|
||||
|
||||
template <typename T, class... Ranges>
|
||||
OperationRoot<T,Ranges...>& OperationRoot<T,Ranges...>::block() const
|
||||
{
|
||||
mBlockPtr->set( &mArrayRef[ (*mIndex)() ] );
|
||||
return *this;
|
||||
}
|
||||
|
||||
/***********************
|
||||
* OperationRoot *
|
||||
***********************/
|
||||
|
@ -154,4 +233,18 @@ namespace MultiArrayTools
|
|||
mRes = PackNum<sizeof...(Ops)-1>::template unpackArgs<T,OpFunction>(mOps);
|
||||
return mRes;
|
||||
}
|
||||
|
||||
template <typename T, class... Ranges>
|
||||
std::vector<BlockType> Operation<T,Ranges...>::block(const std::shared_ptr<IndexBase>& blockIndex) const
|
||||
{
|
||||
// !!!
|
||||
}
|
||||
|
||||
template <typename T, class... Ranges>
|
||||
Operation<T,Ranges...>& Operation<T,Ranges...>::block() const
|
||||
{
|
||||
mBlockPtr->set( &mArrayRef[ (*mIndex)() ] );
|
||||
return *this;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -29,6 +29,11 @@ namespace MultiArrayTools
|
|||
* OperationTemplate<...>
|
||||
*
|
||||
*/
|
||||
|
||||
void seekIndexInst(std::shared_ptr<const IndexBase> i, std::vector<std::shared_ptr<const IndexBase> >& ivec);
|
||||
|
||||
BlockType getBlockType(std::shared_ptr<const IndexBase> i,
|
||||
std::shared_ptr<const IndexBase> j, bool first);
|
||||
|
||||
template <typename T>
|
||||
class OperationBase
|
||||
|
@ -40,7 +45,9 @@ namespace MultiArrayTools
|
|||
OperationBase() = default;
|
||||
virtual ~OperationBase() = default;
|
||||
|
||||
virtual OperationBase& block(const std::shared_ptr<IndexBase>& blockIndex) = 0;
|
||||
// init block, return resulting type (BLOCK, VALUE, SPLIT)
|
||||
virtual std::vector<BlockType> block(const std::shared_ptr<IndexBase>& blockIndex) const = 0;
|
||||
virtual OperationBase& block() const = 0; // update block
|
||||
|
||||
//virtual size_t argNum() const = 0;
|
||||
virtual const BlockBase<T>& get() const = 0;
|
||||
|
@ -104,6 +111,9 @@ namespace MultiArrayTools
|
|||
virtual BlockBase<T>& get() override;
|
||||
virtual const BlockBase<T>& get() const override;
|
||||
|
||||
virtual std::vector<BlockType> block(const std::shared_ptr<IndexBase>& blockIndex) const override;
|
||||
virtual OperationMaster& block() const override;
|
||||
|
||||
protected:
|
||||
|
||||
//void performAssignment(const OperationBase<T>& in);
|
||||
|
@ -129,6 +139,9 @@ namespace MultiArrayTools
|
|||
const std::shared_ptr<typename Ranges::IndexType>&... indices);
|
||||
|
||||
virtual const BlockBase<T>& get() const override;
|
||||
|
||||
virtual std::vector<BlockType> block(const std::shared_ptr<IndexBase>& blockIndex) const override;
|
||||
virtual ConstOperationRoot& block() const override;
|
||||
|
||||
protected:
|
||||
|
||||
|
@ -155,6 +168,9 @@ namespace MultiArrayTools
|
|||
|
||||
virtual const BlockBase<T>& get() const override;
|
||||
virtual BlockBase<T>& get() override;
|
||||
|
||||
virtual std::vector<BlockType> block(const std::shared_ptr<IndexBase>& blockIndex) const override;
|
||||
virtual OperationRoot& block() const override;
|
||||
|
||||
protected:
|
||||
|
||||
|
@ -176,7 +192,10 @@ namespace MultiArrayTools
|
|||
Operation(const Ops&... ops);
|
||||
|
||||
virtual const BlockBase<T>& get() const override;
|
||||
|
||||
|
||||
virtual std::vector<BlockType> block(const std::shared_ptr<IndexBase>& blockIndex) const override;
|
||||
virtual Operation& block() const override;
|
||||
|
||||
protected:
|
||||
std::tuple<Ops...> mOps;
|
||||
mutable BlockResult<T> mRes;
|
||||
|
|
|
@ -48,6 +48,12 @@ namespace MultiArrayTools
|
|||
PackNum<sizeof...(Indices)-1>::construct(mIPack, *range);
|
||||
IB::mPos = PackNum<sizeof...(Indices)-1>::makePos(mIPack);
|
||||
}
|
||||
|
||||
template <class... Indices>
|
||||
IndexType MultiIndex<Indices...>::type() const
|
||||
{
|
||||
return IndexType::MULTI;
|
||||
}
|
||||
|
||||
template <class... Indices>
|
||||
MultiIndex<Indices...>& MultiIndex<Indices...>::operator++()
|
||||
|
@ -124,6 +130,17 @@ namespace MultiArrayTools
|
|||
return PackNum<sizeof...(Indices)-1>::getIndex(*t, n);
|
||||
}
|
||||
|
||||
template <class... Indices>
|
||||
std::shared_ptr<const IndexBase> MultiIndex<Indices...>::getPtr(size_t n) const
|
||||
{
|
||||
if(n >= sizeof...(Indices)){
|
||||
assert(0);
|
||||
// throw !!
|
||||
}
|
||||
MultiIndex<Indices...> const* t = this;
|
||||
return PackNum<sizeof...(Indices)-1>::getIndexPtr(*t, n);
|
||||
}
|
||||
|
||||
template <class... Indices>
|
||||
typename MultiIndex<Indices...>::MetaType MultiIndex<Indices...>::meta() const
|
||||
{
|
||||
|
|
|
@ -38,6 +38,8 @@ namespace MultiArrayTools
|
|||
|
||||
template <class MRange>
|
||||
MultiIndex(const std::shared_ptr<MRange>& range);
|
||||
|
||||
virtual IndexType type() const override;
|
||||
|
||||
virtual MultiIndex& operator++() override;
|
||||
virtual MultiIndex& operator--() override;
|
||||
|
@ -56,6 +58,7 @@ namespace MultiArrayTools
|
|||
auto getPtr() const -> decltype( std::get<N>( mIPack ) )&;
|
||||
|
||||
const IndexBase& get(size_t n) const;
|
||||
virtual std::shared_ptr<const IndexBase> getPtr(size_t n) const override;
|
||||
|
||||
virtual MetaType meta() const override;
|
||||
virtual MultiIndex& at(const MetaType& metaPos) override;
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace MultiArrayHelper
|
|||
static IndexBase& getIndex(IndexType& in, size_t n)
|
||||
{
|
||||
if(n == N){
|
||||
return in.getIndex<N>();
|
||||
return in.template get<N>();
|
||||
}
|
||||
else {
|
||||
return PackNum<N-1>::getIndex(in, n);
|
||||
|
@ -32,12 +32,23 @@ namespace MultiArrayHelper
|
|||
static const IndexBase& getIndex(const IndexType& in, size_t n)
|
||||
{
|
||||
if(n == N){
|
||||
return in.getIndex<N>();
|
||||
return in.template get<N>();
|
||||
}
|
||||
else {
|
||||
return PackNum<N-1>::getIndex(in, n);
|
||||
}
|
||||
}
|
||||
|
||||
template <class IndexType>
|
||||
static std::shared_ptr<const IndexBase> getIndexPtr(const IndexType& in, size_t n)
|
||||
{
|
||||
if(n == N){
|
||||
return in.template getPtr<N>();
|
||||
}
|
||||
else {
|
||||
return PackNum<N-1>::getIndexPtr(in, n);
|
||||
}
|
||||
}
|
||||
|
||||
template <class... Indices>
|
||||
static inline void pp(std::tuple<std::shared_ptr<Indices>...>& ip)
|
||||
|
@ -163,13 +174,19 @@ namespace MultiArrayHelper
|
|||
template <class MultiIndex>
|
||||
static IndexBase& getIndex(MultiIndex& in, size_t n)
|
||||
{
|
||||
return in.getIndex<0>();
|
||||
return in.template get<0>();
|
||||
}
|
||||
|
||||
template <class MultiIndex>
|
||||
static const IndexBase& getIndex(const MultiIndex& in, size_t n)
|
||||
{
|
||||
return in.getIndex<0>();
|
||||
return in.template get<0>();
|
||||
}
|
||||
|
||||
template <class IndexType>
|
||||
static std::shared_ptr<const IndexBase> getIndexPtr(const IndexType& in, size_t n)
|
||||
{
|
||||
return in.template getPtr<0>();
|
||||
}
|
||||
|
||||
template <class... Indices>
|
||||
|
|
|
@ -11,6 +11,12 @@ namespace MultiArrayTools
|
|||
SingleIndex<U,TYPE>::SingleIndex(const std::shared_ptr<SingleRange<U,TYPE> >& range) :
|
||||
IndexInterface<U>(range, 0) {}
|
||||
|
||||
template <typename U, RangeType TYPE>
|
||||
IndexType SingleIndex<U,TYPE>::type() const
|
||||
{
|
||||
return IndexType::SINGLE;
|
||||
}
|
||||
|
||||
template <typename U, RangeType TYPE>
|
||||
SingleIndex<U,TYPE>& SingleIndex<U,TYPE>::operator=(size_t pos)
|
||||
{
|
||||
|
@ -63,6 +69,12 @@ namespace MultiArrayTools
|
|||
return IB::mPos == 0;
|
||||
}
|
||||
|
||||
template <typename U, RangeType TYPE>
|
||||
std::shared_ptr<const IndexBase> SingleIndex<U,TYPE>::getPtr(size_t n) const
|
||||
{
|
||||
return std::shared_ptr<const IndexBase>();
|
||||
}
|
||||
|
||||
/********************
|
||||
* SingleRange *
|
||||
********************/
|
||||
|
|
|
@ -26,6 +26,8 @@ namespace MultiArrayTools
|
|||
//DEFAULT_MEMBERS_X(SingleIndex);
|
||||
|
||||
SingleIndex(const std::shared_ptr<SingleRange<U,TYPE> >& range);
|
||||
|
||||
virtual IndexType type() const override;
|
||||
|
||||
virtual SingleIndex& operator=(size_t pos) override;
|
||||
virtual SingleIndex& operator++() override;
|
||||
|
@ -38,6 +40,8 @@ namespace MultiArrayTools
|
|||
virtual bool last() const override;
|
||||
virtual bool first() const override;
|
||||
|
||||
virtual std::shared_ptr<const IndexBase> getPtr(size_t n) const override;
|
||||
|
||||
virtual std::string id() const override { return std::string("sin") + std::to_string(IB::mId); }
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue