|
@@ -39,7 +39,7 @@
|
|
|
#include "Constants.hpp"
|
|
|
#include "Utils.hpp"
|
|
|
|
|
|
-#ifdef __GNUC__
|
|
|
+#if defined(__GNUC__) && (!defined(ZT_NO_TYPE_PUNNING))
|
|
|
#define ZT_VAR_MAY_ALIAS __attribute__((__may_alias__))
|
|
|
#else
|
|
|
#define ZT_VAR_MAY_ALIAS
|
|
@@ -204,15 +204,19 @@ public:
|
|
|
{
|
|
|
if ((i + sizeof(T)) > _l)
|
|
|
throw std::out_of_range("Buffer: setAt() beyond end of data");
|
|
|
+#ifdef ZT_NO_TYPE_PUNNING
|
|
|
+ uint8_t *p = reinterpret_cast<uint8_t *>(_b + i);
|
|
|
+ for(unsigned int x=1;x<=sizeof(T);++x)
|
|
|
+ *(p++) = (uint8_t)(v >> (8 * (sizeof(T) - x)));
|
|
|
+#else
|
|
|
T *const ZT_VAR_MAY_ALIAS p = reinterpret_cast<T *>(_b + i);
|
|
|
*p = Utils::hton(v);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Get a primitive integer value at a given position
|
|
|
*
|
|
|
- * This behaves like set() in reverse.
|
|
|
- *
|
|
|
* @param i Index to get integer
|
|
|
* @tparam T Integer type (e.g. uint16_t, int64_t)
|
|
|
* @return Integer value
|
|
@@ -223,8 +227,18 @@ public:
|
|
|
{
|
|
|
if ((i + sizeof(T)) > _l)
|
|
|
throw std::out_of_range("Buffer: at() beyond end of data");
|
|
|
+#ifdef ZT_NO_TYPE_PUNNING
|
|
|
+ T v = 0;
|
|
|
+ const uint8_t *p = reinterpret_cast<const uint8_t *>(_b + i);
|
|
|
+ for(unsigned int x=0;x<sizeof(T);++x) {
|
|
|
+ v <<= 8;
|
|
|
+ v |= (T)*(p++);
|
|
|
+ }
|
|
|
+ return v;
|
|
|
+#else
|
|
|
const T *const ZT_VAR_MAY_ALIAS p = reinterpret_cast<const T *>(_b + i);
|
|
|
return Utils::ntoh(*p);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -240,8 +254,14 @@ public:
|
|
|
{
|
|
|
if ((_l + sizeof(T)) > C)
|
|
|
throw std::out_of_range("Buffer: append beyond capacity");
|
|
|
+#ifdef ZT_NO_TYPE_PUNNING
|
|
|
+ uint8_t *p = reinterpret_cast<uint8_t *>(_b + _l);
|
|
|
+ for(unsigned int x=1;x<=sizeof(T);++x)
|
|
|
+ *(p++) = (uint8_t)(v >> (8 * (sizeof(T) - x)));
|
|
|
+#else
|
|
|
T *const ZT_VAR_MAY_ALIAS p = reinterpret_cast<T *>(_b + _l);
|
|
|
*p = Utils::hton(v);
|
|
|
+#endif
|
|
|
_l += sizeof(T);
|
|
|
}
|
|
|
|