boytacean_encoding/
rle.rs1use boytacean_common::error::Error;
2
3use crate::codec::Codec;
4
5pub struct Rle;
6
7impl Codec for Rle {
8 type EncodeOptions = ();
9 type DecodeOptions = ();
10
11 fn encode(data: &[u8], _options: &Self::EncodeOptions) -> Result<Vec<u8>, Error> {
12 if data.is_empty() {
13 return Ok(Vec::new());
14 }
15
16 let mut encoded = Vec::new();
17 let mut prev_byte = data[0];
18 let mut count = 1;
19
20 for &byte in data.iter().skip(1) {
21 if count != 255 && byte == prev_byte {
22 count += 1;
23 } else {
24 encoded.push(prev_byte);
25 encoded.push(count);
26 prev_byte = byte;
27 count = 1;
28 }
29 }
30 encoded.push(prev_byte);
31 encoded.push(count);
32
33 Ok(encoded)
34 }
35
36 fn decode(data: &[u8], _options: &Self::DecodeOptions) -> Result<Vec<u8>, Error> {
37 let mut decoded = Vec::new();
38
39 let mut iter = data.iter();
40 while let Some(&byte) = iter.next() {
41 if let Some(&count) = iter.next() {
42 decoded.extend(std::iter::repeat(byte).take(count as usize));
43 }
44 }
45
46 Ok(decoded)
47 }
48}
49
50pub fn encode_rle(data: &[u8]) -> Result<Vec<u8>, Error> {
51 Rle::encode(data, &())
52}
53
54pub fn decode_rle(data: &[u8]) -> Result<Vec<u8>, Error> {
55 Rle::decode(data, &())
56}