forked from bblanchon/ArduinoJson
Fixed strict-aliasing warning in FloatTraits.hpp
This commit is contained in:
@ -7,6 +7,7 @@
|
|||||||
#include <stddef.h> // for size_t
|
#include <stddef.h> // for size_t
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "../Configuration.hpp"
|
#include "../Configuration.hpp"
|
||||||
|
#include "../Polyfills/alias_cast.hpp"
|
||||||
#include "../Polyfills/math.hpp"
|
#include "../Polyfills/math.hpp"
|
||||||
|
|
||||||
namespace ARDUINOJSON_NAMESPACE {
|
namespace ARDUINOJSON_NAMESPACE {
|
||||||
@ -98,8 +99,7 @@ struct FloatTraits<T, 8 /*64bits*/> {
|
|||||||
// we use this function to workaround platforms with single precision literals
|
// we use this function to workaround platforms with single precision literals
|
||||||
// (for example, when -fsingle-precision-constant is passed to GCC)
|
// (for example, when -fsingle-precision-constant is passed to GCC)
|
||||||
static T forge(uint32_t msb, uint32_t lsb) {
|
static T forge(uint32_t msb, uint32_t lsb) {
|
||||||
uint64_t bits = (uint64_t(msb) << 32) | lsb;
|
return alias_cast<T>((uint64_t(msb) << 32) | lsb);
|
||||||
return *reinterpret_cast<T*>(&bits);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -146,7 +146,7 @@ struct FloatTraits<T, 4 /*32bits*/> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static T forge(uint32_t bits) {
|
static T forge(uint32_t bits) {
|
||||||
return *reinterpret_cast<T*>(&bits);
|
return alias_cast<T>(bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
static T nan() {
|
static T nan() {
|
||||||
|
28
src/ArduinoJson/Polyfills/alias_cast.hpp
Normal file
28
src/ArduinoJson/Polyfills/alias_cast.hpp
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
// ArduinoJson - arduinojson.org
|
||||||
|
// Copyright Benoit Blanchon 2014-2019
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h> // for size_t
|
||||||
|
#include "../Configuration.hpp"
|
||||||
|
#include "../Polyfills/math.hpp"
|
||||||
|
|
||||||
|
namespace ARDUINOJSON_NAMESPACE {
|
||||||
|
|
||||||
|
template <typename T, typename F>
|
||||||
|
struct alias_cast_t {
|
||||||
|
union {
|
||||||
|
F raw;
|
||||||
|
T data;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, typename F>
|
||||||
|
T alias_cast(F raw_data) {
|
||||||
|
alias_cast_t<T, F> ac;
|
||||||
|
ac.raw = raw_data;
|
||||||
|
return ac.data;
|
||||||
|
}
|
||||||
|
} // namespace ARDUINOJSON_NAMESPACE
|
Reference in New Issue
Block a user