im com (while extending anonymous range)

This commit is contained in:
Christian Zimmermann 2018-07-15 15:22:15 +02:00
parent 370a5c52ad
commit 0d951f892a
3 changed files with 90 additions and 7 deletions

View file

@ -4,6 +4,7 @@
#define __anonymous_range_h__
#include <cstdlib>
#include <map>
//#include "base_def.h"
#include "ranges/range_base.h"
#include "ranges/rpheader.h"
@ -13,6 +14,10 @@ namespace MultiArrayTools
typedef SingleIndex<size_t,SpaceType::NONE> AnonymousIndex;
template <class R>
using SIZET = size_t;
// NOT THREAD SAVE!!
class AnonymousRangeFactory : public RangeFactoryBase
{
public:
@ -31,7 +36,11 @@ namespace MultiArrayTools
void append(std::shared_ptr<Range> r);
std::shared_ptr<RangeBase> create();
private:
std::shared_ptr<RangeBase> checkIfCreated(const std::vector<std::shared_ptr<RangeBase> >& pvec);
static std::map<std::shared_ptr<RangeBase>,std::vector<std::intptr_t> > mAleadyCreated;
};
class AnonymousRange : public RangeInterface<AnonymousIndex>
@ -61,7 +70,7 @@ namespace MultiArrayTools
std::shared_ptr<Range> fullsub(size_t num) const;
template <class... Ranges>
MultiRange<Ranges...> scast() const; // save cast
MultiRange<Ranges...> scast(SIZET<Ranges>... sizes) const; // save cast
friend AnonymousRangeFactory;
@ -110,7 +119,7 @@ namespace MultiArrayTools
void AnonymousRangeFactory::append(std::shared_ptr<Range> r)
{
std::dynamic_pointer_cast<oType>(mProd)->mOrig.push_back(r);
}
}
/***********************
* AnonymousRange *
@ -131,8 +140,8 @@ 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 );
RPackNum<sizeof...(RangeTypes)-1>::RangesToVec( rst, mOrig );
RPackNum<sizeof...(RangeTypes)-1>::getSize( rst );
}
template <class Range>
@ -142,9 +151,12 @@ namespace MultiArrayTools
}
template <class... Ranges>
MultiRange<Ranges...> AnonymousRange::scast() const
MultiRange<Ranges...> AnonymousRange::scast(SIZET<Ranges>... sizes) const
{
// !!!!!!
std::tuple<Ranges...> rtp;
RPackNum<sizeof...(Ranges)-1>::resolveRangeType(mOrig, rtp, mOrig.size()-1, sizes...);
MultiRangeFactory<Ranges> mrf(rtp);
return std::dynamic_pointer_cast<MultiRange<Ranges...> >( mrf->create() );
}
/*****************

View file

@ -38,6 +38,26 @@ namespace MultiArrayHelper
template <class Index>
inline size_t getStepSize(const Index& ii, std::intptr_t j);
template <class Range>
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 <>
void resolveSetRange<AnonymousRange>(std::shared_ptr<AnonymousRange> rp,
std::vector<std::shared_ptr<RangeBase> > orig,
size_t origpos, size_t size)
{
AnonymousRangeFactory arf;
for(size_t op = origpos - size + 1; op != origpos + 1; ++op){
arf.append(orig[op]);
}
rp = std::dynamic_pointer_cast<AnonymousRange>( arf.create() );
}
template <size_t N>
struct RPackNum
@ -254,6 +274,16 @@ namespace MultiArrayHelper
sx *= max;
RPackNum<N-1>::getStepSizeX(ii, j, ss, sx);
}
template <class RangeTuple, typename... SIZET>
static void resolveRangeType(const std::vector<std::shared_ptr<RangeBase> > orig,
const RangeTuple& rtp, size_t off, size_t size, SIZET... sizes)
{
constexpr size_t tps = std::tuple_size<RangeTuple>::value;
typedef decltype(std::get<tps-N-1>(rtp)) RangeType;
resolveSetRange(std::get<tps-N-1>(rtp), orig, off, size);
RPackNum<N-1>::resolveRangeType(orig, rtp, off-size, sizes...);
}
};
@ -433,6 +463,15 @@ namespace MultiArrayHelper
sx *= max;
}
template <class RangeTuple, typename... SIZET>
static void resolveRangeType(const std::vector<std::shared_ptr<RangeBase> > orig,
const RangeTuple& rtp, size_t off, size_t size)
{
constexpr size_t tps = std::tuple_size<RangeTuple>::value;
typedef decltype(std::get<tps-1>(rtp)) RangeType;
resolveSetRange(std::get<tps-1>(rtp), orig, off, size);
}
};
template <IndexType IT>

View file

@ -6,10 +6,42 @@ namespace MultiArrayTools
/******************************
* AnonymousRangeFactory *
******************************/
std::shared_ptr<RangeBase> checkIfCreated(const std::vector<std::shared_ptr<RangeBase> >& pvec)
{
std::shared_ptr<RangeBase> out;
bool check = false;
for(auto& x: mAleadyCreated){
if(x.second.size() == pvec.size()){
check = true;
for(size_t i = 0; i != x.size(); ++i){
if(x.second[i] != static_cast<std::intptr_t>( pvec[i].get() ) ){
check = false;
break;
}
}
if(check == true){
out = x.first;
break;
}
}
}
if(not check){
std::vector<std::intptr_t> app(pvec.size());
for(size_t i = 0; i != app.size(); ++i){
app[i] = static_cast<std::intptr_t>( pvec[i].get() );
}
mAleadyCreated[mProd] = app;
out = mProd;
}
return out;
}
std::shared_ptr<RangeBase> AnonymousRangeFactory::create()
{
//setSelf();
mProd = checkIfCreated();
setSelf();
return mProd;
}