How to read a C++ class from file into memory
Jarrett Billingsley
kb3ctd2 at yahoo.com
Thu Mar 22 21:42:58 PDT 2007
"David Finlayson" <david.p.finlayson at gmail.com> wrote in message
news:etuh4g$2ijp$1 at digitalmars.com...
>I am coming from Python to D, so forgive my limited C/C++ knowledge.
>
> What is the idiomatic way to read a heterogeneous binary structure in D?
>
> In my C++ book, it shows examples of defining a class or struct with the
> appropriate types and then passing a pointer to this class to fread().
>
> However, in Java or Python I could just read the types directly from a
> binary stream (including the padding bytes associated with the structure
> on disk).
>
> How should I do this in D?
>
> I did see this post:
>
> http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=6071
>
> Note that I ultimately want to store these data back into classes where I
> can work with it.
>
If you haven't got too many classes/structures to serialize, I've attached a
module with a simple serialization/deserialization mechanism that works with
std.stream. It will automatically serialize out all primitive and array
types, as well as structures which have no unions. You can specify custom
serialization and deserialization methods for classes and structures, and
you can make structures behave as though they were an opaque chunk of data
(for performance when reading/writing). It's very easy to use; to serialize
anything, you just write:
Serialize(stream, data);
And to deserialize it again:
Deserialize(stream, data);
Defining the custom methods for classes and structs is easy. The serialize
function should just be declared as "void serialize(Stream s)" and the
deserialize function as "static T deserialize(Stream s)", where T is the
type for which you're defining the deserialize function.
I extracted this code from a larger module, and I think it has everything it
needs to work, if it doesn't let me know!
begin 666 cereal.d
M;6]D=6QE(&-E<F5A;#L-"@T*:6UP;W)T('-T9"YS=')E86T[#0II;7!O<G0@
M=71F(#T@<W1D+G5T9CL-"@T*+R\@4V]M92!T>7!E('1R86ET<R!S='5F9BX-
M"G1E;7!L871E(&ES4W1R:6YG5'EP92A4*0T*>PT*"6-O;G-T(&)O;VP@:7-3
M=')I;F=4>7!E(#T@:7,H5" Z(&-H87);72D@?'P@:7,H5" Z('=C:&%R6UTI
M('Q\(&ES*%0 at .B!D8VAA<EM=*3L-"GT-"@T*=&5M<&QA=&4@:7-#:&%R5'EP
M92A4*0T*>PT*"6-O;G-T(&)O;VP@:7-#:&%R5'EP92 ](&ES*%0@/3T at 8VAA
M<BD@?'P@:7,H5" ]/2!W8VAA<BD@?'P@:7,H5" ]/2!D8VAA<BD[#0I]#0H-
M"G1E;7!L871E(&ES26YT5'EP92A4*0T*>PT*"6-O;G-T(&)O;VP@:7-);G14
M>7!E(#T@:7,H5" ]/2!I;G0I('Q\(&ES*%0@/3T@=6EN="D@?'P@:7,H5" ]
M/2!L;VYG*2!\?"!I<RA4(#T]('5L;VYG*2!\? T*"0D)"0D)"6ES*%0@/3T@
M<VAO<G0I('Q\(&ES*%0@/3T@=7-H;W)T*2!\?"!I<RA4(#T](&)Y=&4I('Q\
M(&ES*%0@/3T@=6)Y=&4I.PT*?0T*#0IT96UP;&%T92!I<T9L;V%T5'EP92A4
M*0T*>PT*"6-O;G-T(&)O;VP@:7-&;&]A=%1Y<&4@/2!I<RA4(#T](&9L;V%T
M*2!\?"!I<RA4(#T](&1O=6)L92D@?'P@:7,H5" ]/2!R96%L*3L-"GT-"@T*
M=&5M<&QA=&4@:7-!<G)A>51Y<&4H5"D-"GL-"@EC;VYS="!B;V]L(&ES07)R
M87E4>7!E(#T@:7,H='EP96]F*%1;,%TI*2 F)B!I<RAT>7!E;V8H5"YS;W)T
M*2D[#0I]#0H-"G1E;7!L871E(&ES4&]I;G1E<E1Y<&4H5"D-"GL-"@EC;VYS
M="!B;V]L(&ES4&]I;G1E<E1Y<&4@/2!I<RAT>7!E;V8H*E0I*2 F)B A:7-!
M<G)A>51Y<&4A*%0I.PT*?0T*#0HO+R!'970@=&\@=&AE(&)O='1O;2!O9B!A
M;GD at 8VAA:6X@;V8@='EP961E9G,A("!2971U<FYS('1H92!F:7)S="!N;VXM
M='EP961E9B=E9"!T>7!E+ at T*=&5M<&QA=&4@<F5A;%1Y<&4H5"D-"GL-"@ES
M=&%T:6,@:68H:7,H5"!"87-E(#T]('1Y<&5D968I*0T*"0EA;&EA<R!R96%L
M5'EP92$H0F%S92D@<F5A;%1Y<&4[#0H)96QS90T*"0EA;&EA<R!4(')E86Q4
M>7!E.PT*?0T*#0HO+R!$971E<FUI;F4@:68 at 82!G:79E;B!A9V=R96=A=&4@
M='EP92!C;VYT86EN<R!A;GD@=6YI;VYS+"!E>'!L:6-I="!O<B!A;F]N>6UO
M=7,N#0HO+R!4:&%N:W,@=&\@1G)I=',@=F%N($)O;6UE;"!F;W(@=&AE(&]R
M:6=I;F%L(&-O9&4N#0IT96UP;&%T92!H87-5;FEO;G,H5"P@<VEZ95]T($ED
M>" ](# I#0I[#0H)<W1A=&EC(&EF*"%I<RAT>7!E;V8H5"YT=7!L96]F*2DI
M#0H)"6-O;G-T(&)O;VP@:&%S56YI;VYS(#T at 9F%L<V4[#0H)96QS92!S=&%T
M:6,@:68H:7,H<F5A;%1Y<&4A*%0I(#T]('5N:6]N*2D-"@D)8V]N<W0 at 8F]O
M;"!H87-5;FEO;G,@/2!T<G5E.PT*"65L<V4@<W1A=&EC(&EF*$ED>" \(%0N
M='5P;&5O9BYL96YG=&@I#0H)>PT*"0ES=&%T:6,@:68H:7,H<F5A;%1Y<&4A
M*'1Y<&5O9BA4+G1U<&QE;V8I6TED>%TI(#T]('5N:6]N*2D-"@D)"6-O;G-T
M(&)O;VP@:&%S56YI;VYS(#T@=')U93L-"@D)96QS92!S=&%T:6,@:68H261X
M("L@,2 \(%0N='5P;&5O9BYL96YG=&@@)B8 at 5"YT=7!L96]F6TED>%TN;V9F
M<V5T;V8@*R!4+G1U<&QE;V9;261X72YS:7IE;V8@/B!4+G1U<&QE;V9;261X
M("L@,5TN;V9F<V5T;V8I#0H)"0EC;VYS="!B;V]L(&AA<U5N:6]N<R ]('1R
M=64[#0H)"65L<V4-"@D)>PT*"0D)<W1A=&EC(&EF*&ES*'1Y<&5O9BA4+G1U
M<&QE;V8I6TED>%T@/3T@<W1R=6-T*2D-"@D)"0EC;VYS="!B;V]L(&AA<U5N
M:6]N<R ](&AA<U5N:6]N<R$H='EP96]F*%0N='5P;&5O9BE;261X72D@?'P@
M:&%S56YI;VYS(2A4+"!)9'@@*R Q*3L-"@D)"65L<V4-"@D)"0EC;VYS="!B
M;V]L(&AA<U5N:6]N<R ](&AA<U5N:6]N<R$H5"P at 261X("L@,2D[#0H)"7T-
M"@E]#0H)96QS90T*"0EC;VYS="!B;V]L(&AA<U5N:6]N<R ](&9A;'-E.PT*
M?0T*#0HO+R!3964@:68 at 5"!I<R!A('1Y<&4@=&AA="!C86XG="!B92!A=71O
M;6%T:6-A;&QY('-E<FEA;&EZ960N#0IT96UP;&%T92!I<TEN=F%L:61397)I
M86QI>F54>7!E*%0I#0I[#0H)8V]N<W0 at 8F]O;"!I<TEN=F%L:61397)I86QI
M>F54>7!E(#T@:7-0;VEN=&5R5'EP92$H5"D@?'P@:7,H5" ]/2!F=6YC=&EO
M;BD@?'P@:7,H5" ]/2!D96QE9V%T92D@?'P-"@D):7,H5" ]/2!I;G1E<F9A
M8V4I('Q\(&ES*%0@/3T@=6YI;VXI('Q\("AI<RAT>7!E;V8H5"YK97ES*2D@
M)B8@:7,H='EP96]F*%0N=F%L=65S*2DI.PT*?0T*#0HO+R!4:&4 at 9&EF9F5R
M96YT('=A>7, at 9&%T82!C86X at 8F4@<V5R:6%L:7IE9"!A;F0 at 9&5S97)I86QI
M>F5D+ at T*96YU;2!397)I86QI>F5-971H;V0-"GL-"@E);G9A;&ED+ T*"59E
M8W1O<BP-"@E397%U96YC92P-"@E#=7-T;VTL#0H)5'5P;&4L#0H)0VAU;FL-
M"GT-"@T*+R\@1VEV96X at 82!T>7!E+"!D971E<FUI;F4@:&]W('1O('-E<FEA
M;&EZ92!O<B!D97-E<FEA;&EZ92!A('9A;'5E(&]F('1H870@='EP92X-"G1E
M;7!L871E(%1Y<&5397)I86QI>F5-971H;V0H5"D-"GL-"@ES=&%T:6,@:68H
M:7-);G9A;&ED4V5R:6%L:7IE5'EP92$H5"DI#0H)"6-O;G-T(%1Y<&5397)I
M86QI>F5-971H;V0@/2!397)I86QI>F5-971H;V0N26YV86QI9#L-"@EE;'-E
M('-T871I8R!I9BAI<T%R<F%Y5'EP92$H5"DI#0H)>PT*"0ES=&%T:6,@:68H
M5'EP95-E<FEA;&EZ94UE=&AO9"$H='EP96]F*%1;,%TI*2 ]/2!397)I86QI
M>F5-971H;V0N26YV86QI9"D-"@D)"6-O;G-T(%1Y<&5397)I86QI>F5-971H
M;V0@/2!397)I86QI>F5-971H;V0N26YV86QI9#L-"@D)96QS92!S=&%T:6,@
M:68H5'EP95-E<FEA;&EZ94UE=&AO9"$H='EP96]F*%1;,%TI*2 ]/2!397)I
M86QI>F5-971H;V0N0VAU;FLI#0H)"0EC;VYS="!4>7!E4V5R:6%L:7IE365T
M:&]D(#T at 4V5R:6%L:7IE365T:&]D+E9E8W1O<CL-"@D)96QS90T*"0D)8V]N
M<W0 at 5'EP95-E<FEA;&EZ94UE=&AO9" ](%-E<FEA;&EZ94UE=&AO9"Y397%U
M96YC93L-"@E]#0H)96QS92!S=&%T:6,@:68H:7,H5" ]/2!C;&%S<RDI#0H)
M"6-O;G-T(%1Y<&5397)I86QI>F5-971H;V0@/2!397)I86QI>F5-971H;V0N
M0W5S=&]M.PT*"65L<V4@<W1A=&EC(&EF*&ES*%0@/3T@<W1R=6-T*2D-"@E[
M#0H)"7-T871I8R!I9BAI<RAT>7!E;V8H5"Y397)I86QI>F5!<T-H=6YK*2DI
M#0H)"0EC;VYS="!4>7!E4V5R:6%L:7IE365T:&]D(#T at 4V5R:6%L:7IE365T
M:&]D+D-H=6YK.PT*"0EE;'-E#0H)"7L-"@D)"7-T871I8R!I9BAI<RAT>7!E
M;V8H5"YS97)I86QI>F4I*2D-"@D)"7L-"@D)"0ES=&%T:6,@:68H:7,H='EP
M96]F*%0N9&5S97)I86QI>F4I*2D-"@D)"0D)8V]N<W0 at 5'EP95-E<FEA;&EZ
M94UE=&AO9" ](%-E<FEA;&EZ94UE=&AO9"Y#=7-T;VT[#0H)"0D)96QS90T*
M"0D)"0EC;VYS="!4>7!E4V5R:6%L:7IE365T:&]D(#T at 4V5R:6%L:7IE365T
M:&]D+DEN=F%L:60[#0H)"0E]#0H)"0EE;'-E('-T871I8R!I9BAI<RAT>7!E
M;V8H5"YD97-E<FEA;&EZ92DI*0T*"0D)"6-O;G-T(%1Y<&5397)I86QI>F5-
M971H;V0@/2!397)I86QI>F5-971H;V0N26YV86QI9#L-"@D)"65L<V4@<W1A
M=&EC(&EF*&AA<U5N:6]N<R$H5"DI#0H)"0D)8V]N<W0 at 5'EP95-E<FEA;&EZ
M94UE=&AO9" ](%-E<FEA;&EZ94UE=&AO9"Y);G9A;&ED.PT*"0D)96QS90T*
M"0D)"6-O;G-T(%1Y<&5397)I86QI>F5-971H;V0@/2!397)I86QI>F5-971H
M;V0N5'5P;&4[#0H)"7T-"@E]#0H)96QS90T*"0EC;VYS="!4>7!E4V5R:6%L
M:7IE365T:&]D(#T at 4V5R:6%L:7IE365T:&]D+D-H=6YK.PT*?0T*#0HO*BH-
M"E=R:71E(&]U="!A('9A;'5E('1O(&$@<W1R96%M+B @5&AI<R!W:6QL(&%U
M=&]M871I8V%L;'D@=W)I=&4@;W5T(&YE<W1E9"!A<G)A>7, at 86YD(&5N=&ER
M92!S=')U8W1U<F5S+ at T*4&]I;G1E<G,L(&9U;F-T:6]N<RP at 9&5L96=A=&5S
M+"!I;G1E<F9A8V5S+"!U;FEO;G,L(&%N9"!!07, at 8V%N)W0 at 8F4@<V5R:6%L
M:7IE9"X-"@T*1F]R(&%R<F%Y<RP@:70@=VEL;"!T<GD@=&\@=W)I=&4@=&AE
M(&)I9V=E<W0 at 8VAU;FMS(&%T(&$@=&EM92!P;W-S:6)L92X@(%-O(&EF('EO
M=2!W<FET92!O=70 at 86X@:6YT6UTL#0IO<B!A;B!36UT@=VAE<F4 at 4R!I<R!A
M('-T<G5C="!T>7!E(&UA<FME9"!A<R!397)I86QI>F5!<T-H=6YK+"!I="!W
M:6QL('=R:71E(&]U="!A;&P@=&AE(&1A=&$@:6X@=&AE#0IA<G)A>2!A="!O
M;F-E+B @3W1H97)W:7-E+"!I="=L;"!W<FET92!O=70@=&AE(&%R<F%Y(&5L
M96UE;G0M8GDM96QE;65N="X-"@T*1F]R('-T<G5C=',L('1H92!F;VQL;W=I
M;F<@;65T:&]D<R!A<F4@=')I960Z#0H),2D at 268@=&AE('-T<G5C="!H87,@
M8F]T:" B=F]I9"!S97)I86QI>F4H4W1R96%M(',I(B!A;F0@(G-T871I8R!4
M(&1E<V5R:6%L:7IE*%-T<F5A;2!S*2(@;65T:&]D<RP-"@D@("!397)I86QI
M>F4O1&5S97)I86QI>F4@=VEL;"!C86QL('1H;W-E+ at T*"3(I($EF('1H92!S
M=')U8W0@:&%S(&$@(F-O;G-T(&)O;VP at 4V5R:6%L:7IE07-#:'5N:R ]('1R
M=64B(&1E8VQA<F%T:6]N(&EN('1H92!S=')U8W0L('1H96X@:70@=VEL; T*
M"2 @('-E<FEA;&EZ92!I;G-T86YC97,@;V8@=&AE('-T<G5C="!A<R!C:'5N
M:W,@;V8@;65M;W)Y+ at T*"3,I($%S(&$@;&%S="!R97-O<G0L(&ET('=I;&P@
M=')Y('1O('=R:71E(&]U="!T:&4@<W1R=6-T(&UE;6)E<BUB>2UM96UB97(N
M("!)9B!T:&4@<W1R=6-T(&AA<R!A;GD-"@D@("!U;FEO;G,@*&5X<&QI8VET
M(&]R(&%N;VYY;6]U<RDL('1H92!S=')U8W0@=VEL;"!N;W0 at 8F4@86)L92!T
M;R!B92!A=71O;6%T:6-A;&QY('-E<FEA;&EZ960L(&%N9 T*"2 @('EO=2!W
M:6QL(&5I=&AE<B!H879E('1O(&UA:V4@:70 at 8VAU;FLM<V5R:6%L:7IA8FQE
M(&]R('!R;W9I9&4 at 8W5S=&]M('-E<FEA;&EZ871I;VX@;65T:&]D<RX-"@T*
M1F]R(&-L87-S97,L(&ET('=I;&P at 97AP96-T(&9O<B!T:&5R92!T;R!B92!C
M=7-T;VT@<V5R:6%L:7IE+V1E<V5R:6%L:7IE(&UE=&AO9',N#0H-"D9O<B!A
M;&P@;W1H97(@='EP97,L(&ET('=I;&P@:G5S="!W<FET92!T:&5M(&]U="X@
M($%L;"!O=&AE<B!T>7!E<R!A<F4 at 86QS;R!C;VYS:61E<F5D(&-H=6YK+7-E
M<FEA;&EZ86)L92P-"G-O(&%R<F%Y<R!O9B!T:&5M('=I;&P at 8F4@<V5R:6%L
M:7IE9"!I;B!O;F4 at 8V%L;"X-"@T*268@>6]U<B!S=')U8W0@;W(@8VQA<W,@
M9&5C;&%R97, at 8W5S=&]M('-E<FEA;&EZ92]D97-E<FEA;&EZ92!M971H;V1S
M+"!I="!M=7-T(&1E8VQA<F4 at 8F]T:"!O<B!N96ET:&5R+ at T*5&AE<V4@;65T
M:&]D<R!M=7-T(&%L=V%Y<R!F;VQL;W<@=&AE(&9O<FTZ#0H-"@EV;VED('-E
M<FEA;&EZ92A3=')E86T@<RD[#0H)<W1A=&EC(%0 at 9&5S97)I86QI>F4H4W1R
M96%M(',I.PT*"0T*=VAE<F4 at 5"!I<R!Y;W5R(&-U<W1O;2!T>7!E+ at T**B\-
M"G9O:60 at 4V5R:6%L:7IE*%0I*%-T<F5A;2!S+"!4('9A;'5E*0T*>PT*"6-O
M;G-T(&UE=&AO9" ](%1Y<&5397)I86QI>F5-971H;V0A*%0I.PT*#0H)<W1A
M=&EC(&EF*&UE=&AO9" ]/2!397)I86QI>F5-971H;V0N26YV86QI9"D-"@E[
M#0H)"7!R86=M82AM<V<L(")%<G)O<CH at 5'EP92 G(B!^(%0N<W1R:6YG;V8@
M?B B)R!C86YN;W0 at 8F4@<V5R:6%L:7IE9"XB*3L-"@D)24Y604Q)1%]465!%
M*"D[#0H)?0T*"65L<V4@<W1A=&EC(&EF*&UE=&AO9" ]/2!397)I86QI>F5-
M971H;V0N5F5C=&]R*0T*"7L-"@D)<W1A=&EC(&EF*&ES*%0@/3T at 9&-H87);
M72D@?'P@:7,H5" ]/2!W8VAA<EM=*2D-"@D)>PT*"0D)8VAA<EM=('-T<B ]
M('5T9BYT;U541C at H=F%L=64I.PT*"0D)<RYW<FET92AS='(N;&5N9W1H*3L-
M"@D)"7,N=W)I=&5%>&%C="AS='(N<'1R+"!C:&%R+G-I>F5O9B J('-T<BYL
M96YG=&@I.PT*"0E]#0H)"65L<V4-"@D)>PT*"0D)<RYW<FET92AV86QU92YL
M96YG=&@I.PT*"0D)<RYW<FET945X86-T*'9A;'5E+G!T<BP@='EP96]F*%1;
M,%TI+G-I>F5O9B J('9A;'5E+FQE;F=T:"D[#0H)"7T-"@E]#0H)96QS92!S
M=&%T:6,@:68H;65T:&]D(#T](%-E<FEA;&EZ94UE=&AO9"Y397%U96YC92D-
M"@E[#0H)"7,N=W)I=&4H=F%L=64N;&5N9W1H*3L-"@T*"0EF;W)E86-H*'8[
M('9A;'5E*0T*"0D)"5-E<FEA;&EZ92AS+"!V*3L-"@E]#0H)96QS92!S=&%T
M:6,@:68H;65T:&]D(#T](%-E<FEA;&EZ94UE=&AO9"Y#=7-T;VTI#0H)>PT*
M"0EV86QU92YS97)I86QI>F4H<RD[#0H)?0T*"65L<V4@<W1A=&EC(&EF*&UE
M=&AO9" ]/2!397)I86QI>F5-971H;V0N5'5P;&4I#0H)>PT*"0EF;W)E86-H
M*&UE;6)E<CL@=F%L=64N='5P;&5O9BD-"@D)"5-E<FEA;&EZ92AS+"!M96UB
M97(I.PT*"7T-"@EE;'-E#0H)>PT*"0ES=&%T:6, at 87-S97)T*&UE=&AO9" ]
M/2!397)I86QI>F5-971H;V0N0VAU;FLL(")397)I86QI>F4B*3L-"@D)<RYW
M<FET945X86-T*"9V86QU92P at 5"YS:7IE;V8I.PT*"7T-"GT-"@T*+R\O(%1H
M92!O<'!O<VET92!O9B!397)I86QI>F4H*2X@(%1H92!S86UE(')U;&5S(&%P
M<&QY(&AE<F4 at 87,@=VET:"!397)I86QI>F4H*2X-"G9O:60 at 1&5S97)I86QI
M>F4H5"DH4W1R96%M(',L(&]U="!4(&1E<W0I#0I[#0H)8V]N<W0@;65T:&]D
M(#T at 5'EP95-E<FEA;&EZ94UE=&AO9"$H5"D[#0H-"@ES=&%T:6,@:68H;65T
M:&]D(#T](%-E<FEA;&EZ94UE=&AO9"Y);G9A;&ED*0T*"7L-"@D)<')A9VUA
M*&US9RP@(D5R<F]R.B!4>7!E("<B('X at 5"YS=')I;F=O9B!^("(G(&-A;FYO
M="!B92!D97-E<FEA;&EZ960N(BD[#0H)"4E.5D%,241?5%E012 at I.PT*"7T-
M"@EE;'-E('-T871I8R!I9BAM971H;V0@/3T at 4V5R:6%L:7IE365T:&]D+E9E
M8W1O<BD-"@E[#0H)"7-I>F5?="!L96X[#0H)"7,N<F5A9"AL96XI.PT*"0D-
M"@D)<W1A=&EC(&EF*&ES*%0@/3T at 9&-H87);72D@?'P@:7,H5" ]/2!W8VAA
M<EM=*2D-"@D)>PT*"0D)8VAA<EM=('-T<B ](&YE=R!C:&%R6VQE;ET[#0H)
M"0ES+G)E861%>&%C="AS='(N<'1R+"!C:&%R+G-I>F5O9B J(&QE;BD[#0H)
M"0D-"@D)"7-T871I8R!I9BAI<RA4(#T](&1C:&%R6UTI*0T*"0D)"61E<W0@
M/2!U=&8N=&]55$8S,BAS='(I.PT*"0D)96QS90T*"0D)"61E<W0@/2!U=&8N
M=&]55$8Q-BAS='(I.PT*"0E]#0H)"65L<V4-"@D)>PT*"0D)9&5S="YL96YG
M=&@@/2!L96X[#0H)"0ES+G)E861%>&%C="AD97-T+G!T<BP@='EP96]F*%1;
M,%TI+G-I>F5O9B J(&1E<W0N;&5N9W1H*3L-"@D)?0T*"7T-"@EE;'-E('-T
M871I8R!I9BAM971H;V0@/3T at 4V5R:6%L:7IE365T:&]D+E-E<75E;F-E*0T*
M"7L-"@D)<VEZ95]T(&QE;CL-"@D)<RYR96%D*&QE;BD[#0H)"61E<W0N;&5N
M9W1H(#T@;&5N.PT*#0H)"69O<F5A8V at H:6YO=70@=CL at 9&5S="D-"@D)"41E
M<V5R:6%L:7IE*',L('8I.PT*"7T-"@EE;'-E('-T871I8R!I9BAM971H;V0@
M/3T at 4V5R:6%L:7IE365T:&]D+D-U<W1O;2D-"@E[#0H)"61E<W0@/2!4+F1E
M<V5R:6%L:7IE*',I.PT*"7T-"@EE;'-E('-T871I8R!I9BAM971H;V0@/3T@
M4V5R:6%L:7IE365T:&]D+E1U<&QE*0T*"7L-"@D)9F]R96%C:"AM96UB97([
M(&1E<W0N='5P;&5O9BD-"@D)"41E<V5R:6%L:7IE*',L(&UE;6)E<BD[#0H)
M?0T*"65L<V4-"@E[#0H)"7-T871I8R!A<W-E<G0H;65T:&]D(#T](%-E<FEA
M;&EZ94UE=&AO9"Y#:'5N:RP@(D1E<V5R:6%L:7IE(BD[#0H)"7,N<F5A9$5X
<86-T*"9D97-T+"!4+G-I>F5O9BD[#0H)?0T*?0``
`
end
More information about the Digitalmars-d-learn
mailing list