Skip to main content

nblf_queue/growable/
pooled.rs

1use 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/// A dynamically growable, pooled `MPMCQueue`.
25///
26/// Unlike `DynamicQueue`, this queue may store any type, at the cost of higher runtime and higher memory.
27///
28/// Only available on feature `dynamic` + `pool`
29#[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    /// Constructs a new `PooledDynamicQueue` with capacity `size` and slot type `Auto`.
39    pub fn new(size: usize) -> Self {
40        Self::with_slot::<Auto>(size)
41    }
42
43    #[allow(private_bounds)]
44    /// Constructs a new `Queue` with capacity `size` and slot type `S`.
45    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}