generic_streams.html 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4. <TITLE>Generic Streams and Stream Buffers</TITLE>
  5. <LINK REL="stylesheet" href="../../../../boost.css">
  6. <LINK REL="stylesheet" href="../theme/iostreams.css">
  7. <STYLE>PRE { font-size: 80% }</STYLE>
  8. </HEAD>
  9. <BODY>
  10. <!-- Begin Banner -->
  11. <H1 CLASS="title">User's Guide</H1>
  12. <HR CLASS="banner">
  13. <!-- End Banner -->
  14. <!-- Begin Nav -->
  15. <DIV CLASS='nav'>
  16. <A HREF='modes.html'><IMG BORDER=0 WIDTH=19 HEIGHT=19 SRC='../../../../doc/src/images/prev.png'></A>
  17. <A HREF='guide.html'><IMG BORDER=0 WIDTH=19 HEIGHT=19 SRC='../../../../doc/src/images/up.png'></A>
  18. <A HREF='filtering_streams.html'><IMG BORDER=0 WIDTH=19 HEIGHT=19 SRC='../../../../doc/src/images/next.png'></A>
  19. </DIV>
  20. <!-- End Nav -->
  21. <H2>3.3 Generic Streams and Stream Buffers</H2>
  22. <DL class="page-index">
  23. <DT><A href="#overview">Overview</A></DT>
  24. <DT><A href="#headers">Headers</A></DT>
  25. <DT><A href="#reference">Reference</A>
  26. <DL>
  27. <DT><A href="#stream_buffer">Class template <CODE>stream_buffer</CODE></A></DT>
  28. <DT><A href="#stream">Class template <CODE>stream</CODE></A></DT>
  29. </DL>
  30. </DT>
  31. <DT><A href="#examples">Examples</A></DT>
  32. </DL>
  33. <HR STYLE="margin-top:1em">
  34. <A NAME="overview"></A>
  35. <H2>Overview</H2>
  36. <P>
  37. The fundamental component provided by the Iostreams library is the class template <CODE>stream_buffer</CODE>, a derived class of <CODE>std::basic_streambuf</CODE> which performs i/o by delegating to a contained Device. Instances of the Device can be associated and disassociated with an instance of <CODE>stream_buffer</CODE> using member functions <CODE><A HREF="#stream_buffer_open">open</A></CODE> and <CODE><A HREF="#stream_buffer_close">close</A></CODE>. The interface is patterned after <CODE>std::basic_filebuf</CODE> and <CODE>std::basic_fstream</CODE>.
  38. </P>
  39. <P>
  40. The class template <CODE>stream</CODE> is a stream template which derives from one of <CODE>std::basic_istream</CODE>, <CODE>std::basic_ostream</CODE> and <CODE>std::basic_iostream</CODE> depending on the <A href="modes.html">mode</A> of the first template parameter. As with <CODE>stream_buffer</CODE>, instances of the Device can by associated and disassociated with an instance of <CODE>stream</CODE> using its member functions <CODE><A HREF="#stream_open">open</A></CODE> and <CODE><A HREF="#stream_close">close</A></CODE>.
  41. </P>
  42. <A NAME="headers"></A>
  43. <H2>Headers</H2>
  44. <DL class="page-index">
  45. <DT><A CLASS="header" href="../../../../boost/iostreams/stream_buffer.hpp"><CODE>&lt;boost/iostreams/stream_buffer.hpp&gt;</CODE></A></DT>
  46. <DT><A CLASS="header" href="../../../../boost/iostreams/stream.hpp"><CODE>&lt;boost/iostreams/stream.hpp&gt;</CODE></A></DT>
  47. </DL>
  48. <A NAME="reference"></A>
  49. <H2>Reference</H2>
  50. <A NAME="stream_buffer"></A>
  51. <H3>Class template <CODE>stream_buffer</CODE></H3>
  52. <H4>Description</H4>
  53. <P>
  54. Stream buffer template which performs i/o by delegating to a contained <A HREF="../concepts/device.html">Device</A>. The Device type is specified as the first template parameter to <CODE>stream_buffer</CODE>. Instances of the the Device type are attached and detached using the member functions <A HREF="#stream_buffer_open"><CODE>open</CODE></A> and <A HREF="#stream_buffer_close"><CODE>close</CODE></A>.
  55. </P>
  56. <H4>Synopsis</H4>
  57. <PRE><SPAN CLASS="keyword">namespace</SPAN> boost { <SPAN CLASS="keyword">namespace</SPAN> iostreams {
  58. <SPAN CLASS="keyword">template</SPAN>&lt; <SPAN CLASS="keyword">typename</SPAN> <A CLASS="documented" HREF="#stream_buffer_params">T</A>,
  59. <SPAN CLASS="keyword">typename</SPAN> <A CLASS="documented" HREF="#stream_buffer_params">Tr</A> = std::char_traits&lt;<SPAN CLASS="omitted">...</SPAN>&gt;,
  60. <SPAN CLASS="keyword">typename</SPAN> <A CLASS="documented" HREF="#stream_buffer_params">Alloc</A> = std::allocator&lt;<SPAN CLASS="omitted">...</SPAN>&gt;,
  61. <SPAN CLASS="keyword">typename</SPAN> <A CLASS="documented" HREF="#stream_buffer_params">Mode</A> = <SPAN CLASS="omitted">...</SPAN> &gt;
  62. <SPAN CLASS="keyword">class</SPAN> <A CLASS="documented" HREF="#stream_buffer_params">stream_buffer</A> : <SPAN CLASS="keyword">public</SPAN> std::basic_streambuf&lt;<SPAN CLASS="omitted">...</SPAN>&gt; {
  63. <SPAN CLASS="keyword">public</SPAN>:
  64. <SPAN CLASS="keyword">typedef</SPAN> <SPAN CLASS="keyword">typename</SPAN> char_type_of&lt;T&gt;::type char_type;
  65. <SPAN CLASS="keyword">typedef</SPAN> <SPAN CLASS="keyword">typename</SPAN> Tr traits_type;
  66. [<SPAN CLASS="omitted">Standard stream buffer typedefs: int_type, off_type, etc.</SPAN>]
  67. <A CLASS="documented" HREF="#stream_buffer_default_constructor">stream_buffer</A>();
  68. <A CLASS="documented" HREF="#stream_buffer_policy_constructor">stream_buffer</A>( <SPAN CLASS="keyword">const</SPAN> T&amp; t,
  69. std::streamsize buffer_size = <SPAN CLASS="omitted">default_value</SPAN>,
  70. std::streamsize pback_size = <SPAN CLASS="omitted">default_value</SPAN> );
  71. <SPAN CLASS="comment">// Forwarding constructors</SPAN>
  72. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U&gt;
  73. <A CLASS="documented" HREF="#stream_buffer_forwarding_constructors">stream_buffer</A>([<SPAN CLASS="keyword">const</SPAN>] U&amp; u);
  74. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="keyword">typename</SPAN> U2&gt;
  75. <A CLASS="documented" HREF="#stream_buffer_forwarding_constructors">stream_buffer</A>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2);
  76. <SPAN CLASS="omitted">...</SPAN>
  77. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">typename</SPAN> UN&gt;
  78. <A CLASS="documented" HREF="#stream_buffer_forwarding_constructors">stream_buffer</A>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2 <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">const</SPAN> UN&amp; uN);
  79. <SPAN CLASS="keyword">void</SPAN> <A CLASS="documented" HREF="#stream_buffer_open">open</A>( <SPAN CLASS="keyword">const</SPAN> T&amp; t,
  80. std::streamsize buffer_size = <SPAN CLASS="omitted">default_value</SPAN>,
  81. std::streamsize pback_size = <SPAN CLASS="omitted">default_value</SPAN> );
  82. <SPAN CLASS="comment">// Forwarding overloads of open()</SPAN>
  83. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U&gt;
  84. <SPAN CLASS="keyword">void</SPAN> <A CLASS="documented" HREF="#stream_buffer_forwarding_open">open</A>([<SPAN CLASS="keyword">const</SPAN>] U&amp; u);
  85. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="keyword">typename</SPAN> U2&gt;
  86. <SPAN CLASS="keyword">void</SPAN> <A CLASS="documented" HREF="#stream_buffer_forwarding_open">open</A>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2);
  87. <SPAN CLASS="omitted">...</SPAN>
  88. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">typename</SPAN> UN&gt;
  89. <SPAN CLASS="keyword">void</SPAN> <A CLASS="documented" HREF="#stream_buffer_forwarding_open">open</A>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">const</SPAN> UN&amp; uN);
  90. <SPAN CLASS="keyword">bool</SPAN> <A CLASS="documented" HREF="#stream_buffer_is_open">is_open</A>() <SPAN CLASS="keyword">const</SPAN>;
  91. <SPAN CLASS="keyword">void</SPAN> <A CLASS="documented" HREF="#stream_buffer_close">close</A>();
  92. <SPAN CLASS="comment">// Device access</SPAN>
  93. T&amp; <A CLASS='documented' HREF="#stream_buffer_operator_star"><SPAN CLASS="documented">operator</SPAN>*</A>();
  94. T* <A CLASS='documented' HREF="#stream_buffer_operator_arrow"><SPAN CLASS="documented">operator-&gt;</SPAN></A>();
  95. };
  96. } } <SPAN CLASS="comment">// namespace boost::io</SPAN></PRE>
  97. <A NAME="stream_buffer_params"></A>
  98. <H4>Template parameters</H4>
  99. <TABLE STYLE="margin-left:2em" BORDER=0 CELLPADDING=2>
  100. <TR>
  101. <TR>
  102. <TD VALIGN="top"><I>T</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  103. <TD>A <A HREF="../../../../doc/html/CopyConstructible.html" TARGET="_top">CopyConstructible</A> model of one of the <A HREF="concepts.html#device_concepts">Device</A> concepts.</TD>
  104. </TR>
  105. <TR>
  106. <TD VALIGN="top"><I>Tr</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  107. <TD>A C++ standard library charatcer traits type (<A CLASS="bib_ref" href="../bibliography.html#iso">[ISO]</A>, 21.1.1) with <CODE>char_type</CODE> equal to the <A HREF="traits.html#char_type">character type</A> <CODE>Ch</CODE> of T. Defaults to <CODE>std::char_traits&lt;Ch&gt;</CODE>.</TD>
  108. </TR>
  109. <TR>
  110. <TD VALIGN="top"><I>Alloc</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  111. <TD>A C++ standard library allocator type (<A CLASS="bib_ref" href="../bibliography.html#iso">[ISO]</A>, 20.1.5), used to allocate any required character buffers. Defaults to <CODE>std::allocator&lt;Ch&gt;</CODE>, where <CODE>Ch</CODE> is the <A HREF="traits.html#char_type">character type</A> of T.</TD>
  112. </TR>
  113. <TR>
  114. <TD VALIGN="top"><I>Mode</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  115. <TD>A mode tag <I>convertible to the <A HREF="modes.html">mode</A> of T</I>. This parameter is principally for internal use. Specifying a <A HREF="modes.html#mode_tags">mode tag</A> properly refined by the mode of T can prevent an unneeded buffer from being allocated in some cases. Defaults to the mode of T.</TD>
  116. </TR>
  117. </TABLE>
  118. <H4><CODE>stream_buffer::stream_buffer</CODE></H4>
  119. <A NAME="stream_buffer_default_constructor"></A>
  120. <PRE> <B>stream_buffer</B>();</PRE>
  121. <P>
  122. Constructs a <CODE>stream_buffer</CODE> with no associated instance of the Device <CODE>T</CODE>. Before the instance can be used for i/o, one of its <CODE>open()</CODE> overloads must be invoked.
  123. </P>
  124. <H4><CODE>stream_buffer::stream_buffer</CODE></H4>
  125. <A NAME="stream_buffer_policy_constructor"></A>
  126. <PRE> <B>stream_buffer</B>( <SPAN CLASS="keyword">const</SPAN> T&amp; t,
  127. std::streamsize buffer_size,
  128. std::streamsize pback_size );</PRE>
  129. <P>
  130. Constructs a <CODE>stream_buffer</CODE> which is ready to perform i/o, where the parameters have the following interpretations:
  131. <TABLE STYLE="margin-left:2em" BORDER=0 CELLPADDING=2>
  132. <TR>
  133. <TR>
  134. <TD VALIGN="top"><I>t</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  135. <TD>An instance of T</TD>
  136. </TR>
  137. <TR>
  138. <TD VALIGN="top"><I>buffer_size</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  139. <TD>The size of any buffers that need to be allocated</TD>
  140. </TR>
  141. <TR>
  142. <TD VALIGN="top"><I>pback_size</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  143. <TD>The size of the putback buffer, relevant only if <CODE>Mode</CODE> is a refinement of <A HREF="modes.html#input"><CODE>input</CODE></TD>
  144. </TR>
  145. </TABLE>
  146. <A NAME="stream_buffer_forwarding_constructors"></A>
  147. <PRE> <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U&gt;
  148. <B>stream_buffer</B>([<SPAN CLASS="keyword">const</SPAN>] U&amp; u);
  149. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="keyword">typename</SPAN> U2&gt;
  150. <B>stream_buffer</B>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2);
  151. <SPAN CLASS="omitted">...</SPAN>
  152. template&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">typename</SPAN> UN&gt;
  153. <B>stream_buffer</B>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">const</SPAN> UN&amp; uN);</PRE>
  154. <P>
  155. Each of these members constructs an instance of <CODE>stream_buffer</CODE> and associates it with an instance of the Device <CODE>T</CODE> constructed from the given lists of arguments. The <CODE>T</CODE> constructor must take all arguments other than the first by value or <CODE>const</CODE> reference.
  156. </P>
  157. <P>
  158. It is not possible to specify a custom buffer size or putback buffer size using these constructors.
  159. </P>
  160. <H4><CODE>stream_buffer::open</CODE></H4>
  161. <A NAME="stream_buffer_open"></A>
  162. <PRE> void <B>open</B>( <SPAN CLASS="keyword">const</SPAN> T&amp; t,
  163. std::streamsize buffer_size,
  164. std::streamsize pback_size );</PRE>
  165. <P>
  166. Assocaites the given instance of <CODE>T</CODE> with <CODE>this</CODE> instance of <CODE>stream_buffer</CODE>, if there is no such instance currently associated; otherwise, throws <CODE>std::ios_base::failure</CODE>. The second parameter determines the size of any buffers that need to be allocated; a value of zero indicates that i/o should be unbuffered. The third parameter determines the size of the putback buffer; it is relevant only if <CODE>Mode</CODE> is a refinement of <A HREF="modes.html#input"><CODE>input</CODE></A>.
  167. </P>
  168. <A NAME="stream_buffer_forwarding_open"></A>
  169. <PRE> <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U&gt;
  170. <SPAN CLASS="keyword">void</SPAN> <B>open</B>(<SPAN CLASS="keyword">const</SPAN> U&amp; u);
  171. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="keyword">typename</SPAN> U2&gt;
  172. <SPAN CLASS="keyword">void</SPAN> <B>open</B>(<SPAN CLASS="keyword">const</SPAN> U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2);
  173. <SPAN CLASS="omitted">...</SPAN>
  174. template&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">typename</SPAN> UN&gt;
  175. <SPAN CLASS="keyword">void</SPAN> <B>open</B>(<SPAN CLASS="keyword">const</SPAN> U1&amp; u1, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">const</SPAN> UN&amp; uN);</PRE>
  176. <P>
  177. Each of these members associates with <CODE>this</CODE> instance of <CODE>stream_buffer</CODE> a newly constructed instance of the Device <CODE>T</CODE> constructed from the given lists of arguments, if there is no such instance currently associated; otherwise, they throw <CODE>std::ios_base::failure</CODE>. The <CODE>T</CODE> constructor must take all arguments other than the first by value or <CODE>const</CODE> reference.
  178. </P>
  179. <P>
  180. It is not possible to specify a custom buffer size or putback buffer size using these members.
  181. </P>
  182. <A NAME="stream_buffer_is_open"></A>
  183. <H4><CODE>stream_buffer::is_open</CODE></H4>
  184. <PRE> <SPAN CLASS="keyword">bool</SPAN> <B>is_open</B>() <SPAN CLASS="keyword">const</SPAN>;</PRE>
  185. <P>Returns true if there is an instance of the Device <CODE>T</CODE> associated with <CODE>this</CODE> instance of <CODE>stream_buffer</CODE>.</P>
  186. <A NAME="stream_buffer_close"></A>
  187. <H4><CODE>stream_buffer::close</CODE></H4>
  188. <PRE> <SPAN CLASS="keyword">void</SPAN> <B>close</B>();</PRE>
  189. <P>
  190. Disassociates from <CODE>this</CODE> instance of <CODE>stream_buffer</CODE> any instance of the Device <CODE>T</CODE> currently associated with it, calling cleanup functions as appropriate and destroying the associated instance of <CODE>T</CODE>.
  191. </P>
  192. <A NAME="stream_buffer_operator_star"></A>
  193. <H4><CODE>stream_buffer::operator*</CODE></H4>
  194. <PRE> T&amp; <B>operator*</B>();</PRE>
  195. <P>
  196. Returns a reference to the instance of <CODE>T</CODE> associated with this <CODE>stream_buffer</CODE>, which must be <A HREF="#stream_buffer_is_open"><CODE>open</CODE></A>.
  197. </P>
  198. <A NAME="stream_buffer_operator_arrow"></A>
  199. <H4><CODE>stream_buffer::operator-&gt;</CODE></H4>
  200. <PRE> T* <B>operator-&gt;</B>();</PRE>
  201. <P>
  202. Returns a pointer to the instance of <CODE>T</CODE> associated with this <CODE>stream_buffer</CODE>, which must be <A HREF="#stream_buffer_is_open"><CODE>open</CODE></A>.
  203. </P>
  204. <A NAME="stream"></A>
  205. <H3>Class template <CODE>stream</CODE></H3>
  206. <H4>Description</H4>
  207. <P>
  208. Stream template which performs i/o by delegating to a contained <A HREF="../concepts/device.html">Device</A>. The Device type is specified as the first template parameter to <CODE>stream</CODE>. Instances of the the Device type are attached and detached using the member functions <A HREF="#stream_open"><CODE>open</CODE></A> and <A HREF="#stream_close"><CODE>close</CODE></A>.
  209. </P>
  210. <P>
  211. The template <CODE>stream</CODE> derives from a specialization of <CODE>std::basic_istream</CODE>, <CODE>std::basic_ostream</CODE> or <CODE>std::basic_iostream</CODE>, depending on whether the underlying <A HREF="../concepts/device.html">Device</A> models <A HREF="../concepts/source.html">Source</A>, <A HREF="../concepts/sink.html">Sink</A> or both..
  212. </P>
  213. <H4>Synopsis</H4>
  214. <PRE><SPAN CLASS="keyword">namespace</SPAN> boost { <SPAN CLASS="keyword">namespace</SPAN> iostreams {
  215. <SPAN CLASS="keyword">template</SPAN>&lt; <SPAN CLASS="keyword">typename</SPAN> <A CLASS="documented" HREF="#stream_params">T</A>,
  216. <SPAN CLASS="keyword">typename</SPAN> <A CLASS="documented" HREF="#stream_params">Tr</A> = std::char_traits&lt;<SPAN CLASS="omitted">...</SPAN>&gt;,
  217. <SPAN CLASS="keyword">typename</SPAN> <A CLASS="documented" HREF="#stream_params">Alloc</A> = std::allocator&lt;<SPAN CLASS="omitted">...</SPAN>&gt;,
  218. <SPAN CLASS="keyword">typename</SPAN> <A CLASS="documented" HREF="#stream_params">Mode</A> = <SPAN CLASS="omitted">...</SPAN> &gt;
  219. <SPAN CLASS="keyword">class</SPAN> <A CLASS="documented" HREF="#stream_params">stream</A> : <SPAN CLASS="keyword">public</SPAN> [<SPAN CLASS='omitted'>see Description</SPAN>] {
  220. <SPAN CLASS="keyword">public</SPAN>:
  221. <SPAN CLASS="keyword">typedef</SPAN> <SPAN CLASS="keyword">typename</SPAN> char_type_of&lt;T&gt;::type char_type;
  222. <SPAN CLASS="keyword">typedef</SPAN> <SPAN CLASS="keyword">typename</SPAN> Tr traits_type;
  223. [<SPAN CLASS="omitted">Standard stream buffer typedefs: int_type, off_type, etc.</SPAN>]
  224. <A CLASS="documented" HREF="#stream_default_constructor">stream</A>();
  225. <A CLASS="documented" HREF="#stream_policy_constructor">stream</A>( <SPAN CLASS="keyword">const</SPAN> T&amp; t,
  226. std::streamsize buffer_size = <SPAN CLASS="omitted">default_value</SPAN>,
  227. std::streamsize pback_size = <SPAN CLASS="omitted">default_value</SPAN> );
  228. <SPAN CLASS="comment">// Forwarding constructors</SPAN>
  229. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U&gt;
  230. <A CLASS="documented" HREF="#stream_forwarding_constructors">stream</A>([<SPAN CLASS="keyword">const</SPAN>] U&amp; u);
  231. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="keyword">typename</SPAN> U2&gt;
  232. <A CLASS="documented" HREF="#stream_forwarding_constructors">stream</A>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2);
  233. <SPAN CLASS="omitted">...</SPAN>
  234. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">typename</SPAN> UN&gt;
  235. <A CLASS="documented" HREF="#stream_forwarding_constructors">stream</A>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">const</SPAN> UN&amp; uN);
  236. <SPAN CLASS="keyword">void</SPAN> <A CLASS="documented" HREF="#stream_open">open</A>( <SPAN CLASS="keyword">const</SPAN> T&amp; t,
  237. std::streamsize buffer_size = <SPAN CLASS="omitted">default_value</SPAN>,
  238. std::streamsize pback_size = <SPAN CLASS="omitted">default_value</SPAN> );
  239. <SPAN CLASS="comment">// Forwarding overloads of open()</SPAN>
  240. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U&gt;
  241. <SPAN CLASS="keyword">void</SPAN> <A CLASS="documented" HREF="#stream_forwarding_open">open</A>([<SPAN CLASS="keyword">const</SPAN>] U&amp; u);
  242. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="keyword">typename</SPAN> U2&gt;
  243. <SPAN CLASS="keyword">void</SPAN> <A CLASS="documented" HREF="#stream_forwarding_open">open</A>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2);
  244. <SPAN CLASS="omitted">...</SPAN>
  245. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">typename</SPAN> UN&gt;
  246. <SPAN CLASS="keyword">void</SPAN> <A CLASS="documented" HREF="#stream_forwarding_open">open</A>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">const</SPAN> UN&amp; uN);
  247. <SPAN CLASS="keyword">bool</SPAN> <A CLASS="documented" HREF="#stream_is_open">is_open</A>() <SPAN CLASS="keyword">const</SPAN>;
  248. <SPAN CLASS="keyword">void</SPAN> <A CLASS="documented" HREF="#stream_close">close</A>();
  249. <SPAN CLASS="comment">// Device access</SPAN>
  250. T&amp; <A CLASS='documented' HREF="#stream_operator_star"><SPAN CLASS="documented">operator</SPAN>*</A>();
  251. T* <A CLASS='documented' HREF="#stream_operator_arrow"><SPAN CLASS="documented">operator-&gt;</SPAN></A>();
  252. };
  253. } } <SPAN CLASS="comment">// namespace boost::io</SPAN></PRE>
  254. <A NAME="stream_params"></A>
  255. <H4>Template parameters</H4>
  256. <TABLE STYLE="margin-left:2em" BORDER=0 CELLPADDING=2>
  257. <TR>
  258. <TR>
  259. <TD VALIGN="top"><I>T</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  260. <TD>A <A HREF="../../../../doc/html/CopyConstructible.html" TARGET="_top">CopyConstructible</A> model of one of the <A HREF="concepts.html#device_concepts">Device</A> concepts.</TD>
  261. </TR>
  262. <TR>
  263. <TD VALIGN="top"><I>Tr</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  264. <TD>A C++ standard library charatcer traits type (<A CLASS="bib_ref" href="../bibliography.html#iso">[ISO]</A>, 21.1.1) with <CODE>char_type</CODE> equal to the <A HREF="traits.html#char_type">character type</A> <CODE>Ch</CODE> of T. Defaults to <CODE>std::char_traits&lt;Ch&gt;</CODE>.</TD>
  265. </TR>
  266. <TR>
  267. <TD VALIGN="top"><I>Alloc</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  268. <TD>A C++ standard library allocator type (<A CLASS="bib_ref" href="../bibliography.html#iso">[ISO]</A>, 20.1.5), used to allocate any required character buffers. Defaults to <CODE>std::allocator&lt;Ch&gt;</CODE>, where <CODE>Ch</CODE> is the <A HREF="traits.html#char_type">character type</A> of T.</TD>
  269. </TR>
  270. <TR>
  271. <TD VALIGN="top"><I>Mode</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  272. <TD>A mode tag <I>convertible to the <A HREF="modes.html">mode</A> of T</I>. This parameter is principally for internal use. Specifying a <A HREF="modes.html#mode_tags">mode tag</A> properly refined by the mode of T can prevent an unneeded buffer from being allocated in some cases. Defaults to the mode of T.</TD>
  273. </TR>
  274. </TABLE>
  275. <H4><CODE>stream::stream</CODE></H4>
  276. <A NAME="stream_default_constructor"></A>
  277. <PRE> <B>stream</B>();</PRE>
  278. <P>
  279. Constructs a <CODE>stream</CODE> with no associated instance of the Device <CODE>T</CODE>. Before the instance can be used for i/o, one of its <CODE>open()</CODE> overloads must be invoked.
  280. </P>
  281. <H4><CODE>stream::stream</CODE></H4>
  282. <A NAME="stream_policy_constructor"></A>
  283. <PRE> <B>stream</B>( <SPAN CLASS="keyword">const</SPAN> T&amp; t,
  284. std::streamsize buffer_size,
  285. std::streamsize pback_size );</PRE>
  286. <P>
  287. Constructs a <CODE>stream</CODE> which is ready to perform i/o, where the parameters have the following interpretations:
  288. <TABLE STYLE="margin-left:2em" BORDER=0 CELLPADDING=2>
  289. <TR>
  290. <TR>
  291. <TD VALIGN="top"><I>t</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  292. <TD>An instance of T</TD>
  293. </TR>
  294. <TR>
  295. <TD VALIGN="top"><I>buffer_size</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  296. <TD>The size of any buffers that need to be allocated</TD>
  297. </TR>
  298. <TR>
  299. <TD VALIGN="top"><I>pback_size</I></TD><TD WIDTH="2em" VALIGN="top">-</TD>
  300. <TD>The size of the putback buffer, relevant only if <CODE>Mode</CODE> is a refinement of <A HREF="modes.html#input"><CODE>input</CODE></TD>
  301. </TR>
  302. </TABLE>
  303. <A NAME="stream_forwarding_constructors"></A>
  304. <PRE> <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U&gt;
  305. <B>stream</B>([<SPAN CLASS="keyword">const</SPAN>] U&amp; u);
  306. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="keyword">typename</SPAN> U2&gt;
  307. <B>stream</B>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2);
  308. <SPAN CLASS="omitted">...</SPAN>
  309. template&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">typename</SPAN> UN&gt;
  310. <B>stream</B>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">const</SPAN> UN&amp; uN);</PRE>
  311. <P>
  312. Each of these members constructs an instance of <CODE>stream</CODE> and associates it with an instance of the Device <CODE>T</CODE> constructed from the given lists of arguments. The <CODE>T</CODE> constructors involved must take all arguments by value or <CODE>const</CODE> reference.
  313. </P>
  314. <P>
  315. It is not possible to specify a custom buffer size or putback buffer size using these constructors.
  316. </P>
  317. <H4><CODE>stream::open</CODE></H4>
  318. <A NAME="stream_open"></A>
  319. <PRE> void <B>open</B>( <SPAN CLASS="keyword">const</SPAN> T&amp; t,
  320. std::streamsize buffer_size,
  321. std::streamsize pback_size );</PRE>
  322. <P>
  323. Assocaites the given instance of <CODE>T</CODE> with <CODE>this</CODE> instance of <CODE>stream</CODE>, if there is no such instance currently associated; otherwise, throws <CODE>std::ios_base::failure</CODE>. The second parameter determines the size of any buffers that need to be allocated; a value of zero indicates that i/o should be unbuffered. The third parameter determines the size of the putback buffer; it is relevant only if <CODE>Mode</CODE> is a refinement of <A HREF="modes.html#input"><CODE>input</CODE></A>.
  324. </P>
  325. <A NAME="stream_forwarding_open"></A>
  326. <PRE> <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U&gt;
  327. <SPAN CLASS="keyword">void</SPAN> <B>open</B>([<SPAN CLASS="keyword">const</SPAN>] U&amp; u);
  328. <SPAN CLASS="keyword">template</SPAN>&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="keyword">typename</SPAN> U2&gt;
  329. <SPAN CLASS="keyword">void</SPAN> <B>open</B>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2);
  330. <SPAN CLASS="omitted">...</SPAN>
  331. template&lt;<SPAN CLASS="keyword">typename</SPAN> U1, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">typename</SPAN> UN&gt;
  332. <SPAN CLASS="keyword">void</SPAN> <B>open</B>([<SPAN CLASS="keyword">const</SPAN>] U1&amp; u1, <SPAN CLASS="keyword">const</SPAN> U2&amp; u2, <SPAN CLASS="omitted">...</SPAN>, <SPAN CLASS="keyword">const</SPAN> UN&amp; uN);</PRE>
  333. <P>
  334. Each of these members associates with <CODE>this</CODE> instance of <CODE>stream</CODE> a newly constructed instance of the Device <CODE>T</CODE> constructed from the given lists of arguments, if there is no such instance currently associated; otherwise, they throw <CODE>std::ios_base::failure</CODE>. The <CODE>T</CODE> constructors involved must take all arguments by value or <CODE>const</CODE> reference.
  335. </P>
  336. <P>
  337. It is not possible to specify a custom buffer size or putback buffer size using these members.
  338. </P>
  339. <A NAME="stream_is_open"></A>
  340. <H4><CODE>stream::is_open</CODE></H4>
  341. <PRE> <SPAN CLASS="keyword">bool</SPAN> <B>is_open</B>() <SPAN CLASS="keyword">const</SPAN>;</PRE>
  342. <P>Returns true if there is an instance of the Device <CODE>T</CODE> associated with <CODE>this</CODE> instance of <CODE>stream</CODE>.</P>
  343. <A NAME="stream_close"></A>
  344. <H4><CODE>stream::close</CODE></H4>
  345. <PRE> <SPAN CLASS="keyword">void</SPAN> <B>close</B>();</PRE>
  346. <P>
  347. Disassociates from <CODE>this</CODE> instance of <CODE>stream</CODE> any instance of the Device <CODE>T</CODE> currently associated with it, calling cleanup functions as appropriate and destroying the associated instance of <CODE>T</CODE>.
  348. </P>
  349. <A NAME="stream_operator_star"></A>
  350. <H4><CODE>stream::operator*</CODE></H4>
  351. <PRE> T&amp; <B>operator*</B>();</PRE>
  352. <P>
  353. Returns a reference to the instance of <CODE>T</CODE> associated with this <CODE>stream</CODE>, which must be <A HREF="#stream_is_open"><CODE>open</CODE></A>.
  354. </P>
  355. <A NAME="stream_operator_arrow"></A>
  356. <H4><CODE>stream::operator-&gt;</CODE></H4>
  357. <PRE> T* <B>operator-&gt;</B>();</PRE>
  358. <P>
  359. Returns a pointer to the instance of <CODE>T</CODE> associated with this <CODE>stream</CODE>, which must be <A HREF="#stream_is_open"><CODE>open</CODE></A>.
  360. </P>
  361. <A NAME="examples"></A>
  362. <H2>Examples</H2>
  363. <H4>Defining a simple <CODE>ofstream</CODE></H4>
  364. <P>The following example uses a <A HREF="../classes/file.html#file_sink"><CODE>file_sink</CODE></A> to define a class similar to a <CODE>std::ofstream</CODE>.
  365. <PRE> <SPAN CLASS="preprocessor">#include</SPAN> <A STYLE="text-decoration:none" href="../../../../boost/iostreams/device/file.hpp"><SPAN CLASS="literal">&lt;boost/iostreams/device/file.hpp&gt;</SPAN></A>
  366. <SPAN CLASS="preprocessor">#include</SPAN> <A STYLE="text-decoration:none" href="../../../../boost/iostreams/stream.hpp"><SPAN CLASS="literal">&lt;boost/iostreams/stream.hpp&gt;</SPAN></A>
  367. <SPAN CLASS="keyword">typedef</SPAN> stream&lt;file_sink&gt; ofstream;
  368. ofstream out(<SPAN CLASS="literal">"HeavyArtillery.txt"</SPAN>); <SPAN CLASS="comment">// Wilfred Owen</SPAN>
  369. out &lt;&lt; <SPAN CLASS="literal">"Reach at that Arrogance which needs thy harm,\n"</SPAN>
  370. <SPAN CLASS="literal">"And beat it down before its sins grow worse.\n"</SPAN>;
  371. out.close();</PRE>
  372. <H4>Reading from an array</H4>
  373. <P>The following example uses an <A href="../classes/array.html#array_source"><CODE>array_source</CODE></A> to construct an input stream from a C-style string.
  374. <PRE> <SPAN CLASS="preprocessor">#include</SPAN> <SPAN CLASS="literal">&lt;cstring&gt;</SPAN>
  375. <SPAN CLASS="preprocessor">#include</SPAN> <SPAN CLASS="literal">&lt;iostream&gt;</SPAN>
  376. <SPAN CLASS="preprocessor">#include</SPAN> <SPAN CLASS="literal">&lt;string&gt;</SPAN>
  377. <SPAN CLASS="preprocessor">#include</SPAN> <A STYLE="text-decoration:none" href="../../../../boost/iostreams/device/array.hpp"><SPAN CLASS="literal">&lt;boost/iostreams/device/array.hpp&gt;</SPAN></A>
  378. <SPAN CLASS="preprocessor">#include</SPAN> <A STYLE="text-decoration:none" href="../../../../boost/iostreams/stream.hpp"><SPAN CLASS="literal">&lt;boost/iostreams/stream.hpp&gt;</SPAN></A>
  379. const char* h = <SPAN CLASS="literal">"Hello World!"</SPAN>;
  380. stream&lt;array_source&gt; in(h, std::strlen(h));
  381. std::string hello;
  382. std::getline(in, hello);
  383. std::cout &lt;&lt; hello &lt;&lt; "\n"; // <SPAN CLASS="comment">Prints "Hello World!"</SPAN></PRE>
  384. <!-- Begin Footer -->
  385. <HR>
  386. <P CLASS="copyright">&copy; Copyright 2008 <a href="http://www.coderage.com/" target="_top">CodeRage, LLC</a><br/>&copy; Copyright 2004-2007 <a href="https://www.boost.org/users/people/jonathan_turkanis.html" target="_top">Jonathan Turkanis</a></P>
  387. <P CLASS="copyright">
  388. Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <A HREF="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>)
  389. </P>
  390. <!-- End Footer -->
  391. </BODY>