nuscenes_data/dataset/
types.rs

1use super::inner::{DatasetInner, InstanceInner, SampleInner, SceneInner};
2use crate::{
3    error::Result,
4    serializable::{
5        Attribute, CalibratedSensor, Category, EgoPose, Log, Map, SampleAnnotation, SampleData,
6        Sensor, Visibility, VisibilityToken,
7    },
8    DatasetLoader, Token,
9};
10use ownref::ArcRefC;
11use std::{
12    ops::Deref,
13    path::{Path, PathBuf},
14};
15
16type ARef<T> = ArcRefC<'static, DatasetInner, T>;
17
18macro_rules! make_ref {
19    ($name:ident, $ty:ty) => {
20        pub struct $name {
21            #[allow(dead_code)]
22            owner: ARef<DatasetInner>,
23            ref_: ARef<$ty>,
24        }
25
26        impl $name {
27            #[allow(dead_code)]
28            fn new(owner: ARef<DatasetInner>, ref_: ARef<$ty>) -> Self {
29                Self { owner, ref_ }
30            }
31
32            pub fn dataset(&self) -> Dataset {
33                Dataset::new(self.owner.clone(), self.owner.clone())
34            }
35        }
36
37        impl Deref for $name {
38            type Target = $ty;
39
40            fn deref(&self) -> &Self::Target {
41                self.ref_.deref()
42            }
43        }
44    };
45}
46
47make_ref!(Dataset, DatasetInner);
48make_ref!(AttributeRef, Attribute);
49make_ref!(CalibratedSensorRef, CalibratedSensor);
50make_ref!(CategoryRef, Category);
51make_ref!(EgoPoseRef, EgoPose);
52make_ref!(InstanceRef, InstanceInner);
53make_ref!(LogRef, Log);
54make_ref!(MapRef, Map);
55make_ref!(SceneRef, SceneInner);
56make_ref!(SampleRef, SampleInner);
57make_ref!(SampleAnnotationRef, SampleAnnotation);
58make_ref!(SampleDataRef, SampleData);
59make_ref!(SensorRef, Sensor);
60make_ref!(VisibilityRef, Visibility);
61
62impl Dataset {
63    pub(crate) fn from_inner(inner: DatasetInner) -> Self {
64        let owner = ARef::new(inner);
65        Self {
66            owner: owner.clone(),
67            ref_: owner.clone(),
68        }
69    }
70
71    pub fn load<P>(version: &str, dataset_dir: P) -> Result<Self>
72    where
73        P: AsRef<Path>,
74    {
75        DatasetLoader::default().load(version, dataset_dir)
76    }
77
78    pub fn attribute(&self, token: Token) -> Option<AttributeRef> {
79        let ref_ = self
80            .owner
81            .clone()
82            .filter_map(|owner| owner.attribute_map.get(&token))?;
83        Some(AttributeRef::new(self.owner.clone(), ref_))
84    }
85
86    pub fn calibrated_sensor(&self, token: Token) -> Option<CalibratedSensorRef> {
87        let ref_ = self
88            .owner
89            .clone()
90            .filter_map(|owner| owner.calibrated_sensor_map.get(&token))?;
91        Some(CalibratedSensorRef::new(self.owner.clone(), ref_))
92    }
93
94    pub fn category(&self, token: Token) -> Option<CategoryRef> {
95        let ref_ = self
96            .owner
97            .clone()
98            .filter_map(|owner| owner.category_map.get(&token))?;
99        Some(CategoryRef::new(self.owner.clone(), ref_))
100    }
101
102    pub fn ego_pose(&self, token: Token) -> Option<EgoPoseRef> {
103        let ref_ = self
104            .owner
105            .clone()
106            .filter_map(|owner| owner.ego_pose_map.get(&token))?;
107        Some(EgoPoseRef::new(self.owner.clone(), ref_))
108    }
109
110    pub fn instance(&self, token: Token) -> Option<InstanceRef> {
111        let ref_ = self
112            .owner
113            .clone()
114            .filter_map(|owner| owner.instance_map.get(&token))?;
115        Some(InstanceRef::new(self.owner.clone(), ref_))
116    }
117
118    pub fn log(&self, token: Token) -> Option<LogRef> {
119        let ref_ = self
120            .owner
121            .clone()
122            .filter_map(|owner| owner.log_map.get(&token))?;
123        Some(LogRef::new(self.owner.clone(), ref_))
124    }
125
126    pub fn map(&self, token: Token) -> Option<MapRef> {
127        let ref_ = self
128            .owner
129            .clone()
130            .filter_map(|owner| owner.map_map.get(&token))?;
131        Some(MapRef::new(self.owner.clone(), ref_))
132    }
133
134    pub fn scene(&self, token: Token) -> Option<SceneRef> {
135        let ref_ = self
136            .owner
137            .clone()
138            .filter_map(|owner| owner.scene_map.get(&token))?;
139        Some(SceneRef::new(self.owner.clone(), ref_))
140    }
141
142    pub fn sample(&self, token: Token) -> Option<SampleRef> {
143        let ref_ = self
144            .owner
145            .clone()
146            .filter_map(|owner| owner.sample_map.get(&token))?;
147        Some(SampleRef::new(self.owner.clone(), ref_))
148    }
149
150    pub fn sample_annotation(&self, token: Token) -> Option<SampleAnnotationRef> {
151        let ref_ = self
152            .owner
153            .clone()
154            .filter_map(|owner| owner.sample_annotation_map.get(&token))?;
155        Some(SampleAnnotationRef::new(self.owner.clone(), ref_))
156    }
157
158    pub fn sample_data(&self, token: Token) -> Option<SampleDataRef> {
159        let ref_ = self
160            .owner
161            .clone()
162            .filter_map(|owner| owner.sample_data_map.get(&token))?;
163        Some(SampleDataRef::new(self.owner.clone(), ref_))
164    }
165
166    pub fn sensor(&self, token: Token) -> Option<SensorRef> {
167        let ref_ = self
168            .owner
169            .clone()
170            .filter_map(|owner| owner.sensor_map.get(&token))?;
171        Some(SensorRef::new(self.owner.clone(), ref_))
172    }
173
174    pub fn visibility(&self, token: VisibilityToken) -> Option<VisibilityRef> {
175        let ref_ = self
176            .owner
177            .clone()
178            .filter_map(|owner| owner.visibility_map.get(&token))?;
179        Some(VisibilityRef::new(self.owner.clone(), ref_))
180    }
181}
182
183macro_rules! impl_field_iter {
184    ($method_name:ident, $field_name:ident, $item_ty:ident) => {
185        impl Dataset {
186            pub fn $method_name(&self) -> impl Iterator<Item = $item_ty> + Send + Sync + '_ {
187                self.owner
188                    .clone()
189                    .flat_map(|owner| owner.$field_name.values())
190                    .map(|item| $item_ty::new(self.owner.clone(), item))
191            }
192        }
193    };
194}
195
196impl_field_iter!(attribute_iter, attribute_map, AttributeRef);
197impl_field_iter!(
198    calibrated_sensor_iter,
199    calibrated_sensor_map,
200    CalibratedSensorRef
201);
202impl_field_iter!(category_iter, category_map, CategoryRef);
203impl_field_iter!(ego_pose_iter, ego_pose_map, EgoPoseRef);
204impl_field_iter!(instance_iter, instance_map, InstanceRef);
205impl_field_iter!(log_iter, log_map, LogRef);
206impl_field_iter!(map_iter, map_map, MapRef);
207impl_field_iter!(scene_iter, scene_map, SceneRef);
208impl_field_iter!(sample_iter, sample_map, SampleRef);
209impl_field_iter!(
210    sample_annotation_iter,
211    sample_annotation_map,
212    SampleAnnotationRef
213);
214impl_field_iter!(sample_data_iter, sample_data_map, SampleDataRef);
215impl_field_iter!(sensor_iter, sensor_map, SensorRef);
216impl_field_iter!(visibility_iter, visibility_map, VisibilityRef);
217
218impl CalibratedSensorRef {
219    pub fn sensor(&self) -> SensorRef {
220        let ref_ = self
221            .owner
222            .clone()
223            .map(|owner| &owner.sensor_map[&self.ref_.sensor_token]);
224        SensorRef::new(self.owner.clone(), ref_)
225    }
226}
227
228impl InstanceRef {
229    pub fn category(&self) -> CategoryRef {
230        let ref_ = self
231            .owner
232            .clone()
233            .map(|owner| &owner.category_map[&self.ref_.category_token]);
234        CategoryRef::new(self.owner.clone(), ref_)
235    }
236
237    pub fn annotation_iter(
238        &self,
239    ) -> impl Iterator<Item = SampleAnnotationRef> + Send + Sync + Clone + '_ {
240        self.ref_
241            .annotation_tokens
242            .iter()
243            .map(|token| {
244                self.owner
245                    .clone()
246                    .map(|owner| &owner.sample_annotation_map[token])
247            })
248            .map(|ref_| SampleAnnotationRef::new(self.owner.clone(), ref_))
249    }
250}
251
252impl LogRef {
253    // pub fn logfile(&self) -> Option<PathBuf> {
254    //     Some(self.owner.dataset_dir.join(self.ref_.logfile.as_ref()?))
255    // }
256}
257
258impl MapRef {
259    pub fn log_iter(&self) -> impl Iterator<Item = LogRef> + Send + Sync + Clone + '_ {
260        self.ref_
261            .log_tokens
262            .iter()
263            .map(|token| self.owner.clone().map(|owner| &owner.log_map[token]))
264            .map(|ref_| LogRef::new(self.owner.clone(), ref_))
265    }
266
267    pub fn path(&self) -> PathBuf {
268        self.owner.dataset_dir.join(&self.ref_.filename)
269    }
270}
271
272impl SceneRef {
273    pub fn log(&self) -> LogRef {
274        let ref_ = self
275            .owner
276            .clone()
277            .map(|owner| &owner.log_map[&self.ref_.log_token]);
278        LogRef::new(self.owner.clone(), ref_)
279    }
280
281    pub fn sample_iter(&self) -> impl Iterator<Item = SampleRef> + Send + Sync + Clone + '_ {
282        self.ref_
283            .sample_tokens
284            .iter()
285            .map(|token| self.owner.clone().map(|owner| &owner.sample_map[token]))
286            .map(|ref_| SampleRef::new(self.owner.clone(), ref_))
287    }
288}
289
290impl SampleRef {
291    pub fn next(&self) -> Option<SampleRef> {
292        let ref_ = self
293            .owner
294            .clone()
295            .filter_map(|owner| Some(&owner.sample_map[&self.ref_.next?]))?;
296        Some(SampleRef::new(self.owner.clone(), ref_))
297    }
298
299    pub fn prev(&self) -> Option<SampleRef> {
300        let ref_ = self
301            .owner
302            .clone()
303            .filter_map(|owner| Some(&owner.sample_map[&self.ref_.prev?]))?;
304        Some(SampleRef::new(self.owner.clone(), ref_))
305    }
306
307    pub fn scene(&self) -> SceneRef {
308        let ref_ = self
309            .owner
310            .clone()
311            .map(|owner| &owner.scene_map[&self.ref_.scene_token]);
312        SceneRef::new(self.owner.clone(), ref_)
313    }
314
315    pub fn annotation_iter(
316        &self,
317    ) -> impl Iterator<Item = SampleAnnotationRef> + Send + Sync + Clone + '_ {
318        self.ref_
319            .annotation_tokens
320            .iter()
321            .map(|token| {
322                self.owner
323                    .clone()
324                    .map(|owner| &owner.sample_annotation_map[token])
325            })
326            .map(|ref_| SampleAnnotationRef::new(self.owner.clone(), ref_))
327    }
328
329    pub fn sample_data_iter(
330        &self,
331    ) -> impl Iterator<Item = SampleDataRef> + Send + Sync + Clone + '_ {
332        self.ref_
333            .sample_data_tokens
334            .iter()
335            .map(|token| {
336                self.owner
337                    .clone()
338                    .map(|owner| &owner.sample_data_map[token])
339            })
340            .map(|ref_| SampleDataRef::new(self.owner.clone(), ref_))
341    }
342}
343
344impl SampleAnnotationRef {
345    pub fn sample(&self) -> SampleRef {
346        let ref_ = self
347            .owner
348            .clone()
349            .map(|owner| &owner.sample_map[&self.ref_.sample_token]);
350        SampleRef::new(self.owner.clone(), ref_)
351    }
352
353    pub fn instance(&self) -> InstanceRef {
354        let ref_ = self
355            .owner
356            .clone()
357            .map(|owner| &owner.instance_map[&self.ref_.instance_token]);
358        InstanceRef::new(self.owner.clone(), ref_)
359    }
360
361    pub fn attribute_iter(&self) -> impl Iterator<Item = AttributeRef> + Send + Sync + Clone + '_ {
362        self.ref_
363            .attribute_tokens
364            .iter()
365            .map(|token| self.owner.clone().map(|owner| &owner.attribute_map[token]))
366            .map(|ref_| AttributeRef::new(self.owner.clone(), ref_))
367    }
368
369    pub fn visibility(&self) -> Option<VisibilityRef> {
370        let ref_ = self
371            .owner
372            .clone()
373            .filter_map(|owner| Some(&owner.visibility_map[&self.ref_.visibility_token?]))?;
374        Some(VisibilityRef::new(self.owner.clone(), ref_))
375    }
376
377    pub fn next(&self) -> Option<SampleAnnotationRef> {
378        let ref_ = self
379            .owner
380            .clone()
381            .filter_map(|owner| Some(&owner.sample_annotation_map[&self.ref_.next?]))?;
382        Some(SampleAnnotationRef::new(self.owner.clone(), ref_))
383    }
384
385    pub fn prev(&self) -> Option<SampleAnnotationRef> {
386        let ref_ = self
387            .owner
388            .clone()
389            .filter_map(|owner| Some(&owner.sample_annotation_map[&self.ref_.prev?]))?;
390        Some(SampleAnnotationRef::new(self.owner.clone(), ref_))
391    }
392}
393
394impl SampleDataRef {
395    pub fn sample(&self) -> SampleRef {
396        let ref_ = self
397            .owner
398            .clone()
399            .map(|owner| &owner.sample_map[&self.ref_.sample_token]);
400        SampleRef::new(self.owner.clone(), ref_)
401    }
402
403    pub fn ego_pose(&self) -> EgoPoseRef {
404        let ref_ = self
405            .owner
406            .clone()
407            .map(|owner| &owner.ego_pose_map[&self.ref_.ego_pose_token]);
408        EgoPoseRef::new(self.owner.clone(), ref_)
409    }
410
411    pub fn calibrated_sensor(&self) -> CalibratedSensorRef {
412        let ref_ = self
413            .owner
414            .clone()
415            .map(|owner| &owner.calibrated_sensor_map[&self.ref_.calibrated_sensor_token]);
416        CalibratedSensorRef::new(self.owner.clone(), ref_)
417    }
418
419    pub fn next(&self) -> Option<SampleDataRef> {
420        let ref_ = self
421            .owner
422            .clone()
423            .filter_map(|owner| Some(&owner.sample_data_map[&self.ref_.next?]))?;
424        Some(SampleDataRef::new(self.owner.clone(), ref_))
425    }
426
427    pub fn prev(&self) -> Option<SampleDataRef> {
428        let ref_ = self
429            .owner
430            .clone()
431            .filter_map(|owner| Some(&owner.sample_data_map[&self.ref_.prev?]))?;
432        Some(SampleDataRef::new(self.owner.clone(), ref_))
433    }
434
435    pub fn path(&self) -> PathBuf {
436        self.owner.dataset_dir.join(&self.ref_.filename)
437    }
438}