use crate::{block_argument::BlockArgument, context::Context, Operation};
use core::cell::RefCell;
#[derive(Clone, Copy, Debug)]
pub enum Value<'a> {
BlockArgument(BlockArgument<'a>),
OperationValue(OperationValue<'a>),
}
#[derive(Clone, Copy, Debug)]
pub struct OperationValue<'a> {
inner: &'a RefCell<OperationValueInner<'a>>,
}
#[derive(Debug)]
struct OperationValueInner<'a> {
operation: Operation<'a>,
index: usize,
}
impl<'a> OperationValue<'a> {
pub fn new(context: &'a Context<'a>, operation: Operation<'a>, index: usize) -> Self {
Self {
inner: context
.allocator()
.alloc(RefCell::new(OperationValueInner { operation, index })),
}
}
pub fn operation(&self) -> Operation<'a> {
self.inner.borrow().operation
}
pub fn index(&self) -> usize {
self.inner.borrow().index
}
pub fn replace(&self, operation: Operation<'a>, index: usize) {
*self.inner.borrow_mut() = OperationValueInner { operation, index }
}
}
impl<'a> From<OperationValue<'a>> for Value<'a> {
fn from(value: OperationValue<'a>) -> Self {
Self::OperationValue(value)
}
}