@@ -80,29 +80,29 @@ pub type HistoryBuffer<T, const N: usize> = HistoryBufferInner<[MaybeUninit<T>;
80
80
///
81
81
/// # Examples
82
82
/// ```
83
- /// use heapless::HistoryBuffer;
83
+ /// use heapless::{ HistoryBuffer, HistoryBufferView} ;
84
84
///
85
85
/// // Initialize a new buffer with 8 elements.
86
86
/// let mut buf = HistoryBuffer::<_, 8>::new();
87
87
/// let buf_view: &mut HistoryBufferView<_> = &mut buf;
88
88
///
89
89
/// // Starts with no data
90
- /// assert_eq!(buf .recent(), None);
90
+ /// assert_eq!(buf_view .recent(), None);
91
91
///
92
- /// buf .write(3);
93
- /// buf .write(5);
94
- /// buf .extend(&[4, 4]);
92
+ /// buf_view .write(3);
93
+ /// buf_view .write(5);
94
+ /// buf_view .extend(&[4, 4]);
95
95
///
96
96
/// // The most recent written element is a four.
97
- /// assert_eq!(buf .recent(), Some(&4));
97
+ /// assert_eq!(buf_view .recent(), Some(&4));
98
98
///
99
99
/// // To access all elements in an unspecified order, use `as_slice()`.
100
- /// for el in buf .as_slice() {
100
+ /// for el in buf_view .as_slice() {
101
101
/// println!("{:?}", el);
102
102
/// }
103
103
///
104
104
/// // Now we can prepare an average of all values, which comes out to 4.
105
- /// let avg = buf .as_slice().iter().sum::<usize>() / buf .len();
105
+ /// let avg = buf_view .as_slice().iter().sum::<usize>() / buf_view .len();
106
106
/// assert_eq!(avg, 4);
107
107
/// ```
108
108
pub type HistoryBufferView < T > = HistoryBufferInner < [ MaybeUninit < T > ] > ;
@@ -299,12 +299,13 @@ impl<T> HistoryBufferView<T> {
299
299
/// # Examples
300
300
///
301
301
/// ```
302
- /// use heapless::HistoryBuffer;
302
+ /// use heapless::{ HistoryBuffer, HistoryBufferView} ;
303
303
///
304
304
/// let mut x: HistoryBuffer<u8, 16> = HistoryBuffer::new();
305
- /// x.write(4);
306
- /// x.write(10);
307
- /// assert_eq!(x.recent(), Some(&10));
305
+ /// let mut x_view = &mut x;
306
+ /// x_view.write(4);
307
+ /// x_view.write(10);
308
+ /// assert_eq!(x_view.recent(), Some(&10));
308
309
/// ```
309
310
pub fn recent ( & self ) -> Option < & T > {
310
311
self . recent_index ( )
@@ -316,12 +317,13 @@ impl<T> HistoryBufferView<T> {
316
317
/// # Examples
317
318
///
318
319
/// ```
319
- /// use heapless::HistoryBuffer;
320
+ /// use heapless::{ HistoryBuffer, HistoryBufferView} ;
320
321
///
321
322
/// let mut x: HistoryBuffer<u8, 16> = HistoryBuffer::new();
322
- /// x.write(4);
323
- /// x.write(10);
324
- /// assert_eq!(x.recent_index(), Some(1));
323
+ /// let mut x_view = &mut x;
324
+ /// x_view.write(4);
325
+ /// x_view.write(10);
326
+ /// assert_eq!(x_view.recent_index(), Some(1));
325
327
/// ```
326
328
pub fn recent_index ( & self ) -> Option < usize > {
327
329
if self . write_at == 0 {
@@ -340,12 +342,13 @@ impl<T> HistoryBufferView<T> {
340
342
/// # Examples
341
343
///
342
344
/// ```
343
- /// use heapless::HistoryBuffer;
345
+ /// use heapless::{ HistoryBuffer, HistoryBufferView} ;
344
346
///
345
347
/// let mut x: HistoryBuffer<u8, 16> = HistoryBuffer::new();
346
- /// x.write(4);
347
- /// x.write(10);
348
- /// assert_eq!(x.oldest(), Some(&4));
348
+ /// let mut x_view = &mut x;
349
+ /// x_view.write(4);
350
+ /// x_view.write(10);
351
+ /// assert_eq!(x_view.oldest(), Some(&4));
349
352
/// ```
350
353
pub fn oldest ( & self ) -> Option < & T > {
351
354
self . oldest_index ( )
@@ -357,12 +360,13 @@ impl<T> HistoryBufferView<T> {
357
360
/// # Examples
358
361
///
359
362
/// ```
360
- /// use heapless::HistoryBuffer;
363
+ /// use heapless::{ HistoryBuffer, HistoryBufferView} ;
361
364
///
362
365
/// let mut x: HistoryBuffer<u8, 16> = HistoryBuffer::new();
363
- /// x.write(4);
364
- /// x.write(10);
365
- /// assert_eq!(x.oldest_index(), Some(0));
366
+ /// let mut x_view = &mut x;
367
+ /// x_view.write(4);
368
+ /// x_view.write(10);
369
+ /// assert_eq!(x_view.oldest_index(), Some(0));
366
370
/// ```
367
371
pub fn oldest_index ( & self ) -> Option < usize > {
368
372
if self . filled {
@@ -385,12 +389,12 @@ impl<T> HistoryBufferView<T> {
385
389
/// # Examples
386
390
///
387
391
/// ```
388
- /// use heapless::HistoryBuffer;
389
- ///
392
+ /// use heapless::{HistoryBuffer, HistoryBufferView};
390
393
/// let mut buffer: HistoryBuffer<u8, 6> = HistoryBuffer::new();
391
- /// buffer.extend([0, 0, 0]);
392
- /// buffer.extend([1, 2, 3, 4, 5, 6]);
393
- /// assert_eq!(buffer.as_slices(), (&[1, 2, 3][..], &[4, 5, 6][..]));
394
+ /// let mut buffer_view: &mut HistoryBufferView<u8> = &mut buffer;
395
+ /// buffer_view.extend([0, 0, 0]);
396
+ /// buffer_view.extend([1, 2, 3, 4, 5, 6]);
397
+ /// assert_eq!(buffer_view.as_slices(), (&[1, 2, 3][..], &[4, 5, 6][..]));
394
398
/// ```
395
399
pub fn as_slices ( & self ) -> ( & [ T ] , & [ T ] ) {
396
400
let buffer = self . as_slice ( ) ;
@@ -407,12 +411,13 @@ impl<T> HistoryBufferView<T> {
407
411
/// # Examples
408
412
///
409
413
/// ```
410
- /// use heapless::HistoryBuffer;
414
+ /// use heapless::{ HistoryBuffer, HistoryBufferView} ;
411
415
///
412
416
/// let mut buffer: HistoryBuffer<u8, 6> = HistoryBuffer::new();
413
- /// buffer.extend([0, 0, 0, 1, 2, 3, 4, 5, 6]);
417
+ /// let mut buffer_view: &mut HistoryBufferView<u8> = &mut buffer;
418
+ /// buffer_view.extend([0, 0, 0, 1, 2, 3, 4, 5, 6]);
414
419
/// let expected = [1, 2, 3, 4, 5, 6];
415
- /// for (x, y) in buffer .oldest_ordered().zip(expected.iter()) {
420
+ /// for (x, y) in buffer_view .oldest_ordered().zip(expected.iter()) {
416
421
/// assert_eq!(x, y)
417
422
/// }
418
423
/// ```
@@ -426,11 +431,7 @@ impl<T, const N: usize> HistoryBuffer<T, N> {
426
431
/// Returns the current fill level of the buffer.
427
432
#[ inline]
428
433
pub fn len ( & self ) -> usize {
429
- if self . filled {
430
- N
431
- } else {
432
- self . write_at
433
- }
434
+ self . as_view ( ) . len ( )
434
435
}
435
436
436
437
/// Returns true if the buffer is empty.
@@ -445,7 +446,7 @@ impl<T, const N: usize> HistoryBuffer<T, N> {
445
446
/// ```
446
447
#[ inline]
447
448
pub fn is_empty ( & self ) -> bool {
448
- self . len ( ) == 0
449
+ self . as_view ( ) . is_empty ( )
449
450
}
450
451
451
452
/// Returns the capacity of the buffer, which is the length of the
@@ -463,17 +464,7 @@ impl<T, const N: usize> HistoryBuffer<T, N> {
463
464
464
465
/// Writes an element to the buffer, overwriting the oldest value.
465
466
pub fn write ( & mut self , t : T ) {
466
- if self . filled {
467
- // Drop the old before we overwrite it.
468
- unsafe { ptr:: drop_in_place ( self . data [ self . write_at ] . as_mut_ptr ( ) ) }
469
- }
470
- self . data [ self . write_at ] = MaybeUninit :: new ( t) ;
471
-
472
- self . write_at += 1 ;
473
- if self . write_at == self . capacity ( ) {
474
- self . write_at = 0 ;
475
- self . filled = true ;
476
- }
467
+ self . as_mut_view ( ) . write ( t)
477
468
}
478
469
479
470
/// Clones and writes all elements in a slice to the buffer.
@@ -484,9 +475,7 @@ impl<T, const N: usize> HistoryBuffer<T, N> {
484
475
where
485
476
T : Clone ,
486
477
{
487
- for item in other {
488
- self . write ( item. clone ( ) ) ;
489
- }
478
+ self . as_mut_view ( ) . extend_from_slice ( other)
490
479
}
491
480
492
481
/// Returns a reference to the most recently written value.
@@ -502,8 +491,7 @@ impl<T, const N: usize> HistoryBuffer<T, N> {
502
491
/// assert_eq!(x.recent(), Some(&10));
503
492
/// ```
504
493
pub fn recent ( & self ) -> Option < & T > {
505
- self . recent_index ( )
506
- . map ( |i| unsafe { & * self . data [ i] . as_ptr ( ) } )
494
+ self . as_view ( ) . recent ( )
507
495
}
508
496
509
497
/// Returns index of the most recently written value in the underlying slice.
@@ -519,15 +507,7 @@ impl<T, const N: usize> HistoryBuffer<T, N> {
519
507
/// assert_eq!(x.recent_index(), Some(1));
520
508
/// ```
521
509
pub fn recent_index ( & self ) -> Option < usize > {
522
- if self . write_at == 0 {
523
- if self . filled {
524
- Some ( self . capacity ( ) - 1 )
525
- } else {
526
- None
527
- }
528
- } else {
529
- Some ( self . write_at - 1 )
530
- }
510
+ self . as_view ( ) . recent_index ( )
531
511
}
532
512
533
513
/// Returns a reference to the oldest value in the buffer.
@@ -543,8 +523,7 @@ impl<T, const N: usize> HistoryBuffer<T, N> {
543
523
/// assert_eq!(x.oldest(), Some(&4));
544
524
/// ```
545
525
pub fn oldest ( & self ) -> Option < & T > {
546
- self . oldest_index ( )
547
- . map ( |i| unsafe { & * self . data [ i] . as_ptr ( ) } )
526
+ self . as_view ( ) . oldest ( )
548
527
}
549
528
550
529
/// Returns index of the oldest value in the underlying slice.
@@ -560,19 +539,13 @@ impl<T, const N: usize> HistoryBuffer<T, N> {
560
539
/// assert_eq!(x.oldest_index(), Some(0));
561
540
/// ```
562
541
pub fn oldest_index ( & self ) -> Option < usize > {
563
- if self . filled {
564
- Some ( self . write_at )
565
- } else if self . write_at == 0 {
566
- None
567
- } else {
568
- Some ( 0 )
569
- }
542
+ self . as_view ( ) . oldest_index ( )
570
543
}
571
544
572
545
/// Returns the array slice backing the buffer, without keeping track
573
546
/// of the write position. Therefore, the element order is unspecified.
574
547
pub fn as_slice ( & self ) -> & [ T ] {
575
- unsafe { slice :: from_raw_parts ( self . data . as_ptr ( ) as * const _ , self . len ( ) ) }
548
+ self . as_view ( ) . as_slice ( )
576
549
}
577
550
578
551
/// Returns a pair of slices which contain, in order, the contents of the buffer.
@@ -588,13 +561,7 @@ impl<T, const N: usize> HistoryBuffer<T, N> {
588
561
/// assert_eq!(buffer.as_slices(), (&[1, 2, 3][..], &[4, 5, 6][..]));
589
562
/// ```
590
563
pub fn as_slices ( & self ) -> ( & [ T ] , & [ T ] ) {
591
- let buffer = self . as_slice ( ) ;
592
-
593
- if !self . filled {
594
- ( buffer, & [ ] )
595
- } else {
596
- ( & buffer[ self . write_at ..] , & buffer[ ..self . write_at ] )
597
- }
564
+ self . as_view ( ) . as_slices ( )
598
565
}
599
566
600
567
/// Returns an iterator for iterating over the buffer from oldest to newest.
0 commit comments