use crate::r#async::qutex::QrwLock;
use crate::r#async::{FutureGuard, OrderLock, ReadGuard, WriteGuard};
use std::ops::{Deref, DerefMut};
#[derive(Clone, Debug)]
pub struct RwVec<T> {
lock: OrderLock<Vec<T>>,
}
impl<T> RwVec<T> {
#[inline]
pub fn new() -> RwVec<T> {
RwVec {
lock: OrderLock::new(Vec::new()),
}
}
pub fn read(self) -> FutureGuard<Vec<T>, ReadGuard<Vec<T>>> {
self.lock.read()
}
pub fn write(self) -> FutureGuard<Vec<T>, WriteGuard<Vec<T>>> {
self.lock.write()
}
pub unsafe fn as_mut_slice(&mut self) -> &mut [T] {
let ptr = (*self.lock.as_mut_ptr()).as_mut_ptr();
let len = (*self.lock.as_ptr()).len();
::std::slice::from_raw_parts_mut(ptr, len)
}
pub fn len_stale(&self) -> usize {
unsafe { (*self.lock.as_ptr()).len() }
}
pub fn id(&self) -> usize {
unsafe { (*self.lock.as_ptr()).as_ptr() as usize }
}
}
impl<T> From<QrwLock<Vec<T>>> for RwVec<T> {
fn from(q: QrwLock<Vec<T>>) -> RwVec<T> {
RwVec {
lock: OrderLock::from(q),
}
}
}
impl<T> From<Vec<T>> for RwVec<T> {
fn from(vec: Vec<T>) -> RwVec<T> {
RwVec {
lock: OrderLock::from(vec),
}
}
}
impl<T> Deref for RwVec<T> {
type Target = OrderLock<Vec<T>>;
#[inline]
fn deref(&self) -> &OrderLock<Vec<T>> {
&self.lock
}
}
impl<T> DerefMut for RwVec<T> {
#[inline]
fn deref_mut(&mut self) -> &mut OrderLock<Vec<T>> {
&mut self.lock
}
}