Minh Nguyen / ArduinoJson
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers convertNumber.hpp Source File

convertNumber.hpp

00001 // ArduinoJson - arduinojson.org
00002 // Copyright Benoit Blanchon 2014-2021
00003 // MIT License
00004 
00005 #pragma once
00006 
00007 #if defined(__clang__)
00008 #pragma clang diagnostic push
00009 #pragma clang diagnostic ignored "-Wconversion"
00010 #elif defined(__GNUC__)
00011 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
00012 #pragma GCC diagnostic push
00013 #endif
00014 #pragma GCC diagnostic ignored "-Wconversion"
00015 #endif
00016 
00017 #include <ArduinoJson/Numbers/Float.hpp>
00018 #include <ArduinoJson/Numbers/FloatTraits.hpp>
00019 #include <ArduinoJson/Numbers/Integer.hpp>
00020 #include <ArduinoJson/Polyfills/limits.hpp>
00021 
00022 namespace ARDUINOJSON_NAMESPACE {
00023 
00024 template <typename TOut, typename TIn>
00025 typename enable_if<is_integral<TOut>::value && sizeof(TOut) <= sizeof(TIn),
00026                    bool>::type
00027 canStorePositiveInteger(TIn value) {
00028   return value <= TIn(numeric_limits<TOut>::highest());
00029 }
00030 
00031 template <typename TOut, typename TIn>
00032 typename enable_if<is_integral<TOut>::value && sizeof(TIn) < sizeof(TOut),
00033                    bool>::type
00034 canStorePositiveInteger(TIn) {
00035   return true;
00036 }
00037 
00038 template <typename TOut, typename TIn>
00039 typename enable_if<is_floating_point<TOut>::value, bool>::type
00040 canStorePositiveInteger(TIn) {
00041   return true;
00042 }
00043 
00044 template <typename TOut, typename TIn>
00045 typename enable_if<is_floating_point<TOut>::value, bool>::type
00046 canStoreNegativeInteger(TIn) {
00047   return true;
00048 }
00049 
00050 template <typename TOut, typename TIn>
00051 typename enable_if<is_integral<TOut>::value && is_signed<TOut>::value &&
00052                        sizeof(TOut) <= sizeof(TIn),
00053                    bool>::type
00054 canStoreNegativeInteger(TIn value) {
00055   return value <= TIn(numeric_limits<TOut>::highest()) + 1;
00056 }
00057 
00058 template <typename TOut, typename TIn>
00059 typename enable_if<is_integral<TOut>::value && is_signed<TOut>::value &&
00060                        sizeof(TIn) < sizeof(TOut),
00061                    bool>::type
00062 canStoreNegativeInteger(TIn) {
00063   return true;
00064 }
00065 
00066 template <typename TOut, typename TIn>
00067 typename enable_if<is_integral<TOut>::value && is_unsigned<TOut>::value,
00068                    bool>::type
00069 canStoreNegativeInteger(TIn) {
00070   return false;
00071 }
00072 
00073 template <typename TOut, typename TIn>
00074 TOut convertPositiveInteger(TIn value) {
00075   return canStorePositiveInteger<TOut>(value) ? TOut(value) : 0;
00076 }
00077 
00078 template <typename TOut, typename TIn>
00079 TOut convertNegativeInteger(TIn value) {
00080   return canStoreNegativeInteger<TOut>(value) ? TOut(~value + 1) : 0;
00081 }
00082 
00083 template <typename TOut, typename TIn>
00084 typename enable_if<is_floating_point<TOut>::value, TOut>::type convertFloat(
00085     TIn value) {
00086   return TOut(value);
00087 }
00088 
00089 template <typename TOut, typename TIn>
00090 typename enable_if<!is_floating_point<TOut>::value, TOut>::type convertFloat(
00091     TIn value) {
00092   return value >= numeric_limits<TOut>::lowest() &&
00093                  value <= numeric_limits<TOut>::highest()
00094              ? TOut(value)
00095              : 0;
00096 }
00097 }  // namespace ARDUINOJSON_NAMESPACE
00098 
00099 #if defined(__clang__)
00100 #pragma clang diagnostic pop
00101 #elif defined(__GNUC__)
00102 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
00103 #pragma GCC diagnostic pop
00104 #endif
00105 #endif