diff --git a/src/include/ranges/dynamic_range.cc.h b/src/include/ranges/dynamic_range.cc.h index 2c05125..97ca41e 100644 --- a/src/include/ranges/dynamic_range.cc.h +++ b/src/include/ranges/dynamic_range.cc.h @@ -2,7 +2,7 @@ #include "ranges/dynamic_range.h" //#include "ranges/dynamic_meta.h" -#include "rpack_num.h" +//#include "rpack_num.h" namespace MultiArrayTools { @@ -32,20 +32,6 @@ namespace MultiArrayTools - template - void DynamicRangeFactory::appendx(std::shared_ptr r) - { - if(mProductCreated){ - - mProd = std::shared_ptr( new DynamicRange( *std::dynamic_pointer_cast(mProd) ) ); - mProductCreated = false; - } - std::dynamic_pointer_cast(mProd)->mOrig.push_back(r); - std::dynamic_pointer_cast(mProd)->mSize *= r->size(); - std::dynamic_pointer_cast(mProd)->mEmpty = false; - //std::dynamic_pointer_cast(mProd)->mProtoI.push_back(mkIndexWrapper(r->begin())); - } - template void DynamicRangeFactory::append(std::shared_ptr r) { @@ -57,7 +43,6 @@ namespace MultiArrayTools std::dynamic_pointer_cast(mProd)->mOrig.push_back(r); std::dynamic_pointer_cast(mProd)->mSize *= r->size(); std::dynamic_pointer_cast(mProd)->mEmpty = false; - std::dynamic_pointer_cast(mProd)->mProtoI.push_back(mkIndexWrapper(r->begin())); } @@ -148,51 +133,11 @@ namespace MultiArrayTools * DynamicRange * ***********************/ - template - struct InitProto - { - template - static void mk(vector>& proto, - const std::tuple...>& orig) - { - proto[N] = mkIndexWrapper(std::get(orig)->begin()); - InitProto::mk(proto, orig); - } - - template - static void mk(vector>& proto, size_t n, - std::shared_ptr o, std::shared_ptr... origs) - { - proto[n-1-N] = mkIndexWrapper(o->begin()); - InitProto::mk(proto, n, origs...); - } - }; - - template <> - struct InitProto<0> - { - template - static void mk(vector>& proto, - const std::tuple...>& orig) - { - proto[0] = mkIndexWrapper(std::get<0>(orig)->begin()); - } - - template - static void mk(vector>& proto, size_t n, - std::shared_ptr o, std::shared_ptr... origs) - { - proto[n-1] = mkIndexWrapper(o->begin()); -} - }; - template DynamicRange::DynamicRange(const std::tuple...>& origs) : RangeInterface() { RPackNum::RangesToVec( origs, mOrig ); - mProtoI.resize(sizeof...(RangeTypes)); - InitProto::mk(mProtoI, origs); mSize = RPackNum::getSize( origs ); if(sizeof...(RangeTypes)){ mEmpty = false; @@ -206,8 +151,6 @@ namespace MultiArrayTools { auto rst = std::make_tuple(origs...); RPackNum::RangesToVec( rst, mOrig ); - mProtoI.resize(sizeof...(RangeTypes)); - InitProto::mk(mProtoI, sizeof...(RangeTypes), origs...); mSize = RPackNum::getSize( rst ); if(sizeof...(RangeTypes)){ mEmpty = false; @@ -233,3 +176,53 @@ namespace MultiArrayTools } // end namespace MultiArrayTools + +namespace MultiArrayHelper +{ + namespace + { + using namespace MultiArrayTools; + } + + template <> + inline void resolveSetRange(std::shared_ptr& rp, + const vector >& orig, + size_t origpos, size_t size) + { + DynamicRangeFactory arf; + for(size_t op = origpos; op != origpos + size; ++op){ + //VCHECK(op); + arf.append(orig[op]); + } + rp = std::dynamic_pointer_cast( arf.create() ); + } + + template <> + inline void setRangeToVec(vector >& v, + std::shared_ptr r) + { + if(not r->isEmpty()){ + for(size_t i = r->dim(); i != 0; --i){ + v.insert(v.begin(), r->sub(i-1)); + } + } + } + + template <> + inline size_t getStepSize(const DynamicIndex& ii, std::intptr_t j) + { + size_t ss = 0; + size_t sx = 1; + for(size_t k = ii.dim(); k != 0; --k){ + const size_t i = k-1; + const auto& ni = ii.get(i); + const size_t max = ni.max(); + const size_t tmp = ni.getStepSizeComp(j); + ss += tmp * ii.getStepSize(i); + sx *= max; + } + return ss; + } + +} + diff --git a/src/include/ranges/dynamic_range.h b/src/include/ranges/dynamic_range.h index c22bfc2..39b9bbd 100644 --- a/src/include/ranges/dynamic_range.h +++ b/src/include/ranges/dynamic_range.h @@ -17,6 +17,7 @@ #include "ranges/dynamic_meta.h" #include "index_wrapper.h" +#include "rpack_num.h" namespace MultiArrayTools { @@ -24,23 +25,6 @@ namespace MultiArrayTools { using namespace MultiArrayHelper; } - //using MultiArrayHelper::DynamicExpression; - - //using MultiArrayHelper::ExpressionHolder; - /* - class AbstractIW - { - public: - AbstractIW() = default; - AbstractIW(const AbstractIW& in) = default; - AbstractIW(AbstractIW&& in) = default; - AbstractIW& operator=(const AbstractIW& in) = default; - AbstractIW& operator=(AbstractIW&& in) = default; - - }; - */ - - //typedef SingleRange DynamicRange; class DynamicIndex : public IndexInterface> { @@ -142,10 +126,7 @@ namespace MultiArrayTools template void append(std::shared_ptr r); - template - void appendx(std::shared_ptr r); - - std::shared_ptr create(); + std::shared_ptr create(); private: @@ -164,7 +145,6 @@ namespace MultiArrayTools static constexpr size_t SIZE = -1; static constexpr bool HASMETACONT = false; - typedef vector> IVecT; typedef RangeBase RB; typedef DynamicIndex IndexType; typedef DynamicRange RangeType; @@ -187,7 +167,6 @@ namespace MultiArrayTools bool mEmpty = true; vector > mOrig; - IVecT mProtoI; public: virtual size_t size() const final; @@ -209,7 +188,6 @@ namespace MultiArrayTools virtual vector data() const final; std::shared_ptr sub(size_t num) const; - std::shared_ptr subI(size_t num) const; template std::shared_ptr fullsub(size_t num) const; @@ -235,44 +213,22 @@ namespace MultiArrayTools namespace MultiArrayHelper { - using namespace MultiArrayTools; - - inline void resolveSetRange(std::shared_ptr& rp, - const vector >& orig, - size_t origpos, size_t size) + namespace { - DynamicRangeFactory arf; - for(size_t op = origpos; op != origpos + size; ++op){ - //VCHECK(op); - arf.appendx(orig[op]); - } - rp = std::dynamic_pointer_cast( arf.create() ); + using namespace MultiArrayTools; } - inline void setRangeToVec(vector >& v, - std::shared_ptr r) - { - if(not r->isEmpty()){ - for(size_t i = r->dim(); i != 0; --i){ - v.insert(v.begin(), r->sub(i-1)); - } - } - } + template <> + inline void resolveSetRange(std::shared_ptr& rp, + const vector >& orig, + size_t origpos, size_t size); - inline size_t getStepSize(const DynamicIndex& ii, std::intptr_t j) - { - size_t ss = 0; - size_t sx = 1; - for(size_t k = ii.dim(); k != 0; --k){ - const size_t i = k-1; - const auto& ni = ii.get(i); - const size_t max = ni.max(); - const size_t tmp = ni.getStepSizeComp(j); - ss += tmp * ii.getStepSize(i); - sx *= max; - } - return ss; - } + template <> + inline void setRangeToVec(vector >& v, + std::shared_ptr r); + + template <> + inline size_t getStepSize(const DynamicIndex& ii, std::intptr_t j); } diff --git a/src/include/ranges/index_wrapper.cc.h b/src/include/ranges/index_wrapper.cc.h index 212eb1a..fae672e 100644 --- a/src/include/ranges/index_wrapper.cc.h +++ b/src/include/ranges/index_wrapper.cc.h @@ -145,7 +145,7 @@ namespace MultiArrayTools } template - std::shared_ptr mkIndexWrapper(const Index& i) + inline std::shared_ptr mkIndexWrapper(const Index& i) { return std::make_shared>(std::make_shared(i)); } diff --git a/src/include/ranges/index_wrapper.h b/src/include/ranges/index_wrapper.h index 3890a35..bd8dbef 100644 --- a/src/include/ranges/index_wrapper.h +++ b/src/include/ranges/index_wrapper.h @@ -136,10 +136,10 @@ namespace MultiArrayTools virtual std::shared_ptr duplicate() const override final; }; - + /* template std::shared_ptr mkIndexWrapper(const Index& i); - + */ } #endif diff --git a/src/include/ranges/range_base.h b/src/include/ranges/range_base.h index 5c27a76..dd2b421 100644 --- a/src/include/ranges/range_base.h +++ b/src/include/ranges/range_base.h @@ -100,6 +100,9 @@ namespace MultiArrayTools RangeBase() = default; std::weak_ptr mThis; }; + + template + inline std::shared_ptr mkIndexWrapper(const Index& i); template class RangeInterface : public RangeBase @@ -114,8 +117,9 @@ namespace MultiArrayTools virtual Index begin() const = 0; virtual Index end() const = 0; virtual std::shared_ptr aindex() const override final + { return mkIndexWrapper(this->begin()); } //{ auto i = std::make_shared(this->begin()); return std::make_shared>(i); } //!!! - { auto i = std::make_shared(this->begin()); return nullptr; } //!!! + //{ auto i = std::make_shared(this->begin()); return nullptr; } //!!! protected: RangeInterface() = default; diff --git a/src/lib/ranges/dynamic_range.cc b/src/lib/ranges/dynamic_range.cc index eade459..bf67603 100644 --- a/src/lib/ranges/dynamic_range.cc +++ b/src/lib/ranges/dynamic_range.cc @@ -179,7 +179,7 @@ namespace MultiArrayTools assert(this->range()->sub(i) == sIMap.at(iname)->range()); } else { - sIMap[iname] = this->range()->subI(i); + sIMap[iname] = this->range()->sub(i)->aindex(); } mIVec[i].first = sIMap.at(iname); } @@ -445,13 +445,6 @@ namespace MultiArrayTools return mOrig.at(num); } - std::shared_ptr DynamicRange::subI(size_t num) const - { - assert(mProtoI.at(num) != nullptr); - return mProtoI.at(num)->duplicate(); - } - - void DynamicRange::sreplace(const std::shared_ptr in, size_t num) { assert(mOrig[num]->size() == in->size());