Skip to main content

ruda_model/record/
containers.rs

1use alloc::{boxed::Box, collections::{BTreeMap, BTreeSet, LinkedList, VecDeque}, string::String};
2use core::ops::{Bound, Range, RangeFrom, RangeFull, RangeTo, RangeToInclusive};
3use serde::{Deserialize, Serialize, de::DeserializeOwned};
4
5use super::{PrecisionSettings, Record};
6use crate::tensor::backend::Backend;
7
8impl<B: Backend, T: Record<B>> Record<B> for Box<T> {
9    type Item<S: PrecisionSettings> = Box<T::Item<S>>;
10
11    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> {
12        Box::new((*self).into_item::<S>())
13    }
14
15    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
16        Box::new(T::from_item::<S>(*item, device))
17    }
18}
19
20impl<B: Backend, T: Record<B>> Record<B> for VecDeque<T> {
21    type Item<S: PrecisionSettings> = VecDeque<T::Item<S>>;
22
23    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> {
24        self.into_iter().map(T::into_item::<S>).collect()
25    }
26
27    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
28        item.into_iter().map(|value| T::from_item::<S>(value, device)).collect()
29    }
30}
31
32impl<B: Backend, T: Record<B>> Record<B> for LinkedList<T> {
33    type Item<S: PrecisionSettings> = LinkedList<T::Item<S>>;
34
35    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> {
36        self.into_iter().map(T::into_item::<S>).collect()
37    }
38
39    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
40        item.into_iter().map(|value| T::from_item::<S>(value, device)).collect()
41    }
42}
43
44impl<B: Backend, T: Record<B>, E: Record<B>> Record<B> for Result<T, E> {
45    type Item<S: PrecisionSettings> = Result<T::Item<S>, E::Item<S>>;
46
47    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> {
48        match self {
49            Ok(value) => Ok(value.into_item::<S>()),
50            Err(value) => Err(value.into_item::<S>()),
51        }
52    }
53
54    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
55        match item {
56            Ok(value) => Ok(T::from_item::<S>(value, device)),
57            Err(value) => Err(E::from_item::<S>(value, device)),
58        }
59    }
60}
61
62impl<B, K, T> Record<B> for BTreeMap<K, T>
63where B: Backend, K: Ord + Clone + Send + Serialize + DeserializeOwned, T: Record<B> {
64    type Item<S: PrecisionSettings> = BTreeMap<K, T::Item<S>>;
65
66    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> {
67        self.into_iter().map(|(key, value)| (key, value.into_item::<S>())).collect()
68    }
69
70    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
71        item.into_iter().map(|(key, value)| (key, T::from_item::<S>(value, device))).collect()
72    }
73}
74
75impl<B, K> Record<B> for BTreeSet<K>
76where B: Backend, K: Ord + Clone + Send + Serialize + DeserializeOwned {
77    type Item<S: PrecisionSettings> = Self;
78
79    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> { self }
80
81    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, _device: &B::Device) -> Self { item }
82}
83
84impl<B: Backend, T: Record<B>> Record<B> for hashbrown::HashMap<String, T> {
85    type Item<S: PrecisionSettings> = hashbrown::HashMap<String, T::Item<S>>;
86
87    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> {
88        self.into_iter().map(|(key, value)| (key, value.into_item::<S>())).collect()
89    }
90
91    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
92        item.into_iter().map(|(key, value)| (key, T::from_item::<S>(value, device))).collect()
93    }
94}
95
96#[cfg(feature = "std")]
97impl<B: Backend, T: Record<B>> Record<B> for std::collections::HashMap<String, T> {
98    type Item<S: PrecisionSettings> = std::collections::HashMap<String, T::Item<S>>;
99
100    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> {
101        self.into_iter().map(|(key, value)| (key, value.into_item::<S>())).collect()
102    }
103
104    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
105        item.into_iter().map(|(key, value)| (key, T::from_item::<S>(value, device))).collect()
106    }
107}
108
109impl<B: Backend, T: Record<B>> Record<B> for Range<T> {
110    type Item<S: PrecisionSettings> = (T::Item<S>, T::Item<S>);
111
112    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> {
113        (self.start.into_item::<S>(), self.end.into_item::<S>())
114    }
115
116    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
117        T::from_item::<S>(item.0, device)..T::from_item::<S>(item.1, device)
118    }
119}
120
121impl<B: Backend, T: Record<B>> Record<B> for RangeFrom<T> {
122    type Item<S: PrecisionSettings> = T::Item<S>;
123
124    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> { self.start.into_item::<S>() }
125
126    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
127        T::from_item::<S>(item, device)..
128    }
129}
130
131impl<B: Backend, T: Record<B>> Record<B> for RangeTo<T> {
132    type Item<S: PrecisionSettings> = T::Item<S>;
133
134    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> { self.end.into_item::<S>() }
135
136    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
137        ..T::from_item::<S>(item, device)
138    }
139}
140
141impl<B: Backend, T: Record<B>> Record<B> for RangeToInclusive<T> {
142    type Item<S: PrecisionSettings> = T::Item<S>;
143
144    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> { self.end.into_item::<S>() }
145
146    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
147        ..=T::from_item::<S>(item, device)
148    }
149}
150
151impl<B: Backend> Record<B> for RangeFull {
152    type Item<S: PrecisionSettings> = ();
153
154    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> {}
155
156    fn from_item<S: PrecisionSettings>(_item: Self::Item<S>, _device: &B::Device) -> Self { .. }
157}
158
159/// Serialized original included/excluded/unbounded range endpoints.
160#[derive(Clone, Serialize, Deserialize, Record)]
161pub enum BoundItem<T> {
162    /// An included endpoint.
163    Included(T),
164    /// An excluded endpoint.
165    Excluded(T),
166    /// No endpoint.
167    Unbounded,
168}
169
170impl<B: Backend, T: Record<B>> Record<B> for Bound<T> {
171    type Item<S: PrecisionSettings> = BoundItem<T::Item<S>>;
172
173    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> {
174        match self {
175            Self::Included(value) => BoundItem::Included(value.into_item::<S>()),
176            Self::Excluded(value) => BoundItem::Excluded(value.into_item::<S>()),
177            Self::Unbounded => BoundItem::Unbounded,
178        }
179    }
180
181    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
182        match item {
183            BoundItem::Included(value) => Self::Included(T::from_item::<S>(value, device)),
184            BoundItem::Excluded(value) => Self::Excluded(T::from_item::<S>(value, device)),
185            BoundItem::Unbounded => Self::Unbounded,
186        }
187    }
188}