Skip to main content

clipper2_sys/
poly_path.rs

1//! Preorder iterators over C++ `PolyPath64` / `PolyPathD` without building a Rust tree.
2//!
3//! 对 C++ 侧 `PolyPath64` / `PolyPathD` 做前序遍历;不在 Rust 侧物化树结构。
4//! Owning iterators release the native root on `Drop`. / 拥有根指针,在 `Drop` 时释放 C++ 子树。
5
6define_poly_cxx_preorder_64!();
7define_poly_cxx_preorder_d!();
8
9#[cfg(test)]
10mod tests {
11    use crate::{
12        ClipType, Clipper64, ClipperD, FillRule, Path64, PathD, Paths64, PathsD, Point64, PointD,
13    };
14
15    fn square_i(x0: i64, y0: i64, s: i64) -> Path64 {
16        Path64::new(vec![
17            Point64::new(x0, y0),
18            Point64::new(x0 + s, y0),
19            Point64::new(x0 + s, y0 + s),
20            Point64::new(x0, y0 + s),
21        ])
22    }
23
24    fn square_f(x0: f64, y0: f64, s: f64) -> PathD {
25        PathD::new(vec![
26            PointD::new(x0, y0),
27            PointD::new(x0 + s, y0),
28            PointD::new(x0 + s, y0 + s),
29            PointD::new(x0, y0 + s),
30        ])
31    }
32
33    #[test]
34    fn poly_preorder_64_root_depth_zero_when_tree_exists() {
35        let mut c = Clipper64::new();
36        c.add_subject(&Paths64::new(vec![square_i(0, 0, 100)]));
37        c.add_clip(&Paths64::new(vec![square_i(50, 50, 100)]));
38        let sol = c.execute_tree(ClipType::Union, FillRule::NonZero);
39        if !sol.has_poly_tree() {
40            return;
41        }
42        let (_, mut iter) = sol.into_open_and_poly_preorder();
43        let root = iter.next().expect("non-empty poly tree");
44        assert_eq!(root.depth, 0);
45    }
46
47    #[test]
48    fn poly_preorder_d_root_depth_zero_when_tree_exists() {
49        let mut c = ClipperD::new(4);
50        c.add_subject(&PathsD::new(vec![square_f(0.0, 0.0, 100.0)]));
51        c.add_clip(&PathsD::new(vec![square_f(50.0, 50.0, 100.0)]));
52        let sol = c.execute_tree(ClipType::Union, FillRule::NonZero);
53        if !sol.has_poly_tree() {
54            return;
55        }
56        let (_, mut iter) = sol.into_open_and_poly_preorder();
57        let root = iter.next().expect("non-empty poly tree");
58        assert_eq!(root.depth, 0);
59    }
60}