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