2018-10-30 15:06:29 +01:00
|
|
|
|
|
|
|
//#include "ranges/dynamic_range.h"
|
|
|
|
//#include "ranges/dynamic_meta.h"
|
|
|
|
|
|
|
|
#include "rpack_num.h"
|
|
|
|
|
|
|
|
namespace MultiArrayTools
|
|
|
|
{
|
|
|
|
namespace
|
|
|
|
{
|
|
|
|
using namespace MultiArrayHelper;
|
|
|
|
}
|
2018-11-01 22:11:08 +01:00
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
template <class Index>
|
|
|
|
size_t IndexWrapper<Index>::getStepSizeComp(std::intptr_t j) const
|
2018-11-01 22:11:08 +01:00
|
|
|
{
|
2020-07-08 17:55:51 +02:00
|
|
|
return MultiArrayHelper::getStepSize(*mI, j);
|
2018-11-01 22:11:08 +01:00
|
|
|
}
|
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
/****************************
|
|
|
|
* DynamicRangeFactory *
|
|
|
|
****************************/
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
template <class... RangeTypes>
|
2020-07-08 17:55:51 +02:00
|
|
|
DynamicRangeFactory::DynamicRangeFactory(const std::tuple<std::shared_ptr<RangeTypes>...>& origs)
|
2018-10-30 15:06:29 +01:00
|
|
|
{
|
2020-07-08 17:55:51 +02:00
|
|
|
mProd = std::shared_ptr<oType>( new DynamicRange( origs ) );
|
2018-10-30 15:06:29 +01:00
|
|
|
}
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
template <class... RangeTypes>
|
2020-07-08 17:55:51 +02:00
|
|
|
DynamicRangeFactory::DynamicRangeFactory(std::shared_ptr<RangeTypes>... origs)
|
2018-10-30 15:06:29 +01:00
|
|
|
{
|
2020-07-08 17:55:51 +02:00
|
|
|
mProd = std::shared_ptr<oType>( new DynamicRange( origs... ) );
|
2018-10-30 15:06:29 +01:00
|
|
|
}
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
template <class Range>
|
2020-07-08 17:55:51 +02:00
|
|
|
void DynamicRangeFactory::append(std::shared_ptr<Range> r)
|
2018-10-30 15:06:29 +01:00
|
|
|
{
|
|
|
|
if(mProductCreated){
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
mProd = std::shared_ptr<oType>( new DynamicRange( *std::dynamic_pointer_cast<oType>(mProd) ) );
|
2018-10-30 15:06:29 +01:00
|
|
|
mProductCreated = false;
|
|
|
|
}
|
|
|
|
std::dynamic_pointer_cast<oType>(mProd)->mOrig.push_back(r);
|
|
|
|
std::dynamic_pointer_cast<oType>(mProd)->mSize *= r->size();
|
|
|
|
std::dynamic_pointer_cast<oType>(mProd)->mEmpty = false;
|
|
|
|
}
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
/*********************
|
|
|
|
* DynamicIndex *
|
|
|
|
*********************/
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
|
|
|
|
2018-11-01 22:11:08 +01:00
|
|
|
template <class... Indices>
|
2020-07-08 17:55:51 +02:00
|
|
|
DynamicIndex& DynamicIndex::operator()(const std::shared_ptr<Indices>&... is)
|
2018-11-01 22:11:08 +01:00
|
|
|
{
|
2019-03-19 20:58:59 +01:00
|
|
|
mIvecInit = true;
|
2020-07-08 17:55:51 +02:00
|
|
|
vector<std::shared_ptr<IndexW>> tmp =
|
|
|
|
{ std::make_shared<IndexWrapper<Indices>>(is)... };
|
2018-11-01 22:11:08 +01:00
|
|
|
|
|
|
|
assert(mIVec.size() == tmp.size());
|
|
|
|
for(size_t i = 0; i != mIVec.size(); ++i){
|
|
|
|
mIVec[i].first = tmp[i];
|
|
|
|
}
|
2018-12-02 22:08:51 +01:00
|
|
|
sync();
|
2018-11-01 22:11:08 +01:00
|
|
|
return *this;
|
|
|
|
}
|
2018-10-30 15:06:29 +01:00
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
template <size_t N>
|
2020-07-08 17:55:51 +02:00
|
|
|
void DynamicIndex::getPtr() {}
|
|
|
|
|
2018-11-01 22:11:08 +01:00
|
|
|
|
|
|
|
struct ForMaker
|
|
|
|
{
|
|
|
|
template <class IVecT>
|
2020-07-08 17:55:51 +02:00
|
|
|
static inline auto mk(size_t i, size_t step, DynamicExpression ex,
|
2018-11-01 22:11:08 +01:00
|
|
|
const IVecT& ivec, bool hidden = false)
|
2020-07-08 17:55:51 +02:00
|
|
|
-> DynamicExpression
|
2018-11-01 22:11:08 +01:00
|
|
|
{
|
2018-12-02 22:08:51 +01:00
|
|
|
if(i == 0) {
|
|
|
|
auto& ii = *ivec[0].first;
|
|
|
|
return hidden ? ii.iforh(step*ivec[i].second, ex) :
|
|
|
|
ii.ifor(step*ivec[i].second, ex);
|
|
|
|
}
|
|
|
|
else {
|
2018-11-01 22:11:08 +01:00
|
|
|
auto& ii = *ivec[i].first;
|
|
|
|
return mk(i-1, step,
|
|
|
|
(hidden ? ii.iforh(step*ivec[i].second, ex) :
|
|
|
|
ii.ifor(step*ivec[i].second, ex)),
|
|
|
|
ivec, hidden);
|
2018-12-02 22:08:51 +01:00
|
|
|
|
2018-11-01 22:11:08 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
template <class Expr>
|
2020-07-08 17:55:51 +02:00
|
|
|
ExpressionHolder<Expr> DynamicIndex::ifor(size_t step, Expr ex) const
|
2018-10-30 15:06:29 +01:00
|
|
|
{
|
2018-12-02 22:08:51 +01:00
|
|
|
if(mIVec.size() == 1){
|
2020-07-08 17:55:51 +02:00
|
|
|
return ExpressionHolder<Expr>(mIVec.back().first->ifor(step,ex));
|
2018-12-02 22:08:51 +01:00
|
|
|
}
|
|
|
|
else {
|
2020-07-08 17:55:51 +02:00
|
|
|
return ExpressionHolder<Expr>(ForMaker::mk(mIVec.size()-2, step,
|
|
|
|
mIVec.back().first->ifor(step,ex),mIVec));
|
2018-12-02 22:08:51 +01:00
|
|
|
}
|
2018-10-30 15:06:29 +01:00
|
|
|
}
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
template <class Expr>
|
2020-07-08 17:55:51 +02:00
|
|
|
ExpressionHolder<Expr> DynamicIndex::iforh(size_t step, Expr ex) const
|
2018-10-30 15:06:29 +01:00
|
|
|
{
|
2018-12-02 22:08:51 +01:00
|
|
|
if(mIVec.size() == 1){
|
2020-07-08 17:55:51 +02:00
|
|
|
return ExpressionHolder<Expr>(mIVec.back().first->iforh(step,ex));
|
2018-12-02 22:08:51 +01:00
|
|
|
}
|
|
|
|
else {
|
2020-07-08 17:55:51 +02:00
|
|
|
return ExpressionHolder<Expr>(ForMaker::mk(mIVec.size()-2, step,
|
|
|
|
mIVec.back().first->iforh(step,ex),
|
|
|
|
mIVec, true));
|
2018-12-02 22:08:51 +01:00
|
|
|
}
|
2018-10-30 15:06:29 +01:00
|
|
|
}
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
2019-01-15 17:41:43 +01:00
|
|
|
template <class Expr>
|
2020-07-08 17:55:51 +02:00
|
|
|
ExpressionHolder<Expr> DynamicIndex::pifor(size_t step, Expr ex) const
|
2019-01-15 17:41:43 +01:00
|
|
|
{
|
|
|
|
return ifor(step, ex); // no multithreading here at the moment...
|
|
|
|
}
|
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
/***********************
|
|
|
|
* DynamicRange *
|
|
|
|
***********************/
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
template <class... RangeTypes>
|
2020-07-08 17:55:51 +02:00
|
|
|
DynamicRange::DynamicRange(const std::tuple<std::shared_ptr<RangeTypes>...>& origs) :
|
|
|
|
RangeInterface<DynamicIndex>()
|
2018-10-30 15:06:29 +01:00
|
|
|
{
|
|
|
|
RPackNum<sizeof...(RangeTypes)-1>::RangesToVec( origs, mOrig );
|
|
|
|
mSize = RPackNum<sizeof...(RangeTypes)-1>::getSize( origs );
|
|
|
|
if(sizeof...(RangeTypes)){
|
|
|
|
mEmpty = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
template <class... RangeTypes>
|
2020-07-08 17:55:51 +02:00
|
|
|
DynamicRange::DynamicRange(std::shared_ptr<RangeTypes>... origs) :
|
|
|
|
RangeInterface<DynamicIndex>()
|
2018-10-30 15:06:29 +01:00
|
|
|
{
|
|
|
|
auto rst = std::make_tuple(origs...);
|
|
|
|
RPackNum<sizeof...(RangeTypes)-1>::RangesToVec( rst, mOrig );
|
|
|
|
mSize = RPackNum<sizeof...(RangeTypes)-1>::getSize( rst );
|
|
|
|
if(sizeof...(RangeTypes)){
|
|
|
|
mEmpty = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
template <class Range>
|
2020-07-08 17:55:51 +02:00
|
|
|
std::shared_ptr<Range> DynamicRange::fullsub(size_t num) const
|
2018-10-30 15:06:29 +01:00
|
|
|
{
|
|
|
|
return std::dynamic_pointer_cast<Range>( mOrig.at(num) );
|
|
|
|
}
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
template <class... Ranges>
|
2020-07-08 17:55:51 +02:00
|
|
|
std::shared_ptr<MultiRange<Ranges...> > DynamicRange::scast(SIZET<Ranges>... sizes) const
|
2018-10-30 15:06:29 +01:00
|
|
|
{
|
|
|
|
std::tuple<std::shared_ptr<Ranges>...> rtp;
|
|
|
|
RPackNum<sizeof...(Ranges)-1>::resolveRangeType(mOrig, rtp, 0, sizes...);
|
|
|
|
MultiRangeFactory<Ranges...> mrf(rtp);
|
|
|
|
return std::dynamic_pointer_cast<MultiRange<Ranges...> >( mrf.create() );
|
|
|
|
}
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
} // end namespace MultiArrayTools
|