Compare commits

..

49 Commits

Author SHA1 Message Date
Rene Rivera
8cb4972256 Add, and update, documentation build targets. 2016-10-10 11:39:51 -05:00
Marshall Clow
addbcdb81a Merge changes from develop for the 1.58.0 release 2015-04-01 10:30:54 -07:00
Noel Belcourt
b3adfec7ff Merge pull request #2 from apolukhin/develop
C++11 updates for tribool: added noexcepts and constexprs, fixed warnings

Tested on Linux with gcc-4.9.1.
2014-11-02 15:44:13 -07:00
Noel Belcourt
1e220fccf3 Merge pull request #3 from danieljames/metadata
Create metadata file.
2014-09-01 20:33:52 -06:00
Daniel James
6e391684a9 Add metadata file. 2014-08-18 15:00:59 +01:00
Antony Polukhin
e1f476eaba Docs update 2014-07-31 18:11:11 +04:00
Antony Polukhin
bf0907a227 C++11 updates for tribool: added noexcepts and constexprs, fixed warnings 2014-07-31 00:54:51 +04:00
Marshall Clow
1dab9cd10a Merge pull request #1 from boostorg/develop
Merge to master.
2014-05-16 08:40:43 -06:00
Daniel James
2afd1a9ec6 Create merge base for git. 2014-04-06 14:12:46 +01:00
Stephen Kelly
95baf1910a Logic: Remove obsolete MSVC version check.
[SVN r86041]
2013-09-30 00:22:10 +00:00
Stephen Kelly
9f9a1e7656 Remove obsolete MSVC check from pragma guard
git grep -h -B1 "^#\s*pragma once" | grep -v pragma | sort | uniq

is now clean.

[SVN r85952]
2013-09-26 13:02:51 +00:00
Daniel James
aede53315c Merge root index file, and logic redirect.
[SVN r72210]
2011-05-27 11:53:52 +00:00
Daniel James
31af87e6ae Tribool: add a redirect to the docs.
[SVN r71603]
2011-04-29 11:03:48 +00:00
Daniel James
5ad06c7370 Logic: merge old warning fixes.
- [53429] Fix `gcc -Wshadow` warnings. Fixes #3093.
- [58007] Remove unused parameter. Fixes #3600.


[SVN r70520]
2011-03-24 20:55:46 +00:00
Daniel James
c053ade60f Merge documentation fixes.
* Use `doc/src/*.css` instead of `doc/html/*.css`.
* Remove wiki and people directories.
* Some documentation fixes.
* Left out `minimal.css` changes and boostbook changes because of clashes.


[SVN r63347]
2010-06-26 12:30:09 +00:00
Daniel James
9c4577cce3 Detab some jamfiles.
[SVN r63343]
2010-06-26 12:10:47 +00:00
Daniel James
9e230b17ef Update various libraries' documentation build.
Mostly to use the images and css files under doc/src instead of
doc/html, usually be deleting the settings in order to use the defaults.
Also add 'boost.root' to some builds in order to fix links which rely on
it.

[SVN r63146]
2010-06-20 18:00:48 +00:00
Jeremiah Willcock
62e9529e09 Removed unused parameter; fixes #3600
[SVN r58007]
2009-11-28 17:05:54 +00:00
Troy D. Straszheim
6c6cc7dce3 rm cmake from trunk. I'm not entirely sure this is necessary to satisfy the inspect script, but I'm not taking any chances, and it is easy to put back
[SVN r56942]
2009-10-17 02:07:38 +00:00
Troy D. Straszheim
b86917fe43 rm cmake from the release branch before it goes out broken. Policy dictates that you never commit to release, you commit to trunk and merge to release.
[SVN r56941]
2009-10-17 01:10:45 +00:00
John Maddock
987080a8c7 Fix up logic and date_time Jamfiles so they build needed dependencies.
Fix PDF image paths in fusion Jamfile.v2.
Add fusion to the PDF build.

[SVN r55757]
2009-08-24 10:31:43 +00:00
Daniel James
5aaba307a6 Add depencies on doxygen documentation to standalone documentation targets.
This seems to be needed for building pdfs.

[SVN r55729]
2009-08-23 10:07:25 +00:00
Troy D. Straszheim
a582587b22 Copyrights on CMakeLists.txt to keep them from clogging up the inspect
reports.  This is essentially the same commit as r55095 on the release
branch.



[SVN r55159]
2009-07-26 00:49:56 +00:00
Troy D. Straszheim
bd737d03b0 Add basic copyright/license to keep cmake out of the inspection report
[SVN r55095]
2009-07-22 21:51:01 +00:00
Vladimir Prus
246d1ee6df Fix gcc -Wshadow warnings in tribool.
Fixes #3093. 1/2 of the patch provided by Dustin Spicuzza.


[SVN r53429]
2009-05-30 06:36:18 +00:00
John Maddock
58cd700623 Merge PDF build changes from Trunk.
[SVN r51417]
2009-02-23 18:39:32 +00:00
John Maddock
233cfca75c Add PDF generation options to fix external links to point to the web site.
Added a few more Boostbook based libs that were missed first time around.
Fixed PDF naming issues.

[SVN r51284]
2009-02-17 10:05:58 +00:00
Troy D. Straszheim
951486c794 merge of cmake build files from trunk per beman
[SVN r50756]
2009-01-24 18:57:20 +00:00
Michael A. Jackson
44aa483237 Updating dependency information for modularized libraries.
[SVN r49628]
2008-11-07 17:05:27 +00:00
Michael A. Jackson
84313760a5 Updating CMake files to latest trunk. Added dependency information for regression tests and a few new macros for internal use.
[SVN r49627]
2008-11-07 17:02:56 +00:00
Michael A. Jackson
9df9f3daf6 Continuing merge of CMake build system files into trunk with the encouragement of Doug Gregor
[SVN r49510]
2008-11-01 13:15:41 +00:00
Douglas Gregor
f1d8f513bf Merged from trunk
[SVN r42973]
2008-01-25 21:18:27 +00:00
Douglas Gregor
24117db3ae Include <ios> to get std::boolalpha. Fixes #1586
[SVN r42972]
2008-01-25 21:07:14 +00:00
Beman Dawes
9db33f9dcf Full merge from trunk at revision 41356 of entire boost-root tree.
[SVN r41370]
2007-11-25 18:38:02 +00:00
Beman Dawes
02caed268b Full merge from trunk at revision 41356 of entire boost-root tree.
[SVN r41369]
2007-11-25 18:07:19 +00:00
Douglas Gregor
15b34d0bf4 Fix warnings from GCC 4.3. Fixes #1337
[SVN r40299]
2007-10-22 19:37:05 +00:00
Beman Dawes
5749fb9ef1 Starting point for releases
[SVN r39706]
2007-10-05 14:25:06 +00:00
Vladimir Prus
d1f46c8f98 Remove V1 Jamfiles
[SVN r38516]
2007-08-08 19:02:26 +00:00
nobody
03a2600bf5 This commit was manufactured by cvs2svn to create tag
'Version_1_34_1'.

[SVN r38286]
2007-07-24 19:28:14 +00:00
Eric Niebler
23af176127 fix typo
[SVN r37572]
2007-05-03 03:28:53 +00:00
Eric Niebler
196865d37f fix xincludes of doxygen-generated reference sections
[SVN r37571]
2007-05-03 01:18:48 +00:00
Rene Rivera
9e9489c7bd Remove obsolete Boost.Build v1 files.
[SVN r35880]
2006-11-06 17:10:46 +00:00
nobody
73cce598c7 This commit was manufactured by cvs2svn to create branch 'RC_1_34_0'.
[SVN r33417]
2006-03-21 02:26:31 +00:00
John Maddock
5cf0ef44a7 Large patch from Ulrich Eckhardt to fix support for EVC++ 4.
[SVN r30670]
2005-08-25 16:27:28 +00:00
Douglas Gregor
0a8936b80a Give the enum a name
[SVN r29349]
2005-06-01 19:08:00 +00:00
Vladimir Prus
ea15a9abf6 Add V2 Jamfile
[SVN r28242]
2005-04-14 11:47:45 +00:00
Douglas Gregor
1982b3ee5a Try to make sure indeterminate output works
[SVN r27918]
2005-04-01 22:54:04 +00:00
Douglas Gregor
192433a5e1 Permit output of indeterminate value that isn't converted to a tribool
[SVN r27739]
2005-03-18 20:40:06 +00:00
Stefan Slapeta
796f4a5fa8 Replaced BOOST_TEST
[SVN r27050]
2005-02-03 12:27:14 +00:00
12 changed files with 1092 additions and 191 deletions

View File

@@ -1,3 +1,13 @@
# Tribool library
# Copyright (C) 2002-2003 Douglas Gregor
# Use, modification and distribution is subject to 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)
# For more information, see http://www.boost.org/
project boost-sandbox/utility/doc ;
import boostbook ;
import doxygen ;
@@ -6,4 +16,21 @@ doxygen reference : [ glob ../../../boost/logic/tribool.hpp ]
[ glob ../../../boost/logic/tribool_fwd.hpp ]
[ glob ../../../boost/logic/tribool_io.hpp ]
;
boostbook tribool : tribool.boostbook ;
boostbook tribool
:
tribool.boostbook
:
<xsl:param>boost.root=../../../..
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html
<dependency>reference
;
###############################################################################
alias boostdoc
: tribool/<format>docbook
:
:
: ;
explicit boostdoc ;
alias boostrelease ;
explicit boostrelease ;

View File

@@ -2,7 +2,7 @@
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
<library name="Tribool" dirname="logic" id="tribool"
last-revision="$Date: 2004/07/25 03:01:38 $" xmlns:xi="http://www.w3.org/2001/XInclude">
last-revision="$Date: 2007/05/03 03:28:53 $" xmlns:xi="http://www.w3.org/2001/XInclude">
<libraryinfo>
<author>
<firstname>Douglas</firstname>
@@ -138,6 +138,18 @@ if (<functionname>indeterminate</functionname>(x)) {
else {
// report success or failure of x
}</programlisting>
<para> All the logical operators and methods of <code><classname>tribool</classname></code> are marked
as <code>constexpr</code> in C++11. It means that <code><classname>tribool</classname></code> can
be used in compile time expressions:</para>
<programlisting>constexpr <classname>tribool</classname> x = (tribool(true) || tribool(indeterminate));
<functionname>static_assert</functionname>(x, "Must be true!");
</programlisting>
<note>Some compilers may have troubles with evaluating <code>tribool::operator safe_bool()</code> at compile time.</note>
</section>
<section>
@@ -197,7 +209,7 @@ cout &lt;&lt; boolalpha &lt;&lt; x &lt;&lt; endl; // Prints "maybe"</programlist
</section>
<xi:include href="reference.boostbook"/>
<xi:include href="reference.xml"/>
<testsuite id="tribool.tests">
<run-test filename="tribool_test.cpp">

View File

@@ -0,0 +1,456 @@
// Three-state boolean logic library
// Copyright Douglas Gregor 2002-2004. Use, modification and
// distribution is subject to 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)
// For more information, see http://www.boost.org
#ifndef BOOST_LOGIC_TRIBOOL_HPP
#define BOOST_LOGIC_TRIBOOL_HPP
#include <boost/logic/tribool_fwd.hpp>
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
# pragma once
#endif
namespace boost { namespace logic {
/// INTERNAL ONLY
namespace detail {
/**
* INTERNAL ONLY
*
* \brief A type used only to uniquely identify the 'indeterminate'
* function/keyword.
*/
struct indeterminate_t
{
#if BOOST_WORKAROUND(__BORLANDC__, < 0x0600)
char dummy_; // BCB would use 8 bytes by default
#endif
};
} // end namespace detail
/**
* INTERNAL ONLY
* The type of the 'indeterminate' keyword. This has the same type as the
* function 'indeterminate' so that we can recognize when the keyword is
* used.
*/
typedef bool (*indeterminate_keyword_t)(tribool, detail::indeterminate_t);
/**
* \brief Keyword and test function for the indeterminate tribool value
*
* The \c indeterminate function has a dual role. It's first role is
* as a unary function that tells whether the tribool value is in the
* "indeterminate" state. It's second role is as a keyword
* representing the indeterminate (just like "true" and "false"
* represent the true and false states). If you do not like the name
* "indeterminate", and would prefer to use a different name, see the
* macro \c BOOST_TRIBOOL_THIRD_STATE.
*
* \returns <tt>x.value == tribool::indeterminate_value</tt>
* \throws nothrow
*/
BOOST_CONSTEXPR inline bool
indeterminate(tribool x,
detail::indeterminate_t dummy = detail::indeterminate_t()) BOOST_NOEXCEPT;
/**
* \brief A 3-state boolean type.
*
* 3-state boolean values are either true, false, or
* indeterminate.
*/
class tribool
{
private:
/// INTERNAL ONLY
struct dummy {
void nonnull() {};
};
typedef void (dummy::*safe_bool)();
public:
/**
* Construct a new 3-state boolean value with the value 'false'.
*
* \throws nothrow
*/
BOOST_CONSTEXPR tribool() BOOST_NOEXCEPT : value(false_value) {}
/**
* Construct a new 3-state boolean value with the given boolean
* value, which may be \c true or \c false.
*
* \throws nothrow
*/
BOOST_CONSTEXPR tribool(bool initial_value) BOOST_NOEXCEPT : value(initial_value? true_value : false_value) {}
/**
* Construct a new 3-state boolean value with an indeterminate value.
*
* \throws nothrow
*/
BOOST_CONSTEXPR tribool(indeterminate_keyword_t) BOOST_NOEXCEPT : value(indeterminate_value) {}
/**
* Use a 3-state boolean in a boolean context. Will evaluate true in a
* boolean context only when the 3-state boolean is definitely true.
*
* \returns true if the 3-state boolean is true, false otherwise
* \throws nothrow
*/
BOOST_CONSTEXPR operator safe_bool() const BOOST_NOEXCEPT
{
return value == true_value? &dummy::nonnull : 0;
}
/**
* The actual stored value in this 3-state boolean, which may be false, true,
* or indeterminate.
*/
enum value_t { false_value, true_value, indeterminate_value } value;
};
// Check if the given tribool has an indeterminate value. Also doubles as a
// keyword for the 'indeterminate' value
BOOST_CONSTEXPR inline bool indeterminate(tribool x, detail::indeterminate_t) BOOST_NOEXCEPT
{
return x.value == tribool::indeterminate_value;
}
/** @defgroup logical Logical operations
*/
//@{
/**
* \brief Computes the logical negation of a tribool
*
* \returns the logical negation of the tribool, according to the
* table:
* <table border=1>
* <tr>
* <th><center><code>!</code></center></th>
* <th/>
* </tr>
* <tr>
* <th><center>false</center></th>
* <td><center>true</center></td>
* </tr>
* <tr>
* <th><center>true</center></th>
* <td><center>false</center></td>
* </tr>
* <tr>
* <th><center>indeterminate</center></th>
* <td><center>indeterminate</center></td>
* </tr>
* </table>
* \throws nothrow
*/
BOOST_CONSTEXPR inline tribool operator!(tribool x) BOOST_NOEXCEPT
{
return x.value == tribool::false_value? tribool(true)
:x.value == tribool::true_value? tribool(false)
:tribool(indeterminate);
}
/**
* \brief Computes the logical conjuction of two tribools
*
* \returns the result of logically ANDing the two tribool values,
* according to the following table:
* <table border=1>
* <tr>
* <th><center><code>&amp;&amp;</code></center></th>
* <th><center>false</center></th>
* <th><center>true</center></th>
* <th><center>indeterminate</center></th>
* </tr>
* <tr>
* <th><center>false</center></th>
* <td><center>false</center></td>
* <td><center>false</center></td>
* <td><center>false</center></td>
* </tr>
* <tr>
* <th><center>true</center></th>
* <td><center>false</center></td>
* <td><center>true</center></td>
* <td><center>indeterminate</center></td>
* </tr>
* <tr>
* <th><center>indeterminate</center></th>
* <td><center>false</center></td>
* <td><center>indeterminate</center></td>
* <td><center>indeterminate</center></td>
* </tr>
* </table>
* \throws nothrow
*/
BOOST_CONSTEXPR inline tribool operator&&(tribool x, tribool y) BOOST_NOEXCEPT
{
return (static_cast<bool>(!x) || static_cast<bool>(!y))
? tribool(false)
: ((static_cast<bool>(x) && static_cast<bool>(y)) ? tribool(true) : indeterminate)
;
}
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator&&(tribool x, bool y) BOOST_NOEXCEPT
{ return y? x : tribool(false); }
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator&&(bool x, tribool y) BOOST_NOEXCEPT
{ return x? y : tribool(false); }
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator&&(indeterminate_keyword_t, tribool x) BOOST_NOEXCEPT
{ return !x? tribool(false) : tribool(indeterminate); }
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator&&(tribool x, indeterminate_keyword_t) BOOST_NOEXCEPT
{ return !x? tribool(false) : tribool(indeterminate); }
/**
* \brief Computes the logical disjunction of two tribools
*
* \returns the result of logically ORing the two tribool values,
* according to the following table:
* <table border=1>
* <tr>
* <th><center><code>||</code></center></th>
* <th><center>false</center></th>
* <th><center>true</center></th>
* <th><center>indeterminate</center></th>
* </tr>
* <tr>
* <th><center>false</center></th>
* <td><center>false</center></td>
* <td><center>true</center></td>
* <td><center>indeterminate</center></td>
* </tr>
* <tr>
* <th><center>true</center></th>
* <td><center>true</center></td>
* <td><center>true</center></td>
* <td><center>true</center></td>
* </tr>
* <tr>
* <th><center>indeterminate</center></th>
* <td><center>indeterminate</center></td>
* <td><center>true</center></td>
* <td><center>indeterminate</center></td>
* </tr>
* </table>
* \throws nothrow
*/
BOOST_CONSTEXPR inline tribool operator||(tribool x, tribool y) BOOST_NOEXCEPT
{
return (static_cast<bool>(!x) && static_cast<bool>(!y))
? tribool(false)
: ((static_cast<bool>(x) || static_cast<bool>(y)) ? tribool(true) : tribool(indeterminate))
;
}
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator||(tribool x, bool y) BOOST_NOEXCEPT
{ return y? tribool(true) : x; }
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator||(bool x, tribool y) BOOST_NOEXCEPT
{ return x? tribool(true) : y; }
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator||(indeterminate_keyword_t, tribool x) BOOST_NOEXCEPT
{ return x? tribool(true) : tribool(indeterminate); }
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator||(tribool x, indeterminate_keyword_t) BOOST_NOEXCEPT
{ return x? tribool(true) : tribool(indeterminate); }
//@}
/**
* \brief Compare tribools for equality
*
* \returns the result of comparing two tribool values, according to
* the following table:
* <table border=1>
* <tr>
* <th><center><code>==</code></center></th>
* <th><center>false</center></th>
* <th><center>true</center></th>
* <th><center>indeterminate</center></th>
* </tr>
* <tr>
* <th><center>false</center></th>
* <td><center>true</center></td>
* <td><center>false</center></td>
* <td><center>indeterminate</center></td>
* </tr>
* <tr>
* <th><center>true</center></th>
* <td><center>false</center></td>
* <td><center>true</center></td>
* <td><center>indeterminate</center></td>
* </tr>
* <tr>
* <th><center>indeterminate</center></th>
* <td><center>indeterminate</center></td>
* <td><center>indeterminate</center></td>
* <td><center>indeterminate</center></td>
* </tr>
* </table>
* \throws nothrow
*/
BOOST_CONSTEXPR inline tribool operator==(tribool x, tribool y) BOOST_NOEXCEPT
{
return (indeterminate(x) || indeterminate(y))
? indeterminate
: ((x && y) || (!x && !y))
;
}
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator==(tribool x, bool y) BOOST_NOEXCEPT { return x == tribool(y); }
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator==(bool x, tribool y) BOOST_NOEXCEPT { return tribool(x) == y; }
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator==(indeterminate_keyword_t, tribool x) BOOST_NOEXCEPT
{ return tribool(indeterminate) == x; }
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator==(tribool x, indeterminate_keyword_t) BOOST_NOEXCEPT
{ return tribool(indeterminate) == x; }
/**
* \brief Compare tribools for inequality
*
* \returns the result of comparing two tribool values for inequality,
* according to the following table:
* <table border=1>
* <tr>
* <th><center><code>!=</code></center></th>
* <th><center>false</center></th>
* <th><center>true</center></th>
* <th><center>indeterminate</center></th>
* </tr>
* <tr>
* <th><center>false</center></th>
* <td><center>false</center></td>
* <td><center>true</center></td>
* <td><center>indeterminate</center></td>
* </tr>
* <tr>
* <th><center>true</center></th>
* <td><center>true</center></td>
* <td><center>false</center></td>
* <td><center>indeterminate</center></td>
* </tr>
* <tr>
* <th><center>indeterminate</center></th>
* <td><center>indeterminate</center></td>
* <td><center>indeterminate</center></td>
* <td><center>indeterminate</center></td>
* </tr>
* </table>
* \throws nothrow
*/
BOOST_CONSTEXPR inline tribool operator!=(tribool x, tribool y) BOOST_NOEXCEPT
{
return (indeterminate(x) || indeterminate(y))
? indeterminate
: !((x && y) || (!x && !y))
;
}
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator!=(tribool x, bool y) BOOST_NOEXCEPT { return x != tribool(y); }
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator!=(bool x, tribool y) BOOST_NOEXCEPT { return tribool(x) != y; }
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator!=(indeterminate_keyword_t, tribool x) BOOST_NOEXCEPT
{ return tribool(indeterminate) != x; }
/**
* \overload
*/
BOOST_CONSTEXPR inline tribool operator!=(tribool x, indeterminate_keyword_t) BOOST_NOEXCEPT
{ return x != tribool(indeterminate); }
} } // end namespace boost::logic
// Pull tribool and indeterminate into namespace "boost"
namespace boost {
using logic::tribool;
using logic::indeterminate;
}
/**
* \brief Declare a new name for the third state of a tribool
*
* Use this macro to declare a new name for the third state of a
* tribool. This state can have any number of new names (in addition
* to \c indeterminate), all of which will be equivalent. The new name will be
* placed in the namespace in which the macro is expanded.
*
* Example:
* BOOST_TRIBOOL_THIRD_STATE(true_or_false)
*
* tribool x(true_or_false);
* // potentially set x
* if (true_or_false(x)) {
* // don't know what x is
* }
*/
#define BOOST_TRIBOOL_THIRD_STATE(Name) \
inline bool \
Name(boost::logic::tribool x, \
boost::logic::detail::indeterminate_t = \
boost::logic::detail::indeterminate_t()) \
{ return x.value == boost::logic::tribool::indeterminate_value; }
#endif // BOOST_LOGIC_TRIBOOL_HPP

View File

@@ -0,0 +1,15 @@
// Three-state boolean logic library
// Copyright Douglas Gregor 2002-2004. Use, modification and
// distribution is subject to 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)
// For more information, see http://www.boost.org
#ifndef BOOST_LOGIC_TRIBOOL_FWD_HPP
#define BOOST_LOGIC_TRIBOOL_FWD_HPP
namespace boost { namespace logic { class tribool; } }
#endif // BOOST_LOGIC_TRIBOOL_FWD_HPP

View File

@@ -0,0 +1,343 @@
// Three-state boolean logic library
// Copyright Douglas Gregor 2002-2004. Use, modification and
// distribution is subject to 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)
#ifndef BOOST_LOGIC_TRIBOOL_IO_HPP
#define BOOST_LOGIC_TRIBOOL_IO_HPP
#include <boost/logic/tribool.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/noncopyable.hpp>
#if defined(_MSC_VER)
# pragma once
#endif
#ifndef BOOST_NO_STD_LOCALE
# include <locale>
#endif
#include <string>
#include <iostream>
namespace boost { namespace logic {
#ifdef BOOST_NO_STD_LOCALE
/**
* \brief Returns a string containing the default name for the \c
* false value of a tribool with the given character type T.
*
* This function only exists when the C++ standard library
* implementation does not support locales.
*/
template<typename T> std::basic_string<T> default_false_name();
/**
* \brief Returns the character string "false".
*
* This function only exists when the C++ standard library
* implementation does not support locales.
*/
template<>
inline std::basic_string<char> default_false_name<char>()
{ return "false"; }
# ifndef BOOST_NO_WCHAR_T
/**
* \brief Returns the wide character string L"false".
*
* This function only exists when the C++ standard library
* implementation does not support locales.
*/
template<>
inline std::basic_string<wchar_t> default_false_name<wchar_t>()
{ return L"false"; }
# endif
/**
* \brief Returns a string containing the default name for the \c true
* value of a tribool with the given character type T.
*
* This function only exists when the C++ standard library
* implementation does not support locales.
*/
template<typename T> std::basic_string<T> default_true_name();
/**
* \brief Returns the character string "true".
*
* This function only exists when the C++ standard library
* implementation does not support locales.
*/
template<>
inline std::basic_string<char> default_true_name<char>()
{ return "true"; }
# ifndef BOOST_NO_WCHAR_T
/**
* \brief Returns the wide character string L"true".
*
* This function only exists * when the C++ standard library
* implementation does not support * locales.
*/
template<>
inline std::basic_string<wchar_t> default_true_name<wchar_t>()
{ return L"true"; }
# endif
#endif
/**
* \brief Returns a string containing the default name for the indeterminate
* value of a tribool with the given character type T.
*
* This routine is used by the input and output streaming operators
* for tribool when there is no locale support or the stream's locale
* does not contain the indeterminate_name facet.
*/
template<typename T> std::basic_string<T> get_default_indeterminate_name();
/// Returns the character string "indeterminate".
template<>
inline std::basic_string<char> get_default_indeterminate_name<char>()
{ return "indeterminate"; }
#ifndef BOOST_NO_WCHAR_T
/// Returns the wide character string L"indeterminate".
template<>
inline std::basic_string<wchar_t> get_default_indeterminate_name<wchar_t>()
{ return L"indeterminate"; }
#endif
// http://www.cantrip.org/locale.html
#ifndef BOOST_NO_STD_LOCALE
/**
* \brief A locale facet specifying the name of the indeterminate
* value of a tribool.
*
* The facet is used to perform I/O on tribool values when \c
* std::boolalpha has been specified. This class template is only
* available if the C++ standard library implementation supports
* locales.
*/
template<typename CharT>
class indeterminate_name : public std::locale::facet, private boost::noncopyable
{
public:
typedef CharT char_type;
typedef std::basic_string<CharT> string_type;
/// Construct the facet with the default name
indeterminate_name() : name_(get_default_indeterminate_name<CharT>()) {}
/// Construct the facet with the given name for the indeterminate value
explicit indeterminate_name(const string_type& initial_name)
: name_(initial_name) {}
/// Returns the name for the indeterminate value
string_type name() const { return name_; }
/// Uniquily identifies this facet with the locale.
static std::locale::id id;
private:
string_type name_;
};
template<typename CharT> std::locale::id indeterminate_name<CharT>::id;
#endif
/**
* \brief Writes the value of a tribool to a stream.
*
* When the value of @p x is either \c true or \c false, this routine
* is semantically equivalent to:
* \code out << static_cast<bool>(x); \endcode
*
* When @p x has an indeterminate value, it outputs either the integer
* value 2 (if <tt>(out.flags() & std::ios_base::boolalpha) == 0</tt>)
* or the name of the indeterminate value. The name of the
* indeterminate value comes from the indeterminate_name facet (if it
* is defined in the output stream's locale), or from the
* get_default_indeterminate_name function (if it is not defined in the
* locale or if the C++ standard library implementation does not
* support locales).
*
* \returns @p out
*/
template<typename CharT, typename Traits>
inline std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& out, tribool x)
{
if (!indeterminate(x)) {
out << static_cast<bool>(x);
} else {
typename std::basic_ostream<CharT, Traits>::sentry cerberus(out);
if (cerberus) {
if (out.flags() & std::ios_base::boolalpha) {
#ifndef BOOST_NO_STD_LOCALE
if (BOOST_HAS_FACET(indeterminate_name<CharT>, out.getloc())) {
const indeterminate_name<CharT>& facet =
BOOST_USE_FACET(indeterminate_name<CharT>, out.getloc());
out << facet.name();
} else {
out << get_default_indeterminate_name<CharT>();
}
#else
out << get_default_indeterminate_name<CharT>();
#endif
}
else
out << 2;
}
}
return out;
}
/**
* \brief Writes the indeterminate tribool value to a stream.
*
* This routine outputs either the integer
* value 2 (if <tt>(out.flags() & std::ios_base::boolalpha) == 0</tt>)
* or the name of the indeterminate value. The name of the
* indeterminate value comes from the indeterminate_name facet (if it
* is defined in the output stream's locale), or from the
* get_default_indeterminate_name function (if it is not defined in the
* locale or if the C++ standard library implementation does not
* support locales).
*
* \returns @p out
*/
template<typename CharT, typename Traits>
inline std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& out,
bool (*)(tribool, detail::indeterminate_t))
{ return out << tribool(indeterminate); }
/**
* \brief Reads a tribool value from a stream.
*
* When <tt>(out.flags() & std::ios_base::boolalpha) == 0</tt>, this
* function reads a \c long value from the input stream @p in and
* converts that value to a tribool. If that value is 0, @p x becomes
* \c false; if it is 1, @p x becomes \c true; if it is 2, @p becomes
* \c indetermine; otherwise, the operation fails (and the fail bit is
* set on the input stream @p in).
*
* When <tt>(out.flags() & std::ios_base::boolalpha) != 0</tt>, this
* function first determines the names of the false, true, and
* indeterminate values. The false and true names are extracted from
* the \c std::numpunct facet of the input stream's locale (if the C++
* standard library implementation supports locales), or from the \c
* default_false_name and \c default_true_name functions (if there is
* no locale support). The indeterminate name is extracted from the
* appropriate \c indeterminate_name facet (if it is available in the
* input stream's locale), or from the \c get_default_indeterminate_name
* function (if the C++ standard library implementation does not
* support locales, or the \c indeterminate_name facet is not
* specified for this locale object). The input is then matched to
* each of these names, and the tribool @p x is assigned the value
* corresponding to the longest name that matched. If no name is
* matched or all names are empty, the operation fails (and the fail
* bit is set on the input stream @p in).
*
* \returns @p in
*/
template<typename CharT, typename Traits>
inline std::basic_istream<CharT, Traits>&
operator>>(std::basic_istream<CharT, Traits>& in, tribool& x)
{
if (in.flags() & std::ios_base::boolalpha) {
typename std::basic_istream<CharT, Traits>::sentry cerberus(in);
if (cerberus) {
typedef std::basic_string<CharT> string_type;
#ifndef BOOST_NO_STD_LOCALE
const std::numpunct<CharT>& numpunct_facet =
BOOST_USE_FACET(std::numpunct<CharT>, in.getloc());
string_type falsename = numpunct_facet.falsename();
string_type truename = numpunct_facet.truename();
string_type othername;
if (BOOST_HAS_FACET(indeterminate_name<CharT>, in.getloc())) {
othername =
BOOST_USE_FACET(indeterminate_name<CharT>, in.getloc()).name();
} else {
othername = get_default_indeterminate_name<CharT>();
}
#else
string_type falsename = default_false_name<CharT>();
string_type truename = default_true_name<CharT>();
string_type othername = get_default_indeterminate_name<CharT>();
#endif
typename string_type::size_type pos = 0;
bool falsename_ok = true, truename_ok = true, othername_ok = true;
// Modeled after the code from Library DR 17
while ((falsename_ok && pos < falsename.size())
|| (truename_ok && pos < truename.size())
|| (othername_ok && pos < othername.size())) {
typename Traits::int_type c = in.get();
if (c == Traits::eof())
return in;
bool matched = false;
if (falsename_ok && pos < falsename.size()) {
if (Traits::eq(Traits::to_char_type(c), falsename[pos]))
matched = true;
else
falsename_ok = false;
}
if (truename_ok && pos < truename.size()) {
if (Traits::eq(Traits::to_char_type(c), truename[pos]))
matched = true;
else
truename_ok = false;
}
if (othername_ok && pos < othername.size()) {
if (Traits::eq(Traits::to_char_type(c), othername[pos]))
matched = true;
else
othername_ok = false;
}
if (matched) { ++pos; }
if (pos > falsename.size()) falsename_ok = false;
if (pos > truename.size()) truename_ok = false;
if (pos > othername.size()) othername_ok = false;
}
if (pos == 0)
in.setstate(std::ios_base::failbit);
else {
if (falsename_ok) x = false;
else if (truename_ok) x = true;
else if (othername_ok) x = indeterminate;
else in.setstate(std::ios_base::failbit);
}
}
} else {
long value;
if (in >> value) {
switch (value) {
case 0: x = false; break;
case 1: x = true; break;
case 2: x = indeterminate; break;
default: in.setstate(std::ios_base::failbit); break;
}
}
}
return in;
}
} } // end namespace boost::logic
#endif // BOOST_LOGIC_TRIBOOL_IO_HPP

16
index.html Normal file
View File

@@ -0,0 +1,16 @@
<!--
Copyright 2011 Daniel James.
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)
-->
<html>
<head>
<meta http-equiv="refresh" content="0; URL=../../doc/html/tribool.html">
</head>
<body>
Automatic redirection failed, please go to
<a href="../../doc/html/tribool.html">../../doc/html/tribool.html</a>
</body>
</html>

15
meta/libraries.json Normal file
View File

@@ -0,0 +1,15 @@
{
"key": "logic/tribool",
"name": "Tribool",
"authors": [
"Doug Gregor"
],
"description": "3-state boolean type library.",
"documentation": "/doc/html/tribool.html",
"category": [
"Miscellaneous"
],
"maintainers": [
"Douglas Gregor <dgregor -at- cs.indiana.edu>"
]
}

View File

@@ -1,35 +0,0 @@
# Tribool library
# Copyright (C) 2002-2003 Douglas Gregor
# Use, modification and distribution is subject to 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)
# For more information, see http://www.boost.org/
# Testing Jamfile autogenerated from XML source
subproject libs/logic/test ;
# bring in rules for testing
SEARCH on testing.jam = $(BOOST_BUILD_PATH) ;
include testing.jam ;
# Make tests run by default.
DEPENDS all : test ;
{
# look in BOOST_ROOT for sources first, just in this Jamfile
local SEARCH_SOURCE = $(BOOST_ROOT) $(SEARCH_SOURCE) ;
test-suite logic
:
[ run libs/logic/test/tribool_test.cpp : : : : ]
[ run libs/logic/test/tribool_rename_test.cpp : : : : ]
[ run libs/logic/test/tribool_io_test.cpp : : : : ]
;
}

17
test/Jamfile.v2 Normal file
View File

@@ -0,0 +1,17 @@
# Tribool library
# Copyright (C) 2002-2003 Douglas Gregor
# Use, modification and distribution is subject to 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)
# For more information, see http://www.boost.org/
test-suite logic :
[ run tribool_test.cpp ]
[ run tribool_rename_test.cpp ]
[ run tribool_io_test.cpp ]
;

View File

@@ -8,6 +8,7 @@
#include <sstream>
#include <string>
#include <iostream>
#include <ios> // for std::boolalpha
#ifndef BOOST_NO_STD_LOCALE
# include <locale>
@@ -27,14 +28,14 @@ int test_main(int, char*[])
x = false;
out << x;
std::cout << "Output false (noboolalpha): " << out.str() << std::endl;
BOOST_TEST(out.str() == "0");
BOOST_CHECK(out.str() == "0");
// Output true (noboolalpha)
out.str(std::string());
x = true;
out << x;
std::cout << "Output true (noboolalpha): " << out.str() << std::endl;
BOOST_TEST(out.str() == "1");
BOOST_CHECK(out.str() == "1");
// Output indeterminate (noboolalpha)
out.str(std::string());
@@ -42,7 +43,14 @@ int test_main(int, char*[])
out << x;
std::cout << "Output indeterminate (noboolalpha): " << out.str()
<< std::endl;
BOOST_TEST(out.str() == "2");
BOOST_CHECK(out.str() == "2");
// Output indeterminate (noboolalpha)
out.str(std::string());
out << indeterminate;
std::cout << "Output indeterminate (noboolalpha): " << out.str()
<< std::endl;
BOOST_CHECK(out.str() == "2");
#ifndef BOOST_NO_STD_LOCALE
const std::numpunct<char>& punct =
@@ -53,7 +61,7 @@ int test_main(int, char*[])
x = false;
out << std::boolalpha << x;
std::cout << "Output false (boolalpha): " << out.str() << std::endl;
BOOST_TEST(out.str() == punct.falsename());
BOOST_CHECK(out.str() == punct.falsename());
// Output true (boolalpha)
out.str(std::string());
@@ -61,7 +69,7 @@ int test_main(int, char*[])
out << std::boolalpha << x;
std::cout << "Output true (boolalpha): " << out.str() << std::endl;
BOOST_TEST(out.str() == punct.truename());
BOOST_CHECK(out.str() == punct.truename());
// Output indeterminate (boolalpha - default name)
out.str(std::string());
@@ -69,7 +77,14 @@ int test_main(int, char*[])
out << std::boolalpha << x;
std::cout << "Output indeterminate (boolalpha - default name): " << out.str()
<< std::endl;
BOOST_TEST(out.str() == "indeterminate");
BOOST_CHECK(out.str() == "indeterminate");
// Output indeterminate (boolalpha - default name)
out.str(std::string());
out << std::boolalpha << indeterminate;
std::cout << "Output indeterminate (boolalpha - default name): " << out.str()
<< std::endl;
BOOST_CHECK(out.str() == "indeterminate");
# if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
// No template constructors, so we can't build the test locale
@@ -82,7 +97,7 @@ int test_main(int, char*[])
out << std::boolalpha << x;
std::cout << "Output indeterminate (boolalpha - \"maybe\"): " << out.str()
<< std::endl;
BOOST_TEST(out.str() == "maybe");
BOOST_CHECK(out.str() == "maybe");
# endif
#endif // ! BOOST_NO_STD_LOCALE
@@ -93,7 +108,7 @@ int test_main(int, char*[])
std::istringstream in("0");
std::cout << "Input \"0\" (checks for false)" << std::endl;
in >> x;
BOOST_TEST(x == false);
BOOST_CHECK(x == false);
}
// Input true (noboolalpha)
@@ -101,7 +116,7 @@ int test_main(int, char*[])
std::istringstream in("1");
std::cout << "Input \"1\" (checks for true)" << std::endl;
in >> x;
BOOST_TEST(x == true);
BOOST_CHECK(x == true);
}
// Input false (noboolalpha)
@@ -109,14 +124,14 @@ int test_main(int, char*[])
std::istringstream in("2");
std::cout << "Input \"2\" (checks for indeterminate)" << std::endl;
in >> x;
BOOST_TEST(indeterminate(x));
BOOST_CHECK(indeterminate(x));
}
// Input bad number (noboolalpha)
{
std::istringstream in("3");
std::cout << "Input \"3\" (checks for failure)" << std::endl;
BOOST_TEST(!(in >> x));
BOOST_CHECK(!(in >> x));
}
// Input false (boolalpha)
@@ -124,7 +139,7 @@ int test_main(int, char*[])
std::istringstream in("false");
std::cout << "Input \"false\" (checks for false)" << std::endl;
in >> std::boolalpha >> x;
BOOST_TEST(x == false);
BOOST_CHECK(x == false);
}
// Input true (boolalpha)
@@ -132,7 +147,7 @@ int test_main(int, char*[])
std::istringstream in("true");
std::cout << "Input \"true\" (checks for true)" << std::endl;
in >> std::boolalpha >> x;
BOOST_TEST(x == true);
BOOST_CHECK(x == true);
}
// Input indeterminate (boolalpha)
@@ -141,7 +156,7 @@ int test_main(int, char*[])
std::cout << "Input \"indeterminate\" (checks for indeterminate)"
<< std::endl;
in >> std::boolalpha >> x;
BOOST_TEST(indeterminate(x));
BOOST_CHECK(indeterminate(x));
}
// Input bad string (boolalpha)
@@ -149,7 +164,7 @@ int test_main(int, char*[])
std::istringstream in("bad");
std::cout << "Input \"bad\" (checks for failure)"
<< std::endl;
BOOST_TEST(!(in >> std::boolalpha >> x));
BOOST_CHECK(!(in >> std::boolalpha >> x));
}
#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
@@ -163,7 +178,7 @@ int test_main(int, char*[])
std::cout << "Input \"maybe\" (checks for indeterminate, uses locales)"
<< std::endl;
in >> std::boolalpha >> x;
BOOST_TEST(indeterminate(x));
BOOST_CHECK(indeterminate(x));
}
// Input indeterminate named "true_or_false" (boolalpha)
@@ -175,7 +190,7 @@ int test_main(int, char*[])
std::cout << "Input \"true_or_false\" (checks for indeterminate)"
<< std::endl;
in >> std::boolalpha >> x;
BOOST_TEST(indeterminate(x));
BOOST_CHECK(indeterminate(x));
}
#endif

View File

@@ -19,103 +19,103 @@ int test_main(int,char*[])
tribool y(true); // true
tribool z(maybe); // maybe
BOOST_TEST(!x);
BOOST_TEST(x == false);
BOOST_TEST(false == x);
BOOST_TEST(x != true);
BOOST_TEST(true != x);
BOOST_TEST(maybe(x == maybe));
BOOST_TEST(maybe(maybe == x));
BOOST_TEST(maybe(x != maybe));
BOOST_TEST(maybe(maybe != x));
BOOST_TEST(x == x);
BOOST_TEST(!(x != x));
BOOST_TEST(!(x && true));
BOOST_TEST(!(true && x));
BOOST_TEST(x || true);
BOOST_TEST(true || x);
BOOST_CHECK(!x);
BOOST_CHECK(x == false);
BOOST_CHECK(false == x);
BOOST_CHECK(x != true);
BOOST_CHECK(true != x);
BOOST_CHECK(maybe(x == maybe));
BOOST_CHECK(maybe(maybe == x));
BOOST_CHECK(maybe(x != maybe));
BOOST_CHECK(maybe(maybe != x));
BOOST_CHECK(x == x);
BOOST_CHECK(!(x != x));
BOOST_CHECK(!(x && true));
BOOST_CHECK(!(true && x));
BOOST_CHECK(x || true);
BOOST_CHECK(true || x);
BOOST_TEST(y);
BOOST_TEST(y == true);
BOOST_TEST(true == y);
BOOST_TEST(y != false);
BOOST_TEST(false != y);
BOOST_TEST(maybe(y == maybe));
BOOST_TEST(maybe(maybe == y));
BOOST_TEST(maybe(y != maybe));
BOOST_TEST(maybe(maybe != y));
BOOST_TEST(y == y);
BOOST_TEST(!(y != y));
BOOST_CHECK(y);
BOOST_CHECK(y == true);
BOOST_CHECK(true == y);
BOOST_CHECK(y != false);
BOOST_CHECK(false != y);
BOOST_CHECK(maybe(y == maybe));
BOOST_CHECK(maybe(maybe == y));
BOOST_CHECK(maybe(y != maybe));
BOOST_CHECK(maybe(maybe != y));
BOOST_CHECK(y == y);
BOOST_CHECK(!(y != y));
BOOST_TEST(maybe(z || !z));
BOOST_TEST(maybe(z == true));
BOOST_TEST(maybe(true == z));
BOOST_TEST(maybe(z == false));
BOOST_TEST(maybe(false == z));
BOOST_TEST(maybe(z == maybe));
BOOST_TEST(maybe(maybe == z));
BOOST_TEST(maybe(z != maybe));
BOOST_TEST(maybe(maybe != z));
BOOST_TEST(maybe(z == z));
BOOST_TEST(maybe(z != z));
BOOST_CHECK(maybe(z || !z));
BOOST_CHECK(maybe(z == true));
BOOST_CHECK(maybe(true == z));
BOOST_CHECK(maybe(z == false));
BOOST_CHECK(maybe(false == z));
BOOST_CHECK(maybe(z == maybe));
BOOST_CHECK(maybe(maybe == z));
BOOST_CHECK(maybe(z != maybe));
BOOST_CHECK(maybe(maybe != z));
BOOST_CHECK(maybe(z == z));
BOOST_CHECK(maybe(z != z));
BOOST_TEST(!(x == y));
BOOST_TEST(x != y);
BOOST_TEST(maybe(x == z));
BOOST_TEST(maybe(x != z));
BOOST_TEST(maybe(y == z));
BOOST_TEST(maybe(y != z));
BOOST_CHECK(!(x == y));
BOOST_CHECK(x != y);
BOOST_CHECK(maybe(x == z));
BOOST_CHECK(maybe(x != z));
BOOST_CHECK(maybe(y == z));
BOOST_CHECK(maybe(y != z));
BOOST_TEST(!(x && y));
BOOST_TEST(x || y);
BOOST_TEST(!(x && z));
BOOST_TEST(maybe(y && z));
BOOST_TEST(maybe(z && z));
BOOST_TEST(maybe(z || z));
BOOST_TEST(maybe(x || z));
BOOST_TEST(y || z);
BOOST_CHECK(!(x && y));
BOOST_CHECK(x || y);
BOOST_CHECK(!(x && z));
BOOST_CHECK(maybe(y && z));
BOOST_CHECK(maybe(z && z));
BOOST_CHECK(maybe(z || z));
BOOST_CHECK(maybe(x || z));
BOOST_CHECK(y || z);
BOOST_TEST(maybe(y && maybe));
BOOST_TEST(maybe(maybe && y));
BOOST_TEST(!(x && maybe));
BOOST_TEST(!(maybe && x));
BOOST_CHECK(maybe(y && maybe));
BOOST_CHECK(maybe(maybe && y));
BOOST_CHECK(!(x && maybe));
BOOST_CHECK(!(maybe && x));
BOOST_TEST(maybe || y);
BOOST_TEST(y || maybe);
BOOST_TEST(maybe(x || maybe));
BOOST_TEST(maybe(maybe || x));
BOOST_CHECK(maybe || y);
BOOST_CHECK(y || maybe);
BOOST_CHECK(maybe(x || maybe));
BOOST_CHECK(maybe(maybe || x));
// Test the if (z) ... else (!z) ... else ... idiom
if (z) {
BOOST_TEST(false);
BOOST_CHECK(false);
}
else if (!z) {
BOOST_TEST(false);
BOOST_CHECK(false);
}
else {
BOOST_TEST(true);
BOOST_CHECK(true);
}
z = true;
if (z) {
BOOST_TEST(true);
BOOST_CHECK(true);
}
else if (!z) {
BOOST_TEST(false);
BOOST_CHECK(false);
}
else {
BOOST_TEST(false);
BOOST_CHECK(false);
}
z = false;
if (z) {
BOOST_TEST(false);
BOOST_CHECK(false);
}
else if (!z) {
BOOST_TEST(true);
BOOST_CHECK(true);
}
else {
BOOST_TEST(false);
BOOST_CHECK(false);
}
std::cout << "no errors detected\n";

View File

@@ -15,105 +15,125 @@ int test_main(int, char*[])
tribool y(true); // true
tribool z(indeterminate); // indeterminate
BOOST_TEST(!x);
BOOST_TEST(x == false);
BOOST_TEST(false == x);
BOOST_TEST(x != true);
BOOST_TEST(true != x);
BOOST_TEST(indeterminate(x == indeterminate));
BOOST_TEST(indeterminate(indeterminate == x));
BOOST_TEST(indeterminate(x != indeterminate));
BOOST_TEST(indeterminate(indeterminate != x));
BOOST_TEST(x == x);
BOOST_TEST(!(x != x));
BOOST_TEST(!(x && true));
BOOST_TEST(!(true && x));
BOOST_TEST(x || true);
BOOST_TEST(true || x);
BOOST_CHECK(!x);
BOOST_CHECK(x == false);
BOOST_CHECK(false == x);
BOOST_CHECK(x != true);
BOOST_CHECK(true != x);
BOOST_CHECK(indeterminate(x == indeterminate));
BOOST_CHECK(indeterminate(indeterminate == x));
BOOST_CHECK(indeterminate(x != indeterminate));
BOOST_CHECK(indeterminate(indeterminate != x));
BOOST_CHECK(x == x);
BOOST_CHECK(!(x != x));
BOOST_CHECK(!(x && true));
BOOST_CHECK(!(true && x));
BOOST_CHECK(x || true);
BOOST_CHECK(true || x);
BOOST_TEST(y);
BOOST_TEST(y == true);
BOOST_TEST(true == y);
BOOST_TEST(y != false);
BOOST_TEST(false != y);
BOOST_TEST(indeterminate(y == indeterminate));
BOOST_TEST(indeterminate(indeterminate == y));
BOOST_TEST(indeterminate(y != indeterminate));
BOOST_TEST(indeterminate(indeterminate != y));
BOOST_TEST(y == y);
BOOST_TEST(!(y != y));
BOOST_CHECK(y);
BOOST_CHECK(y == true);
BOOST_CHECK(true == y);
BOOST_CHECK(y != false);
BOOST_CHECK(false != y);
BOOST_CHECK(indeterminate(y == indeterminate));
BOOST_CHECK(indeterminate(indeterminate == y));
BOOST_CHECK(indeterminate(y != indeterminate));
BOOST_CHECK(indeterminate(indeterminate != y));
BOOST_CHECK(y == y);
BOOST_CHECK(!(y != y));
BOOST_TEST(indeterminate(z || !z));
BOOST_TEST(indeterminate(z == true));
BOOST_TEST(indeterminate(true == z));
BOOST_TEST(indeterminate(z == false));
BOOST_TEST(indeterminate(false == z));
BOOST_TEST(indeterminate(z == indeterminate));
BOOST_TEST(indeterminate(indeterminate == z));
BOOST_TEST(indeterminate(z != indeterminate));
BOOST_TEST(indeterminate(indeterminate != z));
BOOST_TEST(indeterminate(z == z));
BOOST_TEST(indeterminate(z != z));
BOOST_CHECK(indeterminate(z || !z));
BOOST_CHECK(indeterminate(z == true));
BOOST_CHECK(indeterminate(true == z));
BOOST_CHECK(indeterminate(z == false));
BOOST_CHECK(indeterminate(false == z));
BOOST_CHECK(indeterminate(z == indeterminate));
BOOST_CHECK(indeterminate(indeterminate == z));
BOOST_CHECK(indeterminate(z != indeterminate));
BOOST_CHECK(indeterminate(indeterminate != z));
BOOST_CHECK(indeterminate(z == z));
BOOST_CHECK(indeterminate(z != z));
BOOST_TEST(!(x == y));
BOOST_TEST(x != y);
BOOST_TEST(indeterminate(x == z));
BOOST_TEST(indeterminate(x != z));
BOOST_TEST(indeterminate(y == z));
BOOST_TEST(indeterminate(y != z));
BOOST_CHECK(!(x == y));
BOOST_CHECK(x != y);
BOOST_CHECK(indeterminate(x == z));
BOOST_CHECK(indeterminate(x != z));
BOOST_CHECK(indeterminate(y == z));
BOOST_CHECK(indeterminate(y != z));
BOOST_TEST(!(x && y));
BOOST_TEST(x || y);
BOOST_TEST(!(x && z));
BOOST_TEST(indeterminate(y && z));
BOOST_TEST(indeterminate(z && z));
BOOST_TEST(indeterminate(z || z));
BOOST_TEST(indeterminate(x || z));
BOOST_TEST(y || z);
BOOST_CHECK(!(x && y));
BOOST_CHECK(x || y);
BOOST_CHECK(!(x && z));
BOOST_CHECK(indeterminate(y && z));
BOOST_CHECK(indeterminate(z && z));
BOOST_CHECK(indeterminate(z || z));
BOOST_CHECK(indeterminate(x || z));
BOOST_CHECK(y || z);
BOOST_TEST(indeterminate(y && indeterminate));
BOOST_TEST(indeterminate(indeterminate && y));
BOOST_TEST(!(x && indeterminate));
BOOST_TEST(!(indeterminate && x));
BOOST_CHECK(indeterminate(y && indeterminate));
BOOST_CHECK(indeterminate(indeterminate && y));
BOOST_CHECK(!(x && indeterminate));
BOOST_CHECK(!(indeterminate && x));
BOOST_TEST(indeterminate || y);
BOOST_TEST(y || indeterminate);
BOOST_TEST(indeterminate(x || indeterminate));
BOOST_TEST(indeterminate(indeterminate || x));
BOOST_CHECK(indeterminate || y);
BOOST_CHECK(y || indeterminate);
BOOST_CHECK(indeterminate(x || indeterminate));
BOOST_CHECK(indeterminate(indeterminate || x));
// Test the if (z) ... else (!z) ... else ... idiom
if (z) {
BOOST_TEST(false);
BOOST_CHECK(false);
}
else if (!z) {
BOOST_TEST(false);
BOOST_CHECK(false);
}
else {
BOOST_TEST(true);
BOOST_CHECK(true);
}
z = true;
if (z) {
BOOST_TEST(true);
BOOST_CHECK(true);
}
else if (!z) {
BOOST_TEST(false);
BOOST_CHECK(false);
}
else {
BOOST_TEST(false);
BOOST_CHECK(false);
}
z = false;
if (z) {
BOOST_TEST(false);
BOOST_CHECK(false);
}
else if (!z) {
BOOST_TEST(true);
BOOST_CHECK(true);
}
else {
BOOST_TEST(false);
BOOST_CHECK(false);
}
#ifndef BOOST_NO_CXX11_CONSTEXPR
constexpr bool res_ors = indeterminate(false || tribool(false) || false || indeterminate); // true
BOOST_CHECK(res_ors);
char array_ors[res_ors ? 2 : 3];
BOOST_CHECK(sizeof(array_ors) / sizeof(char) == 2);
constexpr bool res_ands = !indeterminate(!(true && tribool(true) && true && indeterminate)); // false
BOOST_CHECK(!res_ands);
char array_ands[res_ands ? 2 : 3];
BOOST_CHECK(sizeof(array_ands) / sizeof(char) == 3);
// We avoid checking the tribool::operator safe_bool(),
// because GCC-4.8 fails to evaluate it at compile-time.
// Clang compiles well.
//
// constexpr bool res_safe_bool = tribool(true); // false
// constexpr tribool xxx = (tribool(true) || tribool(indeterminate));
// static_assert(xxx, "Must be true!");
#endif
std::cout << "no errors detected\n";
return 0;
}