| 1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | 
|---|
| 2 | <html> | 
|---|
| 3 | <head> | 
|---|
| 4 | <title>The Input Policy</title> | 
|---|
| 5 | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | 
|---|
| 6 | <link href="theme/style.css" rel="stylesheet" type="text/css"> | 
|---|
| 7 | </head> | 
|---|
| 8 |  | 
|---|
| 9 | <body> | 
|---|
| 10 | <table width="100%" border="0" cellspacing="2" background="theme/bkd2.gif"> | 
|---|
| 11 |   <tr>  | 
|---|
| 12 |     <td width="21"> <h1></h1></td> | 
|---|
| 13 |     <td width="885"> <font face="Verdana, Arial, Helvetica, sans-serif"><b><font size="6">The  | 
|---|
| 14 |       Input Policy</font></b></font></td> | 
|---|
| 15 |     <td width="96"><a href="http://www.boost.org"><img src="theme/wave.gif" width="93" height="68" align="right" border="0"></a></td> | 
|---|
| 16 |   </tr> | 
|---|
| 17 | </table> | 
|---|
| 18 | <br> | 
|---|
| 19 | <table border="0"> | 
|---|
| 20 |   <tr>  | 
|---|
| 21 |     <td width="10"></td> | 
|---|
| 22 |     <td width="30"><a href="../index.html"><img src="theme/u_arr.gif" border="0"></a></td> | 
|---|
| 23 |     <td width="30"><a href="class_reference_context.html"><img src="theme/l_arr.gif" width="20" height="19" border="0"></a></td> | 
|---|
| 24 |     <td width="30"><a href="class_reference_ctxpolicy.html"><img src="theme/r_arr.gif" border="0"></a></td> | 
|---|
| 25 |   </tr> | 
|---|
| 26 | </table> | 
|---|
| 27 |  | 
|---|
| 28 | <blockquote>  | 
|---|
| 29 |   <p><a href="class_reference_inptpolcy.html#introduction">Introduction</a><br> | 
|---|
| 30 |     <a href="class_reference_inptpolcy.html#header_synopsis">Header 'wave/cpp_iteration_context.hpp'  | 
|---|
| 31 |     synopsis</a><br> | 
|---|
| 32 |     <a href="class_reference_inptpolcy.html#template_parameters">Template parameters</a><br> | 
|---|
| 33 |     <a href="class_reference_inptpolcy.html#member_functions">Member functions</a></p> | 
|---|
| 34 | </blockquote> | 
|---|
| 35 | <h2><b><a name="introduction"></a>Introduction</b></h2> | 
|---|
| 36 | <p>The input policy type may be specified as a template parameter to the <tt>wave::context</tt>  | 
|---|
| 37 |   object and is used for customizing the way, how an included file is to be represented  | 
|---|
| 38 |   by a pair of iterators pointing to the beginning and the end of the resulting  | 
|---|
| 39 |   input sequence. If this template parameter is not given while instantiating  | 
|---|
| 40 |   the context object, it defaults to the <tt>iteration_context_policies::load_file_to_string</tt>  | 
|---|
| 41 |   type. </p> | 
|---|
| 42 | <h2><b><a name="header_synopsis"></a>Header <a href="http://cvs.sourceforge.net/viewcvs.py/boost/boost/boost/wave/util/iteration_context.hpp?view=markup">wave/iteration_context.hpp</a>  | 
|---|
| 43 |   synopsis</b></h2> | 
|---|
| 44 | <p>The following code listing does not show the required interface only, but for  | 
|---|
| 45 |   brevity reasons the whole implementation of an input policy, which loads the  | 
|---|
| 46 |   given file into a string variable and exposes the begin() and end() iterators  | 
|---|
| 47 |   of this string to the <tt>Wave</tt> library.</p> | 
|---|
| 48 | <pre><span class="keyword">namespace</span> boost { | 
|---|
| 49 | <span class="keyword">namespace</span> wave { | 
|---|
| 50 | <span class="keyword">namespace</span> iteration_context_policies { | 
|---|
| 51 |  | 
|---|
| 52 |     <span class="keyword">struct</span> load_file_to_string { | 
|---|
| 53 |      | 
|---|
| 54 |         <span class="keyword">template</span> <<span class="keyword">typename</span> IterContext> | 
|---|
| 55 |         <span class="keyword">class</span> inner { | 
|---|
| 56 |          | 
|---|
| 57 |         <span class="keyword">public</span>: | 
|---|
| 58 |             <span class="comment">// expose the begin and end iterators for the</span> | 
|---|
| 59 |             <span class="comment">// included file</span> | 
|---|
| 60 |             <span class="keyword">template</span> <typename Position> | 
|---|
| 61 |             <span class="keyword">static</span>  | 
|---|
| 62 |             <span class="keyword">void</span> <a href="class_reference_inptpolcy.html#init_iterators">init_iterators</a>(IterContext&iter_ctx,  | 
|---|
| 63 |                 Position const &act_pos) | 
|---|
| 64 |             { | 
|---|
| 65 |                 <span class="keyword">typedef typename</span> IterContext::iterator_type iterator_type; | 
|---|
| 66 |                  | 
|---|
| 67 |                 <span class="keyword">std::ifstream</span> instream(iter_ctx.filename.c_str()); | 
|---|
| 68 |                 if (!instream.is_open()) { | 
|---|
| 69 |                     CPP_THROW(preprocess_exception, bad_include_file,  | 
|---|
| 70 |                         iter_ctx.filename, act_pos); | 
|---|
| 71 |                 } | 
|---|
| 72 |                  | 
|---|
| 73 |                 iter_ctx.instring = <span class="keyword">std::string</span>( | 
|---|
| 74 |                     <span class="keyword">std::istreambuf_iterator</span><char>(instream.rdbuf()), | 
|---|
| 75 |                     <span class="keyword">std::istreambuf_iterator</span><char>()); | 
|---|
| 76 |  | 
|---|
| 77 |                 iter_ctx.first = iterator_type(iter_ctx.instring.begin(),  | 
|---|
| 78 |                     iter_ctx.instring.end(),  | 
|---|
| 79 |                     PositionT(iter_ctx.filename)); | 
|---|
| 80 |                 iter_ctx.last = iterator_type(); | 
|---|
| 81 |             } | 
|---|
| 82 |  | 
|---|
| 83 |         <span class="keyword">private</span>: | 
|---|
| 84 |             <span class="keyword">std::string</span> instring; | 
|---|
| 85 |         }; | 
|---|
| 86 |     }; | 
|---|
| 87 |  | 
|---|
| 88 | }   <span class="comment">// namespace iteration_context_policies</span> | 
|---|
| 89 | }   <span class="comment">// namespace wave </span> | 
|---|
| 90 | }   <span class="comment">// namespace boost </span>  </pre> | 
|---|
| 91 | <p>As you can see, an <tt>input_policy</tt> for the <tt>wave::context</tt> object  | 
|---|
| 92 |   should implement one function only, the init_iterators function. The policy  | 
|---|
| 93 |   shown is implemented with the help of an embedded class to avoid the need for  | 
|---|
| 94 |   template template parameters, which aren't implemented by all systems today.  | 
|---|
| 95 |   This embedded class should have the name <tt>inner</tt>.</p> | 
|---|
| 96 | <h3><a name="template_parameters"></a>Template Parameters</h3> | 
|---|
| 97 | <p>The <tt>inner</tt> class is instantiated with one template parameter, the iteration  | 
|---|
| 98 |   context type, from which the policy is a part of. The iterator type <tt>iterator_type</tt>  | 
|---|
| 99 |   which is used to access the underlying input stream has to be derived through  | 
|---|
| 100 |   a typedef as shown. The iterator pair to initialize (which is accessible as  | 
|---|
| 101 |   <tt>iter_ctx.first</tt> and <tt>iter_ctx.last</tt>) has to initialized from  | 
|---|
| 102 |   an abritrary iterator type, representing the actual input stream.</p> | 
|---|
| 103 | <h3><a name="member_functions"></a>Member Functions</h3> | 
|---|
| 104 | <p><a name="init_iterators"></a><b>init_iterators</b></p> | 
|---|
| 105 | <pre>    <span class="keyword">template</span> <<span class="keyword">typename</span> Position> | 
|---|
| 106 |     <span class="keyword">static void</span> init_iterators( | 
|---|
| 107 |         IterContext iter_ctx,  | 
|---|
| 108 |         Position const &act_pos);</pre> | 
|---|
| 109 |  | 
|---|
| 110 |     <p>directive was found in the input token stream. The main rationale for this  | 
|---|
| 111 |     function is to initialize the pair of iterators <tt>iter_ctx.first</tt> and  | 
|---|
| 112 |     <tt>iter_ctx.last</tt>, which are to be used to access the input stream corresponding  | 
|---|
| 113 |   to the include file to be inserted from inside the preprocessing engine.</p> | 
|---|
| 114 | </blockquote> | 
|---|
| 115 | <table border="0"> | 
|---|
| 116 |   <tr>  | 
|---|
| 117 |     <td width="10"></td> | 
|---|
| 118 |     <td width="30"><a href="../index.html"><img src="theme/u_arr.gif" border="0"></a></td> | 
|---|
| 119 |     <td width="30"><a href="class_reference_context.html"><img src="theme/l_arr.gif" width="20" height="19" border="0"></a></td> | 
|---|
| 120 |     <td width="30"><a href="class_reference_ctxpolicy.html"><img src="theme/r_arr.gif" border="0"></a></td> | 
|---|
| 121 |   </tr> | 
|---|
| 122 | </table> | 
|---|
| 123 | <hr size="1"> | 
|---|
| 124 | <p class="copyright">Copyright © 2003-2007 Hartmut Kaiser<br> | 
|---|
| 125 |   <br> | 
|---|
| 126 |   <font size="2">Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) </font> </p> | 
|---|
| 127 | <span class="updated"></span> | 
|---|
| 128 | <p class="copyright"><span class="updated">Last updated:  | 
|---|
| 129 |   <!-- #BeginDate format:fcAm1m -->Sunday, May 15, 2005  12:23<!-- #EndDate --> | 
|---|
| 130 |   </span></p> | 
|---|
| 131 | </body> | 
|---|
| 132 | </html> | 
|---|