rstared/
rstared.rs

1// SPDX-FileCopyrightText: 2025 undoredo contributors
2//
3// SPDX-License-Identifier: MIT OR Apache-2.0
4
5use std::collections::HashMap;
6
7use rstar::{AABB, primitives::Rectangle};
8use rstared::RTreed;
9use undoredo::{Insert, Recorder, UndoRedo};
10
11fn main() {
12    // A hashmap of 2D rectangles will be the underlying collection.
13    let rect_hashmap: HashMap<i32, Rectangle<(i32, i32)>> = HashMap::new();
14    // Wrap `RTreed` around the hashmap and then `Recorder` around it.
15    let mut recorder = Recorder::<
16        i32,
17        Rectangle<(i32, i32)>,
18        RTreed<i32, Rectangle<(i32, i32)>, HashMap<i32, Rectangle<(i32, i32)>>>,
19    >::new(RTreed::new(rect_hashmap));
20    let mut undoredo: UndoRedo<
21        RTreed<i32, Rectangle<(i32, i32)>, HashMap<i32, Rectangle<(i32, i32)>>>,
22    > = UndoRedo::new();
23
24    // Insert two rectangles, recording them in the R-tree.
25    recorder.insert(1, Rectangle::from_corners((0, 0), (1, 1)));
26    undoredo.commit(recorder.flush());
27
28    recorder.insert(2, Rectangle::from_corners((1, 1), (2, 2)));
29    undoredo.commit(recorder.flush());
30
31    // Locate the two rectangles in the R-tree.
32    assert_eq!(
33        recorder
34            .collection()
35            .rtree()
36            .locate_in_envelope(&AABB::from_corners((0, 0), (2, 2)))
37            .count(),
38        2
39    );
40
41    undoredo.undo(&mut recorder);
42
43    // After undo, there is now only one rectangle.
44    assert_eq!(
45        recorder
46            .collection()
47            .rtree()
48            .locate_in_envelope(&AABB::from_corners((0, 0), (2, 2)))
49            .count(),
50        1
51    );
52
53    undoredo.undo(&mut recorder);
54
55    // After another undo, there is no rectangles anymore.
56    assert_eq!(
57        recorder
58            .collection()
59            .rtree()
60            .locate_in_envelope(&AABB::from_corners((0, 0), (2, 2)))
61            .count(),
62        0
63    );
64
65    undoredo.redo(&mut recorder);
66
67    // After redo, we are back to one rectangle.
68    assert_eq!(
69        recorder
70            .collection()
71            .rtree()
72            .locate_in_envelope(&AABB::from_corners((0, 0), (2, 2)))
73            .count(),
74        1
75    );
76
77    undoredo.redo(&mut recorder);
78
79    // After another redo, we are back to two rectangles.
80    assert_eq!(
81        recorder
82            .collection()
83            .rtree()
84            .locate_in_envelope(&AABB::from_corners((0, 0), (2, 2)))
85            .count(),
86        2
87    );
88}
89
90#[test]
91fn test() {
92    main();
93}