readonly_cstring.h.xml 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <chapter xml:id="readonly_cstring.h">
  2. <title><tt>__vic/readonly_cstring.h</tt></title>
  3. <chapter xml:id="readonly_cstring">
  4. <title><tt>readonly_cstring</tt></title>
  5. <code-block lang="C++"><![CDATA[
  6. class readonly_cstring
  7. {
  8. public:
  9. readonly_cstring();
  10. readonly_cstring(const char *str);
  11. readonly_cstring(const char *begin, const char *end);
  12. readonly_cstring(const char *chars, size_t n);
  13. readonly_cstring(const readonly_cstring &str);
  14. ~readonly_cstring() noexcept;
  15. // BEGIN C++11
  16. readonly_cstring(readonly_cstring &&str) noexcept;
  17. readonly_cstring &operator=(readonly_cstring &&str) noexcept;
  18. // END C++11
  19. readonly_cstring &operator=(const char *str);
  20. readonly_cstring &operator=(const readonly_cstring &str);
  21. readonly_cstring &assign(const char *begin, const char *end);
  22. readonly_cstring &assign(const char *chars, size_t n);
  23. bool empty() const;
  24. const char *c_str() const;
  25. operator const char*() const;
  26. char *reserve(size_t n);
  27. void swap(readonly_cstring &str) noexcept;
  28. };
  29. int compare(const readonly_cstring &s1, const readonly_cstring &s2);
  30. int compare(const readonly_cstring &s1, const char *s2);
  31. int compare(const char *s1, const readonly_cstring &s2);
  32. bool operator==(const readonly_cstring &s1, const readonly_cstring &s2);
  33. bool operator!=(const readonly_cstring &s1, const readonly_cstring &s2);
  34. bool operator<(const readonly_cstring &s1, const readonly_cstring &s2);
  35. bool operator>(const readonly_cstring &s1, const readonly_cstring &s2);
  36. bool operator<=(const readonly_cstring &s1, const readonly_cstring &s2);
  37. bool operator>=(const readonly_cstring &s1, const readonly_cstring &s2);
  38. bool operator==(const readonly_cstring &s1, const char *s2);
  39. bool operator!=(const readonly_cstring &s1, const char *s2);
  40. bool operator<(const readonly_cstring &s1, const char *s2);
  41. bool operator>(const readonly_cstring &s1, const char *s2);
  42. bool operator<=(const readonly_cstring &s1, const char *s2);
  43. bool operator>=(const readonly_cstring &s1, const char *s2);
  44. bool operator==(const char *s1, const readonly_cstring &s2);
  45. bool operator!=(const char *s1, const readonly_cstring &s2);
  46. bool operator<(const char *s1, const readonly_cstring &s2);
  47. bool operator>(const char *s1, const readonly_cstring &s2);
  48. bool operator<=(const char *s1, const readonly_cstring &s2);
  49. bool operator>=(const char *s1, const readonly_cstring &s2);
  50. void swap(readonly_cstring &s1, readonly_cstring &s2) noexcept;
  51. ]]></code-block>
  52. <p>Простой класс неизменяемой строки с нулевым терминатором, автоматически
  53. управляющий памятью. Имеет простейшую предсказуемую структуру, что может быть
  54. полезно для обеспечения двоичной совместимости или в случаях, когда
  55. использование <tt>std::string</tt> нежелательно по каким-либо причинам.
  56. Функциональность класса также минимальна. Она обеспечивает копирование и
  57. хранение строки, а также доступ к ней на чтение. Модифицировать строку нельзя –
  58. только заменять полностью на другую.</p>
  59. <p>Если Вам нужно хранить в классе строковое значение, то использование данного
  60. типа для строкового поля – это хороший вариант. Это более удобно, универсально
  61. и безопасно, чем массив символов (<tt>char[]</tt>) и часто более эффективно,
  62. чем <tt>std::string</tt>, хотя, конечно, менее универсально. Если строку
  63. предстоит часто редактировать (не считая полной замены), то лучше рассмотреть
  64. альтернативные варианты представления, например <tt>__vic::string_buffer</tt>.
  65. Класс <tt>readonly_cstring</tt> разработан не для этих целей.</p>
  66. <section><title>Гарантии, предоставляемые дизайном класса</title>
  67. <list style="bulleted">
  68. <item>Пустой указатель корректно воспринимается как пустая строка.</item>
  69. <item>Преобразователь в C-строку (<tt>const char *</tt>) всегда возвращает
  70. корректный указатель, никогда не возвращается <tt>nullptr</tt>.</item>
  71. <item>Хранимая строка занимает в памяти ровно столько места, сколько ей
  72. требуется. Никогда не резервируется дополнительная память.</item>
  73. <item>Набор полей-данных состоит только из одного поля – указателя на
  74. хранимую строку. Поэтому, если компилятор не применяет выравнивание,
  75. размер объекта будет равен размеру указателя.</item>
  76. </list>
  77. </section>
  78. <section><title>Члены класса</title>
  79. <synopsis>
  80. <prototype>readonly_cstring()</prototype>
  81. <p>Создаёт пустую строку.</p>
  82. <postcondition><tt>empty() == true</tt></postcondition>
  83. </synopsis>
  84. <synopsis>
  85. <prototype>readonly_cstring(const char *str)</prototype>
  86. <prototype>readonly_cstring(const readonly_cstring &amp;str)</prototype>
  87. <p>Создаёт копию <tt>str</tt>.</p>
  88. </synopsis>
  89. <synopsis>
  90. <prototype>readonly_cstring(const char *begin, const char *end)</prototype>
  91. <prototype>readonly_cstring(const char *chars, size_t n)</prototype>
  92. <p>Создаёт строку из диапазона символов.</p>
  93. </synopsis>
  94. <synopsis>
  95. <prototype>readonly_cstring &amp;operator=(const char *str)</prototype>
  96. <prototype>readonly_cstring &amp;operator=(const readonly_cstring &amp;str)</prototype>
  97. <p>Присваивает <tt>str</tt>.</p>
  98. </synopsis>
  99. <synopsis>
  100. <prototype>readonly_cstring(readonly_cstring &amp;&amp;str) noexcept <sign>C++11</sign></prototype>
  101. <prototype>readonly_cstring &amp;operator=(readonly_cstring &amp;&amp;str) noexcept <sign>C++11</sign></prototype>
  102. <p>Операции перемещения для режима C++11.</p>
  103. </synopsis>
  104. <synopsis>
  105. <prototype>readonly_cstring &amp;assign(const char *begin, const char *end)</prototype>
  106. <prototype>readonly_cstring &amp;assign(const char *chars, size_t n)</prototype>
  107. <p>Присваивает строку из диапазона символов.</p>
  108. </synopsis>
  109. <synopsis>
  110. <prototype>bool empty() const</prototype>
  111. <p>Возвращает <tt>true</tt>, если строка пустая.</p>
  112. </synopsis>
  113. <synopsis>
  114. <prototype>const char *c_str() const</prototype>
  115. <prototype>operator const char*() const</prototype>
  116. <p>Возвращает указатель на хранимую строку. Возвращаемый указатель никогда не
  117. бывает пустым.</p>
  118. </synopsis>
  119. <synopsis>
  120. <prototype>char *reserve(size_t n)</prototype>
  121. <p>Резервирует внутренний буфер в <tt>n</tt> символов и возвращает указатель на
  122. него. Бывает полезно для использования с функциями вроде <tt>std::sprintf()</tt>.
  123. </p>
  124. <note>Используйте как можно реже данную опасную функцию!</note>
  125. </synopsis>
  126. <synopsis>
  127. <prototype>void swap(readonly_cstring &amp;str) noexcept</prototype>
  128. <p>Меняется содержимым с <tt>str</tt>.</p>
  129. </synopsis>
  130. </section>
  131. <section><title>Свободные функции</title>
  132. <synopsis>
  133. <prototype>int compare(const readonly_cstring &amp;s1, const readonly_cstring &amp;s2)</prototype>
  134. <prototype>int compare(const readonly_cstring &amp;s1, const char *s2)</prototype>
  135. <prototype>int compare(const char *s1, const readonly_cstring &amp;s2)</prototype>
  136. <p>Сравнивает две строки аналогично <tt>std::strcmp</tt>.</p>
  137. </synopsis>
  138. <synopsis>
  139. <prototype>bool operator==(const readonly_cstring &amp;s1, const readonly_cstring &amp;s2)</prototype>
  140. <prototype>...</prototype>
  141. <prototype>bool operator>=(const char *s1, const readonly_cstring &amp;s2)</prototype>
  142. <p>Полный набор операторов сравнения <tt>readonly_cstring</tt> и
  143. <tt>const char *</tt> в различных сочетаниях.</p>
  144. </synopsis>
  145. <synopsis>
  146. <prototype>void swap(readonly_cstring &amp;s1, readonly_cstring &amp;s2) noexcept</prototype>
  147. <p>Специализация стандартного алгоритма.</p>
  148. </synopsis>
  149. </section>
  150. <section><title>Пример</title>
  151. <code-block lang="C++">
  152. class C
  153. {
  154. __vic::readonly_cstring st;
  155. public:
  156. explicit C(const char *str) : st(str) {}
  157. const char *get_str() const { return st; }
  158. };
  159. </code-block>
  160. </section>
  161. </chapter>
  162. </chapter>