raphtory_api/core/entities/
layers.rs1use crate::core::storage::arc_str::ArcStr;
2use bytemuck::{Pod, Zeroable};
3use iter_enum::{
4 DoubleEndedIterator, ExactSizeIterator, FusedIterator, IndexedParallelIterator, Iterator,
5 ParallelExtend, ParallelIterator,
6};
7use rayon::prelude::*;
8use serde::{Deserialize, Serialize};
9use std::{
10 fmt::{Display, Formatter, Result as FmtResult},
11 iter::Copied,
12 sync::Arc,
13};
14
15#[derive(
16 Debug,
17 Default,
18 Copy,
19 Clone,
20 PartialEq,
21 Eq,
22 Ord,
23 PartialOrd,
24 Hash,
25 Serialize,
26 Deserialize,
27 Pod,
28 Zeroable,
29)]
30#[repr(transparent)]
31pub struct LayerId(pub usize);
32impl PartialEq<usize> for LayerId {
33 fn eq(&self, other: &usize) -> bool {
34 self.0 == *other
35 }
36}
37
38impl PartialEq<LayerId> for usize {
39 fn eq(&self, other: &LayerId) -> bool {
40 *self == other.0
41 }
42}
43
44impl Display for LayerId {
45 fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
46 Display::fmt(&self.0, f)
47 }
48}
49
50#[derive(Debug, Clone, PartialEq, Eq)]
51pub enum Layer {
52 All,
53 None,
54 Default,
55 One(ArcStr),
56 Multiple(Arc<[ArcStr]>),
57}
58
59impl Layer {
60 pub fn contains(&self, name: &str) -> bool {
61 match self {
62 Layer::All => true,
63 Layer::None => false,
64 Layer::Default => name == "_default",
65 Layer::One(layer) => layer == name,
66 Layer::Multiple(layers) => layers.iter().any(|l| l == name),
67 }
68 }
69
70 fn from_iter<I: IntoIterator<Item: SingleLayer, IntoIter: ExactSizeIterator>>(
71 names: I,
72 ) -> Self {
73 let mut names = names.into_iter();
74 match names.len() {
75 0 => Layer::None,
76 1 => Layer::One(names.next().unwrap().name()),
77 _ => Layer::Multiple(names.map(|s| s.name()).collect::<Vec<_>>().into()),
78 }
79 }
80}
81
82pub trait SingleLayer {
83 fn name(self) -> ArcStr;
84}
85
86impl<T: SingleLayer> From<T> for Layer {
87 fn from(value: T) -> Self {
88 Layer::One(value.name())
89 }
90}
91
92impl SingleLayer for ArcStr {
93 fn name(self) -> ArcStr {
94 self
95 }
96}
97
98impl SingleLayer for String {
99 fn name(self) -> ArcStr {
100 self.into()
101 }
102}
103impl SingleLayer for &str {
104 fn name(self) -> ArcStr {
105 self.into()
106 }
107}
108
109impl SingleLayer for &String {
110 fn name(self) -> ArcStr {
111 self.as_str().into()
112 }
113}
114
115impl SingleLayer for &ArcStr {
116 fn name(self) -> ArcStr {
117 self.clone()
118 }
119}
120
121impl<T: SingleLayer> SingleLayer for Option<T> {
122 fn name(self) -> ArcStr {
123 match self {
124 None => ArcStr::from("_default"),
125 Some(s) => s.name(),
126 }
127 }
128}
129
130impl<T: SingleLayer> From<Vec<T>> for Layer {
131 fn from(names: Vec<T>) -> Self {
132 Self::from_iter(names)
133 }
134}
135
136impl<T: SingleLayer, const N: usize> From<[T; N]> for Layer {
137 fn from(names: [T; N]) -> Self {
138 Self::from_iter(names)
139 }
140}
141
142impl<'a, T: 'a> From<&'a [T]> for Layer
143where
144 &'a T: SingleLayer,
145{
146 fn from(names: &'a [T]) -> Self {
147 Self::from_iter(names)
148 }
149}
150
151impl<'a, T: 'a> From<&'a Vec<T>> for Layer
152where
153 &'a T: SingleLayer,
154{
155 fn from(names: &'a Vec<T>) -> Self {
156 Self::from_iter(names)
157 }
158}
159
160#[derive(Clone, Debug)]
161pub enum LayerIds {
162 None,
163 All,
164 One(LayerId),
165 Multiple(Multiple),
166}
167
168#[derive(
169 Iterator,
170 DoubleEndedIterator,
171 ExactSizeIterator,
172 FusedIterator,
173 ParallelIterator,
174 ParallelExtend,
175 IndexedParallelIterator,
176)]
177pub enum LayerVariants<None, All, One, Multiple> {
178 None(None),
179 All(All),
180 One(One),
181 Multiple(Multiple),
182}
183
184#[derive(Clone, Debug, Default)]
185pub struct Multiple(pub Arc<[LayerId]>);
186
187impl<'a> IntoIterator for &'a Multiple {
188 type Item = LayerId;
189 type IntoIter = Copied<core::slice::Iter<'a, Self::Item>>;
190
191 fn into_iter(self) -> Self::IntoIter {
192 self.0.iter().copied()
193 }
194}
195
196impl Multiple {
197 #[inline]
198 pub fn contains(&self, id: LayerId) -> bool {
199 self.0.binary_search(&id).is_ok()
200 }
201
202 #[inline]
203 pub fn into_iter(self) -> impl Iterator<Item = LayerId> {
204 let ids = self.0.clone();
205 (0..ids.len()).map(move |i| ids[i])
206 }
207
208 #[inline]
209 pub fn iter(&self) -> impl Iterator<Item = LayerId> + '_ {
210 self.0.iter().copied()
211 }
212
213 #[inline]
214 pub fn get_id_by_index(&self, index: usize) -> Option<LayerId> {
215 self.0.get(index).copied()
216 }
217
218 #[inline]
219 pub fn get_index_by_id(&self, id: LayerId) -> Option<usize> {
220 self.0.binary_search(&id).ok()
221 }
222
223 #[inline]
224 pub fn par_iter(&self) -> impl rayon::iter::ParallelIterator<Item = LayerId> {
225 let bit_vec = self.0.clone();
226 (0..bit_vec.len()).into_par_iter().map(move |i| bit_vec[i])
227 }
228
229 #[inline]
230 pub fn len(&self) -> usize {
231 self.0.len()
232 }
233
234 #[inline]
235 pub fn is_empty(&self) -> bool {
236 self.0.is_empty()
237 }
238}
239
240impl FromIterator<usize> for Multiple {
241 fn from_iter<I: IntoIterator<Item = usize>>(iter: I) -> Self {
242 let mut inner: Vec<_> = iter.into_iter().map(LayerId).collect();
243 inner.sort();
244 inner.dedup();
245 Multiple(inner.into())
246 }
247}
248
249impl FromIterator<LayerId> for Multiple {
250 fn from_iter<I: IntoIterator<Item = LayerId>>(iter: I) -> Self {
251 let mut inner: Vec<_> = iter.into_iter().collect();
252 inner.sort();
253 inner.dedup();
254 Multiple(inner.into())
255 }
256}
257
258impl From<Vec<LayerId>> for Multiple {
259 fn from(mut v: Vec<LayerId>) -> Self {
260 v.sort();
261 v.dedup();
262 Multiple(v.into())
263 }
264}
265
266impl From<Vec<usize>> for Multiple {
267 fn from(v: Vec<usize>) -> Self {
268 let mut v: Vec<_> = v.into_iter().map(LayerId).collect();
269 v.sort();
270 v.dedup();
271 Multiple(v.into())
272 }
273}