1    	// -*- C++ -*-
2    	
3    	// Copyright (C) 2007-2013 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 terms
7    	// of the GNU General Public License as published by the Free Software
8    	// Foundation; either version 3, or (at your option) any later
9    	// version.
10   	
11   	// This library is distributed in the hope that it will be useful, but
12   	// WITHOUT ANY WARRANTY; without even the implied warranty of
13   	// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   	// 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 ext/numeric_traits.h
26   	 *  This file is a GNU extension to the Standard C++ Library.
27   	 */
28   	
29   	#ifndef _EXT_NUMERIC_TRAITS
30   	#define _EXT_NUMERIC_TRAITS 1
31   	
32   	#pragma GCC system_header
33   	
34   	#include <bits/cpp_type_traits.h>
35   	#include <ext/type_traits.h>
36   	
37   	namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
38   	{
39   	_GLIBCXX_BEGIN_NAMESPACE_VERSION
40   	
41   	  // Compile time constants for builtin types.
42   	  // Sadly std::numeric_limits member functions cannot be used for this.
43   	#define __glibcxx_signed(_Tp) ((_Tp)(-1) < 0)
44   	#define __glibcxx_digits(_Tp) \
45   	  (sizeof(_Tp) * __CHAR_BIT__ - __glibcxx_signed(_Tp))
46   	
47   	#define __glibcxx_min(_Tp) \
48   	  (__glibcxx_signed(_Tp) ? (_Tp)1 << __glibcxx_digits(_Tp) : (_Tp)0)
49   	
50   	#define __glibcxx_max(_Tp) \
51   	  (__glibcxx_signed(_Tp) ? \
52   	   (((((_Tp)1 << (__glibcxx_digits(_Tp) - 1)) - 1) << 1) + 1) : ~(_Tp)0)
53   	
54   	  template<typename _Value>
55   	    struct __numeric_traits_integer
56   	    {
57   	      // Only integers for initialization of member constant.
58   	      static const _Value __min = __glibcxx_min(_Value);
59   	      static const _Value __max = __glibcxx_max(_Value);
60   	
61   	      // NB: these two also available in std::numeric_limits as compile
62   	      // time constants, but <limits> is big and we avoid including it.
63   	      static const bool __is_signed = __glibcxx_signed(_Value);
64   	      static const int __digits = __glibcxx_digits(_Value);      
65   	    };
66   	
67   	  template<typename _Value>
68   	    const _Value __numeric_traits_integer<_Value>::__min;
69   	
70   	  template<typename _Value>
71   	    const _Value __numeric_traits_integer<_Value>::__max;
72   	
73   	  template<typename _Value>
74   	    const bool __numeric_traits_integer<_Value>::__is_signed;
75   	
76   	  template<typename _Value>
77   	    const int __numeric_traits_integer<_Value>::__digits;
78   	
79   	#undef __glibcxx_signed
80   	#undef __glibcxx_digits
81   	#undef __glibcxx_min
82   	#undef __glibcxx_max
83   	
84   	#define __glibcxx_floating(_Tp, _Fval, _Dval, _LDval) \
85   	  (std::__are_same<_Tp, float>::__value ? _Fval \
86   	   : std::__are_same<_Tp, double>::__value ? _Dval : _LDval)
87   	
88   	#define __glibcxx_max_digits10(_Tp) \
89   	  (2 + __glibcxx_floating(_Tp, __FLT_MANT_DIG__, __DBL_MANT_DIG__, \
90   				  __LDBL_MANT_DIG__) * 643L / 2136)
91   	
92   	#define __glibcxx_digits10(_Tp) \
93   	  __glibcxx_floating(_Tp, __FLT_DIG__, __DBL_DIG__, __LDBL_DIG__)
94   	
95   	#define __glibcxx_max_exponent10(_Tp) \
96   	  __glibcxx_floating(_Tp, __FLT_MAX_10_EXP__, __DBL_MAX_10_EXP__, \
97   			     __LDBL_MAX_10_EXP__)
98   	
99   	  template<typename _Value>
100  	    struct __numeric_traits_floating
101  	    {
102  	      // Only floating point types. See N1822. 
103  	      static const int __max_digits10 = __glibcxx_max_digits10(_Value);
104  	
105  	      // See above comment...
106  	      static const bool __is_signed = true;
107  	      static const int __digits10 = __glibcxx_digits10(_Value);
108  	      static const int __max_exponent10 = __glibcxx_max_exponent10(_Value);
109  	    };
110  	
111  	  template<typename _Value>
112  	    const int __numeric_traits_floating<_Value>::__max_digits10;
113  	
114  	  template<typename _Value>
115  	    const bool __numeric_traits_floating<_Value>::__is_signed;
116  	
117  	  template<typename _Value>
118  	    const int __numeric_traits_floating<_Value>::__digits10;
119  	
120  	  template<typename _Value>
121  	    const int __numeric_traits_floating<_Value>::__max_exponent10;
122  	
123  	  template<typename _Value>
124  	    struct __numeric_traits
125  	    : public __conditional_type<std::__is_integer<_Value>::__value,
126  					__numeric_traits_integer<_Value>,
127  					__numeric_traits_floating<_Value> >::__type
128  	    { };
129  	
130  	_GLIBCXX_END_NAMESPACE_VERSION
131  	} // namespace
132  	
133  	#undef __glibcxx_floating
134  	#undef __glibcxx_max_digits10
135  	#undef __glibcxx_digits10
136  	#undef __glibcxx_max_exponent10
137  	
138  	#endif 
139