Boost logo

Boost :

From: Pavel Vozenilek (pavel_vozenilek_at_[hidden])
Date: 2004-01-16 10:58:01


Problem:
----------
  Often one would like to have some data value associated with a container.

  E.g. with list of window controls one may find handy to have pointer to
parent
  window "be somewhere within" the list.

Current Solutions:
--------------------
  a) Use std::pair<list<WindowControl>, Window*> pair. But it makes code
accessing
      the list more clumsy (add .first everywhere). It is pain if needed in
the middle of
      a project, even more if the need for associated pointer disappears
      (and reappears again).

  b) Write wrapper class list_of_controls. Quite an undertaking for feature
rich
       containers. Adds complexity to application.

  c) Pass associated data as additional parameter - this makes code complex,
      error prone and less maintainable.

Presented Solution:
----------------------
  It would be nice to have some way to specify associated data to container
  class and have them be nearly invisible and decoupled to application code.

  Designer would then:
  * define class with associated data:
        list_with_assoc_data<WindowControl, Window*> my_list;

  * fill the data when and where needed:
        my_list.associated_data = get_window();

  * use the container as if no associative data exists:

      // works with std::list and 'list_with_assoc_data' as well,
      // there's no coupling with associated data
      template<typename T>
      void foo(Cont& c)
      {
           c.sort();
      }

  * use associated data where needed:

     void foo2(const list_with_assoc_data<...>& my_list)
     {
         Window* w = my_list.associated_data;
     }

  Main advantage I see is the code which doesn't need to know about
  associated data won't need any modification. It will use usual
  interface of container. When associated data is changed, dropped
  or added, this code will work.

Sample Implementation:
---------------------------
  Changing container class is relatively easy. I attached container MyArray
  (array of 2 items) that can use associated data as example (tested on
Intel C++ 7.0).

  Basically, one just needs to add one base class (with data or empty one
when
  no data are associated) and modify some member functions and standalone
  operators.

  This technique has zero overhead.

I would like to know opinion of others how/if this idea is useful
or wrong/inconvenient.

/Pavel

begin 666 associated_data.cpp
M+R\@261E82!O9B!D871A(&%S<V]C:6%T960@=&\@8V]N=&%I;F5R+B!386UP
M;&4@:6UP;&5M96YT871I;VX@#0HO+R!F;W(@<VEM<&QE(&-O;G1A:6YE<B H
M87)R87D@;V8@,B!E;&5M96YT<RDN#0HO+R!7<FET=&5N(&)Y(%!A=F5L(%9O
M>F5N:6QE:RX-"B\O#0HC:6YC;'5D92 \:6]S=')E86T^#0HC:6YC;'5D92 \
M86QG;W)I=&AM/B @("\O(&9O<B!S=V%P#0HC:6YC;'5D92 \8F]O<W0O='EP
M95]T<F%I=',O:7-?<V%M92YH<' ^#0HC:6YC;'5D92 \8F]O<W0O;7!L+VEF
M+FAP<#X-"B-I;F-L=61E(#QT>7!E:6YF;SX-"@T*+RHJ*BH@;W)I9VEN86P@
M8V]N=&%I;F5R(&1E9FEN:71I;VX@:&%V:6YG(&YO(&%S<V]C:6%T960_at_9&%T
M82 J*BHJ#0IT96UP;&%T93QT>7!E;F%M92!4/@T*<W1R=6-T($UY07)R87D-
M"GL-"B @("!4('9A;'5E<ULR73L-"B @("!V;VED(&9O;RAV;VED*2!C;VYS
M="![?0T*?3L-"BHO#0H-"B\O+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2T-"B\O($AE;'!E<B!C;&%S<SH@<')O=FED97,@87-S;V-I871E9"!D
M871A('9A;'5E("L@='EP961E9_at_T*=&5M<&QA=&4\='EP96YA;64_at_1&%T83X-
M"F-L87-S($%S<V]C:6%T961$871A0F%S93L-"@T*+R\M+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+0T*+R\@268_at_8V]N=&%I;F5R(&1O97-N)W0@
M=7-E(&%S<V]C:6%T960_at_9&%T82!I="!I;FAE<FET<V@@9G)O;2!T:&ES+@T*
M=&5M<&QA=&4\/@T*8VQA<W,@07-S;V-I871E9$1A=&%"87-E/'9O:60^#0I[
M#0IP<F]T96-T960Z#0H@(" @07-S;V-I871E9$1A=&%"87-E*'9O:60I('M]
M(" @(" @( T*(" @('Y!<W-O8VEA=&5D1&%T84)A<V4H=F]I9"D@>WT@(" @
M(" @#0H-"B @(" O+R!A;&QO=R!T;R!C;W!Y(&5L96UE;G1S(&9R;VT@;W1H
M97(@8V]N=&%I;F5R<RP@#0H@(" @+R\@<F5G87)D;&5S<R!O9B!A<W-O8VEA
M=&5D(&1A=&$@='EP92 H;W(@;&%C:R!O9B!T:&5R96]F*0T*(" @('1E;7!L
M871E/'1Y<&5N86UE($%S<V]C:6%T961$871A5'EP93X-"B @("!V;VED(&-O
M<'E?87-S;V-I871E9%]D871A*&-O;G-T($%S<V]C:6%T961$871A0F%S93Q!
M<W-O8VEA=&5D1&%T851Y<&4^)B!O=&AE<BD@>WT-"@T*?3L-"@T*+R\M+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+0T*+R\@0V]N=&%I;F5R('=I
M=&@@87-S;V-I871E9"!D871A(&EN:&5R:71H<R!F<F]M('1H:7,N#0IT96UP
M;&%T93QT>7!E;F%M92!$871A/@T*8VQA<W,@07-S;V-I871E9$1A=&%"87-E
M#0I[#0IP=6)L:6,Z#0H@(" @='EP961E9B!$871A(&%S<V]C:6%T961?9&%T
M85]T>7!E.PT*(" @($1A=&$@87-S;V-I871E9%]D871A.PT*#0IP<F]T96-T
M960Z#0H@(" @07-S;V-I871E9$1A=&%"87-E*'9O:60I('M]#0H@(" @?D%S
M<V]C:6%T961$871A0F%S92AV;VED*2![?2 @(" @(" -"@T*(" @("\O(&%L
M;&]W('1O(&-O<'D@*&-O;7!A=&EB;&4I(&%S<V]C:6%T960_at_9&%T82!F<F]M
M(&]T:&5R(&-O;G1A:6YE<@T*(" @('1E;7!L871E/'1Y<&5N86UE($%S<V]C
M:6%T961$871A5'EP93X-"B @("!V;VED(&-O<'E?87-S;V-I871E9%]D871A
M*&-O;G-T($%S<V]C:6%T961$871A0F%S93Q!<W-O8VEA=&5D1&%T851Y<&4^
M)B!O=&AE<BD@>R -"B @(" @(" @87-S;V-I871E9%]D871A(#T@;W1H97(N
M87-S;V-I871E9%]D871A.PT*(" @('T-"@T*(" @("\O(&%L;&]W(&-O<'D@
M96QE;65N=',@9G)O;2!C;VYT86EN97(@=VET:&]U="!A<W-O8VEA=&5D(&1A
M=&$-"B @("!T96UP;&%T93P^#0H@(" @=F]I9"!C;W!Y7V%S<V]C:6%T961?
M9&%T82AC;VYS="!!<W-O8VEA=&5D1&%T84)A<V4\=F]I9#XF(&]T:&5R*2![
M?2 @(" -"GT[#0H-"@T*+R\M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+0T*=&5M<&QA=&4\='EP96YA;64_at_5"P@='EP96YA;64_at_07-S;V-I871E
M9$1A=&%4>7!E(#T@=F]I9#X@#0IS=')U8W0_at_37E!<G)A>2 Z('!U8FQI8R!B
M;V]S=#HZ;7!L.CII9E\\#0H@(" @(" @(&)O;W-T.CII<U]S86UE/$%S<V]C
M:6%T961$871A5'EP92P@=F]I9#XL#0H@(" @(" @($%S<V]C:6%T961$871A
M0F%S93QV;VED/BP-"B @(" @(" @07-S;V-I871E9$1A=&%"87-E/$%S<V]C
M:6%T961$871A5'EP93X-"B @(" @(" @/CHZ='EP90T*(" @(" @(" -"GL-
M"B @("!->4%R<F%Y*'9O:60I('M]#0H-"B @("!T96UP;&%T93QT>7!E;F%M
M92!4+"!T>7!E;F%M92!!<W-O8VEA=&5D1&%T851Y<&4^#0H@(" @97AP;&EC
M:70_at_37E!<G)A>2AC;VYS="!->4%R<F%Y/%0L($%S<V]C:6%T961$871A5'EP
M93XF(&]T:&5R*2 -"B @("![#0H@(" @(" @(&-O<'E?87-S;V-I871E9%]D
M871A*&]T:&5R*3L-"B @(" @(" @=F%L=65S6S!=(#T@;W1H97(N=F%L=65S
M6S!=.PT*(" @(" @("!V86QU97-;,5T@/2!O=&AE<BYV86QU97-;,5T[#0H@
M(" @?0T*#0H@(" @=&5M<&QA=&4\='EP96YA;64_at_5"P@='EP96YA;64_at_07-S
M;V-I871E9$1A=&%4>7!E/@T*(" @($UY07)R87DF(&]P97)A=&]R/2AC;VYS
M="!->4%R<F%Y/%0L($%S<V]C:6%T961$871A5'EP93XF(&]T:&5R*2 -"B @
M("![#0H@(" @(" @('9A;'5E<ULP72 ](&]T:&5R+G9A;'5E<ULP73L-"B @
M(" @(" @=F%L=65S6S%=(#T@;W1H97(N=F%L=65S6S%=.PT*(" @(" @("!C
M;W!Y7V%S<V]C:6%T961?9&%T82AO=&AE<BD[#0H@(" @(" @(')E='5R;B J
M=&AI<SL-"B @("!]#0H-"@T*(" @('1E;7!L871E/'1Y<&5N86UE(%0^#0H@
M(" @97AP;&EC:70_at_37E!<G)A>2AC;VYS="!->4%R<F%Y/%0L('9O:60^)B!O
M=&AE<BD@#0H@(" @>PT*(" @(" @("!V86QU97-;,%T@/2!O=&AE<BYV86QU
M97-;,%T[#0H@(" @(" @('9A;'5E<ULQ72 ](&]T:&5R+G9A;'5E<ULQ73L-
M"B @("!]#0H@(" @#0H@(" @=&5M<&QA=&4\='EP96YA;64_at_5#X-"B @("!-
M>4%R<F%Y)B!O<&5R871O<CTH8V]N<W0_at_37E!<G)A>3Q4+"!V;VED/B8@;W1H
M97(I( T*(" @('L-"B @(" @(" @=F%L=65S6S!=(#T@;W1H97(N=F%L=65S
M6S!=.PT*(" @(" @("!V86QU97-;,5T@/2!O=&AE<BYV86QU97-;,5T[#0H@
M(" @(" @(')E='5R;B J=&AI<SL-"B @("!]#0H@(" @#0H@(" @=&5M<&QA
M=&4\='EP96YA;64_at_5#X-"B @("!O<&5R871O<B!->4%R<F%Y/%0L('9O:60^
M)B H*2![#0H@(" @(" @(')E='5R;B!R96EN=&5R<')E=%]C87-T/$UY07)R
M87D\5"P@=F]I9#XF/B_at_J=&AI<RD[("\O(')E:6YT97)P<F5T7V-A<W0@:7,@
M=&\@879O:60@<F5C=7)S:6]N#0H@(" @?0T*#0H@(" @=&5M<&QA=&4\='EP
M96YA;64_at_5#X-"B @("!O<&5R871O<B!C;VYS="!->4%R<F%Y/%0L('9O:60^
M)B H*2!C;VYS="![#0H@(" @(" @(')E='5R;B!R96EN=&5R<')E=%]C87-T
M/&-O;G-T($UY07)R87D\5"P@=F]I9#XF/B_at_J=&AI<RD[#0H@(" @?0T*(" @
M( T*(" @(" @(" -"B @(" -"B @("!V;VED('-W87 H37E!<G)A>28@;W1H
M97(I#0H@(" @>PT*(" @(" @(" O+R!A<W-O8VEA=&5D(&1A=&$@87)E(&YO
M="!S=V%P<&5D#0H@(" @(" @('5S:6YG(&YA;65S<&%C92!S=&0[#0H@(" @
M(" @('-T9#HZ<W=A<"AV86QU97-;,%TL(&]T:&5R+G9A;'5E<ULP72D[#0H@
M(" @(" @('-T9#HZ<W=A<"AV86QU97-;,5TL(&]T:&5R+G9A;'5E<ULQ72D[
M#0H@(" @?0T*#0H@(" @=&5M<&QA=&4\='EP96YA;64_at_5#X-"B @("!V;VED
M('-W87 H37E!<G)A>3Q4+"!V;VED/B8@;W1H97(I( T*(" @('L-"B @(" @
M(" @=7-I;F<@;F%M97-P86-E('-T9#L-"B @(" @(" @<W=A<"AV86QU97-;
M,%TL(&]T:&5R+G9A;'5E<ULP72D[#0H@(" @(" @('-W87 H=F%L=65S6S%=
M+"!O=&AE<BYV86QU97-;,5TI.PT*(" @('T-"@T*#0H@(" @5"!V86QU97-;
M,ET[#0H@(" @=F]I9"!F;V\H=F]I9"D_at_8V]N<W0@>WT-"GT[#0H-"B -"G1E
M;7!L871E/'1Y<&5N86UE(%0L('1Y<&5N86UE($%S<V]C:6%T961$871A5'EP
M93X-"F)O;VP@;W!E<F%T;W(]/2AC;VYS="!->4%R<F%Y/%0L($%S<V]C:6%T
M961$871A5'EP93XF(&QH<RP_at_8V]N<W0_at_37E!<G)A>3Q4+"!!<W-O8VEA=&5D
M1&%T851Y<&4^)B!R:',I.PT*#0IT96UP;&%T93QT>7!E;F%M92!4+"!T>7!E
M;F%M92!!<W-O8VEA=&5D1&%T851Y<&4^#0IB;V]L(&]P97)A=&]R/3TH8V]N
M<W0_at_37E!<G)A>3Q4+"!V;VED/B8@;&AS+"!C;VYS="!->4%R<F%Y/%0L($%S
M<V]C:6%T961$871A5'EP93XF(')H<RD-"GL-"B @("!R971U<FX@=')U93L@
M+R\@22=M(&QA>GD-"GT-"@T*#0IT96UP;&%T93QT>7!E;F%M92!4+"!T>7!E
M;F%M92!!<W-O8VEA=&5D1&%T851Y<&4^#0IB;V]L(&]P97)A=&]R/3TH8V]N
M<W0_at_37E!<G)A>3Q4+"!!<W-O8VEA=&5D1&%T851Y<&4^)B!L:',L(&-O;G-T
M($UY07)R87D\5"P@=F]I9#XF(')H<RD-"GL-"B @("!R971U<FX@=')U93L@
M+R\@22=M(&QA>GD-"GT-"@T*=&5M<&QA=&4\='EP96YA;64_at_5"P@='EP96YA
M;64_at_07-S;V-I871E9$1A=&%4>7!E/@T*8F]O;"!O<&5R871O<CT]*&-O;G-T
M($UY07)R87D\5"P_at_07-S;V-I871E9$1A=&%4>7!E/B8@;&AS+"!C;VYS="!-
M>4%R<F%Y/%0L($%S<V]C:6%T961$871A5'EP93XF(')H<RD-"GL-"B @("!R
M971U<FX@=')U93L@+R\@22=M(&QA>GD-"GT-"@T*=&5M<&QA=&4\='EP96YA
M;64_at_5#X-"F)O;VP@;W!E<F%T;W(]/2AC;VYS="!->4%R<F%Y/%0L('9O:60^
M)B!L:',L(&-O;G-T($UY07)R87D\5"P@=F]I9#XF(')H<RD-"GL-"B @("!R
M971U<FX@=')U93L@+R\@22=M(&QA>GD-"GT-"@T*#0H-"G1E;7!L871E/'1Y
M<&5N86UE(%0L('1Y<&5N86UE($%S<V]C:6%T961$871A5'EP93X-"F)O;VP@
M;W!E<F%T;W(\*&-O;G-T($UY07)R87D\5"P_at_07-S;V-I871E9$1A=&%4>7!E
M/B8@;&AS+"!C;VYS="!->4%R<F%Y/%0L($%S<V]C:6%T961$871A5'EP93XF
M(')H<RD[#0H-"G1E;7!L871E/'1Y<&5N86UE(%0L('1Y<&5N86UE($%S<V]C
M:6%T961$871A5'EP93X-"F)O;VP@;W!E<F%T;W(\*&-O;G-T($UY07)R87D\
M5"P@=F]I9#XF(&QH<RP_at_8V]N<W0_at_37E!<G)A>3Q4+"!!<W-O8VEA=&5D1&%T
M851Y<&4^)B!R:',I#0I[#0H@(" @<F5T=7)N('1R=64[("\O($DG;2!L87IY
M(" @( T*?0T*#0IT96UP;&%T93QT>7!E;F%M92!4+"!T>7!E;F%M92!!<W-O
M8VEA=&5D1&%T851Y<&4^#0IB;V]L(&]P97)A=&]R/"AC;VYS="!->4%R<F%Y
M/%0L($%S<V]C:6%T961$871A5'EP93XF(&QH<RP_at_8V]N<W0_at_37E!<G)A>3Q4
M+"!V;VED/B8@<FAS*0T*>PT*(" @(')E='5R;B!T<G5E.R O+R!))VT@;&%Z
M>2 @(" -"GT-"@T*=&5M<&QA=&4\='EP96YA;64_at_5"P@='EP96YA;64_at_07-S
M;V-I871E9$1A=&%4>7!E/@T*8F]O;"!O<&5R871O<CPH8V]N<W0_at_37E!<G)A
M>3Q4+"!!<W-O8VEA=&5D1&%T851Y<&4^)B!L:',L(&-O;G-T($UY07)R87D\
M5"P_at_07-S;V-I871E9$1A=&%4>7!E/B8@<FAS*0T*>PT*(" @(')E='5R;B!T
M<G5E.R O+R!))VT@;&%Z>2 @(" -"GT-"@T*=&5M<&QA=&4\='EP96YA;64@
M5#X-"F)O;VP@;W!E<F%T;W(\*&-O;G-T($UY07)R87D\5"P@=F]I9#XF(&QH
M<RP_at_8V]N<W0_at_37E!<G)A>3Q4+"!V;VED/B8@<FAS*0T*>PT*(" @(')E='5R
M;B!T<G5E.R O+R!))VT@;&%Z>2 @(" -"GT-"@T*+RH@;W!E<F%T;W)S("$]
M+" ^+" \/2P@/CT@;VUI='1E9"!D=64@=&\@;&%Z:6YE<W,@*B\-"@T*#0IT
M96UP;&%T93QT>7!E;F%M92!4+"!T>7!E;F%M92!!<W-O8VEA=&5D1&%T851Y
M<&4^#0IV;VED('-W87 H37E!<G)A>3Q4+"!!<W-O8VEA=&5D1&%T851Y<&4^
M)B!L:',L($UY07)R87D\5"P_at_07-S;V-I871E9$1A=&%4>7!E/B8@<FAS*3L-
M"@T*=&5M<&QA=&4\='EP96YA;64_at_5"P@='EP96YA;64_at_07-S;V-I871E9$1A
M=&%4>7!E/@T*=F]I9"!S=V%P*$UY07)R87D\5"P@=F]I9#XF(&QH<RP_at_37E!
M<G)A>3Q4+"!!<W-O8VEA=&5D1&%T851Y<&4^)B!R:',I#0I[#0H@(" @;&AS
M+G-W87 H<FAS*3L-"GT-"@T*=&5M<&QA=&4\='EP96YA;64_at_5"P@='EP96YA
M;64_at_07-S;V-I871E9$1A=&%4>7!E/@T*=F]I9"!S=V%P*$UY07)R87D\5"P@
M07-S;V-I871E9$1A=&%4>7!E/B8@;&AS+"!->4%R<F%Y/%0L('9O:60^)B!R
M:',I#0I[#0H@(" @<FAS+G-W87 H;&AS*3L-"GT-"@T*=&5M<&QA=&4\='EP
M96YA;64_at_5"P@='EP96YA;64_at_07-S;V-I871E9$1A=&%4>7!E/@T*=F]I9"!S
M=V%P*$UY07)R87D\5"P_at_07-S;V-I871E9$1A=&%4>7!E/B8@;&AS+"!->4%R
M<F%Y/%0L($%S<V]C:6%T961$871A5'EP93XF(')H<RD-"GL-"B @("!L:',N
M<W=A<"AR:',I.PT*?0T*#0IT96UP;&%T93QT>7!E;F%M92!4/@T*=F]I9"!S
M=V%P*$UY07)R87D\5"P@=F]I9#XF(&QH<RP_at_37E!<G)A>3Q4+"!V;VED/B8@
M<FAS*0T*>PT*(" @(&QH<RYS=V%P*')H<RD[#0I]#0H-"@T*#0HO+RTM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM#0IV;VED(&QE=F5L,RAC;VYS
M="!->4%R<F%Y/&1O=6)L92P@=F]I9"H^)B!P87(I#0I[#0H@(" @<&%R+F9O
M;R_at_[hidden]*(" @('-T9#HZ8V]U=" \/" H:6YT*2AP87(N87-S;V-I871E9%]D
M871A*2 \/"!S=&0Z.F5N9&P[#0I]#0H-"B\O(%1H:7,@9G5N8W1I;VX@=V]R
M:W,@=VET:"!C;VYT86EN97(@37E!<G)A>2!R96=A<F1L97-S(&]F(&%N>2!A
M<W-O8VEA=&5D(&1A=&$-"B\O(&%N9"!D;V5S(&%C8V5S<R!T:&ES(&-O;G1A
M:6YE<B!A<R!I9B!N;R!A<W-O8VEA=&5D(&1A=&$@979E<B!E>&ES=&5D+@T*
M=&5M<&QA=&4\='EP96YA;64_at_5#X-"G9O:60@;&5V96PR*&-O;G-T(%0F('!A
M<BD-"GL-"B @("!P87(N9F]O*"D[#0H@(" @+R\@8G5T('1H92!R96%L('1Y
M<&4@:7,@<')E<V5R=F5D(&%N9"!C86X_at_8F4@<&%S<V5D(&9U=&AE<@T*(" @
M(&QE=F5L,RAP87(I.PT*?0T*#0IV;VED(&QE=F5L,2AC;VYS="!->4%R<F%Y
M/&1O=6)L92P@=F]I9"H^)B!P87(I#0I[#0H@(" @;&5V96PR*'!A<BD[#0I]
M#0H-"B\O+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2T-"FEN="!M
M86EN*'9O:60I#0I[#0H@(" @37E!<G)A>3QD;W5B;&4^(&UY7V%R<F%Y,3L-
M"B @("!M>5]A<G)A>3$N9F]O*"D[#0H@(" @37E!<G)A>3QD;W5B;&4^(&UY
M7V%R<F%Y,BAM>5]A<G)A>3$I.PT*(" @(&UY7V%R<F%Y,2 ](&UY7V%R<F%Y
M,CL-"@T*(" @($UY07)R87D\9&]U8FQE+"!V;VED*CX@;7E?87)R87DS.PT*
M(" @(&UY7V%R<F%Y,RYF;V\H*3L-"B @("!->4%R<F%Y/&1O=6)L92P@=F]I
M9"H^(&UY7V%R<F%Y-"AM>5]A<G)A>3,I.PT*(" @(&UY7V%R<F%Y,R ](&UY
M7V%R<F%Y-#L-"@T*(" @($UY07)R87D\9&]U8FQE/B!M>5]A<G)A>34H;7E?
M87)R87DS*3L-"B @("!M>5]A<G)A>3$@/2!M>5]A<G)A>3,[#0H-"B @("!-
M>4%R<F%Y/&1O=6)L92P@=F]I9"H^(&UY7V%R<F%Y-BAM>5]A<G)A>3$I.PT*
M(" @( T*(" @($UY07)R87D\9&]U8FQE/B8@<F5F,2 ](&UY7V%R<F%Y,SL-
M"B\O("!->4%R<F%Y/&1O=6)L92P@=F]I9"H^)B!R968R(#T@;7E?87)R87DQ
M.R O+R!N;W0@<&]S<VEB;&4L($]+#0H@(" @37E!<G)A>3QD;W5B;&4L('9O
M:60J/B8@<F5F,B ](&UY7V%R<F%Y,SL@#0H@(" @8V]N<W0_at_37E!<G)A>3QD
M;W5B;&4^)B!R968S(#T@;7E?87)R87DS.PT*+R\@(&-O;G-T($UY07)R87D\
M9&]U8FQE+"!V;VED*CXF(')E9C0@/2!M>5]A<G)A>3$[(" O+R!N;W0@<&]S
M<VEB;&4@+2!/2PT*(" @(&-O;G-T($UY07)R87D\9&]U8FQE+"!V;VED*CXF
M(')E9C0@/2!M>5]A<G)A>3,[#0H@(" @#0H@(" @8F]O;"!B(#T@;7E?87)R
M87DQ(#T](&UY7V%R<F%Y,SL-"B @("!B(#T@;7E?87)R87DS(#T](&UY7V%R
M<F%Y,3L-"B @("!B(#T@;7E?87)R87DS(#P@;7E?87)R87DQ.PT*(" @(&(@
M/2!M>5]A<G)A>3,@/"!M>5]A<G)A>3$[#0H@(" @8B ](&UY7V%R<F%Y,R \
M(&UY7V%R<F%Y,SL-"B @("!B(#T@;7E?87)R87DQ(#P@;7E?87)R87DQ.PT*
M(" @( T*(" @('-W87 H;7E?87)R87DQ+"!M>5]A<G)A>3(I.PT*(" @('-W
M87 H;7E?87)R87DS+"!M>5]A<G)A>30I.PT*(" @('-W87 H;7E?87)R87DS
M+"!M>5]A<G)A>3$I.PT*(" @('-W87 H;7E?87)R87DQ+"!M>5]A<G)A>3,I
M.PT*#0H@(" @+R\@97AA;7!L92!O9B!R961U8VEN9R!C;W5P;&EN9R H<V5E
M(&9U;F-T:6]N(&QE=F5L,B_at_I#0H@(" @+R\@=VAI8V@@9&]E<VXG="!N965D
M('1O(&MN;W<@86)O=70_at_87-S;V-I871I=F4_at_9&%T82X-"B @("!M>5]A<G)A
M>3,N87-S;V-I871E9%]D871A(#T@*'9O:60J*3$[#0H@(" @;&5V96PQ*&UY
M7V%R<F%Y,RD[#0H-"B\O(" @("!->4%R<F%Y/&1O=6)L92P@:6YT/B!M>5]A
M<G)A>3<H;7E?87)R87DS*3L@+R\@9&]E<VXG="!C;VUP:6QE("T_at_9&EF9F5R
M96YT(&%S<V]C:6%T960_at_9&%T82 M($]+#0H-"B @("!R971U<FX@,#L-"GT-
!"@``
`
end


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