use std::sync::{RwLock as StdRwLock, RwLockReadGuard, RwLockWriteGuard};
use std::sync::atomic::{AtomicPtr as StdAtomicPtr, Ordering};
use std::cell::UnsafeCell;
use std::ops::{Deref, DerefMut};
pub struct RwLock<T> {
inner: StdRwLock<T>,
}
impl<T> RwLock<T> {
#[inline]
pub fn new(value: T) -> RwLock<T> {
RwLock {
inner: StdRwLock::new(value),
}
}
#[inline]
pub fn read(&self) -> RwLockReadGuard<'_, T> {
self.inner.read().unwrap()
}
#[inline]
pub fn write(&self) -> RwLockWriteGuard<'_, T> {
self.inner.write().unwrap()
}
#[inline]
pub fn try_read(&self) -> Option<RwLockReadGuard<'_, T>> {
self.inner.try_read().ok()
}
#[inline]
pub fn try_write(&self) -> Option<RwLockWriteGuard<'_, T>> {
self.inner.try_write().ok()
}
#[inline]
pub fn into_inner(self) -> T {
self.inner.into_inner().unwrap()
}
}
impl<T: Default> Default for RwLock<T> {
#[inline]
fn default() -> RwLock<T> {
RwLock::new(T::default())
}
}
pub struct AtomicPtr<T> {
inner: StdAtomicPtr<T>,
}
impl<T> AtomicPtr<T> {
#[inline]
pub fn new(ptr: *mut T) -> AtomicPtr<T> {
AtomicPtr {
inner: StdAtomicPtr::new(ptr),
}
}
#[inline]
pub fn load(&self, order: Ordering) -> *mut T {
self.inner.load(order)
}
#[inline]
pub fn store(&self, ptr: *mut T, order: Ordering) {
self.inner.store(ptr, order);
}
#[inline]
pub fn swap(&self, ptr: *mut T, order: Ordering) -> *mut T {
self.inner.swap(ptr, order)
}
#[inline]
pub fn compare_and_swap(&self, current: *mut T, new: *mut T, order: Ordering) -> *mut T {
self.inner.compare_and_swap(current, new, order)
}
#[inline]
pub fn compare_exchange(
&self,
current: *mut T,
new: *mut T,
success: Ordering,
failure: Ordering,
) -> Result<*mut T, *mut T> {
self.inner.compare_exchange(current, new, success, failure)
}
#[inline]
pub fn compare_exchange_weak(
&self,
current: *mut T,
new: *mut T,
success: Ordering,
failure: Ordering,
) -> Result<*mut T, *mut T> {
self.inner.compare_exchange_weak(current, new, success, failure)
}
}
impl<T> Default for AtomicPtr<T> {
#[inline]
fn default() -> AtomicPtr<T> {
AtomicPtr::new(std::ptr::null_mut())
}
}
#[inline]
pub fn fence(order: Ordering) {
std::sync::atomic::fence(order);
}