Boost logo

Boost :

From: Jonathan Turkanis (technews_at_[hidden])
Date: 2004-05-29 23:41:07


"Thomas Witt" <witt_at_[hidden]> wrote in message
news:c8g56a$hsh$1_at_sea.gmane.org...
>
> The review of Douglas Gregor's Tribool library begins now and runs
> through Saturday, May 29.

Here is my review:

I vote for acceptance, with or without the changes I will suggest.

I am fairly knowledgable about the problem domain, and spent about an
hour reading the documentation, looking at the source and
experimenting with the library a bit on VC7.1. The only problem I
encountered has already been pointed out
(boost/utility/noncopyable.hpp)

I think the library is elegantly designed and fills and important
need.

In the rest of this review I will discuss a possible generalization of
the library.

-------------------------------------------------------------------

There are a number of different 3-valued logics which have been
considered in the theoretical literature. The proposed library
implements Kleene's 'strong' 3-valued logic, in which the third value
represents an unknown value. There is also Kleene's 'weak' 3-valued
logic, in which applying any boolean operation to a set of arguments
which contains the third value results in the third value. Other
3-valued logics have been introduced for various purposes.

And of course, as others mentioned, there are interesting boolean
logics with more than three values.

So it seems natural to make tribool a template -- I suggest calling it
'boolean' . Here is a possible synopsis:

   namespace boost { namespace logic {

      template<typename TT> // 'truth-table'
      class boolean {
      public:
         ....
      private:
         // Make the boolean operations friends
         int value_;
      };

      // boolean operations
      ...

      // Used to declare a named value:
     #define BOOST_BOOLEAN_VALUE(tt, name, val) ...

     struct kleene_strong; // Models 'Truth Table'
     struct kleene_weak; // Models 'Truth Table'

     typedef boolean<kleene_strong> tribool;
     typedef boolean<kleene_weak> weak_tribool;

     // Declare named values 'indeterminate' (for strong 3-valued
logic)
     // and 'undefined' (for weak 3-valued logic)
     BOOST_BOOLEAN_VALUE(kleene_strong, indeterminate, ...);
     BOOST_BOOLEAN_VALUE(kleene_weak, undefined, ...);

   } } // namespace

A typical truth table type could look like this:

    struct kleene_strong {
        static const int size = 3; // Number of truth-values
        static int and_(int, int);
        static int or_(int, int);
        static int not_(int);
        static bool true_(int); // Conversion to bool
        static int eq_(int, int); // operator==
    };

Here boolean values are represented as ints, with 0 representing false
and 1 representing true.

I have attached a sample implementation. I wrote it quickly, so it may
contain some howlers. I hope the main ideas are clear.

Best Regards,
Jonathan

begin 666 boolean.hpp
M+R\@*$,I($-O<'ER:6=H="!*;VYA=&AA;B!4=7)K86YI<R R,# T+@T*+R\@
M4&5R;6ES<VEO;B!T;R!C;W!Y+"!U<V4L(&UO9&EF>2P@<V5L;"!A;F0_at_9&ES
M=')I8G5T92!T:&ES('-O9G1W87)E#0HO+R!I<R!G<F%N=&5D('!R;W9I9&5D
M('1H:7,@8V]P>7)I9VAT(&YO=&EC92!A<'!E87)S(&EN(&%L;"!C;W!I97,N
M(%1H:7,-"B\O('-O9G1W87)E(&ES('!R;W9I9&5D(")A<R!I<R(@=VET:&]U
M="!E>'!R97-S(&]R(&EM<&QI960@=V%R<F%N='DL(&%N9 T*+R\@=VET:"!N
M;R!C;&%I;2!A<R!T;R!I=',@<W5I=&%B:6QI='D_at_9F]R(&%N>2!P=7)P;W-E
M+@T*#0HC:69N9&5F($)/3U-47TQ/1TE#7T)/3TQ%04Y?2%!07TE.0TQ51$5$
M#0HC9&5F:6YE($)/3U-47TQ/1TE#7T)/3TQ%04Y?2%!07TE.0TQ51$5$#0H-
M"B\O#0HO+R!'96YE<F%L:7IA=&EO;B!O9B!$;W5G;&%S($=R96=O<B=S(%1R
M:6)O;VP@;&EB<F%R>2P@;6EN=7,@:2]O+@T*+R\@#0HO+R!.;W1E<SH@#0HO
M+R @,2X_at_26YS=&5A9"!O9B!R97!R97-E;G1I;F<@=&AE(&EN9&5T97)M:6YA
M=&4@:V5Y=V]R9',@87,@9G5N8W1I;VYS+ T*+R\@(" @("!)(&UA9&4@=&AE
M;2!C;VYS=&%N=',L(&%N9"!A9&1E9"!A9&1I=&EO;F%L(&9U;F-T:6]N<R!I
M<U]X>'@-"B\O(" @(" @=&\@=&5S="!B;V]L96%N('9A;'5E(&9O<B!E<75A
M;&ET>2!W:71H(&%N(&EN9&5T97)M:6YA=&4N(%1H:7,-"B\O(" @(" @:7,@
M8F5C875S92!)(')A;B!I;G1O('1R;W5B;&4@=VET:"!T:&4@:6UP;&5M96YT
M871I;VX_at_86YD(&1I9&XG= T*+R\@(" @("!H879E('1I;64@=&\@9FEX(&ET
M+B Z* T*+R\@(#(N($D@=W)O=&4@=&AI<R!Q=6EC:VQY+"!A;F0@:&%V96XG
M="!T97-T960@:70@;75C:"!S;R!I="!M87D_at_8V]N=&%I;B -"B\O(" @(" @
M<V]M92!H;W=L97)S+B [+2D-"B\O#0H-"@T*(VEN8VQU9&4@/&)O;W-T+V-O
M;F9I9RYH<' ^(" @+R\@0D]/4U1?4U1!5$E#7T-/3E-404Y4+"!"3T]35%]*
M3TE.#0H-"FYA;65S<&%C92!B;V]S="![(&YA;65S<&%C92!L;V=I8R![#0H-
M"B\O#0HO+R!#;&%S<R!N86UE.B!B;V]L96%N#0HO+R!$97-C<FEP=&EO;CH@
M<F5P<F5S96YT<R!A(&=E;F5R86QI>F5D(&)O;VQE86X@='EP90T*+R\@5&5M
M<&QA=&4@<&%R86UE=&5R<SH-"B\O(" @(%14("T@<VAO=6QD(&AA=F4@=&AE
M(&9O<FTZ#0HO+PT*+R\@(" @("!S=')U8W0@='0@>PT*+R\@(" @(" @(" @
M<W1A=&EC(&-O;G-T(&EN="!S:7IE(#T@,SL@("\O($YU;6)E<B!O9B!T<G5T
M:"UV86QU97,-"B\O(" @(" @(" @('-T871I8R!I;G0_at_86YD7RAI;G0L(&EN
M="D[(" -"B\O(" @(" @(" @('-T871I8R!I;G0@;W)?*&EN="P@:6YT*3L-
M"B\O(" @(" @(" @('-T871I8R!I;G0@;F]T7RAI;G0I.PT*+R\@(" @(" @
M(" @<W1A=&EC(&)O;VP@=')U95\H:6YT*3L@+R\@0V]N=F5R<VEO;B!T;R!B
M;V]L#0HO+R @(" @(" @("!S=&%T:6,@:6YT(&5Q7RAI;G0L(&EN="D[(" @
M+R\@;W!E<F%T;W(]/0T*+R\@(" @("!].PT*+R\@($)O;VQE86X@=F%L=65S
M(&%R92!R97!R97-E;G1E9"!A<R!I;G1S+"!W:71H(# @<F5P<F5S96YT:6YG
M(&9A;'-E#0HO+R @86YD(#$@<F5P<F5S96YT:6YG('1R=64N#0HO+PT*=&5M
M<&QA=&4\='EP96YA;64_at_5%0^( T*8VQA<W,@8F]O;&5A;B![#0IP<FEV871E
M._at_T*(" @('-T<G5C="!S869E7V)O;VQ?:&5L<&5R('L@:6YT('@[('T[#0H@
M(" @='EP961E9B!I;G0@<V%F95]B;V]L7VAE;'!E<CHZ*B!S869E7V)O;VP[
M#0IP=6)L:6,Z#0H@(" @8F]O;&5A;B_at_I(#H@=F%L=65?*# I('L@?0T*(" @
M(&)O;VQE86XH8F]O;"!B*2 Z('9A;'5E7RAB*2![('T-"B @("!O<&5R871O
M<B!S869E7V)O;VPH*2!C;VYS=" -"B @("![(')E='5R;B!45#HZ=')U95\H
M=F%L=65?*2 _("9S869E7V)O;VQ?:&5L<&5R.CIX(#H@,#L@?0T*+R]P<FEV
M871E.B!S:&]U;&0_at_9W)A;G0_at_9G)I96YD<VAI<"!T;R!A;&P@=&AE(&]P97)A
M=&EO;G,-"B @("!B;V]L96%N*&EN="!V86QU92P@:6YT("\J9'5M;7DJ+RD@
M.B!V86QU95\H=F%L=64I('L@?0T*(" @(&EN="!V86QU95\[#0I].PT*#0IN
M86UE<W!A8V4_at_9&5T86EL('L-"@T*+R\@1F]R(&1E9FEN:6YG(&YA;65D(&-O
M;G-T86YT<RX-"G1E;7!L871E/'1Y<&5N86UE(%14+"!I;G0_at_3CX@#0IS=')U
M8W0_at_8F]O;&5A;E]V86QU92 Z(&)O;VQE86X\5%0^('L-"B @("!B;V]L96%N
M7W9A;'5E*"D_at_.B!B;V]L96%N/%14/BA.+" P*2![('T-"GT[#0H-"GT@(" @
M(" @(" @(" @(" @(" @+R\@16YD(&YA;65S<&%C92!D971A:6PN#0H-"G1E
M;7!L871E/'1Y<&5N86UE(%14/@T*8F]O;&5A;CQ45#X@;W!E<F%T;W(A*&)O
M;VQE86X\5%0^('@I#0I[(')E='5R;B!B;V]L96%N/%14/BA45#HZ;F]T7RAX
M+G9A;'5E7RDL(# I.R!]#0H-"G1E;7!L871E/'1Y<&5N86UE(%14/@T*8F]O
M;&5A;CQ45#X@;W!E<F%T;W(F)BAB;V]L96%N/%14/B!X+"!B;V]L96%N/%14
M/B!Y*0T*>R!R971U<FX_at_8F]O;&5A;CQ45#XH5%0Z.F%N9%\H>"YV86QU95\L
M('DN=F%L=65?*2P@,"D[('T-"@T*=&5M<&QA=&4\='EP96YA;64_at_5%0^#0IB
M;V]L96%N/%14/B!O<&5R871O<B8F*&)O;VQE86X\5%0^('@L(&)O;VP@>2D-
M"GL@<F5T=7)N(&)O;VQE86X\5%0^*%14.CIA;F1?*'@N=F%L=65?+"!Y*2P@
M,"D[('T-"@T*=&5M<&QA=&4\='EP96YA;64_at_5%0^#0IB;V]L96%N/%14/B!O
M<&5R871O<B8F*&)O;VP@>"P_at_8F]O;&5A;CQ45#X@>2D-"GL@<F5T=7)N(&)O
M;VQE86X\5%0^*%14.CIA;F1?*'@L('DN=F%L=65?*2P@,"D[('T-"@T*=&5M
M<&QA=&4\='EP96YA;64_at_5%0^#0IB;V]L96%N/%14/B!O<&5R871O<GQ\*&)O
M;VQE86X\5%0^('@L(&)O;VQE86X\5%0^('DI#0I[(')E='5R;B!B;V]L96%N
M/%14/BA45#HZ;W)?*'@N=F%L=65?+"!Y+G9A;'5E7RDL(# I.R!]#0H-"G1E
M;7!L871E/'1Y<&5N86UE(%14/@T*8F]O;&5A;CQ45#X@;W!E<F%T;W)\?"AB
M;V]L96%N/%14/B!X+"!B;V]L('DI#0I[(')E='5R;B!B;V]L96%N/%14/BA4
M5#HZ;W)?*'@N=F%L=65?+"!Y*2P@,"D[('T-"@T*=&5M<&QA=&4\='EP96YA
M;64_at_5%0^#0IB;V]L96%N/%14/B!O<&5R871O<GQ\*&)O;VP@>"P_at_8F]O;&5A
M;CQ45#X@>2D-"GL@<F5T=7)N(&)O;VQE86X\5%0^*%14.CIO<E\H>"P@>2YV
M86QU95\I+" P*3L@?0T*#0IT96UP;&%T93QT>7!E;F%M92!45#X-"F)O;VQE
M86X\5%0^(&]P97)A=&]R/3TH8F]O;&5A;CQ45#X@>"P_at_8F]O;&5A;CQ45#X@
M>2D-"GL@<F5T=7)N(&)O;VQE86X\5%0^*%14.CIE<5\H>"YV86QU95\L('DN
M=F%L=65?*2P@,"D[('T-"@T*=&5M<&QA=&4\='EP96YA;64_at_5%0^#0IB;V]L
M96%N/%14/B!O<&5R871O<CT]*&)O;VQE86X\5%0^('@L(&)O;VP@>2D-"GL@
M<F5T=7)N(&)O;VQE86X\5%0^*%14.CIE<5\H>"YV86QU95\L('DI+" P*3L@
M?0T*#0IT96UP;&%T93QT>7!E;F%M92!45#X-"F)O;VQE86X\5%0^(&]P97)A
M=&]R/3TH8F]O;"!X+"!B;V]L96%N/%14/B!Y*0T*>R!R971U<FX_at_8F]O;&5A
M;CQ45#XH5%0Z.F5Q7RAX+"!Y+G9A;'5E7RDL(# I.R!]#0H-"G1E;7!L871E
M/'1Y<&5N86UE(%14/@T*8F]O;&5A;CQ45#X@;W!E<F%T;W(A/2AB;V]L96%N
M/%14/B!X+"!B;V]L96%N/%14/B!Y*0T*>R!R971U<FX_at_8F]O;&5A;CQ45#XH
M5%0Z.FYO=%\H5%0Z.F5Q7RAX+G9A;'5E7RP@>2YV86QU95\I*2P@,"D[('T-
M"@T*=&5M<&QA=&4\='EP96YA;64_at_5%0^#0IB;V]L96%N/%14/B!O<&5R871O
M<B$]*&)O;VQE86X\5%0^('@L(&)O;VP@>2D-"GL@<F5T=7)N(&)O;VQE86X\
M5%0^*%14.CIN;W1?*%14.CIE<5\H>"YV86QU95\L('DI*2P@,"D[('T-"@T*
M=&5M<&QA=&4\='EP96YA;64_at_5%0^#0IB;V]L96%N/%14/B!O<&5R871O<B$]
M*&)O;VP@>"P_at_8F]O;&5A;CQ45#X@>2D-"GL@<F5T=7)N(&)O;VQE86X\5%0^
M*%14.CIN;W1?*%14.CIE<5\H>"P@>2YV86QU95\I*2P@,"D[('T-"@T*(V1E
M9FEN92!"3T]35%]"3T],14%.7U9!3%5%*'1T+"!N86UE+"!V86PI(" @(" @
M(" @(" @(" @(" @(" @7 T*(" @(&-O;G-T(#HZ8F]O<W0Z.FQO9VEC.CID
M971A:6PZ.F)O;VQE86Y?=F%L=64\='0L('9A;#X@;F%M93L_at_7 T*(" @(&)O
M;VP_at_0D]/4U1?2D])3BAI<U\L(&YA;64I("@Z.F)O;W-T.CIL;V=I8SHZ8F]O
M;&5A;CQT=#X@>"D_at_7 T*(" @('L@<F5T=7)N('@N=F%L=65?(#T]('9A;#L@
M?2 @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @7 T*(" @("\J*B\@
M(" @+R\@5FEO;&%T97,@96YC87!S=6QA=&EO;B M+2!A;GD@<W5G9V5S=&EO
M;G,_#0H-"G-T<G5C="!K;&5E;F5?<W1R;VYG('L-"B @("!"3T]35%]35$%4
M24-?0T].4U1!3E0H:6YT+"!S:7IE(#T@,RD[#0H@(" @<W1A=&EC(&EN="!A
M;F1?*&EN="!X+"!I;G0@>2D-"B @(" @(" @>PT*(" @(" @(" @(" @:68@
M*'@@/3T@,"!\?"!Y(#T](# I( T*(" @(" @(" @(" @(" @(')E='5R;B P
M.PT*(" @(" @(" @(" @96QS92!I9B H>" ]/2 Q("8F('D@/3T@,2D@#0H@
M(" @(" @(" @(" @(" @<F5T=7)N(#$[#0H@(" @(" @(" @("!E;'-E#0H@
M(" @(" @(" @(" @(" @<F5T=7)N(#([#0H@(" @(" @('T-"B @("!S=&%T
M:6,@:6YT(&]R7RAI;G0@>"P@:6YT('DI#0H@(" @(" @('L-"B @(" @(" @
M(" @(&EF("AX(#T](#$@?'P@>2 ]/2 Q*2 -"B @(" @(" @(" @(" @("!R
M971U<FX@,3L-"B @(" @(" @(" @(&5L<V4@:68@*'@@/3T@," F)B!Y(#T]
M(# I( T*(" @(" @(" @(" @(" @(')E='5R;B P.PT*(" @(" @(" @(" @
M96QS90T*(" @(" @(" @(" @(" @(')E='5R;B R.PT*(" @(" @("!]#0H@
M(" @<W1A=&EC(&EN="!N;W1?*&EN="!X*0T*(" @(" @("![#0H@(" @(" @
M(" @("!R971U<FX@>" ]/2 Q(#\@," Z('@@/3T@," _(#$@.B R.PT*(" @
M(" @("!]#0H@(" @<W1A=&EC(&)O;VP@=')U95\H:6YT('@I('L@<F5T=7)N
M('@@/3T@,3L@?0T*(" @('-T871I8R!I;G0_at_97%?*&EN="!X+"!I;G0@>2D-
M"B @("![(')E='5R;B H>" ]/2 R('Q\('D@/3T@,BD@/R R(#H@>" ]/2!Y
M.R!]#0I].PT*#0IS=')U8W0@:VQE96YE7W=E86L@>PT*(" @($)/3U-47U-4
M051)0U]#3TY35$%.5"AI;G0L('-I>F4@/2 S*3L-"B @("!S=&%T:6,@:6YT
M(&%N9%\H:6YT('@L(&EN="!Y*0T*(" @(" @("![#0H@(" @(" @(" @("!R
M971U<FX@*'@@/3T@,B!\?"!Y(#T](#(I(#\-"B @(" @(" @(" @(" @(" R
M(#H-"B @(" @(" @(" @(" @("!X("8F('D[#0H@(" @(" @('T-"B @("!S
M=&%T:6,@:6YT(&]R7RAI;G0@>"P@:6YT('DI#0H@(" @(" @('L-"B @(" @
M(" @(" @(')E='5R;B H>" ]/2 R('Q\('D@/3T@,BD@/PT*(" @(" @(" @
M(" @(" @(#(@._at_T*(" @(" @(" @(" @(" @('@@?'P@>3L-"B @(" @(" @
M?0T*(" @('-T871I8R!I;G0@;F]T7RAI;G0@>"D@>R!R971U<FX@('@@/3T@
M,B _(#(@.B A>#L@?0T*(" @('-T871I8R!B;V]L('1R=65?*&EN="!X*2![
M(')E='5R;B!X(#T](#$[('T-"B @("!S=&%T:6,@:6YT(&5Q7RAI;G0@>"P@
M:6YT('DI('L@<F5T=7)N('@@/3T@>3L@?0T*?3L-"@T*='EP961E9B!B;V]L
M96%N/&ML965N95]S=')O;F<^("!T<FEB;V]L.PT*='EP961E9B!B;V]L96%N
M/&ML965N95]W96%K/B @("!W96%K7W1R:6)O;VP[#0H-"D)/3U-47T)/3TQ%
M04Y?5D%,544H:VQE96YE7W-T<F]N9RP@:6YD971E<FUI;F%T92P@,BD-"D)/
M3U-47T)/3TQ%04Y?5D%,544H:VQE96YE7W=E86LL('5N9&5F:6YE9"P@,BD-
M"B @(" @(" @(" -"GT@?2 @(" @(" @(" @(" @(" @+R\@16YD(&YA;65S
M<&%C97,@;&]G:6,L(&)O;W-T+@T*#0HC96YD:68@+R\@(VEF;F1E9B!"3T]3
>5%],3T=)0U]"3T],14%.7TA04%])3D-,541%1 T*
`
end


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk