|
@@ -71,27 +71,31 @@ GPB_INLINE void GPBDebugCheckRuntimeVersion() {
|
|
|
// Conversion functions for de/serializing floating point types.
|
|
|
|
|
|
GPB_INLINE int64_t GPBConvertDoubleToInt64(double v) {
|
|
|
- union { double f; int64_t i; } u;
|
|
|
- u.f = v;
|
|
|
- return u.i;
|
|
|
+ GPBInternalCompileAssert(sizeof(double) == sizeof(int64_t), double_not_64_bits);
|
|
|
+ int64_t result;
|
|
|
+ memcpy(&result, &v, sizeof(result));
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
GPB_INLINE int32_t GPBConvertFloatToInt32(float v) {
|
|
|
- union { float f; int32_t i; } u;
|
|
|
- u.f = v;
|
|
|
- return u.i;
|
|
|
+ GPBInternalCompileAssert(sizeof(float) == sizeof(int32_t), float_not_32_bits);
|
|
|
+ int32_t result;
|
|
|
+ memcpy(&result, &v, sizeof(result));
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
GPB_INLINE double GPBConvertInt64ToDouble(int64_t v) {
|
|
|
- union { double f; int64_t i; } u;
|
|
|
- u.i = v;
|
|
|
- return u.f;
|
|
|
+ GPBInternalCompileAssert(sizeof(double) == sizeof(int64_t), double_not_64_bits);
|
|
|
+ double result;
|
|
|
+ memcpy(&result, &v, sizeof(result));
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
GPB_INLINE float GPBConvertInt32ToFloat(int32_t v) {
|
|
|
- union { float f; int32_t i; } u;
|
|
|
- u.i = v;
|
|
|
- return u.f;
|
|
|
+ GPBInternalCompileAssert(sizeof(float) == sizeof(int32_t), float_not_32_bits);
|
|
|
+ float result;
|
|
|
+ memcpy(&result, &v, sizeof(result));
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
GPB_INLINE int32_t GPBLogicalRightShift32(int32_t value, int32_t spaces) {
|