Skip to main content

datex_core/shared_values/
pointer.rs

1use 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 of the owned pointer, must be a local pointer address
15    address: OwnedPointerAddress,
16    // TODO: additional fields will probably be added later, e.g. previous owners
17    // subscribers: Vec<(Endpoint, Permissions)>,
18}
19
20#[derive(Debug, Clone, PartialEq, Eq, Hash)]
21pub struct ReferencedPointer {
22    /// Address of the borrowed pointer, can be a local or remote pointer address
23    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    /// Creates a new owned pointer with the given local pointer address
57    pub(crate) fn new_owned(address: OwnedPointerAddress) -> Self {
58        Pointer::Owned(OwnedPointer { address })
59    }
60
61    /// Creates a new borrowed pointer with the given pointer address and mutability
62    pub(crate) fn new_reference(
63        address: ReferencedPointerAddress,
64        mutability: PointerReferenceMutability,
65    ) -> Self {
66        Pointer::Referenced(ReferencedPointer {
67            address,
68            mutability,
69        })
70    }
71}