ranges: start replacement of rpack_num

This commit is contained in:
Christian Zimmermann 2021-05-05 20:04:13 +02:00
parent 7fee5aa45d
commit 13488b9839
3 changed files with 28 additions and 3 deletions

View file

@ -17,6 +17,8 @@
#include "ranges/x_to_string.h"
#include "ranges/type_map.h"
#include "statics/static_for.h"
namespace MultiArrayTools
{
namespace
@ -279,10 +281,30 @@ namespace MultiArrayTools
MultiIndex<Indices...>::MultiIndex(const std::shared_ptr<MRange>& range) :
IndexInterface<MultiIndex<Indices...>,std::tuple<typename Indices::MetaType...> >(range, 0)
{
RPackNum<sizeof...(Indices)-1>::construct(mIPack, *range);
IB::mPos = RPackNum<sizeof...(Indices)-1>::makePos(mIPack);
std::get<sizeof...(Indices)>(mBlockSizes) = 1;
RPackNum<sizeof...(Indices)-1>::initBlockSizes(mBlockSizes, mIPack); // has one more element!
sfor<sizeof...(Indices),0,-1>
( [&](auto i) constexpr { return i-1; } ,
[&](auto i) {
auto r = range->template getPtr<i>();
std::get<i>(mIPack) = r->beginPtr();
*std::get<i>(mIPack) = 0;
std::get<i>(mBlockSizes) = sfor<i,sizeof...(Indices),0>
( [&](auto j) { return j+1; } ,
[&](auto j) { return std::get<j>(mIPack)->max(); } ,
[&](auto a, auto b) { return a * b; }
);
return 0;
},
[&](auto a, auto b) { return 0; }
);
IB::mPos = sfor<0,sizeof...(Indices),0>
( [&](auto i) {return i+1;},
[&](auto i) {return std::get<i>(mIPack);},
[&](auto a, auto b) {return a->pos() + b*a->max();},
0 );
}
template <class... Indices>

View file

@ -116,6 +116,8 @@ namespace MultiArrayTools
virtual Index begin() const = 0;
virtual Index end() const = 0;
std::shared_ptr<Index> beginPtr() const { return std::make_shared<Index>(this->begin()); }
std::shared_ptr<Index> endPtr() const { return std::make_shared<Index>(this->end()); }
virtual std::shared_ptr<IndexWrapperBase> aindex() const override final
{ return mkIndexWrapper(this->begin()); }
//{ auto i = std::make_shared<Index>(this->begin()); return std::make_shared<IndexWrapper<Index>>(i); } //!!!

View file

@ -174,6 +174,7 @@ namespace MultiArrayHelper
std::get<N>(ip) = std::shared_ptr<SubIndexType>( new SubIndexType( range.template getPtr<N>() ) );
*std::get<N>(ip) = 0;
//VCHECK(std::get<N>(ip)->max());
RPackNum<N-1>::construct(ip, range);
}