use std::sync::Arc;
use atomic_refcell::AtomicRefCell;
use crate::common::counter::hardware_counter::HardwareCounterCell;
use crate::common::types::PointOffsetType;
use crate::segment::payload_storage::PayloadStorageRead;
use crate::segment::types::OwnedPayloadRef;
pub struct PayloadProvider<P: PayloadStorageRead> {
payload_storage: Arc<AtomicRefCell<P>>,
}
impl<P: PayloadStorageRead> Clone for PayloadProvider<P> {
fn clone(&self) -> Self {
Self {
payload_storage: Arc::clone(&self.payload_storage),
}
}
}
impl<P: PayloadStorageRead> PayloadProvider<P> {
pub fn new(payload_storage: Arc<AtomicRefCell<P>>) -> Self {
Self { payload_storage }
}
pub fn with_payload<F, G>(
&self,
point_id: PointOffsetType,
callback: F,
hw_counter: &HardwareCounterCell,
) -> G
where
F: FnOnce(OwnedPayloadRef) -> G,
{
let guard = self.payload_storage.borrow();
let payload = guard
.payload_ref(point_id, hw_counter)
.unwrap_or_else(|err| panic!("Payload storage is corrupted: {err}"));
callback(payload)
}
}