1use ranges_ext::{RangeInfo, RangeSetHeapless};
2use std::ops::Range;
3
4#[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 = RangeSetHeapless::<StrRange<i32>>::default();
51
52 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 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 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 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 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 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}