Skip to content

Commit 6b98e91

Browse files
committed
refactor: rewrite NodeSeq
Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
1 parent 55143de commit 6b98e91

File tree

9 files changed

+177
-421
lines changed

9 files changed

+177
-421
lines changed

src/de_mut/cursor.rs

Lines changed: 3 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ pub(super) struct AnyCursor<T: Type = Body>(usize, PhantomData<T>);
77

88
pub(super) type BodyCursor = AnyCursor<Body>;
99
pub(super) type TitleCursor = AnyCursor<Title>;
10-
pub(super) type GroupCursor = AnyCursor<Group>;
1110
pub(super) type PropCursor = AnyCursor<Prop>;
1211

1312
pub(super) trait Type {}
@@ -17,13 +16,10 @@ pub(super) struct Body {}
1716
#[derive(Clone, Copy, Debug)]
1817
pub(super) struct Title {}
1918
#[derive(Clone, Copy, Debug)]
20-
pub(super) struct Group {}
21-
#[derive(Clone, Copy, Debug)]
2219
pub(super) struct Prop {}
2320

2421
impl Type for Body {}
2522
impl Type for Title {}
26-
impl Type for Group {}
2723
impl Type for Prop {}
2824

2925
pub enum MoveResult {
@@ -107,7 +103,7 @@ impl BodyCursor {
107103
self.0 += 1;
108104
MoveResult::Others
109105
}
110-
_ => todo!(),
106+
_ => todo!("unknown block {}", structure[self.0]),
111107
}
112108
}
113109

@@ -149,10 +145,10 @@ impl TitleCursor {
149145
}
150146

151147
/// 生成组光标。
152-
pub fn take_group_on(&self, dtb: RefDtb, name: &str) -> (GroupCursor, usize, BodyCursor) {
148+
pub fn take_group_on(&self, dtb: RefDtb, name: &str) -> (BodyCursor, usize, BodyCursor) {
153149
let name_bytes = name.as_bytes();
154150
let name_skip = align(name_bytes.len() + 1, BLOCK_LEN);
155-
let group = AnyCursor::<Group>(self.0, PhantomData);
151+
let group = AnyCursor::<Body>(self.0, PhantomData);
156152

157153
let mut body = AnyCursor::<Body>(self.0 + 1 + name_skip, PhantomData);
158154
let mut len = 1;
@@ -194,57 +190,6 @@ impl TitleCursor {
194190
}
195191
}
196192

197-
impl GroupCursor {
198-
/// 读取缓存的下一项偏移。
199-
pub fn offset_on(&self, dtb: RefDtb) -> usize {
200-
(dtb.borrow().structure[self.0].0 >> 8) as _
201-
}
202-
203-
/// 利用缓存的名字长度取出名字。
204-
pub fn name_on<'a>(&self, dtb: RefDtb<'a>) -> (&'a [u8], BodyCursor) {
205-
let structure = &dtb.borrow().structure;
206-
let len_name = (structure[self.0].0 & 0xff) as usize;
207-
let bytes = structure[self.0 + 1].lead_slice(len_name);
208-
(
209-
bytes,
210-
AnyCursor(self.0 + 1 + align(len_name + 1, BLOCK_LEN), PhantomData),
211-
)
212-
}
213-
214-
/// 初始化组反序列化。
215-
pub fn init_on(&self, dtb: RefDtb, len_item: usize, len_name: usize) {
216-
let mut body = AnyCursor::<Body>(self.0, PhantomData);
217-
for _ in 0..len_item {
218-
let current = body.0;
219-
let len_total = dtb.borrow().structure[current + 1]
220-
.lead_slice(u16::MAX as _)
221-
.iter()
222-
.enumerate()
223-
.skip(len_name + 1)
224-
.find(|(_, b)| **b == b'\0')
225-
.map(|(i, _)| i)
226-
.unwrap();
227-
body.step_n(align(len_total, BLOCK_LEN));
228-
body.skip_str_on(dtb);
229-
body.escape_from(dtb);
230-
let off_next = body.0 - current;
231-
dtb.borrow_mut().structure[current].0 = (off_next << 8 | len_total) as _;
232-
}
233-
}
234-
235-
/// 组结构恢复原状。
236-
pub fn drop_on(&self, dtb: RefDtb, len_item: usize) {
237-
use StructureBlock as B;
238-
let structure = &mut *dtb.borrow_mut().structure;
239-
let mut i = self.0;
240-
for _ in 0..len_item {
241-
let offset = (structure[i].0 >> 8) as usize;
242-
structure[i] = B::NODE_BEGIN;
243-
i += offset;
244-
}
245-
}
246-
}
247-
248193
impl PropCursor {
249194
pub fn name_on<'a>(&self, dtb: RefDtb<'a>) -> (&'a str, BodyCursor) {
250195
let dtb = dtb.borrow();

src/de_mut/data.rs

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1-
use super::BodyCursor;
1+
use super::{BodyCursor, Cursor};
22
use super::{DtError, PropCursor, RefDtb, RegConfig};
33

44
use core::marker::PhantomData;
55
use serde::{de, Deserialize};
66

77
#[derive(Clone, Copy, Debug)]
88
pub(super) enum ValueCursor {
9-
Prop(PropCursor),
9+
Prop(BodyCursor, PropCursor),
1010
Body(BodyCursor),
1111
}
1212

13-
#[derive(Clone)]
13+
#[derive(Clone, Copy)]
1414
pub(super) struct ValueDeserializer<'de> {
1515
pub dtb: RefDtb<'de>,
1616
pub reg: RegConfig,
17-
pub body_cursor: BodyCursor,
1817
pub cursor: ValueCursor,
1918
}
2019

@@ -39,8 +38,7 @@ impl<'de> Deserialize<'de> for ValueDeserializer<'_> {
3938
D: de::Deserializer<'de>,
4039
{
4140
Ok(unsafe {
42-
(*(core::ptr::addr_of!(deserializer) as *const _ as *const &ValueDeserializer))
43-
.clone()
41+
*(*(core::ptr::addr_of!(deserializer) as *const _ as *const &ValueDeserializer))
4442
})
4543
}
4644
}
@@ -70,7 +68,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
7068
where
7169
V: de::Visitor<'de>,
7270
{
73-
if let ValueCursor::Prop(cursor) = self.cursor {
71+
if let ValueCursor::Prop(_, cursor) = self.cursor {
7472
let val = cursor.map_on(self.dtb, |data| {
7573
if data.is_empty() {
7674
true
@@ -129,7 +127,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
129127
where
130128
V: de::Visitor<'de>,
131129
{
132-
if let ValueCursor::Prop(cursor) = self.cursor {
130+
if let ValueCursor::Prop(_, cursor) = self.cursor {
133131
return visitor.visit_u32(cursor.map_u32_on(self.dtb)?);
134132
}
135133
unreachable!("node -> u32");
@@ -181,7 +179,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
181179
where
182180
V: de::Visitor<'de>,
183181
{
184-
if let ValueCursor::Prop(cursor) = self.cursor {
182+
if let ValueCursor::Prop(_, cursor) = self.cursor {
185183
let data = cursor.data_on(self.dtb);
186184
return visitor.visit_borrowed_bytes(data);
187185
}
@@ -200,7 +198,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
200198
V: de::Visitor<'de>,
201199
{
202200
match self.cursor {
203-
ValueCursor::Prop(cursor) => {
201+
ValueCursor::Prop(_, cursor) => {
204202
let data = cursor.data_on(self.dtb);
205203
if data.is_empty() {
206204
visitor.visit_none()
@@ -242,7 +240,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
242240
return visitor.visit_newtype_struct(self);
243241
}
244242
match self.cursor {
245-
ValueCursor::Prop(cursor) => match name {
243+
ValueCursor::Prop(_, cursor) => match name {
246244
"StrSeq" => {
247245
let inner = super::str_seq::Inner {
248246
dtb: self.dtb,
@@ -274,11 +272,31 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
274272
}
275273
}
276274

277-
fn deserialize_seq<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
275+
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
278276
where
279277
V: de::Visitor<'de>,
280278
{
281-
unreachable!("seq")
279+
use super::{StructAccess, StructAccessType, Temp};
280+
match self.move_on() {
281+
Cursor::Title(c) => {
282+
let (name, _) = c.split_on(self.dtb);
283+
let cursor = match self.cursor {
284+
ValueCursor::Body(cursor) => cursor,
285+
_ => unreachable!(""),
286+
};
287+
288+
let pre_len = name.as_bytes().iter().take_while(|b| **b != b'@').count();
289+
let name_bytes = &name.as_bytes()[..pre_len];
290+
let name = unsafe { core::str::from_utf8_unchecked(name_bytes) };
291+
292+
visitor.visit_seq(StructAccess {
293+
access_type: StructAccessType::Seq(name),
294+
temp: Temp::Node(cursor, cursor),
295+
de: self,
296+
})
297+
}
298+
_ => unreachable!("seq request on a none seq cursor"),
299+
}
282300
}
283301

284302
fn deserialize_tuple<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error>
@@ -308,7 +326,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
308326
if let ValueCursor::Body(cursor) = self.cursor {
309327
return visitor.visit_map(StructAccess {
310328
access_type: StructAccessType::Map(false),
311-
temp: Temp::Node(self.body_cursor, cursor),
329+
temp: Temp::Node(cursor, cursor),
312330
de: self,
313331
});
314332
};
@@ -328,7 +346,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
328346
if let ValueCursor::Body(cursor) = self.cursor {
329347
return visitor.visit_map(StructAccess {
330348
access_type: StructAccessType::Struct(fields),
331-
temp: Temp::Node(self.body_cursor, cursor),
349+
temp: Temp::Node(cursor, cursor),
332350
de: self,
333351
});
334352
};
@@ -364,7 +382,7 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
364382

365383
impl ValueDeserializer<'_> {
366384
#[inline]
367-
pub fn move_next(&mut self) -> super::Cursor {
385+
pub fn move_on(&mut self) -> super::Cursor {
368386
if let ValueCursor::Body(ref mut cursor) = self.cursor {
369387
return cursor.move_on(self.dtb);
370388
};

0 commit comments

Comments
 (0)