Skip to content

Commit 101b3b6

Browse files
Add missing documentation
1 parent 5d0d4af commit 101b3b6

File tree

1 file changed

+65
-43
lines changed

1 file changed

+65
-43
lines changed

src/vec.rs

+65-43
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,27 @@ pub struct VecInner<B: ?Sized + VecDrop> {
5858
/// assert_eq!(*vec, [7, 1, 2, 3]);
5959
/// ```
6060
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+
/// ```
6282
pub type VecView<T> = VecInner<[MaybeUninit<T>]>;
6383

6484
impl<T> VecView<T> {
@@ -79,8 +99,8 @@ impl<T> VecView<T> {
7999
/// # Examples
80100
///
81101
/// ```
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();
84104
/// assert_eq!(buffer.as_slice(), &[1, 2, 3, 5, 8]);
85105
/// ```
86106
pub fn as_slice(&self) -> &[T] {
@@ -96,9 +116,10 @@ impl<T> VecView<T> {
96116
/// # Examples
97117
///
98118
/// ```
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;
102123
/// assert_eq!(buffer.as_slice(), &[9, 2, 3, 5, 8]);
103124
/// ```
104125
pub fn as_mut_slice(&mut self) -> &mut [T] {
@@ -139,9 +160,9 @@ impl<T> VecView<T> {
139160
/// # Examples
140161
///
141162
/// ```
142-
/// use heapless::Vec;
163+
/// use heapless::{Vec, VecView};
143164
///
144-
/// let mut vec = Vec::<u8, 8>::new();
165+
/// let vec: &mut VecView<u8> = &mut Vec::<u8, 8>::new();
145166
/// vec.push(1).unwrap();
146167
/// vec.extend_from_slice(&[2, 3, 4]).unwrap();
147168
/// assert_eq!(*vec, [1, 2, 3, 4]);
@@ -303,7 +324,7 @@ impl<T> VecView<T> {
303324
///
304325
/// ```no_run
305326
/// # #![allow(dead_code)]
306-
/// use heapless::Vec;
327+
/// use heapless::{Vec, VecView};
307328
///
308329
/// # // This is just a minimal skeleton for the doc example;
309330
/// # // don't use this as a starting point for a real library.
@@ -320,17 +341,18 @@ impl<T> VecView<T> {
320341
/// pub fn get_dictionary(&self) -> Option<Vec<u8, 32768>> {
321342
/// // Per the FFI method's docs, "32768 bytes is always enough".
322343
/// let mut dict = Vec::new();
344+
/// let mut dict_view: &mut VecView<_> = &mut dict;
323345
/// let mut dict_length = 0;
324346
/// // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:
325347
/// // 1. `dict_length` elements were initialized.
326348
/// // 2. `dict_length` <= the capacity (32_768)
327349
/// // which makes `set_len` safe to call.
328350
/// unsafe {
329351
/// // 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);
331353
/// if r == Z_OK {
332354
/// // ...and update the length to what was initialized.
333-
/// dict.set_len(dict_length);
355+
/// dict_view.set_len(dict_length);
334356
/// Some(dict)
335357
/// } else {
336358
/// None
@@ -345,7 +367,7 @@ impl<T> VecView<T> {
345367
///
346368
/// ```
347369
/// use core::iter::FromIterator;
348-
/// use heapless::Vec;
370+
/// use heapless::{Vec, VecView};
349371
///
350372
/// let mut vec = Vec::<Vec<u8, 3>, 3>::from_iter(
351373
/// [
@@ -360,7 +382,7 @@ impl<T> VecView<T> {
360382
/// // 1. `old_len..0` is empty so no elements need to be initialized.
361383
/// // 2. `0 <= capacity` always holds whatever `capacity` is.
362384
/// unsafe {
363-
/// vec.set_len(0);
385+
/// vec.as_mut_view().set_len(0);
364386
/// }
365387
/// ```
366388
///
@@ -385,20 +407,19 @@ impl<T> VecView<T> {
385407
/// # Examples
386408
///
387409
/// ```
388-
/// use heapless::Vec;
389-
///// use heapless::consts::*;
410+
/// use heapless::{Vec, VecView};
390411
///
391-
/// let mut v: Vec<_, 8> = Vec::new();
412+
/// let v: &mut VecView<_> = &mut Vec::<_, 8>::new();
392413
/// v.push("foo").unwrap();
393414
/// v.push("bar").unwrap();
394415
/// v.push("baz").unwrap();
395416
/// v.push("qux").unwrap();
396417
///
397418
/// assert_eq!(v.swap_remove(1), "bar");
398-
/// assert_eq!(&*v, ["foo", "qux", "baz"]);
419+
/// assert_eq!(v, &["foo", "qux", "baz"]);
399420
///
400421
/// assert_eq!(v.swap_remove(0), "foo");
401-
/// assert_eq!(&*v, ["baz", "qux"]);
422+
/// assert_eq!(v, &["baz", "qux"]);
402423
/// ```
403424
pub fn swap_remove(&mut self, index: usize) -> T {
404425
assert!(index < self.len);
@@ -418,19 +439,19 @@ impl<T> VecView<T> {
418439
/// # Examples
419440
///
420441
/// ```
421-
/// use heapless::Vec;
442+
/// use heapless::{Vec, VecView};
422443
///
423-
/// let mut v: Vec<_, 8> = Vec::new();
444+
/// let mut v: &mut VecView<_> = &mut Vec::<_, 8>::new();
424445
/// v.push("foo").unwrap();
425446
/// v.push("bar").unwrap();
426447
/// v.push("baz").unwrap();
427448
/// v.push("qux").unwrap();
428449
///
429450
/// assert_eq!(unsafe { v.swap_remove_unchecked(1) }, "bar");
430-
/// assert_eq!(&*v, ["foo", "qux", "baz"]);
451+
/// assert_eq!(v, &["foo", "qux", "baz"]);
431452
///
432453
/// assert_eq!(unsafe { v.swap_remove_unchecked(0) }, "foo");
433-
/// assert_eq!(&*v, ["baz", "qux"]);
454+
/// assert_eq!(v, &["baz", "qux"]);
434455
/// ```
435456
pub unsafe fn swap_remove_unchecked(&mut self, index: usize) -> T {
436457
let length = self.len();
@@ -461,9 +482,9 @@ impl<T> VecView<T> {
461482
/// # Examples
462483
///
463484
/// ```
464-
/// use heapless::Vec;
485+
/// use heapless::{Vec, VecView};
465486
///
466-
/// let v: Vec<_, 8> = Vec::from_slice(b"abc").unwrap();
487+
/// let v: &VecView<_> = &Vec::<_, 8>::from_slice(b"abc").unwrap();
467488
/// assert_eq!(v.starts_with(b""), true);
468489
/// assert_eq!(v.starts_with(b"ab"), true);
469490
/// assert_eq!(v.starts_with(b"bc"), false);
@@ -484,9 +505,9 @@ impl<T> VecView<T> {
484505
/// # Examples
485506
///
486507
/// ```
487-
/// use heapless::Vec;
508+
/// use heapless::{Vec, VecView};
488509
///
489-
/// let v: Vec<_, 8> = Vec::from_slice(b"abc").unwrap();
510+
/// let v: &VecView<_> = &Vec::<_, 8>::from_slice(b"abc").unwrap();
490511
/// assert_eq!(v.ends_with(b""), true);
491512
/// assert_eq!(v.ends_with(b"ab"), false);
492513
/// assert_eq!(v.ends_with(b"bc"), true);
@@ -512,13 +533,13 @@ impl<T> VecView<T> {
512533
/// # Examples
513534
///
514535
/// ```
515-
/// use heapless::Vec;
536+
/// use heapless::{Vec, VecView};
516537
///
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();
518539
/// vec.insert(1, 4);
519-
/// assert_eq!(vec, [1, 4, 2, 3]);
540+
/// assert_eq!(vec, &[1, 4, 2, 3]);
520541
/// vec.insert(4, 5);
521-
/// assert_eq!(vec, [1, 4, 2, 3, 5]);
542+
/// assert_eq!(vec, &[1, 4, 2, 3, 5]);
522543
/// ```
523544
pub fn insert(&mut self, index: usize, element: T) -> Result<(), T> {
524545
let len = self.len();
@@ -571,11 +592,11 @@ impl<T> VecView<T> {
571592
/// # Examples
572593
///
573594
/// ```
574-
/// use heapless::Vec;
595+
/// use heapless::{Vec, VecView};
575596
///
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();
577598
/// assert_eq!(v.remove(1), 2);
578-
/// assert_eq!(v, [1, 3]);
599+
/// assert_eq!(v, &[1, 3]);
579600
/// ```
580601
pub fn remove(&mut self, index: usize) -> T {
581602
let len = self.len();
@@ -609,24 +630,24 @@ impl<T> VecView<T> {
609630
/// # Examples
610631
///
611632
/// ```
612-
/// use heapless::Vec;
633+
/// use heapless::{Vec, VecView};
613634
///
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();
615636
/// vec.retain(|&x| x % 2 == 0);
616-
/// assert_eq!(vec, [2, 4]);
637+
/// assert_eq!(vec, &[2, 4]);
617638
/// ```
618639
///
619640
/// Because the elements are visited exactly once in the original order,
620641
/// external state may be used to decide which elements to keep.
621642
///
622643
/// ```
623-
/// use heapless::Vec;
644+
/// use heapless::{Vec, VecView};
624645
///
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();
626647
/// let keep = [false, true, true, false, true];
627648
/// let mut iter = keep.iter();
628649
/// vec.retain(|_| *iter.next().unwrap());
629-
/// assert_eq!(vec, [2, 3, 5]);
650+
/// assert_eq!(vec, &[2, 3, 5]);
630651
/// ```
631652
pub fn retain<F>(&mut self, mut f: F)
632653
where
@@ -644,9 +665,9 @@ impl<T> VecView<T> {
644665
/// # Examples
645666
///
646667
/// ```
647-
/// use heapless::Vec;
668+
/// use heapless::{Vec, VecView};
648669
///
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();
650671
/// vec.retain_mut(|x| {
651672
/// if *x <= 3 {
652673
/// *x += 1;
@@ -655,7 +676,7 @@ impl<T> VecView<T> {
655676
/// false
656677
/// }
657678
/// });
658-
/// assert_eq!(vec, [2, 3, 4]);
679+
/// assert_eq!(vec, &[2, 3, 4]);
659680
/// ```
660681
pub fn retain_mut<F>(&mut self, mut f: F)
661682
where
@@ -881,7 +902,8 @@ impl<T, const N: usize> Vec<T, N> {
881902
/// ```
882903
/// use heapless::Vec;
883904
/// 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;
885907
/// assert_eq!(buffer.as_slice(), &[9, 2, 3, 5, 8]);
886908
/// ```
887909
pub fn as_mut_slice(&mut self) -> &mut [T] {

0 commit comments

Comments
 (0)