utf16.reader.h.xml 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <chapter xml:id="utf16.reader.h">
  2. <title><tt>__vic/utf16/reader.h</tt></title>
  3. <chapter xml:id="utf16--reader">
  4. <title><tt>utf16::reader</tt></title>
  5. <code-block lang="C++"><![CDATA[
  6. template<class CodeUnitReader>
  7. class utf16::reader
  8. {
  9. public:
  10. using code_unit_reader_type = CodeUnitReader;
  11. CodeUnitReader &get_code_unit_reader();
  12. const CodeUnitReader &get_code_unit_reader() const;
  13. template<class... Args>
  14. explicit reader(Args&&... args); // since C++11
  15. reader(); // C++98 only
  16. explicit reader(CodeUnitReader r); // C++98 only
  17. status_t parse(unicode_t &cp);
  18. bool read(unicode_t &cp);
  19. };
  20. template<class CodeUnitReader>
  21. utf16::reader<CodeUnitReader> utf16::make_reader(CodeUnitReader r);
  22. ]]></code-block>
  23. <p>Вычитывает UTF-16 code points из последовательности 2-байтовых
  24. <xref to="utf16--code_unit_t"/>. Последовательность читается посредством
  25. специального reader, имеющего следующую структуру:</p>
  26. <code-block lang="C++"><![CDATA[
  27. class ]]><nt>CodeUnitReader</nt><![CDATA[
  28. {
  29. public:
  30. utf16::status_t read_unit(utf16::code_unit_t &u);
  31. };
  32. ]]></code-block>
  33. <synopsis>
  34. <prototype>utf16::status_t read_unit(utf16::code_unit_t &amp;u)</prototype>
  35. <p>Пытается вычитать следующий code unit. Возвращает <tt>utf16::status::ok</tt>
  36. в случае успеха, <tt>utf16::status::eof</tt>, если больше не осталось code units,
  37. либо <tt>utf16::status::truncated_code_unit</tt> если доступна только часть
  38. code unit.</p>
  39. </synopsis>
  40. <section><title>Члены класса</title>
  41. <synopsis>
  42. <prototype>CodeUnitReader &amp;get_code_unit_reader()</prototype>
  43. <prototype>const CodeUnitReader &amp;get_code_unit_reader() const</prototype>
  44. <p>Возвращает ссылку на используемый code unit reader.</p>
  45. </synopsis>
  46. <synopsis>
  47. <prototype>template&lt;class... Args>
  48. explicit reader(Args&amp;&amp;... args) <sign>C++11</sign></prototype>
  49. <p>Передаёт все параметры в используемый code unit reader.</p>
  50. </synopsis>
  51. <synopsis>
  52. <prototype>reader() <sign>C++98 only</sign></prototype>
  53. <prototype>explicit reader(CodeUnitReader r) <sign>C++98 only</sign></prototype>
  54. <p>Конструкторы для режима C++98.</p>
  55. </synopsis>
  56. <synopsis>
  57. <prototype>status_t parse(unicode_t &amp;cp)</prototype>
  58. <p>Пытается извлечь следующий code point из последовательности code unit,
  59. используя <tt>CodeUnitReader</tt>. В случае успеха возвращается
  60. <tt>utf16::status::ok</tt>, code point сохраняется в <tt>cp</tt>. Если code
  61. units кончились, возвращается <tt>utf16::status::eof</tt>. Другие значения
  62. возвращаются в случае ошибок, подробности см. в <xref to="utf16--status"/>.
  63. Для доступа к отдельным code units используется
  64. <tt>CodeUnitReader::read_unit()</tt>.</p>
  65. <note>Функция сама по себе не бросает исключений, но их может бросать
  66. <tt>CodeUnitReader::read_unit()</tt>.</note>
  67. </synopsis>
  68. <synopsis>
  69. <prototype>bool read(unicode_t &amp;cp)</prototype>
  70. <p>То же самое, что <tt>parse()</tt>, но возвращает <tt>true</tt> в случае
  71. успеха, <tt>false</tt> в случае EOF, бросает исключения из
  72. <xref to="utf16.exceptions.h"/> в остальных случаях.</p>
  73. </synopsis>
  74. </section>
  75. <section><title>Свободные функции</title>
  76. <synopsis>
  77. <prototype>template&lt;class CodeUnitReader>
  78. utf16::reader&lt;CodeUnitReader> utf16::make_reader(CodeUnitReader r)</prototype>
  79. <p>Создаёт UTF-16 reader используя указанный <tt>CodeUnitReader</tt>.</p>
  80. </synopsis>
  81. </section>
  82. <section><title>Пример</title>
  83. <code-block lang="C++"><![CDATA[
  84. #include<__vic/utf16/reader.h>
  85. #include<__vic/readers/string.h>
  86. #include<string>
  87. #include<cstdint>
  88. #include<iostream>
  89. class u16string_code_unit_reader
  90. {
  91. __vic::basic_string_reader<char16_t> r;
  92. public:
  93. explicit u16string_code_unit_reader(const std::u16string &s) : r(s) {}
  94. __vic::utf16::status_t read_unit(__vic::utf16::code_unit_t &u)
  95. {
  96. if(r.read(u)) return __vic::utf16::status::ok;
  97. return __vic::utf16::status::eof;
  98. }
  99. };
  100. void print_utf16_code_points(const std::u16string &s)
  101. {
  102. __vic::utf16::reader<u16string_code_unit_reader> r(s);
  103. __vic::unicode_t cp;
  104. while(r.read(cp))
  105. std::cout << uint_least32_t(cp) << '\n';
  106. }
  107. ]]></code-block>
  108. </section>
  109. </chapter>
  110. </chapter>