The class called bool3 implements a three-valued boolean: the
possible values represent the notions false, uncertain and
true. A variable of type bool3 has a default initial value of
uncertain. To avoid problems with reserved words the three truth
values are actually called:
true3 |
false3 |
uncertain3 |
bool3() -- is the same as uncertain3
bool3(true) -- is the same as true3
bool3(false) -- is the same as false3
To convert a normal bool to a bool3 value, you must call
the ctor explicitly.
For convenience, a variable of type bool3 may be assigned a C++
bool value (e.g. bool3 b3 = true;) in which case true
maps to true3 and false to false3.
There are three functions for testing the value of a bool3 expression:
(note that these functions return a C++ bool value)
IsTrue3(expr) -- true iff expr is true3
IsFalse3(expr) -- true iff expr is false3
IsUncertain3(expr) -- true iff expr is uncertain3
These functions are the only way of "converting" a bool3 to a
standard C++ bool value -- there is no automatic conversion from a
bool3 value to a standard C++ bool.
There are no arithmetic operations on bool3 values. There is
also no equality test.
bool3 values may be printed in the usual way. The printed forms are:
true3 and false3 and uncertain3.
The implementation is very simple. The only point to watch is that the
order of the constants in the enum TruthValueSet was chosen to allow a
simple implementation of the function cmp (which is currently removed;
see Bugs and Shortcomings below). If you change the order, you will
have to change the definition of cmp.
All functions/operations are implemented inline except for I/O. I have avoided const-ref arguments since it is surely cheaper simply to copy the enum value.
I made the bool3 ctor from bool explicit; if conversion from
bool to bool3 is automatic then machine integer values match
bool3 as well as they match MachineInt -- be careful.
Boolean arithmetic operations are not defined since we have not needed them so far. It would be a simple matter, but I prefer to wait until there is a real need for such operations.
There was also a function cmp for comparing two bool3 values:
cmp(b1, b2) returns an int <0, =0 or >0 according as b1 <,=,> b2
(assuming this ordering: false3 < uncertain3 < true3)
> friend int cmp(bool3 lhs, bool3 rhs); // must be friend function
> inline int cmp(bool3 lhs, bool3 rhs)
> {
> return lhs.myTruthValue - rhs.myTruthValue;
> }
I do feel quite uneasy about disagreeing with BOOST's tribool design, but
their example of a three-way if statement looks to me to be a recipe for
programmer grief -- one has to suppress the law of the excluded middle to
read their code without finding it odd and surprising.