// -*- C++ -*- #ifndef __anonymous_range_h__ #define __anonymous_range_h__ #include //#include "base_def.h" #include "ranges/range_base.h" #include "ranges/single_range.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); std::shared_ptr create(); }; class AnonymousRange : public RangeInterface { 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; virtual std::shared_ptr index() const override; 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... ) ); } std::shared_ptr AnonymousRangeFactory::create() { setSelf(); return mProd; } /*********************** * 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 ); } size_t AnonymousRange::get(size_t pos) const { return pos; } size_t AnonymousRange::getMeta(size_t metaPos) const { return metaPos; } size_t AnonymousRange::size() const { return mSize; } size_t AnonymousRange::dim() const { return 1; } typename AnonymousRange::IndexType AnonymousRange::begin() const { AnonymousIndex i( std::dynamic_pointer_cast ( std::shared_ptr( RB::mThis ) ) ); i = 0; return i; } typename AnonymousRange::IndexType AnonymousRange::end() const { AnonymousIndex i( std::dynamic_pointer_cast ( std::shared_ptr( RB::mThis ) ) ); i = size(); return i; } // put this in the interface class !!! std::shared_ptr AnonymousRange::index() const { typedef IndexWrapper IW; return std::make_shared (std::make_shared ( std::dynamic_pointer_cast ( std::shared_ptr( RB::mThis ) ) ) ); } } #endif