8 #ifndef SIG_UTIL_BINARY_OPERATION_HPP
9 #define SIG_UTIL_BINARY_OPERATION_HPP
11 #include "../helper/helper_modules.hpp"
12 #include "../helper/container_helper.hpp"
28 template <
class OP,
class T1,
class T2,
29 typename std::enable_if<
30 (!impl::container_traits<typename impl::remove_const_reference<T1>::type>::exist) && (!impl::container_traits<
typename impl::remove_const_reference<T2>::type>::exist)
36 return std::forward<OP>(func)(std::forward<T1>(v1), std::forward<T2>(v2));
40 template <
class OP,
class C1,
class C2,
41 class CR1 =
typename impl::remove_const_reference<C1>::type,
42 class CR2 =
typename impl::remove_const_reference<C2>::type,
43 class AT1 =
typename impl::forward_element<C1>::type,
44 class AT2 =
typename impl::forward_element<C2>::type,
45 typename std::enable_if<
46 impl::container_traits<CR1>::exist && impl::container_traits<CR2>::exist
52 std::forward<OP>(func),
58 using RT = decltype(
impl::eval(std::forward<OP>(func), std::declval<AT1>(), std::declval<AT2>()));
61 const uint length =
min(c1.size(), c2.size());
69 template <
class OP,
class C,
class T,
70 class CR =
typename impl::remove_const_reference<C>::type,
71 class ET =
typename impl::forward_element<C>::type,
72 typename std::enable_if<
73 impl::container_traits<CR>::exist && (!impl::container_traits<typename impl::remove_const_reference<T>::type>::exist)
79 std::forward<OP>(func),
85 using RT = decltype(
impl::eval(std::forward<OP>(func), std::declval<ET>(), v));
90 for (
auto&& e : std::forward<C>(c)){
97 template <
class OP,
class T,
class C,
98 class ET =
typename impl::forward_element<C>::type,
99 class CR =
typename impl::remove_const_reference<C>::type,
100 typename std::enable_if<
101 (!impl::container_traits<typename impl::remove_const_reference<T>::type>::exist) && impl::container_traits<CR>::exist
107 std::forward<OP>(func),
113 using RT = decltype(
impl::eval(std::forward<OP>(func), v, std::declval<ET>()));
118 for (
auto&& e : std::forward<C>(c)){
126 template <
class T1,
class T2>
134 template <
class T1,
class T2>
142 template <
class T1,
class T2>
150 template <
class T1,
class T2>
151 auto div(T1&& v1, T2&& v2)
158 template <
class T1,
class T2,
159 class TR1 =
typename impl::remove_const_reference<T1>::type,
160 class TR2 =
typename impl::remove_const_reference<T2>::type,
161 typename std::enable_if<
162 impl::container_traits<TR1>::exist || impl::container_traits<TR2>::exist
173 template <
class T1,
class T2,
174 class TR1 =
typename impl::remove_const_reference<T1>::type,
175 class TR2 =
typename impl::remove_const_reference<T2>::type,
176 typename std::enable_if<
177 impl::container_traits<TR1>::exist || impl::container_traits<TR2>::exist
188 template <
class T1,
class T2,
189 class TR1 =
typename impl::remove_const_reference<T1>::type,
190 class TR2 =
typename impl::remove_const_reference<T2>::type,
191 typename std::enable_if<
192 impl::container_traits<TR1>::exist || impl::container_traits<TR2>::exist
203 template <
class T1,
class T2,
204 class TR1 =
typename impl::remove_const_reference<T1>::type,
205 class TR2 =
typename impl::remove_const_reference<T2>::type,
206 typename std::enable_if<
207 impl::container_traits<TR1>::exist || impl::container_traits<TR2>::exist
auto operator*(T1 &&v1, T2 &&v2) -> decltype(binary_operation(mult_t(), std::forward< T1 >(v1), std::forward< T2 >(v2)))
auto operator+(T1 &&v1, T2 &&v2) -> decltype(binary_operation(plus_t(), std::forward< T1 >(v1), std::forward< T2 >(v2)))
auto binary_operation(OP &&func, T1 &&v1, T2 &&v2) -> typename impl::remove_const_reference< decltype(impl::eval(std::forward< OP >(func), std::forward< T1 >(v1), std::forward< T2 >(v2)))>::type
二項演算 (scalar and scalar)
auto plus(T1 &&v1, T2 &&v2) -> decltype(binary_operation(plus_t(), std::forward< T1 >(v1), std::forward< T2 >(v2)))
auto div(T1 &&v1, T2 &&v2) -> decltype(binary_operation(div_t(), std::forward< T1 >(v1), std::forward< T2 >(v2)))
auto operator/(T1 &&v1, T2 &&v2) -> decltype(binary_operation(div_t(), std::forward< T1 >(v1), std::forward< T2 >(v2)))
auto mult(T1 &&v1, T2 &&v2) -> decltype(binary_operation(mult_t(), std::forward< T1 >(v1), std::forward< T2 >(v2)))
auto minus(T1 &&v1, T2 &&v2) -> decltype(binary_operation(minus_t(), std::forward< T1 >(v1), std::forward< T2 >(v2)))
auto operator-(T1 &&v1, T2 &&v2) -> decltype(binary_operation(minus_t(), std::forward< T1 >(v1), std::forward< T2 >(v2)))
auto eval(F &&f, Args &&...args) -> decltype(f(std::forward< Args >(args)...))
auto begin(C &&c) -> std::move_iterator< typename RC::iterator >
void iterative_make(uint loop, C &dest, F &&func, Its...iterators)