@@ -238,6 +238,17 @@ where
238238 }
239239}
240240
241+ impl < T , const N : usize > Clone for HistoryBuffer < T , N >
242+ where
243+ T : Clone ,
244+ {
245+ fn clone ( & self ) -> Self {
246+ let mut ret = Self :: new ( ) ;
247+ ret. extend ( self . iter ( ) . cloned ( ) ) ;
248+ ret
249+ }
250+ }
251+
241252impl < T , const N : usize > Drop for HistoryBuffer < T , N > {
242253 fn drop ( & mut self ) {
243254 unsafe {
@@ -279,6 +290,15 @@ impl<T, const N: usize> Default for HistoryBuffer<T, N> {
279290 }
280291}
281292
293+ impl < T , const N : usize > PartialEq for HistoryBuffer < T , N >
294+ where
295+ T : PartialEq ,
296+ {
297+ fn eq ( & self , other : & Self ) -> bool {
298+ self . oldest_ordered ( ) . eq ( other. oldest_ordered ( ) )
299+ }
300+ }
301+
282302/// An iterator on the underlying buffer ordered from oldest data to newest
283303#[ derive( Clone ) ]
284304pub struct OldestOrdered < ' a , T , const N : usize > {
@@ -311,6 +331,7 @@ impl<'a, T, const N: usize> Iterator for OldestOrdered<'a, T, N> {
311331mod tests {
312332 use crate :: HistoryBuffer ;
313333 use core:: fmt:: Debug ;
334+ use core:: sync:: atomic:: { AtomicUsize , Ordering } ;
314335
315336 #[ test]
316337 fn new ( ) {
@@ -350,6 +371,47 @@ mod tests {
350371 assert_eq ! ( x. as_slice( ) , [ 1 ; 4 ] ) ;
351372 }
352373
374+ #[ test]
375+ fn clone ( ) {
376+ let mut x: HistoryBuffer < u8 , 3 > = HistoryBuffer :: new ( ) ;
377+ for i in 0 ..10 {
378+ assert_eq ! ( x. as_slice( ) , x. clone( ) . as_slice( ) ) ;
379+ x. write ( i) ;
380+ }
381+
382+ // Records number of clones locally and globally.
383+ static GLOBAL : AtomicUsize = AtomicUsize :: new ( 0 ) ;
384+ #[ derive( Default , PartialEq , Debug ) ]
385+ struct InstrumentedClone ( usize ) ;
386+
387+ impl Clone for InstrumentedClone {
388+ fn clone ( & self ) -> Self {
389+ GLOBAL . fetch_add ( 1 , Ordering :: Relaxed ) ;
390+ Self ( self . 0 + 1 )
391+ }
392+ }
393+
394+ let mut y: HistoryBuffer < InstrumentedClone , 2 > = HistoryBuffer :: new ( ) ;
395+ let _ = y. clone ( ) ;
396+ assert_eq ! ( GLOBAL . load( Ordering :: Relaxed ) , 0 ) ;
397+ y. write ( InstrumentedClone ( 0 ) ) ;
398+ assert_eq ! ( GLOBAL . load( Ordering :: Relaxed ) , 0 ) ;
399+ assert_eq ! ( y. clone( ) . as_slice( ) , [ InstrumentedClone ( 1 ) ] ) ;
400+ assert_eq ! ( GLOBAL . load( Ordering :: Relaxed ) , 1 ) ;
401+ y. write ( InstrumentedClone ( 0 ) ) ;
402+ assert_eq ! ( GLOBAL . load( Ordering :: Relaxed ) , 1 ) ;
403+ assert_eq ! (
404+ y. clone( ) . as_slice( ) ,
405+ [ InstrumentedClone ( 1 ) , InstrumentedClone ( 1 ) ]
406+ ) ;
407+ assert_eq ! ( GLOBAL . load( Ordering :: Relaxed ) , 3 ) ;
408+ assert_eq ! (
409+ y. clone( ) . clone( ) . clone( ) . as_slice( ) ,
410+ [ InstrumentedClone ( 3 ) , InstrumentedClone ( 3 ) ]
411+ ) ;
412+ assert_eq ! ( GLOBAL . load( Ordering :: Relaxed ) , 9 ) ;
413+ }
414+
353415 #[ test]
354416 fn recent ( ) {
355417 let mut x: HistoryBuffer < u8 , 4 > = HistoryBuffer :: new ( ) ;
@@ -430,4 +492,30 @@ mod tests {
430492 }
431493 }
432494 }
495+
496+ #[ test]
497+ fn partial_eq ( ) {
498+ let mut x: HistoryBuffer < u8 , 3 > = HistoryBuffer :: new ( ) ;
499+ let mut y: HistoryBuffer < u8 , 3 > = HistoryBuffer :: new ( ) ;
500+ assert_eq ! ( x, y) ;
501+ x. write ( 1 ) ;
502+ assert_ne ! ( x, y) ;
503+ y. write ( 1 ) ;
504+ assert_eq ! ( x, y) ;
505+ for _ in 0 ..4 {
506+ x. write ( 2 ) ;
507+ assert_ne ! ( x, y) ;
508+ for i in 0 ..5 {
509+ x. write ( i) ;
510+ y. write ( i) ;
511+ }
512+ assert_eq ! (
513+ x,
514+ y,
515+ "{:?} {:?}" ,
516+ x. iter( ) . collect:: <Vec <_>>( ) ,
517+ y. iter( ) . collect:: <Vec <_>>( )
518+ ) ;
519+ }
520+ }
433521}
0 commit comments