use std::sync::Arc;
use parking_lot::{RwLock, RwLockReadGuard};
use crate::segment::entry::ReadSegmentEntry;
use crate::segment::index::UniversalReadExt;
use crate::segment::segment::read_only::ReadOnlySegment;
use crate::shard::locked_segment::LockedSegment;
pub trait ReadSegmentHandle: Send + Sync {
type Segment: ReadSegmentEntry + ?Sized;
fn read_segment(&self) -> RwLockReadGuard<'_, Self::Segment>;
fn segment_arc(&self) -> Arc<RwLock<Self::Segment>>;
}
impl<S: UniversalReadExt + 'static> ReadSegmentHandle for Arc<RwLock<ReadOnlySegment<S>>>
where
S::Fs: Send + Sync,
{
type Segment = ReadOnlySegment<S>;
fn read_segment(&self) -> RwLockReadGuard<'_, ReadOnlySegment<S>> {
self.read()
}
fn segment_arc(&self) -> Arc<RwLock<ReadOnlySegment<S>>> {
self.clone()
}
}
impl ReadSegmentHandle for LockedSegment {
type Segment = dyn ReadSegmentEntry;
fn read_segment(&self) -> RwLockReadGuard<'_, dyn ReadSegmentEntry> {
self.get_read().read()
}
fn segment_arc(&self) -> Arc<RwLock<dyn ReadSegmentEntry>> {
self.get_read_arc()
}
}