anonymous range constructor: promote subrange layer of anonymous range arguments
This commit is contained in:
parent
b9e5d6a898
commit
764bcac758
2 changed files with 26 additions and 7 deletions
|
@ -131,6 +131,7 @@ namespace MultiArrayTools
|
|||
namespace MultiArrayHelper
|
||||
{
|
||||
using namespace MultiArrayTools;
|
||||
|
||||
template <>
|
||||
inline void resolveSetRange<AnonymousRange>(std::shared_ptr<AnonymousRange> rp,
|
||||
std::vector<std::shared_ptr<RangeBase> > orig,
|
||||
|
@ -142,6 +143,16 @@ namespace MultiArrayHelper
|
|||
}
|
||||
rp = std::dynamic_pointer_cast<AnonymousRange>( arf.create() );
|
||||
}
|
||||
|
||||
template <>
|
||||
inline void setRangeToVec<AnonymousRange>(std::vector<std::shared_ptr<RangeBase> >& v,
|
||||
std::shared_ptr<AnonymousRange> r)
|
||||
{
|
||||
for(size_t i = 0; i != r->dim(); ++i){
|
||||
v.insert(v.begin(), r->sub(i));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace MultiArrayTools
|
||||
|
@ -156,7 +167,7 @@ namespace MultiArrayTools
|
|||
{
|
||||
mOrig.resize(sizeof...(RangeTypes));
|
||||
RPackNum<sizeof...(RangeTypes)-1>::RangesToVec( origs, mOrig );
|
||||
RPackNum<sizeof...(RangeTypes)-1>::getSize( origs );
|
||||
mSize = RPackNum<sizeof...(RangeTypes)-1>::getSize( origs );
|
||||
}
|
||||
|
||||
template <class... RangeTypes>
|
||||
|
@ -166,7 +177,7 @@ namespace MultiArrayTools
|
|||
auto rst = std::make_tuple(origs...);
|
||||
mOrig.resize(sizeof...(RangeTypes));
|
||||
RPackNum<sizeof...(RangeTypes)-1>::RangesToVec( rst, mOrig );
|
||||
RPackNum<sizeof...(RangeTypes)-1>::getSize( rst );
|
||||
mSize = RPackNum<sizeof...(RangeTypes)-1>::getSize( rst );
|
||||
}
|
||||
|
||||
template <class Range>
|
||||
|
|
|
@ -46,12 +46,19 @@ namespace MultiArrayHelper
|
|||
|
||||
|
||||
template <class Range>
|
||||
void resolveSetRange(std::shared_ptr<Range> rp, std::vector<std::shared_ptr<RangeBase> > orig,
|
||||
size_t origpos, size_t size)
|
||||
inline void resolveSetRange(std::shared_ptr<Range> rp, std::vector<std::shared_ptr<RangeBase> > orig,
|
||||
size_t origpos, size_t size)
|
||||
{
|
||||
assert(size == 1);
|
||||
rp = std::dynamic_pointer_cast<Range>( orig[origpos] ); // catch bad cast here!!
|
||||
}
|
||||
|
||||
template <class Range>
|
||||
inline void setRangeToVec(std::vector<std::shared_ptr<RangeBase> >& v,
|
||||
std::shared_ptr<Range> r)
|
||||
{
|
||||
v.insert(v.begin(), r);
|
||||
}
|
||||
|
||||
template <size_t N>
|
||||
struct RPackNum
|
||||
|
@ -216,10 +223,11 @@ namespace MultiArrayHelper
|
|||
|
||||
|
||||
template <class... Ranges>
|
||||
static void RangesToVec(const std::tuple<std::shared_ptr<Ranges>...>& rst,
|
||||
static inline void RangesToVec(const std::tuple<std::shared_ptr<Ranges>...>& rst,
|
||||
std::vector<std::shared_ptr<RangeBase> >& v)
|
||||
{
|
||||
v[N] = std::get<N>(rst);
|
||||
setRangeToVec(v, std::get<N>(rst));
|
||||
//v[N] = std::get<N>(rst);
|
||||
RPackNum<N-1>::RangesToVec(rst, v);
|
||||
}
|
||||
|
||||
|
@ -409,7 +417,7 @@ namespace MultiArrayHelper
|
|||
}
|
||||
|
||||
template <class... Ranges>
|
||||
static void RangesToVec(const std::tuple<std::shared_ptr<Ranges>...>& rst,
|
||||
static inline void RangesToVec(const std::tuple<std::shared_ptr<Ranges>...>& rst,
|
||||
std::vector<std::shared_ptr<RangeBase> >& v)
|
||||
{
|
||||
v[0] = std::get<0>(rst);
|
||||
|
|
Loading…
Reference in a new issue