about summary refs log blame commit diff
path: root/users/edef/weave/src/bytes.rs
blob: 689b8fdfc0c86153a58ba0ca3849d5542d559b24 (plain) (tree)
1
2
3
4
5
6




                                                      
                                                                           








                                                              
                                                                                             










                                      
use owning_ref::{OwningRef, StableAddress};
use polars::export::arrow::buffer::Buffer;
use std::ops::Deref;

/// An shared `[[u8; N]]` backed by a Polars [Buffer].
pub type FixedBytes<const N: usize> = OwningRef<'static, Bytes, [[u8; N]]>;

/// Wrapper struct to make [Buffer] implement [StableAddress].
/// TODO(edef): upstream the `impl`
pub struct Bytes(pub Buffer<u8>);

/// SAFETY: [Buffer] is always an Arc+Vec indirection.
unsafe impl StableAddress for Bytes {}

impl Bytes {
    pub fn map<U: ?Sized>(self, f: impl FnOnce(&[u8]) -> &U) -> OwningRef<'static, Self, U> {
        OwningRef::new(self).map(f)
    }
}

impl Deref for Bytes {
    type Target = [u8];

    fn deref(&self) -> &Self::Target {
        &*self.0
    }
}