endian.h.xml 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <chapter xml:id="endian.h">
  2. <title><tt>__vic/endian.h</tt></title>
  3. <p>Утилиты для манипуляций порядком байт.</p>
  4. <chapter xml:id="endianness">
  5. <title><tt>endianness</tt></title>
  6. <code-block lang="C++">
  7. namespace endian {
  8. enum endianness
  9. {
  10. unknown = 0,
  11. little = 1234,
  12. big = 4321,
  13. pdp = 3412,
  14. native = <nt>&lt;one-of-the-above></nt>
  15. };
  16. } // namespace
  17. using endian::endianness;
  18. </code-block>
  19. <p>Константы, соответсвующие различным порядкам байт. <tt>endian::native</tt>
  20. принимает значение одной из констант, в зависимости от текущей платформы
  21. (подобно макросу <tt>__BYTE_ORDER__</tt> в UNIX-подобных системах).
  22. Предполагается использование данных констант для специализации шаблонов или
  23. проверках времени компиляции (например с использованием <tt>static_assert</tt>).
  24. </p>
  25. <section><title>Примеры</title>
  26. <code-block lang="C++"><![CDATA[
  27. template<__vic::endianness > struct some_algo; // not implemented
  28. // Реализация для little-endian
  29. template<> struct some_algo<__vic::endian::little>
  30. {
  31. static void doit() { ... }
  32. };
  33. // Реализация для big-endian
  34. template<> struct some_algo<__vic::endian::big>
  35. {
  36. static void doit() { ... }
  37. };
  38. // Автоматически выбрать подходящую для используемой платформы реализацию
  39. some_algo<__vic::endian::native>::doit();
  40. ]]></code-block>
  41. <code-block lang="C++">
  42. static_assert(__vic::endian::native == __vic::endian:little,
  43. "Litte-endian is expected");
  44. </code-block>
  45. </section>
  46. </chapter>
  47. <chapter xml:id="endian--from">
  48. <title><tt>endian::from_...()</tt></title>
  49. <code-block lang="C++"><![CDATA[
  50. template<class T> [[nodiscard]] constexpr T endian::from_little(T v);
  51. template<class T> [[nodiscard]] constexpr T endian::from_big(T v);
  52. ]]></code-block>
  53. <p>Возвращают значение, представленное в порядке байт, используемом платформой,
  54. преобразованное из litte/big endian, если необходимо.</p>
  55. <p><tt>T</tt> может быть любым интегральным типом или enum размера не более,
  56. чем <tt>sizeof(long long)</tt>.</p>
  57. <section><title>Пример</title>
  58. <code-block lang="C++"><![CDATA[
  59. uint16_t v;
  60. read_bytes(&v, 2); // serialized as big endian
  61. std::cout << "The value is " << __vic::endian::from_big(v) << '\n';
  62. ]]></code-block>
  63. </section>
  64. </chapter>
  65. <chapter xml:id="endian--to">
  66. <title><tt>endian::to_...()</tt></title>
  67. <code-block lang="C++"><![CDATA[
  68. template<class T> [[nodiscard]] constexpr T endian::to_little(T v);
  69. template<class T> [[nodiscard]] constexpr T endian::to_big(T v);
  70. ]]></code-block>
  71. <p>Возвращают значение, представленное в litte/big endian.</p>
  72. <p><tt>T</tt> может быть любым интегральным типом или enum размера не более,
  73. чем <tt>sizeof(long long)</tt>.</p>
  74. <section><title>Пример</title>
  75. <code-block lang="C++"><![CDATA[
  76. uint16_t v = __vic::endian::to_big(...);
  77. write_bytes(&v, 2); // serialize as big endian
  78. ]]></code-block>
  79. </section>
  80. </chapter>
  81. <chapter xml:id="swab">
  82. <title><tt>swab16()</tt>, <tt>swab32()</tt>, <tt>swab64()</tt></title>
  83. <code-block lang="C++">
  84. [[nodiscard]] constexpr uint16_t swab16(uint16_t v);
  85. [[nodiscard]] constexpr uint32_t swab32(uint32_t v);
  86. [[nodiscard]] constexpr uint64_t swab64(uint64_t v);
  87. </code-block>
  88. <p>Быстрые утилиты для обращения порядка байт (обычно реализуются с помощью
  89. специфичных для компилятора intrinsics).</p>
  90. <section><title>Пример</title>
  91. <code-block lang="C++">
  92. static_assert(__vic::swab32(0x01020304) == 0x04030201);
  93. </code-block>
  94. </section>
  95. </chapter>
  96. </chapter>