Skip to main content

raphtory_api/core/entities/
layers.rs

1use 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}