datex_core/shared_values/
pointer.rs1use crate::shared_values::pointer_address::{
2 OwnedPointerAddress, PointerAddress, ReferencedPointerAddress,
3};
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
7pub enum PointerReferenceMutability {
8 Mutable,
9 Immutable,
10}
11
12#[derive(Debug, Clone, PartialEq, Eq, Hash)]
13pub struct OwnedPointer {
14 address: OwnedPointerAddress,
16 }
19
20#[derive(Debug, Clone, PartialEq, Eq, Hash)]
21pub struct ReferencedPointer {
22 address: ReferencedPointerAddress,
24 mutability: PointerReferenceMutability,
25}
26
27#[derive(Debug, Clone, PartialEq, Eq, Hash)]
28pub enum Pointer {
29 Owned(OwnedPointer),
30 Referenced(ReferencedPointer),
31}
32
33impl Pointer {
34 pub const NULL: Pointer = Pointer::Owned(OwnedPointer {
35 address: OwnedPointerAddress::NULL,
36 });
37
38 pub fn address(&self) -> PointerAddress {
39 match self {
40 Pointer::Owned(owned) => {
41 PointerAddress::Owned(owned.address.clone())
42 }
43 Pointer::Referenced(borrowed) => {
44 PointerAddress::Referenced(borrowed.address.clone())
45 }
46 }
47 }
48
49 pub fn reference_mutability(&self) -> Option<&PointerReferenceMutability> {
50 match self {
51 Pointer::Owned(_) => None,
52 Pointer::Referenced(reference) => Some(&reference.mutability),
53 }
54 }
55
56 pub(crate) fn new_owned(address: OwnedPointerAddress) -> Self {
58 Pointer::Owned(OwnedPointer { address })
59 }
60
61 pub(crate) fn new_reference(
63 address: ReferencedPointerAddress,
64 mutability: PointerReferenceMutability,
65 ) -> Self {
66 Pointer::Referenced(ReferencedPointer {
67 address,
68 mutability,
69 })
70 }
71}