@@ -15,12 +15,43 @@ use crate::backend::Backend;
1515///
1616/// [`CircularBuffer`]: crate::CircularBuffer
1717/// [`HeapCircularBuffer`]: crate::heap::HeapCircularBuffer
18- pub struct IntoIter < T , B >
18+ pub ( crate ) struct IntoIter < T , B >
1919 where B : AsSlice < Item = MaybeUninit < T > >
2020{
2121 inner : Backend < T , B > ,
2222}
2323
24+ impl < const N : usize , T > Clone for IntoIter < T , [ MaybeUninit < T > ; N ] >
25+ where T : Clone ,
26+ {
27+ fn clone ( & self ) -> Self {
28+ use crate :: CircularBuffer ;
29+ let buf = CircularBuffer :: from_iter ( self . inner . iter ( ) . cloned ( ) ) ;
30+ Self { inner : buf. into_backend ( ) }
31+ }
32+
33+ fn clone_from ( & mut self , other : & Self ) {
34+ self . inner . clear ( ) ;
35+ self . inner . extend ( other. inner . iter ( ) . cloned ( ) ) ;
36+ }
37+ }
38+
39+ impl < T > Clone for IntoIter < T , Box < [ MaybeUninit < T > ] > >
40+ where T : Clone ,
41+ {
42+ fn clone ( & self ) -> Self {
43+ use crate :: heap:: HeapCircularBuffer ;
44+ let mut buf = HeapCircularBuffer :: with_capacity ( self . inner . capacity ( ) ) ;
45+ buf. extend ( self . inner . iter ( ) . cloned ( ) ) ;
46+ Self { inner : buf. into_backend ( ) }
47+ }
48+
49+ fn clone_from ( & mut self , other : & Self ) {
50+ self . inner . clear ( ) ;
51+ self . inner . extend ( other. inner . iter ( ) . cloned ( ) ) ;
52+ }
53+ }
54+
2455impl < T , B > IntoIter < T , B >
2556 where B : AsSlice < Item = MaybeUninit < T > >
2657{
@@ -77,6 +108,32 @@ impl<T, B> fmt::Debug for IntoIter<T, B>
77108 }
78109}
79110
111+ /// An owning [iterator](std::iter::Iterator) over the elements of a
112+ /// [`CircularBuffer`]
113+ ///
114+ /// This yields the elements of a `CircularBuffer` from fron to back.
115+ ///
116+ /// This struct is created when iterating over a `CircularBuffer`. See the
117+ /// documentation for [`IntoIterator`] for more details.
118+ ///
119+ /// [`CircularBuffer`]: crate::CircularBuffer
120+ #[ derive( Clone ) ]
121+ pub struct StaticIntoIter < const N : usize , T > ( pub ( crate ) IntoIter < T , [ MaybeUninit < T > ; N ] > ) ;
122+ super :: impl_iter_traits!( <{ const N : usize , T } > - StaticIntoIter <N , T >) ;
123+
124+ /// An owning [iterator](std::iter::Iterator) over the elements of a
125+ /// [`HeapCircularBuffer`].
126+ ///
127+ /// This yields the elements of a `CircularBuffer` from fron to back.
128+ ///
129+ /// This struct is created when iterating over a `CircularBuffer`. See the
130+ /// documentation for [`IntoIterator`] for more details.
131+ ///
132+ /// [`HeapCircularBuffer`]: crate::heap::HeapCircularBuffer
133+ #[ derive( Clone ) ]
134+ pub struct HeapIntoIter < T > ( pub ( crate ) IntoIter < T , Box < [ MaybeUninit < T > ] > > ) ;
135+ super :: impl_iter_traits!( <{ T } > - HeapIntoIter <T >) ;
136+
80137pub ( crate ) fn translate_range_bounds < T , B , R > ( buf : & Backend < T , B > , range : R ) -> ( usize , usize )
81138 where
82139 R : RangeBounds < usize > ,
0 commit comments