Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/cranelift/entity/src/map.rs
1691 views
1
//! Densely numbered entity references as mapping keys.
2
3
use crate::EntityRef;
4
use crate::iter::{Iter, IterMut};
5
use crate::keys::Keys;
6
use alloc::vec::Vec;
7
use core::cmp::min;
8
use core::fmt;
9
use core::marker::PhantomData;
10
use core::ops::{Index, IndexMut};
11
use core::slice;
12
#[cfg(feature = "enable-serde")]
13
use serde::{
14
Deserialize, Serialize,
15
de::{Deserializer, SeqAccess, Visitor},
16
ser::{SerializeSeq, Serializer},
17
};
18
19
/// A mapping `K -> V` for densely indexed entity references.
20
///
21
/// The `SecondaryMap` data structure uses the dense index space to implement a map with a vector.
22
/// Unlike `PrimaryMap`, an `SecondaryMap` can't be used to allocate entity references. It is used
23
/// to associate secondary information with entities.
24
///
25
/// The map does not track if an entry for a key has been inserted or not. Instead it behaves as if
26
/// all keys have a default entry from the beginning.
27
#[derive(Clone, Hash)]
28
pub struct SecondaryMap<K, V>
29
where
30
K: EntityRef,
31
V: Clone,
32
{
33
elems: Vec<V>,
34
default: V,
35
unused: PhantomData<K>,
36
}
37
38
/// Shared `SecondaryMap` implementation for all value types.
39
impl<K, V> SecondaryMap<K, V>
40
where
41
K: EntityRef,
42
V: Clone,
43
{
44
/// Create a new empty map.
45
pub fn new() -> Self
46
where
47
V: Default,
48
{
49
Self {
50
elems: Vec::new(),
51
default: Default::default(),
52
unused: PhantomData,
53
}
54
}
55
56
/// Create a new, empty map with the specified capacity.
57
///
58
/// The map will be able to hold exactly `capacity` elements without reallocating.
59
pub fn with_capacity(capacity: usize) -> Self
60
where
61
V: Default,
62
{
63
Self {
64
elems: Vec::with_capacity(capacity),
65
default: Default::default(),
66
unused: PhantomData,
67
}
68
}
69
70
/// Create a new empty map with a specified default value.
71
///
72
/// This constructor does not require V to implement Default.
73
pub fn with_default(default: V) -> Self {
74
Self {
75
elems: Vec::new(),
76
default,
77
unused: PhantomData,
78
}
79
}
80
81
/// Returns the number of elements the map can hold without reallocating.
82
pub fn capacity(&self) -> usize {
83
self.elems.capacity()
84
}
85
86
/// Get the element at `k` if it exists.
87
#[inline(always)]
88
pub fn get(&self, k: K) -> Option<&V> {
89
self.elems.get(k.index())
90
}
91
92
/// Is this map completely empty?
93
#[inline(always)]
94
pub fn is_empty(&self) -> bool {
95
self.elems.is_empty()
96
}
97
98
/// Remove all entries from this map.
99
#[inline(always)]
100
pub fn clear(&mut self) {
101
self.elems.clear()
102
}
103
104
/// Iterate over all the keys and values in this map.
105
pub fn iter(&self) -> Iter<'_, K, V> {
106
Iter::new(self.elems.iter())
107
}
108
109
/// Iterate over all the keys and values in this map, mutable edition.
110
pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
111
IterMut::new(self.elems.iter_mut())
112
}
113
114
/// Iterate over all the keys in this map.
115
pub fn keys(&self) -> Keys<K> {
116
Keys::with_len(self.elems.len())
117
}
118
119
/// Iterate over all the values in this map.
120
pub fn values(&self) -> slice::Iter<'_, V> {
121
self.elems.iter()
122
}
123
124
/// Iterate over all the values in this map, mutable edition.
125
pub fn values_mut(&mut self) -> slice::IterMut<'_, V> {
126
self.elems.iter_mut()
127
}
128
129
/// Resize the map to have `n` entries by adding default entries as needed.
130
pub fn resize(&mut self, n: usize) {
131
self.elems.resize(n, self.default.clone());
132
}
133
134
/// Slow path for `index_mut` which resizes the vector.
135
#[cold]
136
fn resize_for_index_mut(&mut self, i: usize) -> &mut V {
137
self.elems.resize(i + 1, self.default.clone());
138
&mut self.elems[i]
139
}
140
}
141
142
impl<K, V> Default for SecondaryMap<K, V>
143
where
144
K: EntityRef,
145
V: Clone + Default,
146
{
147
fn default() -> SecondaryMap<K, V> {
148
SecondaryMap::new()
149
}
150
}
151
152
impl<K, V> FromIterator<(K, V)> for SecondaryMap<K, V>
153
where
154
K: EntityRef,
155
V: Clone + Default,
156
{
157
fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
158
let iter = iter.into_iter();
159
let (min, max) = iter.size_hint();
160
let cap = max.unwrap_or_else(|| 2 * min);
161
let mut map = Self::with_capacity(cap);
162
for (k, v) in iter {
163
map[k] = v;
164
}
165
map
166
}
167
}
168
169
/// Immutable indexing into an `SecondaryMap`.
170
///
171
/// All keys are permitted. Untouched entries have the default value.
172
impl<K, V> Index<K> for SecondaryMap<K, V>
173
where
174
K: EntityRef,
175
V: Clone,
176
{
177
type Output = V;
178
179
#[inline(always)]
180
fn index(&self, k: K) -> &V {
181
self.elems.get(k.index()).unwrap_or(&self.default)
182
}
183
}
184
185
/// Mutable indexing into an `SecondaryMap`.
186
///
187
/// The map grows as needed to accommodate new keys.
188
impl<K, V> IndexMut<K> for SecondaryMap<K, V>
189
where
190
K: EntityRef,
191
V: Clone,
192
{
193
#[inline(always)]
194
fn index_mut(&mut self, k: K) -> &mut V {
195
let i = k.index();
196
if i >= self.elems.len() {
197
return self.resize_for_index_mut(i);
198
}
199
&mut self.elems[i]
200
}
201
}
202
203
impl<K, V> PartialEq for SecondaryMap<K, V>
204
where
205
K: EntityRef,
206
V: Clone + PartialEq,
207
{
208
fn eq(&self, other: &Self) -> bool {
209
let min_size = min(self.elems.len(), other.elems.len());
210
self.default == other.default
211
&& self.elems[..min_size] == other.elems[..min_size]
212
&& self.elems[min_size..].iter().all(|e| *e == self.default)
213
&& other.elems[min_size..].iter().all(|e| *e == other.default)
214
}
215
}
216
217
impl<K, V> Eq for SecondaryMap<K, V>
218
where
219
K: EntityRef,
220
V: Clone + PartialEq + Eq,
221
{
222
}
223
224
#[cfg(feature = "enable-serde")]
225
impl<K, V> Serialize for SecondaryMap<K, V>
226
where
227
K: EntityRef,
228
V: Clone + PartialEq + Serialize,
229
{
230
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
231
where
232
S: Serializer,
233
{
234
// TODO: bincode encodes option as "byte for Some/None" and then optionally the content
235
// TODO: we can actually optimize it by encoding manually bitmask, then elements
236
let mut elems_cnt = self.elems.len();
237
while elems_cnt > 0 && self.elems[elems_cnt - 1] == self.default {
238
elems_cnt -= 1;
239
}
240
let mut seq = serializer.serialize_seq(Some(1 + elems_cnt))?;
241
seq.serialize_element(&Some(self.default.clone()))?;
242
for e in self.elems.iter().take(elems_cnt) {
243
let some_e = Some(e);
244
seq.serialize_element(if *e == self.default { &None } else { &some_e })?;
245
}
246
seq.end()
247
}
248
}
249
250
#[cfg(feature = "enable-serde")]
251
impl<'de, K, V> Deserialize<'de> for SecondaryMap<K, V>
252
where
253
K: EntityRef,
254
V: Clone + Deserialize<'de>,
255
{
256
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
257
where
258
D: Deserializer<'de>,
259
{
260
use alloc::fmt;
261
struct SecondaryMapVisitor<K, V> {
262
unused: PhantomData<fn(K) -> V>,
263
}
264
265
impl<'de, K, V> Visitor<'de> for SecondaryMapVisitor<K, V>
266
where
267
K: EntityRef,
268
V: Clone + Deserialize<'de>,
269
{
270
type Value = SecondaryMap<K, V>;
271
272
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
273
formatter.write_str("struct SecondaryMap")
274
}
275
276
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
277
where
278
A: SeqAccess<'de>,
279
{
280
match seq.next_element()? {
281
Some(Some(default_val)) => {
282
let default_val: V = default_val; // compiler can't infer the type
283
let mut m = SecondaryMap::with_default(default_val.clone());
284
let mut idx = 0;
285
while let Some(val) = seq.next_element()? {
286
let val: Option<_> = val; // compiler can't infer the type
287
m[K::new(idx)] = val.unwrap_or_else(|| default_val.clone());
288
idx += 1;
289
}
290
Ok(m)
291
}
292
_ => Err(serde::de::Error::custom("Default value required")),
293
}
294
}
295
}
296
297
deserializer.deserialize_seq(SecondaryMapVisitor {
298
unused: PhantomData {},
299
})
300
}
301
}
302
303
impl<K: EntityRef + fmt::Debug, V: fmt::Debug + Clone> fmt::Debug for SecondaryMap<K, V> {
304
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
305
f.debug_struct("SecondaryMap")
306
.field("elems", &self.elems)
307
.field("default", &self.default)
308
.finish()
309
}
310
}
311
312
#[cfg(test)]
313
mod tests {
314
use super::*;
315
316
// `EntityRef` impl for testing.
317
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
318
struct E(u32);
319
320
impl EntityRef for E {
321
fn new(i: usize) -> Self {
322
E(i as u32)
323
}
324
fn index(self) -> usize {
325
self.0 as usize
326
}
327
}
328
329
#[test]
330
fn basic() {
331
let r0 = E(0);
332
let r1 = E(1);
333
let r2 = E(2);
334
let mut m = SecondaryMap::new();
335
336
let v: Vec<E> = m.keys().collect();
337
assert_eq!(v, []);
338
339
m[r2] = 3;
340
m[r1] = 5;
341
342
assert_eq!(m[r1], 5);
343
assert_eq!(m[r2], 3);
344
345
let v: Vec<E> = m.keys().collect();
346
assert_eq!(v, [r0, r1, r2]);
347
348
let shared = &m;
349
assert_eq!(shared[r0], 0);
350
assert_eq!(shared[r1], 5);
351
assert_eq!(shared[r2], 3);
352
}
353
}
354
355