use super::Tensor;
use crate::{DType, Device};
use parking_lot::ReentrantMutex;
use std::cell::RefCell;
use std::rc::Rc;
use std::sync::Arc;
#[derive(Clone, Debug)]
pub struct RcTensor(pub Rc<RefCell<Tensor>>);
impl RcTensor {
pub fn lock(&self) -> &RefCell<Tensor> {
&*self.0
}
pub fn from_tensor(t: Tensor) -> Self {
RcTensor(Rc::new(RefCell::new(t)))
}
pub fn into_inner(self) -> Rc<RefCell<Tensor>> {
self.0
}
}
impl From<Tensor> for RcTensor {
fn from(t: Tensor) -> Self {
RcTensor::from_tensor(t)
}
}
#[derive(Clone, Debug)]
pub struct ArcTensor(pub Arc<ReentrantMutex<RefCell<Tensor>>>);
impl ArcTensor {
pub fn lock(&self) -> parking_lot::ReentrantMutexGuard<RefCell<Tensor>> {
self.0.lock()
}
pub fn from_tensor(t: Tensor) -> Self {
ArcTensor(Arc::new(ReentrantMutex::new(RefCell::new(t))))
}
pub fn into_inner(self) -> Arc<ReentrantMutex<RefCell<Tensor>>> {
self.0
}
}
impl From<Tensor> for ArcTensor {
fn from(t: Tensor) -> Self {
ArcTensor::from_tensor(t)
}
}
impl ArcTensor {
pub fn shape(&self) -> Vec<usize> {
self.0.lock().borrow().shape().to_vec()
}
pub fn dtype(&self) -> DType {
self.0.lock().borrow().dtype()
}
pub fn device(&self) -> Device {
self.0.lock().borrow().device()
}
}