add meta position access (compiles, untested)
This commit is contained in:
parent
d5c8ec7c9d
commit
6164b58cd0
5 changed files with 79 additions and 4 deletions
|
@ -224,6 +224,52 @@ namespace MultiArrayTools
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <size_t N>
|
||||||
|
struct MetaPosGetter
|
||||||
|
{
|
||||||
|
template <class... Indices>
|
||||||
|
static void getMetaPos(typename MultiIndex<Indices...>::MetaType& target,
|
||||||
|
const typename MultiIndex<Indices...>::IndexPack& source)
|
||||||
|
{
|
||||||
|
std::get<N>(target) = std::get<N>(source).getMetaPos();
|
||||||
|
MetaPosGetter<N-1>::getMetaPos(target, source);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct MetaPosGetter<0>
|
||||||
|
{
|
||||||
|
template <class... Indices>
|
||||||
|
static void getMetaPos(typename MultiIndex<Indices...>::MetaType& target,
|
||||||
|
const typename MultiIndex<Indices...>::IndexPack& source)
|
||||||
|
{
|
||||||
|
std::get<0>(target) = std::get<0>(source).getMetaPos();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <size_t N>
|
||||||
|
struct MetaSetter
|
||||||
|
{
|
||||||
|
template <class... Indices>
|
||||||
|
static void setMeta(typename MultiIndex<Indices...>::IndexPack& target,
|
||||||
|
const typename MultiIndex<Indices...>::MetaType& source)
|
||||||
|
{
|
||||||
|
std::get<N>(target).atMeta( std::get<N>(source) );
|
||||||
|
MetaSetter<N-1>::setMeta(target, source);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct MetaSetter<0>
|
||||||
|
{
|
||||||
|
template <class... Indices>
|
||||||
|
static void setMeta(typename MultiIndex<Indices...>::IndexPack& target,
|
||||||
|
const typename MultiIndex<Indices...>::MetaType& source)
|
||||||
|
{
|
||||||
|
std::get<0>(target).atMeta( std::get<0>(source) );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class... Indices>
|
template <class... Indices>
|
||||||
|
@ -445,6 +491,7 @@ namespace MultiArrayTools
|
||||||
IndefinitIndexBase& MultiIndex<Indices...>::get(size_t n)
|
IndefinitIndexBase& MultiIndex<Indices...>::get(size_t n)
|
||||||
{
|
{
|
||||||
if(n >= sizeof...(Indices)){
|
if(n >= sizeof...(Indices)){
|
||||||
|
assert(0);
|
||||||
// throw !!
|
// throw !!
|
||||||
}
|
}
|
||||||
MultiIndex<Indices...>* t = this;
|
MultiIndex<Indices...>* t = this;
|
||||||
|
@ -455,12 +502,28 @@ namespace MultiArrayTools
|
||||||
const IndefinitIndexBase& MultiIndex<Indices...>::get(size_t n) const
|
const IndefinitIndexBase& MultiIndex<Indices...>::get(size_t n) const
|
||||||
{
|
{
|
||||||
if(n >= sizeof...(Indices)){
|
if(n >= sizeof...(Indices)){
|
||||||
|
assert(0);
|
||||||
// throw !!
|
// throw !!
|
||||||
}
|
}
|
||||||
MultiIndex<Indices...> const* t = this;
|
MultiIndex<Indices...> const* t = this;
|
||||||
return IndexGetter<sizeof...(Indices)-1>::getIndex(*t, n);
|
return IndexGetter<sizeof...(Indices)-1>::getIndex(*t, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class... Indices>
|
||||||
|
typename MultiIndex<Indices...>::MetaType MultiIndex<Indices...>::getMetaPos() const
|
||||||
|
{
|
||||||
|
MetaType metaTuple;
|
||||||
|
MetaPosGetter<sizeof...(Indices)-1>::getMetaPos(metaTuple, mIPack);
|
||||||
|
return metaTuple;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Indices>
|
||||||
|
MultiIndex<Indices...>& MultiIndex<Indices...>::atMeta(const MultiIndex<Indices...>::MetaType& metaPos)
|
||||||
|
{
|
||||||
|
MetaSetter<sizeof...(Indices)-1>::setMeta(mIPack, metaPos);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
template <class... Indices>
|
template <class... Indices>
|
||||||
bool MultiIndex<Indices...>::linkLower(IndefinitIndexBase* toLink)
|
bool MultiIndex<Indices...>::linkLower(IndefinitIndexBase* toLink)
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,6 +20,7 @@ namespace MultiArrayTools
|
||||||
typedef std::tuple<Indices...> IndexPack;
|
typedef std::tuple<Indices...> IndexPack;
|
||||||
typedef IndefinitIndexBase IIB;
|
typedef IndefinitIndexBase IIB;
|
||||||
typedef IndexBase<MultiIndex<Indices...> > IB;
|
typedef IndexBase<MultiIndex<Indices...> > IB;
|
||||||
|
typedef std::tuple<decltype(Indices().getMetaPos())...> MetaType;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -67,6 +68,9 @@ namespace MultiArrayTools
|
||||||
IndefinitIndexBase& get(size_t n);
|
IndefinitIndexBase& get(size_t n);
|
||||||
const IndefinitIndexBase& get(size_t n) const;
|
const IndefinitIndexBase& get(size_t n) const;
|
||||||
|
|
||||||
|
MetaType getMetaPos() const;
|
||||||
|
MultiIndex& atMeta(const MetaType& metaPos);
|
||||||
|
|
||||||
MultiIndex& operator()(Indices&&... inds);
|
MultiIndex& operator()(Indices&&... inds);
|
||||||
MultiIndex& operator()(const Indices&... inds);
|
MultiIndex& operator()(const Indices&... inds);
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ namespace MultiArrayTools
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename U, RangeType TYPE>
|
template <typename U, RangeType TYPE>
|
||||||
size_t SingleRange<U,TYPE>::get(const U& metaPos) const
|
size_t SingleRange<U,TYPE>::getMeta(const U& metaPos) const
|
||||||
{
|
{
|
||||||
size_t cnt = 0;
|
size_t cnt = 0;
|
||||||
for(auto& x: mSpace){
|
for(auto& x: mSpace){
|
||||||
|
@ -131,6 +131,13 @@ namespace MultiArrayTools
|
||||||
return dynamic_cast<SingleRange<U,TYPE> const*>( IB::mRange )->get(IIB::pos());
|
return dynamic_cast<SingleRange<U,TYPE> const*>( IB::mRange )->get(IIB::pos());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename U, RangeType TYPE>
|
||||||
|
SingleIndex<U,TYPE>& SingleIndex<U,TYPE>::atMeta(const U& metaPos)
|
||||||
|
{
|
||||||
|
operator=( dynamic_cast<SingleRange<U,TYPE> const*>( IB::mRange )->getMeta(metaPos) );
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename U, RangeType TYPE>
|
template <typename U, RangeType TYPE>
|
||||||
size_t SingleIndex<U,TYPE>::dim() const
|
size_t SingleIndex<U,TYPE>::dim() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,6 +44,7 @@ namespace MultiArrayTools
|
||||||
virtual MultiRangeType rangeType() const override;
|
virtual MultiRangeType rangeType() const override;
|
||||||
|
|
||||||
virtual const U& getMetaPos() const;
|
virtual const U& getMetaPos() const;
|
||||||
|
virtual SingleIndex& atMeta(const U& metaPos);
|
||||||
|
|
||||||
virtual size_t dim() const override; // = 1
|
virtual size_t dim() const override; // = 1
|
||||||
virtual void linkTo(IndefinitIndexBase* target) override;
|
virtual void linkTo(IndefinitIndexBase* target) override;
|
||||||
|
@ -68,7 +69,7 @@ namespace MultiArrayTools
|
||||||
virtual size_t size() const override;
|
virtual size_t size() const override;
|
||||||
|
|
||||||
const U& get(size_t pos) const;
|
const U& get(size_t pos) const;
|
||||||
size_t get(const U& metaPos) const;
|
size_t getMeta(const U& metaPos) const;
|
||||||
|
|
||||||
virtual MultiRangeType type() const override;
|
virtual MultiRangeType type() const override;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue