@@ -18,7 +18,7 @@ pub struct Node<'de> {
1818/// 节点迭代器。
1919pub struct NodeIter < ' de , ' b > {
2020 node : & ' b Node < ' de > ,
21- cursor : BodyCursor ,
21+ cursor : Option < BodyCursor > ,
2222 i : usize ,
2323}
2424
@@ -33,7 +33,7 @@ pub struct NodeItem<'de> {
3333/// 属性迭代器。
3434pub struct PropIter < ' de , ' b > {
3535 node : & ' b Node < ' de > ,
36- cursor : BodyCursor ,
36+ cursor : Option < BodyCursor > ,
3737 i : usize ,
3838}
3939
@@ -50,52 +50,48 @@ pub struct PropItem<'de> {
5050impl < ' de > Node < ' de > {
5151 // TODO: Maybe use BTreeMap when have alloc
5252 /// 获得节点迭代器。
53- pub fn nodes < ' b > ( & ' b self ) -> Option < NodeIter < ' de , ' b > > {
54- self . nodes_start . map ( |node_cursor| NodeIter {
53+ pub fn nodes < ' b > ( & ' b self ) -> NodeIter < ' de , ' b > {
54+ NodeIter {
5555 node : self ,
56- cursor : node_cursor ,
56+ cursor : self . nodes_start ,
5757 i : 0 ,
58- } )
58+ }
5959 }
6060
6161 /// 获得属性迭代器。
62- pub fn props < ' b > ( & ' b self ) -> Option < PropIter < ' de , ' b > > {
63- self . props_start . map ( |node_cursor| PropIter {
62+ pub fn props < ' b > ( & ' b self ) -> PropIter < ' de , ' b > {
63+ PropIter {
6464 node : self ,
65- cursor : node_cursor ,
65+ cursor : self . props_start ,
6666 i : 0 ,
67- } )
67+ }
6868 }
6969}
7070
7171impl Debug for Node < ' _ > {
7272 fn fmt ( & self , f : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
7373 let props = self . props ( ) ;
7474 write ! ( f, "Props: [" ) ?;
75- if let Some ( s) = props {
76- let mut first_written = true ;
77- for prop in s {
78- if first_written {
79- write ! ( f, "\" {}\" " , prop. get_name( ) ) ?;
80- first_written = false ;
81- } else {
82- write ! ( f, ",\" {}\" " , prop. get_name( ) ) ?;
83- }
75+ let mut first_written = true ;
76+ for prop in props {
77+ if first_written {
78+ write ! ( f, "\" {}\" " , prop. get_name( ) ) ?;
79+ first_written = false ;
80+ } else {
81+ write ! ( f, ",\" {}\" " , prop. get_name( ) ) ?;
8482 }
8583 }
8684 writeln ! ( f, "]" ) ?;
8785
8886 let children = self . nodes ( ) ;
8987 write ! ( f, "Children: [" ) ?;
90- if let Some ( s) = children {
91- let mut first_written = true ;
92- for child in s {
93- if first_written {
94- write ! ( f, "\" {}\" " , child. get_full_name( ) ) ?;
95- first_written = false ;
96- } else {
97- write ! ( f, ",\" {}\" " , child. get_full_name( ) ) ?;
98- }
88+ let mut first_written = true ;
89+ for child in children {
90+ if first_written {
91+ write ! ( f, "\" {}\" " , child. get_full_name( ) ) ?;
92+ first_written = false ;
93+ } else {
94+ write ! ( f, ",\" {}\" " , child. get_full_name( ) ) ?;
9995 }
10096 }
10197 writeln ! ( f, "]" ) ?;
@@ -108,19 +104,23 @@ impl<'de> Iterator for NodeIter<'de, '_> {
108104 type Item = NodeItem < ' de > ;
109105
110106 fn next ( & mut self ) -> Option < Self :: Item > {
111- self . i += 1 ;
112- let dtb = self . node . dtb ;
113- if let Cursor :: Title ( c) = self . cursor . move_on ( dtb) {
114- let ( name, _) = c. split_on ( dtb) ;
115- let ( node_cursor, next) = c. take_node_on ( dtb, name) ;
116- let res = Some ( Self :: Item {
117- dtb,
118- reg : self . node . reg ,
119- node : node_cursor,
120- name,
121- } ) ;
122- self . cursor = next;
123- res
107+ if let Some ( ref mut cursor) = self . cursor {
108+ self . i += 1 ;
109+ let dtb = self . node . dtb ;
110+ if let Cursor :: Title ( c) = cursor. move_on ( dtb) {
111+ let ( name, _) = c. split_on ( dtb) ;
112+ let ( node_cursor, next) = c. take_node_on ( dtb, name) ;
113+ let res = Some ( Self :: Item {
114+ dtb,
115+ reg : self . node . reg ,
116+ node : node_cursor,
117+ name,
118+ } ) ;
119+ * cursor = next;
120+ res
121+ } else {
122+ None
123+ }
124124 } else {
125125 None
126126 }
@@ -131,19 +131,23 @@ impl<'de> Iterator for PropIter<'de, '_> {
131131 type Item = PropItem < ' de > ;
132132
133133 fn next ( & mut self ) -> Option < Self :: Item > {
134- self . i += 1 ;
135- let dtb = self . node . dtb ;
136- if let Cursor :: Prop ( c) = self . cursor . move_on ( dtb) {
137- let ( name, next) = c. name_on ( dtb) ;
138- let res = Some ( Self :: Item {
139- dtb,
140- body : self . cursor ,
141- reg : self . node . reg ,
142- prop : c,
143- name,
144- } ) ;
145- self . cursor = next;
146- res
134+ if let Some ( ref mut cursor) = self . cursor {
135+ self . i += 1 ;
136+ let dtb = self . node . dtb ;
137+ if let Cursor :: Prop ( c) = cursor. move_on ( dtb) {
138+ let ( name, next) = c. name_on ( dtb) ;
139+ let res = Some ( Self :: Item {
140+ dtb,
141+ body : * cursor,
142+ reg : self . node . reg ,
143+ prop : c,
144+ name,
145+ } ) ;
146+ * cursor = next;
147+ res
148+ } else {
149+ None
150+ }
147151 } else {
148152 None
149153 }
0 commit comments