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