1use 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 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 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}