1dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania/* -*- c++ -*- */
2dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania/*
3dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * Copyright (C) 2010 The Android Open Source Project
4dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * All rights reserved.
5dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania *
6dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * Redistribution and use in source and binary forms, with or without
7dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * modification, are permitted provided that the following conditions
8dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * are met:
9dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania *  * Redistributions of source code must retain the above copyright
10dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania *    notice, this list of conditions and the following disclaimer.
11dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania *  * Redistributions in binary form must reproduce the above copyright
12dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania *    notice, this list of conditions and the following disclaimer in
13dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania *    the documentation and/or other materials provided with the
14dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania *    distribution.
15dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania *
16dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
22dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
23dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
26dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania * SUCH DAMAGE.
28dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania */
29dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
30dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania#ifndef ANDROID_ASTL_LIMITS__
31dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania#define ANDROID_ASTL_LIMITS__
32dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
335abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania#include <limits.h>
34dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania// GNU C++ compiler?
35dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania#ifndef __GNUG__
36dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania#error "__GNUG__ is not defined"
37dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania#endif
38dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
39dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania#ifdef _T
40dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania#error "_T is defined"
41dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania#endif
42dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
43dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania// This is very incomplete partial implementation of the standard
44dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania// <limits>. Only partial support for float and double is provided.
45dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
465abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catanianamespace {
475abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania// Template to return the number of decimal digits in a number
485abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania// representation based on the number of bits and sign.
495abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania// e.g  digits10<int,64,true>::value == 19
505abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniatemplate<typename T, T bits, bool is_signed> struct digits10 {
515abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static const int value = 0;
525abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania};
535abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania
545abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania// Specialization that can be used to initialize static constant at
555abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania// compile time.
565abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniatemplate<> struct digits10<int,  8, false> { static const int value = 3; };
575abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniatemplate<> struct digits10<int,  8, true>  { static const int value = 3; };
585abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniatemplate<> struct digits10<int, 16, false> { static const int value = 5; };
595abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniatemplate<> struct digits10<int, 16, true>  { static const int value = 5; };
605abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniatemplate<> struct digits10<int, 32, false> { static const int value = 10; };
615abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniatemplate<> struct digits10<int, 32, true>  { static const int value = 10; };
625abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniatemplate<> struct digits10<int, 64, false> { static const int value = 20; };
635abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniatemplate<> struct digits10<int, 64, true>  { static const int value = 19; };
645abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania}
655abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania
66dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catanianamespace std {
67dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
68dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Cataniastruct __numeric_limits_base
69dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania{
70dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    // True for all fundamental types.
71dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const bool is_specialized = false;
72dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
73dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    // True if the type is signed.
74dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const bool is_signed = false;
75dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
76dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    // True if the type is integer.
77dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const bool is_integer = false;
78dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
79dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    // The number of radix digits that be represented without change. For
80dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    // integer types, the number of non-sign bits in the representation; for
81dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    // floating-point types, the number of radix digits in the mantissa.
82dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    // Equivalent to FLT_MANT_DIG, DBL_MANT_DIG.
83dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const int digits = 0;
84dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
85dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    // The number of base 10 digits that can be represented without change.
86dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    // Equivalent to FLT_DIG, DBL_DIG, LDBL_MANT_DIG.
87dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const int digits10 = 0;
88dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania};
89dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
90dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
91dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania// Properties of fundamental types.
92dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania// Only a subset of the properties is supported.
93dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Cataniatemplate<typename _T>
94dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Cataniastruct numeric_limits : public __numeric_limits_base
95dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania{
96dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    // The minimum finite value.
97dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static _T min() { return static_cast<_T>(0); }
98dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
99dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    // The maximum finite value.
100dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static _T max() { return static_cast<_T>(0); }
101dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania};
102dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
103dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania// Specializations for some fundamental types.
104dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
105dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania// numeric_limits<float>
106dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Cataniatemplate<>
107dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Cataniastruct numeric_limits<float>
108dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania{
109dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const bool is_specialized = true;
110dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
111dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static float min() { return __FLT_MIN__; }
112dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static float max() { return __FLT_MAX__; }
113dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
114dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const bool is_signed = true;
115dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const bool is_integer = false;
116dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
117dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const int digits = __FLT_MANT_DIG__;
118dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const int digits10 = __FLT_DIG__;
119dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania};
120dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
121dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania// numeric_limits<double>
122dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Cataniatemplate<>
123dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Cataniastruct numeric_limits<double>
124dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania{
125dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const bool is_specialized = true;
126dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
127dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static double min() { return __DBL_MIN__; }
128dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static double max() { return __DBL_MAX__; }
129dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
130dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const bool is_signed = true;
131dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const bool is_integer = false;
132dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
133dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const int digits = __DBL_MANT_DIG__;
134dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania    static const int digits10 = __DBL_DIG__;
135dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania};
136dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
137fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania// numeric_limits<int>
138fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Cataniatemplate<>
139fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Cataniastruct numeric_limits<int>
140fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania{
141fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static const bool is_specialized = true;
142fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania
143fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static int min() { return INT_MIN; }
144fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static int max() { return INT_MAX; }
145fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania
146fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static const bool is_signed = true;
147fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static const bool is_integer = true;
148fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania
149fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static const int digits = static_cast<int>(sizeof(int) * CHAR_BIT);
150fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static const int digits10 = digits10<int, digits, is_signed>::value;
151fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania};
152fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania
153fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania// numeric_limits<unsigned int>
154fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Cataniatemplate<>
155fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Cataniastruct numeric_limits<unsigned int>
156fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania{
157fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static const bool is_specialized = true;
158fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania
159fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static unsigned int min() { return 0; }
160fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static unsigned int max() { return UINT_MAX; }
161fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania
162fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static const bool is_signed = false;
163fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static const bool is_integer = true;
164fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania
165fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static const int digits = static_cast<int>(sizeof(unsigned int) * CHAR_BIT);
166fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static const int digits10 = digits10<int, digits, is_signed>::value;
167fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania};
168fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania
1695abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania// numeric_limits<long>
1705abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniatemplate<>
1715abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniastruct numeric_limits<long>
1725abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania{
1735abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static const bool is_specialized = true;
1745abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania
1755abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static long min() { return LONG_MIN; }
1765abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static long max() { return LONG_MAX; }
1775abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania
1785abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static const bool is_signed = true;
1795abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static const bool is_integer = true;
1805abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania
1815abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static const int digits = LONG_BIT;
1825abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static const int digits10 = digits10<int, digits, is_signed>::value;
1835abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania};
1845abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania
185328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania// numeric_limits<unsigned long>
186328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Cataniatemplate<>
187328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Cataniastruct numeric_limits<unsigned long>
188328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania{
189328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static const bool is_specialized = true;
190328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania
191328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static unsigned long min() { return 0; }
192328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static unsigned long max() { return ULONG_MAX; }
193328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania
194328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static const bool is_signed = true;
195328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static const bool is_integer = true;
196328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania
197328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static const int digits = LONG_BIT;
198328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static const int digits10 = digits10<int, digits, is_signed>::value;
199328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania};
200328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania
2015abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania// numeric_limits<long long>
2025abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniatemplate<>
2035abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Cataniastruct numeric_limits<long long>
2045abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania{
2055abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static const bool is_specialized = true;
2065abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania
2075abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static long long min() { return LLONG_MIN; }
2085abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static long long max() { return LLONG_MAX; }
2095abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania
2105abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static const bool is_signed = true;
2115abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static const bool is_integer = true;
2125abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania
213fe47cee745a2b91cd9a2b98f7a82c9ad9fec726fNicolas Catania    static const int digits = static_cast<int>(sizeof(long long) * CHAR_BIT);
2145abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania    static const int digits10 = digits10<int, digits, is_signed>::value;
2155abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania};
2165abe6dfaae971d3c0d1c8e3349b0d2b2ae83cc97Nicolas Catania
217328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania// numeric_limits<unsigned long long>
218328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Cataniatemplate<>
219328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Cataniastruct numeric_limits<unsigned long long>
220328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania{
221328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static const bool is_specialized = true;
222328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania
223328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static unsigned long long min() { return 0; }
224328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static unsigned long long max() { return ULLONG_MAX; }
225328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania
226328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static const bool is_signed = true;
227328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static const bool is_integer = true;
228328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania
229328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static const int digits = static_cast<int>(sizeof(unsigned long long) * CHAR_BIT);
230328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania    static const int digits10 = digits10<int, digits, is_signed>::value;
231328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania};
232328cfeefa59a829fd8ae83ff1955c530a25b43ffNicolas Catania
233dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania}  // namespace std
234dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
235dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania
236dfec9fcb74ce3381af05f54e6ebc2667a6bfb6b8Nicolas Catania#endif
237