22 template<
typename A,
typename B>
23 auto operator()(A a, B b)
29 template<
typename A,
typename B>
30 auto operator()(A a, B b)
36 template<
typename A,
typename B>
37 auto operator()(A a, B b)
43 template<
typename A,
typename B>
44 auto operator()(A a, B b)
51 template<
typename Function,
typename Tuple,
size_t... I>
52 void call(Function f, Tuple t, std::index_sequence<I...>)
57 template<
typename Functor,
typename Num,
typename Tuple,
size_t... I>
58 Tuple do_transform(Functor f,
const Tuple& t, Num n, std::index_sequence<I...>)
60 return std::make_tuple(f(std::get<I>(t), n)...);
62 template<
typename Functor,
typename Tuple,
size_t... I>
63 Tuple do_transform(Functor f,
const Tuple& t1,
const Tuple& t2, std::index_sequence<I...>)
65 return std::make_tuple(f(std::get<I>(t1), std::get<I>(t2))...);
69 template<
typename Function,
typename Tuple>
70 void call(Function f, Tuple t)
72 detail::call(f, t, std::make_index_sequence<std::tuple_size_v<Tuple>>{});
76template<
typename Num,
typename... Types>
77std::tuple<Types...> operator+(
const std::tuple<Types...>& l, Num n)
79 return tuples::detail::do_transform(tuples::detail::functor::add(), l, n,
80 std::make_index_sequence<std::tuple_size_v<std::tuple<Types...>>>{});
82template<
typename Num,
typename... Types>
83std::tuple<Types...> operator+(
const std::tuple<Types...>& l,
const std::tuple<Types...>& r)
85 return tuples::detail::do_transform(tuples::detail::functor::add(), l, r,
86 std::make_index_sequence<std::tuple_size_v<std::tuple<Types...>>>{});
89template<
typename Num,
typename... Types>
90std::tuple<Types...> operator-(
const std::tuple<Types...>& l, Num n)
92 return tuples::detail::do_transform(tuples::detail::functor::sub(), l, n,
93 std::make_index_sequence<std::tuple_size_v<std::tuple<Types...>>>{});
95template<
typename Num,
typename... Types>
96std::tuple<Types...> operator-(
const std::tuple<Types...>& l,
const std::tuple<Types...>& r)
98 return tuples::detail::do_transform(tuples::detail::functor::sub(), l, r,
99 std::make_index_sequence<std::tuple_size_v<std::tuple<Types...>>>{});
103template<
typename Num,
typename... Types>
104std::tuple<Types...> operator/(
const std::tuple<Types...>& l, Num n)
106 return tuples::detail::do_transform(tuples::detail::functor::div(), l, n,
107 std::make_index_sequence<std::tuple_size_v<std::tuple<Types...>>>{});
109template<
typename Num,
typename... Types>
110std::tuple<Types...> operator/(
const std::tuple<Types...>& l,
const std::tuple<Types...>& r)
112 return tuples::detail::do_transform(tuples::detail::functor::div(), l, r,
113 std::make_index_sequence<std::tuple_size_v<std::tuple<Types...>>>{});
116template<
typename Num,
typename... Types>
117std::tuple<Types...> operator*(
const std::tuple<Types...>& l, Num n)
119 return tuples::detail::do_transform(tuples::detail::functor::mul(), l, n,
120 std::make_index_sequence<std::tuple_size_v<std::tuple<Types...>>>{});
122template<
typename Num,
typename... Types>
123std::tuple<Types...> operator*(
const std::tuple<Types...>& l,
const std::tuple<Types...>& r)
125 return tuples::detail::do_transform(tuples::detail::functor::mul(), l, r,
126 std::make_index_sequence<std::tuple_size_v<std::tuple<Types...>>>{});