pub struct RangeSet<T, K = (), const C: usize = 128>{ /* private fields */ }Expand description
一个「区间集合」数据结构:维护一组有序、互不重叠的半开区间 [start, end)。
- 插入时会把重叠/相邻且 kind 相等的区间自动合并。
- 删除一个区间时,会从集合里移除交集;必要时把已有区间拆成左右两段。
约定:空区间(start >= end)会被忽略。
Implementations§
Source§impl<T, K, const C: usize> RangeSet<T, K, C>
impl<T, K, const C: usize> RangeSet<T, K, C>
Sourcepub fn new() -> Self
pub fn new() -> Self
创建空集合。
Examples found in repository?
examples/debug_demo.rs (line 4)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 let mut set: RangeSet<i32, (), 16> = RangeSet::new();
5 set.add(1..5, ())?;
6 set.add(3..8, ())?;
7 set.add(10..15, ())?;
8 set.add(12..18, ())?;
9
10 println!("=== 区间合并结果 ===");
11 for (i, info) in set.iter().enumerate() {
12 println!("Element {}: [{}, {})", i, info.range.start, info.range.end);
13 }
14
15 println!("\n=== Debug 格式 ===");
16 for (i, info) in set.iter().enumerate() {
17 println!("Element {}: {:?}", i, info);
18 }
19
20 println!("\n=== 完整切片 ===");
21 println!("{:?}", set.as_slice());
22
23 Ok(())
24}More examples
examples/key_demo.rs (line 5)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 // 使用字符串作为 kind 的示例
5 let mut set: RangeSet<i32, &str> = RangeSet::new();
6
7 // 添加不同类型的区间(使用不同的 kind)
8 set.add(0..10, "type_a")?;
9 set.add(5..15, "type_b")?; // 与 type_a 重叠,但 kind 不同,会分割
10 set.add(20..30, "type_a")?;
11 set.add(25..35, "type_a")?; // 与上一个 type_a 重叠,会合并
12
13 println!("=== 带 kind 的区间集合 ===");
14 for info in set.iter() {
15 println!(
16 "Range: [{}, {}), Kind: {:?}",
17 info.range.start, info.range.end, info.kind
18 );
19 }
20
21 // 演示:只有 kind 相同的相邻区间才会合并
22 let mut set2: RangeSet<i32, i32> = RangeSet::new();
23 set2.add(0..10, 1)?;
24 set2.add(10..20, 1)?; // kind 相同且相邻,会合并
25 set2.add(20..30, 2)?; // kind 不同,不合并
26 set2.add(30..40, 2)?; // kind 相同且相邻,会合并
27
28 println!("\n=== 相邻区间合并示例 ===");
29 for info in set2.iter() {
30 println!(
31 "Range: [{}, {}), Kind: {}",
32 info.range.start, info.range.end, info.kind
33 );
34 }
35
36 Ok(())
37}examples/overlap_demo.rs (line 6)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 println!("=== 测试:kind 不同时,后者覆盖交集 ===\n");
5
6 let mut set = RangeSet::<i32, &str>::new();
7
8 // 场景 1: 完全覆盖
9 println!("场景 1: 完全覆盖");
10 set.add(10..20, "A")?;
11 println!("添加 [10, 20) kind=A");
12 for info in set.iter() {
13 println!(
14 " [{}, {}) kind={}",
15 info.range.start, info.range.end, info.kind
16 );
17 }
18
19 set.add(10..20, "B")?;
20 println!("添加 [10, 20) kind=B (完全覆盖)");
21 for info in set.iter() {
22 println!(
23 " [{}, {}) kind={}",
24 info.range.start, info.range.end, info.kind
25 );
26 }
27
28 // 场景 2: 部分覆盖(左侧)
29 println!("\n场景 2: 部分覆盖(左侧)");
30 set.clear();
31 set.add(10..30, "A")?;
32 println!("添加 [10, 30) kind=A");
33 for info in set.iter() {
34 println!(
35 " [{}, {}) kind={}",
36 info.range.start, info.range.end, info.kind
37 );
38 }
39
40 set.add(5..20, "B")?;
41 println!("添加 [5, 20) kind=B (覆盖左侧)");
42 for info in set.iter() {
43 println!(
44 " [{}, {}) kind={}",
45 info.range.start, info.range.end, info.kind
46 );
47 }
48
49 // 场景 3: 部分覆盖(右侧)
50 println!("\n场景 3: 部分覆盖(右侧)");
51 set.clear();
52 set.add(10..30, "A")?;
53 println!("添加 [10, 30) kind=A");
54 for info in set.iter() {
55 println!(
56 " [{}, {}) kind={}",
57 info.range.start, info.range.end, info.kind
58 );
59 }
60
61 set.add(20..35, "B")?;
62 println!("添加 [20, 35) kind=B (覆盖右侧)");
63 for info in set.iter() {
64 println!(
65 " [{}, {}) kind={}",
66 info.range.start, info.range.end, info.kind
67 );
68 }
69
70 // 场景 4: 中间覆盖(分裂原区间)
71 println!("\n场景 4: 中间覆盖(分裂原区间)");
72 set.clear();
73 set.add(10..40, "A")?;
74 println!("添加 [10, 40) kind=A");
75 for info in set.iter() {
76 println!(
77 " [{}, {}) kind={}",
78 info.range.start, info.range.end, info.kind
79 );
80 }
81
82 set.add(20..30, "B")?;
83 println!("添加 [20, 30) kind=B (覆盖中间,分裂 A)");
84 for info in set.iter() {
85 println!(
86 " [{}, {}) kind={}",
87 info.range.start, info.range.end, info.kind
88 );
89 }
90
91 // 场景 5: kind 相同时合并
92 println!("\n场景 5: kind 相同时合并(对比)");
93 set.clear();
94 set.add(10..20, "A")?;
95 set.add(30..40, "A")?;
96 println!("添加 [10, 20) kind=A 和 [30, 40) kind=A");
97 for info in set.iter() {
98 println!(
99 " [{}, {}) kind={}",
100 info.range.start, info.range.end, info.kind
101 );
102 }
103
104 set.add(15..35, "A")?;
105 println!("添加 [15, 35) kind=A (相同 kind,合并)");
106 for info in set.iter() {
107 println!(
108 " [{}, {}) kind={}",
109 info.range.start, info.range.end, info.kind
110 );
111 }
112
113 // 场景 6: 复杂场景 - 多个区间
114 println!("\n场景 6: 复杂场景 - 覆盖多个不同 kind 的区间");
115 set.clear();
116 set.add(0..10, "A")?;
117 set.add(10..20, "B")?;
118 set.add(20..30, "C")?;
119 println!("初始状态:");
120 for info in set.iter() {
121 println!(
122 " [{}, {}) kind={}",
123 info.range.start, info.range.end, info.kind
124 );
125 }
126
127 set.add(5..25, "D")?;
128 println!("添加 [5, 25) kind=D (覆盖三个区间的部分)");
129 for info in set.iter() {
130 println!(
131 " [{}, {}) kind={}",
132 info.range.start, info.range.end, info.kind
133 );
134 }
135
136 Ok(())
137}Sourcepub fn as_slice(&self) -> &[RangeInfo<T, K>]
pub fn as_slice(&self) -> &[RangeInfo<T, K>]
返回内部区间的切片(已排序、已合并、互不重叠)。
Examples found in repository?
examples/debug_demo.rs (line 21)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 let mut set: RangeSet<i32, (), 16> = RangeSet::new();
5 set.add(1..5, ())?;
6 set.add(3..8, ())?;
7 set.add(10..15, ())?;
8 set.add(12..18, ())?;
9
10 println!("=== 区间合并结果 ===");
11 for (i, info) in set.iter().enumerate() {
12 println!("Element {}: [{}, {})", i, info.range.start, info.range.end);
13 }
14
15 println!("\n=== Debug 格式 ===");
16 for (i, info) in set.iter().enumerate() {
17 println!("Element {}: {:?}", i, info);
18 }
19
20 println!("\n=== 完整切片 ===");
21 println!("{:?}", set.as_slice());
22
23 Ok(())
24}Sourcepub fn iter(&self) -> impl Iterator<Item = &RangeInfo<T, K>>
pub fn iter(&self) -> impl Iterator<Item = &RangeInfo<T, K>>
返回区间迭代器(零拷贝)。
Examples found in repository?
examples/debug_demo.rs (line 11)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 let mut set: RangeSet<i32, (), 16> = RangeSet::new();
5 set.add(1..5, ())?;
6 set.add(3..8, ())?;
7 set.add(10..15, ())?;
8 set.add(12..18, ())?;
9
10 println!("=== 区间合并结果 ===");
11 for (i, info) in set.iter().enumerate() {
12 println!("Element {}: [{}, {})", i, info.range.start, info.range.end);
13 }
14
15 println!("\n=== Debug 格式 ===");
16 for (i, info) in set.iter().enumerate() {
17 println!("Element {}: {:?}", i, info);
18 }
19
20 println!("\n=== 完整切片 ===");
21 println!("{:?}", set.as_slice());
22
23 Ok(())
24}More examples
examples/key_demo.rs (line 14)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 // 使用字符串作为 kind 的示例
5 let mut set: RangeSet<i32, &str> = RangeSet::new();
6
7 // 添加不同类型的区间(使用不同的 kind)
8 set.add(0..10, "type_a")?;
9 set.add(5..15, "type_b")?; // 与 type_a 重叠,但 kind 不同,会分割
10 set.add(20..30, "type_a")?;
11 set.add(25..35, "type_a")?; // 与上一个 type_a 重叠,会合并
12
13 println!("=== 带 kind 的区间集合 ===");
14 for info in set.iter() {
15 println!(
16 "Range: [{}, {}), Kind: {:?}",
17 info.range.start, info.range.end, info.kind
18 );
19 }
20
21 // 演示:只有 kind 相同的相邻区间才会合并
22 let mut set2: RangeSet<i32, i32> = RangeSet::new();
23 set2.add(0..10, 1)?;
24 set2.add(10..20, 1)?; // kind 相同且相邻,会合并
25 set2.add(20..30, 2)?; // kind 不同,不合并
26 set2.add(30..40, 2)?; // kind 相同且相邻,会合并
27
28 println!("\n=== 相邻区间合并示例 ===");
29 for info in set2.iter() {
30 println!(
31 "Range: [{}, {}), Kind: {}",
32 info.range.start, info.range.end, info.kind
33 );
34 }
35
36 Ok(())
37}examples/overlap_demo.rs (line 12)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 println!("=== 测试:kind 不同时,后者覆盖交集 ===\n");
5
6 let mut set = RangeSet::<i32, &str>::new();
7
8 // 场景 1: 完全覆盖
9 println!("场景 1: 完全覆盖");
10 set.add(10..20, "A")?;
11 println!("添加 [10, 20) kind=A");
12 for info in set.iter() {
13 println!(
14 " [{}, {}) kind={}",
15 info.range.start, info.range.end, info.kind
16 );
17 }
18
19 set.add(10..20, "B")?;
20 println!("添加 [10, 20) kind=B (完全覆盖)");
21 for info in set.iter() {
22 println!(
23 " [{}, {}) kind={}",
24 info.range.start, info.range.end, info.kind
25 );
26 }
27
28 // 场景 2: 部分覆盖(左侧)
29 println!("\n场景 2: 部分覆盖(左侧)");
30 set.clear();
31 set.add(10..30, "A")?;
32 println!("添加 [10, 30) kind=A");
33 for info in set.iter() {
34 println!(
35 " [{}, {}) kind={}",
36 info.range.start, info.range.end, info.kind
37 );
38 }
39
40 set.add(5..20, "B")?;
41 println!("添加 [5, 20) kind=B (覆盖左侧)");
42 for info in set.iter() {
43 println!(
44 " [{}, {}) kind={}",
45 info.range.start, info.range.end, info.kind
46 );
47 }
48
49 // 场景 3: 部分覆盖(右侧)
50 println!("\n场景 3: 部分覆盖(右侧)");
51 set.clear();
52 set.add(10..30, "A")?;
53 println!("添加 [10, 30) kind=A");
54 for info in set.iter() {
55 println!(
56 " [{}, {}) kind={}",
57 info.range.start, info.range.end, info.kind
58 );
59 }
60
61 set.add(20..35, "B")?;
62 println!("添加 [20, 35) kind=B (覆盖右侧)");
63 for info in set.iter() {
64 println!(
65 " [{}, {}) kind={}",
66 info.range.start, info.range.end, info.kind
67 );
68 }
69
70 // 场景 4: 中间覆盖(分裂原区间)
71 println!("\n场景 4: 中间覆盖(分裂原区间)");
72 set.clear();
73 set.add(10..40, "A")?;
74 println!("添加 [10, 40) kind=A");
75 for info in set.iter() {
76 println!(
77 " [{}, {}) kind={}",
78 info.range.start, info.range.end, info.kind
79 );
80 }
81
82 set.add(20..30, "B")?;
83 println!("添加 [20, 30) kind=B (覆盖中间,分裂 A)");
84 for info in set.iter() {
85 println!(
86 " [{}, {}) kind={}",
87 info.range.start, info.range.end, info.kind
88 );
89 }
90
91 // 场景 5: kind 相同时合并
92 println!("\n场景 5: kind 相同时合并(对比)");
93 set.clear();
94 set.add(10..20, "A")?;
95 set.add(30..40, "A")?;
96 println!("添加 [10, 20) kind=A 和 [30, 40) kind=A");
97 for info in set.iter() {
98 println!(
99 " [{}, {}) kind={}",
100 info.range.start, info.range.end, info.kind
101 );
102 }
103
104 set.add(15..35, "A")?;
105 println!("添加 [15, 35) kind=A (相同 kind,合并)");
106 for info in set.iter() {
107 println!(
108 " [{}, {}) kind={}",
109 info.range.start, info.range.end, info.kind
110 );
111 }
112
113 // 场景 6: 复杂场景 - 多个区间
114 println!("\n场景 6: 复杂场景 - 覆盖多个不同 kind 的区间");
115 set.clear();
116 set.add(0..10, "A")?;
117 set.add(10..20, "B")?;
118 set.add(20..30, "C")?;
119 println!("初始状态:");
120 for info in set.iter() {
121 println!(
122 " [{}, {}) kind={}",
123 info.range.start, info.range.end, info.kind
124 );
125 }
126
127 set.add(5..25, "D")?;
128 println!("添加 [5, 25) kind=D (覆盖三个区间的部分)");
129 for info in set.iter() {
130 println!(
131 " [{}, {}) kind={}",
132 info.range.start, info.range.end, info.kind
133 );
134 }
135
136 Ok(())
137}pub fn is_empty(&self) -> bool
pub fn len(&self) -> usize
Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Examples found in repository?
examples/overlap_demo.rs (line 30)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 println!("=== 测试:kind 不同时,后者覆盖交集 ===\n");
5
6 let mut set = RangeSet::<i32, &str>::new();
7
8 // 场景 1: 完全覆盖
9 println!("场景 1: 完全覆盖");
10 set.add(10..20, "A")?;
11 println!("添加 [10, 20) kind=A");
12 for info in set.iter() {
13 println!(
14 " [{}, {}) kind={}",
15 info.range.start, info.range.end, info.kind
16 );
17 }
18
19 set.add(10..20, "B")?;
20 println!("添加 [10, 20) kind=B (完全覆盖)");
21 for info in set.iter() {
22 println!(
23 " [{}, {}) kind={}",
24 info.range.start, info.range.end, info.kind
25 );
26 }
27
28 // 场景 2: 部分覆盖(左侧)
29 println!("\n场景 2: 部分覆盖(左侧)");
30 set.clear();
31 set.add(10..30, "A")?;
32 println!("添加 [10, 30) kind=A");
33 for info in set.iter() {
34 println!(
35 " [{}, {}) kind={}",
36 info.range.start, info.range.end, info.kind
37 );
38 }
39
40 set.add(5..20, "B")?;
41 println!("添加 [5, 20) kind=B (覆盖左侧)");
42 for info in set.iter() {
43 println!(
44 " [{}, {}) kind={}",
45 info.range.start, info.range.end, info.kind
46 );
47 }
48
49 // 场景 3: 部分覆盖(右侧)
50 println!("\n场景 3: 部分覆盖(右侧)");
51 set.clear();
52 set.add(10..30, "A")?;
53 println!("添加 [10, 30) kind=A");
54 for info in set.iter() {
55 println!(
56 " [{}, {}) kind={}",
57 info.range.start, info.range.end, info.kind
58 );
59 }
60
61 set.add(20..35, "B")?;
62 println!("添加 [20, 35) kind=B (覆盖右侧)");
63 for info in set.iter() {
64 println!(
65 " [{}, {}) kind={}",
66 info.range.start, info.range.end, info.kind
67 );
68 }
69
70 // 场景 4: 中间覆盖(分裂原区间)
71 println!("\n场景 4: 中间覆盖(分裂原区间)");
72 set.clear();
73 set.add(10..40, "A")?;
74 println!("添加 [10, 40) kind=A");
75 for info in set.iter() {
76 println!(
77 " [{}, {}) kind={}",
78 info.range.start, info.range.end, info.kind
79 );
80 }
81
82 set.add(20..30, "B")?;
83 println!("添加 [20, 30) kind=B (覆盖中间,分裂 A)");
84 for info in set.iter() {
85 println!(
86 " [{}, {}) kind={}",
87 info.range.start, info.range.end, info.kind
88 );
89 }
90
91 // 场景 5: kind 相同时合并
92 println!("\n场景 5: kind 相同时合并(对比)");
93 set.clear();
94 set.add(10..20, "A")?;
95 set.add(30..40, "A")?;
96 println!("添加 [10, 20) kind=A 和 [30, 40) kind=A");
97 for info in set.iter() {
98 println!(
99 " [{}, {}) kind={}",
100 info.range.start, info.range.end, info.kind
101 );
102 }
103
104 set.add(15..35, "A")?;
105 println!("添加 [15, 35) kind=A (相同 kind,合并)");
106 for info in set.iter() {
107 println!(
108 " [{}, {}) kind={}",
109 info.range.start, info.range.end, info.kind
110 );
111 }
112
113 // 场景 6: 复杂场景 - 多个区间
114 println!("\n场景 6: 复杂场景 - 覆盖多个不同 kind 的区间");
115 set.clear();
116 set.add(0..10, "A")?;
117 set.add(10..20, "B")?;
118 set.add(20..30, "C")?;
119 println!("初始状态:");
120 for info in set.iter() {
121 println!(
122 " [{}, {}) kind={}",
123 info.range.start, info.range.end, info.kind
124 );
125 }
126
127 set.add(5..25, "D")?;
128 println!("添加 [5, 25) kind=D (覆盖三个区间的部分)");
129 for info in set.iter() {
130 println!(
131 " [{}, {}) kind={}",
132 info.range.start, info.range.end, info.kind
133 );
134 }
135
136 Ok(())
137}Sourcepub fn add(&mut self, range: Range<T>, kind: K) -> Result<(), CapacityError>
pub fn add(&mut self, range: Range<T>, kind: K) -> Result<(), CapacityError>
Examples found in repository?
examples/debug_demo.rs (line 5)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 let mut set: RangeSet<i32, (), 16> = RangeSet::new();
5 set.add(1..5, ())?;
6 set.add(3..8, ())?;
7 set.add(10..15, ())?;
8 set.add(12..18, ())?;
9
10 println!("=== 区间合并结果 ===");
11 for (i, info) in set.iter().enumerate() {
12 println!("Element {}: [{}, {})", i, info.range.start, info.range.end);
13 }
14
15 println!("\n=== Debug 格式 ===");
16 for (i, info) in set.iter().enumerate() {
17 println!("Element {}: {:?}", i, info);
18 }
19
20 println!("\n=== 完整切片 ===");
21 println!("{:?}", set.as_slice());
22
23 Ok(())
24}More examples
examples/key_demo.rs (line 8)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 // 使用字符串作为 kind 的示例
5 let mut set: RangeSet<i32, &str> = RangeSet::new();
6
7 // 添加不同类型的区间(使用不同的 kind)
8 set.add(0..10, "type_a")?;
9 set.add(5..15, "type_b")?; // 与 type_a 重叠,但 kind 不同,会分割
10 set.add(20..30, "type_a")?;
11 set.add(25..35, "type_a")?; // 与上一个 type_a 重叠,会合并
12
13 println!("=== 带 kind 的区间集合 ===");
14 for info in set.iter() {
15 println!(
16 "Range: [{}, {}), Kind: {:?}",
17 info.range.start, info.range.end, info.kind
18 );
19 }
20
21 // 演示:只有 kind 相同的相邻区间才会合并
22 let mut set2: RangeSet<i32, i32> = RangeSet::new();
23 set2.add(0..10, 1)?;
24 set2.add(10..20, 1)?; // kind 相同且相邻,会合并
25 set2.add(20..30, 2)?; // kind 不同,不合并
26 set2.add(30..40, 2)?; // kind 相同且相邻,会合并
27
28 println!("\n=== 相邻区间合并示例 ===");
29 for info in set2.iter() {
30 println!(
31 "Range: [{}, {}), Kind: {}",
32 info.range.start, info.range.end, info.kind
33 );
34 }
35
36 Ok(())
37}examples/overlap_demo.rs (line 10)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 println!("=== 测试:kind 不同时,后者覆盖交集 ===\n");
5
6 let mut set = RangeSet::<i32, &str>::new();
7
8 // 场景 1: 完全覆盖
9 println!("场景 1: 完全覆盖");
10 set.add(10..20, "A")?;
11 println!("添加 [10, 20) kind=A");
12 for info in set.iter() {
13 println!(
14 " [{}, {}) kind={}",
15 info.range.start, info.range.end, info.kind
16 );
17 }
18
19 set.add(10..20, "B")?;
20 println!("添加 [10, 20) kind=B (完全覆盖)");
21 for info in set.iter() {
22 println!(
23 " [{}, {}) kind={}",
24 info.range.start, info.range.end, info.kind
25 );
26 }
27
28 // 场景 2: 部分覆盖(左侧)
29 println!("\n场景 2: 部分覆盖(左侧)");
30 set.clear();
31 set.add(10..30, "A")?;
32 println!("添加 [10, 30) kind=A");
33 for info in set.iter() {
34 println!(
35 " [{}, {}) kind={}",
36 info.range.start, info.range.end, info.kind
37 );
38 }
39
40 set.add(5..20, "B")?;
41 println!("添加 [5, 20) kind=B (覆盖左侧)");
42 for info in set.iter() {
43 println!(
44 " [{}, {}) kind={}",
45 info.range.start, info.range.end, info.kind
46 );
47 }
48
49 // 场景 3: 部分覆盖(右侧)
50 println!("\n场景 3: 部分覆盖(右侧)");
51 set.clear();
52 set.add(10..30, "A")?;
53 println!("添加 [10, 30) kind=A");
54 for info in set.iter() {
55 println!(
56 " [{}, {}) kind={}",
57 info.range.start, info.range.end, info.kind
58 );
59 }
60
61 set.add(20..35, "B")?;
62 println!("添加 [20, 35) kind=B (覆盖右侧)");
63 for info in set.iter() {
64 println!(
65 " [{}, {}) kind={}",
66 info.range.start, info.range.end, info.kind
67 );
68 }
69
70 // 场景 4: 中间覆盖(分裂原区间)
71 println!("\n场景 4: 中间覆盖(分裂原区间)");
72 set.clear();
73 set.add(10..40, "A")?;
74 println!("添加 [10, 40) kind=A");
75 for info in set.iter() {
76 println!(
77 " [{}, {}) kind={}",
78 info.range.start, info.range.end, info.kind
79 );
80 }
81
82 set.add(20..30, "B")?;
83 println!("添加 [20, 30) kind=B (覆盖中间,分裂 A)");
84 for info in set.iter() {
85 println!(
86 " [{}, {}) kind={}",
87 info.range.start, info.range.end, info.kind
88 );
89 }
90
91 // 场景 5: kind 相同时合并
92 println!("\n场景 5: kind 相同时合并(对比)");
93 set.clear();
94 set.add(10..20, "A")?;
95 set.add(30..40, "A")?;
96 println!("添加 [10, 20) kind=A 和 [30, 40) kind=A");
97 for info in set.iter() {
98 println!(
99 " [{}, {}) kind={}",
100 info.range.start, info.range.end, info.kind
101 );
102 }
103
104 set.add(15..35, "A")?;
105 println!("添加 [15, 35) kind=A (相同 kind,合并)");
106 for info in set.iter() {
107 println!(
108 " [{}, {}) kind={}",
109 info.range.start, info.range.end, info.kind
110 );
111 }
112
113 // 场景 6: 复杂场景 - 多个区间
114 println!("\n场景 6: 复杂场景 - 覆盖多个不同 kind 的区间");
115 set.clear();
116 set.add(0..10, "A")?;
117 set.add(10..20, "B")?;
118 set.add(20..30, "C")?;
119 println!("初始状态:");
120 for info in set.iter() {
121 println!(
122 " [{}, {}) kind={}",
123 info.range.start, info.range.end, info.kind
124 );
125 }
126
127 set.add(5..25, "D")?;
128 println!("添加 [5, 25) kind=D (覆盖三个区间的部分)");
129 for info in set.iter() {
130 println!(
131 " [{}, {}) kind={}",
132 info.range.start, info.range.end, info.kind
133 );
134 }
135
136 Ok(())
137}Sourcepub fn remove(&mut self, range: Range<T>) -> Result<(), CapacityError>
pub fn remove(&mut self, range: Range<T>) -> Result<(), CapacityError>
删除一个区间:从集合中移除与其相交的部分。
若被删除区间位于某个已有区间内部,会导致该已有区间被拆分为两段(保留原有 kind)。
§Errors
如果容量不足(删除操作导致区间分裂,新区间数量超过容量),返回 CapacityError。
Sourcepub fn extend<I>(&mut self, ranges: I) -> Result<(), CapacityError>where
I: IntoIterator<Item = (Range<T>, K)>,
pub fn extend<I>(&mut self, ranges: I) -> Result<(), CapacityError>where
I: IntoIterator<Item = (Range<T>, K)>,
Trait Implementations§
Auto Trait Implementations§
impl<T, K, const C: usize> Freeze for RangeSet<T, K, C>
impl<T, K, const C: usize> RefUnwindSafe for RangeSet<T, K, C>where
K: RefUnwindSafe,
T: RefUnwindSafe,
impl<T, K, const C: usize> Send for RangeSet<T, K, C>
impl<T, K, const C: usize> Sync for RangeSet<T, K, C>
impl<T, K, const C: usize> Unpin for RangeSet<T, K, C>
impl<T, K, const C: usize> UnwindSafe for RangeSet<T, K, C>where
K: UnwindSafe,
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more