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)