Skip to main content

oxihuman_core/
sparse_array.rs

1#![allow(dead_code)]
2
3use std::collections::HashMap;
4
5#[allow(dead_code)]
6#[derive(Debug, Clone)]
7pub struct SparseArray<T> {
8    data: HashMap<usize, T>,
9}
10
11#[allow(dead_code)]
12pub fn new_sparse_array<T>() -> SparseArray<T> {
13    SparseArray {
14        data: HashMap::new(),
15    }
16}
17
18#[allow(dead_code)]
19pub fn sparse_set_val<T>(arr: &mut SparseArray<T>, idx: usize, val: T) {
20    arr.data.insert(idx, val);
21}
22
23#[allow(dead_code)]
24pub fn sparse_get<T>(arr: &SparseArray<T>, idx: usize) -> Option<&T> {
25    arr.data.get(&idx)
26}
27
28#[allow(dead_code)]
29pub fn sparse_has<T>(arr: &SparseArray<T>, idx: usize) -> bool {
30    arr.data.contains_key(&idx)
31}
32
33#[allow(dead_code)]
34pub fn sparse_remove<T>(arr: &mut SparseArray<T>, idx: usize) -> bool {
35    arr.data.remove(&idx).is_some()
36}
37
38#[allow(dead_code)]
39pub fn sparse_count<T>(arr: &SparseArray<T>) -> usize {
40    arr.data.len()
41}
42
43#[allow(dead_code)]
44pub fn sparse_keys<T>(arr: &SparseArray<T>) -> Vec<usize> {
45    let mut keys: Vec<usize> = arr.data.keys().copied().collect();
46    keys.sort();
47    keys
48}
49
50#[allow(dead_code)]
51pub fn sparse_clear<T>(arr: &mut SparseArray<T>) {
52    arr.data.clear();
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58
59    #[test]
60    fn test_new() {
61        let arr: SparseArray<i32> = new_sparse_array();
62        assert_eq!(sparse_count(&arr), 0);
63    }
64
65    #[test]
66    fn test_set_and_get() {
67        let mut arr = new_sparse_array();
68        sparse_set_val(&mut arr, 10, "hello");
69        assert_eq!(sparse_get(&arr, 10), Some(&"hello"));
70    }
71
72    #[test]
73    fn test_has() {
74        let mut arr = new_sparse_array();
75        sparse_set_val(&mut arr, 5, 42);
76        assert!(sparse_has(&arr, 5));
77        assert!(!sparse_has(&arr, 6));
78    }
79
80    #[test]
81    fn test_remove() {
82        let mut arr = new_sparse_array();
83        sparse_set_val(&mut arr, 0, 1);
84        assert!(sparse_remove(&mut arr, 0));
85        assert!(!sparse_remove(&mut arr, 0));
86    }
87
88    #[test]
89    fn test_count() {
90        let mut arr = new_sparse_array();
91        sparse_set_val(&mut arr, 100, 'a');
92        sparse_set_val(&mut arr, 200, 'b');
93        assert_eq!(sparse_count(&arr), 2);
94    }
95
96    #[test]
97    fn test_keys() {
98        let mut arr = new_sparse_array();
99        sparse_set_val(&mut arr, 30, 0);
100        sparse_set_val(&mut arr, 10, 0);
101        sparse_set_val(&mut arr, 20, 0);
102        assert_eq!(sparse_keys(&arr), vec![10, 20, 30]);
103    }
104
105    #[test]
106    fn test_clear() {
107        let mut arr = new_sparse_array();
108        sparse_set_val(&mut arr, 1, 1);
109        sparse_clear(&mut arr);
110        assert_eq!(sparse_count(&arr), 0);
111    }
112
113    #[test]
114    fn test_overwrite() {
115        let mut arr = new_sparse_array();
116        sparse_set_val(&mut arr, 0, 1);
117        sparse_set_val(&mut arr, 0, 2);
118        assert_eq!(sparse_get(&arr, 0), Some(&2));
119    }
120
121    #[test]
122    fn test_get_missing() {
123        let arr: SparseArray<i32> = new_sparse_array();
124        assert_eq!(sparse_get(&arr, 999), None);
125    }
126
127    #[test]
128    fn test_empty_keys() {
129        let arr: SparseArray<i32> = new_sparse_array();
130        assert!(sparse_keys(&arr).is_empty());
131    }
132}