readers.xml 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <chapter xml:id="readers">
  2. <title><tt>__vic/readers/</tt></title>
  3. <chapter xml:id="reader-concept">
  4. <title><tt>Reader</tt> concept</title>
  5. <code-block lang="C++"><![CDATA[
  6. template<class ElementT>
  7. class ]]><nt>Reader</nt><![CDATA[
  8. {
  9. public:
  10. Reader(Reader &&o); or Reader(const Reader &o);
  11. bool read(ElementT &v); // throws on errors
  12. };
  13. ]]></code-block>
  14. <p>Concept, используемый алгоритмами библиотеки для поэлементного чтения
  15. логической последовательности элементов типа <tt>ElementT</tt>. Является
  16. обобщением и переработкой concept'а <tt>InputIterator</tt>. В частности,
  17. он лучше обрабатывает потоки ввода/вывода, строки с нулевым терминатором и
  18. другие последовательности, в которых <tt>end</tt>-итератор не имеет смысла или
  19. его получение дорого. В то же время, традиционные пары итераторов
  20. [<tt>begin</tt>,<tt>end</tt>) являются просто частным случаем и полностью
  21. поддерживаются адаптером <tt>__vic::iterator_reader</tt>.</p>
  22. <p>В случаях, когда конкретный класс удовлетворяет требованиям данного concept
  23. для некоторого <tt>ElementT = T</tt>, говорят, что он <b>моделирует</b> concept
  24. <tt>Reader&lt;T></tt>.</p>
  25. <p>Каждый экземпляр класса должен быть move- или copy-constructible.</p>
  26. <section><title>Члены класса</title>
  27. <synopsis>
  28. <prototype>bool read(ElementT &amp;v)</prototype>
  29. <p>Пытается получить следующий элемент последовательности. Возвращает
  30. <tt>true</tt> и помещает прочитанное значение в <tt>v</tt> в случае успеха.
  31. Возвращает <tt>false</tt>, если больше элементов не осталось (EOF). Бросает
  32. исключения в остальных случаях.</p>
  33. </synopsis>
  34. </section>
  35. </chapter>
  36. <chapter xml:id="iterator_reader">
  37. <title><tt>iterator_reader</tt></title>
  38. <code-block lang="C++"><![CDATA[
  39. #include<__vic/readers/iterator.h>
  40. template<class InputIterator,
  41. class T = typename std::iterator_traits<InputIterator>::value_type>
  42. class iterator_reader
  43. {
  44. public:
  45. iterator_reader(InputIterator begin, InputIterator end);
  46. bool read(T &v);
  47. InputIterator position() const;
  48. };
  49. template<class InputIterator> iterator_reader<InputIterator>
  50. make_iterator_reader(InputIterator begin, InputIterator end);
  51. template<class T, class InputIterator> iterator_reader<InputIterator,T>
  52. make_iterator_reader_for(InputIterator begin, InputIterator end);
  53. ]]></code-block>
  54. <p>Адаптер для традиционной [<tt>begin</tt>,<tt>end</tt>) пары итераторов.</p>
  55. <p>Дополнительная функция <tt>position()</tt> возвращает текущую позицию
  56. итератора внутри диапазона.</p>
  57. <p>Может быть создан с помощью конструктора или одной из функций
  58. <tt>make_...</tt>.</p>
  59. </chapter>
  60. <chapter xml:id="iterator_reader_n">
  61. <title><tt>iterator_reader_n</tt></title>
  62. <code-block lang="C++"><![CDATA[
  63. #include<__vic/readers/iterator.h>
  64. template<class InputIterator,
  65. class T = typename std::iterator_traits<InputIterator>::value_type>
  66. class iterator_reader_n
  67. {
  68. public:
  69. iterator_reader_n(InputIterator begin, size_t n);
  70. bool read(T &v);
  71. InputIterator position() const;
  72. };
  73. template<class InputIterator> iterator_reader_n<InputIterator>
  74. make_iterator_reader_n(InputIterator begin, size_t n);
  75. template<class T, class InputIterator> iterator_reader_n<InputIterator,T>
  76. make_iterator_reader_n_for(InputIterator begin, size_t n);
  77. ]]></code-block>
  78. <p>Адаптер для итератора со счётчиком элементов.</p>
  79. <p>Дополнительная функция <tt>position()</tt> возвращает текущую позицию
  80. итератора внутри диапазона.</p>
  81. <p>Может быть создан с помощью конструктора или одной из функций
  82. <tt>make_...</tt>.</p>
  83. </chapter>
  84. <chapter xml:id="container_reader">
  85. <title><tt>container_reader</tt></title>
  86. <code-block lang="C++"><![CDATA[
  87. #include<__vic/readers/container.h>
  88. template<class Cont, class T = typename Cont::value_type>
  89. class container_reader
  90. {
  91. public:
  92. explicit container_reader(const Cont &c);
  93. bool read(T &v);
  94. typename Cont::const_iterator position() const;
  95. };
  96. template<class Cont>
  97. container_reader<Cont> make_container_reader(const Cont &c);
  98. template<class T, class Cont>
  99. container_reader<Cont,T> make_container_reader_for(const Cont &c);
  100. ]]></code-block>
  101. <p>Адаптер для контейнеров в стиле STL, имеющих члены <tt>begin()</tt> и
  102. <tt>end()</tt>.</p>
  103. <p>Дополнительная функция <tt>position()</tt> возвращает текущую позицию
  104. итератора внутри диапазона.</p>
  105. <p>Может быть создан с помощью конструктора или одной из функций
  106. <tt>make_...</tt>.</p>
  107. </chapter>
  108. <chapter xml:id="cstring_reader">
  109. <title><tt>cstring_reader</tt></title>
  110. <code-block lang="C++"><![CDATA[
  111. #include<__vic/readers/cstring.h>
  112. template<class charT>
  113. class basic_cstring_reader
  114. {
  115. public:
  116. explicit basic_cstring_reader(const charT *s);
  117. bool read(charT &ch);
  118. const charT *position() const;
  119. };
  120. template<>
  121. class basic_cstring_reader<char>
  122. {
  123. public:
  124. explicit basic_cstring_reader(const char *s);
  125. bool read(char &ch);
  126. bool read(unsigned char &ch);
  127. const char *position() const;
  128. };
  129. using cstring_reader = basic_cstring_reader<char>;
  130. template<class charT>
  131. basic_cstring_reader<charT> make_cstring_reader(const charT *s);
  132. ]]></code-block>
  133. <p>Адаптер для C-строк с нулевым терминатором.</p>
  134. <p>Дополнительная функция <tt>position()</tt> возвращает текущую позицию
  135. указателя внутри строки.</p>
  136. <p>Специализация для <tt>char</tt> моделирует как <tt>Reader&lt;char></tt>,
  137. так и<tt>Reader&lt;unsigned char></tt>.</p>
  138. <p>Может быть создан с помощью конструктора или функции <tt>make_...</tt>.</p>
  139. </chapter>
  140. <chapter xml:id="string_reader">
  141. <title><tt>string_reader</tt></title>
  142. <code-block lang="C++"><![CDATA[
  143. #include<__vic/readers/string.h>
  144. template<
  145. class charT,
  146. class Tr = std::char_traits<charT>,
  147. class Al = std::allocator<charT>
  148. >
  149. class basic_string_reader
  150. {
  151. public:
  152. explicit basic_string_reader(const std::basic_string<charT,Tr,Al> &s);
  153. bool read(charT &ch);
  154. const charT *position() const;
  155. };
  156. template<class Tr, class Al>
  157. class basic_string_reader<char,Tr,Al>
  158. {
  159. public:
  160. explicit basic_string_reader(const std::basic_string<char,Tr,Al> &s);
  161. bool read(char &ch);
  162. bool read(unsigned char &ch);
  163. const char *position() const;
  164. };
  165. using string_reader = basic_string_reader<char>;
  166. template<class charT, class Tr, class Al>
  167. basic_string_reader<charT,Tr,Al>
  168. make_string_reader(const std::basic_string<charT,Tr,Al> &s);
  169. ]]></code-block>
  170. <p>Адаптер для <tt>std::basic_string</tt>.</p>
  171. <p>Дополнительная функция <tt>position()</tt> возвращает текущую позицию
  172. указателя внутри строки.</p>
  173. <p>Специализация для <tt>char</tt> моделирует как <tt>Reader&lt;char></tt>,
  174. так и <tt>Reader&lt;unsigned char></tt>.</p>
  175. <p>Может быть создан с помощью конструктора или функции <tt>make_...</tt>.</p>
  176. </chapter>
  177. <chapter xml:id="cstream_reader">
  178. <title><tt>cstream_reader</tt></title>
  179. <code-block lang="C++"><![CDATA[
  180. #include<__vic/readers/cstream.h>
  181. class cstream_reader
  182. {
  183. public:
  184. explicit cstream_reader(std::FILE *fp);
  185. bool read(char &ch) { return __vic::read(fp, ch); }
  186. bool read(unsigned char &ch) { return __vic::read(fp, ch); }
  187. };
  188. cstream_reader make_cstream_reader(std::FILE *fp);
  189. ]]></code-block>
  190. <p>Моделирует <tt>Reader&lt;char></tt> и <tt>Reader&lt;unsigned char></tt> для
  191. <tt>std::FILE</tt>.</p>
  192. <p>Может быть создан с помощью конструктора или функции <tt>make_...</tt>.</p>
  193. </chapter>
  194. </chapter>