Skip to content

Commit ae81000

Browse files
committed
refactor: NodeSeq as a wrapper of GroupDeserializer
Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
1 parent 04c6f76 commit ae81000

File tree

2 files changed

+25
-28
lines changed

2 files changed

+25
-28
lines changed

src/de_mut/group.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
use serde::de;
33

44
#[allow(unused)]
5+
#[derive(Clone, Copy)]
56
pub(super) struct GroupDeserializer<'de> {
67
pub dtb: RefDtb<'de>,
78
pub cursor: GroupCursor,

src/de_mut/node_seq.rs

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use 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};
34
use serde::{de, Deserialize};
45

56
/// 一组名字以 `@...` 区分,同类、同级且连续的节点的映射。
@@ -8,11 +9,7 @@ use serde::{de, Deserialize};
89
/// 因此这些节点将延迟解析。
910
/// 迭代 `NodeSeq` 可获得一系列 [`NodeSeqItem`],再调用 `deserialize` 方法分别解析每个节点。
1011
pub 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

7673
impl<'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

128121
impl 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

134129
impl<'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

Comments
 (0)