blob: 89f965104d0e87aa33f9a64afe79717f40460e82 [file]
// Copyright 2022 CeresDB Project Authors. Licensed under Apache-2.0.
use std::mem;
use common_types::bytes::{SafeBuf, SafeBufMut};
use snafu::ResultExt;
use crate::codec::{
compact::{DecodeValue, EncodeValue, Error, MemCompactDecoder, MemCompactEncoder, Result},
DecodeTo, Encoder,
};
impl Encoder<f64> for MemCompactEncoder {
type Error = Error;
fn encode<B: SafeBufMut>(&self, buf: &mut B, value: &f64) -> Result<()> {
buf.try_put_f64(*value).context(EncodeValue)?;
Ok(())
}
fn estimate_encoded_size(&self, _value: &f64) -> usize {
mem::size_of::<f64>()
}
}
impl DecodeTo<f64> for MemCompactDecoder {
type Error = Error;
fn decode_to<B: SafeBuf>(&self, buf: &mut B, value: &mut f64) -> Result<()> {
*value = buf.try_get_f64().context(DecodeValue)?;
Ok(())
}
}
impl Encoder<f32> for MemCompactEncoder {
type Error = Error;
fn encode<B: SafeBufMut>(&self, buf: &mut B, value: &f32) -> Result<()> {
buf.try_put_f32(*value).context(EncodeValue)?;
Ok(())
}
fn estimate_encoded_size(&self, _value: &f32) -> usize {
mem::size_of::<f32>()
}
}
impl DecodeTo<f32> for MemCompactDecoder {
type Error = Error;
fn decode_to<B: SafeBuf>(&self, buf: &mut B, value: &mut f32) -> Result<()> {
*value = buf.try_get_f32().context(DecodeValue)?;
Ok(())
}
}
#[cfg(test)]
mod test {
use super::*;
struct TestF64 {
data: f64,
estimate_encoded_size: usize,
}
#[test]
fn test_compact_f64_codec() {
let data = vec![
TestF64 {
data: 162132470.5,
estimate_encoded_size: 8,
},
TestF64 {
data: f64::MIN,
estimate_encoded_size: 8,
},
TestF64 {
data: f64::MAX,
estimate_encoded_size: 8,
},
];
let encoder = MemCompactEncoder;
let mut buf = vec![];
for x in &data {
encoder.encode(&mut buf, &x.data).unwrap();
assert_eq!(
x.estimate_encoded_size,
encoder.estimate_encoded_size(&x.data)
);
}
let decoder = MemCompactDecoder;
let mut buf = &buf[..];
for x in &data {
let mut d = 0.0;
decoder.decode_to(&mut buf, &mut d).unwrap();
assert!((d - x.data).abs() < f64::EPSILON);
}
}
}