readonly_cstring.h.xml 9.1 KB

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