utf16.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include<__vic/utf16/reader.h>
  2. #include<__vic/utf16/writer.h>
  3. #include<__vic/readers/string.h>
  4. #include<__vic/writers/string.h>
  5. #include<__vic/iterator.h>
  6. #include<string>
  7. #include<iostream>
  8. #include<exception>
  9. #include<cassert>
  10. namespace tests {
  11. using __vic::unicode_t;
  12. typedef std::basic_string<__vic::utf16::code_unit_t> u16string;
  13. //////////////////////////////////////////////////////////////////////////////
  14. class u16string_code_unit_reader
  15. {
  16. __vic::basic_string_reader<__vic::utf16::code_unit_t> r;
  17. public:
  18. explicit u16string_code_unit_reader(const u16string &s) : r(s) {}
  19. __vic::utf16::status_t read_unit(__vic::utf16::code_unit_t &u)
  20. {
  21. if(r.read(u)) return __vic::utf16::status::ok;
  22. return __vic::utf16::status::eof;
  23. }
  24. };
  25. //////////////////////////////////////////////////////////////////////////////
  26. #if __cpp_variadic_templates && __cpp_rvalue_references
  27. typedef __vic::utf16::reader<u16string_code_unit_reader> utf16_string_reader;
  28. typedef __vic::utf16::writer<
  29. __vic::basic_string_writer<__vic::utf16::code_unit_t>
  30. > utf16_string_writer;
  31. #else
  32. struct utf16_string_reader : __vic::utf16::reader<u16string_code_unit_reader>
  33. {
  34. explicit utf16_string_reader(const u16string &s) :
  35. __vic::utf16::reader<u16string_code_unit_reader>(
  36. u16string_code_unit_reader(s)) {}
  37. };
  38. struct utf16_string_writer : __vic::utf16::writer<
  39. __vic::basic_string_writer<__vic::utf16::code_unit_t> >
  40. {
  41. explicit utf16_string_writer(u16string &s) :
  42. __vic::utf16::writer<
  43. __vic::basic_string_writer<__vic::utf16::code_unit_t>
  44. >(__vic::basic_string_writer<__vic::utf16::code_unit_t>(s)) {}
  45. };
  46. #endif
  47. //----------------------------------------------------------------------------
  48. void read_write()
  49. {
  50. // Unicode code points for u8"Я ненавижу UTF-16"
  51. const unicode_t str[] = { 0x042F, 0x20,
  52. 0x043D, 0x0435, 0x043D, 0x0430, 0x0432, 0x0438, 0x0436, 0x0443, 0x20,
  53. 0x55, 0x54, 0x46, 0x2D, 0x31, 0x36
  54. };
  55. // The same string in UTF-16LE
  56. const __vic::utf16::code_unit_t check[] = { 0x042F, 0x20,
  57. 0x043D, 0x0435, 0x043D, 0x0430, 0x0432, 0x0438, 0x0436, 0x0443,
  58. 0x20, 0x55, 0x54, 0x46, 0x2D, 0x31, 0x36, 0 };
  59. u16string s;
  60. utf16_string_writer w(s);
  61. for(const unicode_t *p = str; p != __vic::end(str); p++)
  62. w.write(*p);
  63. assert(s == check);
  64. utf16_string_reader r(s);
  65. const unicode_t *p = str;
  66. size_t n = __vic::array_size(str);
  67. for(unicode_t ch; r.read(ch); p++, n--)
  68. {
  69. assert(n != 0);
  70. assert(ch == *p);
  71. }
  72. assert(n == 0); // all str elements are read
  73. }
  74. //----------------------------------------------------------------------------
  75. void run()
  76. {
  77. read_write();
  78. }
  79. //----------------------------------------------------------------------------
  80. } // namespace
  81. int main()
  82. {
  83. try
  84. {
  85. tests::run();
  86. return 0;
  87. }
  88. catch(const std::exception &ex)
  89. {
  90. std::cerr << ex.what() << '\n';
  91. }
  92. return 1;
  93. }