From 637573dd3e77e9fb60d46349405c14b85da4475d Mon Sep 17 00:00:00 2001 From: jwellbelove Date: Tue, 11 Nov 2014 15:22:36 +0000 Subject: [PATCH] Compile time integral constants --- integral_limits.h | 181 ++++++++++++++++++++++++++++++++++ test/test_integral_limits.cpp | 105 ++++++++++++++++++++ 2 files changed, 286 insertions(+) create mode 100644 integral_limits.h create mode 100644 test/test_integral_limits.cpp diff --git a/integral_limits.h b/integral_limits.h new file mode 100644 index 00000000..27ced882 --- /dev/null +++ b/integral_limits.h @@ -0,0 +1,181 @@ +///\file + +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. + +Copyright(c) 2014 jwellbelove + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files(the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions : + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +******************************************************************************/ + +#ifndef __ETL_INTEGRAL_LIMITS__ +#define __ETL_INTEGRAL_LIMITS__ + +#include + +#include "type_traits.h" + +#if WIN32 +#undef min +#undef max +#endif + +//***************************************************************************** +///\defgroup integral_limits integral_limits +/// A set of templated compile time constants. +///\ingroup utilities +//***************************************************************************** + +namespace etl +{ + //*************************************************************************** + ///\ingroup integral_limits + template + struct integral_limits; + + //*************************************************************************** + ///\ingroup integral_limits + template <> + struct integral_limits + { + static const signed char min = SCHAR_MIN; + static const signed char max = SCHAR_MAX; + static const int bits = CHAR_BIT; + static const bool is_signed = etl::is_signed::value; + }; + + //*************************************************************************** + ///\ingroup integral_limits + template <> + struct integral_limits + { + static const unsigned char min = 0; + static const unsigned char max = UCHAR_MAX; + static const int bits = CHAR_BIT; + static const bool is_signed = etl::is_signed::value; + }; + + //*************************************************************************** + ///\ingroup integral_limits + template <> + struct integral_limits + { + static const char min = (etl::is_signed::value) ? SCHAR_MIN : 0; + static const char max = (etl::is_signed::value) ? SCHAR_MAX : UCHAR_MAX; + static const int bits = CHAR_BIT; + static const bool is_signed = etl::is_signed::value; + }; + + //*************************************************************************** + ///\ingroup integral_limits + template <> + struct integral_limits + { + static const short min = SHRT_MIN; + static const short max = SHRT_MAX; + static const int bits = CHAR_BIT * (sizeof(short) / sizeof(char)); + static const bool is_signed = etl::is_signed::value; + }; + + //*************************************************************************** + ///\ingroup integral_limits + template <> + struct integral_limits + { + static const unsigned short min = 0; + static const unsigned short max = USHRT_MAX; + static const int bits = CHAR_BIT * (sizeof(unsigned short) / sizeof(char)); + static const bool is_signed = etl::is_signed::value; + }; + + //*************************************************************************** + ///\ingroup integral_limits + template <> + struct integral_limits + { + static const int min = INT_MIN; + static const int max = INT_MAX; + static const int bits = CHAR_BIT * (sizeof(int) / sizeof(char)); + static const bool is_signed = etl::is_signed::value; + }; + + //*************************************************************************** + ///\ingroup integral_limits + template <> + struct integral_limits + { + static const unsigned int min = 0; + static const unsigned int max = UINT_MAX; + static const int bits = CHAR_BIT * (sizeof(unsigned int) / sizeof(char)); + static const bool is_signed = etl::is_signed::value; + }; + + //*************************************************************************** + ///\ingroup integral_limits + template <> + struct integral_limits + { + static const long min = LONG_MIN; + static const long max = LONG_MAX; + static const int bits = CHAR_BIT * (sizeof(long) / sizeof(char)); + static const bool is_signed = etl::is_signed::value; + }; + + //*************************************************************************** + ///\ingroup integral_limits + template <> + struct integral_limits + { + static const unsigned long min = 0; + static const unsigned long max = ULONG_MAX; + static const int bits = CHAR_BIT * (sizeof(unsigned long) / sizeof(char)); + static const bool is_signed = etl::is_signed::value; + }; + + //*************************************************************************** + ///\ingroup integral_limits + template <> + struct integral_limits + { + static const long long min = LLONG_MIN; + static const long long max = LLONG_MAX; + static const int bits = CHAR_BIT * (sizeof(long long) / sizeof(char)); + static const bool is_signed = etl::is_signed::value; + }; + + //*************************************************************************** + ///\ingroup integral_limits + template <> + struct integral_limits + { + static const unsigned long long min = 0; + static const unsigned long long max = ULLONG_MAX; + static const int bits = CHAR_BIT * (sizeof(unsigned long long) / sizeof(char)); + static const bool is_signed = etl::is_signed::value; + }; +} + +#if WIN32 +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#endif diff --git a/test/test_integral_limits.cpp b/test/test_integral_limits.cpp new file mode 100644 index 00000000..8c5e341f --- /dev/null +++ b/test/test_integral_limits.cpp @@ -0,0 +1,105 @@ +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. + +Copyright(c) 2014 jwellbelove + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files(the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions : + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +******************************************************************************/ + +#include + +#include +#include + +#include "../integral_limits.h" + +#undef min +#undef max + +namespace +{ + SUITE(TestIntegralLimits) + { + //************************************************************************* + TEST(MinTest) + { + CHECK_EQUAL(std::numeric_limits::min(), etl::integral_limits::min); + CHECK_EQUAL(std::numeric_limits::min(), etl::integral_limits::min); + CHECK_EQUAL(std::numeric_limits::min(), etl::integral_limits::min); + CHECK_EQUAL(std::numeric_limits::min(), etl::integral_limits::min); + CHECK_EQUAL(std::numeric_limits::min(), etl::integral_limits::min); + CHECK_EQUAL(std::numeric_limits::min(), etl::integral_limits::min); + CHECK_EQUAL(std::numeric_limits::min(), etl::integral_limits::min); + CHECK_EQUAL(std::numeric_limits::min(), etl::integral_limits::min); + CHECK_EQUAL(std::numeric_limits::min(), etl::integral_limits::min); + CHECK_EQUAL(std::numeric_limits::min(), etl::integral_limits::min); + CHECK_EQUAL(std::numeric_limits::min(), etl::integral_limits::min); + } + + //************************************************************************* + TEST(MaxTest) + { + CHECK_EQUAL(std::numeric_limits::max(), etl::integral_limits::max); + CHECK_EQUAL(std::numeric_limits::max(), etl::integral_limits::max); + CHECK_EQUAL(std::numeric_limits::max(), etl::integral_limits::max); + CHECK_EQUAL(std::numeric_limits::max(), etl::integral_limits::max); + CHECK_EQUAL(std::numeric_limits::max(), etl::integral_limits::max); + CHECK_EQUAL(std::numeric_limits::max(), etl::integral_limits::max); + CHECK_EQUAL(std::numeric_limits::max(), etl::integral_limits::max); + CHECK_EQUAL(std::numeric_limits::max(), etl::integral_limits::max); + CHECK_EQUAL(std::numeric_limits::max(), etl::integral_limits::max); + CHECK_EQUAL(std::numeric_limits::max(), etl::integral_limits::max); + CHECK_EQUAL(std::numeric_limits::max(), etl::integral_limits::max); + } + + //************************************************************************* + TEST(BitsTest) + { + CHECK_EQUAL(std::numeric_limits::type>::digits, etl::integral_limits::bits); + CHECK_EQUAL(std::numeric_limits::type>::digits, etl::integral_limits::bits); + CHECK_EQUAL(std::numeric_limits::digits, etl::integral_limits::bits); + CHECK_EQUAL(std::numeric_limits::type>::digits, etl::integral_limits::bits); + CHECK_EQUAL(std::numeric_limits::digits, etl::integral_limits::bits); + CHECK_EQUAL(std::numeric_limits::type>::digits, etl::integral_limits::bits); + CHECK_EQUAL(std::numeric_limits::digits, etl::integral_limits::bits); + CHECK_EQUAL(std::numeric_limits::type>::digits, etl::integral_limits::bits); + CHECK_EQUAL(std::numeric_limits::digits, etl::integral_limits::bits); + CHECK_EQUAL(std::numeric_limits::type>::digits, etl::integral_limits::bits); + CHECK_EQUAL(std::numeric_limits::digits, etl::integral_limits::bits); + } + + //************************************************************************* + TEST(IsSignedTest) + { + CHECK_EQUAL(std::numeric_limits::is_signed, etl::integral_limits::is_signed); + CHECK_EQUAL(std::numeric_limits::is_signed, etl::integral_limits::is_signed); + CHECK_EQUAL(std::numeric_limits::is_signed, etl::integral_limits::is_signed); + CHECK_EQUAL(std::numeric_limits::is_signed, etl::integral_limits::is_signed); + CHECK_EQUAL(std::numeric_limits::is_signed, etl::integral_limits::is_signed); + CHECK_EQUAL(std::numeric_limits::is_signed, etl::integral_limits::is_signed); + CHECK_EQUAL(std::numeric_limits::is_signed, etl::integral_limits::is_signed); + CHECK_EQUAL(std::numeric_limits::is_signed, etl::integral_limits::is_signed); + CHECK_EQUAL(std::numeric_limits::is_signed, etl::integral_limits::is_signed); + CHECK_EQUAL(std::numeric_limits::is_signed, etl::integral_limits::is_signed); + CHECK_EQUAL(std::numeric_limits::is_signed, etl::integral_limits::is_signed); + } + }; +}