General Purpose library for Freestanding C++ and POSIX systems
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

56 righe
876 B

4 anni fa
4 anni fa
4 anni fa
4 anni fa
4 anni fa
4 anni fa
4 anni fa
4 anni fa
4 anni fa
4 anni fa
  1. #pragma once
  2. #include "gp/containers/array.hpp"
  3. #include <bit>
  4. #include <stddef.h>
  5. #include <stdint.h>
  6. namespace gp {
  7. using endian = std::endian;
  8. template <typename T>
  9. T swap_endian(T value) {
  10. union {
  11. T v;
  12. uint8_t u8[sizeof(T)];
  13. } src, dest;
  14. src.v = value;
  15. for (size_t idx = 0;idx<sizeof(T);idx++) {
  16. dest.u8[idx] = src.u8[sizeof(T)-idx-1];
  17. }
  18. return dest.v;
  19. }
  20. template<typename T, endian mode = endian::big>
  21. struct endian_wrapper {
  22. union {
  23. T value;
  24. gp::array<uint8_t, sizeof(T)> bytes;
  25. };
  26. endian_wrapper() {}
  27. endian_wrapper(T v)
  28. : value{mode == endian::native ? v : swap_endian(v)} {}
  29. endian_wrapper(endian_wrapper& v)
  30. : value{v.value} {}
  31. endian_wrapper& operator=(T p) {
  32. value = mode == endian::native ? p : swap_endian(p);
  33. return *this;
  34. }
  35. operator T() {
  36. return mode == endian::native ? value : swap_endian(value);
  37. }
  38. };
  39. }