serde_columnar/column/
rle.rs1use serde::{Deserialize, Serialize};
2
3use crate::{
4 strategy::{AnyRleDecoder, AnyRleEncoder},
5 ColumnAttr, ColumnarError, Strategy,
6};
7
8use super::ColumnTrait;
9
10pub trait Rleable: Clone + PartialEq + Serialize + for<'de> Deserialize<'de> {}
11impl<T> Rleable for T where T: Clone + PartialEq + Serialize + for<'de> Deserialize<'de> {}
12
13#[derive(Debug)]
15pub struct RleColumn<T> {
16 pub data: Vec<T>,
17 pub attr: ColumnAttr,
18}
19
20impl<T: Rleable> RleColumn<T> {
21 pub fn new(data: Vec<T>, attr: ColumnAttr) -> Self {
22 Self { data, attr }
23 }
24}
25
26impl<T> ColumnTrait for RleColumn<T>
27where
28 T: Rleable,
29{
30 const STRATEGY: Strategy = Strategy::Rle;
31
32 fn len(&self) -> usize {
33 self.data.len()
34 }
35
36 fn attr(&self) -> ColumnAttr {
37 self.attr
38 }
39
40 fn encode(&self) -> Result<Vec<u8>, ColumnarError> {
41 let mut rle_encoder = AnyRleEncoder::<T>::new();
42 for data in self.data.iter() {
43 rle_encoder.append(data)?
44 }
45 rle_encoder.finish()
46 }
47
48 fn decode(bytes: &[u8]) -> Result<Self, ColumnarError>
49 where
50 Self: Sized,
51 {
52 let mut rle_decoder = AnyRleDecoder::new(bytes);
53 Ok(Self {
54 data: rle_decoder.decode()?,
55 attr: ColumnAttr::empty(),
56 })
57 }
58}