use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard};
use super::{Metadata, MetadataTrait};
use crate::chunked_array::PolarsDataType;
pub struct IMMetadata<T: PolarsDataType>(RwLock<Metadata<T>>);
impl<'a, T: PolarsDataType + 'a> IMMetadata<T>
where
Metadata<T>: MetadataTrait + 'a,
{
pub fn upcast(&'a self) -> &'a RwLock<dyn MetadataTrait + 'a> {
&self.0 as &RwLock<dyn MetadataTrait + 'a>
}
pub fn boxed_upcast(&'a self) -> Box<dyn MetadataTrait + 'a> {
Box::new(self.0.read().unwrap().clone()) as Box<dyn MetadataTrait + 'a>
}
}
impl<T: PolarsDataType> IMMetadata<T> {
pub const fn new(md: Metadata<T>) -> Self {
Self(RwLock::new(md))
}
pub fn try_read(&self) -> Option<RwLockReadGuard<Metadata<T>>> {
self.0.try_read().ok()
}
pub fn read(&self) -> RwLockReadGuard<Metadata<T>> {
self.0.read().unwrap()
}
pub fn try_write(&self) -> Option<RwLockWriteGuard<Metadata<T>>> {
self.0.try_write().ok()
}
pub fn write(&self) -> RwLockWriteGuard<Metadata<T>> {
self.0.write().unwrap()
}
pub fn take(self) -> Metadata<T> {
self.0.into_inner().unwrap()
}
pub fn get_mut(&mut self) -> &mut Metadata<T> {
self.0.get_mut().unwrap()
}
}
impl<T: PolarsDataType> Clone for IMMetadata<T> {
fn clone(&self) -> Self {
Self::new(self.read().clone())
}
}
impl<T: PolarsDataType> Default for IMMetadata<T> {
fn default() -> Self {
Self::new(Default::default())
}
}