owning.rs
89 lines
| 2.1 KiB
| application/rls-services+xml
|
RustLexer
Raphaël Gomès
|
r49864 | use crate::{DirstateError, DirstateParents}; | ||
Simon Sapin
|
r48766 | use super::dirstate_map::DirstateMap; | ||
use std::ops::Deref; | ||||
Raphaël Gomès
|
r49864 | use ouroboros::self_referencing; | ||
Raphaël Gomès
|
r49863 | |||
Simon Sapin
|
r48766 | /// Keep a `DirstateMap<'on_disk>` next to the `on_disk` buffer that it | ||
/// borrows. | ||||
Raphaël Gomès
|
r49864 | #[self_referencing] | ||
Simon Sapin
|
r48766 | pub struct OwningDirstateMap { | ||
on_disk: Box<dyn Deref<Target = [u8]> + Send>, | ||||
Raphaël Gomès
|
r49864 | #[borrows(on_disk)] | ||
#[covariant] | ||||
map: DirstateMap<'this>, | ||||
Simon Sapin
|
r48766 | } | ||
impl OwningDirstateMap { | ||||
pub fn new_empty<OnDisk>(on_disk: OnDisk) -> Self | ||||
where | ||||
Raphaël Gomès
|
r49864 | OnDisk: Deref<Target = [u8]> + Send + 'static, | ||
Simon Sapin
|
r48766 | { | ||
let on_disk = Box::new(on_disk); | ||||
Raphaël Gomès
|
r49864 | OwningDirstateMapBuilder { | ||
on_disk, | ||||
map_builder: |bytes| DirstateMap::empty(&bytes), | ||||
} | ||||
.build() | ||||
Simon Sapin
|
r48766 | } | ||
Raphaël Gomès
|
r49864 | pub fn new_v1<OnDisk>( | ||
on_disk: OnDisk, | ||||
) -> Result<(Self, DirstateParents), DirstateError> | ||||
where | ||||
OnDisk: Deref<Target = [u8]> + Send + 'static, | ||||
{ | ||||
let on_disk = Box::new(on_disk); | ||||
let mut parents = DirstateParents::NULL; | ||||
Simon Sapin
|
r48766 | |||
Raphaël Gomès
|
r49864 | Ok(( | ||
OwningDirstateMapTryBuilder { | ||||
on_disk, | ||||
map_builder: |bytes| { | ||||
DirstateMap::new_v1(&bytes).map(|(dmap, p)| { | ||||
parents = p.unwrap_or(DirstateParents::NULL); | ||||
dmap | ||||
}) | ||||
}, | ||||
} | ||||
.try_build()?, | ||||
parents, | ||||
)) | ||||
Simon Sapin
|
r48766 | } | ||
Raphaël Gomès
|
r49864 | pub fn new_v2<OnDisk>( | ||
on_disk: OnDisk, | ||||
data_size: usize, | ||||
metadata: &[u8], | ||||
) -> Result<Self, DirstateError> | ||||
where | ||||
OnDisk: Deref<Target = [u8]> + Send + 'static, | ||||
{ | ||||
let on_disk = Box::new(on_disk); | ||||
OwningDirstateMapTryBuilder { | ||||
on_disk, | ||||
map_builder: |bytes| { | ||||
DirstateMap::new_v2(&bytes, data_size, metadata) | ||||
}, | ||||
} | ||||
.try_build() | ||||
Simon Sapin
|
r48766 | } | ||
Raphaël Gomès
|
r49864 | pub fn with_dmap_mut<R>( | ||
&mut self, | ||||
f: impl FnOnce(&mut DirstateMap) -> R, | ||||
) -> R { | ||||
self.with_map_mut(f) | ||||
} | ||||
pub fn get_map(&self) -> &DirstateMap { | ||||
self.borrow_map() | ||||
} | ||||
pub fn on_disk(&self) -> &[u8] { | ||||
self.borrow_on_disk() | ||||
Simon Sapin
|
r48766 | } | ||
} | ||||