Skip to content

Commit 805037b

Browse files
Add missing documentation
1 parent 5359219 commit 805037b

File tree

1 file changed

+65
-43
lines changed

1 file changed

+65
-43
lines changed

src/vec.rs

Lines changed: 65 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,27 @@ pub struct VecInner<B: ?Sized + VecDrop> {
6565
/// assert_eq!(*vec, [7, 1, 2, 3]);
6666
/// ```
6767
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+
/// ```
6989
pub type VecView<T> = VecInner<[MaybeUninit<T>]>;
7090

7191
impl<T> VecView<T> {
@@ -86,8 +106,8 @@ impl<T> VecView<T> {
86106
/// # Examples
87107
///
88108
/// ```
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();
91111
/// assert_eq!(buffer.as_slice(), &[1, 2, 3, 5, 8]);
92112
/// ```
93113
pub fn as_slice(&self) -> &[T] {
@@ -103,9 +123,10 @@ impl<T> VecView<T> {
103123
/// # Examples
104124
///
105125
/// ```
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;
109130
/// assert_eq!(buffer.as_slice(), &[9, 2, 3, 5, 8]);
110131
/// ```
111132
pub fn as_mut_slice(&mut self) -> &mut [T] {
@@ -146,9 +167,9 @@ impl<T> VecView<T> {
146167
/// # Examples
147168
///
148169
/// ```
149-
/// use heapless::Vec;
170+
/// use heapless::{Vec, VecView};
150171
///
151-
/// let mut vec = Vec::<u8, 8>::new();
172+
/// let vec: &mut VecView<u8> = &mut Vec::<u8, 8>::new();
152173
/// vec.push(1).unwrap();
153174
/// vec.extend_from_slice(&[2, 3, 4]).unwrap();
154175
/// assert_eq!(*vec, [1, 2, 3, 4]);
@@ -310,7 +331,7 @@ impl<T> VecView<T> {
310331
///
311332
/// ```no_run
312333
/// # #![allow(dead_code)]
313-
/// use heapless::Vec;
334+
/// use heapless::{Vec, VecView};
314335
///
315336
/// # // This is just a minimal skeleton for the doc example;
316337
/// # // don't use this as a starting point for a real library.
@@ -327,17 +348,18 @@ impl<T> VecView<T> {
327348
/// pub fn get_dictionary(&self) -> Option<Vec<u8, 32768>> {
328349
/// // Per the FFI method's docs, "32768 bytes is always enough".
329350
/// let mut dict = Vec::new();
351+
/// let mut dict_view: &mut VecView<_> = &mut dict;
330352
/// let mut dict_length = 0;
331353
/// // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:
332354
/// // 1. `dict_length` elements were initialized.
333355
/// // 2. `dict_length` <= the capacity (32_768)
334356
/// // which makes `set_len` safe to call.
335357
/// unsafe {
336358
/// // 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);
338360
/// if r == Z_OK {
339361
/// // ...and update the length to what was initialized.
340-
/// dict.set_len(dict_length);
362+
/// dict_view.set_len(dict_length);
341363
/// Some(dict)
342364
/// } else {
343365
/// None
@@ -352,7 +374,7 @@ impl<T> VecView<T> {
352374
///
353375
/// ```
354376
/// use core::iter::FromIterator;
355-
/// use heapless::Vec;
377+
/// use heapless::{Vec, VecView};
356378
///
357379
/// let mut vec = Vec::<Vec<u8, 3>, 3>::from_iter(
358380
/// [
@@ -367,7 +389,7 @@ impl<T> VecView<T> {
367389
/// // 1. `old_len..0` is empty so no elements need to be initialized.
368390
/// // 2. `0 <= capacity` always holds whatever `capacity` is.
369391
/// unsafe {
370-
/// vec.set_len(0);
392+
/// vec.as_mut_view().set_len(0);
371393
/// }
372394
/// ```
373395
///
@@ -392,20 +414,19 @@ impl<T> VecView<T> {
392414
/// # Examples
393415
///
394416
/// ```
395-
/// use heapless::Vec;
396-
///// use heapless::consts::*;
417+
/// use heapless::{Vec, VecView};
397418
///
398-
/// let mut v: Vec<_, 8> = Vec::new();
419+
/// let v: &mut VecView<_> = &mut Vec::<_, 8>::new();
399420
/// v.push("foo").unwrap();
400421
/// v.push("bar").unwrap();
401422
/// v.push("baz").unwrap();
402423
/// v.push("qux").unwrap();
403424
///
404425
/// assert_eq!(v.swap_remove(1), "bar");
405-
/// assert_eq!(&*v, ["foo", "qux", "baz"]);
426+
/// assert_eq!(v, &["foo", "qux", "baz"]);
406427
///
407428
/// assert_eq!(v.swap_remove(0), "foo");
408-
/// assert_eq!(&*v, ["baz", "qux"]);
429+
/// assert_eq!(v, &["baz", "qux"]);
409430
/// ```
410431
pub fn swap_remove(&mut self, index: usize) -> T {
411432
assert!(index < self.len);
@@ -425,19 +446,19 @@ impl<T> VecView<T> {
425446
/// # Examples
426447
///
427448
/// ```
428-
/// use heapless::Vec;
449+
/// use heapless::{Vec, VecView};
429450
///
430-
/// let mut v: Vec<_, 8> = Vec::new();
451+
/// let mut v: &mut VecView<_> = &mut Vec::<_, 8>::new();
431452
/// v.push("foo").unwrap();
432453
/// v.push("bar").unwrap();
433454
/// v.push("baz").unwrap();
434455
/// v.push("qux").unwrap();
435456
///
436457
/// assert_eq!(unsafe { v.swap_remove_unchecked(1) }, "bar");
437-
/// assert_eq!(&*v, ["foo", "qux", "baz"]);
458+
/// assert_eq!(v, &["foo", "qux", "baz"]);
438459
///
439460
/// assert_eq!(unsafe { v.swap_remove_unchecked(0) }, "foo");
440-
/// assert_eq!(&*v, ["baz", "qux"]);
461+
/// assert_eq!(v, &["baz", "qux"]);
441462
/// ```
442463
pub unsafe fn swap_remove_unchecked(&mut self, index: usize) -> T {
443464
let length = self.len();
@@ -468,9 +489,9 @@ impl<T> VecView<T> {
468489
/// # Examples
469490
///
470491
/// ```
471-
/// use heapless::Vec;
492+
/// use heapless::{Vec, VecView};
472493
///
473-
/// let v: Vec<_, 8> = Vec::from_slice(b"abc").unwrap();
494+
/// let v: &VecView<_> = &Vec::<_, 8>::from_slice(b"abc").unwrap();
474495
/// assert_eq!(v.starts_with(b""), true);
475496
/// assert_eq!(v.starts_with(b"ab"), true);
476497
/// assert_eq!(v.starts_with(b"bc"), false);
@@ -491,9 +512,9 @@ impl<T> VecView<T> {
491512
/// # Examples
492513
///
493514
/// ```
494-
/// use heapless::Vec;
515+
/// use heapless::{Vec, VecView};
495516
///
496-
/// let v: Vec<_, 8> = Vec::from_slice(b"abc").unwrap();
517+
/// let v: &VecView<_> = &Vec::<_, 8>::from_slice(b"abc").unwrap();
497518
/// assert_eq!(v.ends_with(b""), true);
498519
/// assert_eq!(v.ends_with(b"ab"), false);
499520
/// assert_eq!(v.ends_with(b"bc"), true);
@@ -519,13 +540,13 @@ impl<T> VecView<T> {
519540
/// # Examples
520541
///
521542
/// ```
522-
/// use heapless::Vec;
543+
/// use heapless::{Vec, VecView};
523544
///
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();
525546
/// vec.insert(1, 4);
526-
/// assert_eq!(vec, [1, 4, 2, 3]);
547+
/// assert_eq!(vec, &[1, 4, 2, 3]);
527548
/// vec.insert(4, 5);
528-
/// assert_eq!(vec, [1, 4, 2, 3, 5]);
549+
/// assert_eq!(vec, &[1, 4, 2, 3, 5]);
529550
/// ```
530551
pub fn insert(&mut self, index: usize, element: T) -> Result<(), T> {
531552
let len = self.len();
@@ -578,11 +599,11 @@ impl<T> VecView<T> {
578599
/// # Examples
579600
///
580601
/// ```
581-
/// use heapless::Vec;
602+
/// use heapless::{Vec, VecView};
582603
///
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();
584605
/// assert_eq!(v.remove(1), 2);
585-
/// assert_eq!(v, [1, 3]);
606+
/// assert_eq!(v, &[1, 3]);
586607
/// ```
587608
pub fn remove(&mut self, index: usize) -> T {
588609
let len = self.len();
@@ -616,24 +637,24 @@ impl<T> VecView<T> {
616637
/// # Examples
617638
///
618639
/// ```
619-
/// use heapless::Vec;
640+
/// use heapless::{Vec, VecView};
620641
///
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();
622643
/// vec.retain(|&x| x % 2 == 0);
623-
/// assert_eq!(vec, [2, 4]);
644+
/// assert_eq!(vec, &[2, 4]);
624645
/// ```
625646
///
626647
/// Because the elements are visited exactly once in the original order,
627648
/// external state may be used to decide which elements to keep.
628649
///
629650
/// ```
630-
/// use heapless::Vec;
651+
/// use heapless::{Vec, VecView};
631652
///
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();
633654
/// let keep = [false, true, true, false, true];
634655
/// let mut iter = keep.iter();
635656
/// vec.retain(|_| *iter.next().unwrap());
636-
/// assert_eq!(vec, [2, 3, 5]);
657+
/// assert_eq!(vec, &[2, 3, 5]);
637658
/// ```
638659
pub fn retain<F>(&mut self, mut f: F)
639660
where
@@ -651,9 +672,9 @@ impl<T> VecView<T> {
651672
/// # Examples
652673
///
653674
/// ```
654-
/// use heapless::Vec;
675+
/// use heapless::{Vec, VecView};
655676
///
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();
657678
/// vec.retain_mut(|x| {
658679
/// if *x <= 3 {
659680
/// *x += 1;
@@ -662,7 +683,7 @@ impl<T> VecView<T> {
662683
/// false
663684
/// }
664685
/// });
665-
/// assert_eq!(vec, [2, 3, 4]);
686+
/// assert_eq!(vec, &[2, 3, 4]);
666687
/// ```
667688
pub fn retain_mut<F>(&mut self, mut f: F)
668689
where
@@ -927,7 +948,8 @@ impl<T, const N: usize> Vec<T, N> {
927948
/// ```
928949
/// use heapless::Vec;
929950
/// 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;
931953
/// assert_eq!(buffer.as_slice(), &[9, 2, 3, 5, 8]);
932954
/// ```
933955
pub fn as_mut_slice(&mut self) -> &mut [T] {

0 commit comments

Comments
 (0)