1 use crate::fx
::FxHashMap
;
2 use crate::undo_log
::{Rollback, Snapshots, UndoLogs, VecLog}
;
3 use std
::borrow
::{Borrow, BorrowMut}
;
5 use std
::marker
::PhantomData
;
8 pub use crate::undo_log
::Snapshot
;
13 pub type SnapshotMapStorage
<K
, V
> = SnapshotMap
<K
, V
, FxHashMap
<K
, V
>, ()>;
14 pub type SnapshotMapRef
<'a
, K
, V
, L
> = SnapshotMap
<K
, V
, &'a
mut FxHashMap
<K
, V
>, &'a
mut L
>;
16 pub struct SnapshotMap
<K
, V
, M
= FxHashMap
<K
, V
>, L
= VecLog
<UndoLog
<K
, V
>>> {
19 _marker
: PhantomData
<(K
, V
)>,
22 // HACK(eddyb) manual impl avoids `Default` bounds on `K` and `V`.
23 impl<K
, V
, M
, L
> Default
for SnapshotMap
<K
, V
, M
, L
>
28 fn default() -> Self {
29 SnapshotMap { map: Default::default(), undo_log: Default::default(), _marker: PhantomData }
33 pub enum UndoLog
<K
, V
> {
39 impl<K
, V
, M
, L
> SnapshotMap
<K
, V
, M
, L
> {
41 pub fn with_log
<L2
>(&mut self, undo_log
: L2
) -> SnapshotMap
<K
, V
, &mut M
, L2
> {
42 SnapshotMap { map: &mut self.map, undo_log, _marker: PhantomData }
46 impl<K
, V
, M
, L
> SnapshotMap
<K
, V
, M
, L
>
49 M
: BorrowMut
<FxHashMap
<K
, V
>> + Borrow
<FxHashMap
<K
, V
>>,
50 L
: UndoLogs
<UndoLog
<K
, V
>>,
52 pub fn clear(&mut self) {
53 self.map
.borrow_mut().clear();
54 self.undo_log
.clear();
57 pub fn insert(&mut self, key
: K
, value
: V
) -> bool
{
58 match self.map
.borrow_mut().insert(key
.clone(), value
) {
60 self.undo_log
.push(UndoLog
::Inserted(key
));
64 self.undo_log
.push(UndoLog
::Overwrite(key
, old_value
));
70 pub fn remove(&mut self, key
: K
) -> bool
{
71 match self.map
.borrow_mut().remove(&key
) {
73 self.undo_log
.push(UndoLog
::Overwrite(key
, old_value
));
80 pub fn get(&self, key
: &K
) -> Option
<&V
> {
81 self.map
.borrow().get(key
)
85 impl<K
, V
> SnapshotMap
<K
, V
>
89 pub fn snapshot(&mut self) -> Snapshot
{
90 self.undo_log
.start_snapshot()
93 pub fn commit(&mut self, snapshot
: Snapshot
) {
94 self.undo_log
.commit(snapshot
)
97 pub fn rollback_to(&mut self, snapshot
: Snapshot
) {
98 let map
= &mut self.map
;
99 self.undo_log
.rollback_to(|| map
, snapshot
)
103 impl<'k
, K
, V
, M
, L
> ops
::Index
<&'k K
> for SnapshotMap
<K
, V
, M
, L
>
105 K
: Hash
+ Clone
+ Eq
,
106 M
: Borrow
<FxHashMap
<K
, V
>>,
109 fn index(&self, key
: &'k K
) -> &V
{
110 &self.map
.borrow()[key
]
114 impl<K
, V
, M
, L
> Rollback
<UndoLog
<K
, V
>> for SnapshotMap
<K
, V
, M
, L
>
117 M
: Rollback
<UndoLog
<K
, V
>>,
119 fn reverse(&mut self, undo
: UndoLog
<K
, V
>) {
120 self.map
.reverse(undo
)
124 impl<K
, V
> Rollback
<UndoLog
<K
, V
>> for FxHashMap
<K
, V
>
128 fn reverse(&mut self, undo
: UndoLog
<K
, V
>) {
130 UndoLog
::Inserted(key
) => {
134 UndoLog
::Overwrite(key
, old_value
) => {
135 self.insert(key
, old_value
);
138 UndoLog
::Purged
=> {}