summaryrefslogtreecommitdiff
path: root/include/lib/ArduinoJson/Numbers/convertNumber.hpp
diff options
context:
space:
mode:
authorDaniel Friesel <daniel.friesel@uos.de>2021-05-12 09:12:09 +0200
committerDaniel Friesel <daniel.friesel@uos.de>2021-05-12 09:12:09 +0200
commit39895a677e5d370824e702cfe90ebc67737b8482 (patch)
treeff5b4cc9e373d33a795d50d9333e05549bd9f2b8 /include/lib/ArduinoJson/Numbers/convertNumber.hpp
parent42e7fdf01c3a5701bb51e93ad6c650c3dbbc5450 (diff)
import ArduinoJson 6.18.0
Diffstat (limited to 'include/lib/ArduinoJson/Numbers/convertNumber.hpp')
-rw-r--r--include/lib/ArduinoJson/Numbers/convertNumber.hpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/include/lib/ArduinoJson/Numbers/convertNumber.hpp b/include/lib/ArduinoJson/Numbers/convertNumber.hpp
new file mode 100644
index 0000000..02bbefa
--- /dev/null
+++ b/include/lib/ArduinoJson/Numbers/convertNumber.hpp
@@ -0,0 +1,107 @@
+// ArduinoJson - https://arduinojson.org
+// Copyright Benoit Blanchon 2014-2021
+// MIT License
+
+#pragma once
+
+#if defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wconversion"
+#elif defined(__GNUC__)
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
+#pragma GCC diagnostic push
+#endif
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+
+#include <ArduinoJson/Numbers/Float.hpp>
+#include <ArduinoJson/Polyfills/limits.hpp>
+#include <ArduinoJson/Polyfills/type_traits.hpp>
+
+namespace ARDUINOJSON_NAMESPACE {
+
+// uint32 -> int32
+// uint64 -> int32
+template <typename TOut, typename TIn>
+typename enable_if<is_integral<TIn>::value && is_unsigned<TIn>::value &&
+ is_integral<TOut>::value && sizeof(TOut) <= sizeof(TIn),
+ bool>::type
+canConvertNumber(TIn value) {
+ return value <= TIn(numeric_limits<TOut>::highest());
+}
+
+// uint32 -> int64
+template <typename TOut, typename TIn>
+typename enable_if<is_integral<TIn>::value && is_unsigned<TIn>::value &&
+ is_integral<TOut>::value && sizeof(TIn) < sizeof(TOut),
+ bool>::type
+canConvertNumber(TIn) {
+ return true;
+}
+
+// uint32 -> float
+// int32 -> float
+template <typename TOut, typename TIn>
+typename enable_if<is_integral<TIn>::value && is_floating_point<TOut>::value,
+ bool>::type
+canConvertNumber(TIn) {
+ return true;
+}
+
+// int64 -> int32
+template <typename TOut, typename TIn>
+typename enable_if<is_integral<TIn>::value && is_signed<TIn>::value &&
+ is_integral<TOut>::value && is_signed<TOut>::value &&
+ sizeof(TOut) < sizeof(TIn),
+ bool>::type
+canConvertNumber(TIn value) {
+ return value >= TIn(numeric_limits<TOut>::lowest()) &&
+ value <= TIn(numeric_limits<TOut>::highest());
+}
+
+// int32 -> int32
+// int32 -> int64
+template <typename TOut, typename TIn>
+typename enable_if<is_integral<TIn>::value && is_signed<TIn>::value &&
+ is_integral<TOut>::value && is_signed<TOut>::value &&
+ sizeof(TIn) <= sizeof(TOut),
+ bool>::type
+canConvertNumber(TIn) {
+ return true;
+}
+
+// int32 -> uint32
+template <typename TOut, typename TIn>
+typename enable_if<is_integral<TIn>::value && is_signed<TIn>::value &&
+ is_integral<TOut>::value && is_unsigned<TOut>::value,
+ bool>::type
+canConvertNumber(TIn value) {
+ if (value < 0)
+ return false;
+ return value <= TIn(numeric_limits<TOut>::highest());
+}
+
+// float -> int32
+// float -> int64
+template <typename TOut, typename TIn>
+typename enable_if<is_floating_point<TIn>::value &&
+ !is_floating_point<TOut>::value,
+ bool>::type
+canConvertNumber(TIn value) {
+ return value >= numeric_limits<TOut>::lowest() &&
+ value <= numeric_limits<TOut>::highest();
+}
+
+template <typename TOut, typename TIn>
+TOut convertNumber(TIn value) {
+ return canConvertNumber<TOut>(value) ? TOut(value) : 0;
+}
+} // namespace ARDUINOJSON_NAMESPACE
+
+#if defined(__clang__)
+#pragma clang diagnostic pop
+#elif defined(__GNUC__)
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
+#pragma GCC diagnostic pop
+#endif
+#endif