stdlib_rs/collections/min_stack.rs
1#![deny(missing_docs)]
2
3use std::cmp::min;
4use std::fmt::Debug;
5use std::mem;
6use std::ops::{Deref, DerefMut, Index};
7
8impl<T> MinStack<T>
9where
10 T: Clone + Ord + Default,
11{
12 /// Moves all the elements of `other` into `Self`, leaving other empty.
13 /// ## Panics
14 /// Panics if the number of elements in the `MinStack` overflows a `usize`.
15 /// ## Examples
16 /// ```
17 /// # use stdlib_rs::min_stack;
18 /// # use stdlib_rs::collections::min_stack::MinStack;
19 /// let mut left = min_stack![1];
20 /// let mut right = min_stack![2];
21 /// left.append(&mut right);
22 /// assert_eq!(left, min_stack![1, 2]);
23 /// ```
24 pub fn append(&mut self, other: &mut Self) {
25 let other = mem::take(other);
26 for item in other {
27 self.push(item.0);
28 }
29 }
30}
31
32impl<T> MinStack<T>
33where
34 T: Clone + Ord,
35{
36 /// Finds the minimum item of the stack in O(1) time.
37 /// If the stack is empty, returns `None`.
38 /// ## Examples
39 /// ```
40 /// # use stdlib_rs::min_stack;
41 /// # use stdlib_rs::collections::min_stack::MinStack;
42 /// let stack = min_stack![1, 2];
43 /// let empty: MinStack<i32> = min_stack![];
44 /// assert_eq!(stack.min(), Some(1));
45 /// assert_eq!(empty.min(), None);
46 /// ```
47 pub fn min(&self) -> Option<T> {
48 self.0.last().map(|item| item.1.clone())
49 }
50
51 /// Look at the top item of the stack in O(1) time.
52 /// If the stack is empty, returns `None`.
53 /// ## Examples
54 /// ```
55 /// # use stdlib_rs::min_stack;
56 /// # use stdlib_rs::collections::min_stack::MinStack;
57 /// let stack = min_stack![1, 2];
58 /// let empty: MinStack<i32> = min_stack![];
59 /// assert_eq!(stack.peek(), Some(2));
60 /// assert_eq!(empty.peek(), None);
61 /// ```
62 pub fn peek(&self) -> Option<T> {
63 self.0.last().map(|item| item.0.clone())
64 }
65
66 /// Adds an item to the end of the stack in O(1) time.
67 /// ## Examples
68 /// ```
69 /// # use stdlib_rs::min_stack;
70 /// # use stdlib_rs::collections::min_stack::MinStack;
71 /// let mut stack = min_stack![1];
72 /// stack.push(2);
73 /// assert_eq!(stack.len(), 2);
74 /// ```
75 pub fn push(&mut self, item: T) {
76 if !self.0.is_empty() {
77 let curr_min = self.min().clone().unwrap();
78 let new_min = min(curr_min, item.clone());
79 self.0.push((item, new_min));
80 } else {
81 self.0.push((item.clone(), item));
82 }
83 }
84
85 /// Creates a min_stack from a vector.
86 /// ## Examples
87 /// ```
88 /// # use stdlib_rs::min_stack;
89 /// # use stdlib_rs::collections::min_stack::MinStack;
90 /// let v = vec![1, 2, 3];
91 /// let stack: MinStack<i32> = MinStack::from(v);
92 /// assert_eq!(stack, min_stack![1, 2, 3]);
93 /// ```
94 pub fn from(vec: Vec<T>) -> Self {
95 let mut stack = MinStack::new();
96 for item in vec {
97 stack.push(item);
98 }
99 stack
100 }
101}
102
103/// A Stack data type that supports accessing the minimum item
104/// in the stack in O(1) time.
105#[derive(Default, Debug, Clone, PartialEq, Eq, PartialOrd)]
106pub struct MinStack<T: Ord>(Vec<(T, T)>);
107
108impl<T> IntoIterator for MinStack<T>
109where
110 T: Ord,
111{
112 type Item = (T, T);
113 type IntoIter = std::vec::IntoIter<Self::Item>;
114
115 fn into_iter(self) -> Self::IntoIter {
116 self.0.into_iter()
117 }
118}
119
120impl<T> Deref for MinStack<T>
121where
122 T: Ord,
123{
124 type Target = [(T, T)];
125
126 fn deref(&self) -> &Self::Target {
127 self.0.deref()
128 }
129}
130
131impl<T> DerefMut for MinStack<T>
132where
133 T: Ord,
134{
135 fn deref_mut(&mut self) -> &mut [(T, T)] {
136 self.0.deref_mut()
137 }
138}
139
140impl<T> Index<usize> for MinStack<T>
141where
142 T: Ord,
143{
144 type Output = (T, T);
145
146 fn index(&self, index: usize) -> &Self::Output {
147 &self.0[index]
148 }
149}
150
151impl<T> MinStack<T>
152where
153 T: Ord,
154{
155 /// Creates a new MinStack.
156 pub fn new() -> Self {
157 MinStack(vec![])
158 }
159
160 /// Extracts a slice containing the Min Stack.
161 /// Equivalent to `&s[..]`.
162 pub fn as_slice(&self) -> &[(T, T)] {
163 &self.0
164 }
165
166 /// Returns a raw pointer to the min_stack.
167 pub fn as_ptr(&self) -> *const (T, T) {
168 self.0.as_ptr()
169 }
170
171 /// Returns a mutable pointer to the min_stack.
172 pub fn as_mut_ptr(&mut self) -> *mut (T, T) {
173 self.0.as_mut_ptr()
174 }
175
176 /// Clears the MinStack, removing all values.
177 /// ## Examples
178 /// ```
179 /// # use stdlib_rs::min_stack;
180 /// # use stdlib_rs::collections::min_stack::*;
181 /// let mut stack = min_stack![1,2,3];
182 /// stack.clear();
183 /// assert_eq!(stack, min_stack![]);
184 /// ```
185 pub fn clear(&mut self) {
186 self.0.clear()
187 }
188
189 /// Creates a new MinStack with the given capacity.
190 /// ## Examples
191 /// ```
192 /// # use stdlib_rs::min_stack;
193 /// # use stdlib_rs::collections::min_stack::*;
194 /// let stack: MinStack<i32> = MinStack::with_capacity(10);
195 /// assert!(stack.capacity() >= 10);
196 /// ```
197 pub fn with_capacity(capacity: usize) -> MinStack<T> {
198 let mut stack = MinStack::new();
199 stack.0 = Vec::with_capacity(capacity);
200 stack
201 }
202
203 /// Reserves capacity for at least `additional` more elements to be inserted
204 /// in the given `MinStack<T>`. The collection may reserve more space to
205 /// avoid frequent reallocations. After calling reserve, capacity will be
206 /// greater than or equal to self.len() + additional.
207 /// Does nothing if capacity is already sufficient.
208 /// ## Examples
209 /// ```
210 /// # use stdlib_rs::min_stack;
211 /// # use stdlib_rs::collections::min_stack::*;
212 /// let mut stack = min_stack![1];
213 /// stack.reserve(10);
214 /// assert!(stack.capacity() >= 11);
215 /// ```
216 pub fn reserve(&mut self, additional: usize) {
217 self.0.reserve(additional)
218 }
219
220 /// Returns the number of elements the vector can hold without reallocating.
221 /// ## Examples
222 /// ```
223 /// # use stdlib_rs::min_stack;
224 /// # use stdlib_rs::collections::min_stack::*;
225 /// let stack: MinStack<i32> = MinStack::with_capacity(10);
226 /// assert!(stack.capacity() >= 10);
227 /// ```
228 pub fn capacity(&self) -> usize {
229 self.0.capacity()
230 }
231
232 /// Removes the last element from a vector and returns it, or `None` if it is empty.
233 /// ## Examples
234 /// ```
235 /// # use stdlib_rs::min_stack;
236 /// # use stdlib_rs::collections::min_stack::*;
237 /// let mut stack = min_stack![1, 2, 3];
238 /// let mut empty: MinStack<i32> = min_stack![];
239 /// assert_eq!(stack.pop(), Some(3));
240 /// assert_eq!(empty.pop(), None);
241 /// ```
242 pub fn pop(&mut self) -> Option<T> {
243 match self.0.pop() {
244 Some(item) => Some(item.0),
245 None => None,
246 }
247 }
248
249 /// Returns `true` if the MinStack has no elements.
250 /// ## Examples
251 /// ```
252 /// # use stdlib_rs::min_stack;
253 /// # use stdlib_rs::collections::min_stack::*;
254 /// let stack = min_stack![1, 2, 3];
255 /// let empty: MinStack<i32> = min_stack![];
256 /// assert_eq!(stack.is_empty(), false);
257 /// assert_eq!(empty.is_empty(), true);
258 /// ```
259 pub fn is_empty(&self) -> bool {
260 self.0.is_empty()
261 }
262
263 /// Returns the number of elements in the stack.
264 /// ## Examples
265 /// ```
266 /// # use stdlib_rs::min_stack;
267 /// # use stdlib_rs::collections::min_stack::*;
268 /// let stack = min_stack![1, 2, 3];
269 /// assert_eq!(stack.len(), 3);
270 /// ```
271 pub fn len(&self) -> usize {
272 self.0.len()
273 }
274}
275
276/// Create a new min_stack with the elements inside the macro.
277/// Works like the `vec![]` macro.
278/// ## Examples
279/// ```
280/// # use stdlib_rs::min_stack;
281/// # use stdlib_rs::collections::min_stack::*;
282/// let stack = min_stack![1, 2, 3];
283/// let empty: MinStack<i32> = min_stack![];
284/// let mut other = MinStack::new();
285/// other.push(1);
286/// other.push(2);
287/// other.push(3);
288/// assert_eq!(stack, other);
289/// assert_eq!(empty, MinStack::new());
290/// ```
291#[macro_export]
292macro_rules! min_stack [
293 ($($e:expr),*) => ({
294 let mut _temp = MinStack::new();
295 $(_temp.push($e);)*
296 _temp
297 })
298];
299
300#[cfg(test)]
301mod tests {
302 use super::MinStack;
303
304 #[test]
305 fn min_test_1() {
306 let min = min_stack![1, 2, 3].min();
307 assert_eq!(min, Some(1));
308 }
309
310 #[test]
311 fn min_test_empty() {
312 let empty: MinStack<i32> = min_stack![];
313 assert_eq!(empty.min(), None);
314 }
315
316 #[test]
317 fn peek_test_1() {
318 let stack = min_stack![1, 2, 3].peek();
319 assert_eq!(stack, Some(3));
320 }
321
322 #[test]
323 fn peek_test_empty() {
324 let empty: MinStack<i32> = min_stack![];
325 assert_eq!(empty.peek(), None);
326 }
327
328 #[test]
329 fn empty_test() {
330 let empty: MinStack<i32> = min_stack![];
331 assert_eq!(empty.is_empty(), true);
332 }
333
334 #[test]
335 fn non_empty_test() {
336 let empty: MinStack<i32> = min_stack![1];
337 assert_eq!(empty.is_empty(), false);
338 }
339
340 #[test]
341 fn empty_len_test() {
342 let empty: MinStack<i32> = min_stack![];
343 assert_eq!(empty.len(), 0);
344 }
345
346 #[test]
347 fn one_item_stack_len() {
348 let empty: MinStack<i32> = min_stack![1];
349 assert_eq!(empty.len(), 1);
350 }
351
352 #[test]
353 fn into_iter_test_1() {
354 let mut stack = min_stack![1, 2, 3].into_iter();
355 assert_eq!(stack.next(), Some((1, 1)));
356 assert_eq!(stack.next(), Some((2, 1)));
357 assert_eq!(stack.next(), Some((3, 1)));
358 }
359
360 #[test]
361 fn from_vec_test_1() {
362 let vec = vec![1, 2, 3];
363 assert_eq!(MinStack::from(vec), min_stack![1, 2, 3]);
364 }
365
366 #[test]
367 fn test_index_1() {
368 let stack = min_stack![1];
369 assert_eq!(stack[0], (1, 1));
370 }
371
372 #[test]
373 fn test_reserve_1() {
374 let mut stack = min_stack![1];
375 stack.reserve(10);
376 assert!(stack.capacity() >= 11);
377 }
378
379 #[test]
380 fn test_as_slice_1() {
381 let stack = min_stack![1, 2, 3];
382 assert_eq!([(1, 1), (2, 1), (3, 1)], stack.as_slice());
383 }
384
385 #[test]
386 fn append_empty_stack() {
387 let mut left = min_stack![1];
388 let mut right = min_stack![];
389 left.append(&mut right);
390 assert_eq!(left, min_stack![1]);
391 assert_eq!(right, min_stack![]);
392 }
393
394 #[test]
395 fn append_to_empty_stack() {
396 let mut left = min_stack![];
397 let mut right = min_stack![1];
398 left.append(&mut right);
399 assert_eq!(left, min_stack![1]);
400 assert_eq!(right, min_stack![]);
401 }
402
403 #[test]
404 fn append_two_empty_stacks() {
405 let mut left: MinStack<i32> = min_stack![];
406 let mut right = min_stack![];
407 left.append(&mut right);
408 assert_eq!(left, min_stack![]);
409 assert_eq!(right, min_stack![]);
410 }
411
412 #[test]
413 fn append_two_stacks() {
414 let mut left = min_stack![1];
415 let mut right = min_stack![2];
416 left.append(&mut right);
417 assert_eq!(left, min_stack![1, 2]);
418 assert_eq!(right, min_stack![]);
419 }
420
421 #[test]
422 fn test_eq_stacks_1() {
423 let left = min_stack![1, 2];
424 let right = min_stack![1, 2];
425 assert_eq!(left, right);
426 }
427
428 #[test]
429 fn test_neq_stacks_1() {
430 let left = min_stack![2, 1];
431 let right = min_stack![1, 2];
432 assert_ne!(left, right);
433 }
434}