burn_dataset/dataset/
base.rs1use std::error::Error;
2use std::sync::Arc;
3
4use crate::{DatasetError, DatasetIterator};
5
6pub trait Dataset<I, E = DatasetError>: Send + Sync
14where
15 E: Error + Send + Sync + 'static,
16{
17 fn get(&self, index: usize) -> Result<I, E>;
23
24 fn get_many(&self, indexes: Vec<usize>) -> Result<Vec<I>, E> {
30 let len = self.len();
31 let mut items = Vec::new();
32
33 for i in indexes {
34 assert!(i < len, "Index out of bounds for dataset: {i} >= {len}");
35 let item = self.get(i)?;
36 items.push(item);
37 }
38
39 Ok(items)
40 }
41
42 fn len(&self) -> usize;
44
45 fn is_empty(&self) -> bool {
47 self.len() == 0
48 }
49
50 fn iter(&self) -> DatasetIterator<'_, I, E>
52 where
53 Self: Sized,
54 {
55 DatasetIterator::new(self)
56 }
57}
58
59impl<D, I, E> Dataset<I, E> for Arc<D>
60where
61 D: Dataset<I, E>,
62 E: Error + Send + Sync + 'static,
63{
64 fn get(&self, index: usize) -> Result<I, E> {
65 self.as_ref().get(index)
66 }
67
68 fn get_many(&self, indexes: Vec<usize>) -> Result<Vec<I>, E> {
69 self.as_ref().get_many(indexes)
70 }
71
72 fn len(&self) -> usize {
73 self.as_ref().len()
74 }
75}
76
77impl<I, E> Dataset<I, E> for Arc<dyn Dataset<I, E>>
78where
79 E: Error + Send + Sync + 'static,
80{
81 fn get(&self, index: usize) -> Result<I, E> {
82 self.as_ref().get(index)
83 }
84
85 fn get_many(&self, indexes: Vec<usize>) -> Result<Vec<I>, E> {
86 self.as_ref().get_many(indexes)
87 }
88
89 fn len(&self) -> usize {
90 self.as_ref().len()
91 }
92}
93
94impl<D, I, E> Dataset<I, E> for Box<D>
95where
96 D: Dataset<I, E>,
97 E: Error + Send + Sync + 'static,
98{
99 fn get(&self, index: usize) -> Result<I, E> {
100 self.as_ref().get(index)
101 }
102
103 fn get_many(&self, indexes: Vec<usize>) -> Result<Vec<I>, E> {
104 self.as_ref().get_many(indexes)
105 }
106
107 fn len(&self) -> usize {
108 self.as_ref().len()
109 }
110}
111
112impl<I, E> Dataset<I, E> for Box<dyn Dataset<I, E>>
113where
114 E: Error + Send + Sync + 'static,
115{
116 fn get(&self, index: usize) -> Result<I, E> {
117 self.as_ref().get(index)
118 }
119
120 fn get_many(&self, indexes: Vec<usize>) -> Result<Vec<I>, E> {
121 self.as_ref().get_many(indexes)
122 }
123
124 fn len(&self) -> usize {
125 self.as_ref().len()
126 }
127}