1 use std::borrow::Borrow; 2 use std::cmp::Ordering; 3 use std::default::Default; 4 use std::fmt; 5 use std::hash::Hash; 6 use std::hash::Hasher; 7 use std::iter::FromIterator; 8 use std::iter::IntoIterator; 9 use std::ops::Deref; 10 use std::ops::DerefMut; 11 use std::ops::Index; 12 use std::ops::IndexMut; 13 use std::slice; 14 use std::vec; 15 16 #[cfg(feature = "with-serde")] 17 use serde; 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> PartialEq<[T]> for RepeatedField<T> { eq(&self, other: &[T]) -> bool400 fn eq(&self, other: &[T]) -> bool { 401 self.as_slice() == other 402 } 403 } 404 405 impl<T: PartialEq> PartialEq<RepeatedField<T>> for [T] { eq(&self, other: &RepeatedField<T>) -> bool406 fn eq(&self, other: &RepeatedField<T>) -> bool { 407 self == other.as_slice() 408 } 409 } 410 411 impl<T: PartialEq> RepeatedField<T> { 412 /// True iff this container contains given element. 413 #[inline] contains(&self, value: &T) -> bool414 pub fn contains(&self, value: &T) -> bool { 415 self.as_ref().contains(value) 416 } 417 } 418 419 impl<T: Hash> Hash for RepeatedField<T> { hash<H: Hasher>(&self, state: &mut H)420 fn hash<H: Hasher>(&self, state: &mut H) { 421 self.as_ref().hash(state); 422 } 423 } 424 425 impl<T> AsRef<[T]> for RepeatedField<T> { 426 #[inline] as_ref<'a>(&'a self) -> &'a [T]427 fn as_ref<'a>(&'a self) -> &'a [T] { 428 &self.vec[..self.len] 429 } 430 } 431 432 impl<T> Borrow<[T]> for RepeatedField<T> { 433 #[inline] borrow(&self) -> &[T]434 fn borrow(&self) -> &[T] { 435 &self.vec[..self.len] 436 } 437 } 438 439 impl<T> Deref for RepeatedField<T> { 440 type Target = [T]; 441 #[inline] deref(&self) -> &[T]442 fn deref(&self) -> &[T] { 443 &self.vec[..self.len] 444 } 445 } 446 447 impl<T> DerefMut for RepeatedField<T> { 448 #[inline] deref_mut(&mut self) -> &mut [T]449 fn deref_mut(&mut self) -> &mut [T] { 450 &mut self.vec[..self.len] 451 } 452 } 453 454 impl<T> Index<usize> for RepeatedField<T> { 455 type Output = T; 456 457 #[inline] index<'a>(&'a self, index: usize) -> &'a T458 fn index<'a>(&'a self, index: usize) -> &'a T { 459 &self.as_ref()[index] 460 } 461 } 462 463 impl<T> IndexMut<usize> for RepeatedField<T> { 464 #[inline] index_mut<'a>(&'a mut self, index: usize) -> &'a mut T465 fn index_mut<'a>(&'a mut self, index: usize) -> &'a mut T { 466 &mut self.as_mut_slice()[index] 467 } 468 } 469 470 impl<T> Extend<T> for RepeatedField<T> { extend<I: IntoIterator<Item = T>>(&mut self, iter: I)471 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) { 472 self.vec.truncate(self.len); 473 self.vec.extend(iter); 474 self.len = self.vec.len(); 475 } 476 } 477 478 impl<'a, T: Copy + 'a> Extend<&'a T> for RepeatedField<T> { extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I)479 fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) { 480 self.vec.truncate(self.len); 481 self.vec.extend(iter); 482 self.len = self.vec.len(); 483 } 484 } 485 486 impl<T: fmt::Debug> fmt::Debug for RepeatedField<T> { 487 #[inline] fmt(&self, f: &mut fmt::Formatter) -> fmt::Result488 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 489 self.as_ref().fmt(f) 490 } 491 } 492 493 #[cfg(feature = "with-serde")] 494 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,495 fn serialize<S>( 496 &self, 497 serializer: S, 498 ) -> Result<<S as serde::Serializer>::Ok, <S as serde::Serializer>::Error> 499 where 500 S: serde::Serializer, 501 { 502 self.as_ref().serialize(serializer) 503 } 504 } 505 506 #[cfg(feature = "with-serde")] 507 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>,508 fn deserialize<D>(deserializer: D) -> Result<Self, <D as serde::Deserializer<'de>>::Error> 509 where 510 D: serde::Deserializer<'de>, 511 { 512 Vec::deserialize(deserializer).map(RepeatedField::from) 513 } 514 } 515 516 #[cfg(test)] 517 mod test { 518 use super::RepeatedField; 519 520 #[test] as_mut_slice()521 fn as_mut_slice() { 522 let mut v = RepeatedField::new(); 523 v.push(10); 524 v.push(20); 525 v.clear(); 526 assert_eq!(v.as_mut_slice(), &mut []); 527 v.push(30); 528 assert_eq!(v.as_mut_slice(), &mut [30]); 529 } 530 531 #[test] push_default()532 fn push_default() { 533 let mut v = RepeatedField::new(); 534 v.push("aa".to_string()); 535 v.push("bb".to_string()); 536 v.clear(); 537 assert_eq!("".to_string(), *v.push_default()); 538 } 539 540 #[test] extend_values()541 fn extend_values() { 542 let mut r = RepeatedField::new(); 543 r.push(10); 544 r.push(20); 545 r.clear(); 546 // self-check 547 assert_eq!(2, r.vec.len()); 548 r.extend(vec![30, 40]); 549 assert_eq!(&[30, 40][..], &r); 550 } 551 552 #[test] extend_copy()553 fn extend_copy() { 554 let mut r = RepeatedField::new(); 555 r.push(10); 556 r.push(20); 557 r.clear(); 558 // self-check 559 assert_eq!(2, r.vec.len()); 560 r.extend(&[30, 40]); 561 assert_eq!(&[30, 40][..], &r); 562 } 563 } 564