radiate_utils/buff/
sorted.rs1#[cfg(feature = "serde")]
2use serde::{Deserialize, Serialize};
3use smallvec::SmallVec;
4use std::{fmt::Debug, ops::Deref};
5
6pub type InnerBuff<T> = SmallVec<[T; 8]>;
7
8#[derive(Clone, PartialEq, Eq)]
9#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
10#[repr(transparent)]
11pub struct SortedBuffer<T> {
12 inner: InnerBuff<T>,
13}
14
15impl<T> SortedBuffer<T> {
16 pub fn new() -> Self {
17 SortedBuffer {
18 inner: InnerBuff::<T>::new(),
19 }
20 }
21
22 #[inline]
23 pub fn len(&self) -> usize {
24 self.inner.len()
25 }
26
27 #[inline]
28 pub fn is_empty(&self) -> bool {
29 self.inner.is_empty()
30 }
31
32 #[inline]
33 pub fn as_slice(&self) -> &[T] {
34 &self.inner
35 }
36
37 #[inline]
38 pub fn as_mut_slice(&mut self) -> &mut [T] {
39 &mut self.inner
40 }
41
42 #[inline]
43 pub fn contains(&self, value: &T) -> bool
44 where
45 T: Ord,
46 {
47 self.inner.binary_search(value).is_ok()
48 }
49
50 #[inline]
51 pub fn iter(&self) -> std::slice::Iter<'_, T> {
52 self.inner.iter()
53 }
54
55 #[inline]
56 pub fn insert_sorted_unique(v: &mut SortedBuffer<T>, value: T)
57 where
58 T: Ord,
59 {
60 match v.inner.binary_search(&value) {
61 Ok(_) => {}
62 Err(pos) => v.inner.insert(pos, value),
63 }
64 }
65
66 #[inline]
67 pub fn remove_sorted(v: &mut SortedBuffer<T>, value: &T)
68 where
69 T: Ord,
70 {
71 if let Ok(pos) = v.inner.binary_search(value) {
72 v.inner.remove(pos);
73 }
74 }
75
76 #[inline]
77 pub fn set_sorted_unique(dst: &mut SortedBuffer<T>, src: impl IntoIterator<Item = T>)
78 where
79 T: Ord,
80 {
81 dst.inner.clear();
82 dst.inner.extend(src);
83 dst.inner.sort_unstable();
84 dst.inner.dedup();
85 }
86}
87
88impl<T: Default> Default for SortedBuffer<T> {
89 fn default() -> Self {
90 SortedBuffer::new()
91 }
92}
93
94impl<T> Deref for SortedBuffer<T> {
95 type Target = [T];
96
97 fn deref(&self) -> &Self::Target {
98 &self.inner
99 }
100}
101
102impl<T> FromIterator<T> for SortedBuffer<T>
103where
104 T: Ord,
105{
106 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
107 let mut buffer = SortedBuffer::<T>::new();
108 SortedBuffer::set_sorted_unique(&mut buffer, iter);
109 buffer
110 }
111}
112
113impl<T, I> From<I> for SortedBuffer<T>
114where
115 I: IntoIterator<Item = T>,
116 T: Ord,
117{
118 fn from(iter: I) -> Self {
119 let mut buffer = SortedBuffer::<T>::new();
120 SortedBuffer::set_sorted_unique(&mut buffer, iter);
121 buffer
122 }
123}
124
125impl<T> Debug for SortedBuffer<T>
126where
127 T: Debug,
128{
129 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
130 write!(f, "{:?}", self.inner.as_slice())?;
131 Ok(())
132 }
133}
134
135#[cfg(test)]
136mod tests {
137 use super::*;
138
139 #[test]
140 fn test_sorted_buffer_insert_remove() {
141 let mut buffer = SortedBuffer::new();
142 SortedBuffer::insert_sorted_unique(&mut buffer, 5);
143 SortedBuffer::insert_sorted_unique(&mut buffer, 3);
144 SortedBuffer::insert_sorted_unique(&mut buffer, 8);
145 SortedBuffer::insert_sorted_unique(&mut buffer, 5); assert_eq!(&*buffer, &[3, 5, 8]);
148
149 SortedBuffer::remove_sorted(&mut buffer, &5);
150 assert_eq!(&*buffer, &[3, 8]);
151
152 SortedBuffer::remove_sorted(&mut buffer, &10); assert_eq!(&*buffer, &[3, 8]);
154 }
155
156 #[test]
157 fn test_sorted_buffer_from_iter() {
158 let vec = vec![4, 2, 7, 2, 5];
159 let buffer: SortedBuffer<i32> = vec.into_iter().collect();
160 assert_eq!(&*buffer, &[2, 4, 5, 7]);
161 }
162}