Line data Source code
1 : // -*- C++ -*- C library enhancements header.
2 :
3 : // Copyright (C) 2016-2017 Free Software Foundation, Inc.
4 : //
5 : // This file is part of the GNU ISO C++ Library. This library is free
6 : // software; you can redistribute it and/or modify it under the
7 : // terms of the GNU General Public License as published by the
8 : // Free Software Foundation; either version 3, or (at your option)
9 : // any later version.
10 :
11 : // This library is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 :
16 : // Under Section 7 of GPL version 3, you are granted additional
17 : // permissions described in the GCC Runtime Library Exception, version
18 : // 3.1, as published by the Free Software Foundation.
19 :
20 : // You should have received a copy of the GNU General Public License and
21 : // a copy of the GCC Runtime Library Exception along with this program;
22 : // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 : // <http://www.gnu.org/licenses/>.
24 :
25 : /** @file include/bits/std_abs.h
26 : * This is an internal header file, included by other library headers.
27 : * Do not attempt to use it directly. @headername{cmath, cstdlib}
28 : */
29 :
30 : #ifndef _GLIBCXX_BITS_STD_ABS_H
31 : #define _GLIBCXX_BITS_STD_ABS_H
32 :
33 : #pragma GCC system_header
34 :
35 : #include <bits/c++config.h>
36 :
37 : #define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
38 : #include_next <stdlib.h>
39 : #ifdef __CORRECT_ISO_CPP_MATH_H_PROTO
40 : # include_next <math.h>
41 : #endif
42 : #undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS
43 :
44 : #undef abs
45 :
46 : extern "C++"
47 : {
48 : namespace std _GLIBCXX_VISIBILITY(default)
49 : {
50 : _GLIBCXX_BEGIN_NAMESPACE_VERSION
51 :
52 : using ::abs;
53 :
54 : #ifndef __CORRECT_ISO_CPP_STDLIB_H_PROTO
55 : inline long
56 : abs(long __i) { return __builtin_labs(__i); }
57 : #endif
58 :
59 : #ifdef _GLIBCXX_USE_LONG_LONG
60 : inline long long
61 : abs(long long __x) { return __builtin_llabs (__x); }
62 : #endif
63 :
64 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
65 : // 2192. Validity and return type of std::abs(0u) is unclear
66 : // 2294. <cstdlib> should declare abs(double)
67 :
68 : #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
69 : inline _GLIBCXX_CONSTEXPR double
70 : abs(double __x)
71 2295 : { return __builtin_fabs(__x); }
72 :
73 : inline _GLIBCXX_CONSTEXPR float
74 : abs(float __x)
75 4455 : { return __builtin_fabsf(__x); }
76 :
77 : inline _GLIBCXX_CONSTEXPR long double
78 : abs(long double __x)
79 : { return __builtin_fabsl(__x); }
80 : #endif
81 :
82 : #if defined(__GLIBCXX_TYPE_INT_N_0)
83 : inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_0
84 : abs(__GLIBCXX_TYPE_INT_N_0 __x) { return __x >= 0 ? __x : -__x; }
85 : #endif
86 : #if defined(__GLIBCXX_TYPE_INT_N_1)
87 : inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_1
88 : abs(__GLIBCXX_TYPE_INT_N_1 __x) { return __x >= 0 ? __x : -__x; }
89 : #endif
90 : #if defined(__GLIBCXX_TYPE_INT_N_2)
91 : inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_2
92 : abs(__GLIBCXX_TYPE_INT_N_2 __x) { return __x >= 0 ? __x : -__x; }
93 : #endif
94 : #if defined(__GLIBCXX_TYPE_INT_N_3)
95 : inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_3
96 : abs(__GLIBCXX_TYPE_INT_N_3 __x) { return __x >= 0 ? __x : -__x; }
97 : #endif
98 :
99 : #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128) && !defined(__CUDACC__)
100 : inline _GLIBCXX_CONSTEXPR
101 : __float128
102 : abs(__float128 __x)
103 : { return __x < 0 ? -__x : __x; }
104 : #endif
105 :
106 : _GLIBCXX_END_NAMESPACE_VERSION
107 : } // namespace
108 : }
109 :
110 : #endif // _GLIBCXX_BITS_STD_ABS_H
|