rqbit/crates/librqbit/src/bitv.rs

131 lines
2.6 KiB
Rust
Raw Normal View History

2024-08-20 15:07:23 +01:00
use std::fs::File;
use anyhow::Context;
2024-08-20 17:15:37 +01:00
use bitvec::{
boxed::BitBox,
order::Msb0,
2024-08-20 17:15:37 +01:00
slice::BitSlice,
vec::BitVec,
view::{AsBits, AsMutBits},
};
use tracing::trace;
2024-08-20 15:07:23 +01:00
2024-08-20 17:15:37 +01:00
pub trait BitV: Send + Sync {
fn as_slice(&self) -> &BitSlice<u8, Msb0>;
fn as_slice_mut(&mut self) -> &mut BitSlice<u8, Msb0>;
2024-08-20 15:07:23 +01:00
fn into_dyn(self) -> Box<dyn BitV>;
2024-08-20 17:15:37 +01:00
fn as_bytes(&self) -> &[u8];
2024-08-20 21:09:58 +01:00
fn flush(&mut self) -> anyhow::Result<()>;
2024-08-20 15:07:23 +01:00
}
2024-08-20 17:15:37 +01:00
pub type BoxBitV = Box<dyn BitV>;
2024-08-20 15:07:23 +01:00
pub struct MmapBitV {
_file: File,
mmap: memmap2::MmapMut,
}
impl Drop for MmapBitV {
fn drop(&mut self) {
trace!("dropping MmapBitV, this should unmap the .bitv file")
}
}
2024-08-20 15:07:23 +01:00
impl MmapBitV {
pub fn new(file: File) -> anyhow::Result<Self> {
let mmap =
unsafe { memmap2::MmapOptions::new().map_mut(&file) }.context("error mmapping file")?;
Ok(Self { mmap, _file: file })
}
}
2024-08-20 16:51:34 +01:00
#[async_trait::async_trait]
impl BitV for BitVec<u8, Msb0> {
fn as_slice(&self) -> &BitSlice<u8, Msb0> {
2024-08-20 15:07:23 +01:00
self.as_bitslice()
}
fn as_slice_mut(&mut self) -> &mut BitSlice<u8, Msb0> {
2024-08-20 15:07:23 +01:00
self.as_mut_bitslice()
}
2024-08-20 17:15:37 +01:00
fn as_bytes(&self) -> &[u8] {
self.as_raw_slice()
}
2024-08-20 21:09:58 +01:00
fn flush(&mut self) -> anyhow::Result<()> {
2024-08-20 17:15:37 +01:00
Ok(())
}
fn into_dyn(self) -> Box<dyn BitV> {
Box::new(self)
}
}
#[async_trait::async_trait]
impl BitV for BitBox<u8, Msb0> {
fn as_slice(&self) -> &BitSlice<u8, Msb0> {
2024-08-20 17:15:37 +01:00
self.as_bitslice()
}
fn as_slice_mut(&mut self) -> &mut BitSlice<u8, Msb0> {
2024-08-20 17:15:37 +01:00
self.as_mut_bitslice()
}
fn as_bytes(&self) -> &[u8] {
self.as_raw_slice()
}
2024-08-20 21:09:58 +01:00
fn flush(&mut self) -> anyhow::Result<()> {
2024-08-20 15:07:23 +01:00
Ok(())
}
fn into_dyn(self) -> Box<dyn BitV> {
Box::new(self)
}
}
impl BitV for MmapBitV {
fn as_slice(&self) -> &BitSlice<u8, Msb0> {
2024-08-20 15:07:23 +01:00
self.mmap.as_bits()
}
fn as_slice_mut(&mut self) -> &mut BitSlice<u8, Msb0> {
2024-08-20 15:07:23 +01:00
self.mmap.as_mut_bits()
}
2024-08-20 17:15:37 +01:00
fn as_bytes(&self) -> &[u8] {
&self.mmap
}
2024-08-20 21:09:58 +01:00
fn flush(&mut self) -> anyhow::Result<()> {
2024-08-20 15:07:23 +01:00
Ok(self.mmap.flush()?)
}
fn into_dyn(self) -> Box<dyn BitV> {
Box::new(self)
}
}
impl BitV for Box<dyn BitV> {
fn as_slice(&self) -> &BitSlice<u8, Msb0> {
2024-08-20 15:07:23 +01:00
(**self).as_slice()
}
fn as_slice_mut(&mut self) -> &mut BitSlice<u8, Msb0> {
2024-08-20 15:07:23 +01:00
(**self).as_slice_mut()
}
2024-08-20 17:15:37 +01:00
fn as_bytes(&self) -> &[u8] {
(**self).as_bytes()
}
2024-08-20 21:09:58 +01:00
fn flush(&mut self) -> anyhow::Result<()> {
(**self).flush()
2024-08-20 15:07:23 +01:00
}
fn into_dyn(self) -> Box<dyn BitV> {
self
}
}