Boost logo

Boost :

From: Pavel Vozenilek (pavel_vozenilek_at_[hidden])
Date: 2004-01-11 07:43:59


This is submission of is_abstract_class<> type trait
into Boost.TypeTraits.

Reasons for submission:
  - it will offload Serialization library a bit (it is currently here)
  - Giovanni Bajo added support for it (for DR 337) into GCC 3.4

The code and documentation is TypeTraits compatible.
It was tested with Intel 7.0 and 8.0.

The idea comes from Rani Sharoni,
Robert Ramey wrote current implementaton.

/Pavel

____________________________________________________
Changes needed in Boost:

1. file is_abstract_class.hpp is put into
   boost/type_traits/

2. boost/type_traits.hpp, following line is added
   at the end:

#include "boost/type_traits/is_abstract_class.hpp"

3. libs/type_traits/index.html:

   Table "Secondary Type Categorisation" will be appended
   with text (no fancy formatting here):

<tr>
  <td>
      ::boost::is_abstract_class<T>::value
  </td>

  <td>
      Evaluates true only if T is abstract class.
  </td>

  <td>
      10.4
  </td>

  <td>
      Compiler must support DR337 (as Jan 2004: GCC 3.4,
      VC++ 7.1, Intel C++ 7, Comeau 4.3.2).
  </td>
</tr>

4. file is_abstract_class_test.cpp is put into
   libs/type_traits/

5. Jamfile here gets updated.

____________________________________________________
EOF

begin 666 is_abstract_class.hpp
M(VEF;F1E9B!"3T]35%]45%])4U]!0E-44D%#5%]#3$%34U](4% -"B-D969I
M;F4_at_0D]/4U1?5%1?25-?04)35%)!0U1?0TQ!4U-?2%!0#0H-"B-I9B!D969I
M;F5D*%]-4T-?5D52*2 F)B H7TU30U]615(@/CT@,3 R,"D-"B,@<')A9VUA
M(&]N8V4-"B-E;F1I9_at_T*#0HO+R\O+R\O+R\Q+R\O+R\O+R\O,B\O+R\O+R\O
M+S,O+R\O+R\O+R\T+R\O+R\O+R\O-2\O+R\O+R\O+S8O+R\O+R\O+R\W+R\O
M+R\O+R\O. T*+R\@:7-?86)S=')A8W1?8VQA<W,N:'!P._at_T*+R\-"B\O(" H
M0RD_at_0V]P>7)I9VAT(#(P,#(@4F%N:2!3:&%R;VYI("AR86YI7W-H87)O;FE
M:&]T;6%I;"YC;VTI(&%N9"!2;V)E<G0_at_4F%M97D-"B\O("!5<V4L(&UO9&EF
M:6-A=&EO;B!A;F0_at_9&ES=')I8G5T:6]N(&ES('-U8FIE8W0@=&\@=&AE($)O
M;W-T(%-O9G1W87)E#0HO+R @3&EC96YS92P_at_5F5R<VEO;B Q+C N("A3964@
M86-C;VUP86YY:6YG(&9I;&4_at_3$E#14Y315\Q7S N='AT(&]R(&-O<'D_at_870-
M"B\O("!H='1P.B\O=W=W+F)O;W-T+F]R9R],24-%3E-%7S%?,"YT>'0I#0HO
M+R @#0HO+R @4V5E(&AT=' Z+R]W=W<N8F]O<W0N;W)G(&9O<B!U<&1A=&5S
M+"!D;V-U;65N=&%T:6]N+"!A;F0@<F5V:7-I;VX@:&ES=&]R>2X-"B\O#0H-
M"B\O($-O;7!I;&4@='EP92!D:7-C;W9E<GD@=VAE=&AE<B!G:79E;B!T>7!E
M(&ES(&%B<W1R86-T(&-L87-S(&]R(&YO="X-"B\O#0HO+R @(%)E<75I<F5S
M($12(#,S-R!T;R!B92!S=7!P;W)T960_at_8GD@8V]M<&EL97(-"B\O(" @*&AT
M=' Z+R]A;G5B:7,N9&MU=6<N9&LO:G1C,2]S8S(R+W=G,C$O9&]C<R]C=V=?
M86-T:79E+FAT;6PC,S,W*2X-"B\O#0HO+PT*+R\@0F5L:65V960@*$IA;B R
M,# T*2!T;R!W;W)K(&]N._at_T*+R\@("T_at_1T-#(#,N- T*+R\@("T_at_5D,K*R W
M+C$-"B\O(" M(&-O;7!I;&5R<R!W:71H(&YE=R!%1$<@9G)O;G1E;F0@*$EN
M=&5L($,K*R W+"!#;VUE874_at_-"XS+C(I#0HO+PT*+R\@1&]E<VXG="!W;W)K
M(&]N._at_T*+R\@("T_at_5D,K*S8L(%9#*RLW+C @86YD(&QE<W,-"B\O(" M($=#
M0R S+C,N6"!A;F0@;&5S<PT*+R\@("T_at_0F]R;&%N9"!#*RL_at_-B!A;F0@;&5S
M<PT*+R\@(" @(" -"B\O#0HO+R!(:7-T;W)Y._at_T*+R\@("T_at_3W)I9VEN86QL
M>2!W<FET=&5N(&)Y(%)A;FD_at_4VAA<F]N:2P@<V5E#0HO+R @("!H='1P.B\O
M9W)O=7!S+F=O;V=L92YC;VTO9W)O=7!S/W-E;&T]9&8X.3-D838N,#(P-S$Q
M,#8Q,RXW-6(R9F4Y,"4T,'!O<W1I;F<N9V]O9VQE+F-O;0T*+R\@(" @070@
M=&AI<R!T:6UE('-U<'!O<G1E9"!B>2!%1$<@*$EN=&5L($,K*R W+"!#;VUE
M874_at_-"XS+C(I(&%N9"!60S<N,2X-"B\O(" M($%D87!T960_at_86YD(&%D9&5D
M(&EN=&\@0F]O<W0N4V5R:6%L:7IA=&EO;B!L:6)R87)Y(&)Y(%)O8F5R="!2
M86UE>2 -"B\O(" @("AS=&%R=&EN9R!W:71H('-U8FUI<W-I;VX@(S$P*2X-
M"B\O(" M($IA;B R,# T.B!'0T,@,RXT(&9I>&5D('1O('-U<&]R="!$4C,S
M-R H1VEO=F%N;FD_at_0F%J;RDN#0HO+R @+2!*86X@,C P-#H@;6]D:69I960@
M=&\@8F4@<&%R="!O9B!";V]S="Y4>7!E5')A:71S("A0879E;"!6;WIE;FEL
M96LI+@T*+R\-"@T*(VEN8VQU9&4@/&)O;W-T+V-O;F9I9RYH<' ^#0HC:6YC
M;'5D92 \8F]O<W0O='EP95]T<F%I=',O9&5T86EL+WEE<U]N;U]T>7!E+FAP
M<#X-"B-I;F-L=61E(#QB;V]S="]T>7!E7W1R86ET<R]I<U]C;&%S<RYH<' ^
M#0HC:6YC;'5D92 \8F]O<W0O;7!L+V%N9"YH<' ^#0HC:6YC;'5D92 \8F]O
M<W0O;7!L+V)O;VPN:'!P/@T*#0IN86UE<W!A8V4_at_8F]O<W0@>PT*#0H@(" @
M=&5M<&QA=&4\8VQA<W,@5#X-"B @("!S=')U8W0@:7-?86)S=')A8W1?8VQA
M<W,-"B @("![#0H@(" @(" @("\O($1E9'5C=&EO;B!F86EL<R!I9B!4(&ES
M('9O:60L(&9U;F-T:6]N('1Y<&4L( T*(" @(" @(" O+R!R969E<F5N8V4@
M='EP92 H,30N."XR+S(I;W(@86X_at_86)S=')A8W0_at_8VQA<W,@='EP92 -"B @
M(" @(" @+R\@86-C;W)D:6YG('1O(')E=FEE=R!S=&%T=7,@:7-S=64@(S,S
M-PT*(" @(" @(" O+PT*(" @(" @("!T96UP;&%T93QC;&%S<R!5/@T*(" @
M(" @("!S=&%T:6,@='EP95]T<F%I=',Z.FYO7W1Y<&4_at_8VAE8VLH52 H*BE;
M,5TI.PT*(" @(" @("!T96UP;&%T93QC;&%S<R!5/@T*(" @(" @("!S=&%T
M:6,@='EP95]T<F%I=',Z.GEE<U]T>7!E(&-H96-K*"XN+BD[#0H-"B @(" @
M(" @='EP961E9B!M<&PZ.F%N9%\\#0H@(" @(" @(" @("!I<U]C;&%S<SQ4
M/BP-"B @(" @(" @(" @(&UP;#HZ8F]O;%\\<VEZ96]F*&-H96-K/%0^*# I
M*2 ]/2!S:7IE;V8H='EP95]T<F%I=',Z.GEE<U]T>7!E*3X-"B @(" @(" @
M/CHZ='EP92!T>7!E.PT*(" @(" @("!"3T]35%]35$%424-?0T].4U1!3E0H
M8F]O;"P@=F%L=64@/2!T>7!E.CIV86QU92D[#0H@(" @?3L-"@T*?0T*#0HC
H96YD:68@+R]"3T]35%]45%])4U]!0E-44D%#5%]#3$%34U](4% -"@``
`
end

begin 666 is_abstract_class_test.cpp
M#0HO+R @*$,I($-O<'ER:6=H="!*;VAN($UA9&1O8VL@,C P,"X_at_4&5R;6ES
M<VEO;B!T;R!C;W!Y+"!U<V4L(&UO9&EF>2P@<V5L;"!A;F0@(" -"B\O("!D
M:7-T<FEB=71E('1H:7,@<V]F='=A<F4@:7,@9W)A;G1E9"!P<F]V:61E9"!T
M:&ES(&-O<'ER:6=H="!N;W1I8V4_at_87!P96%R<PT*+R\@(&EN(&%L;"!C;W!I
M97,N(%1H:7,@<V]F='=A<F4@:7,@<')O=FED960@(F%S(&ES(B!W:71H;W5T
M(&5X<')E<W,@;W(@:6UP;&EE9 T*+R\@('=A<G)A;G1Y+"!A;F0@=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*+R\-"B\O(%9E<G-I;VX_at_9F]R(&ES7V%B<W1R86-T7V-L87-S('=R:71T
M96X_at_8GD@4&%V96P_at_5F]Z96YI;&5K+"!*86X@,C P-"X-"B\O#0H-"B-I;F-L
M=61E(")T97-T+FAP<"(-"B-I;F-L=61E(")C:&5C:U]I;G1E9W)A;%]C;VYS
M=&%N="YH<' B#0HC:6YC;'5D92!465!%7T-/35!!4D4H:7-?86)S=')A8W1?
M8VQA<W,I#0H-"G-T<G5C="!497-T02![?3L-"G-T<G5C="!497-T0B![('9I
M<G1U86P@=F]I9"!F;V\H=F]I9"D@/2 P.R!].PT*<W1R=6-T(%1E<W1#('L@
M<')I=F%T93H@=FER='5A;"!V;VED(&9O;RAV;VED*2 ](# [('T[#0IS=')U
M8W0_at_5&5S=$0_at_.B!497-T02![?3L-"G-T<G5C="!497-T12 Z(%1E<W1"('M]
M.PT*<W1R=6-T(%1E<W1&(#H_at_5&5S=$,@>WT[#0IS=')U8W0_at_5&5S=$<@.B!4
M97-T0B![('9I<G1U86P@=F]I9"!F;V\H=F]I9"D@>WT@?3L-"G-T<G5C="!4
M97-T2" Z(%1E<W1#('L@<')I=F%T93H@=FER='5A;"!V;VED(&9O;RAV;VED
M*2![?2!].PT*<W1R=6-T(%1E<W1)(#H_at_5&5S=$(L(%1E<W1#('M].PT*<W1R
M=6-T(%1E<W1*(#H_at_5&5S=$D@>R!V:7)T=6%L('9O:60_at_9F]O*'9O:60I('M]
M('T[#0IS=')U8W0_at_5&5S=$L_at_.B!497-T0B![('9I<G1U86P@=F]I9"!F;V\H
M=F]I9"D[('9I<G1U86P@=F]I9"!F;V\R*'9O:60I(#T@,#L@?3L-"G-T<G5C
M="!497-T3" Z(%1E<W1+('L@=FER='5A;"!V;VED(&9O;S(H=F]I9"D@>WT@
M?3L-"G-T<G5C="!497-T32 Z('9I<G1U86P_at_5&5S=$(@>WT[#0IS=')U8W0@
M5&5S=$X_at_.B!V:7)T=6%L(%1E<W1#('M].PT*<W1R=6-T(%1E<W1/(#H_at_5&5S
M=$TL(%1E<W1.('M].PT*<W1R=6-T(%1E<W10(#H_at_5&5S=$\@>R!V:7)T=6%L
M('9O:60_at_9F]O*'9O:60I('M]('T[#0IS=')U8W0_at_5&5S=%$@.B!497-T0B![
M('9I<G1U86P@=F]I9"!F;V\H=F]I9"D@/2 P.R!].PT*<W1R=6-T(%1E<W12
M(#H_at_5&5S=$,@>R!P<FEV871E.B!V:7)T=6%L('9O:60_at_9F]O*'9O:60I(#T@
M,#L@?3L-"G-T<G5C="!497-T4R![('9I<G1U86P@=F]I9"!F;V\H=F]I9"D@
M>WT@?3L-"G-T<G5C="!497-T5"![('9I<G1U86P@?E1E<W14*'9O:60I('M]
M('9I<G1U86P@=F]I9"!F;V\H=F]I9"D@>WT@?3L-"G-T<G5C="!497-T52 Z
M(%1E<W14('L@=FER='5A;"!V;VED(&9O;RAV;VED*2 ](# [('T[#0IS=')U
M8W0_at_5&5S=%8_at_.B!497-T5"![('9I<G1U86P@=F]I9"!F;V\H=F]I9"D@>WT@
M?3L-"G-T<G5C="!497-T5R![('9I<G1U86P@=F]I9"!F;V\Q*'9O:60I(#T@
M,#L@=FER='5A;"!V;VED(&9O;S(H=F]I9"D@/2 P.R!].PT*<W1R=6-T(%1E
M<W18(#H_at_5&5S=%<@>R!V:7)T=6%L('9O:60_at_9F]O,2AV;VED*2![?2 @=FER
M='5A;"!V;VED(&9O;S(H=F]I9"D@>WT@?3L-"G-T<G5C="!497-T62![('9I
M<G1U86P@?E1E<W19*'9O:60I(#T@,#L@?3L-"G-T<G5C="!497-T6B![('9I
M<G1U86P@?E1E<W1:*'9O:60I(#T@,#L@?3L_at_5&5S=%HZ.GY497-T6BAV;VED
M*2![?0T*<W1R=6-T(%1E<W1!02 Z(%1E<W1:('L@=FER='5A;"!^5&5S=$%!
M*'9O:60I(#T@,#L@?3L_at_5&5S=$%!.CI^5&5S=$%!*'9O:60I('M]#0IS=')U
M8W0_at_5&5S=$%"(#H_at_5&5S=$%!('L@=FER='5A;"!^5&5S=$%"*'9O:60I('M]
M('T[( T*<W1R=6-T(%1E<W1!0R![('9I<G1U86P@=F]I9"!F;V\H=F]I9"D@
M/2 P.R!].R!V;VED(%1E<W1!0SHZ9F]O*'9O:60I('M]#0IS=')U8W0_at_5&5S
M=$%$(#H_at_5&5S=$%#('M].PT*<W1R=6-T(%1E<W1!12 Z(%1E<W1!1"![('9I
M<G1U86P@=F]I9"!F;V\H*2![?2!].PT*<W1R=6-T(%1E<W1!1B Z(%1E<W1!
M1"![('9I<G1U86P@=F]I9"!F;V\H*3L@?3L@=F]I9"!497-T048Z.F9O;RAV
M;VED*2![?0T*<W1R=6-T(%1E<W1!1R Z('9I<G1U86P_at_5&5S=$$@>WT[#0H-
M"@T*5%1?5$535%]"14=)3BAI<U]A8G-T<F%C=%]C;&%S<RD-"@T*0D]/4U1?
M0TA%0TM?24Y414=204Q?0T].4U1!3E0H*#HZ='0Z.FES7V%B<W1R86-T7V-L
M87-S/%1E<W1!/CHZ=F%L=64I+"!F86QS92D[#0I"3T]35%]#2$5#2U])3E1%
M1U)!3%]#3TY35$%.5"@H.CIT=#HZ:7-?86)S=')A8W1?8VQA<W,\5&5S=$(^
M.CIV86QU92DL('1R=64I.PT*0D]/4U1?0TA%0TM?24Y414=204Q?0T].4U1!
M3E0H*#HZ='0Z.FES7V%B<W1R86-T7V-L87-S/%1E<W1#/CHZ=F%L=64I+"!T
M<G5E*3L-"D)/3U-47T-(14-+7TE.5$5'4D%,7T-/3E-404Y4*"@Z.G1T.CII
M<U]A8G-T<F%C=%]C;&%S<SQ497-T1#XZ.G9A;'5E*2P_at_9F%L<V4I.PT*0D]/
M4U1?0TA%0TM?24Y414=204Q?0T].4U1!3E0H*#HZ='0Z.FES7V%B<W1R86-T
M7V-L87-S/%1E<W1%/CHZ=F%L=64I+"!T<G5E*3L-"D)/3U-47T-(14-+7TE.
M5$5'4D%,7T-/3E-404Y4*"@Z.G1T.CII<U]A8G-T<F%C=%]C;&%S<SQ497-T
M1CXZ.G9A;'5E*2P@=')U92D[#0I"3T]35%]#2$5#2U])3E1%1U)!3%]#3TY3
M5$%.5"@H.CIT=#HZ:7-?86)S=')A8W1?8VQA<W,\5&5S=$<^.CIV86QU92DL
M(&9A;'-E*3L-"D)/3U-47T-(14-+7TE.5$5'4D%,7T-/3E-404Y4*"@Z.G1T
M.CII<U]A8G-T<F%C=%]C;&%S<SQ497-T2#XZ.G9A;'5E*2P_at_9F%L<V4I.PT*
M0D]/4U1?0TA%0TM?24Y414=204Q?0T].4U1!3E0H*#HZ='0Z.FES7V%B<W1R
M86-T7V-L87-S/%1E<W1)/CHZ=F%L=64I+"!T<G5E*3L-"D)/3U-47T-(14-+
M7TE.5$5'4D%,7T-/3E-404Y4*"@Z.G1T.CII<U]A8G-T<F%C=%]C;&%S<SQ4
M97-T2CXZ.G9A;'5E*2P_at_9F%L<V4I.R O+R!O;FQY(&]N92!M971H;V0@:6UP
M;&5M96YT960A#0I"3T]35%]#2$5#2U])3E1%1U)!3%]#3TY35$%.5"@H.CIT
M=#HZ:7-?86)S=')A8W1?8VQA<W,\5&5S=$L^.CIV86QU92DL('1R=64I.PT*
M0D]/4U1?0TA%0TM?24Y414=204Q?0T].4U1!3E0H*#HZ='0Z.FES7V%B<W1R
M86-T7V-L87-S/%1E<W1,/CHZ=F%L=64I+"!F86QS92D[#0I"3T]35%]#2$5#
M2U])3E1%1U)!3%]#3TY35$%.5"@H.CIT=#HZ:7-?86)S=')A8W1?8VQA<W,\
M5&5S=$T^.CIV86QU92DL('1R=64I.PT*0D]/4U1?0TA%0TM?24Y414=204Q?
M0T].4U1!3E0H*#HZ='0Z.FES7V%B<W1R86-T7V-L87-S/%1E<W1./CHZ=F%L
M=64I+"!T<G5E*3L-"D)/3U-47T-(14-+7TE.5$5'4D%,7T-/3E-404Y4*"@Z
M.G1T.CII<U]A8G-T<F%C=%]C;&%S<SQ497-T3SXZ.G9A;'5E*2P@=')U92D[
M#0I"3T]35%]#2$5#2U])3E1%1U)!3%]#3TY35$%.5"@H.CIT=#HZ:7-?86)S
M=')A8W1?8VQA<W,\5&5S=% ^.CIV86QU92DL(&9A;'-E*3L@+R\@/S\_#0I"
M3T]35%]#2$5#2U])3E1%1U)!3%]#3TY35$%.5"@H.CIT=#HZ:7-?86)S=')A
M8W1?8VQA<W,\5&5S=%$^.CIV86QU92DL('1R=64I.PT*0D]/4U1?0TA%0TM?
M24Y414=204Q?0T].4U1!3E0H*#HZ='0Z.FES7V%B<W1R86-T7V-L87-S/%1E
M<W12/CHZ=F%L=64I+"!T<G5E*3L-"D)/3U-47T-(14-+7TE.5$5'4D%,7T-/
M3E-404Y4*"@Z.G1T.CII<U]A8G-T<F%C=%]C;&%S<SQ497-T4SXZ.G9A;'5E
M*2P_at_9F%L<V4I.PT*0D]/4U1?0TA%0TM?24Y414=204Q?0T].4U1!3E0H*#HZ
M='0Z.FES7V%B<W1R86-T7V-L87-S/%1E<W14/CHZ=F%L=64I+"!F86QS92D[
M#0I"3T]35%]#2$5#2U])3E1%1U)!3%]#3TY35$%.5"@H.CIT=#HZ:7-?86)S
M=')A8W1?8VQA<W,\5&5S=%4^.CIV86QU92DL('1R=64I.PT*0D]/4U1?0TA%
M0TM?24Y414=204Q?0T].4U1!3E0H*#HZ='0Z.FES7V%B<W1R86-T7V-L87-S
M/%1E<W16/CHZ=F%L=64I+"!F86QS92D[#0I"3T]35%]#2$5#2U])3E1%1U)!
M3%]#3TY35$%.5"@H.CIT=#HZ:7-?86)S=')A8W1?8VQA<W,\5&5S=%<^.CIV
M86QU92DL('1R=64I.PT*0D]/4U1?0TA%0TM?24Y414=204Q?0T].4U1!3E0H
M*#HZ='0Z.FES7V%B<W1R86-T7V-L87-S/%1E<W18/CHZ=F%L=64I+"!F86QS
M92D[#0I"3T]35%]#2$5#2U])3E1%1U)!3%]#3TY35$%.5"@H.CIT=#HZ:7-?
M86)S=')A8W1?8VQA<W,\5&5S=%D^.CIV86QU92DL('1R=64I.PT*0D]/4U1?
M0TA%0TM?24Y414=204Q?0T].4U1!3E0H*#HZ='0Z.FES7V%B<W1R86-T7V-L
M87-S/%1E<W1:/CHZ=F%L=64I+"!T<G5E*3L-"D)/3U-47T-(14-+7TE.5$5'
M4D%,7T-/3E-404Y4*"@Z.G1T.CII<U]A8G-T<F%C=%]C;&%S<SQ497-T04$^
M.CIV86QU92DL('1R=64I.PT*0D]/4U1?0TA%0TM?24Y414=204Q?0T].4U1!
M3E0H*#HZ='0Z.FES7V%B<W1R86-T7V-L87-S/%1E<W1!0CXZ.G9A;'5E*2P@
M9F%L<V4I.PT*0D]/4U1?0TA%0TM?24Y414=204Q?0T].4U1!3E0H*#HZ='0Z
M.FES7V%B<W1R86-T7V-L87-S/%1E<W1!0SXZ.G9A;'5E*2P@=')U92D[#0I"
M3T]35%]#2$5#2U])3E1%1U)!3%]#3TY35$%.5"@H.CIT=#HZ:7-?86)S=')A
M8W1?8VQA<W,\5&5S=$%$/CHZ=F%L=64I+"!T<G5E*3L-"D)/3U-47T-(14-+
M7TE.5$5'4D%,7T-/3E-404Y4*"@Z.G1T.CII<U]A8G-T<F%C=%]C;&%S<SQ4
M97-T044^.CIV86QU92DL(&9A;'-E*3L-"D)/3U-47T-(14-+7TE.5$5'4D%,
M7T-/3E-404Y4*"@Z.G1T.CII<U]A8G-T<F%C=%]C;&%S<SQ497-T048^.CIV
M86QU92DL(&9A;'-E*3L-"D)/3U-47T-(14-+7TE.5$5'4D%,7T-/3E-404Y4
M*"@Z.G1T.CII<U]A8G-T<F%C=%]C;&%S<SQ497-T04<^.CIV86QU92DL(&9A
D;'-E*3L-"@T*5%1?5$535%]%3D0-"@T*#0H-"@T*#0H-"@T*
`
end


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