You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2017/02/04 17:53:25 UTC
[2/7] lucy git commit: Stop using endian macros in NumberUtils.cfh
Stop using endian macros in NumberUtils.cfh
Use an inline function instead. Modern compilers can compute the
result at compile time and eliminate the if/else statement.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/a923dd38
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/a923dd38
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/a923dd38
Branch: refs/heads/master
Commit: a923dd3858b899e477e9135f1a56c95a23b8797b
Parents: 4b54156
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Fri Feb 3 14:05:44 2017 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Fri Feb 3 14:52:54 2017 +0100
----------------------------------------------------------------------
core/Lucy/Util/NumberUtils.cfh | 115 +++++++++++++++++++++---------------
1 file changed, 66 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/a923dd38/core/Lucy/Util/NumberUtils.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Util/NumberUtils.cfh b/core/Lucy/Util/NumberUtils.cfh
index 6a36928..b2bd04a 100644
--- a/core/Lucy/Util/NumberUtils.cfh
+++ b/core/Lucy/Util/NumberUtils.cfh
@@ -202,48 +202,63 @@ __C__
#include <string.h>
+// Modern compilers should compute the result at compile time.
+// Taken from http://stackoverflow.com/a/1001373
+static CFISH_INLINE bool
+lucy_NumUtil_is_bigend() {
+ union {
+ uint32_t i;
+ char c[4];
+ } u = { 0x01020304 };
+
+ return u.c[0] == 1;
+}
+
static CFISH_INLINE void
lucy_NumUtil_encode_bigend_u16(uint16_t value, void *dest_ptr) {
uint8_t *dest = *(uint8_t**)dest_ptr;
-#ifdef CFISH_BIG_END
- memcpy(dest, &value, sizeof(uint16_t));
-#else /* little endian */
- uint8_t *source = (uint8_t*)&value;
- dest[0] = source[1];
- dest[1] = source[0];
-#endif /* CFISH_BIG_END (and little endian) */
+ if (lucy_NumUtil_is_bigend()) {
+ memcpy(dest, &value, sizeof(uint16_t));
+ }
+ else {
+ uint8_t *source = (uint8_t*)&value;
+ dest[0] = source[1];
+ dest[1] = source[0];
+ }
}
static CFISH_INLINE void
lucy_NumUtil_encode_bigend_u32(uint32_t value, void *dest_ptr) {
uint8_t *dest = *(uint8_t**)dest_ptr;
-#ifdef CFISH_BIG_END
- memcpy(dest, &value, sizeof(uint32_t));
-#else /* little endian */
- uint8_t *source = (uint8_t*)&value;
- dest[0] = source[3];
- dest[1] = source[2];
- dest[2] = source[1];
- dest[3] = source[0];
-#endif /* CFISH_BIG_END (and little endian) */
+ if (lucy_NumUtil_is_bigend()) {
+ memcpy(dest, &value, sizeof(uint32_t));
+ }
+ else {
+ uint8_t *source = (uint8_t*)&value;
+ dest[0] = source[3];
+ dest[1] = source[2];
+ dest[2] = source[1];
+ dest[3] = source[0];
+ }
}
static CFISH_INLINE void
lucy_NumUtil_encode_bigend_u64(uint64_t value, void *dest_ptr) {
uint8_t *dest = *(uint8_t**)dest_ptr;
-#ifdef CFISH_BIG_END
- memcpy(dest, &value, sizeof(uint64_t));
-#else /* little endian */
- uint8_t *source = (uint8_t*)&value;
- dest[0] = source[7];
- dest[1] = source[6];
- dest[2] = source[5];
- dest[3] = source[4];
- dest[4] = source[3];
- dest[5] = source[2];
- dest[6] = source[1];
- dest[7] = source[0];
-#endif /* CFISH_BIG_END (and little endian) */
+ if (lucy_NumUtil_is_bigend()) {
+ memcpy(dest, &value, sizeof(uint64_t));
+ }
+ else {
+ uint8_t *source = (uint8_t*)&value;
+ dest[0] = source[7];
+ dest[1] = source[6];
+ dest[2] = source[5];
+ dest[3] = source[4];
+ dest[4] = source[3];
+ dest[5] = source[2];
+ dest[6] = source[1];
+ dest[7] = source[0];
+ }
}
static CFISH_INLINE uint16_t
@@ -280,34 +295,36 @@ lucy_NumUtil_decode_bigend_u64(const void *source) {
static CFISH_INLINE void
lucy_NumUtil_encode_bigend_f32(float value, void *dest_ptr) {
uint8_t *dest = *(uint8_t**)dest_ptr;
-#ifdef CFISH_BIG_END
- memcpy(dest, &value, sizeof(float));
-#else
- union { float f; uint32_t u32; } duo;
- duo.f = value;
- lucy_NumUtil_encode_bigend_u32(duo.u32, &dest);
-#endif
+ if (lucy_NumUtil_is_bigend()) {
+ memcpy(dest, &value, sizeof(float));
+ }
+ else {
+ union { float f; uint32_t u32; } duo;
+ duo.f = value;
+ lucy_NumUtil_encode_bigend_u32(duo.u32, &dest);
+ }
}
static CFISH_INLINE void
lucy_NumUtil_encode_bigend_f64(double value, void *dest_ptr) {
uint8_t *dest = *(uint8_t**)dest_ptr;
-#ifdef CFISH_BIG_END
- memcpy(dest, &value, sizeof(double));
-#else
- union { double d; uint64_t u64; } duo;
- duo.d = value;
- lucy_NumUtil_encode_bigend_u64(duo.u64, &dest);
-#endif
+ if (lucy_NumUtil_is_bigend()) {
+ memcpy(dest, &value, sizeof(double));
+ }
+ else {
+ union { double d; uint64_t u64; } duo;
+ duo.d = value;
+ lucy_NumUtil_encode_bigend_u64(duo.u64, &dest);
+ }
}
static CFISH_INLINE float
lucy_NumUtil_decode_bigend_f32(const void *source) {
union { float f; uint32_t u32; } duo;
memcpy(&duo, source, sizeof(float));
-#ifdef CFISH_LITTLE_END
- duo.u32 = lucy_NumUtil_decode_bigend_u32(&duo.u32);
-#endif
+ if (!lucy_NumUtil_is_bigend()) {
+ duo.u32 = lucy_NumUtil_decode_bigend_u32(&duo.u32);
+ }
return duo.f;
}
@@ -315,9 +332,9 @@ static CFISH_INLINE double
lucy_NumUtil_decode_bigend_f64(const void *source) {
union { double d; uint64_t u64; } duo;
memcpy(&duo, source, sizeof(double));
-#ifdef CFISH_LITTLE_END
- duo.u64 = lucy_NumUtil_decode_bigend_u64(&duo.u64);
-#endif
+ if (!lucy_NumUtil_is_bigend()) {
+ duo.u64 = lucy_NumUtil_decode_bigend_u64(&duo.u64);
+ }
return duo.d;
}