@@ -58,7 +58,27 @@ pub struct VecInner<B: ?Sized + VecDrop> {
58
58
/// assert_eq!(*vec, [7, 1, 2, 3]);
59
59
/// ```
60
60
pub type Vec < T , const N : usize > = VecInner < [ MaybeUninit < T > ; N ] > ;
61
- /// TODO: doc
61
+ /// A Vec with dynamic capacity
62
+ ///
63
+ /// [`Vec`]() coerces to `VecView`. `VecView` is !Sized, meaning that it can only ever be used through pointer
64
+ ///
65
+ /// Unlike [`Vec`](), `VecView` does not have an `N` const-generic parameter.
66
+ /// This has the ergonomic advantages of making it possible to use functions without needing to know at
67
+ /// compile-time the size of the buffers used, for example for use in `dyn` traits.
68
+ ///
69
+ /// `VecView<T>` is to `Vec<T, N>` what `[T]` is to `[T; N]`
70
+ ///
71
+ /// ```rust
72
+ /// use heapless::{Vec, VecView};
73
+ ///
74
+ /// let mut vec: Vec<u8, 10> = Vec::from_slice(&[1, 2, 3, 4]).unwrap();
75
+ /// let view: &VecView<_> = &vec;
76
+ /// assert_eq!(view, &[1, 2, 3, 4]);
77
+ ///
78
+ /// let mut_view: &mut VecView<_> = &mut vec;
79
+ /// mut_view.push(5);
80
+ /// assert_eq!(vec, [1, 2, 3, 4, 5]);
81
+ /// ```
62
82
pub type VecView < T > = VecInner < [ MaybeUninit < T > ] > ;
63
83
64
84
impl < T > VecView < T > {
@@ -79,8 +99,8 @@ impl<T> VecView<T> {
79
99
/// # Examples
80
100
///
81
101
/// ```
82
- /// use heapless::Vec;
83
- /// let buffer: Vec <u8, 5 > = Vec::from_slice(&[1, 2, 3, 5, 8]).unwrap();
102
+ /// use heapless::{ Vec, VecView} ;
103
+ /// let buffer: &VecView <u8> = & Vec::<u8, 5> ::from_slice(&[1, 2, 3, 5, 8]).unwrap();
84
104
/// assert_eq!(buffer.as_slice(), &[1, 2, 3, 5, 8]);
85
105
/// ```
86
106
pub fn as_slice ( & self ) -> & [ T ] {
@@ -96,9 +116,10 @@ impl<T> VecView<T> {
96
116
/// # Examples
97
117
///
98
118
/// ```
99
- /// use heapless::Vec;
100
- /// let mut buffer: Vec<u8, 5> = Vec::from_slice(&[1, 2, 3, 5, 8]).unwrap();
101
- /// buffer[0] = 9;
119
+ /// use heapless::{Vec, VecView};
120
+ /// let mut buffer: &mut VecView<u8> = &mut Vec::<u8, 5>::from_slice(&[1, 2, 3, 5, 8]).unwrap();
121
+ /// let buffer_slice = buffer.as_mut_slice();
122
+ /// buffer_slice[0] = 9;
102
123
/// assert_eq!(buffer.as_slice(), &[9, 2, 3, 5, 8]);
103
124
/// ```
104
125
pub fn as_mut_slice ( & mut self ) -> & mut [ T ] {
@@ -139,9 +160,9 @@ impl<T> VecView<T> {
139
160
/// # Examples
140
161
///
141
162
/// ```
142
- /// use heapless::Vec;
163
+ /// use heapless::{ Vec, VecView} ;
143
164
///
144
- /// let mut vec = Vec::<u8, 8>::new();
165
+ /// let vec: & mut VecView<u8> = &mut Vec::<u8, 8>::new();
145
166
/// vec.push(1).unwrap();
146
167
/// vec.extend_from_slice(&[2, 3, 4]).unwrap();
147
168
/// assert_eq!(*vec, [1, 2, 3, 4]);
@@ -303,7 +324,7 @@ impl<T> VecView<T> {
303
324
///
304
325
/// ```no_run
305
326
/// # #![allow(dead_code)]
306
- /// use heapless::Vec;
327
+ /// use heapless::{ Vec, VecView} ;
307
328
///
308
329
/// # // This is just a minimal skeleton for the doc example;
309
330
/// # // don't use this as a starting point for a real library.
@@ -320,17 +341,18 @@ impl<T> VecView<T> {
320
341
/// pub fn get_dictionary(&self) -> Option<Vec<u8, 32768>> {
321
342
/// // Per the FFI method's docs, "32768 bytes is always enough".
322
343
/// let mut dict = Vec::new();
344
+ /// let mut dict_view: &mut VecView<_> = &mut dict;
323
345
/// let mut dict_length = 0;
324
346
/// // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:
325
347
/// // 1. `dict_length` elements were initialized.
326
348
/// // 2. `dict_length` <= the capacity (32_768)
327
349
/// // which makes `set_len` safe to call.
328
350
/// unsafe {
329
351
/// // Make the FFI call...
330
- /// let r = deflateGetDictionary(self.strm, dict .as_mut_ptr(), &mut dict_length);
352
+ /// let r = deflateGetDictionary(self.strm, dict_view .as_mut_ptr(), &mut dict_length);
331
353
/// if r == Z_OK {
332
354
/// // ...and update the length to what was initialized.
333
- /// dict .set_len(dict_length);
355
+ /// dict_view .set_len(dict_length);
334
356
/// Some(dict)
335
357
/// } else {
336
358
/// None
@@ -345,7 +367,7 @@ impl<T> VecView<T> {
345
367
///
346
368
/// ```
347
369
/// use core::iter::FromIterator;
348
- /// use heapless::Vec;
370
+ /// use heapless::{ Vec, VecView} ;
349
371
///
350
372
/// let mut vec = Vec::<Vec<u8, 3>, 3>::from_iter(
351
373
/// [
@@ -360,7 +382,7 @@ impl<T> VecView<T> {
360
382
/// // 1. `old_len..0` is empty so no elements need to be initialized.
361
383
/// // 2. `0 <= capacity` always holds whatever `capacity` is.
362
384
/// unsafe {
363
- /// vec.set_len(0);
385
+ /// vec.as_mut_view(). set_len(0);
364
386
/// }
365
387
/// ```
366
388
///
@@ -385,20 +407,19 @@ impl<T> VecView<T> {
385
407
/// # Examples
386
408
///
387
409
/// ```
388
- /// use heapless::Vec;
389
- ///// use heapless::consts::*;
410
+ /// use heapless::{Vec, VecView};
390
411
///
391
- /// let mut v: Vec<_, 8 > = Vec::new();
412
+ /// let v: &mut VecView<_ > = &mut Vec::<_, 8> ::new();
392
413
/// v.push("foo").unwrap();
393
414
/// v.push("bar").unwrap();
394
415
/// v.push("baz").unwrap();
395
416
/// v.push("qux").unwrap();
396
417
///
397
418
/// assert_eq!(v.swap_remove(1), "bar");
398
- /// assert_eq!(&* v, ["foo", "qux", "baz"]);
419
+ /// assert_eq!(v, & ["foo", "qux", "baz"]);
399
420
///
400
421
/// assert_eq!(v.swap_remove(0), "foo");
401
- /// assert_eq!(&* v, ["baz", "qux"]);
422
+ /// assert_eq!(v, & ["baz", "qux"]);
402
423
/// ```
403
424
pub fn swap_remove ( & mut self , index : usize ) -> T {
404
425
assert ! ( index < self . len) ;
@@ -418,19 +439,19 @@ impl<T> VecView<T> {
418
439
/// # Examples
419
440
///
420
441
/// ```
421
- /// use heapless::Vec;
442
+ /// use heapless::{ Vec, VecView} ;
422
443
///
423
- /// let mut v: Vec<_, 8 > = Vec::new();
444
+ /// let mut v: &mut VecView<_ > = &mut Vec::<_, 8> ::new();
424
445
/// v.push("foo").unwrap();
425
446
/// v.push("bar").unwrap();
426
447
/// v.push("baz").unwrap();
427
448
/// v.push("qux").unwrap();
428
449
///
429
450
/// assert_eq!(unsafe { v.swap_remove_unchecked(1) }, "bar");
430
- /// assert_eq!(&* v, ["foo", "qux", "baz"]);
451
+ /// assert_eq!(v, & ["foo", "qux", "baz"]);
431
452
///
432
453
/// assert_eq!(unsafe { v.swap_remove_unchecked(0) }, "foo");
433
- /// assert_eq!(&* v, ["baz", "qux"]);
454
+ /// assert_eq!(v, & ["baz", "qux"]);
434
455
/// ```
435
456
pub unsafe fn swap_remove_unchecked ( & mut self , index : usize ) -> T {
436
457
let length = self . len ( ) ;
@@ -461,9 +482,9 @@ impl<T> VecView<T> {
461
482
/// # Examples
462
483
///
463
484
/// ```
464
- /// use heapless::Vec;
485
+ /// use heapless::{ Vec, VecView} ;
465
486
///
466
- /// let v: Vec<_, 8 > = Vec::from_slice(b"abc").unwrap();
487
+ /// let v: &VecView<_ > = & Vec::<_, 8> ::from_slice(b"abc").unwrap();
467
488
/// assert_eq!(v.starts_with(b""), true);
468
489
/// assert_eq!(v.starts_with(b"ab"), true);
469
490
/// assert_eq!(v.starts_with(b"bc"), false);
@@ -484,9 +505,9 @@ impl<T> VecView<T> {
484
505
/// # Examples
485
506
///
486
507
/// ```
487
- /// use heapless::Vec;
508
+ /// use heapless::{ Vec, VecView} ;
488
509
///
489
- /// let v: Vec<_, 8 > = Vec::from_slice(b"abc").unwrap();
510
+ /// let v: &VecView<_ > = & Vec::<_, 8> ::from_slice(b"abc").unwrap();
490
511
/// assert_eq!(v.ends_with(b""), true);
491
512
/// assert_eq!(v.ends_with(b"ab"), false);
492
513
/// assert_eq!(v.ends_with(b"bc"), true);
@@ -512,13 +533,13 @@ impl<T> VecView<T> {
512
533
/// # Examples
513
534
///
514
535
/// ```
515
- /// use heapless::Vec;
536
+ /// use heapless::{ Vec, VecView} ;
516
537
///
517
- /// let mut vec: Vec<_, 8 > = Vec::from_slice(&[1, 2, 3]).unwrap();
538
+ /// let mut vec: &mut VecView<_ > = &mut Vec::<_, 8> ::from_slice(&[1, 2, 3]).unwrap();
518
539
/// vec.insert(1, 4);
519
- /// assert_eq!(vec, [1, 4, 2, 3]);
540
+ /// assert_eq!(vec, & [1, 4, 2, 3]);
520
541
/// vec.insert(4, 5);
521
- /// assert_eq!(vec, [1, 4, 2, 3, 5]);
542
+ /// assert_eq!(vec, & [1, 4, 2, 3, 5]);
522
543
/// ```
523
544
pub fn insert ( & mut self , index : usize , element : T ) -> Result < ( ) , T > {
524
545
let len = self . len ( ) ;
@@ -571,11 +592,11 @@ impl<T> VecView<T> {
571
592
/// # Examples
572
593
///
573
594
/// ```
574
- /// use heapless::Vec;
595
+ /// use heapless::{ Vec, VecView} ;
575
596
///
576
- /// let mut v: Vec<_, 8 > = Vec::from_slice(&[1, 2, 3]).unwrap();
597
+ /// let mut v: &mut VecView<_ > = &mut Vec::<_, 8> ::from_slice(&[1, 2, 3]).unwrap();
577
598
/// assert_eq!(v.remove(1), 2);
578
- /// assert_eq!(v, [1, 3]);
599
+ /// assert_eq!(v, & [1, 3]);
579
600
/// ```
580
601
pub fn remove ( & mut self , index : usize ) -> T {
581
602
let len = self . len ( ) ;
@@ -609,24 +630,24 @@ impl<T> VecView<T> {
609
630
/// # Examples
610
631
///
611
632
/// ```
612
- /// use heapless::Vec;
633
+ /// use heapless::{ Vec, VecView} ;
613
634
///
614
- /// let mut vec: Vec<_, 8 > = Vec::from_slice(&[1, 2, 3, 4]).unwrap();
635
+ /// let mut vec: &mut VecView<_ > = &mut Vec::<_, 8> ::from_slice(&[1, 2, 3, 4]).unwrap();
615
636
/// vec.retain(|&x| x % 2 == 0);
616
- /// assert_eq!(vec, [2, 4]);
637
+ /// assert_eq!(vec, & [2, 4]);
617
638
/// ```
618
639
///
619
640
/// Because the elements are visited exactly once in the original order,
620
641
/// external state may be used to decide which elements to keep.
621
642
///
622
643
/// ```
623
- /// use heapless::Vec;
644
+ /// use heapless::{ Vec, VecView} ;
624
645
///
625
- /// let mut vec: Vec<_, 8 > = Vec::from_slice(&[1, 2, 3, 4, 5]).unwrap();
646
+ /// let mut vec: &mut VecView<_ > = &mut Vec::<_, 8> ::from_slice(&[1, 2, 3, 4, 5]).unwrap();
626
647
/// let keep = [false, true, true, false, true];
627
648
/// let mut iter = keep.iter();
628
649
/// vec.retain(|_| *iter.next().unwrap());
629
- /// assert_eq!(vec, [2, 3, 5]);
650
+ /// assert_eq!(vec, & [2, 3, 5]);
630
651
/// ```
631
652
pub fn retain < F > ( & mut self , mut f : F )
632
653
where
@@ -644,9 +665,9 @@ impl<T> VecView<T> {
644
665
/// # Examples
645
666
///
646
667
/// ```
647
- /// use heapless::Vec;
668
+ /// use heapless::{ Vec, VecView} ;
648
669
///
649
- /// let mut vec: Vec<_, 8 > = Vec::from_slice(&[1, 2, 3, 4]).unwrap();
670
+ /// let mut vec: &mut VecView<_ > = &mut Vec::<_, 8> ::from_slice(&[1, 2, 3, 4]).unwrap();
650
671
/// vec.retain_mut(|x| {
651
672
/// if *x <= 3 {
652
673
/// *x += 1;
@@ -655,7 +676,7 @@ impl<T> VecView<T> {
655
676
/// false
656
677
/// }
657
678
/// });
658
- /// assert_eq!(vec, [2, 3, 4]);
679
+ /// assert_eq!(vec, & [2, 3, 4]);
659
680
/// ```
660
681
pub fn retain_mut < F > ( & mut self , mut f : F )
661
682
where
@@ -881,7 +902,8 @@ impl<T, const N: usize> Vec<T, N> {
881
902
/// ```
882
903
/// use heapless::Vec;
883
904
/// let mut buffer: Vec<u8, 5> = Vec::from_slice(&[1, 2, 3, 5, 8]).unwrap();
884
- /// buffer[0] = 9;
905
+ /// let buffer_slice = buffer.as_mut_slice();
906
+ /// buffer_slice[0] = 9;
885
907
/// assert_eq!(buffer.as_slice(), &[9, 2, 3, 5, 8]);
886
908
/// ```
887
909
pub fn as_mut_slice ( & mut self ) -> & mut [ T ] {
0 commit comments