cnorxz/src/pack_num.h

78 lines
2 KiB
C
Raw Normal View History

// -*- C++ -*-
2017-08-04 11:27:47 +02:00
#ifndef __pack_num_h__
#define __pack_num_h__
#include <cstdlib>
2017-12-18 11:19:04 +01:00
//#include <type_traits>
#include <tuple>
2017-12-18 11:19:04 +01:00
#include <ostream>
2017-08-04 11:27:47 +02:00
#include "base_def.h"
namespace MultiArrayHelper
{
2017-12-17 17:40:55 +01:00
template <size_t N>
struct PackNum
{
2017-12-18 11:19:04 +01:00
2017-08-30 17:56:38 +02:00
template <class... Ops>
static void makeBlockTypeVec(std::vector<std::pair<BlockType,size_t> >& btv,
const std::tuple<Ops...>& ops,
std::shared_ptr<VIWB> idxPtr)
2017-08-30 17:56:38 +02:00
{
2017-09-09 19:59:09 +02:00
auto subvec = std::move( std::get<N>(ops).block(idxPtr) );
2017-08-30 17:56:38 +02:00
btv.insert(btv.end(), subvec.begin(), subvec.end() );
2017-12-18 11:19:04 +01:00
BPackNum<N-1>::makeBlockTypeVec(btv, ops, idxPtr);
2017-08-30 17:56:38 +02:00
}
2017-09-11 12:54:24 +02:00
2017-12-17 17:40:55 +01:00
template <typename T, class Func, class ArgTuple, class... Args>
static BlockResult<T> unpackArgs(const ArgTuple& tp, const Args&... args)
{
2017-12-18 11:19:04 +01:00
return BPackNum<N-1>::template unpackArgs<T,Func>(tp, std::get<N>(tp).get(), args...);
2017-12-17 17:40:55 +01:00
}
2017-09-11 12:54:24 +02:00
template <typename... T>
static void printTuple(std::ostream& out, const std::tuple<T...>& tp){
out << std::get<sizeof...(T)-N-1>(tp) << ", ";
PackNum<N-1>::printTuple(out, tp);
}
2017-12-05 17:31:57 +01:00
};
template<>
struct PackNum<0>
{
2017-08-11 15:26:10 +02:00
template <typename T, class Func, class ArgTuple, class... Args>
2017-09-09 19:59:09 +02:00
static BlockResult<T> unpackArgs(const ArgTuple& tp, const Args&... args)
2017-08-11 15:26:10 +02:00
{
static_assert(sizeof...(Args) == std::tuple_size<ArgTuple>::value-1,
"inconsistent number of arguments");
static BlockBinaryOp<T,Func,decltype(std::get<0>(tp).get()), decltype(args)...> f;
2017-08-11 15:26:10 +02:00
return f(std::get<0>(tp).get(), args...);
}
2017-08-30 17:56:38 +02:00
template <class... Ops>
static void makeBlockTypeVec(std::vector<std::pair<BlockType,size_t> >& btv,
const std::tuple<Ops...>& ops,
std::shared_ptr<VIWB> idxPtr)
2017-08-30 17:56:38 +02:00
{
2017-09-09 19:59:09 +02:00
auto subvec = std::move( std::get<0>(ops).block(idxPtr) );
2017-08-30 17:56:38 +02:00
btv.insert(btv.end(), subvec.begin(), subvec.end() );
}
2017-12-18 11:19:04 +01:00
2017-09-11 12:54:24 +02:00
template <typename... T>
static void printTuple(std::ostream& out, const std::tuple<T...>& tp){
out << std::get<sizeof...(T)-1>(tp);
}
};
} // end namespace MultiArrayHelper
2017-08-04 11:27:47 +02:00
#endif