1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| struct no_arg{};
template <typename function,
typename result_type = boost::function_traits<function>::result_type,
typename arg1_type = boost::function_traits<function>::arg1_type,
std::size_t arity = boost::function_traits<function>::arity>
struct arity_trait;
template <typename unary_function,
typename result_type = boost::function_traits<unary_function>::result_type,
typename arg1_type = boost::function_traits<unary_function>::arg1_type,
std::size_t arity = boost::function_traits<unary_function>::arity>
struct arity_trait<unary_function, result_type, arg1_type, 1>
{
typedef unary_function type;
template <typename bind_arg>
static type bind_function(unary_function f, bind_arg&)
{
return f;
}
};
template <typename binary_function,
typename result_type = boost::function_traits<binary_function>::result_type,
typename arg1_type = boost::function_traits<binary_function>::arg1_type,
std::size_t arity = boost::function_traits<binary_function>::arity>
struct arity_trait<binary_function, result_type, arg1_type, 2>
{
typedef boost::function<result_type(arg1_type)> type;
template <typename bind_arg>
static type bind_function(binary_function f, bind_arg& arg)
{
return boost::bind(f(), boost::bind(deref<bind_arg>, arg));
}
};
template <typename function, typename iterator>
struct condition_trait
{
template <typename base_iterator, typename bind_arg>
static iterator<function, base_iterator> begin(base_iterator b, base_iterator e, bind_arg &arg)
{
typedef arity_trait<function> binding;
return iterator<binding::type, base_iterator>(binding::bind_function(function(), arg), b, e);
}
template <typename base_iterator, typename bind_arg>
static iterator<function, base_iterator> end(base_iterator b, base_iterator e, bind_arg &arg)
{
typedef arity_trait<function> binding;
return iterator<binding::type, base_iterator>(binding::bind_function(function(), arg), e, e);
}
};
template <typename condition, typename iterator>
struct condition_trait<no_arg, iterator>
{
template <typename base_iterator, typename bind_arg>
static base_iterator& begin(base_iterator &b, base_iterator &, bind_arg&)
{
return b;
}
template <typename base_iterator, typename bind_arg>
static base_iterator& end(base_iterator &e, bind_arg&)
{
return e;
}
} |
Partager