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
47#[derive(Clone, Debug, PartialEq, Eq)]
49struct IntRange<T> {
50 range: core::ops::Range<T>,
51 kind: i32,
52 overwritable: bool,
53}
54
55impl<T> IntRange<T> {
56 fn new(range: core::ops::Range<T>, kind: i32, overwritable: bool) -> Self {
57 Self {
58 range,
59 kind,
60 overwritable,
61 }
62 }
63}
64
65impl<T: core::fmt::Debug + Clone + Ord + Copy> RangeInfo for IntRange<T> {
66 type Kind = i32;
67 type Type = T;
68
69 fn range(&self) -> Range<Self::Type> {
70 self.range.clone()
71 }
72
73 fn kind(&self) -> Self::Kind {
74 self.kind
75 }
76
77 fn overwritable(&self) -> bool {
78 self.overwritable
79 }
80
81 fn clone_with_range(&self, range: Range<Self::Type>) -> Self {
82 Self {
83 range,
84 kind: self.kind,
85 overwritable: self.overwritable,
86 }
87 }
88}
89
90fn main() -> Result<(), Box<dyn std::error::Error>> {
91 let mut set: RangeSetHeapless<StrRange<i32>> = RangeSetHeapless::default();
93
94 set.add(StrRange::new(0..10, "type_a", true))?;
96 set.add(StrRange::new(5..15, "type_b", true))?; set.add(StrRange::new(20..30, "type_a", true))?;
98 set.add(StrRange::new(25..35, "type_a", true))?; println!("=== 带 kind 的区间集合 ===");
101 for info in set.iter() {
102 println!(
103 "Range: [{}, {}), Kind: {:?}",
104 info.range().start,
105 info.range().end,
106 info.kind()
107 );
108 }
109
110 let mut set2: RangeSetHeapless<IntRange<i32>> = RangeSetHeapless::default();
112 set2.add(IntRange::new(0..10, 1, true))?;
113 set2.add(IntRange::new(10..20, 1, true))?; set2.add(IntRange::new(20..30, 2, true))?; set2.add(IntRange::new(30..40, 2, true))?; println!("\n=== 相邻区间合并示例 ===");
118 for info in set2.iter() {
119 println!(
120 "Range: [{}, {}), Kind: {}",
121 info.range().start,
122 info.range().end,
123 info.kind()
124 );
125 }
126
127 Ok(())
128}