1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#[macro_export]
macro_rules! primitive_bdecode_node {
($node_name:ident) => {
#[derive(Debug, Clone)]
pub struct $node_name {
/// 当前节点在 tokens 中的索引
/// 0 - root 节点值; -1 - 未初始化
pub token_index: u32,
/// 解析后的 token 集合
pub tokens: std::sync::Arc<Vec<super::token::BdecodeToken>>,
/// 存放解析前字符串的 buffer
pub buffer: std::sync::Arc<Vec<u8>>,
}
impl $node_name {
pub fn new(
buffer: std::sync::Arc<Vec<u8>>,
tokens: std::sync::Arc<Vec<super::token::BdecodeToken>>,
token_index: u32,
) -> Self {
Self {
buffer,
tokens,
token_index,
}
}
}
impl super::IBdecodeNode for $node_name {
fn token_index(&self) -> usize {
self.token_index as usize
}
fn tokens(&self) -> std::sync::Arc<Vec<super::token::BdecodeToken>> {
self.tokens.clone()
}
}
};
}
#[macro_export]
macro_rules! collective_bdecode_node {
($node_name:ident) => {
#[derive(Debug, Clone)]
pub struct $node_name {
/// 当前节点在 tokens 中的索引
/// 0 - root 节点值; -1 - 未初始化
pub token_index: u32,
/// 解析后的 token 集合
pub tokens: std::sync::Arc<Vec<super::token::BdecodeToken>>,
/// 存放解析前字符串的 buffer
pub buffer: std::sync::Arc<Vec<u8>>,
/// 存放 list 和 map 中 item 的对应的 token 索引集合
pub item_indexes: std::sync::Arc<Vec<u32>>,
// pub item_begin_len: Option<(u32, u32)>,
/// list 和 map 中 item 的数量
len: usize,
}
impl $node_name {
pub fn new(
buffer: std::sync::Arc<Vec<u8>>,
tokens: std::sync::Arc<Vec<super::token::BdecodeToken>>,
token_index: u32,
item_indexes: std::sync::Arc<Vec<u32>>,
len: usize,
) -> Self {
Self {
buffer,
tokens,
token_index,
item_indexes,
len,
}
}
/// 获取当前 list or dict 节点的长度
pub fn len(&self) -> usize {
use crate::IBdecodeNode;
use super::token::BdecodeTokenType::*;
assert!(matches!(self.token_type(), Dict | List));
self.len
}
}
impl super::IBdecodeNode for $node_name {
fn token_index(&self) -> usize {
self.token_index as usize
}
fn tokens(&self) -> std::sync::Arc<Vec<super::token::BdecodeToken>> {
self.tokens.clone()
}
}
}
}