www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.dtl - tree node mixin template

reply "Andrew Fedoniouk" <news terrainformatica.com> writes:
(ATTN:not tested heavily)

If somebody wants to implement tree alike structure then this (on the clip) 
will help

Beside other features it has three opApply "enumerators":

Node parent = ...;

foreach(Node n; parent.forward) // all children from first to last
foreach(Node n; parent.backward) // all children from last to first
foreach(Node n; parent.deep) // all descendants - children and their 
children

Hope it will be useful.

Andrew Fedoniouk.
http://terrainformatica.com





begin 666 tree.d
M;6]D=6QE('1O;VPN=')E93L-" T*+R]\#0HO+WP =')E92!N;V1E('!R:6UI
M=&EV97,-"B\O?"!!=71H;W(Z($%N9')E=R!&961O;FEO=6L 0"!T97)R86EN
M9F]R;6%T:6-A+F-O;0T*#0HO+WP-"B\O?"!T<F5E7V5L96UE;G0 +2!M:7AI
M;B!T96UP;&%T92 M(&EM<&QE;65T871I;VX-"B\O?"!O9B!T<F5E(&YO9&4-
M"B\O? T*=&5M<&QA=&4 =')E95]E;&5M96YT*$Y/1$4I( T*>PT*("  ($Y/
M1$4 7W!A<F5N=#L-"B  ("!.3T1%(%]N97AT.PT*("  ($Y/1$4 7W!R978[
M#0H ("  3D]$12!?9FER<W1C:&EL9#L-" T*("  ('9O:60 =')E95]E;&5M
M96YT7VEN:71I86QI>F4H*2![(%]N97AT(#T 7W!R978 /2!T:&ES.R!]#0I]
M#0H-"B\O? T*+R]\(&%C8V5S<R!M971H;V1S+W!R;W!E<G1I97, ;&EK96QY
M('1O(&)E('!U8FQI8PT*+R]\( T*=&5M<&QA=&4 =')E95]E;&5M96YT7VUE
M=&AO9',H3D]$12D #0I[#0H ("  8F]O;"!D971A8VAE9" I('L <F5T=7)N
M("A?<&%R96YT(&ES(&YU;&PI.R!]#0H ("  8F]O;"!A='1A8VAE9" I('L 
M<F5T=7)N("$H7W!A<F5N="!I<R!N=6QL*3L ?0T*#0H ("  +R\ <VEB;&EN
M9R!O<',-"B  ("!.3T1%(&YE>'13:6)L:6YG*"D ('L <F5T=7)N("A?<&%R
M96YT(&ES(&YU;&PI/R!N=6QL.B H=&AI<R!I<R!?<&%R96YT+FQA<W1#:&EL
M9" I/R!N=6QL.B!?;F5X="D[('T-"B  ("!.3T1%('!R9793:6)L:6YG*"D 
M('L <F5T=7)N("A?<&%R96YT(&ES(&YU;&PI/R!N=6QL.B H=&AI<R!I<R!?
M<&%R96YT+F9I<G-T0VAI;&0H*3\ ;G5L;#H 7W!R978I.R!]#0H ("  3D]$
M12!F:7)S=%-I8FQI;F<H*2![(')E='5R;B!?<&%R96YT(&ES(&YU;&P_(&YU
M;&PZ(%]P87)E;G0N9FER<W1#:&EL9" I.R!]#0H ("  3D]$12!L87-T4VEB
M;&EN9R I("![(')E='5R;B!?<&%R96YT(&ES(&YU;&P_(&YU;&PZ(%]P87)E
M;G0N;&%S=$-H:6QD*"D[('T-" T*("  ("\O(&QI;FL =&AI<R!A9G1E<B!.
M3T1%("=A9G1E<B<-"B  ("!V;VED(&QI;FM!9G1E<BA.3T1%(&%F=&5R*2![
M( T*("  ("  ("!U;FQI;FLH*3L #0H ("  ("  ("A?;F5X=" ](&%F=&5R
M+E]N97AT*2Y?<')E=B ]('1H:7,[("A?<')E=B ](&%F=&5R*2Y?;F5X=" ]
M('1H:7,[(" -"B  ("  ("  7W!A<F5N=" ](&%F=&5R+E]P87)E;G0[#0H 
M("  ?0T*("  ("\O(&QI;FL =&AI<R!B969O<F4 3D]$12 G8F5F;W)E)R -
M"B  ("!V;VED(&QI;FM"969O<F4H3D]$12!B969O<F4I( T*("  ('L #0H 
M("  ("  ('5N;&EN:R I.PT*("  ("  (" H7W!R978 /2!B969O<F4N7W!R
M978I+E]N97AT(#T =&AI<SL *%]N97AT(#T 8F5F;W)E*2Y?<')E=B ]('1H
M:7,[( T*("  ("  ("!?<&%R96YT(#T 8F5F;W)E+E]P87)E;G0[#0H ("  
M?0T*("  ("\O('5N;&EN:R!T:&ES(&9R;VT :71S('1R964 (" -"B  ("!V
M;VED('5N;&EN:R I( T*("  ('L #0H ("  ("  (&EF*%]P87)E;G0 (3T]
M(&YU;&P )B8 7W!A<F5N="Y?9FER<W1C:&EL9" ]/3T =&AI<RD #0H ("  
M("  ('L-"B  ("  ("  ("!I9B H7VYE>'0 /3T]('1H:7,I("8F("A?<')E
M=B ]/3T =&AI<RDI("\O('1H92!O;FQY(&-H:6QD#0H ("  ("  ("  ("!?
M<&%R96YT+E]F:7)S=&-H:6QD(#T ;G5L;#L-"B  ("  ("  ("!E;'-E#0H 
M("  ("  ("  ("!?<&%R96YT+E]F:7)S=&-H:6QD(#T 7W!A<F5N="Y?9FER
M<W1C:&EL9"Y?;F5X=#L-"B  ("  ("  ?0T*("  ("  ("!?<')E=BY?;F5X
M=" ](%]N97AT.R!?;F5X="Y?<')E=B ](%]P<F5V.R!?<&%R96YT(#T ;G5L
M;#L #0H ("  ?0T*("  ( T*("  ("\O(&-H:6QD<F5N(&]P<PT*("  (&)O
M;VP :&%S0VAI;&1R96XH*2![(')E='5R;B!?9FER<W1C:&EL9" A/3T ;G5L
M;#L ?0T*("  ( T*("  ($Y/1$4 9FER<W1#:&EL9" I('L <F5T=7)N(%]F
M:7)S=&-H:6QD.R!]#0H ("  3D]$12!L87-T0VAI;&0H*2  >R!R971U<FX 
M7V9I<G-T8VAI;&0 :7, ;G5L;#\ ;G5L;#H 7V9I<G-T8VAI;&0N7W!R978[
M('T-"B  (" -"B  (" O+R!A<'!E;F0 ;F5W0VAI;&0 86YD(&UA:V4 :70 
M;&%S= T*("  ('9O:60 <'5S:$-H:6QD*"!.3T1%(&YE=T-H:6QD("D-"B  
M("![#0H ("  ("!I9BA?9FER<W1C:&EL9" A/3T ;G5L;"D #0H ("  ("  
M(&YE=T-H:6QD+FQI;FM!9G1E<B  7V9I<G-T8VAI;&0N7W!R978 *3L #0H 
M("  ("!E;'-E( T*("  ("  >PT*("  ("  ("!N97=#:&EL9"YU;FQI;FLH
M*3L-"B  ("  ("  7V9I<G-T8VAI;&0 /2!N97=#:&EL9#L-"B  ("  ("  
M;F5W0VAI;&0N7W!A<F5N=" ]('1H:7,[#0H ("  ("!]#0H ("  ?0T*("  
M("\O('5N;&EN:R!L87-T(&-H:6QD(&%N9"!R971U<FX :70-"B  ("!.3T1%
M('!O<$-H:6QD*"  *0T*("  ('L-"B  ("  ($Y/1$4 ;B ](&QA<W1#:&EL
M9" I.PT*("  ("  :68H;B ]/3T ;G5L;"D <F5T=7)N(&YU;&P[#0H ("  
M("!N+G5N;&EN:R I.PT*("  ("  <F5T=7)N(&X[#0H ("  ?2  (" -" T*
M("  ("\O(&1E=&5R;6EN92!I9B G=&AI<R< :7, 86X 86YC97-T;W( *'!A
M<F5N="P <')O8F%B;'D ;F]T(&EM;65D:6%T92D ;V8 #0H ("  +R\ 3D]$
M12 G;B<-"B  ("!B;V]L(&ES06YC97-T;W)/9BA.3T1%(&XI#0H ("  >PT*
M("  ("  :68H(&X /3T](&YU;&P *0T*("  ("  ("!R971U<FX 9F%L<V4[
M#0H ("  ("!F;W(H;B ](&XN7W!A<F5N=#L ;B A/3T ;G5L;#L ;B ](&XN
M7W!A<F5N="D #0H ("  ("  (&EF*"!N(&ES('1H:7, *2!R971U<FX =')U
M93L-"B  ("  (')E='5R;B!F86QS93L-"B  ("!]#0H-"B  (" O+R!F:6YD
M(&-O;6UO;B!P87)E;G0 *&EF(&%N>2D ;V8 ='=O(&YO9&5S( T*("  ('-T
M871I8R!.3T1%(&-O;6UO;D%N8V5S=&]R*$Y/1$4 =S$L3D]$12!W,BD-"B  
M("![#0H ("  ("!.3T1%('<[#0H-"B  ("  ($Y/1$4 =#%;73L =#$N;&5N
M9W1H(#T ,38[('0Q+FQE;F=T:" ](# [#0H ("  ("!.3T1%('0R6UT[('0R
M+FQE;F=T:" ](#$V.R!T,BYL96YG=&  /2 P.PT*#0H)"2  +R\ 8G5I;&0 
M3D]$12!S=&%C:R Q( T*"0D (&9O<BAW(#T =S$[('< (3T](&YU;&P[('< 
M/2!W+E]P87)E;G0I('0Q('X]('<[#0H)"2  =#$N<F5V97)S93L-" D)(" O
M+R!B=6EL9"!.3T1%('-T86-K(#(-" D)("!F;W(H=R ]('<R.R!W("$]/2!N
M=6QL.R!W(#T =RY?<&%R96YT*2!T,B!^/2!W.PT*"0D ('0R+G)E=F5R<V4[
M#0H)"2  :6YT(&T /2!T,2YL96YG=&  /"!T,BYL96YG=& _('0Q+FQE;F=T
M:#IT,BYL96YG=& [#0H ("  (" O+R!W(&ES(&YU;&P 870 =&AI<R!P;VEN
M= T*"0D (&9O<BAI;G0 :2 ](# [(&D /"!M.R K*VD *0T*"0D ('L #0H)
M"0D (&EF*"!T,5MI72 A/3T =#);:5T *2!B<F5A:SL-" D)"2  =R ]('0Q
M6VE=.PT*"0D ('T-" D)("!R971U<FX =SL-" D ('T-"GT-" T*+R]\#0HO
M+WP 86-C97-S(&UE=&AO9',O<')O<&5R=&EE<R!L:6ME;'D =&\ 8F4 <'5B
M;&EC#0HO+WP #0IT96UP;&%T92!T<F5E7V5L96UE;G1?<&%R96YT*$Y/1$4I
M( T*>PT*("  ($Y/1$4 <&%R96YT*"D ("![(')E='5R;B!?<&%R96YT.R!]
M#0I]#0H-"B\O? T*+R]\(&UI>"!T:&ES(&EN(&EF('EO=2!W86YT('1O('EO
M=7(-"B\O?"!N;V1E(&)E(")E;G5M<F5T86)L92( =7-I;F< 9F]R96%C: T*
M+R]\(&]N07!P;'D +2!W86QK<R!T:')O=6=H(&%L;"!C:&EL9')E; T*+R]\
M(&]F('1H92!N;V1E#0HO+WP-" T*+R]\('5S92!A<R Z#0HO+WP ("  3D]$
M12!W.R -"B\O?"  ("!F;W)E86-H("A.3T1%('=C.R!W+F9O<G=A<F0I('LN
M+BXN?0T*#0H-"G1E;7!L871E('1R965?96QE;65N=%]F;W)W87)D7V]P07!P
M;'DH3D]$12D #0I[#0H ("  <W1R=6-T($9O<G=A<F1786QK97(-"B  ("![
M#0H ("  ("!.3T1%(%]P87)E;G1?;F]D93L-"B  ("  (&EN="!O<$%P<&QY
M*&EN="!D96QE9V%T92AI;F]U="!.3T1%*2!D9RD-"B  ("  ('L (" -"B  
M("  ("  :6YT(')E<W5L=" ](# [#0H ("  ("  (&EF*%]P87)E;G1?;F]D
M92Y?9FER<W1C:&EL9"!I<R!N=6QL*0T*("  ("  ("  (')E='5R;B!R97-U
M;'0[#0H ("  ("  ($Y/1$4 ;B ](%]P87)E;G1?;F]D92Y?9FER<W1C:&EL
M9#L #0H ("  ("  (&1O('L-"B  ("  ("  ("!R97-U;'0 /2!D9RAN*3L-
M"B  ("  ("  ("!I9B H<F5S=6QT*0EB<F5A:SL-"B  ("  ("  ("!N(#T 
M;BY?;F5X=#L-"B  ("  ("  ?2!W:&EL92 H("$H;B!I<R!?<&%R96YT7VYO
M9&4N7V9I<G-T8VAI;&0I("D-"B  ("  ("  <F5T=7)N(')E<W5L=#L-"B  
M("  ('T-"B  ("!]#0H ("  1F]R=V%R9%=A;&ME<B!F;W)W87)D*"D >R!&
M;W)W87)D5V%L:V5R(&$[(&$N7W!A<F5N=%]N;V1E(#T =&AI<SL <F5T=7)N
M(&$[('T-"GT-" T*+R\ =&AE('-A;64 8G5T('=A;&MS(&9R;VT ;&%S="!C
M:&EL9"!T;R!F:7)S= T*=&5M<&QA=&4 =')E95]E;&5M96YT7V)A8VMW87)D
M7V]P07!P;'DH3D]$12D #0I[#0H ("  <W1R=6-T($)A8VMW87)D5V%L:V5R
M#0H ("  >PT*("  ("  3D]$12!?<&%R96YT7VYO9&4[#0H ("  ("!I;G0 
M;W!!<'!L>2AI;G0 9&5L96=A=&4H:6YO=70 3D]$12D 9&<I#0H ("  ("![
M("  #0H ("  ("  (&EN="!R97-U;'0 /2 P.PT*("  ("  ("!I9BA?<&%R
M96YT7VYO9&4N7V9I<G-T8VAI;&0 :7, ;G5L;"D-"B  ("  ("  ("!R971U
M<FX <F5S=6QT.PT*("  ("  ("!.3T1%(&X /2!?<&%R96YT7VYO9&4N7V9I
M<G-T8VAI;&0[( T*("  ("  ("!D;R![#0H ("  ("  ("  ;B ](&XN7W!R
M978[#0H)("  ("  ("!R97-U;'0 /2!D9RAN*3L-" D)("  ("  :68 *')E
M<W5L="D)8G)E86L[#0H ("  ("  ('T =VAI;&4 *" A*&X :7, 7W!A<F5N
M=%]N;V1E+E]F:7)S=&-H:6QD*2 I#0H)"2  ("!R971U<FX <F5S=6QT.PT*
M("  ("  ?0T*("  ('T-"B  ("!"86-K=V%R9%=A;&ME<B!B86-K=V%R9" I
M('L 0F%C:W=A<F1786QK97( 83L 82Y?<&%R96YT7VYO9&4 /2!T:&ES.R!R
M971U<FX 83L ?0T*?0T*#0HO+WP-"B\O?"!A;&P 9&5S8V5N9&%N=', *&1E
M97 I(&9O<G=A<F0 =V%L:V5R#0HO+WP-" T*=&5M<&QA=&4 =')E95]E;&5M
M96YT7V1E97!?;W!!<'!L>2A.3T1%*0T*>PT*("  ("\O('=A;&L =&AR;W5G
M:"!A;&P 9&5S8V5N9&%N=', *&-H:6QD<F5N(&%N9"!T:&5I<B!C:&EL9')E
M;BD :6X =&AE('1R964-"B  ("!P<F]T96-T960 :6YT(&%P<&QY1&5E<"AI
M;G0 9&5L96=A=&4H:6YO=70 3D]$12D 9&<I( T*("  ('L ( T*("  ("  
M:6YT(')E<W5L=" ](# [#0H ("  ("!I9BA?9FER<W1C:&EL9"!I<R!N=6QL
M*0T*("  ("  ("!R971U<FX <F5S=6QT.PT*("  ("  3D]$12!N(#T 7V9I
M<G-T8VAI;&0[( T*("  ("  9&\ >PT*"2  ("  (')E<W5L=" ](&1G*&XI
M.PT*"0D ("  :68 *')E<W5L="D 8G)E86L[#0H ("  ("  (')E<W5L=" ]
M(&XN87!P;'E$965P*&1G*3L-"B  ("  ("  :68 *')E<W5L="D 8G)E86L[
M#0H ("  ("  (&X /2!N+E]N97AT.PT*("  ("  ?2!W:&EL92 H("$H;B!I
M<R!?9FER<W1C:&EL9"D *0T*"0D (')E='5R;B!R97-U;'0[#0H ("  ?0T*
M#0H ("  <W1R=6-T($1E97!786QK97(-"B  ("![#0H ("  ("!.3T1%(%]P
M87)E;G1?;F]D93L-"B  ("  (&EN="!O<$%P<&QY*&EN="!D96QE9V%T92AI
M;F]U="!.3T1%*2!D9RD >R  <F5T=7)N(&%P<&QY1&5E<"AD9RD[("!]#0H 
M("  ?0T*("  ($1E97!786QK97( 9&5E<" I('L 1&5E<%=A;&ME<B!A.R!A
J+E]P87)E;G1?;F]D92 ]('1H:7,[(')E='5R;B!A.R!]#0I]#0H-" T*
`
end
Mar 12 2005
parent reply Ben Hinkle <Ben_member pathlink.com> writes:
In article <d10nld$1e58$1 digitaldaemon.com>, Andrew Fedoniouk says...
(ATTN:not tested heavily)

If somebody wants to implement tree alike structure then this (on the clip) 
will help

Beside other features it has three opApply "enumerators":

Node parent = ...;

foreach(Node n; parent.forward) // all children from first to last
foreach(Node n; parent.backward) // all children from last to first
foreach(Node n; parent.deep) // all descendants - children and their 
children

Hope it will be useful.
Very nice! I like the nested struct mixin for the custom foreach, too. I think I'll borrow that idea for MinTL (which currently has the structs at the top level).
Mar 13 2005
parent "Andrew Fedoniouk" <news terrainformatica.com> writes:
Yep. That was my initial test drive of mixins.
They are useful indeed.
Assigning names to the "inclusion points" is extremely nice.

"custom foreach" : if I understand Walter idea about structs clearly
then they should work as fast as "plain foreach".

Having defined "forward foreach" I am implicitly defining
visiting order. As far as I can see from D definition
there is no order specified in foreach implementations for
standard collections.

Andrew.


"Ben Hinkle" <Ben_member pathlink.com> wrote in message 
news:d11rlq$2gss$1 digitaldaemon.com...
 In article <d10nld$1e58$1 digitaldaemon.com>, Andrew Fedoniouk says...
(ATTN:not tested heavily)

If somebody wants to implement tree alike structure then this (on the 
clip)
will help

Beside other features it has three opApply "enumerators":

Node parent = ...;

foreach(Node n; parent.forward) // all children from first to last
foreach(Node n; parent.backward) // all children from last to first
foreach(Node n; parent.deep) // all descendants - children and their
children

Hope it will be useful.
Very nice! I like the nested struct mixin for the custom foreach, too. I think I'll borrow that idea for MinTL (which currently has the structs at the top level).
Mar 13 2005