1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2023 Google LLC. All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file or at 6 // https://developers.google.com/open-source/licenses/bsd 7 8 use std::iter; 9 use std::iter::FusedIterator; 10 /// Repeated scalar fields are implemented around the runtime-specific 11 /// `RepeatedField` struct. `RepeatedField` stores an opaque pointer to the 12 /// runtime-specific representation of a repeated scalar (`upb_Array*` on upb, 13 /// and `RepeatedField<T>*` on cpp). 14 use std::marker::PhantomData; 15 use std::fmt::{self, Debug}; 16 17 use crate::{ 18 AsMut, AsView, IntoMut, IntoProxied, IntoView, Mut, MutProxied, MutProxy, Proxied, Proxy, View, 19 ViewProxy, 20 __internal::{Private, SealedInternal}, 21 __runtime::{InnerRepeated, InnerRepeatedMut, RawRepeatedField}, 22 }; 23 24 /// Views the elements in a `repeated` field of `T`. 25 #[repr(transparent)] 26 pub struct RepeatedView<'msg, T> { 27 // This does not need to carry an arena in upb, so it can be just the raw repeated field 28 raw: RawRepeatedField, 29 _phantom: PhantomData<&'msg T>, 30 } 31 32 impl<'msg, T> Copy for RepeatedView<'msg, T> {} 33 impl<'msg, T> Clone for RepeatedView<'msg, T> { clone(&self) -> Self34 fn clone(&self) -> Self { 35 *self 36 } 37 } 38 39 unsafe impl<'msg, T> Sync for RepeatedView<'msg, T> {} 40 unsafe impl<'msg, T> Send for RepeatedView<'msg, T> {} 41 42 impl<'msg, T> Debug for RepeatedView<'msg, T> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result43 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 44 f.debug_struct("RepeatedView").field("raw", &self.raw).finish() 45 } 46 } 47 48 /// Mutates the elements in a `repeated` field of `T`. 49 pub struct RepeatedMut<'msg, T> { 50 pub(crate) inner: InnerRepeatedMut<'msg>, 51 _phantom: PhantomData<&'msg mut T>, 52 } 53 54 unsafe impl<'msg, T> Sync for RepeatedMut<'msg, T> {} 55 56 impl<'msg, T> Debug for RepeatedMut<'msg, T> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result57 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 58 f.debug_struct("RepeatedMut").field("raw", &self.inner.raw).finish() 59 } 60 } 61 62 #[doc(hidden)] 63 impl<'msg, T> RepeatedView<'msg, T> { 64 #[doc(hidden)] 65 #[inline] as_raw(&self, _private: Private) -> RawRepeatedField66 pub fn as_raw(&self, _private: Private) -> RawRepeatedField { 67 self.raw 68 } 69 70 /// # Safety 71 /// - `inner` must be valid to read from for `'msg` 72 #[doc(hidden)] 73 #[inline] from_raw(_private: Private, raw: RawRepeatedField) -> Self74 pub unsafe fn from_raw(_private: Private, raw: RawRepeatedField) -> Self { 75 Self { raw, _phantom: PhantomData } 76 } 77 } 78 79 impl<'msg, T> RepeatedView<'msg, T> 80 where 81 T: ProxiedInRepeated + 'msg, 82 { 83 /// Gets the length of the repeated field. 84 #[inline] len(&self) -> usize85 pub fn len(&self) -> usize { 86 T::repeated_len(*self) 87 } 88 89 /// Returns true if the repeated field has no values. 90 #[inline] is_empty(&self) -> bool91 pub fn is_empty(&self) -> bool { 92 self.len() == 0 93 } 94 95 /// Gets the value at `index`. 96 /// 97 /// Returns `None` if `index > len`. 98 #[inline] get(self, index: usize) -> Option<View<'msg, T>>99 pub fn get(self, index: usize) -> Option<View<'msg, T>> { 100 if index >= self.len() { 101 return None; 102 } 103 // SAFETY: `index` has been checked to be in-bounds 104 Some(unsafe { self.get_unchecked(index) }) 105 } 106 107 /// Gets the value at `index` without bounds-checking. 108 /// 109 /// # Safety 110 /// Undefined behavior if `index >= len` 111 #[inline] get_unchecked(self, index: usize) -> View<'msg, T>112 pub unsafe fn get_unchecked(self, index: usize) -> View<'msg, T> { 113 // SAFETY: in-bounds as promised 114 unsafe { T::repeated_get_unchecked(self, index) } 115 } 116 117 /// Iterates over the values in the repeated field. iter(self) -> RepeatedIter<'msg, T>118 pub fn iter(self) -> RepeatedIter<'msg, T> { 119 self.into_iter() 120 } 121 } 122 123 #[doc(hidden)] 124 impl<'msg, T> RepeatedMut<'msg, T> { 125 /// # Safety 126 /// - `inner` must be valid to read and write from for `'msg` 127 /// - There must be no aliasing references or mutations on the same 128 /// underlying object. 129 #[doc(hidden)] 130 #[inline] from_inner(_private: Private, inner: InnerRepeatedMut<'msg>) -> Self131 pub unsafe fn from_inner(_private: Private, inner: InnerRepeatedMut<'msg>) -> Self { 132 Self { inner, _phantom: PhantomData } 133 } 134 135 #[doc(hidden)] 136 #[inline] as_raw(&mut self, _private: Private) -> RawRepeatedField137 pub fn as_raw(&mut self, _private: Private) -> RawRepeatedField { 138 self.inner.raw 139 } 140 } 141 142 impl<'msg, T> RepeatedMut<'msg, T> 143 where 144 T: ProxiedInRepeated + 'msg, 145 { 146 /// Gets the length of the repeated field. 147 #[inline] len(&self) -> usize148 pub fn len(&self) -> usize { 149 self.as_view().len() 150 } 151 152 /// Returns true if the repeated field has no values. 153 #[inline] is_empty(&self) -> bool154 pub fn is_empty(&self) -> bool { 155 self.len() == 0 156 } 157 158 /// Gets the value at `index`. 159 /// 160 /// Returns `None` if `index > len`. 161 #[inline] get(&self, index: usize) -> Option<View<T>>162 pub fn get(&self, index: usize) -> Option<View<T>> { 163 self.as_view().get(index) 164 } 165 166 /// Gets the value at `index` without bounds-checking. 167 /// 168 /// # Safety 169 /// Undefined behavior if `index >= len` 170 #[inline] get_unchecked(&self, index: usize) -> View<T>171 pub unsafe fn get_unchecked(&self, index: usize) -> View<T> { 172 // SAFETY: in-bounds as promised 173 unsafe { self.as_view().get_unchecked(index) } 174 } 175 176 /// Appends `val` to the end of the repeated field. 177 #[inline] push(&mut self, val: impl IntoProxied<T>)178 pub fn push(&mut self, val: impl IntoProxied<T>) { 179 T::repeated_push(self.as_mut(), val); 180 } 181 182 /// Sets the value at `index` to the value `val`. 183 /// 184 /// # Panics 185 /// Panics if `index >= len` 186 #[inline] set(&mut self, index: usize, val: impl IntoProxied<T>)187 pub fn set(&mut self, index: usize, val: impl IntoProxied<T>) { 188 let len = self.len(); 189 if index >= len { 190 panic!("index {index} >= repeated len {len}"); 191 } 192 unsafe { self.set_unchecked(index, val) } 193 } 194 195 /// Sets the value at `index` to the value `val`. 196 /// 197 /// # Safety 198 /// Undefined behavior if `index >= len` 199 #[inline] set_unchecked(&mut self, index: usize, val: impl IntoProxied<T>)200 pub unsafe fn set_unchecked(&mut self, index: usize, val: impl IntoProxied<T>) { 201 unsafe { T::repeated_set_unchecked(self.as_mut(), index, val) } 202 } 203 204 /// Iterates over the values in the repeated field. iter(&self) -> RepeatedIter<T>205 pub fn iter(&self) -> RepeatedIter<T> { 206 self.as_view().into_iter() 207 } 208 209 /// Copies from the `src` repeated field into this one. 210 /// 211 /// Also provided by [`MutProxy::set`]. copy_from(&mut self, src: RepeatedView<'_, T>)212 pub fn copy_from(&mut self, src: RepeatedView<'_, T>) { 213 T::repeated_copy_from(src, self.as_mut()) 214 } 215 216 /// Clears the repeated field. clear(&mut self)217 pub fn clear(&mut self) { 218 T::repeated_clear(self.as_mut()) 219 } 220 } 221 222 impl<T> Repeated<T> 223 where 224 T: ProxiedInRepeated, 225 { as_view(&self) -> View<Repeated<T>>226 pub fn as_view(&self) -> View<Repeated<T>> { 227 RepeatedView { raw: self.inner.raw(), _phantom: PhantomData } 228 } 229 230 #[doc(hidden)] inner(&self, _private: Private) -> &InnerRepeated231 pub fn inner(&self, _private: Private) -> &InnerRepeated { 232 &self.inner 233 } 234 } 235 236 impl<'msg, T> IntoProxied<Repeated<T>> for RepeatedView<'msg, T> 237 where 238 T: 'msg + ProxiedInRepeated, 239 { into_proxied(self, _private: Private) -> Repeated<T>240 fn into_proxied(self, _private: Private) -> Repeated<T> { 241 let mut repeated: Repeated<T> = Repeated::new(); 242 T::repeated_copy_from(self, repeated.as_mut()); 243 repeated 244 } 245 } 246 247 impl<'msg, T> IntoProxied<Repeated<T>> for RepeatedMut<'msg, T> 248 where 249 T: 'msg + ProxiedInRepeated, 250 { into_proxied(self, _private: Private) -> Repeated<T>251 fn into_proxied(self, _private: Private) -> Repeated<T> { 252 IntoProxied::into_proxied(self.as_view(), _private) 253 } 254 } 255 256 impl<'msg, T, I, U> IntoProxied<Repeated<T>> for I 257 where 258 I: Iterator<Item = U>, 259 T: 'msg + ProxiedInRepeated, 260 U: IntoProxied<T>, 261 { into_proxied(self, _private: Private) -> Repeated<T>262 fn into_proxied(self, _private: Private) -> Repeated<T> { 263 let mut repeated: Repeated<T> = Repeated::new(); 264 repeated.as_mut().extend(self); 265 repeated 266 } 267 } 268 269 /// Types that can appear in a `Repeated<T>`. 270 /// 271 /// This trait is implemented by generated code to communicate how the proxied 272 /// type can be manipulated for a repeated field. 273 /// 274 /// Scalars and messages implement `ProxiedInRepeated`. 275 /// 276 /// # Safety 277 /// - It must be sound to call `*_unchecked*(x)` with an `index` less than 278 /// `repeated_len(x)`. 279 pub unsafe trait ProxiedInRepeated: Proxied { 280 /// Constructs a new owned `Repeated` field. 281 #[doc(hidden)] repeated_new(_private: Private) -> Repeated<Self>282 fn repeated_new(_private: Private) -> Repeated<Self>; 283 284 /// Frees the repeated field in-place, for use in `Drop`. 285 /// 286 /// # Safety 287 /// - After `repeated_free`, no other methods on the input are safe to call. 288 #[doc(hidden)] repeated_free(_private: Private, _repeated: &mut Repeated<Self>)289 unsafe fn repeated_free(_private: Private, _repeated: &mut Repeated<Self>); 290 291 /// Gets the length of the repeated field. repeated_len(repeated: View<Repeated<Self>>) -> usize292 fn repeated_len(repeated: View<Repeated<Self>>) -> usize; 293 294 /// Appends a new element to the end of the repeated field. repeated_push(repeated: Mut<Repeated<Self>>, val: impl IntoProxied<Self>)295 fn repeated_push(repeated: Mut<Repeated<Self>>, val: impl IntoProxied<Self>); 296 297 /// Clears the repeated field of elements. repeated_clear(repeated: Mut<Repeated<Self>>)298 fn repeated_clear(repeated: Mut<Repeated<Self>>); 299 300 /// # Safety 301 /// `index` must be less than `Self::repeated_len(repeated)` repeated_get_unchecked(repeated: View<Repeated<Self>>, index: usize) -> View<Self>302 unsafe fn repeated_get_unchecked(repeated: View<Repeated<Self>>, index: usize) -> View<Self>; 303 304 /// # Safety 305 /// `index` must be less than `Self::repeated_len(repeated)` repeated_set_unchecked( repeated: Mut<Repeated<Self>>, index: usize, val: impl IntoProxied<Self>, )306 unsafe fn repeated_set_unchecked( 307 repeated: Mut<Repeated<Self>>, 308 index: usize, 309 val: impl IntoProxied<Self>, 310 ); 311 312 /// Copies the values in the `src` repeated field into `dest`. repeated_copy_from(src: View<Repeated<Self>>, dest: Mut<Repeated<Self>>)313 fn repeated_copy_from(src: View<Repeated<Self>>, dest: Mut<Repeated<Self>>); 314 315 /// Ensures that the repeated field has enough space allocated to insert at 316 /// least `additional` values without an allocation. repeated_reserve(repeated: Mut<Repeated<Self>>, additional: usize)317 fn repeated_reserve(repeated: Mut<Repeated<Self>>, additional: usize); 318 } 319 320 /// An iterator over the values inside of a [`View<Repeated<T>>`](RepeatedView). 321 pub struct RepeatedIter<'msg, T> { 322 view: RepeatedView<'msg, T>, 323 current_index: usize, 324 } 325 326 impl<'msg, T> Debug for RepeatedIter<'msg, T> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result327 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 328 f.debug_struct("RepeatedIter") 329 .field("view", &self.view) 330 .field("current_index", &self.current_index) 331 .finish() 332 } 333 } 334 335 /// A `repeated` field of `T`, used as the owned target for `Proxied`. 336 /// 337 /// Users will generally write [`View<Repeated<T>>`](RepeatedView) or 338 /// [`Mut<Repeated<T>>`](RepeatedMut) to access the repeated elements 339 pub struct Repeated<T: ProxiedInRepeated> { 340 pub(crate) inner: InnerRepeated, 341 _phantom: PhantomData<T>, 342 } 343 344 // SAFETY: `Repeated` is Sync because it does not implement interior mutability. 345 unsafe impl<T: ProxiedInRepeated> Sync for Repeated<T> {} 346 347 // SAFETY: `Repeated` is Send because it's not bound to a specific thread e.g. 348 // it does not use thread-local data or similar. 349 unsafe impl<T: ProxiedInRepeated> Send for Repeated<T> {} 350 351 impl<T: ProxiedInRepeated> Repeated<T> { new() -> Self352 pub fn new() -> Self { 353 T::repeated_new(Private) 354 } 355 #[doc(hidden)] from_inner(_private: Private, inner: InnerRepeated) -> Self356 pub fn from_inner(_private: Private, inner: InnerRepeated) -> Self { 357 Self { inner, _phantom: PhantomData } 358 } 359 as_mut(&mut self) -> RepeatedMut<'_, T>360 pub(crate) fn as_mut(&mut self) -> RepeatedMut<'_, T> { 361 RepeatedMut { inner: self.inner.as_mut(), _phantom: PhantomData } 362 } 363 } 364 365 impl<T: ProxiedInRepeated> Default for Repeated<T> { default() -> Self366 fn default() -> Self { 367 Repeated::new() 368 } 369 } 370 371 impl<T: ProxiedInRepeated> Drop for Repeated<T> { drop(&mut self)372 fn drop(&mut self) { 373 // SAFETY: only called once 374 unsafe { T::repeated_free(Private, self) } 375 } 376 } 377 378 impl<T> Proxied for Repeated<T> 379 where 380 T: ProxiedInRepeated, 381 { 382 type View<'msg> = RepeatedView<'msg, T> where Repeated<T>: 'msg; 383 } 384 385 impl<T> SealedInternal for Repeated<T> where T: ProxiedInRepeated {} 386 387 impl<T> AsView for Repeated<T> 388 where 389 T: ProxiedInRepeated, 390 { 391 type Proxied = Self; 392 as_view(&self) -> RepeatedView<'_, T>393 fn as_view(&self) -> RepeatedView<'_, T> { 394 self.as_view() 395 } 396 } 397 398 impl<T> MutProxied for Repeated<T> 399 where 400 T: ProxiedInRepeated, 401 { 402 type Mut<'msg> = RepeatedMut<'msg, T> where Repeated<T>: 'msg; 403 } 404 405 impl<T> AsMut for Repeated<T> 406 where 407 T: ProxiedInRepeated, 408 { 409 type MutProxied = Self; 410 as_mut(&mut self) -> RepeatedMut<'_, T>411 fn as_mut(&mut self) -> RepeatedMut<'_, T> { 412 self.as_mut() 413 } 414 } 415 416 impl<'msg, T> SealedInternal for RepeatedView<'msg, T> where T: ProxiedInRepeated + 'msg {} 417 418 impl<'msg, T> Proxy<'msg> for RepeatedView<'msg, T> where T: ProxiedInRepeated + 'msg {} 419 420 impl<'msg, T> AsView for RepeatedView<'msg, T> 421 where 422 T: ProxiedInRepeated + 'msg, 423 { 424 type Proxied = Repeated<T>; 425 426 #[inline] as_view(&self) -> View<'msg, Self::Proxied>427 fn as_view(&self) -> View<'msg, Self::Proxied> { 428 *self 429 } 430 } 431 432 impl<'msg, T> IntoView<'msg> for RepeatedView<'msg, T> 433 where 434 T: ProxiedInRepeated + 'msg, 435 { 436 #[inline] into_view<'shorter>(self) -> View<'shorter, Self::Proxied> where 'msg: 'shorter,437 fn into_view<'shorter>(self) -> View<'shorter, Self::Proxied> 438 where 439 'msg: 'shorter, 440 { 441 RepeatedView { raw: self.raw, _phantom: PhantomData } 442 } 443 } 444 445 impl<'msg, T> ViewProxy<'msg> for RepeatedView<'msg, T> where T: ProxiedInRepeated + 'msg {} 446 447 impl<'msg, T> SealedInternal for RepeatedMut<'msg, T> where T: ProxiedInRepeated + 'msg {} 448 449 impl<'msg, T> Proxy<'msg> for RepeatedMut<'msg, T> where T: ProxiedInRepeated + 'msg {} 450 451 impl<'msg, T> AsView for RepeatedMut<'msg, T> 452 where 453 T: ProxiedInRepeated + 'msg, 454 { 455 type Proxied = Repeated<T>; 456 457 #[inline] as_view(&self) -> RepeatedView<'_, T>458 fn as_view(&self) -> RepeatedView<'_, T> { 459 RepeatedView { raw: self.inner.raw, _phantom: PhantomData } 460 } 461 } 462 463 impl<'msg, T> IntoView<'msg> for RepeatedMut<'msg, T> 464 where 465 T: ProxiedInRepeated + 'msg, 466 { 467 #[inline] into_view<'shorter>(self) -> RepeatedView<'shorter, T> where 'msg: 'shorter,468 fn into_view<'shorter>(self) -> RepeatedView<'shorter, T> 469 where 470 'msg: 'shorter, 471 { 472 RepeatedView { raw: self.inner.raw, _phantom: PhantomData } 473 } 474 } 475 476 impl<'msg, T> AsMut for RepeatedMut<'msg, T> 477 where 478 T: ProxiedInRepeated + 'msg, 479 { 480 type MutProxied = Repeated<T>; 481 482 #[inline] as_mut(&mut self) -> RepeatedMut<'_, T>483 fn as_mut(&mut self) -> RepeatedMut<'_, T> { 484 RepeatedMut { inner: self.inner, _phantom: PhantomData } 485 } 486 } 487 488 impl<'msg, T> IntoMut<'msg> for RepeatedMut<'msg, T> 489 where 490 T: ProxiedInRepeated + 'msg, 491 { 492 #[inline] into_mut<'shorter>(self) -> RepeatedMut<'shorter, T> where 'msg: 'shorter,493 fn into_mut<'shorter>(self) -> RepeatedMut<'shorter, T> 494 where 495 'msg: 'shorter, 496 { 497 RepeatedMut { inner: self.inner, _phantom: PhantomData } 498 } 499 } 500 501 impl<'msg, T> MutProxy<'msg> for RepeatedMut<'msg, T> where T: ProxiedInRepeated + 'msg {} 502 503 impl<'msg, T> iter::Iterator for RepeatedIter<'msg, T> 504 where 505 T: ProxiedInRepeated + 'msg, 506 { 507 type Item = View<'msg, T>; 508 509 #[inline] next(&mut self) -> Option<Self::Item>510 fn next(&mut self) -> Option<Self::Item> { 511 let val = self.view.get(self.current_index); 512 if val.is_some() { 513 self.current_index += 1; 514 } 515 val 516 } 517 size_hint(&self) -> (usize, Option<usize>)518 fn size_hint(&self) -> (usize, Option<usize>) { 519 let len = self.len(); 520 (len, Some(len)) 521 } 522 } 523 524 impl<'msg, T: ProxiedInRepeated> ExactSizeIterator for RepeatedIter<'msg, T> { len(&self) -> usize525 fn len(&self) -> usize { 526 self.view.len() - self.current_index 527 } 528 } 529 530 // TODO: impl DoubleEndedIterator 531 impl<'msg, T: ProxiedInRepeated> FusedIterator for RepeatedIter<'msg, T> {} 532 533 impl<'msg, T> iter::IntoIterator for RepeatedView<'msg, T> 534 where 535 T: ProxiedInRepeated + 'msg, 536 { 537 type Item = View<'msg, T>; 538 type IntoIter = RepeatedIter<'msg, T>; 539 into_iter(self) -> Self::IntoIter540 fn into_iter(self) -> Self::IntoIter { 541 RepeatedIter { view: self, current_index: 0 } 542 } 543 } 544 545 impl<'msg, T> iter::IntoIterator for &'_ RepeatedView<'msg, T> 546 where 547 T: ProxiedInRepeated + 'msg, 548 { 549 type Item = View<'msg, T>; 550 type IntoIter = RepeatedIter<'msg, T>; 551 into_iter(self) -> Self::IntoIter552 fn into_iter(self) -> Self::IntoIter { 553 RepeatedIter { view: *self, current_index: 0 } 554 } 555 } 556 557 impl<'borrow, T> iter::IntoIterator for &'borrow RepeatedMut<'_, T> 558 where 559 T: ProxiedInRepeated + 'borrow, 560 { 561 type Item = View<'borrow, T>; 562 type IntoIter = RepeatedIter<'borrow, T>; 563 into_iter(self) -> Self::IntoIter564 fn into_iter(self) -> Self::IntoIter { 565 RepeatedIter { view: self.as_view(), current_index: 0 } 566 } 567 } 568 569 impl<'msg, 'view, T, ViewT> Extend<ViewT> for RepeatedMut<'msg, T> 570 where 571 T: ProxiedInRepeated + 'view, 572 ViewT: IntoProxied<T>, 573 { extend<I: IntoIterator<Item = ViewT>>(&mut self, iter: I)574 fn extend<I: IntoIterator<Item = ViewT>>(&mut self, iter: I) { 575 let iter = iter.into_iter(); 576 T::repeated_reserve(self.as_mut(), iter.size_hint().0); 577 for item in iter { 578 self.push(item); 579 } 580 } 581 } 582 583 #[cfg(test)] 584 mod tests { 585 use super::*; 586 use googletest::prelude::*; 587 588 #[gtest] test_primitive_repeated()589 fn test_primitive_repeated() { 590 macro_rules! primitive_repeated_tests { 591 ($($t:ty => [$($vals:expr),* $(,)?]),* $(,)?) => { 592 $({ 593 // Constructs a new, owned, `Repeated`, only used for tests. 594 let mut r = Repeated::<$t>::new(); 595 let mut r = r.as_mut(); 596 assert_that!(r.len(), eq(0)); 597 assert!(r.iter().next().is_none(), "starts with empty iter"); 598 assert!(r.iter().next().is_none(), "starts with empty mut iter"); 599 assert!(r.is_empty(), "starts is_empty"); 600 601 let mut expected_len = 0usize; 602 $( 603 let val: View<$t> = $vals; 604 r.push(val); 605 assert_that!(r.get(expected_len), eq(Some(val))); 606 expected_len += 1; 607 assert_that!(r.len(), eq(expected_len)); 608 609 )* 610 assert_that!(r, elements_are![$(eq($vals)),*]); 611 r.set(0, <$t as Default>::default()); 612 assert_that!(r.get(0).expect("elem 0"), eq(<$t as Default>::default())); 613 614 r.clear(); 615 assert!(r.is_empty(), "is_empty after clear"); 616 assert!(r.iter().next().is_none(), "iter empty after clear"); 617 assert!(r.into_iter().next().is_none(), "mut iter empty after clear"); 618 })* 619 } 620 } 621 primitive_repeated_tests!( 622 u32 => [1,2,3], 623 i32 => [1,2], 624 f64 => [10.0, 0.1234f64], 625 bool => [false, true, true, false], 626 ); 627 } 628 629 #[gtest] test_repeated_extend()630 fn test_repeated_extend() { 631 let mut r = Repeated::<i32>::new(); 632 633 r.as_mut().extend([0; 0]); 634 assert_that!(r.as_mut().len(), eq(0)); 635 636 r.as_mut().extend([0, 1]); 637 assert_that!(r.as_mut(), elements_are![eq(0), eq(1)]); 638 let mut x = Repeated::<i32>::new(); 639 x.as_mut().extend([2, 3]); 640 641 r.as_mut().extend(&x.as_mut()); 642 643 assert_that!(r.as_mut(), elements_are![eq(0), eq(1), eq(2), eq(3)]); 644 } 645 646 #[gtest] test_repeated_iter_into_proxied()647 fn test_repeated_iter_into_proxied() { 648 let r: Repeated<i32> = [0, 1, 2, 3].into_iter().into_proxied(Private); 649 assert_that!(r.as_view(), elements_are![eq(0), eq(1), eq(2), eq(3)]); 650 } 651 } 652