use crate::build_assert;
use crate::sync::atomic::Atomic;
use crate::types::Opaque;
#[repr(transparent)]
pub struct Refcount(Opaque<bindings::refcount_t>);
impl Refcount {
#[inline(always)]
pub fn new(value: i32) -> Self {
build_assert!(value >= 0, "initial value saturated");
Self(Opaque::new(unsafe { bindings::REFCOUNT_INIT(value) }))
}
#[inline]
fn as_ptr(&self) -> *mut bindings::refcount_t {
self.0.get()
}
#[inline]
pub fn as_atomic(&self) -> &Atomic<i32> {
let ptr = self.0.get().cast();
unsafe { &*ptr }
}
#[inline]
pub fn set(&self, value: i32) {
unsafe { bindings::refcount_set(self.as_ptr(), value) }
}
#[inline]
pub fn inc(&self) {
unsafe { bindings::refcount_inc(self.as_ptr()) }
}
#[inline]
pub fn dec(&self) {
unsafe { bindings::refcount_dec(self.as_ptr()) }
}
#[inline]
#[must_use = "use `dec` instead if you do not need to test if it is 0"]
pub fn dec_and_test(&self) -> bool {
unsafe { bindings::refcount_dec_and_test(self.as_ptr()) }
}
}
unsafe impl Send for Refcount {}
unsafe impl Sync for Refcount {}