From d7236f05a9891a8a750b52f588724b6d0e877bfc Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Tue, 20 Aug 2024 15:07:23 +0100 Subject: [PATCH] Add bitv module --- crates/librqbit/src/bitv.rs | 78 +++++++++++++++++++++++++++++++++++++ crates/librqbit/src/lib.rs | 1 + 2 files changed, 79 insertions(+) create mode 100644 crates/librqbit/src/bitv.rs diff --git a/crates/librqbit/src/bitv.rs b/crates/librqbit/src/bitv.rs new file mode 100644 index 0000000..47c9cc8 --- /dev/null +++ b/crates/librqbit/src/bitv.rs @@ -0,0 +1,78 @@ +use std::fs::File; + +use anyhow::Context; +use bitvec::{order::Lsb0, slice::BitSlice, vec::BitVec, view::AsBits, view::AsMutBits}; + +pub trait BitV: Send { + fn as_slice(&self) -> &BitSlice; + fn as_slice_mut(&mut self) -> &mut BitSlice; + fn flush(&mut self) -> anyhow::Result<()>; + fn into_dyn(self) -> Box; +} + +pub struct MmapBitV { + _file: File, + mmap: memmap2::MmapMut, +} + +impl MmapBitV { + pub fn new(file: File) -> anyhow::Result { + let mmap = + unsafe { memmap2::MmapOptions::new().map_mut(&file) }.context("error mmapping file")?; + Ok(Self { mmap, _file: file }) + } +} + +impl BitV for BitVec { + fn as_slice(&self) -> &BitSlice { + self.as_bitslice() + } + + fn as_slice_mut(&mut self) -> &mut BitSlice { + self.as_mut_bitslice() + } + + fn flush(&mut self) -> anyhow::Result<()> { + Ok(()) + } + + fn into_dyn(self) -> Box { + Box::new(self) + } +} + +impl BitV for MmapBitV { + fn as_slice(&self) -> &BitSlice { + self.mmap.as_bits() + } + + fn as_slice_mut(&mut self) -> &mut BitSlice { + self.mmap.as_mut_bits() + } + + fn flush(&mut self) -> anyhow::Result<()> { + Ok(self.mmap.flush()?) + } + + fn into_dyn(self) -> Box { + Box::new(self) + } +} + +impl BitV for Box { + fn as_slice(&self) -> &BitSlice { + (**self).as_slice() + } + + fn as_slice_mut(&mut self) -> &mut BitSlice { + (**self).as_slice_mut() + } + + fn flush(&mut self) -> anyhow::Result<()> { + (**self).flush() + } + + fn into_dyn(self) -> Box { + self + } +} diff --git a/crates/librqbit/src/lib.rs b/crates/librqbit/src/lib.rs index 16ea5be..b23e2dd 100644 --- a/crates/librqbit/src/lib.rs +++ b/crates/librqbit/src/lib.rs @@ -40,6 +40,7 @@ macro_rules! aframe { pub mod api; mod api_error; +mod bitv; mod chunk_tracker; mod create_torrent_file; mod dht_utils;