Skip to content

Commit a171ce7

Browse files
Implement serde tokenization
1 parent 1fdba68 commit a171ce7

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
use renet::Bytes;
2+
3+
pub struct RLEToken {
4+
symbol: i32,
5+
count: i32,
6+
}
7+
8+
pub fn serialize_buffer(array: Vec<i32>) -> Vec<Bytes> {
9+
let tokens = tokenize_buffer(array);
10+
11+
let mut bytes = Vec::<Bytes>::new();
12+
tokens.iter().for_each(|token| {
13+
let symbol_bytes = token.symbol.to_le_bytes();
14+
let count_bytes = token.count.to_le_bytes();
15+
let mut buffer = Vec::new();
16+
buffer.extend_from_slice(&symbol_bytes);
17+
buffer.extend_from_slice(&count_bytes);
18+
bytes.push(Bytes::from(buffer));
19+
});
20+
21+
bytes
22+
}
23+
24+
fn tokenize_buffer(array: Vec<i32>) -> Vec<RLEToken> {
25+
let mut vec = Vec::<RLEToken>::new();
26+
27+
let mut last_symbol = array[0];
28+
let mut count = 1;
29+
30+
for element in array.iter().skip(1) {
31+
if last_symbol == *element {
32+
count += 1;
33+
} else {
34+
vec.push(RLEToken {
35+
count,
36+
symbol: last_symbol,
37+
});
38+
last_symbol = *element;
39+
count = 1;
40+
}
41+
}
42+
vec.push(RLEToken {
43+
count,
44+
symbol: last_symbol,
45+
});
46+
47+
vec
48+
}
49+
50+
#[cfg(test)]
51+
pub mod tests {
52+
use super::*;
53+
54+
#[test]
55+
fn test_tokenize_buffer() {
56+
let array = vec![1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3];
57+
let tokens = tokenize_buffer(array);
58+
59+
assert_eq!(tokens.len(), 3);
60+
assert_eq!(tokens[0].symbol, 1);
61+
assert_eq!(tokens[0].count, 4);
62+
assert_eq!(tokens[1].symbol, 2);
63+
assert_eq!(tokens[1].count, 3);
64+
assert_eq!(tokens[2].symbol, 3);
65+
assert_eq!(tokens[2].count, 5);
66+
}
67+
}

src/client/terrain/util/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ pub mod blocks;
22
pub mod chunk;
33
pub mod generator;
44
pub mod mesher;
5+
pub mod buffer_serializer;
56

67
pub use blocks::*;
78
pub use chunk::*;
89
pub use generator::*;
910
pub use mesher::*;
11+
pub use buffer_serializer::*;

0 commit comments

Comments
 (0)