summaryrefslogtreecommitdiff
path: root/src/ints/little.hpp
diff options
context:
space:
mode:
authorBen Longbons <b.r.longbons@gmail.com>2014-05-19 17:56:22 -0700
committerBen Longbons <b.r.longbons@gmail.com>2014-05-19 17:56:22 -0700
commit42a46737d480c997e6f6ebbf57e1c8f3b56ac940 (patch)
tree53bd842c0ef7071b06faad51de5813a9e4f4efb5 /src/ints/little.hpp
parent630782d8c6e7bdd9cc1d5b1d0f49836752f9228b (diff)
downloadtmwa-42a46737d480c997e6f6ebbf57e1c8f3b56ac940.tar.gz
tmwa-42a46737d480c997e6f6ebbf57e1c8f3b56ac940.tar.bz2
tmwa-42a46737d480c997e6f6ebbf57e1c8f3b56ac940.tar.xz
tmwa-42a46737d480c997e6f6ebbf57e1c8f3b56ac940.zip
Fix a couple of real bugs and also some gcc 4.7 compatibility
Diffstat (limited to 'src/ints/little.hpp')
-rw-r--r--src/ints/little.hpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/ints/little.hpp b/src/ints/little.hpp
index 68f8683..9dd32c2 100644
--- a/src/ints/little.hpp
+++ b/src/ints/little.hpp
@@ -33,6 +33,14 @@
namespace ints
{
+ // gcc doesn't always provide a builtin for this,
+ // but it *does* optimize hand-written ones
+ constexpr
+ uint16_t bswap16(uint16_t v)
+ {
+ return v >> 8 | v << 8;
+ }
+
// TODO hoist this to byte.hpp and also implement big.hpp
struct Byte
{
@@ -64,7 +72,7 @@ namespace ints
bool native_to_network(Little16 *net, uint16_t nat)
{
if (__BYTE_ORDER == __BIG_ENDIAN)
- nat = __builtin_bswap16(nat);
+ nat = bswap16(nat);
__builtin_memcpy(net, &nat, 2);
return true;
}
@@ -97,7 +105,7 @@ namespace ints
uint16_t tmp;
__builtin_memcpy(&tmp, &net, 2);
if (__BYTE_ORDER == __BIG_ENDIAN)
- tmp = __builtin_bswap16(tmp);
+ tmp = bswap16(tmp);
*nat = tmp;
return true;
}