use enumflags2::{bitflags, BitFlags};
use crate::{
dds::with_key::datawriter::WriteOptions,
structure::{guid::GUID, rpc::SampleIdentity, sequence_number::SequenceNumber, time::Timestamp},
};
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[bitflags]
#[repr(u32)] pub enum SampleState {
Read = 0b0001,
NotRead = 0b0010,
}
impl SampleState {
pub fn any() -> BitFlags<Self> {
BitFlags::<Self>::all()
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[repr(u32)]
#[bitflags]
pub enum ViewState {
New = 0b0001,
NotNew = 0b0010,
}
impl ViewState {
pub fn any() -> BitFlags<Self> {
BitFlags::<Self>::all()
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[repr(u32)]
#[bitflags]
pub enum InstanceState {
Alive = 0b0001,
NotAliveDisposed = 0b0010,
NotAliveNoWriters = 0b0100,
}
impl InstanceState {
pub fn any() -> BitFlags<Self> {
BitFlags::<Self>::all()
}
pub fn not_alive() -> BitFlags<Self> {
Self::NotAliveDisposed | Self::NotAliveNoWriters
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct NotAliveGenerationCounts {
pub disposed_generation_count: i32,
pub no_writers_generation_count: i32,
}
impl NotAliveGenerationCounts {
pub fn zero() -> Self {
Self {
disposed_generation_count: 0,
no_writers_generation_count: 0,
}
}
pub fn sub_zero() -> Self {
Self {
disposed_generation_count: -1,
no_writers_generation_count: -1,
}
}
pub fn total(&self) -> i32 {
self.disposed_generation_count + self.no_writers_generation_count
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SampleInfo {
pub(crate) sample_state: SampleState,
pub(crate) view_state: ViewState,
pub(crate) instance_state: InstanceState,
pub(crate) generation_counts: NotAliveGenerationCounts,
pub(crate) sample_rank: i32,
pub(crate) generation_rank: i32,
pub(crate) absolute_generation_rank: i32,
pub(crate) write_options: WriteOptions,
pub(crate) publication_handle: GUID,
pub(crate) sequence_number: SequenceNumber,
}
#[allow(clippy::new_without_default)]
impl SampleInfo {
pub fn source_timestamp(&self) -> Option<Timestamp> {
self.write_options.source_timestamp
}
pub fn sample_state(&self) -> SampleState {
self.sample_state
}
pub fn view_state(&self) -> ViewState {
self.view_state
}
pub fn instance_state(&self) -> InstanceState {
self.instance_state
}
pub fn disposed_generation_count(&self) -> i32 {
self.generation_counts.disposed_generation_count
}
pub fn no_writers_generation_count(&self) -> i32 {
self.generation_counts.no_writers_generation_count
}
pub fn sample_rank(&self) -> i32 {
self.sample_rank
}
pub fn generation_rank(&self) -> i32 {
self.generation_rank
}
pub fn absolute_generation_rank(&self) -> i32 {
self.absolute_generation_rank
}
pub fn publication_handle(&self) -> GUID {
self.publication_handle
}
pub fn writer_guid(&self) -> GUID {
self.publication_handle
}
pub fn related_sample_identity(&self) -> Option<SampleIdentity> {
self.write_options.related_sample_identity
}
pub fn sample_identity(&self) -> SampleIdentity {
SampleIdentity {
writer_guid: self.publication_handle,
sequence_number: self.sequence_number,
}
}
}