11use super :: { BodyCursor , GroupCursor , RefDtb , RegConfig , StructDeserializer } ;
2- use core:: { fmt:: Debug , marker:: PhantomData , mem:: MaybeUninit } ;
2+ use crate :: de_mut:: GroupDeserializer ;
3+ use core:: { fmt:: Debug , marker:: PhantomData } ;
34use serde:: { de, Deserialize } ;
45
56/// 一组名字以 `@...` 区分,同类、同级且连续的节点的映射。
@@ -8,11 +9,7 @@ use serde::{de, Deserialize};
89/// 因此这些节点将延迟解析。
910/// 迭代 `NodeSeq` 可获得一系列 [`NodeSeqItem`],再调用 `deserialize` 方法分别解析每个节点。
1011pub struct NodeSeq < ' de > {
11- dtb : RefDtb < ' de > ,
12- reg : RegConfig ,
13- cursor : GroupCursor ,
14- len_item : usize ,
15- len_name : usize ,
12+ inner : GroupDeserializer < ' de > ,
1613}
1714
1815/// 连续节点迭代器。
@@ -52,7 +49,7 @@ impl<'de, 'b> Deserialize<'de> for NodeSeq<'b> {
5249 {
5350 // 结构体转为内存切片,然后拷贝过来
5451 if v. len ( ) == core:: mem:: size_of :: < Self :: Value > ( ) {
55- Ok ( Self :: Value :: from_raw_parts ( v. as_ptr ( ) ) )
52+ Ok ( Self :: Value :: from_raw_inner_parts ( v. as_ptr ( ) ) )
5653 } else {
5754 Err ( E :: invalid_length (
5855 v. len ( ) ,
@@ -74,25 +71,21 @@ impl<'de, 'b> Deserialize<'de> for NodeSeq<'b> {
7471}
7572
7673impl < ' de > NodeSeq < ' de > {
77- fn from_raw_parts ( ptr : * const u8 ) -> Self {
74+ fn from_raw_inner_parts ( ptr : * const u8 ) -> Self {
7875 // 直接从指针拷贝
79- let res = unsafe {
80- let mut res = MaybeUninit :: < Self > :: uninit ( ) ;
81- core:: ptr:: copy_nonoverlapping (
82- ptr,
83- res. as_mut_ptr ( ) as * mut _ ,
84- core:: mem:: size_of :: < Self > ( ) ,
85- ) ;
86- res. assume_init ( )
87- } ;
88- // 初始化
89- res. cursor . init_on ( res. dtb , res. len_item , res. len_name ) ;
76+ let original_inner = unsafe { & * ( ptr as * const GroupDeserializer < ' _ > ) } ;
77+ let res = Self {
78+ inner : original_inner. clone ( ) ,
79+ } ; // 初始化
80+ res. inner
81+ . cursor
82+ . init_on ( res. inner . dtb , res. inner . len_item , res. inner . len_name ) ;
9083 res
9184 }
9285
9386 /// 连续节点总数。
9487 pub const fn len ( & self ) -> usize {
95- self . len_item
88+ self . inner . len_item
9689 }
9790
9891 /// 如果连续节点数量为零,返回 true。但连续节点数量不可能为零。
@@ -104,7 +97,7 @@ impl<'de> NodeSeq<'de> {
10497 pub const fn iter < ' b > ( & ' b self ) -> NodeSeqIter < ' de , ' b > {
10598 NodeSeqIter {
10699 seq : self ,
107- cursor : self . cursor ,
100+ cursor : self . inner . cursor ,
108101 i : 0 ,
109102 }
110103 }
@@ -127,26 +120,29 @@ impl Debug for NodeSeq<'_> {
127120
128121impl Drop for NodeSeq < ' _ > {
129122 fn drop ( & mut self ) {
130- self . cursor . drop_on ( self . dtb , self . len_item ) ;
123+ self . inner
124+ . cursor
125+ . drop_on ( self . inner . dtb , self . inner . len_item ) ;
131126 }
132127}
133128
134129impl < ' de , ' b > Iterator for NodeSeqIter < ' de , ' b > {
135130 type Item = NodeSeqItem < ' de > ;
136131
137132 fn next ( & mut self ) -> Option < Self :: Item > {
138- if self . i >= self . seq . len_item {
133+ if self . i >= self . seq . inner . len_item {
139134 None
140135 } else {
141136 self . i += 1 ;
142- let ( name, body) = self . cursor . name_on ( self . seq . dtb ) ;
143- let off_next = self . cursor . offset_on ( self . seq . dtb ) ;
137+ let dtb = self . seq . inner . dtb ;
138+ let ( name, body) = self . cursor . name_on ( dtb) ;
139+ let off_next = self . cursor . offset_on ( dtb) ;
144140 self . cursor . step_n ( off_next) ;
145141 Some ( Self :: Item {
146- dtb : self . seq . dtb ,
147- reg : self . seq . reg ,
142+ dtb,
143+ reg : self . seq . inner . reg ,
148144 body,
149- at : unsafe { core:: str:: from_utf8_unchecked ( & name[ self . seq . len_name + 1 ..] ) } ,
145+ at : unsafe { core:: str:: from_utf8_unchecked ( & name[ self . seq . inner . len_name + 1 ..] ) } ,
150146 } )
151147 }
152148 }
0 commit comments