|
1 | | -use crate::error::OutOfMemory; |
| 1 | +use crate::{collections::Vec, error::OutOfMemory}; |
2 | 2 | use core::{fmt, ops::Index}; |
3 | 3 | use cranelift_entity::{EntityRef, SecondaryMap as Inner}; |
| 4 | +use serde::ser::SerializeSeq; |
4 | 5 |
|
5 | 6 | /// Like [`cranelift_entity::SecondaryMap`] but all allocation is fallible. |
6 | 7 | pub struct SecondaryMap<K, V> |
@@ -142,3 +143,46 @@ where |
142 | 143 | &self.inner[k] |
143 | 144 | } |
144 | 145 | } |
| 146 | + |
| 147 | +impl<K, V> From<Vec<V>> for SecondaryMap<K, V> |
| 148 | +where |
| 149 | + K: EntityRef, |
| 150 | + V: Clone + Default, |
| 151 | +{ |
| 152 | + fn from(values: Vec<V>) -> Self { |
| 153 | + let values: alloc::vec::Vec<V> = values.into(); |
| 154 | + let inner = Inner::from(values); |
| 155 | + Self { inner } |
| 156 | + } |
| 157 | +} |
| 158 | + |
| 159 | +impl<K, V> serde::ser::Serialize for SecondaryMap<K, V> |
| 160 | +where |
| 161 | + K: EntityRef, |
| 162 | + V: Clone + serde::ser::Serialize, |
| 163 | +{ |
| 164 | + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| 165 | + where |
| 166 | + S: serde::Serializer, |
| 167 | + { |
| 168 | + let mut seq = serializer.serialize_seq(Some(self.capacity()))?; |
| 169 | + for elem in self.values() { |
| 170 | + seq.serialize_element(elem)?; |
| 171 | + } |
| 172 | + seq.end() |
| 173 | + } |
| 174 | +} |
| 175 | + |
| 176 | +impl<'de, K, V> serde::de::Deserialize<'de> for SecondaryMap<K, V> |
| 177 | +where |
| 178 | + K: EntityRef, |
| 179 | + V: Clone + Default + serde::de::Deserialize<'de>, |
| 180 | +{ |
| 181 | + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
| 182 | + where |
| 183 | + D: serde::Deserializer<'de>, |
| 184 | + { |
| 185 | + let values: Vec<V> = serde::de::Deserialize::deserialize(deserializer)?; |
| 186 | + Ok(Self::from(values)) |
| 187 | + } |
| 188 | +} |
0 commit comments