datex_core/references/
value_reference.rs1use crate::{
2 references::{observers::Observer, reference::ReferenceMutability},
3 traits::value_eq::ValueEq,
4 types::definition::TypeDefinition,
5 utils::freemap::FreeHashMap,
6 values::{
7 pointer::PointerAddress, value::Value, value_container::ValueContainer,
8 },
9};
10
11use crate::prelude::*;
12use core::{cell::RefCell, fmt::Debug, prelude::rust_2024::*};
13
14pub struct ValueReference {
15 pub value_container: ValueContainer,
17 pub pointer_address: Option<PointerAddress>,
19 pub allowed_type: TypeDefinition,
21 pub observers: FreeHashMap<u32, Observer>,
23 pub mutability: ReferenceMutability,
24}
25
26impl Default for ValueReference {
27 fn default() -> Self {
28 ValueReference {
29 value_container: ValueContainer::Value(Value::null()),
30 pointer_address: None,
31 allowed_type: TypeDefinition::Unknown,
32 observers: FreeHashMap::new(),
33 mutability: ReferenceMutability::Immutable,
34 }
35 }
36}
37
38impl ValueReference {
39 pub fn new(
40 value_container: ValueContainer,
41 pointer_address: Option<PointerAddress>,
42 allowed_type: TypeDefinition,
43 mutability: ReferenceMutability,
44 ) -> Self {
45 ValueReference {
46 value_container,
47 pointer_address,
48 allowed_type,
49 observers: FreeHashMap::new(),
50 mutability,
51 }
52 }
53}
54
55impl Debug for ValueReference {
56 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
57 f.debug_struct("ReferenceData")
58 .field("value_container", &self.value_container)
59 .field("pointer", &self.pointer_address)
60 .field("allowed_type", &self.allowed_type)
61 .field("observers", &self.observers.len())
62 .finish()
63 }
64}
65
66impl PartialEq for ValueReference {
67 fn eq(&self, other: &Self) -> bool {
68 self.value_container.value_eq(&other.value_container)
70 }
71}
72
73impl ValueReference {
74 pub fn pointer_address(&self) -> &Option<PointerAddress> {
75 &self.pointer_address
76 }
77
78 pub fn current_value_container(&self) -> &ValueContainer {
79 &self.value_container
80 }
81
82 pub fn resolve_current_value(&self) -> Rc<RefCell<Value>> {
83 self.value_container.to_value()
84 }
85
86 pub fn is_mutable(&self) -> bool {
87 core::matches!(self.mutability, ReferenceMutability::Mutable)
88 }
89}