8 #ifndef SIG_UTIL_HELPER_MODULES_HPP
9 #define SIG_UTIL_HELPER_MODULES_HPP
11 #include "../sigutil.hpp"
12 #include "../helper/type_convert.hpp"
21 #if SIG_ENABLE_CONSTEXPR
25 return static_cast<bool>(cond);
39 template <
class B1,
class... Bs>
40 #if SIG_ENABLE_CONSTEXPR
43 bool And(B1&& cond, Bs&&... conds){
44 return And(std::forward<Bs>(conds)...) && cond;
49 #if SIG_ENABLE_CONSTEXPR
53 return static_cast<bool>(cond);
66 template <
class B1,
class... Bs>
67 #if SIG_ENABLE_CONSTEXPR
70 bool Or(B1&& cond, Bs&&... conds){
71 return Or(conds...) || cond;
88 template <
class B1,
class B2>
89 #if SIG_ENABLE_CONSTEXPR
92 bool Xor(B1&& a, B2&& b){
93 return (a && !b) || (!a && b);
109 template <
class B1,
class B2>
110 #if SIG_ENABLE_CONSTEXPR
114 return (a && b) || (!a && !b);
119 #if SIG_ENABLE_CONSTEXPR
127 template <
class T1,
class T2>
128 #if SIG_ENABLE_CONSTEXPR
133 return v1 < v2 ? v1 : v2;
146 template <
class T,
class... Ts>
147 #if SIG_ENABLE_CONSTEXPR
152 return min(v,
min(vs...));
157 #if SIG_ENABLE_CONSTEXPR
165 template <
class T1,
class T2>
166 #if SIG_ENABLE_CONSTEXPR
171 return v1 < v2 ? v2 : v1;
184 template <
class T,
class... Ts>
185 #if SIG_ENABLE_CONSTEXPR
190 return max(v,
max(vs...));
232 #if SIG_ENABLE_CONSTEXPR
237 return v1 < v2 ? v2 - v1 : v1 - v2;
251 template <
class T1,
class T2>
252 #if SIG_ENABLE_CONSTEXPR
255 auto abs_delta(T1 v1, T2 v2) ->decltype(v1 < v2 ? v2 - v1 : v1 - v2)
257 return v1 < v2 ? v2 - v1 : v1 - v2;
281 template <class T1, class T2, typename std::enable_if<!(impl::is_string<T1>::value || impl::is_string<T2>::value)>::type*& =
enabler>
284 constexpr uint tolerant_rate = 10000;
286 using T =
typename std::common_type<T1, T2>::type;
287 const T dmin = std::numeric_limits<T>::epsilon();
289 return !(
abs_delta(std::forward<T1>(v1), std::forward<T2>(v2)) > tolerant_rate * dmin);
304 template <class S1, class S2, typename std::enable_if<(impl::is_string<S1>::value && impl::is_string<S2>::value)>::type*& =
enabler>
323 template <
class T1,
class T2>
324 bool equal_tolerant(T1 v1, T2 v2,
typename std::common_type<T1, T2>::type margin)
346 template <
class T,
class U>
349 return (min > val) || (val >
max) ?
false :
true;
370 template <
class T,
class U>
373 if (val<min){ val =
min;
return false; }
374 if (val>max){ val =
max;
return false; }
386 template <
class T1,
class T2>
387 constexpr
bool greater(T1 v1, T2 v2){
return v1 > v2 ?
true :
false; };
396 template <
class T1,
class T2>
397 constexpr
bool less(T1 v1, T2 v2){
return v1 < v2 ?
true :
false; };
404 #if SIG_ENABLE_CONSTEXPR
414 #if SIG_ENABLE_CONSTEXPR
424 #if SIG_ENABLE_CONSTEXPR
434 template <
class T1,
class T2>
436 ->typename impl::remove_const_reference< decltype(std::forward<T1>(v1) + std::forward<T2>(v2)) >::type
438 return std::forward<T1>(v1) + std::forward<T2>(v2);
445 template <
class T1,
class T2>
447 ->typename impl::remove_const_reference< decltype(std::forward<T1>(v1) - std::forward<T2>(v2)) >::type
449 return std::forward<T1>(v1) - std::forward<T2>(v2);
456 template <
class T1,
class T2>
458 ->typename impl::remove_const_reference< decltype(std::forward<T1>(v1) * std::forward<T2>(v2)) >::type
460 return std::forward<T1>(v1) * std::forward<T2>(v2);
467 template <
class T1,
class T2>
469 ->typename impl::remove_const_reference< decltype(std::forward<T1>(v1) / std::forward<T2>(v2)) >::type
471 return std::forward<T1>(v1) / std::forward<T2>(v2);
auto min(T v, Ts...vs)
可変長 min
constexpr bool is_number(T x)
値が非数(NaN)でないかを確認
auto max(T v, Ts...vs)
可変長 max
引数の値をインクリメントした値を返す関数オブジェクト
bool equal_tolerant(T1 v1, T2 v2, typename std::common_type< T1, T2 >::type margin)
指定範囲内の誤差を許した等値比較
引数の値をデクリメントした値を返す関数オブジェクト
bool equal(T1 &&v1, T2 &&v2)
数値の簡易等値比較(厳密な計算でない場合の使用を想定)
bool Consistency(B1 &&a, B2 &&b)
AとBの真偽一致でtrueを返す (⇔ !xor)
auto operator()(T1 &&v1, T2 &&v2) const -> typename impl::remove_const_reference< decltype(std::forward< T1 >(v1)-std::forward< T2 >(v2)) >::type
bool Xor(B1 &&a, B2 &&b)
xor
constexpr bool check_range(T const &val, U const &min, U const &max)
値の範囲チェック
constexpr bool is_finite_number(T x)
値が非数(NaN)でなく、かつ無限大(Inf)でないかを確認
bool modify_range(T &val, U const &min, U const &max)
値を範囲内に自動修正
constexpr bool less(T1 v1, T2 v2)
auto operator()(T1 &&v1, T2 &&v2) const -> typename impl::remove_const_reference< decltype(std::forward< T1 >(v1)*std::forward< T2 >(v2)) >::type
typename StringId< typename remove_const_reference< typename std::decay< T >::type >::type >::type string_t
auto operator()(T1 &&v1, T2 &&v2) const -> typename impl::remove_const_reference< decltype(std::forward< T1 >(v1)+std::forward< T2 >(v2)) >::type
auto operator()(T1 &&v1, T2 &&v2) const -> typename impl::remove_const_reference< decltype(std::forward< T1 >(v1)/std::forward< T2 >(v2)) >::type
constexpr bool greater(T1 v1, T2 v2)