1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
// pest. Smart PEGs in Rust // Copyright (C) 2016 Dragoș Tiselice // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. use std::collections::VecDeque; /// A `struct` which caches `VecDeque`s. #[derive(Debug)] pub struct Queues<E> { queues: Vec<VecDeque<E>>, size: usize } impl<E> Queues<E> { /// Creates a new `Queues` `struct`. /// /// # Examples /// /// ``` /// # use pest::Queues; /// let mut queues = Queues::new(); /// /// queues.last_mut().unwrap().push_back(1); /// queues.push(); /// queues.last_mut().unwrap().push_back(2); /// /// queues.pour(); /// /// assert_eq!(queues.last().unwrap()[0], 1); /// assert_eq!(queues.last().unwrap()[1], 2); /// ``` pub fn new() -> Queues<E> { Queues { queues: vec![VecDeque::new()], size: 1 } } /// Returns the last `VecDeque` if size is greater than 1, else `None`. /// /// # Examples /// /// ``` /// # use pest::Queues; /// let mut queues: Queues<i32> = Queues::new(); /// /// assert!(queues.last().unwrap().is_empty()); /// ``` pub fn last(&self) -> Option<&VecDeque<E>> { if self.size > 0 { Some(&self.queues[self.size - 1]) } else { None } } /// Returns the last `VecDeque` as mutable if size is greater than 1, else `None`. /// /// # Examples /// /// ``` /// # use pest::Queues; /// let mut queues: Queues<i32> = Queues::new(); /// /// assert!(queues.last_mut().unwrap().is_empty()); /// ``` pub fn last_mut(&mut self) -> Option<&mut VecDeque<E>> { if self.size > 0 { Some(&mut self.queues[self.size - 1]) } else { None } } /// Pushes a new `VecDeque` at the end of a `Queues` `struct`. /// /// # Examples /// /// ``` /// # use pest::Queues; /// let mut queues = Queues::new(); /// /// queues.last_mut().unwrap().push_back(1); /// queues.push(); /// /// assert!(queues.last().unwrap().is_empty()); /// ``` pub fn push(&mut self) { if self.size >= self.queues.len() { self.queues.push(VecDeque::new()); } self.size += 1; } /// Pops the last `VecDeque` from a `Queues` `struct`. /// /// # Examples /// /// ``` /// # use pest::Queues; /// let mut queues = Queues::new(); /// /// queues.push(); /// queues.last_mut().unwrap().push_back(1); /// queues.pop(); /// /// assert!(queues.last().unwrap().is_empty()); /// ``` pub fn pop(&mut self) { if self.size > 0 { self.queues[self.size - 1].clear(); self.size -= 1; } } /// Pours all elements from the last `VecDeque` into the one that comes before it, and pops it. /// /// # Examples /// /// ``` /// # use pest::Queues; /// let mut queues = Queues::new(); /// /// queues.last_mut().unwrap().push_back(1); /// queues.push(); /// queues.last_mut().unwrap().push_back(2); /// /// queues.pour(); /// /// assert_eq!(queues.last().unwrap()[0], 1); /// assert_eq!(queues.last().unwrap()[1], 2); /// ``` pub fn pour(&mut self) { if self.size > 1 { let (left, right) = self.queues.split_at_mut(self.size - 1); left[self.size - 2].append(&mut right[0]); self.size -= 1; } } }