use super::{
CompositionReadPolicy, CompositionWritePolicy, OptimisticParallelWritePolicy, RefillPolicy,
SequentialReadPolicy,
};
#[derive(Debug, Clone)]
pub struct CompositionPolicy<R = SequentialReadPolicy, W = OptimisticParallelWritePolicy>
where
R: CompositionReadPolicy,
W: CompositionWritePolicy,
{
pub(crate) read: R,
pub(crate) write: W,
pub(crate) refill: RefillPolicy,
}
impl CompositionPolicy<SequentialReadPolicy, OptimisticParallelWritePolicy> {
pub fn new() -> Self {
Self {
read: SequentialReadPolicy::new(),
write: OptimisticParallelWritePolicy::new(),
refill: RefillPolicy::default(),
}
}
}
impl Default for CompositionPolicy<SequentialReadPolicy, OptimisticParallelWritePolicy> {
fn default() -> Self {
Self::new()
}
}
impl<R, W> CompositionPolicy<R, W>
where
R: CompositionReadPolicy,
W: CompositionWritePolicy,
{
pub fn read<NewR: CompositionReadPolicy>(self, read: NewR) -> CompositionPolicy<NewR, W> {
CompositionPolicy {
read,
write: self.write,
refill: self.refill,
}
}
pub fn write<NewW: CompositionWritePolicy>(self, write: NewW) -> CompositionPolicy<R, NewW> {
CompositionPolicy {
read: self.read,
write,
refill: self.refill,
}
}
pub fn refill(self, refill: RefillPolicy) -> CompositionPolicy<R, W> {
CompositionPolicy {
read: self.read,
write: self.write,
refill,
}
}
pub fn read_policy(&self) -> &R {
&self.read
}
pub fn write_policy(&self) -> &W {
&self.write
}
pub fn refill_policy(&self) -> &RefillPolicy {
&self.refill
}
}