pub mod lock_free_bag;
pub mod recommended;
use core::fmt::Debug;
use iceoryx2_bb_container::queue::RelocatableContainer;
use iceoryx2_bb_elementary::CallbackProgression;
use iceoryx2_bb_elementary_traits::zero_copy_send::ZeroCopySend;
use iceoryx2_bb_lock_free::mpmc::robust_unique_index_set::OwnerId;
use iceoryx2_bb_lock_free::mpmc::unique_index_set_enums::{ReleaseMode, ReleaseState};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BagAddFailure {
OutOfSpace,
IsLocked,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BagRemoveError {
HandleNotOwnedByInstance,
}
pub trait BagHandleFamily: Debug + Clone + Copy + PartialEq + Eq + PartialOrd + Ord + Send {
fn index(&self) -> usize;
}
pub trait BagType: Copy + Debug + Send + ZeroCopySend {}
impl<T: Copy + Debug + Send + ZeroCopySend> BagType for T {}
pub trait BagStateFamily<T: BagType>: Debug + Send {
fn for_each<F: FnMut(usize, &T) -> CallbackProgression>(&self, callback: F);
fn get(&self, index: usize) -> Option<&T>;
}
pub trait BagFamily: Debug + 'static {
type BagHandle: BagHandleFamily;
type BagState<T: BagType>: BagStateFamily<T>;
type Bag<T: BagType>: Debug
+ Send
+ Sync
+ ZeroCopySend
+ RelocatableContainer
+ Bag<T, BagHandle = Self::BagHandle, BagState<T> = Self::BagState<T>>;
}
pub trait Bag<T: BagType>: Debug {
type BagHandle: BagHandleFamily;
type BagState<TT: BagType>: BagStateFamily<T>;
fn capacity(&self) -> usize;
fn len(&self) -> usize;
fn is_empty(&self) -> bool;
unsafe fn add(
&self,
value: T,
owner_id: OwnerId,
) -> Result<(*const T, Self::BagHandle), BagAddFailure>
where
T: PartialEq;
unsafe fn remove(
&self,
handle: Self::BagHandle,
mode: ReleaseMode,
) -> Result<ReleaseState, BagRemoveError>;
unsafe fn get_state(&self) -> Self::BagState<T>;
unsafe fn recover<F: FnMut(T) -> bool>(
&self,
dead_owner_id: OwnerId,
predicate: F,
mode: ReleaseMode,
) -> ReleaseState;
unsafe fn update_state(&self, previous_state: &mut Self::BagState<T>) -> bool;
}