#include "helper_tools.h" namespace MultiArrayTools { template std::ostream& operator<<(std::ostream& out, const std::tuple& tp) { PackNum::printTuple(out, tp); return out; } template auto getIndex(std::shared_ptr range) -> std::shared_ptr { return std::make_shared(range); } template auto getIndex() -> std::shared_ptr { static_assert( RangeType::defaultable, /*typeid(typename RangeType).name() + */" is not defaultable" ); static auto f = RangeType::factory(); static auto r = std::dynamic_pointer_cast( f.create() ); return std::make_shared(r); } template auto mkMulti(std::shared_ptr... ranges) -> std::shared_ptr > { MultiRangeFactory mrf( ranges... ); return std::dynamic_pointer_cast >( mrf.create() ); } template auto mkMIndex(std::shared_ptr... indices) -> decltype( getIndex( mkMulti( indices->range()... ) ) ) { auto mi = getIndex( mkMulti( indices->range()... ) ); (*mi)( indices... ); return mi; } template auto mkMapR(const std::shared_ptr& f, std::shared_ptr... ranges) -> std::shared_ptr, RangeTypes...> > { typedef FunctionalMultiArray FMA; std::shared_ptr> mrfptr; if(Func::FISSTATIC){ FMA fma(ranges...); mrfptr = std::make_shared >( fma, ranges... ); } else { FMA fma(ranges...,f); mrfptr = std::make_shared >( fma, ranges... ); } return std::dynamic_pointer_cast >( mrfptr->create() ); } template auto mkMapI(const std::shared_ptr& f, std::shared_ptr... indices) -> decltype( getIndex( mkMapR( f, indices->range()... ) ) ) { auto mi = getIndex( mkMapR( f, indices->range()... ) ); (*mi)(indices...); return mi; } template auto mkMulti(std::tuple...> rangesTuple) -> MultiRange { MultiRangeFactory mrf( rangesTuple ); return std::dynamic_pointer_cast >( mrf.create() ); } template auto createExplicit(RangeFactory& rf) -> std::shared_ptr { return std::dynamic_pointer_cast( rf.create() ); } template auto createExplicit(std::shared_ptr rfp) -> std::shared_ptr { return std::dynamic_pointer_cast( rfp->create() ); } template auto createRange(const std::vector& cvec) -> std::shared_ptr { const char* dp = cvec.data(); auto ff = createRangeFactory(&dp); auto rbptr = ff->create(); assert(rbptr->spaceType() == Range::STYPE); // CATCH CAST ERROR HERE !!! return std::dynamic_pointer_cast( rbptr ); } template auto rptr(const MArray& ma) -> decltype(ma.template getRangePtr()) { return ma.template getRangePtr(); } template auto dynamic(const MArray& ma, bool slice) -> std::shared_ptr>> { DynamicRangeFactory drf(ma.range()->space()); if(slice){ return std::make_shared>> ( std::dynamic_pointer_cast>( drf.create() ), ma.data() ); } else { return std::make_shared>> ( std::dynamic_pointer_cast>( drf.create() ), ma.vdata() ); } } }