/* -*- c++ -*- */ /* * Copyright (C) 2010 The Android Open Source Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef ANDROID_ASTL_LIMITS__ #define ANDROID_ASTL_LIMITS__ #include // GNU C++ compiler? #ifndef __GNUG__ #error "__GNUG__ is not defined" #endif #ifdef _T #error "_T is defined" #endif // This is very incomplete partial implementation of the standard // . Only partial support for float and double is provided. namespace { // Template to return the number of decimal digits in a number // representation based on the number of bits and sign. // e.g digits10::value == 19 template struct digits10 { static const int value = 0; }; // Specialization that can be used to initialize static constant at // compile time. template<> struct digits10 { static const int value = 3; }; template<> struct digits10 { static const int value = 3; }; template<> struct digits10 { static const int value = 5; }; template<> struct digits10 { static const int value = 5; }; template<> struct digits10 { static const int value = 10; }; template<> struct digits10 { static const int value = 10; }; template<> struct digits10 { static const int value = 20; }; template<> struct digits10 { static const int value = 19; }; } namespace std { struct __numeric_limits_base { // True for all fundamental types. static const bool is_specialized = false; // True if the type is signed. static const bool is_signed = false; // True if the type is integer. static const bool is_integer = false; // The number of radix digits that be represented without change. For // integer types, the number of non-sign bits in the representation; for // floating-point types, the number of radix digits in the mantissa. // Equivalent to FLT_MANT_DIG, DBL_MANT_DIG. static const int digits = 0; // The number of base 10 digits that can be represented without change. // Equivalent to FLT_DIG, DBL_DIG, LDBL_MANT_DIG. static const int digits10 = 0; }; // Properties of fundamental types. // Only a subset of the properties is supported. template struct numeric_limits : public __numeric_limits_base { // The minimum finite value. static _T min() { return static_cast<_T>(0); } // The maximum finite value. static _T max() { return static_cast<_T>(0); } }; // Specializations for some fundamental types. // numeric_limits template<> struct numeric_limits { static const bool is_specialized = true; static float min() { return __FLT_MIN__; } static float max() { return __FLT_MAX__; } static const bool is_signed = true; static const bool is_integer = false; static const int digits = __FLT_MANT_DIG__; static const int digits10 = __FLT_DIG__; }; // numeric_limits template<> struct numeric_limits { static const bool is_specialized = true; static double min() { return __DBL_MIN__; } static double max() { return __DBL_MAX__; } static const bool is_signed = true; static const bool is_integer = false; static const int digits = __DBL_MANT_DIG__; static const int digits10 = __DBL_DIG__; }; // numeric_limits template<> struct numeric_limits { static const bool is_specialized = true; static int min() { return INT_MIN; } static int max() { return INT_MAX; } static const bool is_signed = true; static const bool is_integer = true; static const int digits = static_cast(sizeof(int) * CHAR_BIT); static const int digits10 = digits10::value; }; // numeric_limits template<> struct numeric_limits { static const bool is_specialized = true; static unsigned int min() { return 0; } static unsigned int max() { return UINT_MAX; } static const bool is_signed = false; static const bool is_integer = true; static const int digits = static_cast(sizeof(unsigned int) * CHAR_BIT); static const int digits10 = digits10::value; }; // numeric_limits template<> struct numeric_limits { static const bool is_specialized = true; static long min() { return LONG_MIN; } static long max() { return LONG_MAX; } static const bool is_signed = true; static const bool is_integer = true; static const int digits = LONG_BIT; static const int digits10 = digits10::value; }; // numeric_limits template<> struct numeric_limits { static const bool is_specialized = true; static unsigned long min() { return 0; } static unsigned long max() { return ULONG_MAX; } static const bool is_signed = true; static const bool is_integer = true; static const int digits = LONG_BIT; static const int digits10 = digits10::value; }; // numeric_limits template<> struct numeric_limits { static const bool is_specialized = true; static long long min() { return LLONG_MIN; } static long long max() { return LLONG_MAX; } static const bool is_signed = true; static const bool is_integer = true; static const int digits = static_cast(sizeof(long long) * CHAR_BIT); static const int digits10 = digits10::value; }; // numeric_limits template<> struct numeric_limits { static const bool is_specialized = true; static unsigned long long min() { return 0; } static unsigned long long max() { return ULLONG_MAX; } static const bool is_signed = true; static const bool is_integer = true; static const int digits = static_cast(sizeof(unsigned long long) * CHAR_BIT); static const int digits10 = digits10::value; }; } // namespace std #endif