infinity_pool/handles/
raw.rs1use std::fmt;
2use std::pin::Pin;
3use std::ptr::NonNull;
4
5use crate::{RawPooledMut, SlabHandle};
6
7#[doc = include_str!("../../doc/snippets/raw_handle_implications.md")]
9#[doc = include_str!("../../doc/snippets/shared_handle_implications.md")]
10#[doc = include_str!("../../doc/snippets/shared_raw_handle_implications.md")]
11#[doc = include_str!("../../doc/snippets/nonlocal_handle_thread_safety.md")]
12pub struct RawPooled<T>
13where
14 T: ?Sized,
16{
17 slab_index: usize,
21
22 slab_handle: SlabHandle<T>,
25}
26
27impl<T: ?Sized> RawPooled<T> {
28 #[must_use]
29 pub(crate) fn new(slab_index: usize, slab_handle: SlabHandle<T>) -> Self {
30 Self {
31 slab_index,
32 slab_handle,
33 }
34 }
35
36 #[must_use]
40 pub(crate) fn slab_index(&self) -> usize {
41 self.slab_index
42 }
43
44 #[must_use]
48 pub(crate) fn slab_handle(&self) -> SlabHandle<T> {
49 self.slab_handle
50 }
51
52 #[doc = include_str!("../../doc/snippets/handle_ptr.md")]
53 #[must_use]
54 #[inline]
55 pub fn ptr(&self) -> NonNull<T> {
56 self.slab_handle.ptr()
57 }
58
59 #[doc = include_str!("../../doc/snippets/handle_erase.md")]
60 #[must_use]
61 #[inline]
62 pub fn erase(self) -> RawPooled<()> {
63 RawPooled {
64 slab_index: self.slab_index,
65 slab_handle: self.slab_handle.erase(),
66 }
67 }
68
69 #[doc = include_str!("../../doc/snippets/raw_as_pin.md")]
70 #[must_use]
71 #[inline]
72 pub unsafe fn as_pin(&self) -> Pin<&T> {
73 let as_ref = unsafe { self.as_ref() };
75
76 unsafe { Pin::new_unchecked(as_ref) }
78 }
79
80 #[doc = include_str!("../../doc/snippets/raw_as_ref.md")]
81 #[must_use]
82 #[inline]
83 pub unsafe fn as_ref(&self) -> &T {
84 unsafe { self.ptr().as_ref() }
88 }
89
90 #[doc(hidden)]
103 #[must_use]
104 #[inline]
105 pub unsafe fn __private_cast_dyn_with_fn<U: ?Sized, F>(self, cast_fn: F) -> RawPooled<U>
106 where
107 F: FnOnce(&T) -> &U,
108 {
109 let new_handle = unsafe { self.slab_handle.cast_with(cast_fn) };
113
114 RawPooled {
115 slab_index: self.slab_index,
116 slab_handle: new_handle,
117 }
118 }
119}
120
121impl<T: ?Sized> Clone for RawPooled<T> {
122 #[inline]
123 fn clone(&self) -> Self {
124 *self
125 }
126}
127
128impl<T: ?Sized> Copy for RawPooled<T> {}
129
130impl<T: ?Sized> fmt::Debug for RawPooled<T> {
131 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
132 f.debug_struct("RawPooled")
133 .field("slab_index", &self.slab_index)
134 .field("slab_handle", &self.slab_handle)
135 .finish()
136 }
137}
138
139impl<T: ?Sized> From<RawPooledMut<T>> for RawPooled<T> {
140 #[inline]
141 fn from(value: RawPooledMut<T>) -> Self {
142 value.into_shared()
143 }
144}
145
146#[cfg(test)]
147mod tests {
148 use std::cell::Cell;
149
150 use static_assertions::{assert_impl_all, assert_not_impl_any};
151
152 use super::*;
153
154 assert_impl_all!(RawPooled<u32>: Send);
156 assert_not_impl_any!(RawPooled<u32>: Sync);
157
158 assert_not_impl_any!(RawPooled<Cell<u32>>: Send, Sync);
160}