Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarBytes.hpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/core/StarBytes.hpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/core/StarBytes.hpp')
-rw-r--r--source/core/StarBytes.hpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/source/core/StarBytes.hpp b/source/core/StarBytes.hpp
new file mode 100644
index 0000000..3dd013f
--- /dev/null
+++ b/source/core/StarBytes.hpp
@@ -0,0 +1,109 @@
+#ifndef STAR_BYTES_HPP
+#define STAR_BYTES_HPP
+
+#include "StarMemory.hpp"
+
+namespace Star {
+
+enum class ByteOrder {
+ BigEndian,
+ LittleEndian,
+ NoConversion
+};
+
+ByteOrder platformByteOrder();
+
+void swapByteOrder(void* ptr, size_t len);
+void swapByteOrder(void* dest, void const* src, size_t len);
+
+void toByteOrder(ByteOrder order, void* ptr, size_t len);
+void toByteOrder(ByteOrder order, void* dest, void const* src, size_t len);
+void fromByteOrder(ByteOrder order, void* ptr, size_t len);
+void fromByteOrder(ByteOrder order, void* dest, void const* src, size_t len);
+
+template <typename T>
+T toByteOrder(ByteOrder order, T const& t) {
+ T ret;
+ toByteOrder(order, &ret, &t, sizeof(t));
+ return ret;
+}
+
+template <typename T>
+T fromByteOrder(ByteOrder order, T const& t) {
+ T ret;
+ fromByteOrder(order, &ret, &t, sizeof(t));
+ return ret;
+}
+
+template <typename T>
+T toBigEndian(T const& t) {
+ return toByteOrder(ByteOrder::BigEndian, t);
+}
+
+template <typename T>
+T fromBigEndian(T const& t) {
+ return fromByteOrder(ByteOrder::BigEndian, t);
+}
+
+template <typename T>
+T toLittleEndian(T const& t) {
+ return toByteOrder(ByteOrder::LittleEndian, t);
+}
+
+template <typename T>
+T fromLittleEndian(T const& t) {
+ return fromByteOrder(ByteOrder::LittleEndian, t);
+}
+
+inline ByteOrder platformByteOrder() {
+#if STAR_LITTLE_ENDIAN
+ return ByteOrder::LittleEndian;
+#else
+ return ByteOrder::BigEndian;
+#endif
+}
+
+inline void swapByteOrder(void* ptr, size_t len) {
+ uint8_t* data = static_cast<uint8_t*>(ptr);
+ uint8_t spare;
+ for (size_t i = 0; i < len / 2; ++i) {
+ spare = data[len - 1 - i];
+ data[len - 1 - i] = data[i];
+ data[i] = spare;
+ }
+}
+
+inline void swapByteOrder(void* dest, const void* src, size_t len) {
+ const uint8_t* srcdata = static_cast<const uint8_t*>(src);
+ uint8_t* destdata = static_cast<uint8_t*>(dest);
+ for (size_t i = 0; i < len; ++i)
+ destdata[len - 1 - i] = srcdata[i];
+}
+
+inline void toByteOrder(ByteOrder order, void* ptr, size_t len) {
+ if (order != ByteOrder::NoConversion && platformByteOrder() != order)
+ swapByteOrder(ptr, len);
+}
+
+inline void toByteOrder(ByteOrder order, void* dest, void const* src, size_t len) {
+ if (order != ByteOrder::NoConversion && platformByteOrder() != order)
+ swapByteOrder(dest, src, len);
+ else
+ memcpy(dest, src, len);
+}
+
+inline void fromByteOrder(ByteOrder order, void* ptr, size_t len) {
+ if (order != ByteOrder::NoConversion && platformByteOrder() != order)
+ swapByteOrder(ptr, len);
+}
+
+inline void fromByteOrder(ByteOrder order, void* dest, void const* src, size_t len) {
+ if (order != ByteOrder::NoConversion && platformByteOrder() != order)
+ swapByteOrder(dest, src, len);
+ else
+ memcpy(dest, src, len);
+}
+
+}
+
+#endif