zserio/ztype/array_traits/
float32_array_trait.rs

1use crate::error::Result;
2use crate::ztype;
3use crate::ztype::array_traits::array_trait;
4use crate::ztype::array_traits::packing_context_node::PackingContextNode;
5use bitreader::BitReader;
6use rust_bitwriter::BitWriter;
7
8pub struct Float32ArrayTrait {}
9
10impl array_trait::ArrayTrait<f32> for Float32ArrayTrait {
11    fn is_bitsizeof_constant(&self) -> bool {
12        true
13    }
14
15    fn needs_bitsizeof_position(&self) -> bool {
16        false
17    }
18
19    fn bitsize_of(&self, _bit_position: u64, _: &f32) -> Result<u64> {
20        Ok(32)
21    }
22
23    fn initialize_offsets(&self, bit_position: u64, value: &f32) -> Result<u64> {
24        Ok(bit_position + self.bitsize_of(bit_position, value)?)
25    }
26
27    fn read(&self, reader: &mut BitReader, value: &mut f32, _index: usize) -> Result<()> {
28        *value = ztype::read_float32(reader)?;
29        Ok(())
30    }
31
32    fn write(&self, writer: &mut BitWriter, value: &f32) -> Result<()> {
33        ztype::write_float32(writer, *value)
34    }
35
36    fn to_u64(&self, _: &f32) -> u64 {
37        0 // delta-encoding not supported for float arrays
38    }
39    fn from_u64(&self, _: u64) -> f32 {
40        0.0 // delta-encoding not supported for float arrays
41    }
42
43    fn init_context(&self, context_node: &mut PackingContextNode, element: &f32) -> Result<()> {
44        context_node.context.as_mut().unwrap().init(self, element)
45    }
46
47    fn bitsize_of_packed(
48        &self,
49        context_node: &mut PackingContextNode,
50        bit_position: u64,
51        element: &f32,
52    ) -> Result<u64> {
53        context_node
54            .context
55            .as_mut()
56            .unwrap()
57            .bitsize_of(self, bit_position, element)
58    }
59
60    fn initialize_offsets_packed(
61        &self,
62        context_node: &mut PackingContextNode,
63        bit_position: u64,
64        element: &f32,
65    ) -> Result<u64> {
66        Ok(bit_position
67            + context_node
68                .context
69                .as_mut()
70                .unwrap()
71                .bitsize_of(self, bit_position, element)?)
72    }
73
74    fn read_packed(
75        &self,
76        context_node: &mut PackingContextNode,
77        reader: &mut BitReader,
78        value: &mut f32,
79        index: usize,
80    ) -> Result<()> {
81        context_node
82            .context
83            .as_mut()
84            .unwrap()
85            .read(self, reader, value, index)
86    }
87
88    fn write_packed(
89        &self,
90        context_node: &mut PackingContextNode,
91        writer: &mut BitWriter,
92        element: &f32,
93    ) -> Result<()> {
94        context_node
95            .context
96            .as_mut()
97            .unwrap()
98            .write(self, writer, element)
99    }
100}