1use anyhow::Result;
7
8pub trait SlotArena: Send {
12 fn slot_bytes(&self) -> usize;
13 fn num_slots(&self) -> usize;
14 fn read_slot(&self, slot: usize, out: &mut [u8]) -> Result<()>;
17 fn write_slot(&mut self, slot: usize, bytes: &[u8]) -> Result<()>;
20}
21
22pub trait SwapStore: Send {
27 fn record_bytes(&self) -> usize;
28 fn write_record(&mut self, disk_slot: usize, bytes: &[u8]) -> Result<()>;
29 fn read_record(&self, disk_slot: usize, out: &mut [u8]) -> Result<()>;
30 fn discard_record(&mut self, _disk_slot: usize) {}
33}
34
35impl<T: SlotArena + ?Sized> SlotArena for Box<T> {
38 fn slot_bytes(&self) -> usize {
39 (**self).slot_bytes()
40 }
41 fn num_slots(&self) -> usize {
42 (**self).num_slots()
43 }
44 fn read_slot(&self, slot: usize, out: &mut [u8]) -> Result<()> {
45 (**self).read_slot(slot, out)
46 }
47 fn write_slot(&mut self, slot: usize, bytes: &[u8]) -> Result<()> {
48 (**self).write_slot(slot, bytes)
49 }
50}
51
52impl<T: SwapStore + ?Sized> SwapStore for Box<T> {
53 fn record_bytes(&self) -> usize {
54 (**self).record_bytes()
55 }
56 fn write_record(&mut self, disk_slot: usize, bytes: &[u8]) -> Result<()> {
57 (**self).write_record(disk_slot, bytes)
58 }
59 fn read_record(&self, disk_slot: usize, out: &mut [u8]) -> Result<()> {
60 (**self).read_record(disk_slot, out)
61 }
62 fn discard_record(&mut self, disk_slot: usize) {
63 (**self).discard_record(disk_slot)
64 }
65}
66
67#[derive(Default, Debug, Clone)]
68pub struct SwapStats {
69 pub puts: u64,
70 pub gets: u64,
71 pub get_miss: u64,
72 pub spills_to_disk: u64,
73 pub faults_from_disk: u64,
74 pub resident_hits: u64,
75 pub disk_evictions: u64,
78}