diff --git a/src/include/ranges/anonymous_range.h b/src/include/ranges/anonymous_range.h index c079697..ca24747 100644 --- a/src/include/ranges/anonymous_range.h +++ b/src/include/ranges/anonymous_range.h @@ -5,7 +5,7 @@ #include #include -//#include "base_def.h" +#include "rbase_def.h" #include "ranges/range_base.h" #include "ranges/rpheader.h" @@ -24,7 +24,7 @@ namespace MultiArrayTools typedef AnonymousRange oType; - AnonymousRangeFactory() = delete; + AnonymousRangeFactory() = default; template AnonymousRangeFactory(const std::tuple...>& origs); @@ -120,7 +120,32 @@ namespace MultiArrayTools { std::dynamic_pointer_cast(mProd)->mOrig.push_back(r); } - + + /***************** + * Functions * + *****************/ + + std::shared_ptr defaultRange(size_t size = 0); +} + +namespace MultiArrayHelper +{ + using namespace MultiArrayTools; + template <> + inline void resolveSetRange(std::shared_ptr rp, + std::vector > 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( arf.create() ); + } +} + +namespace MultiArrayTools +{ /*********************** * AnonymousRange * ***********************/ @@ -155,15 +180,12 @@ namespace MultiArrayTools { std::tuple rtp; RPackNum::resolveRangeType(mOrig, rtp, mOrig.size()-1, sizes...); - MultiRangeFactory mrf(rtp); + MultiRangeFactory mrf(rtp); return std::dynamic_pointer_cast >( mrf->create() ); } - /***************** - * Functions * - *****************/ - std::shared_ptr defaultRange(size_t size = 0); + } #endif diff --git a/src/include/ranges/rbase_def.h b/src/include/ranges/rbase_def.h index 8c61363..d1ae3e3 100644 --- a/src/include/ranges/rbase_def.h +++ b/src/include/ranges/rbase_def.h @@ -71,6 +71,7 @@ namespace MultiArrayTools // anonymous_range.h class AnonymousRange; + } #endif diff --git a/src/include/ranges/rpack_num.h b/src/include/ranges/rpack_num.h index cdab813..8366f43 100644 --- a/src/include/ranges/rpack_num.h +++ b/src/include/ranges/rpack_num.h @@ -3,6 +3,11 @@ #define __rpack_num_h__ #include +#include +#include +#include "ranges/rbase_def.h" +#include "ranges/index_base.h" + namespace MultiArrayHelper { @@ -39,6 +44,7 @@ namespace MultiArrayHelper template inline size_t getStepSize(const Index& ii, std::intptr_t j); + template void resolveSetRange(std::shared_ptr rp, std::vector > orig, size_t origpos, size_t size) @@ -46,18 +52,6 @@ namespace MultiArrayHelper assert(size == 1); rp = std::dynamic_pointer_cast( orig[origpos] ); // catch bad cast here!! } - - template <> - void resolveSetRange(std::shared_ptr rp, - std::vector > 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( arf.create() ); - } template struct RPackNum @@ -276,11 +270,10 @@ namespace MultiArrayHelper } template - static void resolveRangeType(const std::vector > orig, - const RangeTuple& rtp, size_t off, size_t size, SIZET... sizes) + static inline void resolveRangeType(const std::vector > orig, + const RangeTuple& rtp, size_t off, size_t size, SIZET... sizes) { constexpr size_t tps = std::tuple_size::value; - typedef decltype(std::get(rtp)) RangeType; resolveSetRange(std::get(rtp), orig, off, size); RPackNum::resolveRangeType(orig, rtp, off-size, sizes...); } @@ -464,11 +457,10 @@ namespace MultiArrayHelper } template - static void resolveRangeType(const std::vector > orig, - const RangeTuple& rtp, size_t off, size_t size) + static inline void resolveRangeType(const std::vector > orig, + const RangeTuple& rtp, size_t off, size_t size) { constexpr size_t tps = std::tuple_size::value; - typedef decltype(std::get(rtp)) RangeType; resolveSetRange(std::get(rtp), orig, off, size); } diff --git a/src/include/ranges/single_range.h b/src/include/ranges/single_range.h index 30954b2..eb0602e 100644 --- a/src/include/ranges/single_range.h +++ b/src/include/ranges/single_range.h @@ -8,6 +8,7 @@ #include //#include "base_def.h" +//#include "ranges/rpack_num.h" #include "ranges/index_base.h" #include "ranges/range_base.h" diff --git a/src/lib/ranges/anonymous_range.cc b/src/lib/ranges/anonymous_range.cc index 0ee7622..5746191 100644 --- a/src/lib/ranges/anonymous_range.cc +++ b/src/lib/ranges/anonymous_range.cc @@ -7,15 +7,15 @@ namespace MultiArrayTools * AnonymousRangeFactory * ******************************/ - std::shared_ptr checkIfCreated(const std::vector >& pvec) + std::shared_ptr AnonymousRangeFactory::checkIfCreated(const std::vector >& pvec) { std::shared_ptr 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( pvec[i].get() ) ){ + for(size_t i = 0; i != x.second.size(); ++i){ + if(x.second[i] != reinterpret_cast( pvec[i].get() ) ){ check = false; break; } @@ -29,7 +29,7 @@ namespace MultiArrayTools if(not check){ std::vector app(pvec.size()); for(size_t i = 0; i != app.size(); ++i){ - app[i] = static_cast( pvec[i].get() ); + app[i] = reinterpret_cast( pvec[i].get() ); } mAleadyCreated[mProd] = app; out = mProd; @@ -40,7 +40,7 @@ namespace MultiArrayTools std::shared_ptr AnonymousRangeFactory::create() { - mProd = checkIfCreated(); + mProd = checkIfCreated(std::dynamic_pointer_cast(mProd)->mOrig); setSelf(); return mProd; } @@ -104,5 +104,7 @@ namespace MultiArrayTools (ClassicRange::factory(size).create() ) ); return std::dynamic_pointer_cast( arf.create() ); } - + + + } // end namespace MultiArrayTools