summaryrefslogtreecommitdiff
path: root/doc/html/tribool/tutorial.html
blob: 9e1afae03dd35d93d8d6c6851ffc89b27800a771 (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
<!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>Tutorial</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../tribool.html" title="Chapter&#160;21.&#160;Boost.Tribool">
<link rel="prev" href="../tribool.html" title="Chapter&#160;21.&#160;Boost.Tribool">
<link rel="next" href="reference.html" title="Reference">
</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="../tribool.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../tribool.html"><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="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="tribool.tutorial"></a>Tutorial</h2></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="tutorial.html#idm45927929673424">Basic usage</a></span></dt>
<dt><span class="section"><a href="tutorial.html#idm45927929610592">Renaming the indeterminate state</a></span></dt>
<dt><span class="section"><a href="tutorial.html#idm45927929600672"><code class="computeroutput">tribool</code> input/output</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="idm45927929673424"></a>Basic usage</h3></div></div></div>
<p> The <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> class acts
    like the built-in <code class="computeroutput">bool</code> type, but for 3-state boolean
    logic. The three states are <code class="computeroutput">true</code>, <code class="computeroutput">false</code>,
    and <code class="computeroutput"><a class="link" href="../boost/logic/indeterminate.html" title="Function indeterminate">indeterminate</a></code>, where
    the first two states are equivalent to those of the C++
    <code class="computeroutput">bool</code> type and the last state represents an unknown
    boolean value (that may be <code class="computeroutput">true</code> or
    <code class="computeroutput">false</code>, we don't know).</p>
<p> The <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> class
    supports conversion from <code class="computeroutput">bool</code> values and literals
    along with its own
    <code class="computeroutput"><a class="link" href="../boost/logic/indeterminate.html" title="Function indeterminate">indeterminate</a></code>
    keyword:</p>
<pre class="programlisting"><code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> b(true);
b = false;
b = <code class="computeroutput"><a class="link" href="../boost/logic/indeterminate.html" title="Function indeterminate">indeterminate</a></code>;
<code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> b2(b);</pre>
<p> <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> supports
    conversions to <code class="computeroutput">bool</code> for use in conditional
    statements. The conversion to <code class="computeroutput">bool</code> will be
    <code class="computeroutput">true</code> when the value of the
    <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> is always true, and
    <code class="computeroutput">false</code> otherwise. Consequently, the following idiom
    may be used to determine which of the three states a
    <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> currently
    holds:</p>
<pre class="programlisting"><code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> b = some_operation();
if (b) {
  // b is true
}
else if (!b) {
  // b is false
}
else {
  // b is indeterminate
}</pre>
<p> <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> supports the
  3-state logic operators <code class="computeroutput">!</code> (negation),
  <code class="computeroutput">&amp;&amp;</code> (AND), and <code class="computeroutput">||</code> (OR), with
  <code class="computeroutput">bool</code> and <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code>
  values. For instance:</p>
<pre class="programlisting"><code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> x = some_op();
<code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> y = some_other_op();
if (x &amp;&amp; y) {
  // both x and y are true
}
else if (!(x &amp;&amp; y)) {
  // either x or y is false
}
else {
  // neither x nor y is false, but we don't know that both are true

  if (x || y) {
    // either x or y is true
  }
}</pre>
<p> Similarly, <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code>
  supports 3-state equality comparisons via the operators
  <code class="computeroutput">==</code> and <code class="computeroutput">!=</code>. These operators differ from
  "normal" equality operators in C++ because they return a
  <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code>, because potentially we
  might not know the result of a comparison (try to compare
  <code class="computeroutput">true</code> and
  <code class="computeroutput"><a class="link" href="../boost/logic/indeterminate.html" title="Function indeterminate">indeterminate</a></code>). For
  instance:</p>
<pre class="programlisting"><code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> x(true);
<code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> y(<code class="computeroutput"><a class="link" href="../boost/logic/indeterminate.html" title="Function indeterminate">indeterminate</a></code>);

assert(x == x); // okay, x == x returns true
assert(x == true); // okay, can compare <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code>s and bools</pre>
<p> The <code class="computeroutput"><a class="link" href="../boost/logic/indeterminate.html" title="Function indeterminate">indeterminate</a></code> keyword (representing the
  <code class="computeroutput"><a class="link" href="../boost/logic/indeterminate.html" title="Function indeterminate">indeterminate</a></code>&#160;<code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> value)
  doubles as a function to check if the value of a
  <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> is indeterminate,
  e.g.,</p>
<pre class="programlisting"><code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> x = try_to_do_something_tricky();
if (<code class="computeroutput"><a class="link" href="../boost/logic/indeterminate.html" title="Function indeterminate">indeterminate</a></code>(x)) {
  // value of x is indeterminate
}
else {
  // report success or failure of x
}</pre>
<p> All the logical operators and methods of <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> are marked
  as <code class="computeroutput">constexpr</code> in C++11. It means that <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> can
  be used in compile time expressions:</p>
<pre class="programlisting">constexpr <code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> x = (tribool(true) || tribool(indeterminate));
<code class="computeroutput">static_assert</code>(x, "Must be true!");
</pre>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top">Some compilers may have troubles with evaluating <code class="computeroutput">tribool::operator safe_bool()</code> at compile time.</td></tr>
</table></div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="idm45927929610592"></a>Renaming the indeterminate state</h3></div></div></div>
<p> Users may introduce additional keywords for the indeterminate
  value in addition to the implementation-supplied
  <code class="computeroutput"><a class="link" href="../boost/logic/indeterminate.html" title="Function indeterminate">indeterminate</a></code> using the
  <code class="computeroutput"><a class="link" href="../BOOST_TRIBOOL_THIRD_STATE.html" title="Macro BOOST_TRIBOOL_THIRD_STATE">BOOST_TRIBOOL_THIRD_STATE</a></code>
  macro. For instance, the following macro instantiation (at the
  global scope) will introduce the keyword <code class="computeroutput">maybe</code> as a
  synonym for <code class="computeroutput"><a class="link" href="../boost/logic/indeterminate.html" title="Function indeterminate">indeterminate</a></code>
  (also residing in the <code class="computeroutput">boost</code> namespace):</p>
<pre class="programlisting"><code class="computeroutput"><a class="link" href="../BOOST_TRIBOOL_THIRD_STATE.html" title="Macro BOOST_TRIBOOL_THIRD_STATE">BOOST_TRIBOOL_THIRD_STATE</a></code>(maybe)
<code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> x = maybe;
if (maybe(x)) { /* ... */ }</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="idm45927929600672"></a><code class="computeroutput">tribool</code> input/output</h3></div></div></div>
<p><code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> objects may be
  read from and written to streams by including the
  <code class="computeroutput"><a class="link" href="reference.html#header.boost.logic.tribool_io_hpp" title="Header &lt;boost/logic/tribool_io.hpp&gt;">boost/logic/tribool_io.hpp</a></code> header in a
  manner very similar to <code class="computeroutput">bool</code> values. When the
  <code class="computeroutput">boolalpha</code> flag is not set on the input/output stream,
  the integral values 0, 1, and 2 correspond to <code class="computeroutput">tribool</code>
  values <code class="computeroutput">false</code>, <code class="computeroutput">true</code>, and
  <code class="computeroutput">indeterminate</code>, respectively. When
  <code class="computeroutput">boolalpha</code> is set on the stream, arbitrary strings can
  be used to represent the three values, the default being "false",
  "true", and "indeterminate". For instance:</p>
<pre class="programlisting"><code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> x;
cin &gt;&gt; x; // Type "0", "1", or "2" to get false, true, or indeterminate
cout &lt;&lt; boolalpha &lt;&lt; x; // Produces "false", "true", or "indeterminate"</pre>
<p><code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> input and output
  is sensitive to the stream's current locale. The strings associated
  with false and true values are contained in the standard
  <code class="computeroutput">std::numpunct</code> facet, and the
  string naming the indeterminate type is contained in the
  <code class="computeroutput"><a class="link" href="../boost/logic/indeterminate_name.html" title="Class template indeterminate_name">indeterminate_name</a></code> facet. To
  replace the name of the indeterminate state, you need to imbue your
  stream with a local containing a
  <code class="computeroutput"><a class="link" href="../boost/logic/indeterminate_name.html" title="Class template indeterminate_name">indeterminate_name</a></code> facet, e.g.:</p>
<pre class="programlisting"><code class="computeroutput"><a class="link" href="../BOOST_TRIBOOL_THIRD_STATE.html" title="Macro BOOST_TRIBOOL_THIRD_STATE">BOOST_TRIBOOL_THIRD_STATE</a></code>(maybe)
locale global;
locale test_locale(global, new <code class="computeroutput"><a class="link" href="../boost/logic/indeterminate_name.html" title="Class template indeterminate_name">indeterminate_name</a></code>&lt;char&gt;("maybe"));
cout.imbue(test_locale);
<code class="computeroutput"><a class="link" href="../boost/logic/tribool.html" title="Class tribool">tribool</a></code> x(maybe);
cout &lt;&lt; boolalpha &lt;&lt; x &lt;&lt; endl; // Prints "maybe"</pre>
<p>If you C++ standard library implementation does not support
  locales, <code class="computeroutput">tribool</code> input/output will still work, but you
  will be unable to customize the strings printed/parsed when
  <code class="computeroutput">boolalpha</code> is set.</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; 2002-2004 Douglas Gregor<p>Use, modification and distribution is subject to the Boost
    Software License, Version 1.0. (See accompanying file
    <code class="filename">LICENSE_1_0.txt</code> 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="../tribool.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../tribool.html"><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="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>