Skip to content

Commit 340e0ce

Browse files
committed
HistoryBuffer::{clone, eq}.
1 parent 97ac129 commit 340e0ce

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

src/histbuf.rs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
241252
impl<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)]
284304
pub struct OldestOrdered<'a, T, const N: usize> {
@@ -311,6 +331,7 @@ impl<'a, T, const N: usize> Iterator for OldestOrdered<'a, T, N> {
311331
mod 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

Comments
 (0)