1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//! Cache operations.
/// Operations used by the `and_compute_with` and similar methods.
pub mod compute {
use std::sync::Arc;
use crate::Entry;
/// Instructs the `and_compute_with` and similar methods how to modify the cached
/// entry.
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Op<V> {
/// No-operation. Do not modify the cached entry.
Nop,
/// Insert or update the value of the cached entry.
Put(V),
/// Remove the cached entry.
Remove,
}
/// The result of the `and_compute_with` and similar methods.
#[derive(Debug)]
pub enum CompResult<K, V> {
/// The entry did not exist and still does not exist.
StillNone(Arc<K>),
/// The entry already existed and was not modified. The returned entry
/// contains the existing value.
Unchanged(Entry<K, V>),
/// The entry did not exist and was inserted. The returned entry contains
/// the inserted value.
Inserted(Entry<K, V>),
/// The entry already existed and its value was replaced with a new one. The
/// returned entry contains the new value (not the replaced value).
ReplacedWith(Entry<K, V>),
/// The entry already existed and was removed. The returned entry contains
/// the removed value.
///
/// Note: `StillNone` is returned instead of `Removed` if `Op::Remove` was
/// requested but the entry did not exist.
Removed(Entry<K, V>),
}
impl<K, V> CompResult<K, V> {
/// Returns the contained `Some(Entry)` if any. Otherwise returns `None`.
/// Consumes the `self` value.
pub fn into_entry(self) -> Option<Entry<K, V>> {
match self {
CompResult::StillNone(_) => None,
CompResult::Unchanged(entry) => Some(entry),
CompResult::Inserted(entry) => Some(entry),
CompResult::ReplacedWith(entry) => Some(entry),
CompResult::Removed(entry) => Some(entry),
}
}
/// Unwraps the contained `Entry`, consuming the `self` value.
///
/// # Panics
///
/// Panics if the `self` value is `StillNone`.
pub fn unwrap(self) -> Entry<K, V> {
match self {
CompResult::StillNone(_) => panic!("`CompResult::unwrap` called on `StillNone`"),
CompResult::Unchanged(entry) => entry,
CompResult::Inserted(entry) => entry,
CompResult::ReplacedWith(entry) => entry,
CompResult::Removed(entry) => entry,
}
}
}
}