Skip to content

Commit c4d8e26

Browse files
committed
[eclipse-iceoryx#224] Implement PlacementDefault for Vec, Queue and SemanticString
1 parent a9410ce commit c4d8e26

File tree

3 files changed

+45
-12
lines changed

3 files changed

+45
-12
lines changed

iceoryx2-bb/container/src/queue.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ use iceoryx2_bb_elementary::allocator::{AllocationError, BaseAllocator};
9999
use iceoryx2_bb_elementary::math::align_to;
100100
use iceoryx2_bb_elementary::math::unaligned_mem_size;
101101
use iceoryx2_bb_elementary::owning_pointer::OwningPointer;
102+
use iceoryx2_bb_elementary::placement_default::PlacementDefault;
102103
use iceoryx2_bb_elementary::pointer_trait::PointerTrait;
103104
pub use iceoryx2_bb_elementary::relocatable_container::RelocatableContainer;
104105
use iceoryx2_bb_elementary::relocatable_ptr::RelocatablePointer;
@@ -397,15 +398,17 @@ pub struct FixedSizeQueue<T, const CAPACITY: usize> {
397398
_data: [MaybeUninit<T>; CAPACITY],
398399
}
399400

401+
impl<T, const CAPACITY: usize> PlacementDefault for FixedSizeQueue<T, CAPACITY> {
402+
unsafe fn placement_default(ptr: *mut Self) {
403+
let state_ptr = core::ptr::addr_of_mut!((&mut *ptr).state);
404+
state_ptr.write(Self::initialize_state());
405+
}
406+
}
407+
400408
impl<T, const CAPACITY: usize> Default for FixedSizeQueue<T, CAPACITY> {
401409
fn default() -> Self {
402410
Self {
403-
state: unsafe {
404-
RelocatableQueue::new(
405-
CAPACITY,
406-
align_to::<MaybeUninit<T>>(std::mem::size_of::<RelocatableQueue<T>>()) as isize,
407-
)
408-
},
411+
state: Self::initialize_state(),
409412
_data: unsafe { MaybeUninit::uninit().assume_init() },
410413
}
411414
}
@@ -415,6 +418,15 @@ unsafe impl<T: Send, const CAPACITY: usize> Send for FixedSizeQueue<T, CAPACITY>
415418
unsafe impl<T: Sync, const CAPACITY: usize> Sync for FixedSizeQueue<T, CAPACITY> {}
416419

417420
impl<T, const CAPACITY: usize> FixedSizeQueue<T, CAPACITY> {
421+
fn initialize_state() -> RelocatableQueue<T> {
422+
unsafe {
423+
RelocatableQueue::new(
424+
CAPACITY,
425+
align_to::<MaybeUninit<T>>(std::mem::size_of::<RelocatableQueue<T>>()) as isize,
426+
)
427+
}
428+
}
429+
418430
/// Creates a new queue.
419431
pub fn new() -> Self {
420432
Self::default()

iceoryx2-bb/container/src/semantic_string.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@
6060
//! }
6161
//! ```
6262
63+
pub use iceoryx2_bb_elementary::placement_default::PlacementDefault;
64+
6365
use crate::byte_string::FixedSizeByteStringModificationError;
6466
use crate::byte_string::{as_escaped_string, strnlen, FixedSizeByteString};
6567
use iceoryx2_bb_elementary::enum_gen;
@@ -379,6 +381,13 @@ macro_rules! semantic_string {
379381
value: iceoryx2_bb_container::byte_string::FixedSizeByteString<$capacity>
380382
}
381383

384+
impl iceoryx2_bb_container::semantic_string::PlacementDefault for $string_name {
385+
unsafe fn placement_default(ptr: *mut Self) {
386+
let ptr = core::ptr::addr_of_mut!((&mut *ptr).value);
387+
iceoryx2_bb_container::semantic_string::PlacementDefault::placement_default(ptr)
388+
}
389+
}
390+
382391
impl iceoryx2_bb_container::semantic_string::SemanticString<$capacity> for $string_name {
383392
fn as_string(&self) -> &iceoryx2_bb_container::byte_string::FixedSizeByteString<$capacity> {
384393
&self.value

iceoryx2-bb/container/src/vec.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ use std::{alloc::Layout, mem::MaybeUninit, ops::Deref, ops::DerefMut, sync::atom
7979

8080
use iceoryx2_bb_elementary::{
8181
math::{align_to, unaligned_mem_size},
82+
placement_default::PlacementDefault,
8283
pointer_trait::PointerTrait,
8384
relocatable_container::RelocatableContainer,
8485
relocatable_ptr::RelocatablePointer,
@@ -330,15 +331,17 @@ pub struct FixedSizeVec<T, const CAPACITY: usize> {
330331
_data: [MaybeUninit<T>; CAPACITY],
331332
}
332333

334+
impl<T, const CAPACITY: usize> PlacementDefault for FixedSizeVec<T, CAPACITY> {
335+
unsafe fn placement_default(ptr: *mut Self) {
336+
let state_ptr = core::ptr::addr_of_mut!((&mut *ptr).state);
337+
state_ptr.write(Self::initialize_state())
338+
}
339+
}
340+
333341
impl<T, const CAPACITY: usize> Default for FixedSizeVec<T, CAPACITY> {
334342
fn default() -> Self {
335343
Self {
336-
state: unsafe {
337-
RelocatableVec::new(
338-
CAPACITY,
339-
align_to::<MaybeUninit<T>>(std::mem::size_of::<RelocatableVec<T>>()) as isize,
340-
)
341-
},
344+
state: Self::initialize_state(),
342345
_data: core::array::from_fn(|_| MaybeUninit::uninit()),
343346
}
344347
}
@@ -377,6 +380,15 @@ impl<T: Clone, const CAPACITY: usize> Clone for FixedSizeVec<T, CAPACITY> {
377380
unsafe impl<T: Send, const CAPACITY: usize> Send for FixedSizeVec<T, CAPACITY> {}
378381

379382
impl<T, const CAPACITY: usize> FixedSizeVec<T, CAPACITY> {
383+
fn initialize_state() -> RelocatableVec<T> {
384+
unsafe {
385+
RelocatableVec::new(
386+
CAPACITY,
387+
align_to::<MaybeUninit<T>>(std::mem::size_of::<RelocatableVec<T>>()) as isize,
388+
)
389+
}
390+
}
391+
380392
/// Creates a new vector.
381393
pub fn new() -> Self {
382394
Self::default()

0 commit comments

Comments
 (0)