// -*- C++ -*- #ifndef __pack_num_h__ #define __pack_num_h__ #include //#include #include #include #include "base_def.h" #include "xfor/exttype.h" namespace MultiArrayHelper { template struct PackNum { template static void printTuple(std::ostream& out, const std::tuple& tp) { out << std::get(tp) << ", "; PackNum::printTuple(out, tp); } template static auto mkSteps(std::intptr_t ii, const std::tuple& otp) -> decltype(PackNum::mkSteps(ii, otp).extend( std::get(otp).rootSteps(ii)) ) { return PackNum::mkSteps(ii, otp).extend( std::get(otp).rootSteps(ii)); } template static void mkExt(std::array& out, const std::array& siar, const OpClass& second) { std::get(out) = second.rootSteps( std::get(siar) ); PackNum::mkExt(out, siar, second); } template static inline T mkOpExpr(const ETuple& pos, const OpTuple& ops, const Args&... args) { typedef typename std::remove_reference(ops))>::type NextOpType; static_assert(LAST > NextOpType::SIZE, "inconsistent array positions"); static constexpr size_t NEXT = LAST - NextOpType::SIZE; return PackNum::template mkOpExpr ( pos, ops, std::get(ops).get(Getter::template getX( pos )), args...); } template static auto mkLoop( const OpTuple& ot, Expr exp ) -> decltype(std::get(ot).loop( PackNum::mkLoop(ot,exp) )) { return std::get(ot).loop( PackNum::mkLoop(ot,exp) ); } }; template<> struct PackNum<0> { template static void printTuple(std::ostream& out, const std::tuple& tp) { out << std::get(tp); } template static auto mkSteps(std::intptr_t ii, const std::tuple& otp) -> decltype(std::get<0>(otp).rootSteps(ii)) { return std::get<0>(otp).rootSteps(ii); } template static void mkExt(std::array& out, const std::array& siar, const OpClass& second) { std::get<0>(out) = second.rootSteps( std::get<0>(siar) ); } template static inline T mkOpExpr(const ETuple& pos, const OpTuple& ops, const Args&... args) { typedef typename std::remove_reference(ops))>::type NextOpType; static constexpr size_t NEXT = LAST - NextOpType::SIZE; static_assert(NEXT == 0, "inconsistent array positions"); return OpFunction::apply(std::get<0>(ops).get(Getter<0>::template getX( pos )), args...); } template static auto mkLoop( const OpTuple& ot, Expr exp ) -> decltype(std::get<0>(ot).loop( exp )) { return std::get<0>(ot).loop( exp ); } }; } // end namespace MultiArrayHelper #endif