Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/cranelift/entity/src/primary.rs
3068 views
1
//! Densely numbered entity references as mapping keys.
2
use crate::EntityRef;
3
use crate::boxed_slice::BoxedSlice;
4
use crate::iter::{IntoIter, Iter, IterMut};
5
use crate::keys::Keys;
6
use alloc::boxed::Box;
7
use alloc::vec::Vec;
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_derive::{Deserialize, Serialize};
14
use wasmtime_core::error::OutOfMemory;
15
16
/// A primary mapping `K -> V` allocating dense entity references.
17
///
18
/// The `PrimaryMap` data structure uses the dense index space to implement a map with a vector.
19
///
20
/// A primary map contains the main definition of an entity, and it can be used to allocate new
21
/// entity references with the `push` method.
22
///
23
/// There should only be a single `PrimaryMap` instance for a given `EntityRef` type, otherwise
24
/// conflicting references will be created. Using unknown keys for indexing will cause a panic.
25
///
26
/// Note that `PrimaryMap` doesn't implement `Deref` or `DerefMut`, which would allow
27
/// `&PrimaryMap<K, V>` to convert to `&[V]`. One of the main advantages of `PrimaryMap` is
28
/// that it only allows indexing with the distinct `EntityRef` key type, so converting to a
29
/// plain slice would make it easier to use incorrectly. To make a slice of a `PrimaryMap`, use
30
/// `into_boxed_slice`.
31
#[derive(Clone, Hash, PartialEq, Eq)]
32
#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
33
pub struct PrimaryMap<K, V>
34
where
35
K: EntityRef,
36
{
37
elems: Vec<V>,
38
unused: PhantomData<K>,
39
}
40
41
impl<K, V> PrimaryMap<K, V>
42
where
43
K: EntityRef,
44
{
45
/// Create a new empty map.
46
pub fn new() -> Self {
47
Self {
48
elems: Vec::new(),
49
unused: PhantomData,
50
}
51
}
52
53
/// Create a new empty map with the given capacity.
54
pub fn with_capacity(capacity: usize) -> Self {
55
Self {
56
elems: Vec::with_capacity(capacity),
57
unused: PhantomData,
58
}
59
}
60
61
/// Like `with_capacity` but returns an error on allocation failure.
62
pub fn try_with_capacity(capacity: usize) -> Result<Self, OutOfMemory> {
63
let mut map = Self::new();
64
map.try_reserve(capacity)?;
65
Ok(map)
66
}
67
68
/// Check if `k` is a valid key in the map.
69
pub fn is_valid(&self, k: K) -> bool {
70
k.index() < self.elems.len()
71
}
72
73
/// Get the element at `k` if it exists.
74
pub fn get(&self, k: K) -> Option<&V> {
75
self.elems.get(k.index())
76
}
77
78
/// Get the slice of values associated with the given range of keys, if any.
79
pub fn get_range(&self, range: core::ops::Range<K>) -> Option<&[V]> {
80
self.elems.get(range.start.index()..range.end.index())
81
}
82
83
/// Get the element at `k` if it exists, mutable version.
84
pub fn get_mut(&mut self, k: K) -> Option<&mut V> {
85
self.elems.get_mut(k.index())
86
}
87
88
/// Is this map completely empty?
89
pub fn is_empty(&self) -> bool {
90
self.elems.is_empty()
91
}
92
93
/// Get the total number of entity references created.
94
pub fn len(&self) -> usize {
95
self.elems.len()
96
}
97
98
/// Iterate over all the keys in this map.
99
pub fn keys(&self) -> Keys<K> {
100
Keys::with_len(self.elems.len())
101
}
102
103
/// Iterate over all the values in this map.
104
pub fn values(&self) -> slice::Iter<'_, V> {
105
self.elems.iter()
106
}
107
108
/// Iterate over all the values in this map, mutable edition.
109
pub fn values_mut(&mut self) -> slice::IterMut<'_, V> {
110
self.elems.iter_mut()
111
}
112
113
/// Get this map's underlying values as a slice.
114
pub fn as_values_slice(&self) -> &[V] {
115
&self.elems
116
}
117
118
/// Iterate over all the keys and values in this map.
119
pub fn iter(&self) -> Iter<'_, K, V> {
120
Iter::new(self.elems.iter())
121
}
122
123
/// Iterate over all the keys and values in this map, mutable edition.
124
pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
125
IterMut::new(self.elems.iter_mut())
126
}
127
128
/// Remove all entries from this map.
129
pub fn clear(&mut self) {
130
self.elems.clear()
131
}
132
133
/// Get the key that will be assigned to the next pushed value.
134
pub fn next_key(&self) -> K {
135
K::new(self.elems.len())
136
}
137
138
/// Append `v` to the mapping, assigning a new key which is returned.
139
pub fn push(&mut self, v: V) -> K {
140
let k = self.next_key();
141
self.elems.push(v);
142
k
143
}
144
145
/// Returns the last element that was inserted in the map.
146
pub fn last(&self) -> Option<(K, &V)> {
147
let len = self.elems.len();
148
let last = self.elems.last()?;
149
Some((K::new(len - 1), last))
150
}
151
152
/// Returns the last element that was inserted in the map.
153
pub fn last_mut(&mut self) -> Option<(K, &mut V)> {
154
let len = self.elems.len();
155
let last = self.elems.last_mut()?;
156
Some((K::new(len - 1), last))
157
}
158
159
/// Reserves capacity for at least `additional` more elements to be inserted.
160
pub fn reserve(&mut self, additional: usize) {
161
self.elems.reserve(additional)
162
}
163
164
/// Like `reserve` but returns an error on allocation failure.
165
pub fn try_reserve(&mut self, additional: usize) -> Result<(), OutOfMemory> {
166
self.elems
167
.try_reserve(additional)
168
.map_err(|_| OutOfMemory::new(self.len().saturating_add(additional)))
169
}
170
171
/// Reserves the minimum capacity for exactly `additional` more elements to be inserted.
172
pub fn reserve_exact(&mut self, additional: usize) {
173
self.elems.reserve_exact(additional)
174
}
175
176
/// Like `reserve_exact` but returns an error on allocation failure.
177
pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), OutOfMemory> {
178
self.elems
179
.try_reserve_exact(additional)
180
.map_err(|_| OutOfMemory::new(self.len().saturating_add(additional)))
181
}
182
183
/// Shrinks the capacity of the `PrimaryMap` as much as possible.
184
pub fn shrink_to_fit(&mut self) {
185
self.elems.shrink_to_fit()
186
}
187
188
/// Consumes this `PrimaryMap` and produces a `BoxedSlice`.
189
pub fn into_boxed_slice(self) -> BoxedSlice<K, V> {
190
unsafe { BoxedSlice::<K, V>::from_raw(Box::<[V]>::into_raw(self.elems.into_boxed_slice())) }
191
}
192
193
/// Returns mutable references to many elements at once.
194
///
195
/// Returns an error if an element does not exist, or if the same key was passed more than
196
/// once.
197
pub fn get_disjoint_mut<const N: usize>(
198
&mut self,
199
indices: [K; N],
200
) -> Result<[&mut V; N], slice::GetDisjointMutError> {
201
self.elems.get_disjoint_mut(indices.map(|k| k.index()))
202
}
203
204
/// Performs a binary search on the values with a key extraction function.
205
///
206
/// Assumes that the values are sorted by the key extracted by the function.
207
///
208
/// If the value is found then `Ok(K)` is returned, containing the entity key
209
/// of the matching value.
210
///
211
/// If there are multiple matches, then any one of the matches could be returned.
212
///
213
/// If the value is not found then Err(K) is returned, containing the entity key
214
/// where a matching element could be inserted while maintaining sorted order.
215
pub fn binary_search_values_by_key<'a, B, F>(&'a self, b: &B, f: F) -> Result<K, K>
216
where
217
F: FnMut(&'a V) -> B,
218
B: Ord,
219
{
220
self.elems
221
.binary_search_by_key(b, f)
222
.map(|i| K::new(i))
223
.map_err(|i| K::new(i))
224
}
225
226
/// Analog of `get_raw` except that a raw pointer is returned rather than a
227
/// mutable reference.
228
///
229
/// The default accessors of items in [`PrimaryMap`] will invalidate all
230
/// previous borrows obtained from the map according to miri. This function
231
/// can be used to acquire a pointer and then subsequently acquire a second
232
/// pointer later on without invalidating the first one. In other words
233
/// this is only here to help borrow two elements simultaneously with miri.
234
pub fn get_raw_mut(&mut self, k: K) -> Option<*mut V> {
235
if k.index() < self.elems.len() {
236
// SAFETY: the `add` function requires that the index is in-bounds
237
// with respect to the allocation which is satisfied here due to
238
// the bounds-check above.
239
unsafe { Some(self.elems.as_mut_ptr().add(k.index())) }
240
} else {
241
None
242
}
243
}
244
}
245
246
impl<K, V> Default for PrimaryMap<K, V>
247
where
248
K: EntityRef,
249
{
250
fn default() -> PrimaryMap<K, V> {
251
PrimaryMap::new()
252
}
253
}
254
255
/// Immutable indexing into an `PrimaryMap`.
256
/// The indexed value must be in the map.
257
impl<K, V> Index<K> for PrimaryMap<K, V>
258
where
259
K: EntityRef,
260
{
261
type Output = V;
262
263
fn index(&self, k: K) -> &V {
264
&self.elems[k.index()]
265
}
266
}
267
268
/// Mutable indexing into an `PrimaryMap`.
269
impl<K, V> IndexMut<K> for PrimaryMap<K, V>
270
where
271
K: EntityRef,
272
{
273
fn index_mut(&mut self, k: K) -> &mut V {
274
&mut self.elems[k.index()]
275
}
276
}
277
278
impl<K, V> IntoIterator for PrimaryMap<K, V>
279
where
280
K: EntityRef,
281
{
282
type Item = (K, V);
283
type IntoIter = IntoIter<K, V>;
284
285
fn into_iter(self) -> Self::IntoIter {
286
IntoIter::new(self.elems.into_iter())
287
}
288
}
289
290
impl<'a, K, V> IntoIterator for &'a PrimaryMap<K, V>
291
where
292
K: EntityRef,
293
{
294
type Item = (K, &'a V);
295
type IntoIter = Iter<'a, K, V>;
296
297
fn into_iter(self) -> Self::IntoIter {
298
Iter::new(self.elems.iter())
299
}
300
}
301
302
impl<'a, K, V> IntoIterator for &'a mut PrimaryMap<K, V>
303
where
304
K: EntityRef,
305
{
306
type Item = (K, &'a mut V);
307
type IntoIter = IterMut<'a, K, V>;
308
309
fn into_iter(self) -> Self::IntoIter {
310
IterMut::new(self.elems.iter_mut())
311
}
312
}
313
314
impl<K, V> FromIterator<V> for PrimaryMap<K, V>
315
where
316
K: EntityRef,
317
{
318
fn from_iter<T>(iter: T) -> Self
319
where
320
T: IntoIterator<Item = V>,
321
{
322
Self {
323
elems: Vec::from_iter(iter),
324
unused: PhantomData,
325
}
326
}
327
}
328
329
impl<K, V> Extend<V> for PrimaryMap<K, V>
330
where
331
K: EntityRef,
332
{
333
fn extend<T>(&mut self, iter: T)
334
where
335
T: IntoIterator<Item = V>,
336
{
337
self.elems.extend(iter);
338
}
339
}
340
341
impl<K, V> From<Vec<V>> for PrimaryMap<K, V>
342
where
343
K: EntityRef,
344
{
345
fn from(elems: Vec<V>) -> Self {
346
Self {
347
elems,
348
unused: PhantomData,
349
}
350
}
351
}
352
353
impl<K, V> From<PrimaryMap<K, V>> for Vec<V>
354
where
355
K: EntityRef,
356
{
357
fn from(map: PrimaryMap<K, V>) -> Self {
358
map.elems
359
}
360
}
361
362
impl<K: EntityRef + fmt::Debug, V: fmt::Debug> fmt::Debug for PrimaryMap<K, V> {
363
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
364
let mut struct_ = f.debug_struct("PrimaryMap");
365
for (k, v) in self {
366
struct_.field(&alloc::format!("{k:?}"), v);
367
}
368
struct_.finish()
369
}
370
}
371
372
#[cfg(test)]
373
mod tests {
374
use super::*;
375
376
// `EntityRef` impl for testing.
377
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
378
struct E(u32);
379
380
impl EntityRef for E {
381
fn new(i: usize) -> Self {
382
E(i as u32)
383
}
384
fn index(self) -> usize {
385
self.0 as usize
386
}
387
}
388
389
#[test]
390
fn basic() {
391
let r0 = E(0);
392
let r1 = E(1);
393
let m = PrimaryMap::<E, isize>::new();
394
395
let v: Vec<E> = m.keys().collect();
396
assert_eq!(v, []);
397
398
assert!(!m.is_valid(r0));
399
assert!(!m.is_valid(r1));
400
}
401
402
#[test]
403
fn push() {
404
let mut m = PrimaryMap::new();
405
let k0: E = m.push(12);
406
let k1 = m.push(33);
407
408
assert_eq!(m[k0], 12);
409
assert_eq!(m[k1], 33);
410
411
let v: Vec<E> = m.keys().collect();
412
assert_eq!(v, [k0, k1]);
413
}
414
415
#[test]
416
fn iter() {
417
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
418
m.push(12);
419
m.push(33);
420
421
let mut i = 0;
422
for (key, value) in &m {
423
assert_eq!(key.index(), i);
424
match i {
425
0 => assert_eq!(*value, 12),
426
1 => assert_eq!(*value, 33),
427
_ => panic!(),
428
}
429
i += 1;
430
}
431
i = 0;
432
for (key_mut, value_mut) in m.iter_mut() {
433
assert_eq!(key_mut.index(), i);
434
match i {
435
0 => assert_eq!(*value_mut, 12),
436
1 => assert_eq!(*value_mut, 33),
437
_ => panic!(),
438
}
439
i += 1;
440
}
441
}
442
443
#[test]
444
fn iter_rev() {
445
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
446
m.push(12);
447
m.push(33);
448
449
let mut i = 2;
450
for (key, value) in m.iter().rev() {
451
i -= 1;
452
assert_eq!(key.index(), i);
453
match i {
454
0 => assert_eq!(*value, 12),
455
1 => assert_eq!(*value, 33),
456
_ => panic!(),
457
}
458
}
459
460
i = 2;
461
for (key, value) in m.iter_mut().rev() {
462
i -= 1;
463
assert_eq!(key.index(), i);
464
match i {
465
0 => assert_eq!(*value, 12),
466
1 => assert_eq!(*value, 33),
467
_ => panic!(),
468
}
469
}
470
}
471
#[test]
472
fn keys() {
473
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
474
m.push(12);
475
m.push(33);
476
477
let mut i = 0;
478
for key in m.keys() {
479
assert_eq!(key.index(), i);
480
i += 1;
481
}
482
}
483
484
#[test]
485
fn keys_rev() {
486
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
487
m.push(12);
488
m.push(33);
489
490
let mut i = 2;
491
for key in m.keys().rev() {
492
i -= 1;
493
assert_eq!(key.index(), i);
494
}
495
}
496
497
#[test]
498
fn values() {
499
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
500
m.push(12);
501
m.push(33);
502
503
let mut i = 0;
504
for value in m.values() {
505
match i {
506
0 => assert_eq!(*value, 12),
507
1 => assert_eq!(*value, 33),
508
_ => panic!(),
509
}
510
i += 1;
511
}
512
i = 0;
513
for value_mut in m.values_mut() {
514
match i {
515
0 => assert_eq!(*value_mut, 12),
516
1 => assert_eq!(*value_mut, 33),
517
_ => panic!(),
518
}
519
i += 1;
520
}
521
}
522
523
#[test]
524
fn values_rev() {
525
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
526
m.push(12);
527
m.push(33);
528
529
let mut i = 2;
530
for value in m.values().rev() {
531
i -= 1;
532
match i {
533
0 => assert_eq!(*value, 12),
534
1 => assert_eq!(*value, 33),
535
_ => panic!(),
536
}
537
}
538
i = 2;
539
for value_mut in m.values_mut().rev() {
540
i -= 1;
541
match i {
542
0 => assert_eq!(*value_mut, 12),
543
1 => assert_eq!(*value_mut, 33),
544
_ => panic!(),
545
}
546
}
547
}
548
549
#[test]
550
fn from_iter() {
551
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
552
m.push(12);
553
m.push(33);
554
555
let n = m.values().collect::<PrimaryMap<E, _>>();
556
assert!(m.len() == n.len());
557
for (me, ne) in m.values().zip(n.values()) {
558
assert!(*me == **ne);
559
}
560
}
561
562
#[test]
563
fn from_vec() {
564
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
565
m.push(12);
566
m.push(33);
567
568
let n = PrimaryMap::<E, &usize>::from(m.values().collect::<Vec<_>>());
569
assert!(m.len() == n.len());
570
for (me, ne) in m.values().zip(n.values()) {
571
assert!(*me == **ne);
572
}
573
}
574
575
#[test]
576
fn get_many_mut() {
577
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
578
let _0 = m.push(0);
579
let _1 = m.push(1);
580
let _2 = m.push(2);
581
582
assert_eq!([&mut 0, &mut 2], m.get_disjoint_mut([_0, _2]).unwrap());
583
assert_eq!(
584
m.get_disjoint_mut([_0, _0]),
585
Err(slice::GetDisjointMutError::OverlappingIndices)
586
);
587
assert_eq!(
588
m.get_disjoint_mut([E(4)]),
589
Err(slice::GetDisjointMutError::IndexOutOfBounds)
590
);
591
}
592
}
593
594