1use super::functions::*;
5
6#[allow(dead_code)]
8pub struct DList<T: 'static> {
9 run: Box<dyn Fn(Vec<T>) -> Vec<T>>,
10 size_hint: usize,
11}
12impl<T: Clone + 'static> DList<T> {
13 #[allow(dead_code)]
15 pub fn empty() -> Self {
16 Self {
17 run: Box::new(|rest| rest),
18 size_hint: 0,
19 }
20 }
21 #[allow(dead_code)]
23 pub fn singleton(x: T) -> Self {
24 Self {
25 run: Box::new(move |mut rest| {
26 rest.insert(0, x.clone());
27 rest
28 }),
29 size_hint: 1,
30 }
31 }
32 #[allow(dead_code)]
34 pub fn to_vec(self) -> Vec<T> {
35 (self.run)(Vec::new())
36 }
37 #[allow(dead_code)]
39 pub fn size_hint(&self) -> usize {
40 self.size_hint
41 }
42}
43#[allow(dead_code)]
45pub struct CircularBuffer<T> {
46 data: Vec<T>,
47 head: usize,
48 tail: usize,
49 len: usize,
50 capacity: usize,
51}
52impl<T> CircularBuffer<T> {
53 #[allow(dead_code)]
55 pub fn new(capacity: usize) -> Self {
56 Self {
57 data: Vec::with_capacity(capacity),
58 head: 0,
59 tail: 0,
60 len: 0,
61 capacity,
62 }
63 }
64 #[allow(dead_code)]
66 pub fn len(&self) -> usize {
67 self.len
68 }
69 #[allow(dead_code)]
71 pub fn is_empty(&self) -> bool {
72 self.len == 0
73 }
74 #[allow(dead_code)]
76 pub fn capacity(&self) -> usize {
77 self.capacity
78 }
79 #[allow(dead_code)]
81 pub fn is_full(&self) -> bool {
82 self.len == self.capacity
83 }
84}
85#[allow(dead_code)]
87pub struct PrefixScan<T> {
88 pub values: Vec<T>,
89 pub inclusive: bool,
90 pub direction: &'static str,
91}
92impl<T: Clone> PrefixScan<T> {
93 #[allow(dead_code)]
95 pub fn inclusive(values: Vec<T>) -> Self {
96 Self {
97 values,
98 inclusive: true,
99 direction: "left",
100 }
101 }
102 #[allow(dead_code)]
104 pub fn exclusive(values: Vec<T>) -> Self {
105 Self {
106 values,
107 inclusive: false,
108 direction: "left",
109 }
110 }
111 #[allow(dead_code)]
113 pub fn values(&self) -> &[T] {
114 &self.values
115 }
116 #[allow(dead_code)]
118 pub fn len(&self) -> usize {
119 self.values.len()
120 }
121 #[allow(dead_code)]
123 pub fn is_empty(&self) -> bool {
124 self.values.is_empty()
125 }
126}
127#[allow(dead_code)]
129pub struct FenwickTree {
130 data: Vec<i64>,
131 n: usize,
132}
133impl FenwickTree {
134 #[allow(dead_code)]
136 pub fn new(n: usize) -> Self {
137 Self {
138 data: vec![0; n + 1],
139 n,
140 }
141 }
142 #[allow(dead_code)]
144 pub fn update(&mut self, mut i: usize, delta: i64) {
145 while i <= self.n {
146 self.data[i] += delta;
147 i += i & i.wrapping_neg();
148 }
149 }
150 #[allow(dead_code)]
152 pub fn query(&self, mut i: usize) -> i64 {
153 let mut sum = 0i64;
154 while i > 0 {
155 sum += self.data[i];
156 i -= i & i.wrapping_neg();
157 }
158 sum
159 }
160 #[allow(dead_code)]
162 pub fn len(&self) -> usize {
163 self.n
164 }
165 #[allow(dead_code)]
167 pub fn is_empty(&self) -> bool {
168 self.n == 0
169 }
170}
171#[allow(dead_code)]
173pub struct SparseVec<T> {
174 entries: Vec<(usize, T)>,
175 length: usize,
176 default_val: T,
177}
178impl<T: Clone + PartialEq> SparseVec<T> {
179 #[allow(dead_code)]
181 pub fn new(length: usize, default_val: T) -> Self {
182 Self {
183 entries: Vec::new(),
184 length,
185 default_val,
186 }
187 }
188 #[allow(dead_code)]
190 pub fn set(&mut self, i: usize, value: T) {
191 if i < self.length {
192 if let Some(entry) = self.entries.iter_mut().find(|(idx, _)| *idx == i) {
193 entry.1 = value;
194 } else {
195 self.entries.push((i, value));
196 }
197 }
198 }
199 #[allow(dead_code)]
201 pub fn get(&self, i: usize) -> &T {
202 self.entries
203 .iter()
204 .find(|(idx, _)| *idx == i)
205 .map(|(_, v)| v)
206 .unwrap_or(&self.default_val)
207 }
208 #[allow(dead_code)]
210 pub fn len(&self) -> usize {
211 self.length
212 }
213 #[allow(dead_code)]
215 pub fn is_empty(&self) -> bool {
216 self.length == 0
217 }
218 #[allow(dead_code)]
220 pub fn nnz(&self) -> usize {
221 self.entries.len()
222 }
223}
224#[allow(dead_code)]
227#[derive(Clone, Debug, PartialEq, Eq)]
228pub struct FixedVec<T> {
229 data: Box<[T]>,
230}
231impl<T: Clone> FixedVec<T> {
232 pub fn from_vec(v: Vec<T>) -> Self {
234 Self {
235 data: v.into_boxed_slice(),
236 }
237 }
238 pub fn len(&self) -> usize {
240 self.data.len()
241 }
242 pub fn is_empty(&self) -> bool {
244 self.data.is_empty()
245 }
246 pub fn get(&self, i: usize) -> Option<&T> {
248 self.data.get(i)
249 }
250 pub fn to_vec(&self) -> Vec<T> {
252 self.data.to_vec()
253 }
254 pub fn iter(&self) -> std::slice::Iter<'_, T> {
256 self.data.iter()
257 }
258}