1use core::convert::TryInto;
2
3use super::super::Dcel;
4use super::public_handles::{InnerOuterMarker, PossiblyOuterTag};
5use super::FixedVertexHandle;
6
7#[cfg(feature = "serde")]
8use serde::{Deserialize, Serialize};
9
10pub trait DelaunayElementType: Sized + Default {
11 fn num_elements<V, DE, UE, F>(dcel: &Dcel<V, DE, UE, F>) -> usize;
12}
13#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
20#[cfg_attr(
21 feature = "serde",
22 derive(Serialize, Deserialize),
23 serde(crate = "serde")
24)]
25pub struct FixedHandleImpl<Type, InnerOuter: InnerOuterMarker> {
26 index: u32,
27 ty: Type,
28 inner_outer: InnerOuter,
29}
30
31impl<Type, InnerOuter: InnerOuterMarker> core::fmt::Debug for FixedHandleImpl<Type, InnerOuter> {
32 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
33 f.debug_struct("FixedHandle")
34 .field("index", &self.index)
35 .finish()
36 }
37}
38
39pub const fn new_fixed_face_handle(index: usize) -> FixedHandleImpl<FaceTag, PossiblyOuterTag> {
40 FixedHandleImpl {
41 index: index as u32,
42 ty: FaceTag,
43 inner_outer: PossiblyOuterTag,
44 }
45}
46
47impl FixedVertexHandle {
48 pub fn from_index(index: usize) -> Self {
58 Self::new(index)
61 }
62}
63
64impl<Type: Default, InnerOuter: InnerOuterMarker> FixedHandleImpl<Type, InnerOuter> {
65 pub(crate) fn new(index: usize) -> Self {
66 Self::new_internal(
67 index
68 .try_into()
69 .expect("Index too big - at most 2^32 elements supported"),
70 )
71 }
72
73 pub(crate) fn max() -> Self {
74 Self::new_internal(u32::MAX)
75 }
76
77 pub fn index(&self) -> usize {
88 self.index as usize
89 }
90
91 pub(crate) fn adjust_inner_outer<TargetInnerOuter: InnerOuterMarker>(
92 &self,
93 ) -> FixedHandleImpl<Type, TargetInnerOuter> {
94 FixedHandleImpl::<_, _>::new_internal(self.index)
95 }
96
97 fn new_internal(index: u32) -> Self {
98 Self {
99 index,
100 ty: Type::default(),
101 inner_outer: InnerOuter::default(),
102 }
103 }
104}
105
106pub struct DynamicHandleImpl<'a, V, DE, UE, F, Type, InnerOuter: InnerOuterMarker> {
117 pub(super) dcel: &'a Dcel<V, DE, UE, F>,
118 pub(super) handle: FixedHandleImpl<Type, InnerOuter>,
119}
120
121impl<'a, V, DE, UE, F, Type: Default, InnerOuter: InnerOuterMarker>
122 DynamicHandleImpl<'a, V, DE, UE, F, Type, InnerOuter>
123{
124 #[inline]
125 pub(crate) fn new(
126 dcel: &'a Dcel<V, DE, UE, F>,
127 handle: FixedHandleImpl<Type, InnerOuter>,
128 ) -> Self {
129 Self { dcel, handle }
130 }
131
132 pub(in super::super) fn adjust_inner_outer<TargetInnerOuter: InnerOuterMarker>(
133 &self,
134 ) -> DynamicHandleImpl<'a, V, DE, UE, F, Type, TargetInnerOuter> {
135 DynamicHandleImpl::new(self.dcel, self.handle.adjust_inner_outer())
136 }
137}
138
139#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
140#[cfg_attr(
141 feature = "serde",
142 derive(Serialize, Deserialize),
143 serde(crate = "serde")
144)]
145pub struct VertexTag;
146#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
147#[cfg_attr(
148 feature = "serde",
149 derive(Serialize, Deserialize),
150 serde(crate = "serde")
151)]
152pub struct DirectedEdgeTag;
153#[cfg_attr(
154 feature = "serde",
155 derive(Serialize, Deserialize),
156 serde(crate = "serde")
157)]
158#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
159pub struct UndirectedEdgeTag;
160#[cfg_attr(
161 feature = "serde",
162 derive(Serialize, Deserialize),
163 serde(crate = "serde")
164)]
165#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
166pub struct FaceTag;
167#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
168pub struct DirectedVoronoiEdgeTag;
169#[cfg_attr(
170 feature = "serde",
171 derive(Serialize, Deserialize),
172 serde(crate = "serde")
173)]
174#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
175pub struct UndirectedVoronoiEdgeTag;
176
177#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
178pub struct VoronoiFaceTag;
179
180impl DelaunayElementType for VertexTag {
181 fn num_elements<V, DE, UE, F>(dcel: &Dcel<V, DE, UE, F>) -> usize {
182 dcel.num_vertices()
183 }
184}
185
186impl DelaunayElementType for DirectedEdgeTag {
187 fn num_elements<V, DE, UE, F>(dcel: &Dcel<V, DE, UE, F>) -> usize {
188 dcel.num_directed_edges()
189 }
190}
191
192impl DelaunayElementType for UndirectedEdgeTag {
193 fn num_elements<V, DE, UE, F>(dcel: &Dcel<V, DE, UE, F>) -> usize {
194 dcel.num_undirected_edges()
195 }
196}
197
198impl DelaunayElementType for FaceTag {
199 fn num_elements<V, DE, UE, F>(dcel: &Dcel<V, DE, UE, F>) -> usize {
200 dcel.num_faces()
201 }
202}
203
204impl DelaunayElementType for VoronoiFaceTag {
205 fn num_elements<V, DE, UE, F>(dcel: &Dcel<V, DE, UE, F>) -> usize {
206 dcel.num_vertices()
207 }
208}
209
210impl DelaunayElementType for DirectedVoronoiEdgeTag {
211 fn num_elements<V, DE, UE, F>(dcel: &Dcel<V, DE, UE, F>) -> usize {
212 dcel.num_directed_edges()
213 }
214}
215
216impl DelaunayElementType for UndirectedVoronoiEdgeTag {
217 fn num_elements<V, DE, UE, F>(dcel: &Dcel<V, DE, UE, F>) -> usize {
218 dcel.num_undirected_edges()
219 }
220}