summaryrefslogtreecommitdiff
path: root/doc/html/boost/proto/if_.html
blob: f8dc5bcdbb399d1225c477327d545cb958d2ca8d (plain)
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
133
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Struct template if_</title>
<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
<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/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../proto/reference.html#header.boost.proto.matches_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="if_/impl.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="refentry">
<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="comment">// 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;

</span><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> If<span class="special">,</span> <span class="keyword">typename</span> Then <span class="special">=</span> <a class="link" href="_.html" title="Struct _">proto::_</a><span class="special">,</span> 
         <span class="keyword">typename</span> Else <span class="special">=</span> <a class="link" href="not_.html" title="Struct template not_">proto::not_</a><span class="special">&lt;</span><a class="link" href="_.html" title="Struct _">proto::_</a><span class="special">&gt;</span> <span class="special">&gt;</span> 
<span class="keyword">struct</span> <a class="link" href="if_.html" title="Struct template if_">if_</a> <span class="special">:</span> <span class="keyword"></span> <a class="link" href="transform.html" title="Struct template transform">proto::transform</a><span class="special">&lt;</span><span class="identifier">if_</span><span class="special">&lt;</span><span class="identifier">If</span><span class="special">,</span> <span class="identifier">Then</span><span class="special">,</span> <span class="identifier">Else</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">{</span>
  <span class="comment">// types</span>
  <span class="keyword">typedef</span> <span class="identifier">if_</span> <a name="boost.proto.if_.proto_grammar"></a><span class="identifier">proto_grammar</span><span class="special">;</span>

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

    <span class="comment">// <a class="link" href="if_/impl.html#idp306260528-bb">public member functions</a></span>
    <span class="identifier">result_type</span> <a class="link" href="if_/impl.html#idp306261088-bb"><span class="keyword">operator</span><span class="special">(</span><span class="special">)</span></a><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">impl</span><span class="special">::</span><span class="identifier">expr_param</span><span class="special">,</span> 
                           <span class="keyword">typename</span> <span class="identifier">impl</span><span class="special">::</span><span class="identifier">state_param</span><span class="special">,</span> 
                           <span class="keyword">typename</span> <span class="identifier">impl</span><span class="special">::</span><span class="identifier">data_param</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="special">}</span><span class="special">;</span>
<span class="special">}</span><span class="special">;</span></pre></div>
<div class="refsect1">
<a name="idp341649824"></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"><span class="comment">// A grammar that only matches integral terminals,</span>
<span class="comment">// using is_integral&lt;&gt; from Boost.Type_traits.</span>
<span class="keyword">struct</span> <span class="identifier">IsIntegral</span> <span class="special">:</span>
  <a class="link" href="and_.html" title="Struct template and_">proto::and_</a><span class="special">&lt;</span>
    <a class="link" href="terminal.html" title="Struct template terminal">proto::terminal</a><span class="special">&lt;</span><a class="link" href="_.html" title="Struct _">proto::_</a><span class="special">&gt;</span><span class="special">,</span>
    <a class="link" href="if_.html" title="Struct template if_">proto::if_</a><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_integral</span><span class="special">&lt;</span><a class="link" href="_value.html" title="Struct _value">proto::_value</a><span class="special">&gt;</span><span class="special">(</span><span class="special">)</span><span class="special">&gt;</span>
  <span class="special">&gt;</span>
<span class="special">{</span><span class="special">}</span><span class="special">;</span></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"><span class="comment">// Match a terminal. If the terminal is integral, return</span>
<span class="comment">// mpl::true_; otherwise, return mpl::false_.</span>
<span class="keyword">struct</span> <span class="identifier">IsIntegral2</span> <span class="special">:</span>
  <a class="link" href="when.html" title="Struct template when">proto::when</a><span class="special">&lt;</span>
    <a class="link" href="terminal.html" title="Struct template terminal">proto::terminal</a><span class="special">&lt;</span><span class="identifier">_</span><span class="special">&gt;</span><span class="special">,</span>
    <span class="identifier">proto</span><span class="special">::</span><span class="identifier">if_</span><span class="special">&lt;</span>
      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_integral</span><span class="special">&lt;</span><a class="link" href="_value.html" title="Struct _value">proto::_value</a><span class="special">&gt;</span><span class="special">(</span><span class="special">)</span><span class="special">,</span>
      <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span><span class="special">(</span><span class="special">)</span><span class="special">,</span>
      <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">false_</span><span class="special">(</span><span class="special">)</span>
    <span class="special">&gt;</span>
  <span class="special">&gt;</span>
<span class="special">{</span><span class="special">}</span><span class="special">;</span></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/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../proto/reference.html#header.boost.proto.matches_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="if_/impl.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>