• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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