// -*- C++ -*- #ifndef __anonymous_range_h__ #define __anonymous_range_h__ #include //#include "base_def.h" #include "ranges/range_base.h" #include "ranges/rpheader.h" namespace MultiArrayTools { typedef SingleIndex AnonymousIndex; class AnonymousRangeFactory : public RangeFactoryBase { public: typedef AnonymousRange oType; AnonymousRangeFactory() = delete; template AnonymousRangeFactory(const std::tuple...>& origs); template AnonymousRangeFactory(std::shared_ptr... origs); template void append(std::shared_ptr r); std::shared_ptr create(); }; class AnonymousRange : public RangeInterface { public: static constexpr bool defaultable = false; static constexpr size_t ISSTATIC = 0; static constexpr size_t SIZE = -1; static constexpr bool HASMETACONT = false; typedef RangeBase RB; typedef typename RangeInterface::IndexType IndexType; virtual size_t size() const override; virtual size_t dim() const override; size_t get(size_t pos) const; size_t getMeta(size_t metaPos) const; virtual IndexType begin() const override; virtual IndexType end() const override; std::shared_ptr sub(size_t num) const; template std::shared_ptr fullsub(size_t num) const; template MultiRange scast() const; // save cast friend AnonymousRangeFactory; protected: AnonymousRange() = delete; AnonymousRange(const AnonymousRange& in) = delete; template AnonymousRange(const std::tuple...>& origs); template AnonymousRange(std::shared_ptr... origs); size_t mSize; std::vector > mOrig; }; } /* ========================= * * --- TEMPLATE CODE --- * * ========================= */ namespace MultiArrayTools { /*********************** * AnonymousRange * ***********************/ template AnonymousRangeFactory::AnonymousRangeFactory(const std::tuple...>& origs) { mProd = std::shared_ptr( new AnonymousRange( origs ) ); } template AnonymousRangeFactory::AnonymousRangeFactory(std::shared_ptr... origs) { mProd = std::shared_ptr( new AnonymousRange( origs... ) ); } template void AnonymousRangeFactory::append(std::shared_ptr r) { std::dynamic_pointer_cast(mProd)->mOrig.push_back(r); } /*********************** * AnonymousRange * ***********************/ template AnonymousRange::AnonymousRange(const std::tuple...>& origs) : RangeInterface() { mOrig.resize(sizeof...(RangeTypes)); RPackNum::RangesToVec( origs, mOrig ); RPackNum::getSize( origs ); } template AnonymousRange::AnonymousRange(std::shared_ptr... origs) : RangeInterface() { auto rst = std::make_tuple(origs...); mOrig.resize(sizeof...(RangeTypes)); //RPackNum::RangesToVec( rst, mOrig ); //RPackNum::getSize( rst ); } template std::shared_ptr AnonymousRange::fullsub(size_t num) const { return std::dynamic_pointer_cast( mOrig.at(num) ); } template MultiRange AnonymousRange::scast() const { // !!!!!! } /***************** * Functions * *****************/ std::shared_ptr defaultRange(size_t size = 0); } #endif