File: if_.html

package info (click to toggle)
boost1.42 1.42.0-4
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 277,864 kB
  • ctags: 401,076
  • sloc: cpp: 1,235,659; xml: 74,142; ansic: 41,313; python: 26,756; sh: 11,840; cs: 2,118; makefile: 655; perl: 494; yacc: 456; asm: 353; csh: 6
file content (132 lines) | stat: -rwxr-xr-x 11,389 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Struct template if_</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../../proto/reference.html#header.boost.proto.matches_hpp" title="Header &lt;boost/proto/matches.hpp&gt;">
<link rel="prev" href="not_/impl.html" title="Struct template impl">
<link rel="next" href="if_/impl.html" title="Struct template impl">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
<td align="center"><a href="../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="not_/impl.html"><img src="../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../proto/reference.html#header.boost.proto.matches_hpp"><img src="../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="if_/impl.html"><img src="../../../../doc/html/images/next.png" alt="Next"></a>
</div>
<div class="refentry" title="Struct template if_">
<a name="boost.proto.if_"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2><span class="refentrytitle">Struct template if_</span></h2>
<p>boost::proto::if_ &#8212; Used to select one grammar or another based on the result of a compile-time Boolean.
          When used as a transform, <code class="computeroutput">proto::if_&lt;&gt;</code> selects between two
          transforms based on a compile-time Boolean.</p>
</div>
<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="emphasis"><em>// In header: &lt;<a class="link" href="../../proto/reference.html#header.boost.proto.matches_hpp" title="Header &lt;boost/proto/matches.hpp&gt;">boost/proto/matches.hpp</a>&gt;

</em></span><span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>typename</strong></span> If, <span class="bold"><strong>typename</strong></span> Then = <span class="type"><a class="link" href="_.html" title="Struct _">proto::_</a></span>, 
         <span class="bold"><strong>typename</strong></span> Else = <span class="type"><a class="link" href="not_.html" title="Struct template not_">proto::not_</a>&lt;<a class="link" href="_.html" title="Struct _">proto::_</a>&gt;</span> &gt; 
<span class="bold"><strong>struct</strong></span> <a class="link" href="if_.html" title="Struct template if_">if_</a> : <span class="bold"><strong></strong></span> <a class="link" href="transform.html" title="Struct template transform">proto::transform</a>&lt;if_&lt;If, Then, Else&gt; &gt; {
  <span class="emphasis"><em>// types</em></span>
  <span class="bold"><strong>typedef</strong></span> if_ <a name="boost.proto.if_.proto_base_expr"></a>proto_base_expr;

  <span class="emphasis"><em>// member classes/structs/unions</em></span>
  <span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>typename</strong></span> Expr, <span class="bold"><strong>typename</strong></span> State, <span class="bold"><strong>typename</strong></span> Data&gt; 
  <span class="bold"><strong>struct</strong></span> <a class="link" href="if_/impl.html" title="Struct template impl">impl</a> : <span class="bold"><strong></strong></span> <span class="type"><a class="link" href="transform_impl.html" title="Struct template transform_impl">proto::transform_impl</a>&lt; Expr, State, Data &gt;</span> {
    <span class="emphasis"><em>// types</em></span>
    <span class="bold"><strong>typedef</strong></span> <span class="bold"><strong>typename</strong></span> mpl::if_&lt;
      <span class="bold"><strong>typename</strong></span> boost::result_of&lt;<a class="link" href="when.html" title="Struct template when">proto::when</a>&lt;<a class="link" href="_.html" title="Struct _">proto::_</a>, If&gt;(Expr, State, Data)&gt;::type,
      <span class="bold"><strong>typename</strong></span> boost::result_of&lt;<a class="link" href="when.html" title="Struct template when">proto::when</a>&lt;<a class="link" href="_.html" title="Struct _">proto::_</a>, Then&gt;(Expr, State, Data)&gt;::type,
      <span class="bold"><strong>typename</strong></span> boost::result_of&lt;<a class="link" href="when.html" title="Struct template when">proto::when</a>&lt;<a class="link" href="_.html" title="Struct _">proto::_</a>, Else&gt;(Expr, State, Data)&gt;::type
    &gt;::type <a class="link" href="if_/impl.html#boost.proto.if_.impl.result_type">result_type</a>;

    <span class="emphasis"><em>// <a class="link" href="if_/impl.html#id1243287-bb">public member functions</a></em></span>
    <span class="type">result_type</span> <a class="link" href="if_/impl.html#id1243292-bb"><span class="bold"><strong>operator</strong></span>()</a>(<span class="bold"><strong>typename</strong></span> impl::expr_param, 
                           <span class="bold"><strong>typename</strong></span> impl::state_param, 
                           <span class="bold"><strong>typename</strong></span> impl::data_param) <span class="bold"><strong>const</strong></span>;
  };
};</pre></div>
<div class="refsect1" title="Description">
<a name="id1598751"></a><h2>Description</h2>
<p>
            When <code class="computeroutput">proto::if_&lt;If, Then, Else&gt;</code> is used as a grammar,
            <code class="computeroutput">If</code> must be a Proto transform and
            <code class="computeroutput">Then</code> and <code class="computeroutput">Else</code> must be grammars.
            An expression type <code class="computeroutput">E</code> matches
            <code class="computeroutput">proto::if_&lt;If, Then, Else&gt;</code> if
            <code class="computeroutput">boost::result_of&lt;<a class="link" href="when.html" title="Struct template when">proto::when</a>&lt;<a class="link" href="_.html" title="Struct _">proto::_</a>, If&gt;(E)&gt;::type::value</code>
            is <code class="computeroutput">true</code> and
            <code class="computeroutput">E</code> matches <code class="computeroutput">Then</code>; or, if
            <code class="computeroutput">boost::result_of&lt;<a class="link" href="when.html" title="Struct template when">proto::when</a>&lt;<a class="link" href="_.html" title="Struct _">proto::_</a>, If&gt;(E)&gt;::type::value</code>
            is <code class="computeroutput">false</code> and <code class="computeroutput">E</code> matches <code class="computeroutput">Else</code>.
          </p>
<p>
            The template parameter <code class="computeroutput">Then</code> defaults to <code class="computeroutput"><a class="link" href="_.html" title="Struct _">proto::_</a></code>
            and <code class="computeroutput">Else</code> defaults to
            <code class="computeroutput"><a class="link" href="not_.html" title="Struct template not_">proto::not_</a>&lt;<a class="link" href="_.html" title="Struct _">proto::_</a>&gt;</code>,
            so an expression type <code class="computeroutput">E</code> will match
            <code class="computeroutput">proto::if_&lt;If&gt;</code> if and only if
            <code class="computeroutput">boost::result_of&lt;<a class="link" href="when.html" title="Struct template when">proto::when</a>&lt;<a class="link" href="_.html" title="Struct _">proto::_</a>, If&gt;(E)&gt;::type::value</code>
            is <code class="computeroutput">true</code>.
          </p>
<p>
            </p>
<pre class="programlisting">// A grammar that only matches integral terminals,
// using is_integral&lt;&gt; from Boost.Type_traits.
struct IsIntegral :
  <a class="link" href="and_.html" title="Struct template and_">proto::and_</a>&lt;
    <a class="link" href="terminal.html" title="Struct template terminal">proto::terminal</a>&lt;<a class="link" href="_.html" title="Struct _">proto::_</a>&gt;,
    <a class="link" href="if_.html" title="Struct template if_">proto::if_</a>&lt; boost::is_integral&lt;<a class="link" href="_value.html" title="Struct _value">proto::_value</a>&gt;()&gt;
  &gt;
{};</pre>
<p>
          </p>
<p>
            When <code class="computeroutput">proto::if_&lt;If, Then, Else&gt;</code> is used as a transform,
            <code class="computeroutput">If</code>, <code class="computeroutput">Then</code> and
            <code class="computeroutput">Else</code> must be Proto transforms. When applying the transform to
            an expression <code class="computeroutput">E</code>, state <code class="computeroutput">S</code> and
            data <code class="computeroutput">V</code>, if
            <code class="computeroutput">boost::result_of&lt;<a class="link" href="when.html" title="Struct template when">proto::when</a>&lt;<a class="link" href="_.html" title="Struct _">proto::_</a>, If&gt;(E,S,V)&gt;::type::value</code>
            is <code class="computeroutput">true</code> then the <code class="computeroutput">Then</code> transform
            is applied; otherwise the <code class="computeroutput">Else</code> transform is applied.
            </p>
<pre class="programlisting">// Match a terminal. If the terminal is integral, return
// mpl::true_; otherwise, return mpl::false_.
struct IsIntegral2 :
  <a class="link" href="when.html" title="Struct template when">proto::when</a>&lt;
    <a class="link" href="terminal.html" title="Struct template terminal">proto::terminal</a>&lt;_&gt;,
    proto::if_&lt;
      boost::is_integral&lt;<a class="link" href="_value.html" title="Struct _value">proto::_value</a>&gt;(),
      mpl::true_(),
      mpl::false_()
    &gt;
  &gt;
{};</pre>
<p>
          </p>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2008 Eric Niebler<p>
        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" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
      </p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="not_/impl.html"><img src="../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../proto/reference.html#header.boost.proto.matches_hpp"><img src="../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="if_/impl.html"><img src="../../../../doc/html/images/next.png" alt="Next"></a>
</div>
</body>
</html>