nblf_queue/growable/
pooled.rs1use crate::{
2 Growable,
3 MPMCQueue,
4 core::{
5 queue::QueueCore,
6 slots::{Auto, SlotType},
7 },
8 growable::{GrowableQueueCore, NewSized},
9 owned::buffer::BoxedBuffer,
10 pool::{DataStorage, IndexStorage, ItemHandle, Pooled},
11};
12
13#[allow(type_alias_bounds)]
14type PooledBoxed<T, S>
15where
16 S: SlotType<ItemHandle<T>>,
17= Pooled<
18 T,
19 QueueCore<BoxedBuffer<S::Slot>>,
20 BoxedBuffer<DataStorage<T>>,
21 QueueCore<BoxedBuffer<<Auto as SlotType<IndexStorage>>::Slot>>,
22>;
23
24#[allow(private_bounds)]
30pub struct PooledDynamicQueue<T, S = Auto>
31where
32 S: SlotType<ItemHandle<T>>,
33{
34 inner: GrowableQueueCore<T, PooledBoxed<T, S>, S>,
35}
36
37impl<T> PooledDynamicQueue<T, Auto> {
38 pub fn new(size: usize) -> Self {
40 Self::with_slot::<Auto>(size)
41 }
42
43 #[allow(private_bounds)]
44 pub fn with_slot<S>(size: usize) -> PooledDynamicQueue<T, S>
46 where
47 S: SlotType<ItemHandle<T>>,
48 {
49 PooledDynamicQueue {
50 inner: GrowableQueueCore::with_size(size),
51 }
52 }
53}
54
55impl<T, S> MPMCQueue for PooledDynamicQueue<T, S>
56where
57 S: SlotType<ItemHandle<T>>,
58{
59 type Item = T;
60
61 fn push(&self, item: Self::Item) -> Result<(), Self::Item> {
62 self.inner.push(item)
63 }
64
65 fn pop(&self) -> Option<Self::Item> {
66 self.inner.pop()
67 }
68
69 fn len(&self) -> usize {
70 self.inner.len()
71 }
72
73 fn capacity(&self) -> usize {
74 self.inner.capacity()
75 }
76
77 fn is_empty(&self) -> bool {
78 self.inner.is_empty()
79 }
80
81 fn is_full(&self) -> bool {
82 self.inner.is_full()
83 }
84}
85
86impl<T, S> Growable for PooledDynamicQueue<T, S>
87where
88 S: SlotType<ItemHandle<T>>,
89 GrowableQueueCore<T, PooledBoxed<T, S>, S>: Growable,
90{
91 fn grow_by(&self, by: usize) -> bool {
92 self.inner.grow_by(by)
93 }
94}