overlap_demo/
overlap_demo.rs

1use ranges_ext::{RangeInfo, RangeSet};
2use std::ops::Range;
3
4// 带有字符串 kind 的区间信息实现
5#[derive(Clone, Debug, PartialEq, Eq)]
6struct StrRange<T> {
7    range: core::ops::Range<T>,
8    kind: &'static str,
9    overwritable: bool,
10}
11
12impl<T> StrRange<T> {
13    fn new(range: core::ops::Range<T>, kind: &'static str, overwritable: bool) -> Self {
14        Self {
15            range,
16            kind,
17            overwritable,
18        }
19    }
20}
21
22impl<T: core::fmt::Debug + Clone + Ord + Copy> RangeInfo for StrRange<T> {
23    type Kind = &'static str;
24    type Type = T;
25
26    fn range(&self) -> Range<Self::Type> {
27        self.range.clone()
28    }
29
30    fn kind(&self) -> &Self::Kind {
31        &self.kind
32    }
33
34    fn overwritable(&self) -> bool {
35        self.overwritable
36    }
37
38    fn clone_with_range(&self, range: Range<Self::Type>) -> Self {
39        Self {
40            range,
41            kind: self.kind,
42            overwritable: self.overwritable,
43        }
44    }
45}
46
47fn main() -> Result<(), Box<dyn std::error::Error>> {
48    println!("=== 测试:kind 不同时,后者覆盖交集 ===\n");
49
50    let mut set = RangeSet::<StrRange<i32>>::new();
51
52    // 场景 1: 完全覆盖
53    println!("场景 1: 完全覆盖");
54    set.add(StrRange::new(10..20, "A", true))?;
55    println!("添加 [10, 20) kind=A");
56    for info in set.iter() {
57        println!(
58            "  [{}, {}) kind={}",
59            info.range().start,
60            info.range().end,
61            info.kind()
62        );
63    }
64
65    set.add(StrRange::new(10..20, "B", true))?;
66    println!("添加 [10, 20) kind=B (完全覆盖)");
67    for info in set.iter() {
68        println!(
69            "  [{}, {}) kind={}",
70            info.range().start,
71            info.range().end,
72            info.kind()
73        );
74    }
75
76    // 场景 2: 部分覆盖(左侧)
77    println!("\n场景 2: 部分覆盖(左侧)");
78    set.clear();
79    set.add(StrRange::new(10..30, "A", true))?;
80    println!("添加 [10, 30) kind=A");
81    for info in set.iter() {
82        println!(
83            "  [{}, {}) kind={}",
84            info.range().start,
85            info.range().end,
86            info.kind()
87        );
88    }
89
90    set.add(StrRange::new(5..20, "B", true))?;
91    println!("添加 [5, 20) kind=B (覆盖左侧)");
92    for info in set.iter() {
93        println!(
94            "  [{}, {}) kind={}",
95            info.range().start,
96            info.range().end,
97            info.kind()
98        );
99    }
100
101    // 场景 3: 部分覆盖(右侧)
102    println!("\n场景 3: 部分覆盖(右侧)");
103    set.clear();
104    set.add(StrRange::new(10..30, "A", true))?;
105    println!("添加 [10, 30) kind=A");
106    for info in set.iter() {
107        println!(
108            "  [{}, {}) kind={}",
109            info.range().start,
110            info.range().end,
111            info.kind()
112        );
113    }
114
115    set.add(StrRange::new(20..35, "B", true))?;
116    println!("添加 [20, 35) kind=B (覆盖右侧)");
117    for info in set.iter() {
118        println!(
119            "  [{}, {}) kind={}",
120            info.range().start,
121            info.range().end,
122            info.kind()
123        );
124    }
125
126    // 场景 4: 中间覆盖(分裂原区间)
127    println!("\n场景 4: 中间覆盖(分裂原区间)");
128    set.clear();
129    set.add(StrRange::new(10..40, "A", true))?;
130    println!("添加 [10, 40) kind=A");
131    for info in set.iter() {
132        println!(
133            "  [{}, {}) kind={}",
134            info.range().start,
135            info.range().end,
136            info.kind()
137        );
138    }
139
140    set.add(StrRange::new(20..30, "B", true))?;
141    println!("添加 [20, 30) kind=B (覆盖中间,分裂 A)");
142    for info in set.iter() {
143        println!(
144            "  [{}, {}) kind={}",
145            info.range().start,
146            info.range().end,
147            info.kind()
148        );
149    }
150
151    // 场景 5: kind 相同时合并
152    println!("\n场景 5: kind 相同时合并(对比)");
153    set.clear();
154    set.add(StrRange::new(10..20, "A", true))?;
155    set.add(StrRange::new(30..40, "A", true))?;
156    println!("添加 [10, 20) kind=A 和 [30, 40) kind=A");
157    for info in set.iter() {
158        println!(
159            "  [{}, {}) kind={}",
160            info.range().start,
161            info.range().end,
162            info.kind()
163        );
164    }
165
166    set.add(StrRange::new(15..35, "A", true))?;
167    println!("添加 [15, 35) kind=A (相同 kind,合并)");
168    for info in set.iter() {
169        println!(
170            "  [{}, {}) kind={}",
171            info.range().start,
172            info.range().end,
173            info.kind()
174        );
175    }
176
177    // 场景 6: 复杂场景 - 多个区间
178    println!("\n场景 6: 复杂场景 - 覆盖多个不同 kind 的区间");
179    set.clear();
180    set.add(StrRange::new(0..10, "A", true))?;
181    set.add(StrRange::new(10..20, "B", true))?;
182    set.add(StrRange::new(20..30, "C", true))?;
183    println!("初始状态:");
184    for info in set.iter() {
185        println!(
186            "  [{}, {}) kind={}",
187            info.range().start,
188            info.range().end,
189            info.kind()
190        );
191    }
192
193    set.add(StrRange::new(5..25, "D", true))?;
194    println!("添加 [5, 25) kind=D (覆盖三个区间的部分)");
195    for info in set.iter() {
196        println!(
197            "  [{}, {}) kind={}",
198            info.range().start,
199            info.range().end,
200            info.kind()
201        );
202    }
203
204    Ok(())
205}