// -*- C++ -*- #ifndef __pack_num_h__ #define __pack_num_h__ #include #include #include #include #include "base_def.h" namespace MultiArrayHelper { using namespace MultiArrayTools; template std::ostream& operator<<(std::ostream& out, const std::tuple& tp); template struct PackNum { template static void makeBlockTypeVec(std::vector >& btv, const std::tuple& ops, std::shared_ptr idxPtr) { auto subvec = std::move( std::get(ops).block(idxPtr) ); btv.insert(btv.end(), subvec.begin(), subvec.end() ); PackNum::makeBlockTypeVec(btv, ops, idxPtr); } template static BlockResult unpackArgs(const ArgTuple& tp, const Args&... args) { return PackNum::template unpackArgs(tp, std::get(tp).get(), args...); } template static void printTuple(std::ostream& out, const std::tuple& tp){ out << std::get(tp) << ", "; PackNum::printTuple(out, tp); } }; template<> struct PackNum<0> { template static BlockResult unpackArgs(const ArgTuple& tp, const Args&... args) { static_assert(sizeof...(Args) == std::tuple_size::value-1, "inconsistent number of arguments"); static BlockBinaryOp(tp).get()), decltype(args)...> f; return f(std::get<0>(tp).get(), args...); } template static void makeBlockTypeVec(std::vector >& btv, const std::tuple& ops, std::shared_ptr idxPtr) { auto subvec = std::move( std::get<0>(ops).block(idxPtr) ); btv.insert(btv.end(), subvec.begin(), subvec.end() ); } template static void printTuple(std::ostream& out, const std::tuple& tp){ out << std::get(tp); } }; template std::ostream& operator<<(std::ostream& out, const std::tuple& tp) { PackNum::printTuple(out, tp); return out; } } // end namespace MultiArrayHelper #endif