emote_psb\types/
binary_tree.rs1use std::{collections::{HashMap, hash_map}, io::{Read, Seek, Write}, slice::Iter};
8
9use crate::{PsbError, PsbErrorKind, internal::SafeIndexVec};
10
11use super::{PsbValue, collection::PsbUintArray};
12
13pub struct PsbBinaryTree {
15
16 pub list: Vec<Vec<u8>>
17
18}
19
20impl PsbBinaryTree {
21
22 pub fn new() -> Self {
23 Self {
24 list: Vec::new()
25 }
26 }
27
28 pub fn list(&self) -> &Vec<Vec<u8>> {
29 &self.list
30 }
31
32 pub fn list_mut(&mut self) -> &mut Vec<Vec<u8>> {
33 &mut self.list
34 }
35
36 pub fn len(&self) -> usize {
37 self.list.len()
38 }
39
40 pub fn iter(&self) -> Iter<'_, Vec<u8>> {
41 self.list.iter()
42 }
43
44 pub fn unwrap(self) -> Vec<Vec<u8>> {
45 self.list
46 }
47
48 pub fn from_bytes<T: Read + Seek>(stream: &mut T) -> Result<(u64, Self), PsbError> {
49 let (offsets_read, offsets) = match PsbValue::from_bytes(stream)? {
50
51 (read, PsbValue::IntArray(array)) => Ok((read, array)),
52
53 _ => Err(PsbError::new(PsbErrorKind::InvalidOffsetTable, None))
54
55 }?;
56 let (tree_read, tree) = match PsbValue::from_bytes(stream)? {
57
58 (read, PsbValue::IntArray(array)) => Ok((read, array)),
59
60 _ => Err(PsbError::new(PsbErrorKind::InvalidOffsetTable, None))
61
62 }?;
63 let (indexes_read, indexes) = match PsbValue::from_bytes(stream)? {
64
65 (read, PsbValue::IntArray(array)) => Ok((read, array)),
66
67 _ => Err(PsbError::new(PsbErrorKind::InvalidOffsetTable, None))
68
69 }?;
70
71 let offsets = offsets.unwrap();
73 let tree = tree.unwrap();
74 let indexes = indexes.unwrap();
75
76 let mut list = Vec::<Vec<u8>>::with_capacity(indexes.len());
77
78 for index in indexes {
79 let mut buffer = Vec::<u8>::new();
80
81 let mut id = tree[index as usize];
82
83 while id != 0 {
84 let next = tree[id as usize];
86
87 let decoded = id - offsets[next as usize];
89
90 id = next;
91
92 buffer.push(decoded as u8);
93 }
94
95 buffer.reverse();
96 list.push(buffer);
97 }
98
99 Ok((offsets_read + tree_read + indexes_read, Self::from(list)))
100 }
101
102 pub fn build_tree(&self) -> TreeNode {
103 let mut root = TreeNode::new();
104
105 for data in &self.list {
106 let mut last_node = &mut root;
107
108 for byte in data {
109 last_node = last_node.get_or_insert_mut(*byte);
110 }
111
112 last_node.get_or_insert(0);
113 }
114
115 root
116 }
117
118 pub fn write_bytes(&self, stream: &mut impl Write) -> Result<u64, PsbError> {
119 let mut root = self.build_tree();
120
121 let mut offsets = SafeIndexVec::new();
122 let mut tree = SafeIndexVec::new();
123 let mut indexes = SafeIndexVec::new();
124
125 offsets.push(1);
126 self.make_sub_tree(&mut root, Vec::new(), &mut offsets, &mut tree, &mut indexes);
127
128 let offsets_written = PsbValue::IntArray(PsbUintArray::from(offsets.into_inner())).write_bytes(stream)?;
129 let tree_written = PsbValue::IntArray(PsbUintArray::from(tree.into_inner())).write_bytes(stream)?;
130 let indexes_written = PsbValue::IntArray(PsbUintArray::from(indexes.into_inner())).write_bytes(stream)?;
131
132 Ok(offsets_written + tree_written + indexes_written)
133 }
134
135 fn make_sub_tree(
137 &self,
138 current_node: &mut TreeNode,
139 value: Vec<u8>,
140 offsets: &mut SafeIndexVec<u64>,
141 tree: &mut SafeIndexVec<u64>,
142 indexes: &mut SafeIndexVec<u64>
143 ) {
144 let min_value = *current_node.min_value().unwrap_or(&0);
145 let begin_pos = current_node.begin_pos;
146 let current_id = current_node.id;
147
148 for (child_value, child) in current_node.iter_mut() {
150 let id = if current_id == 0 || min_value < 1 {
151 *child_value as u64 + offsets.get(current_id as usize).unwrap()
152 } else {
153 (*child_value - min_value) as u64 + begin_pos
154 };
155
156 tree.set(id as usize, current_id);
157 child.id = id;
158 }
159
160 for (child_value, child) in current_node.iter_mut() {
161 let child_max = *child.max_value().unwrap_or(&0) as usize;
162 let child_min = *child.min_value().unwrap_or(&0) as usize;
163
164 let pos = {
165 let len = tree.len();
166 if len > child_max {
167 len
168 } else {
169 tree.set(child_max, 0);
170
171 tree.len()
172 }
173 };
174
175 let count = child_max - child_min;
176 let end = pos + count;
177
178 tree.set(end, 0);
179
180 if *child_value == 0 {
181 let index = self.list.iter().position(|val| val.eq(&value)).unwrap() as u64;
182 offsets.set(child.id as usize, index);
183 indexes.set(index as usize, child.id);
184 } else {
185 let offset = (pos - child_min) as u64;
186 offsets.set(child.id as usize, offset);
187 child.begin_pos = pos as u64;
188 }
189 }
190
191 for (child_value, child) in current_node.iter_mut() {
192 let mut value = value.clone();
193 value.push(*child_value);
194 self.make_sub_tree(child, value, offsets, tree, indexes);
195 }
196 }
197
198}
199
200impl From<Vec<Vec<u8>>> for PsbBinaryTree {
201
202 fn from(list: Vec<Vec<u8>>) -> Self {
203 Self {
204 list
205 }
206 }
207
208}
209
210#[derive(Debug)]
211pub struct TreeNode {
212
213 children: HashMap<u8, TreeNode>,
215
216 pub begin_pos: u64,
217 pub id: u64
218
219}
220
221impl TreeNode {
222
223 pub fn new() -> Self {
224 Self {
225 children: HashMap::new(),
226 id: 0,
227 begin_pos: 0
228 }
229 }
230
231 pub fn min_value(&self) -> Option<&u8> {
232 self.children.keys().min()
233 }
234
235 pub fn max_value(&self) -> Option<&u8> {
236 self.children.keys().max()
237 }
238
239 pub fn iter(&self) -> hash_map::Iter<u8, Self> {
240 self.children.iter()
241 }
242
243 pub fn iter_mut(&mut self) -> hash_map::IterMut<u8, Self> {
244 self.children.iter_mut()
245 }
246
247 pub fn len(&self) -> usize {
248 self.children.len()
249 }
250
251 pub fn get(&self, value: u8) -> Option<&Self> {
252 self.children.get(&value)
253 }
254
255 pub fn get_mut(&mut self, value: u8) -> Option<&mut Self> {
256 self.children.get_mut(&value)
257 }
258
259 pub fn get_or_insert(&mut self, value: u8) -> &Self {
260 if !self.children.contains_key(&value) {
261 let new_node = Self::new();
262
263 self.children.insert(value, new_node);
264 }
265
266 self.children.get(&value).unwrap()
267 }
268
269 pub fn get_or_insert_mut(&mut self, value: u8) -> &mut Self {
270 if !self.children.contains_key(&value) {
271 let new_node = Self::new();
272
273 self.children.insert(value, new_node);
274 }
275
276 self.children.get_mut(&value).unwrap()
277 }
278
279}