Boost logo

Boost :

From: Pavel Vozenilek (pavel_vozenilek_at_[hidden])
Date: 2005-04-26 11:24:35


"Gennadiy Rozental" wrote:
> The formal review of Eric Nibbler's FOREACH macro starts
>
> http://boost-sandbox.sourceforge.net/vault/index.php?directory=eric_niebler
> foreach.zip
>

I use FOREACH and like it. It should be part of Boost.

The only time when I needed to fall back on old for(;;)
was when I wanted to know whether I am within first/last
loop cycle, like in:

for (int i = 0; i < n; ++i)
{
  if (i == 0) cout << "[";
  ...
  if (i + 1 == n) cout << "]";
}

The documentation should have example
for std::set and std::map.

Example for multi-index container
would be much useful.

Example for stepping though vector<vector<int> >
in two loops as well.

I tried to run the test under Intel 7.0, VC6.5 and BCB 6.4.

Notes from the fight are bellow. (I managed to get Intel 7
working. Slightly modified regress.cpp is included.)

/Pavel

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

Trying to compile the test with Intel C++ 7.0
plugged in VC6 IDE wth old Dinkumware I get error
with line:

std::list<int> my_list(int_iterator(1),int_iterator(6));

C:\work\reviews\foreach\libs\foreach\test\regress.cpp(29): error: no
instance of constructor "std::list<_Ty, _A>::list [with _Ty=int,

_A=std::allocator<int>]" matches the argument list
            argument types are: (int_iterator, int_iterator)
  std::list<int> my_list(int_iterator(1),int_iterator(6));
                         ^

This is because old Dinkumware doesn't support
template members.

This can be solved by using:

#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
// Old Dinkumware doesn't support template members.
// Lets fill the list with six ints of value 99.
std::list<int> my_list(6, 99);
#else
std::list<int> my_list(int_iterator(1),int_iterator(6));
#endif

in regress.cpp.

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

Then I get second error:

C:\work\reviews\boost-05-02-24-1300\boost/range/iterator.hpp(37): error:
class "mine::dummy" has no member "iterator"
          typedef BOOST_DEDUCED_TYPENAME C::iterator type;
                                            ^
          detected during instantiation of class "boost::range_iterator<C>
[with C=const mine::dummy]" at line 64 of

"C:\work\reviews\foreach\libs\foreach\test\regress.cpp"
compilation aborted for
C:\work\reviews\foreach\libs\foreach\test\regress.cpp (code 2)

that looks as mistake in test (range<> really expects
a richer "dummy" type).

I "fixed" it by changing:

    struct dummy
    {
        typedef void iterator;
    };

Then the test works (Intel + old Dinkumware ) for
both Debug and Release mode.

----------

With VC6 I get error:

c:\work\reviews\foreach\libs\foreach\test\regress.cpp(58) : warning C4099:
'range_iterator<struct mine::dummy>' : type name first seen using 'class'
now seen

using 'struct'
c:\work\reviews\foreach\libs\foreach\test\regress.cpp(63) : warning C4099:
'range_const_iterator<struct mine::dummy>' : type name first seen using
'class'

now seen using 'struct'
c:\work\reviews\foreach\libs\foreach\test\regress.cpp(66) : fatal error
C1001: INTERNAL COMPILER ERROR
        (compiler file 'msc1.cpp', line 1794)

I changed the
  struct range_const_iterator<mine::dummy>
into
  class range_const_iterator<mine::dummy>

but the ICE remained.

I added #ifdef for VC6 to avoid the extending and then I got errors:

C:\work\reviews\foreach\libs\foreach\test\regress.cpp(102) : error C2079:
'i' uses undefined class

'please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_on_cv_unqualified_pointee<int
(*)[5]>'
        C:\work\reviews\foreach\libs\foreach\test\regress.cpp(146) : see
reference to function template instantiation 'class std::vector<int,class

std::allocator<int> > __cdecl to_vector_foreach_byval(int (&)[5])' being
compiled
C:\work\reviews\foreach\libs\foreach\test\regress.cpp(102) : error C2440:
'initializing' : cannot convert from 'class

boost::detail::please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_on_cv_unqualified_pointee<int
(*)[5]>' to 'int'
        Source or target has incomplete type
        C:\work\reviews\foreach\libs\foreach\test\regress.cpp(146) : see
reference to function template instantiation 'class std::vector<int,class

std::allocator<int> > __cdecl to_vector_foreach_byval(int (&)[5])' being
compiled
C:\work\reviews\foreach\libs\foreach\test\regress.cpp(88) : error C2664:
'push_back' : cannot convert parameter 1 from 'int [5]' to 'const int &'
        Reason: cannot convert from 'int [5]' to 'const int'
        This conversion requires a reinterpret_cast, a C-style cast or
function-style cast
        C:\work\reviews\foreach\libs\foreach\test\regress.cpp(146) : see
reference to function template instantiation 'class std::vector<int,class

std::allocator<int> > __cdecl to_vector_for(int (&)[5])' being compiled
C:\work\reviews\foreach\libs\foreach\test\regress.cpp(102) : error C2079:
'i' uses undefined class

'please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_on_cv_unqualified_pointee<int
const (*)[5]>'
        C:\work\reviews\foreach\libs\foreach\test\regress.cpp(152) : see
reference to function template instantiation 'class std::vector<int,class

std::allocator<int> > __cdecl to_vector_foreach_byval(const int (&)[5])'
being compiled
....

I gave up at this point. I am attching
regress.cpp with my fixes.

----------

When trying BCB 6.4 I got strange error in boost/addressof.hpp:

[C++ Error] addressof.hpp(33): E2031 Cannot cast from 'int *' to 'const
volatile char &'
  Full parser context
    regress.cpp(192): decision to instantiate: int ( *)[5] boost::int (
*)[5] addressof<int[5]>(int ( &)[5])
    --- Resetting parser context for instantiation...
    regress.cpp(13): #include
C:\work\reviews\boost-05-02-24-1300\boost/test/minimal.hpp
    minimal.hpp(38): #include
C:\work\reviews\boost-05-02-24-1300\boost/test/utils/class_properties.hpp
    class_properties.hpp(29): #include
C:\work\reviews\boost-05-02-24-1300\boost/utility/addressof.hpp
    addressof.hpp(20): namespace boost
    addressof.hpp(31): parsing: int ( *)[5] boost::int ( *)[5]
addressof<int[5]>(int ( &)[5])
[C++ Error] addressof.hpp(33): E2031 Cannot cast from 'const int *' to
'const volatile char &'
  Full parser context
    regress.cpp(192): decision to instantiate: int ( *) const[5] boost::int
( *) const[5] addressof<int const[5]>(int ( &) const[5])
    --- Resetting parser context for instantiation...
    regress.cpp(13): #include
C:\work\reviews\boost-05-02-24-1300\boost/test/minimal.hpp
    minimal.hpp(38): #include
C:\work\reviews\boost-05-02-24-1300\boost/test/utils/class_properties.hpp
    class_properties.hpp(29): #include
C:\work\reviews\boost-05-02-24-1300\boost/utility/addressof.hpp
    addressof.hpp(20): namespace boost
    addressof.hpp(31): parsing: int ( *) const[5] boost::int ( *) const[5]
addressof<int const[5]>(int ( &) const[5])

I may try to look deeper into it.

----------
EOF

begin 666 regress.cpp
M+R\@("A#*2!#;W!Y<FEG:'0_at_17)I8R!.:65B;&5R(#(P,#0N#0HO+R @57-E
M+"!M;V1I9FEC871I;VX_at_86YD(&1I<W1R:6)U=&EO;B!A<F4@<W5B:F5C="!T
M;R!T:&4-"B\O("!";V]S="!3;V9T=V%R92!,:6-E;G-E+"!697)S:6]N(#$N
M,"X@*%-E92!A8V-O;7!A;GEI;F<@9FEL90T*+R\@($Q)0T5.4T5?,5\P+G1X
M="!O<B!C;W!Y(&%T(&AT=' Z+R]W=W<N8F]O<W0N;W)G+TQ)0T5.4T5?,5\P
M+G1X="D-"@T*+RH-"B!2979I<VEO;B!H:7-T;W)Y._at_T*(" @,3,@1&5C96UB
M97(@,C P-" Z($EN:71I86P@=F5R<VEO;BX-"BHO#0H-"B-I;F-L=61E(#QL
M:7-T/@T*(VEN8VQU9&4@/'9E8W1O<CX-"B-I;F-L=61E(#QB;V]S="]T97-T
M+VUI;FEM86PN:'!P/@T*(VEN8VQU9&4@/&)O;W-T+VET97)A=&]R+VET97)A
M=&]R7W1R86ET<RYH<' ^#0HC:6YC;'5D92 \8F]O<W0O:71E<F%T;W(O8V]U
M;G1I;F=?:71E<F%T;W(N:'!P/@T*(VEN8VQU9&4@(BXN+RXN+RXN+V)O;W-T
M+V9O<F5A8V_at_N:'!P(@T*#0HO+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+R\O#0HO+R!I;G1?:71E<F%T;W(-"B\O#0IT>7!E9&5F(&)O;W-T.CIC
M;W5N=&EN9U]I=&5R871O<CQI;G0^(&EN=%]I=&5R871O<CL-"@T*+R\O+R\O
M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+PT*+R\@9&5F:6YE(&-O;64@
M8V]N=&%I;F5R<PT*+R\-"F-H87(@;7E?;G1C<U]B=69F97);72 ](")<,5PR
M7#-<-%PU(CL-"F-H87(@*FUY7VYT8W,@(#T@;7E?;G1C<U]B=69F97([#0II
M;G0@;7E?87)R87E;72 ]('L@,2PR+#,L-"PU('T[#0HC:68_at_0D]/4U1?5T]2
M2T%23U5.1"A"3T]35%]$24Y+54U705)%7U-41$Q)0BP@/3T@,2D-"B\O($]L
M9"!$:6YK=6UW87)E(&1O97-N)W0@<W5P<&]R="!T96UP;&%T92!M96UB97)S
M+B -"B\O($QE=',@9FEL;"!T:&4@;&ES="!W:71H('-I>"!I;G1S(&]F('9A
M;'5E(#DY+@T*<W1D.CIL:7-T/&EN=#X@;7E?;&ES="@V+" Y.2D[#0HC96QS
M90T*<W1D.CIL:7-T/&EN=#X@;7E?;&ES="AI;G1?:71E<F%T;W(H,2DL:6YT
M7VET97)A=&]R*#8I*3L-"B-E;F1I9_at_T*<W1D.CIP86ER/&EN=%]I=&5R871O
M<BQI;G1?:71E<F%T;W(^(&UY7W!A:7(H:6YT7VET97)A=&]R*#$I+&EN=%]I
M=&5R871O<B_at_V*2D[#0H-"FEN="!C;VYS=" H)FUY7V-O;G-T7V%R<F%Y*5LU
M72 ](&UY7V%R<F%Y.PT*8VAA<B!C;VYS=" J;7E?8V]N<W1?;G1C<R @/2!M
M>5]N=&-S.PT*<W1D.CIL:7-T/&EN=#X_at_8V]N<W0@)FUY7V-O;G-T7VQI<W0@
M/2!M>5]L:7-T.PT*<W1D.CIP86ER/&EN=%]I=&5R871O<BQI;G1?:71E<F%T
M;W(^(&-O;G-T("9M>5]C;VYS=%]P86ER(#T@;7E?<&%I<CL-"@T*+R\@5D,V
M('=I;&P_at_9F%I;"!H97)E('=I=&@@24-%#0HC:68_at_0D]/4U1?5T]22T%23U5.
M1"A"3T]35%]-4U9#+" ^(#$R,# I#0HO+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+R\O+R\O+R\O#0HO+R!D969I;F4_at_82!U<V5R+61E9FEN960_at_8V]L;&5C
M=&EO;B!T>7!E(&%N9"!T96%C:"!"3T]35%]&3U)%04-((&AO=R!T;R!E;G5M
M97)A=&4@:70-"B\O#0IN86UE<W!A8V4@;6EN90T*>PT*(" @('-T<G5C="!D
M=6UM>2 -"B @("![#0H@(" @(" @('1Y<&5D968@=F]I9"!I=&5R871O<CL-
M"B @("!].PT*?0T*#0IN86UE<W!A8V4_at_8F]O<W0-"GL-"B @("!T96UP;&%T
M93P^#0H@(" @8VQA<W,@<F%N9V5?:71E<F%T;W(\;6EN93HZ9'5M;7D^#0H@
M(" @>PT*(" @('!U8FQI8SH-"B @(" @(" @='EP961E9B!C:&%R("H@='EP
M93L-"B @("!].PT*(" @('1E;7!L871E/#X-"B @("!C;&%S<R!R86YG95]C
M;VYS=%]I=&5R871O<CQM:6YE.CID=6UM>3X-"B @("![#0H@(" @<'5B;&EC
M._at_T*(" @(" @("!T>7!E9&5F(&-H87(@8V]N<W0@*B!T>7!E.PT*(" @('T[
M#0H@(" @8VAA<B J(&)E9VEN*&UI;F4Z.F1U;6UY)BD@>W)E='5R;B P.WT-
M"B @("!C:&%R(&-O;G-T("H_at_8F5G:6XH;6EN93HZ9'5M;7D_at_8V]N<W0F*2![
M<F5T=7)N(# [?0T*(" @(&-H87(@*B!E;F0H;6EN93HZ9'5M;7DF*2![<F5T
M=7)N(# [?0T*(" @(&-H87(@8V]N<W0@*B!E;F0H;6EN93HZ9'5M;7D_at_8V]N
M<W0F*2![<F5T=7)N(# [?0T*?0T*(V5N9&EF("\O(%9#-B!W;W)K87)O=6YD
M#0H-"B\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\-"B\O('1O
M7W9E8W1O<E]F;W(-"B\O#0IT96UP;&%T93QT>7!E;F%M92!286YG93X-"G-T
M9#HZ=F5C=&]R/&EN=#X@=&]?=F5C=&]R7V9O<B@@4F%N9V4@)B!R;F<@*0T*
M>PT*(" @('-T9#HZ=F5C=&]R/&EN=#X@=F5C=#L-"B @("!T>7!E9&5F($)/
M3U-47T1%1%5#141?5%E014Y!344_at_8F]O<W0Z.G)A;F=E7W)E<W5L=%]I=&5R
M871O<CQ286YG93XZ.G1Y<&4@:71E<F%T;W([#0H@(" @9F]R*&ET97)A=&]R
M(&)E9VEN(#T_at_8F]O<W0Z.F)E9VEN*')N9RDL(&5N9" ](&)O;W-T.CIE;F0H
M<FYG*3L-"B @(" @(" @8F5G:6X@(3T_at_96YD.R K*V)E9VEN*0T*(" @('L-
M"B @(" @(" @=F5C="YP=7-H7V)A8VLH*F)E9VEN*3L-"B @("!]#0H@(" @
M<F5T=7)N('9E8W0[#0I]#0H-"B\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+R\O+R\-"B\O('1O7W9E8W1O<E]F;W)E86-H7V)Y=F%L#0HO+PT*=&5M
M<&QA=&4\='EP96YA;64_at_4F%N9V4^#0IS=&0Z.G9E8W1O<CQI;G0^('1O7W9E
M8W1O<E]F;W)E86-H7V)Y=F%L*"!286YG92 F(')N9R I#0I[#0H@(" @<W1D
M.CIV96-T;W(\:6YT/B!V96-T.PT*(" @('1Y<&5D968_at_0D]/4U1?1$5$54-%
M1%]465!%3D%-12!B;V]S=#HZ<F%N9V5?<F5S=6QT7VET97)A=&]R/%)A;F=E
M/CHZ='EP92!I=&5R871O<CL-"B @("!T>7!E9&5F($)/3U-47T1%1%5#141?
M5%E014Y!344_at_8F]O<W0Z.FET97)A=&]R7W9A;'5E/&ET97)A=&]R/CHZ='EP
M92!V86QU93L-"B @("!"3T]35%]&3U)%04-(*"!V86QU92!I+"!R;F<@*0T*
M(" @('L-"B @(" @(" @=F5C="YP=7-H7V)A8VLH:2D[#0H@(" @?0T*(" @
M(')E='5R;B!V96-T.PT*?0T*#0HO+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+R\O+R\O#0HO+R!T;U]V96-T;W)?9F]R96%C:%]B>7)E9_at_T*+R\-"G1E
M;7!L871E/'1Y<&5N86UE(%)A;F=E/@T*<W1D.CIV96-T;W(\:6YT/B!T;U]V
M96-T;W)?9F]R96%C:%]B>7)E9B@@4F%N9V4@)B!R;F<@*0T*>PT*(" @('-T
M9#HZ=F5C=&]R/&EN=#X@=F5C=#L-"B @("!T>7!E9&5F($)/3U-47T1%1%5#
M141?5%E014Y!344_at_8F]O<W0Z.G)A;F=E7W)E<W5L=%]I=&5R871O<CQ286YG
M93XZ.G1Y<&4@:71E<F%T;W([#0H@(" @='EP961E9B!"3T]35%]$14150T5$
M7U194$5.04U%(&)O;W-T.CII=&5R871O<E]R969E<F5N8V4\:71E<F%T;W(^
M.CIT>7!E(')E9F5R96YC93L-"B @("!"3T]35%]&3U)%04-(*"!R969E<F5N
M8V4@:2P@<FYG("D-"B @("![#0H@(" @(" @('9E8W0N<'5S:%]B86-K*&DI
M.PT*(" @('T-"B @("!R971U<FX@=F5C=#L-"GT-"@T*+R\O+R\O+R\O+R\O
M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+PT*+R\@;75T871E7V9O<F5A8VA?8GER
M968-"B\O#0IT96UP;&%T93QT>7!E;F%M92!286YG93X-"G9O:60@;75T871E
M7V9O<F5A8VA?8GER968H(%)A;F=E("8@<FYG("D-"GL-"B @("!T>7!E9&5F
M($)/3U-47T1%1%5#141?5%E014Y!344_at_8F]O<W0Z.G)A;F=E7W)E<W5L=%]I
M=&5R871O<CQ286YG93XZ.G1Y<&4@:71E<F%T;W([#0H@(" @='EP961E9B!"
M3T]35%]$14150T5$7U194$5.04U%(&)O;W-T.CII=&5R871O<E]R969E<F5N
M8V4\:71E<F%T;W(^.CIT>7!E(')E9F5R96YC93L-"B @("!"3T]35%]&3U)%
M04-(*"!R969E<F5N8V4@:2P@<FYG("D-"B @("![#0H@(" @(" @("LK:3L-
M"B @("!]#0I]#0H-"@T*+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O
M+R\O+PT*+R\@=&5S=%]M86EN#0HO+R @( T*:6YT('1E<W1?;6%I;B@@:6YT
M+"!C:&%R*EM=("D-"GL-"B @(" O+R!N;VXM8V]N<W0_at_8V]N=&%I;F5R<R!B
M>2!V86QU90T*(" @($)/3U-47T-(14-+*'1O7W9E8W1O<E]F;W)E86-H7V)Y
M=F%L*&UY7V%R<F%Y*2 ]/2!T;U]V96-T;W)?9F]R*&UY7V%R<F%Y*2D[#0H@
M(" @0D]/4U1?0TA%0TLH=&]?=F5C=&]R7V9O<F5A8VA?8GEV86PH;7E?;G1C
M<RD@(#T]('1O7W9E8W1O<E]F;W(H;7E?;G1C<RDI.PT*(" @($)/3U-47T-(
M14-+*'1O7W9E8W1O<E]F;W)E86-H7V)Y=F%L*&UY7VQI<W0I(" ]/2!T;U]V
M96-T;W)?9F]R*&UY7VQI<W0I*3L-"B @("!"3T]35%]#2$5#2RAT;U]V96-T
M;W)?9F]R96%C:%]B>79A;"AM>5]P86ER*2 @/3T@=&]?=F5C=&]R7V9O<BAM
M>5]P86ER*2D[#0H-"B @(" O+R!C;VYS="!C;VYT86EN97)S(&)Y('9A;'5E
M#0H@(" @0D]/4U1?0TA%0TLH=&]?=F5C=&]R7V9O<F5A8VA?8GEV86PH;7E?
M8V]N<W1?87)R87DI(#T]('1O7W9E8W1O<E]F;W(H;7E?8V]N<W1?87)R87DI
M*3L-"B @("!"3T]35%]#2$5#2RAT;U]V96-T;W)?9F]R96%C:%]B>79A;"AM
M>5]C;VYS=%]N=&-S*2 @/3T@=&]?=F5C=&]R7V9O<BAM>5]C;VYS=%]N=&-S
M*2D[#0H@(" @0D]/4U1?0TA%0TLH=&]?=F5C=&]R7V9O<F5A8VA?8GEV86PH
M;7E?8V]N<W1?;&ES="D@(#T]('1O7W9E8W1O<E]F;W(H;7E?8V]N<W1?;&ES
M="DI.PT*(" @($)/3U-47T-(14-+*'1O7W9E8W1O<E]F;W)E86-H7V)Y=F%L
M*&UY7V-O;G-T7W!A:7(I(" ]/2!T;U]V96-T;W)?9F]R*&UY7V-O;G-T7W!A
M:7(I*3L-"@T*(" @("\O(&YO;BUC;VYS="!C;VYT86EN97)S(&)Y(')E9F5R
M96YC90T*(" @($)/3U-47T-(14-+*'1O7W9E8W1O<E]F;W)E86-H7V)Y<F5F
M*&UY7V%R<F%Y*2 ]/2!T;U]V96-T;W)?9F]R*&UY7V%R<F%Y*2D[#0H@(" @
M0D]/4U1?0TA%0TLH=&]?=F5C=&]R7V9O<F5A8VA?8GER968H;7E?;G1C<RD@
M(#T]('1O7W9E8W1O<E]F;W(H;7E?;G1C<RDI.PT*(" @($)/3U-47T-(14-+
M*'1O7W9E8W1O<E]F;W)E86-H7V)Y<F5F*&UY7VQI<W0I(" ]/2!T;U]V96-T
M;W)?9F]R*&UY7VQI<W0I*3L-"B @("!"3T]35%]#2$5#2RAT;U]V96-T;W)?
M9F]R96%C:%]B>7)E9BAM>5]P86ER*2 @/3T@=&]?=F5C=&]R7V9O<BAM>5]P
M86ER*2D[#0H-"B @(" O+R!C;VYS="!C;VYT86EN97)S(&)Y(')E9F5R96YC
M90T*(" @($)/3U-47T-(14-+*'1O7W9E8W1O<E]F;W)E86-H7V)Y<F5F*&UY
M7V-O;G-T7V%R<F%Y*2 ]/2!T;U]V96-T;W)?9F]R*&UY7V-O;G-T7V%R<F%Y
M*2D[#0H@(" @0D]/4U1?0TA%0TLH=&]?=F5C=&]R7V9O<F5A8VA?8GER968H
M;7E?8V]N<W1?;G1C<RD@(#T]('1O7W9E8W1O<E]F;W(H;7E?8V]N<W1?;G1C
M<RDI.PT*(" @($)/3U-47T-(14-+*'1O7W9E8W1O<E]F;W)E86-H7V)Y<F5F
M*&UY7V-O;G-T7VQI<W0I(" ]/2!T;U]V96-T;W)?9F]R*&UY7V-O;G-T7VQI
M<W0I*3L-"B @("!"3T]35%]#2$5#2RAT;U]V96-T;W)?9F]R96%C:%]B>7)E
M9BAM>5]C;VYS=%]P86ER*2 @/3T@=&]?=F5C=&]R7V9O<BAM>5]C;VYS=%]P
M86ER*2D[#0H-"B @(" O+R!M=71A=&4@=&AE(&UU=&%B;&4_at_8V]L;&5C=&EO
M;G,-"B @("!M=71A=&5?9F]R96%C:%]B>7)E9BAM>5]A<G)A>2D[#0H@(" @
M;75T871E7V9O<F5A8VA?8GER968H;7E?;G1C<RD[#0H@(" @;75T871E7V9O
M<F5A8VA?8GER968H;7E?;&ES="D[#0H-"B @(" O+R!C;VUP87)E('1H92!M
M=71A=&5D(&-O;&QE8W1I;VYS('1O('1H92!A8W1U86P@<F5S=6QT<PT*(" @
M('-T9#HZ<&%I<CQI;G1?:71E<F%T;W(L:6YT7VET97)A=&]R/B!R97-U;'1S
M*&EN=%]I=&5R871O<B_at_R*2QI;G1?:71E<F%T;W(H-RDI.PT*(" @($)/3U-4
M7T-(14-+*'1O7W9E8W1O<E]F;W)E86-H7V)Y=F%L*&UY7V%R<F%Y*2 ]/2!T
M;U]V96-T;W)?9F]R*')E<W5L=',I*3L-"B @("!"3T]35%]#2$5#2RAT;U]V
M96-T;W)?9F]R96%C:%]B>79A;"AM>5]N=&-S*2 @/3T@=&]?=F5C=&]R7V9O
M<BAR97-U;'1S*2D[#0H@(" @0D]/4U1?0TA%0TLH=&]?=F5C=&]R7V9O<F5A
M8VA?8GEV86PH;7E?;&ES="D@(#T]('1O7W9E8W1O<E]F;W(H<F5S=6QT<RDI
M.PT*#0HC:68_at_0D]/4U1?5T]22T%23U5.1"A"3T]35%]-4U9#+" ^(#$R,# I
M#0H@(" @+R\@;&]O<"!O=F5R(&$@=7-E<BUD969I;F5D('1Y<&4@*&IU<W0@
M;6%K92!S=7)E('1H:7,@8V]M<&EL97,I#0H@(" @;6EN93HZ9'5M;7D_at_9#L-
M"B @("!"3T]35%]&3U)%04-(*"!C:&%R(&,L(&0@*0T*(" @('L-"B @(" @
M(" @*"AV;VED*6,I.R O+R!N;RUO< T*(" @('T-"B-E;F1I9_at_T*#0H@(" @
.<F5T=7)N(# [#0I]#0H`
`
end


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