@@ -238,6 +238,17 @@ where
238
238
}
239
239
}
240
240
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
+
241
252
impl < T , const N : usize > Drop for HistoryBuffer < T , N > {
242
253
fn drop ( & mut self ) {
243
254
unsafe {
@@ -279,6 +290,15 @@ impl<T, const N: usize> Default for HistoryBuffer<T, N> {
279
290
}
280
291
}
281
292
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
+
282
302
/// An iterator on the underlying buffer ordered from oldest data to newest
283
303
#[ derive( Clone ) ]
284
304
pub struct OldestOrdered < ' a , T , const N : usize > {
@@ -311,6 +331,7 @@ impl<'a, T, const N: usize> Iterator for OldestOrdered<'a, T, N> {
311
331
mod tests {
312
332
use crate :: HistoryBuffer ;
313
333
use core:: fmt:: Debug ;
334
+ use core:: sync:: atomic:: { AtomicUsize , Ordering } ;
314
335
315
336
#[ test]
316
337
fn new ( ) {
@@ -350,6 +371,47 @@ mod tests {
350
371
assert_eq ! ( x. as_slice( ) , [ 1 ; 4 ] ) ;
351
372
}
352
373
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
+
353
415
#[ test]
354
416
fn recent ( ) {
355
417
let mut x: HistoryBuffer < u8 , 4 > = HistoryBuffer :: new ( ) ;
@@ -430,4 +492,30 @@ mod tests {
430
492
}
431
493
}
432
494
}
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
+ }
433
521
}
0 commit comments