13ad841b2Smrg // -*- C++ -*- C library enhancements header.
23ad841b2Smrg
3*4c3eb207Smrg // Copyright (C) 2016-2020 Free Software Foundation, Inc.
43ad841b2Smrg //
53ad841b2Smrg // This file is part of the GNU ISO C++ Library. This library is free
63ad841b2Smrg // software; you can redistribute it and/or modify it under the
73ad841b2Smrg // terms of the GNU General Public License as published by the
83ad841b2Smrg // Free Software Foundation; either version 3, or (at your option)
93ad841b2Smrg // any later version.
103ad841b2Smrg
113ad841b2Smrg // This library is distributed in the hope that it will be useful,
123ad841b2Smrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
133ad841b2Smrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
143ad841b2Smrg // GNU General Public License for more details.
153ad841b2Smrg
163ad841b2Smrg // Under Section 7 of GPL version 3, you are granted additional
173ad841b2Smrg // permissions described in the GCC Runtime Library Exception, version
183ad841b2Smrg // 3.1, as published by the Free Software Foundation.
193ad841b2Smrg
203ad841b2Smrg // You should have received a copy of the GNU General Public License and
213ad841b2Smrg // a copy of the GCC Runtime Library Exception along with this program;
223ad841b2Smrg // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
233ad841b2Smrg // <http://www.gnu.org/licenses/>.
243ad841b2Smrg
253ad841b2Smrg /** @file include/bits/std_abs.h
263ad841b2Smrg * This is an internal header file, included by other library headers.
273ad841b2Smrg * Do not attempt to use it directly. @headername{cmath, cstdlib}
283ad841b2Smrg */
293ad841b2Smrg
303ad841b2Smrg #ifndef _GLIBCXX_BITS_STD_ABS_H
313ad841b2Smrg #define _GLIBCXX_BITS_STD_ABS_H
323ad841b2Smrg
333ad841b2Smrg #pragma GCC system_header
343ad841b2Smrg
353ad841b2Smrg #include <bits/c++config.h>
363ad841b2Smrg
373ad841b2Smrg #define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
383ad841b2Smrg #include_next <stdlib.h>
393ad841b2Smrg #ifdef __CORRECT_ISO_CPP_MATH_H_PROTO
403ad841b2Smrg # include_next <math.h>
413ad841b2Smrg #endif
423ad841b2Smrg #undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS
433ad841b2Smrg
443ad841b2Smrg #undef abs
453ad841b2Smrg
463ad841b2Smrg extern "C++"
473ad841b2Smrg {
_GLIBCXX_VISIBILITY(default)483ad841b2Smrg namespace std _GLIBCXX_VISIBILITY(default)
493ad841b2Smrg {
503ad841b2Smrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
513ad841b2Smrg
523ad841b2Smrg using ::abs;
533ad841b2Smrg
543ad841b2Smrg #ifndef __CORRECT_ISO_CPP_STDLIB_H_PROTO
553ad841b2Smrg inline long
563ad841b2Smrg abs(long __i) { return __builtin_labs(__i); }
573ad841b2Smrg #endif
583ad841b2Smrg
593ad841b2Smrg #ifdef _GLIBCXX_USE_LONG_LONG
603ad841b2Smrg inline long long
613ad841b2Smrg abs(long long __x) { return __builtin_llabs (__x); }
623ad841b2Smrg #endif
633ad841b2Smrg
643ad841b2Smrg // _GLIBCXX_RESOLVE_LIB_DEFECTS
653ad841b2Smrg // 2192. Validity and return type of std::abs(0u) is unclear
663ad841b2Smrg // 2294. <cstdlib> should declare abs(double)
67627f7eb2Smrg // 2735. std::abs(short), std::abs(signed char) and others should return int
683ad841b2Smrg
693ad841b2Smrg #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
703ad841b2Smrg inline _GLIBCXX_CONSTEXPR double
713ad841b2Smrg abs(double __x)
723ad841b2Smrg { return __builtin_fabs(__x); }
733ad841b2Smrg
743ad841b2Smrg inline _GLIBCXX_CONSTEXPR float
753ad841b2Smrg abs(float __x)
763ad841b2Smrg { return __builtin_fabsf(__x); }
773ad841b2Smrg
783ad841b2Smrg inline _GLIBCXX_CONSTEXPR long double
793ad841b2Smrg abs(long double __x)
803ad841b2Smrg { return __builtin_fabsl(__x); }
813ad841b2Smrg #endif
823ad841b2Smrg
833ad841b2Smrg #if defined(__GLIBCXX_TYPE_INT_N_0)
843ad841b2Smrg inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_0
853ad841b2Smrg abs(__GLIBCXX_TYPE_INT_N_0 __x) { return __x >= 0 ? __x : -__x; }
863ad841b2Smrg #endif
873ad841b2Smrg #if defined(__GLIBCXX_TYPE_INT_N_1)
883ad841b2Smrg inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_1
893ad841b2Smrg abs(__GLIBCXX_TYPE_INT_N_1 __x) { return __x >= 0 ? __x : -__x; }
903ad841b2Smrg #endif
913ad841b2Smrg #if defined(__GLIBCXX_TYPE_INT_N_2)
923ad841b2Smrg inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_2
933ad841b2Smrg abs(__GLIBCXX_TYPE_INT_N_2 __x) { return __x >= 0 ? __x : -__x; }
943ad841b2Smrg #endif
953ad841b2Smrg #if defined(__GLIBCXX_TYPE_INT_N_3)
963ad841b2Smrg inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_3
973ad841b2Smrg abs(__GLIBCXX_TYPE_INT_N_3 __x) { return __x >= 0 ? __x : -__x; }
983ad841b2Smrg #endif
993ad841b2Smrg
1003ad841b2Smrg #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
1013ad841b2Smrg inline _GLIBCXX_CONSTEXPR
1023ad841b2Smrg __float128
1033ad841b2Smrg abs(__float128 __x)
1043ad841b2Smrg { return __x < 0 ? -__x : __x; }
1053ad841b2Smrg #endif
1063ad841b2Smrg
1073ad841b2Smrg _GLIBCXX_END_NAMESPACE_VERSION
1083ad841b2Smrg } // namespace
109627f7eb2Smrg } // extern "C"++"
1103ad841b2Smrg
1113ad841b2Smrg #endif // _GLIBCXX_BITS_STD_ABS_H
112