|
16 | 16 | extern crate test; |
17 | 17 | #[cfg(feature = "bench")] |
18 | 18 | use self::test::Bencher; |
19 | | -use snapshot_vec as sv; |
20 | 19 | use std::cmp; |
21 | | -use undo_log::{Rollback, Snapshots, UndoLogs}; |
22 | 20 | #[cfg(feature = "persistent")] |
23 | 21 | use unify::Persistent; |
24 | | -use unify::{ |
25 | | - self as ut, EqUnifyValue, InPlace, InPlaceUnificationTable, NoError, UnifyKey, UnifyValue, |
26 | | -}; |
| 22 | +use unify::{EqUnifyValue, InPlace, InPlaceUnificationTable, NoError, UnifyKey, UnifyValue}; |
27 | 23 | use unify::{UnificationStore, UnificationTable}; |
28 | 24 |
|
29 | 25 | #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] |
@@ -488,177 +484,3 @@ fn clone_table() { |
488 | 484 | } |
489 | 485 | } |
490 | 486 | } |
491 | | - |
492 | | -enum UndoLog { |
493 | | - EqRelation(sv::UndoLog<ut::Delegate<IntKey>>), |
494 | | - Values(sv::UndoLog<i32>), |
495 | | -} |
496 | | - |
497 | | -impl From<sv::UndoLog<ut::Delegate<IntKey>>> for UndoLog { |
498 | | - fn from(l: sv::UndoLog<ut::Delegate<IntKey>>) -> Self { |
499 | | - UndoLog::EqRelation(l) |
500 | | - } |
501 | | -} |
502 | | - |
503 | | -impl From<sv::UndoLog<i32>> for UndoLog { |
504 | | - fn from(l: sv::UndoLog<i32>) -> Self { |
505 | | - UndoLog::Values(l) |
506 | | - } |
507 | | -} |
508 | | - |
509 | | -impl Rollback<UndoLog> for TypeVariableStorage { |
510 | | - fn reverse(&mut self, undo: UndoLog) { |
511 | | - match undo { |
512 | | - UndoLog::EqRelation(undo) => self.eq_relations.reverse(undo), |
513 | | - UndoLog::Values(undo) => self.values.reverse(undo), |
514 | | - } |
515 | | - } |
516 | | -} |
517 | | - |
518 | | -#[derive(Default)] |
519 | | -struct TypeVariableStorage { |
520 | | - values: sv::SnapshotVecStorage<i32>, |
521 | | - |
522 | | - eq_relations: ut::UnificationTableStorage<IntKey>, |
523 | | -} |
524 | | - |
525 | | -impl TypeVariableStorage { |
526 | | - fn with_log<'a>(&'a mut self, undo_log: &'a mut TypeVariableUndoLogs) -> TypeVariableTable<'a> { |
527 | | - TypeVariableTable { |
528 | | - storage: self, |
529 | | - undo_log, |
530 | | - } |
531 | | - } |
532 | | - |
533 | | - fn len(&mut self) -> usize { |
534 | | - assert_eq!(self.values.len(), self.eq_relations.len()); |
535 | | - self.values.len() |
536 | | - } |
537 | | -} |
538 | | - |
539 | | -struct TypeVariableTable<'a> { |
540 | | - storage: &'a mut TypeVariableStorage, |
541 | | - |
542 | | - undo_log: &'a mut TypeVariableUndoLogs, |
543 | | -} |
544 | | - |
545 | | -impl TypeVariableTable<'_> { |
546 | | - fn new(&mut self, i: i32) -> IntKey { |
547 | | - self.storage.values.with_log(&mut self.undo_log).push(i); |
548 | | - self.storage |
549 | | - .eq_relations |
550 | | - .with_log(&mut self.undo_log) |
551 | | - .new_key(None) |
552 | | - } |
553 | | -} |
554 | | - |
555 | | -struct Snapshot { |
556 | | - undo_len: usize, |
557 | | -} |
558 | | - |
559 | | -struct TypeVariableUndoLogs { |
560 | | - logs: Vec<UndoLog>, |
561 | | - num_open_snapshots: usize, |
562 | | -} |
563 | | - |
564 | | -impl Default for TypeVariableUndoLogs { |
565 | | - fn default() -> Self { |
566 | | - Self { |
567 | | - logs: Default::default(), |
568 | | - num_open_snapshots: Default::default(), |
569 | | - } |
570 | | - } |
571 | | -} |
572 | | - |
573 | | -impl<T> UndoLogs<T> for TypeVariableUndoLogs |
574 | | -where |
575 | | - UndoLog: From<T>, |
576 | | -{ |
577 | | - fn num_open_snapshots(&self) -> usize { |
578 | | - self.num_open_snapshots |
579 | | - } |
580 | | - fn push(&mut self, undo: T) { |
581 | | - if self.in_snapshot() { |
582 | | - self.logs.push(undo.into()) |
583 | | - } |
584 | | - } |
585 | | - fn clear(&mut self) { |
586 | | - self.logs.clear(); |
587 | | - self.num_open_snapshots = 0; |
588 | | - } |
589 | | - fn extend<J>(&mut self, undos: J) |
590 | | - where |
591 | | - Self: Sized, |
592 | | - J: IntoIterator<Item = T>, |
593 | | - { |
594 | | - if self.in_snapshot() { |
595 | | - self.logs.extend(undos.into_iter().map(UndoLog::from)) |
596 | | - } |
597 | | - } |
598 | | -} |
599 | | - |
600 | | -impl Snapshots<UndoLog> for TypeVariableUndoLogs { |
601 | | - type Snapshot = Snapshot; |
602 | | - fn actions_since_snapshot(&self, snapshot: &Self::Snapshot) -> &[UndoLog] { |
603 | | - &self.logs[snapshot.undo_len..] |
604 | | - } |
605 | | - |
606 | | - fn start_snapshot(&mut self) -> Self::Snapshot { |
607 | | - self.num_open_snapshots += 1; |
608 | | - Snapshot { |
609 | | - undo_len: self.logs.len(), |
610 | | - } |
611 | | - } |
612 | | - |
613 | | - fn rollback_to<R>(&mut self, values: impl FnOnce() -> R, snapshot: Self::Snapshot) |
614 | | - where |
615 | | - R: Rollback<UndoLog>, |
616 | | - { |
617 | | - debug!("rollback_to({})", snapshot.undo_len); |
618 | | - |
619 | | - if self.logs.len() > snapshot.undo_len { |
620 | | - let mut values = values(); |
621 | | - while self.logs.len() > snapshot.undo_len { |
622 | | - values.reverse(self.logs.pop().unwrap()); |
623 | | - } |
624 | | - } |
625 | | - |
626 | | - if self.num_open_snapshots == 1 { |
627 | | - // The root snapshot. It's safe to clear the undo log because |
628 | | - // there's no snapshot further out that we might need to roll back |
629 | | - // to. |
630 | | - assert!(snapshot.undo_len == 0); |
631 | | - self.logs.clear(); |
632 | | - } |
633 | | - |
634 | | - self.num_open_snapshots -= 1; |
635 | | - } |
636 | | - |
637 | | - fn commit(&mut self, snapshot: Self::Snapshot) { |
638 | | - debug!("commit({})", snapshot.undo_len); |
639 | | - |
640 | | - if self.num_open_snapshots == 1 { |
641 | | - // The root snapshot. It's safe to clear the undo log because |
642 | | - // there's no snapshot further out that we might need to roll back |
643 | | - // to. |
644 | | - assert!(snapshot.undo_len == 0); |
645 | | - self.logs.clear(); |
646 | | - } |
647 | | - |
648 | | - self.num_open_snapshots -= 1; |
649 | | - } |
650 | | -} |
651 | | - |
652 | | -#[test] |
653 | | -fn separate_undo_log() { |
654 | | - let mut storage = TypeVariableStorage::default(); |
655 | | - let mut undo_log = TypeVariableUndoLogs::default(); |
656 | | - |
657 | | - let snapshot = undo_log.start_snapshot(); |
658 | | - storage.with_log(&mut undo_log).new(1); |
659 | | - storage.with_log(&mut undo_log).new(2); |
660 | | - assert_eq!(storage.len(), 2); |
661 | | - |
662 | | - undo_log.rollback_to(|| &mut storage, snapshot); |
663 | | - assert_eq!(storage.len(), 0); |
664 | | -} |
0 commit comments