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#[derive(Clone, Serialize, Deserialize, Record)]
161pub enum BoundItem<T> {
162 Included(T),
164 Excluded(T),
166 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}