1 #[cfg(feature = "with-serde")] 2 use serde; 3 4 use std::borrow::Borrow; 5 use std::cmp::Ordering; 6 use std::default::Default; 7 use std::fmt; 8 use std::hash::Hash; 9 use std::hash::Hasher; 10 use std::iter::FromIterator; 11 use std::iter::IntoIterator; 12 use std::ops::Deref; 13 use std::ops::DerefMut; 14 use std::ops::Index; 15 use std::ops::IndexMut; 16 use std::slice; 17 use std::vec; 18 19 use crate::clear::Clear; 20 21 /// Wrapper around vector to avoid deallocations on clear. 22 pub struct RepeatedField<T> { 23 vec: Vec<T>, 24 len: usize, 25 } 26 27 impl<T> RepeatedField<T> { 28 /// Return number of elements in this container. 29 #[inline] len(&self) -> usize30 pub fn len(&self) -> usize { 31 self.len 32 } 33 34 /// Clear. 35 #[inline] clear(&mut self)36 pub fn clear(&mut self) { 37 self.len = 0; 38 } 39 } 40 41 impl<T> Clear for RepeatedField<T> { 42 #[inline] clear(&mut self)43 fn clear(&mut self) { 44 self.len = 0; 45 } 46 } 47 48 impl<T> Default for RepeatedField<T> { 49 #[inline] default() -> RepeatedField<T>50 fn default() -> RepeatedField<T> { 51 RepeatedField { 52 vec: Vec::new(), 53 len: 0, 54 } 55 } 56 } 57 58 impl<T> RepeatedField<T> { 59 /// Create new empty container. 60 #[inline] new() -> RepeatedField<T>61 pub fn new() -> RepeatedField<T> { 62 Default::default() 63 } 64 65 /// Create a contained with data from given vec. 66 #[inline] from_vec(vec: Vec<T>) -> RepeatedField<T>67 pub fn from_vec(vec: Vec<T>) -> RepeatedField<T> { 68 let len = vec.len(); 69 RepeatedField { vec: vec, len: len } 70 } 71 72 /// Convert data into vec. 73 #[inline] into_vec(self) -> Vec<T>74 pub fn into_vec(self) -> Vec<T> { 75 let mut vec = self.vec; 76 vec.truncate(self.len); 77 vec 78 } 79 80 /// Return current capacity. 81 #[inline] capacity(&self) -> usize82 pub fn capacity(&self) -> usize { 83 self.vec.capacity() 84 } 85 86 /// View data as slice. 87 #[inline] as_slice<'a>(&'a self) -> &'a [T]88 pub fn as_slice<'a>(&'a self) -> &'a [T] { 89 &self.vec[..self.len] 90 } 91 92 /// View data as mutable slice. 93 #[inline] as_mut_slice<'a>(&'a mut self) -> &'a mut [T]94 pub fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T] { 95 &mut self.vec[..self.len] 96 } 97 98 /// Get subslice of this container. 99 #[inline] slice(&self, start: usize, end: usize) -> &[T]100 pub fn slice(&self, start: usize, end: usize) -> &[T] { 101 &self.as_ref()[start..end] 102 } 103 104 /// Get mutable subslice of this container. 105 #[inline] slice_mut(&mut self, start: usize, end: usize) -> &mut [T]106 pub fn slice_mut(&mut self, start: usize, end: usize) -> &mut [T] { 107 &mut self.as_mut_slice()[start..end] 108 } 109 110 /// Get slice from given index. 111 #[inline] slice_from(&self, start: usize) -> &[T]112 pub fn slice_from(&self, start: usize) -> &[T] { 113 &self.as_ref()[start..] 114 } 115 116 /// Get mutable slice from given index. 117 #[inline] slice_from_mut(&mut self, start: usize) -> &mut [T]118 pub fn slice_from_mut(&mut self, start: usize) -> &mut [T] { 119 &mut self.as_mut_slice()[start..] 120 } 121 122 /// Get slice to given index. 123 #[inline] slice_to(&self, end: usize) -> &[T]124 pub fn slice_to(&self, end: usize) -> &[T] { 125 &self.as_ref()[..end] 126 } 127 128 /// Get mutable slice to given index. 129 #[inline] slice_to_mut(&mut self, end: usize) -> &mut [T]130 pub fn slice_to_mut(&mut self, end: usize) -> &mut [T] { 131 &mut self.as_mut_slice()[..end] 132 } 133 134 /// View this container as two slices split at given index. 135 #[inline] split_at<'a>(&'a self, mid: usize) -> (&'a [T], &'a [T])136 pub fn split_at<'a>(&'a self, mid: usize) -> (&'a [T], &'a [T]) { 137 self.as_ref().split_at(mid) 138 } 139 140 /// View this container as two mutable slices split at given index. 141 #[inline] split_at_mut<'a>(&'a mut self, mid: usize) -> (&'a mut [T], &'a mut [T])142 pub fn split_at_mut<'a>(&'a mut self, mid: usize) -> (&'a mut [T], &'a mut [T]) { 143 self.as_mut_slice().split_at_mut(mid) 144 } 145 146 /// View all but first elements of this container. 147 #[inline] tail(&self) -> &[T]148 pub fn tail(&self) -> &[T] { 149 &self.as_ref()[1..] 150 } 151 152 /// Last element of this container. 153 #[inline] last(&self) -> Option<&T>154 pub fn last(&self) -> Option<&T> { 155 self.as_ref().last() 156 } 157 158 /// Mutable last element of this container. 159 #[inline] last_mut<'a>(&'a mut self) -> Option<&'a mut T>160 pub fn last_mut<'a>(&'a mut self) -> Option<&'a mut T> { 161 self.as_mut_slice().last_mut() 162 } 163 164 /// View all but last elements of this container. 165 #[inline] init<'a>(&'a self) -> &'a [T]166 pub fn init<'a>(&'a self) -> &'a [T] { 167 let s = self.as_ref(); 168 &s[0..s.len() - 1] 169 } 170 171 /// Push an element to the end. 172 #[inline] push(&mut self, value: T)173 pub fn push(&mut self, value: T) { 174 if self.len == self.vec.len() { 175 self.vec.push(value); 176 } else { 177 self.vec[self.len] = value; 178 } 179 self.len += 1; 180 } 181 182 /// Pop last element. 183 #[inline] pop(&mut self) -> Option<T>184 pub fn pop(&mut self) -> Option<T> { 185 if self.len == 0 { 186 None 187 } else { 188 self.vec.truncate(self.len); 189 self.len -= 1; 190 self.vec.pop() 191 } 192 } 193 194 /// Insert an element at specified position. 195 #[inline] insert(&mut self, index: usize, value: T)196 pub fn insert(&mut self, index: usize, value: T) { 197 assert!(index <= self.len); 198 self.vec.insert(index, value); 199 self.len += 1; 200 } 201 202 /// Remove an element from specified position. 203 #[inline] remove(&mut self, index: usize) -> T204 pub fn remove(&mut self, index: usize) -> T { 205 assert!(index < self.len); 206 self.len -= 1; 207 self.vec.remove(index) 208 } 209 210 /// Retains only the elements specified by the predicate. 211 /// 212 /// In other words, remove all elements `e` such that `f(&e)` returns `false`. 213 /// This method operates in place, visiting each element exactly once in the 214 /// original order, and preserves the order of the retained elements. 215 /// 216 /// # Examples 217 /// 218 /// ``` 219 /// # use protobuf::RepeatedField; 220 /// 221 /// let mut vec = RepeatedField::from(vec![1, 2, 3, 4]); 222 /// vec.retain(|&x| x % 2 == 0); 223 /// assert_eq!(vec, RepeatedField::from(vec![2, 4])); 224 /// ``` retain<F>(&mut self, f: F) where F: FnMut(&T) -> bool,225 pub fn retain<F>(&mut self, f: F) 226 where 227 F: FnMut(&T) -> bool, 228 { 229 // suboptimal 230 self.vec.truncate(self.len); 231 self.vec.retain(f); 232 self.len = self.vec.len(); 233 } 234 235 /// Truncate at specified length. 236 #[inline] truncate(&mut self, len: usize)237 pub fn truncate(&mut self, len: usize) { 238 if self.len > len { 239 self.len = len; 240 } 241 } 242 243 /// Reverse in place. 244 #[inline] reverse(&mut self)245 pub fn reverse(&mut self) { 246 self.as_mut_slice().reverse() 247 } 248 249 /// Into owned iterator. 250 #[inline] into_iter(mut self) -> vec::IntoIter<T>251 pub fn into_iter(mut self) -> vec::IntoIter<T> { 252 self.vec.truncate(self.len); 253 self.vec.into_iter() 254 } 255 256 /// Immutable data iterator. 257 #[inline] iter<'a>(&'a self) -> slice::Iter<'a, T>258 pub fn iter<'a>(&'a self) -> slice::Iter<'a, T> { 259 self.as_ref().iter() 260 } 261 262 /// Mutable data iterator. 263 #[inline] iter_mut<'a>(&'a mut self) -> slice::IterMut<'a, T>264 pub fn iter_mut<'a>(&'a mut self) -> slice::IterMut<'a, T> { 265 self.as_mut_slice().iter_mut() 266 } 267 268 /// Sort elements with given comparator. 269 #[inline] sort_by<F>(&mut self, compare: F) where F: Fn(&T, &T) -> Ordering,270 pub fn sort_by<F>(&mut self, compare: F) 271 where 272 F: Fn(&T, &T) -> Ordering, 273 { 274 self.as_mut_slice().sort_by(compare) 275 } 276 277 /// Get data as raw pointer. 278 #[inline] as_ptr(&self) -> *const T279 pub fn as_ptr(&self) -> *const T { 280 self.vec.as_ptr() 281 } 282 283 /// Get data a mutable raw pointer. 284 #[inline] as_mut_ptr(&mut self) -> *mut T285 pub fn as_mut_ptr(&mut self) -> *mut T { 286 self.vec.as_mut_ptr() 287 } 288 } 289 290 impl<T: Default + Clear> RepeatedField<T> { 291 /// Push default value. 292 /// This operation could be faster than `rf.push(Default::default())`, 293 /// because it may reuse previously allocated and cleared element. push_default<'a>(&'a mut self) -> &'a mut T294 pub fn push_default<'a>(&'a mut self) -> &'a mut T { 295 if self.len == self.vec.len() { 296 self.vec.push(Default::default()); 297 } else { 298 self.vec[self.len].clear(); 299 } 300 self.len += 1; 301 self.last_mut().unwrap() 302 } 303 } 304 305 impl<T> From<Vec<T>> for RepeatedField<T> { 306 #[inline] from(values: Vec<T>) -> RepeatedField<T>307 fn from(values: Vec<T>) -> RepeatedField<T> { 308 RepeatedField::from_vec(values) 309 } 310 } 311 312 impl<'a, T: Clone> From<&'a [T]> for RepeatedField<T> { 313 #[inline] from(values: &'a [T]) -> RepeatedField<T>314 fn from(values: &'a [T]) -> RepeatedField<T> { 315 RepeatedField::from_slice(values) 316 } 317 } 318 319 impl<T> Into<Vec<T>> for RepeatedField<T> { 320 #[inline] into(self) -> Vec<T>321 fn into(self) -> Vec<T> { 322 self.into_vec() 323 } 324 } 325 326 impl<T: Clone> RepeatedField<T> { 327 /// Copy slice data to `RepeatedField` 328 #[inline] from_slice(values: &[T]) -> RepeatedField<T>329 pub fn from_slice(values: &[T]) -> RepeatedField<T> { 330 RepeatedField::from_vec(values.to_vec()) 331 } 332 333 /// Copy slice data to `RepeatedField` 334 #[inline] from_ref<X: AsRef<[T]>>(values: X) -> RepeatedField<T>335 pub fn from_ref<X: AsRef<[T]>>(values: X) -> RepeatedField<T> { 336 RepeatedField::from_slice(values.as_ref()) 337 } 338 339 /// Copy this data into new vec. 340 #[inline] to_vec(&self) -> Vec<T>341 pub fn to_vec(&self) -> Vec<T> { 342 self.as_ref().to_vec() 343 } 344 } 345 346 impl<T: Clone> Clone for RepeatedField<T> { 347 #[inline] clone(&self) -> RepeatedField<T>348 fn clone(&self) -> RepeatedField<T> { 349 RepeatedField { 350 vec: self.to_vec(), 351 len: self.len(), 352 } 353 } 354 } 355 356 impl<T> FromIterator<T> for RepeatedField<T> { 357 #[inline] from_iter<I: IntoIterator<Item = T>>(iter: I) -> RepeatedField<T>358 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> RepeatedField<T> { 359 RepeatedField::from_vec(FromIterator::from_iter(iter)) 360 } 361 } 362 363 impl<'a, T> IntoIterator for &'a RepeatedField<T> { 364 type Item = &'a T; 365 type IntoIter = slice::Iter<'a, T>; 366 into_iter(self) -> slice::Iter<'a, T>367 fn into_iter(self) -> slice::Iter<'a, T> { 368 self.iter() 369 } 370 } 371 372 impl<'a, T> IntoIterator for &'a mut RepeatedField<T> { 373 type Item = &'a mut T; 374 type IntoIter = slice::IterMut<'a, T>; 375 into_iter(self) -> slice::IterMut<'a, T>376 fn into_iter(self) -> slice::IterMut<'a, T> { 377 self.iter_mut() 378 } 379 } 380 381 impl<'a, T> IntoIterator for RepeatedField<T> { 382 type Item = T; 383 type IntoIter = vec::IntoIter<T>; 384 into_iter(self) -> vec::IntoIter<T>385 fn into_iter(self) -> vec::IntoIter<T> { 386 self.into_iter() 387 } 388 } 389 390 impl<T: PartialEq> PartialEq for RepeatedField<T> { 391 #[inline] eq(&self, other: &RepeatedField<T>) -> bool392 fn eq(&self, other: &RepeatedField<T>) -> bool { 393 self.as_ref() == other.as_ref() 394 } 395 } 396 397 impl<T: Eq> Eq for RepeatedField<T> {} 398 399 impl<T: PartialEq> RepeatedField<T> { 400 /// True iff this container contains given element. 401 #[inline] contains(&self, value: &T) -> bool402 pub fn contains(&self, value: &T) -> bool { 403 self.as_ref().contains(value) 404 } 405 } 406 407 impl<T: Hash> Hash for RepeatedField<T> { hash<H: Hasher>(&self, state: &mut H)408 fn hash<H: Hasher>(&self, state: &mut H) { 409 self.as_ref().hash(state); 410 } 411 } 412 413 impl<T> AsRef<[T]> for RepeatedField<T> { 414 #[inline] as_ref<'a>(&'a self) -> &'a [T]415 fn as_ref<'a>(&'a self) -> &'a [T] { 416 &self.vec[..self.len] 417 } 418 } 419 420 impl<T> Borrow<[T]> for RepeatedField<T> { 421 #[inline] borrow(&self) -> &[T]422 fn borrow(&self) -> &[T] { 423 &self.vec[..self.len] 424 } 425 } 426 427 impl<T> Deref for RepeatedField<T> { 428 type Target = [T]; 429 #[inline] deref(&self) -> &[T]430 fn deref(&self) -> &[T] { 431 &self.vec[..self.len] 432 } 433 } 434 435 impl<T> DerefMut for RepeatedField<T> { 436 #[inline] deref_mut(&mut self) -> &mut [T]437 fn deref_mut(&mut self) -> &mut [T] { 438 &mut self.vec[..self.len] 439 } 440 } 441 442 impl<T> Index<usize> for RepeatedField<T> { 443 type Output = T; 444 445 #[inline] index<'a>(&'a self, index: usize) -> &'a T446 fn index<'a>(&'a self, index: usize) -> &'a T { 447 &self.as_ref()[index] 448 } 449 } 450 451 impl<T> IndexMut<usize> for RepeatedField<T> { 452 #[inline] index_mut<'a>(&'a mut self, index: usize) -> &'a mut T453 fn index_mut<'a>(&'a mut self, index: usize) -> &'a mut T { 454 &mut self.as_mut_slice()[index] 455 } 456 } 457 458 impl<T: fmt::Debug> fmt::Debug for RepeatedField<T> { 459 #[inline] fmt(&self, f: &mut fmt::Formatter) -> fmt::Result460 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 461 self.as_ref().fmt(f) 462 } 463 } 464 465 #[cfg(feature = "with-serde")] 466 impl<T: serde::Serialize> serde::Serialize for RepeatedField<T> { serialize<S>( &self, serializer: S, ) -> Result<<S as serde::Serializer>::Ok, <S as serde::Serializer>::Error> where S: serde::Serializer,467 fn serialize<S>( 468 &self, 469 serializer: S, 470 ) -> Result<<S as serde::Serializer>::Ok, <S as serde::Serializer>::Error> 471 where 472 S: serde::Serializer, 473 { 474 self.as_ref().serialize(serializer) 475 } 476 } 477 478 #[cfg(feature = "with-serde")] 479 impl<'de, T: serde::Deserialize<'de> + Default> serde::Deserialize<'de> for RepeatedField<T> { deserialize<D>(deserializer: D) -> Result<Self, <D as serde::Deserializer<'de>>::Error> where D: serde::Deserializer<'de>,480 fn deserialize<D>(deserializer: D) -> Result<Self, <D as serde::Deserializer<'de>>::Error> 481 where 482 D: serde::Deserializer<'de>, 483 { 484 Vec::deserialize(deserializer).map(RepeatedField::from) 485 } 486 } 487 488 #[cfg(test)] 489 mod test { 490 use super::RepeatedField; 491 492 #[test] as_mut_slice()493 fn as_mut_slice() { 494 let mut v = RepeatedField::new(); 495 v.push(10); 496 v.push(20); 497 v.clear(); 498 assert_eq!(v.as_mut_slice(), &mut []); 499 v.push(30); 500 assert_eq!(v.as_mut_slice(), &mut [30]); 501 } 502 503 #[test] push_default()504 fn push_default() { 505 let mut v = RepeatedField::new(); 506 v.push("aa".to_string()); 507 v.push("bb".to_string()); 508 v.clear(); 509 assert_eq!("".to_string(), *v.push_default()); 510 } 511 } 512