blob: 85f1db18ce93ec8236c7349275dbd3e239421279 [file] [log] [blame]
// This file is part of the ustl library, an STL implementation.
//
// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
// This file is free software, distributed under the MIT License.
//
// ulimits.h
//
#ifndef ULIMITS_H_1C2192EA3821E0811BBAF86B0F048364
#define ULIMITS_H_1C2192EA3821E0811BBAF86B0F048364
#include "utypes.h"
#include <stdint.h>
namespace ustl {
// Android
#ifndef UINTPTR_MAX
#define UINTPTR_MAX UINT32_MAX
#endif
#ifndef UINT32_MAX
#define UINT32_MAX (0xffffffff)
#endif
/// \class numeric_limits ulimits.h ustl.h
/// \brief Defines numeric limits for a type.
///
template <typename T>
struct numeric_limits {
/// Returns the minimum value for type T.
static inline T min (void) { return (T(0)); }
/// Returns the minimum value for type T.
static inline T max (void) { return (T(0)); }
static const bool is_signed = false; ///< True if the type is signed.
static const bool is_integer = false; ///< True if stores an exact value.
static const bool is_integral = false; ///< True if fixed size and cast-copyable.
};
#ifndef DOXYGEN_SHOULD_SKIP_THIS
template <typename T>
struct numeric_limits<T*> {
static inline T* min (void) { return (NULL); }
static inline T* max (void) { return (UINTPTR_MAX); }
static const bool is_signed = false;
static const bool is_integer = true;
static const bool is_integral = true;
};
#define _NUMERIC_LIMITS(type, minVal, maxVal, bSigned, bInteger, bIntegral) \
template <> \
struct numeric_limits<type> { \
static inline type min (void) { return (minVal); } \
static inline type max (void) { return (maxVal); } \
static const bool is_signed = bSigned; \
static const bool is_integer = bInteger; \
static const bool is_integral = bIntegral; \
}
//--------------------------------------------------------------------------------------
// type min max signed integer integral
//--------------------------------------------------------------------------------------
_NUMERIC_LIMITS (bool, false, true, false, true, true);
_NUMERIC_LIMITS (char, SCHAR_MIN, SCHAR_MAX, true, true, true);
_NUMERIC_LIMITS (int, INT_MIN, INT_MAX, true, true, true);
_NUMERIC_LIMITS (short, SHRT_MIN, SHRT_MAX, true, true, true);
_NUMERIC_LIMITS (long, LONG_MIN, LONG_MAX, true, true, true);
#if HAVE_THREE_CHAR_TYPES
_NUMERIC_LIMITS (signed char, SCHAR_MIN, SCHAR_MAX, true, true, true);
#endif
_NUMERIC_LIMITS (unsigned char, 0, UCHAR_MAX, false, true, true);
_NUMERIC_LIMITS (unsigned int, 0, UINT_MAX, false, true, true);
_NUMERIC_LIMITS (unsigned short,0, USHRT_MAX, false, true, true);
_NUMERIC_LIMITS (unsigned long, 0, ULONG_MAX, false, true, true);
_NUMERIC_LIMITS (wchar_t, 0, WCHAR_MAX, false, true, true);
_NUMERIC_LIMITS (float, FLT_MIN, FLT_MAX, true, false, true);
_NUMERIC_LIMITS (double, DBL_MIN, DBL_MAX, true, false, true);
_NUMERIC_LIMITS (long double, LDBL_MIN, LDBL_MAX, true, false, true);
#ifdef HAVE_LONG_LONG
_NUMERIC_LIMITS (long long, LLONG_MIN, LLONG_MAX, true, true, true);
_NUMERIC_LIMITS (unsigned long long, 0, ULLONG_MAX, false, true, true);
#endif
//--------------------------------------------------------------------------------------
#endif // DOXYGEN_SHOULD_SKIP_THIS
/// Macro for defining numeric_limits specializations
#define NUMERIC_LIMITS(type, minVal, maxVal, bSigned, bInteger, bIntegral) \
namespace ustl { _NUMERIC_LIMITS (type, minVal, maxVal, bSigned, bInteger, bIntegral); }
/// Returns the recommended stream alignment for type \p T. Override with ALIGNOF.
template <typename T>
inline size_t alignof (const T&)
{
if (numeric_limits<T>::is_integral)
return (__alignof__(T));
return (4);
}
#define ALIGNOF(type,grain) \
namespace ustl { \
template <> inline size_t alignof (const type&) { return (grain); } }
} // namespace ustl
#endif