ploidy_core/ir/views/
wrappers.rs

1use petgraph::graph::NodeIndex;
2
3use crate::ir::{
4    graph::{IrGraph, IrGraphNode},
5    types::IrType,
6};
7
8use super::{IrTypeView, ViewNode};
9
10/// A graph-aware view of an array type.
11#[derive(Debug)]
12pub struct IrArrayView<'a> {
13    graph: &'a IrGraph<'a>,
14    index: NodeIndex,
15    inner: &'a IrType<'a>,
16}
17
18impl<'a> IrArrayView<'a> {
19    #[inline]
20    pub(in crate::ir) fn new(
21        graph: &'a IrGraph<'a>,
22        index: NodeIndex,
23        inner: &'a IrType<'a>,
24    ) -> Self {
25        Self {
26            graph,
27            index,
28            inner,
29        }
30    }
31
32    /// Returns a view of this array's element type.
33    #[inline]
34    pub fn inner(&self) -> IrTypeView<'a> {
35        let node = IrGraphNode::from_ref(self.graph.spec, self.inner.as_ref());
36        IrTypeView::new(self.graph, self.graph.indices[&node])
37    }
38}
39
40impl<'a> ViewNode<'a> for IrArrayView<'a> {
41    #[inline]
42    fn graph(&self) -> &'a IrGraph<'a> {
43        self.graph
44    }
45
46    #[inline]
47    fn index(&self) -> NodeIndex {
48        self.index
49    }
50}
51
52/// A graph-aware view of a map type.
53#[derive(Debug)]
54pub struct IrMapView<'a> {
55    graph: &'a IrGraph<'a>,
56    index: NodeIndex,
57    inner: &'a IrType<'a>,
58}
59
60impl<'a> IrMapView<'a> {
61    #[inline]
62    pub(in crate::ir) fn new(
63        graph: &'a IrGraph<'a>,
64        index: NodeIndex,
65        inner: &'a IrType<'a>,
66    ) -> Self {
67        Self {
68            graph,
69            index,
70            inner,
71        }
72    }
73
74    /// Returns a view of this map's value type.
75    #[inline]
76    pub fn inner(&self) -> IrTypeView<'a> {
77        let node = IrGraphNode::from_ref(self.graph.spec, self.inner.as_ref());
78        IrTypeView::new(self.graph, self.graph.indices[&node])
79    }
80}
81
82impl<'a> ViewNode<'a> for IrMapView<'a> {
83    #[inline]
84    fn graph(&self) -> &'a IrGraph<'a> {
85        self.graph
86    }
87
88    #[inline]
89    fn index(&self) -> NodeIndex {
90        self.index
91    }
92}
93
94/// A graph-aware view of a nullable type.
95#[derive(Debug)]
96pub struct IrNullableView<'a> {
97    graph: &'a IrGraph<'a>,
98    index: NodeIndex,
99    inner: &'a IrType<'a>,
100}
101
102impl<'a> IrNullableView<'a> {
103    #[inline]
104    pub(in crate::ir) fn new(
105        graph: &'a IrGraph<'a>,
106        index: NodeIndex,
107        inner: &'a IrType<'a>,
108    ) -> Self {
109        Self {
110            graph,
111            index,
112            inner,
113        }
114    }
115
116    /// Returns a view of the inner type.
117    #[inline]
118    pub fn inner(&self) -> IrTypeView<'a> {
119        let node = IrGraphNode::from_ref(self.graph.spec, self.inner.as_ref());
120        IrTypeView::new(self.graph, self.graph.indices[&node])
121    }
122}
123
124impl<'a> ViewNode<'a> for IrNullableView<'a> {
125    #[inline]
126    fn graph(&self) -> &'a IrGraph<'a> {
127        self.graph
128    }
129
130    #[inline]
131    fn index(&self) -> NodeIndex {
132        self.index
133    }
134}