one_stack_vec/
lib.rs

1//! OneStackVec is simple data structure which contains any number of items.
2//! If there is one or zero item, ALO does not heap allocate.
3//! If there is more than one items, ALO does heap allocate.
4//!
5//! # Examples
6//!
7//! ```
8//! use one_stack_vec::OneStackVec;
9//!
10//! let mut items = OneStackVec::new();
11//!
12//! // Adding
13//! items.push(42);
14//!
15//! // Getting
16//! assert_eq!(Some(&42), items.get(0));
17//!
18//! // Removing
19//! assert_eq!(Some(42), items.pop());
20//! assert_eq!(None, items.pop());
21//! ```
22
23use std::cmp::Ordering;
24use std::fmt::{Debug, Formatter, Error};
25use std::mem;
26
27extern crate serde;
28use serde::ser::{Serialize, Serializer, SerializeSeq};
29use serde::de::{Deserialize, Deserializer};
30
31mod iter;
32pub use self::iter::Iter;
33
34
35#[derive(Clone)]
36pub struct OneStackVec<T>(Option<(T, Vec<T>)>);
37
38impl<T> OneStackVec<T> {
39    pub fn new() -> OneStackVec<T> {
40        OneStackVec(None)
41    }
42
43    pub fn is_zero(&self) -> bool {
44        self.0.is_none()
45    }
46
47
48    pub fn push(&mut self, item: T) {
49        match &mut self.0 {
50            inner @ &mut None => {
51                mem::replace(inner, Some((item, Vec::new())));
52            }
53            &mut Some((_, ref mut vec)) => {
54                vec.push(item);
55            }
56        }
57    }
58
59    pub fn get(&self, index: usize) -> Option<&T> {
60        match &self.0 {
61            &None => None,
62            &Some((ref one, ref vec)) => {
63                if index == 0 {
64                    Some(one)
65                } else {
66                    vec.get(index - 1)
67                }
68            }
69        }
70    }
71
72    /// Removes the last element from a vector and returns it, or `None` if it is empty.
73    pub fn pop(&mut self) -> Option<T> {
74        match &mut self.0 {
75            &mut None => None,
76            &mut Some((_, ref mut vec)) if vec.len() > 0 => vec.pop(),
77            inner => {
78                // "inner" contains only one item.
79                let old_inner = mem::replace(inner, None);
80                Some(old_inner.unwrap().0)
81            }
82        }
83    }
84
85    pub fn len(&self) -> usize {
86        match &self.0 {
87            &None => 0,
88            &Some((_, ref vec)) => vec.len() + 1,
89        }
90    }
91
92
93    pub fn iter<'a>(&'a self) -> Iter<'a, T> {
94        Iter::with(self.0.as_ref().map(|&(ref first, ref vec)| (first, vec.iter())))
95    }
96
97
98    pub fn contains(&self, x: &T) -> bool
99        where T: PartialEq<T>
100    {
101        match &self.0 {
102            &None => false,
103            &Some((ref first, ref vec)) => first.eq(x) || vec.contains(x),
104        }
105    }
106}
107
108
109impl<T> Debug for OneStackVec<T>
110    where T: Debug
111{
112    fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
113        match &self.0 {
114            &None => write!(f, "OneStackVec ()"),
115            &Some((ref first, ref another)) => {
116                write!(f, "OneStackVec ( {:?}, {:?} )", first, another)
117            }
118        }
119    }
120}
121
122
123
124impl<T> PartialEq for OneStackVec<T>
125    where T: PartialEq
126{
127    fn eq(&self, other: &OneStackVec<T>) -> bool {
128        self.0.eq(&other.0)
129    }
130}
131
132
133impl<T> Eq for OneStackVec<T> where T: Eq {}
134
135
136impl<T> PartialOrd for OneStackVec<T>
137    where T: PartialOrd<T>
138{
139    fn partial_cmp(&self, other: &OneStackVec<T>) -> Option<Ordering> {
140        self.0.partial_cmp(&other.0)
141    }
142}
143
144
145impl<T> Ord for OneStackVec<T>
146    where T: Ord
147{
148    fn cmp(&self, other: &OneStackVec<T>) -> Ordering {
149        self.0.cmp(&other.0)
150    }
151}
152
153
154impl<T> Serialize for OneStackVec<T>
155    where T: Serialize
156{
157    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
158        where S: Serializer
159    {
160        let mut seq = serializer.serialize_seq(Some(self.len()))?;
161        for item in self.iter() {
162            seq.serialize_element(item)?;
163        }
164        seq.end()
165    }
166}
167
168
169impl<'de, T> Deserialize<'de> for OneStackVec<T>
170    where T: Deserialize<'de>
171{
172    fn deserialize<D>(deserializer: D) -> Result<OneStackVec<T>, D::Error>
173        where D: Deserializer<'de>
174    {
175        deserializer.deserialize_seq(OneStackVecVisitor::new())
176    }
177}
178
179struct OneStackVecVisitor<T>(::std::marker::PhantomData<T>);
180
181impl<T> OneStackVecVisitor<T> {
182    fn new() -> OneStackVecVisitor<T> {
183        OneStackVecVisitor(::std::marker::PhantomData)
184    }
185}
186
187impl<'de, T> ::serde::de::Visitor<'de> for OneStackVecVisitor<T>
188    where T: ::serde::Deserialize<'de>
189{
190    type Value = OneStackVec<T>;
191    fn expecting(&self, formatter: &mut ::std::fmt::Formatter) -> std::fmt::Result {
192        formatter.write_str("one-stack-vec sequense")
193    }
194
195    fn visit_none<E>(self) -> Result<OneStackVec<T>, E>
196        where E: ::serde::de::Error
197    {
198        Ok(OneStackVec::new())
199    }
200
201    fn visit_seq<A>(self, mut seq: A) -> Result<OneStackVec<T>, A::Error>
202        where A: ::serde::de::SeqAccess<'de>
203    {
204        let mut vec = OneStackVec::new();
205        while let Some(item) = seq.next_element()? {
206            vec.push(item);
207        }
208        Ok(vec)
209    }
210}
211
212
213#[macro_export]
214macro_rules! one_stack_vec {
215    ( $( $x:expr ),* ) => {
216        {
217            let mut tmp_vec = $crate::OneStackVec::new();
218            $(
219                tmp_vec.push($x);
220            )*
221            tmp_vec
222        }
223    };
224}
225
226
227#[cfg(test)]
228mod tests {
229    use super::*;
230
231    #[test]
232    fn ord() {
233        let item1: OneStackVec<isize> = one_stack_vec![];
234        let item2: OneStackVec<isize> = one_stack_vec![];
235        assert!(item1 == item2);
236
237        let item1 = one_stack_vec![1];
238        let item2 = one_stack_vec![];
239        assert!(item1 > item2);
240
241        let item1 = one_stack_vec![1];
242        let item2 = one_stack_vec![2];
243        assert!(item1 < item2);
244
245        let item1 = one_stack_vec![1, 2];
246        let item2 = one_stack_vec![2];
247        assert!(item1 < item2);
248
249        let item1 = one_stack_vec![1, 2, 3, 4];
250        let item2 = one_stack_vec![1, 2, 3];
251        assert!(item1 > item2);
252    }
253
254    extern crate serde_json;
255
256    #[test]
257    fn serde_json() {
258        let vec = one_stack_vec![1, 2, 3, 4, 5, 42_u32];
259        let serialized_str = serde_json::to_string(&vec).unwrap();
260        assert_eq!(vec, serde_json::from_str(serialized_str.as_str()).unwrap());
261
262        let vec: OneStackVec<u32> = one_stack_vec![];
263        let serialized_str = serde_json::to_string(&vec).unwrap();
264        assert_eq!(vec, serde_json::from_str(serialized_str.as_str()).unwrap());
265    }
266}