@@ -41,8 +41,8 @@ pub struct Node {
4141 pub ( crate ) properties : Vec < Property > ,
4242 /// 属性名到索引的映射(用于快速查找)
4343 pub ( crate ) prop_cache : BTreeMap < String , usize > ,
44- pub ( crate ) children : Vec < Node > ,
45- pub ( crate ) name_cache : BTreeMap < String , usize > ,
44+ children : Vec < Node > ,
45+ name_cache : BTreeMap < String , usize > ,
4646}
4747
4848impl Node {
@@ -64,8 +64,8 @@ impl Node {
6464 self . properties . iter ( )
6565 }
6666
67- pub fn children ( & self ) -> impl Iterator < Item = & Node > {
68- self . children . iter ( )
67+ pub fn children ( & self ) -> & [ Node ] {
68+ & self . children
6969 }
7070
7171 pub fn children_mut ( & mut self ) -> impl Iterator < Item = & mut Node > {
@@ -87,27 +87,41 @@ impl Node {
8787
8888 pub fn get_child ( & self , name : & str ) -> Option < & Node > {
8989 if let Some ( & index) = self . name_cache . get ( name) {
90- self . children . get ( index)
91- } else {
92- None
90+ if let Some ( child ) = self . children . get ( index) {
91+ return Some ( child ) ;
92+ }
9393 }
94+
95+ // Fallback if the cache is stale
96+ self . children . iter ( ) . find ( |c| c. name == name)
9497 }
9598
9699 pub fn get_child_mut ( & mut self , name : & str ) -> Option < & mut Node > {
97100 if let Some ( & index) = self . name_cache . get ( name) {
98- self . children . get_mut ( index )
99- } else {
100- None
101+ if index < self . children . len ( ) && self . children [ index ] . name == name {
102+ return self . children . get_mut ( index ) ;
103+ }
101104 }
105+
106+ // Cache miss or mismatch: search and rebuild cache to keep indices in sync
107+ let pos = self . children . iter ( ) . position ( |c| c. name == name) ?;
108+ self . rebuild_name_cache ( ) ;
109+ self . children . get_mut ( pos)
102110 }
103111
104112 pub fn remove_child ( & mut self , name : & str ) -> Option < Node > {
105- if let Some ( & index) = self . name_cache . get ( name) {
106- self . name_cache . remove ( name) ;
107- Some ( self . children . remove ( index) )
108- } else {
109- None
110- }
113+ let index = self
114+ . name_cache
115+ . get ( name)
116+ . copied ( )
117+ . filter ( |& idx| self . children . get ( idx) . map ( |c| c. name . as_str ( ) ) == Some ( name) )
118+ . or_else ( || self . children . iter ( ) . position ( |c| c. name == name) ) ;
119+
120+ let Some ( idx) = index else { return None } ;
121+
122+ let removed = self . children . remove ( idx) ;
123+ self . rebuild_name_cache ( ) ;
124+ Some ( removed)
111125 }
112126
113127 pub fn set_property ( & mut self , prop : Property ) {
@@ -208,6 +222,13 @@ impl Node {
208222 Some ( entries)
209223 }
210224
225+ fn rebuild_name_cache ( & mut self ) {
226+ self . name_cache . clear ( ) ;
227+ for ( idx, child) in self . children . iter ( ) . enumerate ( ) {
228+ self . name_cache . insert ( child. name . clone ( ) , idx) ;
229+ }
230+ }
231+
211232 pub fn compatible ( & self ) -> Option < StrIter < ' _ > > {
212233 let prop = self . get_property ( "compatible" ) ?;
213234 Some ( prop. as_str_iter ( ) )
@@ -259,11 +280,10 @@ impl Node {
259280 if parts. is_empty ( ) {
260281 return Err ( fdt_raw:: FdtError :: InvalidInput ) ;
261282 }
262-
263283 if parts. len ( ) == 1 {
264284 // 删除直接子节点(精确匹配)
265285 let child_name = parts[ 0 ] ;
266- Ok ( self . remove_child_exact ( child_name) )
286+ Ok ( self . remove_child ( child_name) )
267287 } else {
268288 // 需要递归到父节点进行删除
269289 self . remove_child_recursive ( & parts, 0 )
@@ -280,7 +300,7 @@ impl Node {
280300 if index >= parts. len ( ) - 1 {
281301 // 已经到达要删除节点的父级
282302 let child_name_to_remove = parts[ index] ;
283- Ok ( self . remove_child_exact ( child_name_to_remove) )
303+ Ok ( self . remove_child ( child_name_to_remove) )
284304 } else {
285305 // 继续向下递归
286306 let current_part = parts[ index] ;
@@ -294,17 +314,6 @@ impl Node {
294314 }
295315 }
296316 }
297-
298- /// 精确删除子节点,不支持部分匹配
299- fn remove_child_exact ( & mut self , name : & str ) -> Option < Node > {
300- if let Some ( & index) = self . name_cache . get ( name) {
301- let child = self . children . remove ( index) ;
302- self . name_cache . remove ( name) ;
303- Some ( child)
304- } else {
305- None
306- }
307- }
308317}
309318
310319impl From < & fdt_raw:: Node < ' _ > > for Node {
0 commit comments