16553608aSNikolas Klauser //===----------------------------------------------------------------------===//
26553608aSNikolas Klauser //
36553608aSNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46553608aSNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
56553608aSNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66553608aSNikolas Klauser //
76553608aSNikolas Klauser //===----------------------------------------------------------------------===//
86553608aSNikolas Klauser
96553608aSNikolas Klauser #ifndef _LIBCPP___MATH_MODULO_H
106553608aSNikolas Klauser #define _LIBCPP___MATH_MODULO_H
116553608aSNikolas Klauser
126553608aSNikolas Klauser #include <__config>
136553608aSNikolas Klauser #include <__type_traits/enable_if.h>
146553608aSNikolas Klauser #include <__type_traits/is_arithmetic.h>
156553608aSNikolas Klauser #include <__type_traits/is_same.h>
166553608aSNikolas Klauser #include <__type_traits/promote.h>
176553608aSNikolas Klauser
186553608aSNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
196553608aSNikolas Klauser # pragma GCC system_header
206553608aSNikolas Klauser #endif
216553608aSNikolas Klauser
226553608aSNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
236553608aSNikolas Klauser
246553608aSNikolas Klauser namespace __math {
256553608aSNikolas Klauser
266553608aSNikolas Klauser // fmod
276553608aSNikolas Klauser
fmod(float __x,float __y)286553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float fmod(float __x, float __y) _NOEXCEPT { return __builtin_fmodf(__x, __y); }
296553608aSNikolas Klauser
306553608aSNikolas Klauser template <class = int>
fmod(double __x,double __y)316553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double fmod(double __x, double __y) _NOEXCEPT {
326553608aSNikolas Klauser return __builtin_fmod(__x, __y);
336553608aSNikolas Klauser }
346553608aSNikolas Klauser
fmod(long double __x,long double __y)350e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double fmod(long double __x, long double __y) _NOEXCEPT {
360e4d812fSNikolas Klauser return __builtin_fmodl(__x, __y);
370e4d812fSNikolas Klauser }
386553608aSNikolas Klauser
39f3589d25SNikolas Klauser template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>
fmod(_A1 __x,_A2 __y)40f3589d25SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI typename __promote<_A1, _A2>::type fmod(_A1 __x, _A2 __y) _NOEXCEPT {
41dcdcc7c8SNikolas Klauser using __result_type = typename __promote<_A1, _A2>::type;
42*6b4b29f8SNikolas Klauser static_assert(!(_IsSame<_A1, __result_type>::value && _IsSame<_A2, __result_type>::value), "");
436553608aSNikolas Klauser return __math::fmod((__result_type)__x, (__result_type)__y);
446553608aSNikolas Klauser }
456553608aSNikolas Klauser
466553608aSNikolas Klauser // modf
476553608aSNikolas Klauser
modf(float __x,float * __y)486553608aSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI float modf(float __x, float* __y) _NOEXCEPT { return __builtin_modff(__x, __y); }
496553608aSNikolas Klauser
506553608aSNikolas Klauser template <class = int>
modf(double __x,double * __y)516553608aSNikolas Klauser _LIBCPP_HIDE_FROM_ABI double modf(double __x, double* __y) _NOEXCEPT {
526553608aSNikolas Klauser return __builtin_modf(__x, __y);
536553608aSNikolas Klauser }
546553608aSNikolas Klauser
modf(long double __x,long double * __y)550e4d812fSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI long double modf(long double __x, long double* __y) _NOEXCEPT {
560e4d812fSNikolas Klauser return __builtin_modfl(__x, __y);
570e4d812fSNikolas Klauser }
586553608aSNikolas Klauser
596553608aSNikolas Klauser } // namespace __math
606553608aSNikolas Klauser
616553608aSNikolas Klauser _LIBCPP_END_NAMESPACE_STD
626553608aSNikolas Klauser
636553608aSNikolas Klauser #endif // _LIBCPP___MATH_MODULO_H
64