@@ -65,7 +65,27 @@ pub struct VecInner<B: ?Sized + VecDrop> {
65
65
/// assert_eq!(*vec, [7, 1, 2, 3]);
66
66
/// ```
67
67
pub type Vec < T , const N : usize > = VecInner < [ MaybeUninit < T > ; N ] > ;
68
- /// TODO: doc
68
+ /// A Vec with dynamic capacity
69
+ ///
70
+ /// [`Vec`]() coerces to `VecView`. `VecView` is !Sized, meaning that it can only ever be used through pointer
71
+ ///
72
+ /// Unlike [`Vec`](), `VecView` does not have an `N` const-generic parameter.
73
+ /// This has the ergonomic advantages of making it possible to use functions without needing to know at
74
+ /// compile-time the size of the buffers used, for example for use in `dyn` traits.
75
+ ///
76
+ /// `VecView<T>` is to `Vec<T, N>` what `[T]` is to `[T; N]`
77
+ ///
78
+ /// ```rust
79
+ /// use heapless::{Vec, VecView};
80
+ ///
81
+ /// let mut vec: Vec<u8, 10> = Vec::from_slice(&[1, 2, 3, 4]).unwrap();
82
+ /// let view: &VecView<_> = &vec;
83
+ /// assert_eq!(view, &[1, 2, 3, 4]);
84
+ ///
85
+ /// let mut_view: &mut VecView<_> = &mut vec;
86
+ /// mut_view.push(5);
87
+ /// assert_eq!(vec, [1, 2, 3, 4, 5]);
88
+ /// ```
69
89
pub type VecView < T > = VecInner < [ MaybeUninit < T > ] > ;
70
90
71
91
impl < T > VecView < T > {
@@ -86,8 +106,8 @@ impl<T> VecView<T> {
86
106
/// # Examples
87
107
///
88
108
/// ```
89
- /// use heapless::Vec;
90
- /// let buffer: Vec <u8, 5 > = Vec::from_slice(&[1, 2, 3, 5, 8]).unwrap();
109
+ /// use heapless::{ Vec, VecView} ;
110
+ /// let buffer: &VecView <u8> = & Vec::<u8, 5> ::from_slice(&[1, 2, 3, 5, 8]).unwrap();
91
111
/// assert_eq!(buffer.as_slice(), &[1, 2, 3, 5, 8]);
92
112
/// ```
93
113
pub fn as_slice ( & self ) -> & [ T ] {
@@ -103,9 +123,10 @@ impl<T> VecView<T> {
103
123
/// # Examples
104
124
///
105
125
/// ```
106
- /// use heapless::Vec;
107
- /// let mut buffer: Vec<u8, 5> = Vec::from_slice(&[1, 2, 3, 5, 8]).unwrap();
108
- /// buffer[0] = 9;
126
+ /// use heapless::{Vec, VecView};
127
+ /// let mut buffer: &mut VecView<u8> = &mut Vec::<u8, 5>::from_slice(&[1, 2, 3, 5, 8]).unwrap();
128
+ /// let buffer_slice = buffer.as_mut_slice();
129
+ /// buffer_slice[0] = 9;
109
130
/// assert_eq!(buffer.as_slice(), &[9, 2, 3, 5, 8]);
110
131
/// ```
111
132
pub fn as_mut_slice ( & mut self ) -> & mut [ T ] {
@@ -146,9 +167,9 @@ impl<T> VecView<T> {
146
167
/// # Examples
147
168
///
148
169
/// ```
149
- /// use heapless::Vec;
170
+ /// use heapless::{ Vec, VecView} ;
150
171
///
151
- /// let mut vec = Vec::<u8, 8>::new();
172
+ /// let vec: & mut VecView<u8> = &mut Vec::<u8, 8>::new();
152
173
/// vec.push(1).unwrap();
153
174
/// vec.extend_from_slice(&[2, 3, 4]).unwrap();
154
175
/// assert_eq!(*vec, [1, 2, 3, 4]);
@@ -310,7 +331,7 @@ impl<T> VecView<T> {
310
331
///
311
332
/// ```no_run
312
333
/// # #![allow(dead_code)]
313
- /// use heapless::Vec;
334
+ /// use heapless::{ Vec, VecView} ;
314
335
///
315
336
/// # // This is just a minimal skeleton for the doc example;
316
337
/// # // don't use this as a starting point for a real library.
@@ -327,17 +348,18 @@ impl<T> VecView<T> {
327
348
/// pub fn get_dictionary(&self) -> Option<Vec<u8, 32768>> {
328
349
/// // Per the FFI method's docs, "32768 bytes is always enough".
329
350
/// let mut dict = Vec::new();
351
+ /// let mut dict_view: &mut VecView<_> = &mut dict;
330
352
/// let mut dict_length = 0;
331
353
/// // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:
332
354
/// // 1. `dict_length` elements were initialized.
333
355
/// // 2. `dict_length` <= the capacity (32_768)
334
356
/// // which makes `set_len` safe to call.
335
357
/// unsafe {
336
358
/// // Make the FFI call...
337
- /// let r = deflateGetDictionary(self.strm, dict .as_mut_ptr(), &mut dict_length);
359
+ /// let r = deflateGetDictionary(self.strm, dict_view .as_mut_ptr(), &mut dict_length);
338
360
/// if r == Z_OK {
339
361
/// // ...and update the length to what was initialized.
340
- /// dict .set_len(dict_length);
362
+ /// dict_view .set_len(dict_length);
341
363
/// Some(dict)
342
364
/// } else {
343
365
/// None
@@ -352,7 +374,7 @@ impl<T> VecView<T> {
352
374
///
353
375
/// ```
354
376
/// use core::iter::FromIterator;
355
- /// use heapless::Vec;
377
+ /// use heapless::{ Vec, VecView} ;
356
378
///
357
379
/// let mut vec = Vec::<Vec<u8, 3>, 3>::from_iter(
358
380
/// [
@@ -367,7 +389,7 @@ impl<T> VecView<T> {
367
389
/// // 1. `old_len..0` is empty so no elements need to be initialized.
368
390
/// // 2. `0 <= capacity` always holds whatever `capacity` is.
369
391
/// unsafe {
370
- /// vec.set_len(0);
392
+ /// vec.as_mut_view(). set_len(0);
371
393
/// }
372
394
/// ```
373
395
///
@@ -392,20 +414,19 @@ impl<T> VecView<T> {
392
414
/// # Examples
393
415
///
394
416
/// ```
395
- /// use heapless::Vec;
396
- ///// use heapless::consts::*;
417
+ /// use heapless::{Vec, VecView};
397
418
///
398
- /// let mut v: Vec<_, 8 > = Vec::new();
419
+ /// let v: &mut VecView<_ > = &mut Vec::<_, 8> ::new();
399
420
/// v.push("foo").unwrap();
400
421
/// v.push("bar").unwrap();
401
422
/// v.push("baz").unwrap();
402
423
/// v.push("qux").unwrap();
403
424
///
404
425
/// assert_eq!(v.swap_remove(1), "bar");
405
- /// assert_eq!(&* v, ["foo", "qux", "baz"]);
426
+ /// assert_eq!(v, & ["foo", "qux", "baz"]);
406
427
///
407
428
/// assert_eq!(v.swap_remove(0), "foo");
408
- /// assert_eq!(&* v, ["baz", "qux"]);
429
+ /// assert_eq!(v, & ["baz", "qux"]);
409
430
/// ```
410
431
pub fn swap_remove ( & mut self , index : usize ) -> T {
411
432
assert ! ( index < self . len) ;
@@ -425,19 +446,19 @@ impl<T> VecView<T> {
425
446
/// # Examples
426
447
///
427
448
/// ```
428
- /// use heapless::Vec;
449
+ /// use heapless::{ Vec, VecView} ;
429
450
///
430
- /// let mut v: Vec<_, 8 > = Vec::new();
451
+ /// let mut v: &mut VecView<_ > = &mut Vec::<_, 8> ::new();
431
452
/// v.push("foo").unwrap();
432
453
/// v.push("bar").unwrap();
433
454
/// v.push("baz").unwrap();
434
455
/// v.push("qux").unwrap();
435
456
///
436
457
/// assert_eq!(unsafe { v.swap_remove_unchecked(1) }, "bar");
437
- /// assert_eq!(&* v, ["foo", "qux", "baz"]);
458
+ /// assert_eq!(v, & ["foo", "qux", "baz"]);
438
459
///
439
460
/// assert_eq!(unsafe { v.swap_remove_unchecked(0) }, "foo");
440
- /// assert_eq!(&* v, ["baz", "qux"]);
461
+ /// assert_eq!(v, & ["baz", "qux"]);
441
462
/// ```
442
463
pub unsafe fn swap_remove_unchecked ( & mut self , index : usize ) -> T {
443
464
let length = self . len ( ) ;
@@ -468,9 +489,9 @@ impl<T> VecView<T> {
468
489
/// # Examples
469
490
///
470
491
/// ```
471
- /// use heapless::Vec;
492
+ /// use heapless::{ Vec, VecView} ;
472
493
///
473
- /// let v: Vec<_, 8 > = Vec::from_slice(b"abc").unwrap();
494
+ /// let v: &VecView<_ > = & Vec::<_, 8> ::from_slice(b"abc").unwrap();
474
495
/// assert_eq!(v.starts_with(b""), true);
475
496
/// assert_eq!(v.starts_with(b"ab"), true);
476
497
/// assert_eq!(v.starts_with(b"bc"), false);
@@ -491,9 +512,9 @@ impl<T> VecView<T> {
491
512
/// # Examples
492
513
///
493
514
/// ```
494
- /// use heapless::Vec;
515
+ /// use heapless::{ Vec, VecView} ;
495
516
///
496
- /// let v: Vec<_, 8 > = Vec::from_slice(b"abc").unwrap();
517
+ /// let v: &VecView<_ > = & Vec::<_, 8> ::from_slice(b"abc").unwrap();
497
518
/// assert_eq!(v.ends_with(b""), true);
498
519
/// assert_eq!(v.ends_with(b"ab"), false);
499
520
/// assert_eq!(v.ends_with(b"bc"), true);
@@ -519,13 +540,13 @@ impl<T> VecView<T> {
519
540
/// # Examples
520
541
///
521
542
/// ```
522
- /// use heapless::Vec;
543
+ /// use heapless::{ Vec, VecView} ;
523
544
///
524
- /// let mut vec: Vec<_, 8 > = Vec::from_slice(&[1, 2, 3]).unwrap();
545
+ /// let mut vec: &mut VecView<_ > = &mut Vec::<_, 8> ::from_slice(&[1, 2, 3]).unwrap();
525
546
/// vec.insert(1, 4);
526
- /// assert_eq!(vec, [1, 4, 2, 3]);
547
+ /// assert_eq!(vec, & [1, 4, 2, 3]);
527
548
/// vec.insert(4, 5);
528
- /// assert_eq!(vec, [1, 4, 2, 3, 5]);
549
+ /// assert_eq!(vec, & [1, 4, 2, 3, 5]);
529
550
/// ```
530
551
pub fn insert ( & mut self , index : usize , element : T ) -> Result < ( ) , T > {
531
552
let len = self . len ( ) ;
@@ -578,11 +599,11 @@ impl<T> VecView<T> {
578
599
/// # Examples
579
600
///
580
601
/// ```
581
- /// use heapless::Vec;
602
+ /// use heapless::{ Vec, VecView} ;
582
603
///
583
- /// let mut v: Vec<_, 8 > = Vec::from_slice(&[1, 2, 3]).unwrap();
604
+ /// let mut v: &mut VecView<_ > = &mut Vec::<_, 8> ::from_slice(&[1, 2, 3]).unwrap();
584
605
/// assert_eq!(v.remove(1), 2);
585
- /// assert_eq!(v, [1, 3]);
606
+ /// assert_eq!(v, & [1, 3]);
586
607
/// ```
587
608
pub fn remove ( & mut self , index : usize ) -> T {
588
609
let len = self . len ( ) ;
@@ -616,24 +637,24 @@ impl<T> VecView<T> {
616
637
/// # Examples
617
638
///
618
639
/// ```
619
- /// use heapless::Vec;
640
+ /// use heapless::{ Vec, VecView} ;
620
641
///
621
- /// let mut vec: Vec<_, 8 > = Vec::from_slice(&[1, 2, 3, 4]).unwrap();
642
+ /// let mut vec: &mut VecView<_ > = &mut Vec::<_, 8> ::from_slice(&[1, 2, 3, 4]).unwrap();
622
643
/// vec.retain(|&x| x % 2 == 0);
623
- /// assert_eq!(vec, [2, 4]);
644
+ /// assert_eq!(vec, & [2, 4]);
624
645
/// ```
625
646
///
626
647
/// Because the elements are visited exactly once in the original order,
627
648
/// external state may be used to decide which elements to keep.
628
649
///
629
650
/// ```
630
- /// use heapless::Vec;
651
+ /// use heapless::{ Vec, VecView} ;
631
652
///
632
- /// let mut vec: Vec<_, 8 > = Vec::from_slice(&[1, 2, 3, 4, 5]).unwrap();
653
+ /// let mut vec: &mut VecView<_ > = &mut Vec::<_, 8> ::from_slice(&[1, 2, 3, 4, 5]).unwrap();
633
654
/// let keep = [false, true, true, false, true];
634
655
/// let mut iter = keep.iter();
635
656
/// vec.retain(|_| *iter.next().unwrap());
636
- /// assert_eq!(vec, [2, 3, 5]);
657
+ /// assert_eq!(vec, & [2, 3, 5]);
637
658
/// ```
638
659
pub fn retain < F > ( & mut self , mut f : F )
639
660
where
@@ -651,9 +672,9 @@ impl<T> VecView<T> {
651
672
/// # Examples
652
673
///
653
674
/// ```
654
- /// use heapless::Vec;
675
+ /// use heapless::{ Vec, VecView} ;
655
676
///
656
- /// let mut vec: Vec<_, 8 > = Vec::from_slice(&[1, 2, 3, 4]).unwrap();
677
+ /// let mut vec: &mut VecView<_ > = &mut Vec::<_, 8> ::from_slice(&[1, 2, 3, 4]).unwrap();
657
678
/// vec.retain_mut(|x| {
658
679
/// if *x <= 3 {
659
680
/// *x += 1;
@@ -662,7 +683,7 @@ impl<T> VecView<T> {
662
683
/// false
663
684
/// }
664
685
/// });
665
- /// assert_eq!(vec, [2, 3, 4]);
686
+ /// assert_eq!(vec, & [2, 3, 4]);
666
687
/// ```
667
688
pub fn retain_mut < F > ( & mut self , mut f : F )
668
689
where
@@ -927,7 +948,8 @@ impl<T, const N: usize> Vec<T, N> {
927
948
/// ```
928
949
/// use heapless::Vec;
929
950
/// let mut buffer: Vec<u8, 5> = Vec::from_slice(&[1, 2, 3, 5, 8]).unwrap();
930
- /// buffer[0] = 9;
951
+ /// let buffer_slice = buffer.as_mut_slice();
952
+ /// buffer_slice[0] = 9;
931
953
/// assert_eq!(buffer.as_slice(), &[9, 2, 3, 5, 8]);
932
954
/// ```
933
955
pub fn as_mut_slice ( & mut self ) -> & mut [ T ] {
0 commit comments