1use crate::swift::{self, SwiftObject};
2use std::{ffi::c_void, ops::Deref, ptr::NonNull};
3
4#[doc(hidden)]
5#[repr(C)]
6pub struct SRObjectImpl<T> {
7 _nsobject_offset: u8,
8 data: T,
9}
10
11#[repr(transparent)]
34pub struct SRObject<T>(pub(crate) NonNull<SRObjectImpl<T>>);
35
36impl<T> SwiftObject for SRObject<T> {
37 type Shape = T;
38
39 fn get_object(&self) -> &SRObject<Self::Shape> {
40 self
41 }
42}
43
44impl<T> Deref for SRObject<T> {
45 type Target = T;
46
47 fn deref(&self) -> &T {
48 unsafe { &self.0.as_ref().data }
49 }
50}
51
52impl<T> AsRef<T> for SRObject<T> {
53 fn as_ref(&self) -> &T {
54 self
55 }
56}
57
58impl<T> Drop for SRObject<T> {
59 fn drop(&mut self) {
60 unsafe { swift::release_object(self.0.as_ref() as *const _ as *const c_void) }
61 }
62}
63
64#[cfg(feature = "serde")]
65impl<T> serde::Serialize for SRObject<T>
66where
67 T: serde::Serialize,
68{
69 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
70 where
71 S: serde::Serializer,
72 {
73 self.deref().serialize(serializer)
74 }
75}