str2num.h.xml 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <chapter xml:id="str2num.h">
  2. <title><tt>__vic/str2num.h</tt></title>
  3. <chapter xml:id="decimal_to_number">
  4. <title><tt>decimal_to_number()</tt></title>
  5. <code-block lang="C++"><![CDATA[
  6. #if __cpp_lib_string_view // since C++17
  7. void decimal_to_number(std::string_view s, long long &res);
  8. void decimal_to_number(std::string_view s, long &res);
  9. void decimal_to_number(std::string_view s, int &res);
  10. void decimal_to_number(std::string_view s, short &res);
  11. void decimal_to_number(std::string_view s, signed char &res);
  12. void decimal_to_number(std::string_view s, unsigned long long &res);
  13. void decimal_to_number(std::string_view s, unsigned long &res);
  14. void decimal_to_number(std::string_view s, unsigned &res);
  15. void decimal_to_number(std::string_view s, unsigned short &res);
  16. void decimal_to_number(std::string_view s, unsigned char &res);
  17. template<class Integer>
  18. [[nodiscard]] Integer decimal_to_number(std::string_view s);
  19. #else // until C++17
  20. void decimal_to_number(const std::string &s, long long &res);
  21. void decimal_to_number(const std::string &s, long &res);
  22. void decimal_to_number(const std::string &s, int &res);
  23. void decimal_to_number(const std::string &s, short &res);
  24. void decimal_to_number(const std::string &s, signed char &res);
  25. void decimal_to_number(const std::string &s, unsigned long long &res);
  26. void decimal_to_number(const std::string &s, unsigned long &res);
  27. void decimal_to_number(const std::string &s, unsigned &res);
  28. void decimal_to_number(const std::string &s, unsigned short &res);
  29. void decimal_to_number(const std::string &s, unsigned char &res);
  30. void decimal_to_number(const char *s, long long &res);
  31. void decimal_to_number(const char *s, long &res);
  32. void decimal_to_number(const char *s, int &res);
  33. void decimal_to_number(const char *s, short &res);
  34. void decimal_to_number(const char *s, signed char &res);
  35. void decimal_to_number(const char *s, unsigned long long &res);
  36. void decimal_to_number(const char *s, unsigned long &res);
  37. void decimal_to_number(const char *s, unsigned &res);
  38. void decimal_to_number(const char *s, unsigned short &res);
  39. void decimal_to_number(const char *s, unsigned char &res);
  40. template<class Integer>
  41. [[nodiscard]] Integer decimal_to_number(const std::string &s);
  42. template<class Integer>
  43. [[nodiscard]] Integer decimal_to_number(const char *s);
  44. #endif
  45. ]]></code-block>
  46. <p>Набор функций, преобразующих строки, содержащие десятичное представление
  47. целого числа, в один из стандартных целых типов C++. Входная строка может быть
  48. как C-строкой, так и <tt>std::string</tt>.</p>
  49. <p>В отличие от стандартных преобразователей, вроде <tt>std::strtol()</tt>,
  50. производится строгая проверка на формат строки и диапазон значения. В частности,
  51. лидирующие пробелы и символы, не являющиеся цифрами, в конце не допустимы. Для
  52. беззнаковых типов недопустим символ '-', который <tt>std::strtoul()</tt> по
  53. непонятной причине воспринимает как корректный.</p>
  54. <p>В случае ошибок бросаются исключения:</p>
  55. <list style="bulleted">
  56. <item><tt>std::invalid_argument</tt> – строка не является корректным целым
  57. десятичным числом;</item>
  58. <item><tt>std::range_error</tt> – строка является корректным числом, но
  59. результат не представим в диапазоне запрошенного типа (целочисленное
  60. переполнение).</item>
  61. </list>
  62. <p>Для данных функций доступны две категории прототипов:</p>
  63. <list style="numbered">
  64. <item>Значение возвращается через дополнительный выходной параметр и</item>
  65. <item>Значение возвращается естественным образом, а его тип задаётся
  66. аргументом шаблона.</item>
  67. </list>
  68. </chapter>
  69. <chapter xml:id="decimal_to_number_range">
  70. <title><tt>decimal_to_number_range()</tt></title>
  71. <code-block lang="C++"><![CDATA[
  72. template<class T, class InputIterator>
  73. void decimal_to_number_range(InputIterator begin, InputIterator end, T &res);
  74. template<class T, class InputIterator>
  75. [[nodiscard]] T decimal_to_number_range(InputIterator begin, InputIterator end);
  76. ]]></code-block>
  77. <p>Функции являются полным аналогом функций <tt>decimal_to_number()</tt> за
  78. тем исключением, что на вход принимают диапазон символов вместо строки.</p>
  79. </chapter>
  80. <chapter xml:id="decimal_parser">
  81. <title><tt>decimal_parser</tt></title>
  82. <code-block lang="C++"><![CDATA[
  83. template<class T>
  84. class decimal_parser
  85. {
  86. using status = number_parse_status; // только для краткости
  87. public:
  88. template<class InputIterator>
  89. [[nodiscard]] status parse(InputIterator begin, InputIterator end);
  90. #if __cpp_lib_string_view // since C++17
  91. [[nodiscard]] status parse(std::string_view str);
  92. #else // until C++17
  93. [[nodiscard]] status parse(const std::string &str);
  94. [[nodiscard]] status parse(const char *str);
  95. #endif
  96. [[nodiscard]] T result() const;
  97. };
  98. ]]></code-block>
  99. <p>Аналог функций <tt>decimal_to_number()</tt>, но ни бросает исключений.
  100. Вместо них <tt>parse()</tt> возвращает коды <xref to="number_parse_status"/>.
  101. </p>
  102. <section><title>Коды статусов</title>
  103. <synopsis>
  104. <prototype>number_parse_status::ok</prototype>
  105. <p>Удачно, результат может быть получен вызовом функции <tt>result()</tt>.</p>
  106. </synopsis>
  107. <synopsis>
  108. <prototype>number_parse_status::invalid_number</prototype>
  109. <p>Строка не является корректным десятичным целым.</p>
  110. </synopsis>
  111. <synopsis>
  112. <prototype>number_parse_status::unrepresentable</prototype>
  113. <p>Строка, возможно, корректна, но результат не представим в диапазоне
  114. запрошенного типа (целочисленное переполнение).</p>
  115. </synopsis>
  116. </section>
  117. <section><title>Члены класса</title>
  118. <synopsis>
  119. <prototype>template&lt;class InputIterator>
  120. [[nodiscard]] status parse(InputIterator begin, InputIterator end)</prototype>
  121. <prototype>[[nodiscard]] status parse(std::string_view str) <sign>C++17</sign></prototype>
  122. <prototype>[[nodiscard]] status parse(const std::string &amp;str) <sign>until C++17</sign></prototype>
  123. <prototype>[[nodiscard]] status parse(const char *str) <sign>until C++17</sign></prototype>
  124. <p>Преобразует диапазон символов или строку в число.</p>
  125. <postcondition>Результат преобразования может быть получен вызовом
  126. <tt>result()</tt>, если возвращён <tt>number_parse_status::ok</tt>.
  127. </postcondition>
  128. </synopsis>
  129. <synopsis>
  130. <prototype>[[nodiscard]] T result() const</prototype>
  131. <p>Возвращает результат преобразования последнего вызова <tt>parse()</tt>.</p>
  132. <precondition>Последний вызов <tt>parse()</tt> вернул
  133. <tt>number_parse_status::ok</tt>.</precondition>
  134. </synopsis>
  135. </section>
  136. <section><title>Пример</title>
  137. <code-block lang="C++"><![CDATA[
  138. template<class T>
  139. bool to_number(const std::string &s, T &result) noexcept
  140. {
  141. __vic::decimal_parser<T> p;
  142. if(p.parse(s) != __vic::number_parse_status::ok) return false;
  143. result = p.result();
  144. returt true; // 'result' содержит результат преобразования
  145. }
  146. ]]></code-block>
  147. </section>
  148. </chapter>
  149. <chapter xml:id="number_parse_status">
  150. <title><tt>number_parse_status</tt></title>
  151. <code-block lang="C++"><![CDATA[
  152. enum class number_parse_status
  153. {
  154. ok,
  155. invalid_number,
  156. unrepresentable
  157. };
  158. using number_parse_status_t = number_parse_status; // for C++98
  159. ]]></code-block>
  160. <p>Коды статусов результата разбора.</p>
  161. <section><title>Типы</title>
  162. <synopsis>
  163. <prototype>typename number_parse_status_t</prototype>
  164. <p>Используйте данное имя типа, если коду требуется совместимость с режимом
  165. C++98.</p>
  166. </synopsis>
  167. </section>
  168. </chapter>
  169. </chapter>