key_demo/
key_demo.rs

1use ranges_ext::{RangeInfo, RangeSetHeapless};
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
47// 带有整数 kind 的区间信息实现
48#[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    // 使用字符串作为 kind 的示例
92    let mut set: RangeSetHeapless<StrRange<i32>> = RangeSetHeapless::default();
93
94    // 添加不同类型的区间(使用不同的 kind)
95    set.add(StrRange::new(0..10, "type_a", true))?;
96    set.add(StrRange::new(5..15, "type_b", true))?; // 与 type_a 重叠,但 kind 不同,会分割
97    set.add(StrRange::new(20..30, "type_a", true))?;
98    set.add(StrRange::new(25..35, "type_a", true))?; // 与上一个 type_a 重叠,会合并
99
100    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    // 演示:只有 kind 相同的相邻区间才会合并
111    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))?; // kind 相同且相邻,会合并
114    set2.add(IntRange::new(20..30, 2, true))?; // kind 不同,不合并
115    set2.add(IntRange::new(30..40, 2, true))?; // kind 相同且相邻,会合并
116
117    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}