55 #ifndef _GLIBCXX_NUMERIC
56 #define _GLIBCXX_NUMERIC 1
58 #pragma GCC system_header
64 #ifdef _GLIBCXX_PARALLEL
77 #if __cplusplus >= 201402L
80 namespace std _GLIBCXX_VISIBILITY(default)
84 _GLIBCXX_BEGIN_NAMESPACE_VERSION
87 template<
typename _Tp>
89 enable_if_t<__and_<is_integral<_Tp>, is_signed<_Tp>>::value, _Tp>
90 __abs_integral(_Tp __val)
91 {
return __val < 0 ? -__val : __val; }
93 template<
typename _Tp>
95 enable_if_t<__and_<is_integral<_Tp>, is_unsigned<_Tp>>::value, _Tp>
96 __abs_integral(_Tp __val)
99 void __abs_integral(
bool) =
delete;
101 template<
typename _Mn,
typename _Nn>
102 constexpr common_type_t<_Mn, _Nn>
103 __gcd(_Mn __m, _Nn __n)
105 return __m == 0 ? __detail::__abs_integral(__n)
106 : __n == 0 ? __detail::__abs_integral(__m)
107 : __detail::__gcd(__n, __m % __n);
111 template<
typename _Mn,
typename _Nn>
112 constexpr common_type_t<_Mn, _Nn>
115 return (__m != 0 && __n != 0)
116 ? (__detail::__abs_integral(__m) / __detail::__gcd(__m, __n))
117 * __detail::__abs_integral(__n)
121 _GLIBCXX_END_NAMESPACE_VERSION
124 _GLIBCXX_BEGIN_NAMESPACE_VERSION
126 #if __cplusplus > 201402L
128 #define __cpp_lib_gcd_lcm 201606
130 #define __cpp_lib_gcd 201606
131 #define __cpp_lib_lcm 201606
134 template<
typename _Mn,
typename _Nn>
135 constexpr common_type_t<_Mn, _Nn>
136 gcd(_Mn __m, _Nn __n)
138 static_assert(is_integral<_Mn>::value,
"gcd arguments are integers");
139 static_assert(is_integral<_Nn>::value,
"gcd arguments are integers");
140 static_assert(!is_same<_Mn, bool>::value,
"gcd arguments are not bools");
141 static_assert(!is_same<_Nn, bool>::value,
"gcd arguments are not bools");
142 return __detail::__gcd(__m, __n);
146 template<
typename _Mn,
typename _Nn>
147 constexpr common_type_t<_Mn, _Nn>
148 lcm(_Mn __m, _Nn __n)
150 static_assert(is_integral<_Mn>::value,
"lcm arguments are integers");
151 static_assert(is_integral<_Nn>::value,
"lcm arguments are integers");
152 static_assert(!is_same<_Mn, bool>::value,
"lcm arguments are not bools");
153 static_assert(!is_same<_Nn, bool>::value,
"lcm arguments are not bools");
159 _GLIBCXX_END_NAMESPACE_VERSION
Parallel STL function calls corresponding to stl_numeric.h. The functions defined here mainly do case...
constexpr common_type_t< _Mn, _Nn > __lcm(_Mn __m, _Nn __n)
Least common multiple.