1#![cfg(feature = "alloc")]
4#![cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
5
6use alloc::borrow::{Borrow, BorrowMut, ToOwned};
7use alloc::vec::{self, Drain, Vec};
8#[cfg(feature = "arbitrary")]
9use arbitrary::{Arbitrary, Unstructured};
10use core::cmp::Ordering;
11use core::fmt::{self, Debug, Formatter};
12use core::iter::{self, FusedIterator, Skip, Take};
13use core::mem;
14use core::num::NonZeroUsize;
15use core::ops::{Deref, DerefMut, Index, IndexMut, RangeBounds};
16use core::slice;
17#[cfg(feature = "rayon")]
18use rayon::iter::{IntoParallelIterator, ParallelIterator};
19#[cfg(feature = "std")]
20use std::io::{self, IoSlice, Write};
21#[cfg(feature = "schemars")]
22use {
23 alloc::borrow::Cow,
24 schemars::{JsonSchema, Schema, SchemaGenerator},
25};
26
27use crate::array1::Array1;
28use crate::borrow1::CowSlice1;
29use crate::boxed1::{BoxedSlice1, BoxedSlice1Ext as _};
30use crate::iter1::{self, Extend1, FromIterator1, IntoIterator1, Iterator1};
31#[cfg(feature = "rayon")]
32use crate::iter1::{FromParallelIterator1, IntoParallelIterator1, ParallelIterator1};
33use crate::safety::{NonZeroExt as _, OptionExt as _};
34use crate::segment::range::{self, IndexRange, Intersect, Project, RangeError};
35use crate::segment::{self, ByRange, ByTail, Segmentation};
36use crate::slice1::Slice1;
37use crate::str1::Str1;
38use crate::string1::String1;
39use crate::take;
40use crate::vec_deque1::VecDeque1;
41use crate::{Cardinality, EmptyError, FromMaybeEmpty, MaybeEmpty, NonEmpty};
42
43type ItemFor<K> = <K as ClosedVec>::Item;
44
45pub trait ClosedVec {
46 type Item;
47
48 fn as_vec(&self) -> &Vec<Self::Item>;
49}
50
51impl<T> ClosedVec for Vec<T> {
52 type Item = T;
53
54 fn as_vec(&self) -> &Vec<Self::Item> {
55 self
56 }
57}
58
59impl<T, R> ByRange<usize, R> for Vec<T>
60where
61 R: RangeBounds<usize>,
62{
63 type Range = IndexRange;
64 type Error = RangeError<usize>;
65
66 fn segment(&mut self, range: R) -> Result<Segment<'_, Self>, Self::Error> {
67 let n = self.len();
68 Segment::intersected(self, n, range)
69 }
70}
71
72impl<T> ByTail for Vec<T> {
73 type Range = IndexRange;
74
75 fn tail(&mut self) -> Segment<'_, Self> {
76 let n = self.len();
77 Segment::from_tail_range(self, n)
78 }
79
80 fn rtail(&mut self) -> Segment<'_, Self> {
81 let n = self.len();
82 Segment::from_rtail_range(self, n)
83 }
84}
85
86impl<T> Extend1<T> for Vec<T> {
87 fn extend_non_empty<I>(mut self, items: I) -> Vec1<T>
88 where
89 I: IntoIterator1<Item = T>,
90 {
91 self.extend(items);
92 unsafe { Vec1::from_maybe_empty_unchecked(self) }
95 }
96}
97
98unsafe impl<T> MaybeEmpty for Vec<T> {
99 fn cardinality(&self) -> Option<Cardinality<(), ()>> {
100 self.as_slice().cardinality()
101 }
102}
103
104impl<T> Segmentation for Vec<T> {
105 type Kind = Self;
106 type Target = Self;
107}
108
109type TakeIfMany<'a, T, N = ()> = take::TakeIfMany<'a, Vec<T>, T, N>;
110
111pub type PopIfMany<'a, K> = TakeIfMany<'a, ItemFor<K>, ()>;
112
113pub type RemoveIfMany<'a, K> = TakeIfMany<'a, ItemFor<K>, usize>;
114
115impl<'a, T, N> TakeIfMany<'a, T, N> {
116 pub fn or_get_only(self) -> Result<T, &'a T> {
117 self.take_or_else(|items, _| items.first())
118 }
119
120 pub fn or_replace_only(self, replacement: T) -> Result<T, T> {
121 self.or_else_replace_only(move || replacement)
122 }
123
124 pub fn or_else_replace_only<F>(self, f: F) -> Result<T, T>
125 where
126 F: FnOnce() -> T,
127 {
128 self.take_or_else(move |items, _| mem::replace(items.first_mut(), f()))
129 }
130}
131
132impl<'a, T> TakeIfMany<'a, T, usize> {
133 pub fn or_get(self) -> Result<T, &'a T> {
134 self.take_or_else(|items, index| &items[index])
135 }
136
137 pub fn or_replace(self, replacement: T) -> Result<T, T> {
138 self.or_else_replace(move || replacement)
139 }
140
141 pub fn or_else_replace<F>(self, f: F) -> Result<T, T>
142 where
143 F: FnOnce() -> T,
144 {
145 self.take_or_else(move |items, index| mem::replace(&mut items[index], f()))
146 }
147}
148
149pub type Vec1<T> = NonEmpty<Vec<T>>;
150
151impl<T> Vec1<T> {
152 pub unsafe fn from_vec_unchecked(items: Vec<T>) -> Self {
159 unsafe { FromMaybeEmpty::from_maybe_empty_unchecked(items) }
160 }
161
162 pub fn from_one(item: T) -> Self {
163 iter1::one(item).collect1()
164 }
165
166 pub fn from_one_with_capacity(item: T, capacity: usize) -> Self {
167 Vec1::from_iter1_with_capacity([item], capacity)
168 }
169
170 pub fn from_iter1_with_capacity<U>(items: U, capacity: usize) -> Self
171 where
172 U: IntoIterator1<Item = T>,
173 {
174 let items = {
175 let mut xs = Vec::with_capacity(capacity);
176 xs.extend(items);
177 xs
178 };
179 unsafe { Vec1::from_vec_unchecked(items) }
182 }
183
184 pub fn from_head_and_tail<I>(head: T, tail: I) -> Self
185 where
186 I: IntoIterator<Item = T>,
187 {
188 iter1::head_and_tail(head, tail).collect1()
189 }
190
191 pub fn from_rtail_and_head<I>(tail: I, head: T) -> Self
192 where
193 I: IntoIterator<Item = T>,
194 {
195 iter1::rtail_and_head(tail, head).collect1()
196 }
197
198 pub fn try_from_ref(items: &Vec<T>) -> Result<&'_ Self, EmptyError<&'_ Vec<T>>> {
199 items.try_into()
200 }
201
202 pub fn try_from_mut(items: &mut Vec<T>) -> Result<&'_ mut Self, EmptyError<&'_ mut Vec<T>>> {
203 items.try_into()
204 }
205
206 pub fn into_head_and_tail(mut self) -> (T, Vec<T>) {
207 let head = self.items.remove(0);
208 (head, self.items)
209 }
210
211 pub fn into_rtail_and_head(mut self) -> (Vec<T>, T) {
212 let head = unsafe { self.items.pop().unwrap_maybe_unchecked() };
214 (self.items, head)
215 }
216
217 pub fn into_vec(self) -> Vec<T> {
218 self.items
219 }
220
221 pub fn into_boxed_slice1(self) -> BoxedSlice1<T> {
222 unsafe { BoxedSlice1::from_boxed_slice_unchecked(self.items.into_boxed_slice()) }
224 }
225
226 pub fn leak<'a>(self) -> &'a mut Slice1<T> {
227 unsafe { Slice1::from_mut_slice_unchecked(self.items.leak()) }
229 }
230
231 pub fn try_retain<F>(self, f: F) -> Result<Self, EmptyError<Vec<T>>>
232 where
233 F: FnMut(&T) -> bool,
234 {
235 self.and_then_try(|items| items.retain(f))
236 }
237
238 pub fn retain_until_only<F>(&mut self, mut f: F) -> Option<&'_ T>
239 where
240 F: FnMut(&T) -> bool,
241 {
242 self.rtail().retain(|item| f(item));
243 if self.len().get() == 1 {
244 let last = self.last();
245 if f(last) { None } else { Some(last) }
246 }
247 else {
248 if !f(self.last()) {
249 self.pop_if_many();
251 }
252 None
253 }
254 }
255
256 pub fn reserve(&mut self, additional: usize) {
257 self.items.reserve(additional)
258 }
259
260 pub fn reserve_exact(&mut self, additional: usize) {
261 self.items.reserve_exact(additional)
262 }
263
264 pub fn shrink_to(&mut self, capacity: usize) {
265 self.items.shrink_to(capacity)
266 }
267
268 pub fn shrink_to_fit(&mut self) {
269 self.items.shrink_to_fit()
270 }
271
272 pub fn split_off_tail(&mut self) -> Vec<T> {
273 self.items.split_off(1)
274 }
275
276 pub fn append(&mut self, items: &mut Vec<T>) {
277 self.items.append(items)
278 }
279
280 pub fn extend_from_slice(&mut self, items: &[T])
281 where
282 T: Clone,
283 {
284 self.items.extend_from_slice(items)
285 }
286
287 pub fn extend_from_within<R>(&mut self, range: R)
288 where
289 T: Clone,
290 R: RangeBounds<usize>,
291 {
292 self.items.extend_from_within(range)
293 }
294
295 pub fn push(&mut self, item: T) {
296 self.items.push(item)
297 }
298
299 pub fn pop_if_many(&mut self) -> PopIfMany<'_, Self> {
300 TakeIfMany::with(self, (), |items, ()| unsafe {
302 items.items.pop().unwrap_maybe_unchecked()
303 })
304 }
305
306 pub fn pop_if_many_and<F>(&mut self, f: F) -> Option<T>
307 where
308 F: FnOnce(&mut T) -> bool,
309 {
310 self.pop_if_many().take_if(|items| f(items.last_mut()))
311 }
312
313 pub fn insert(&mut self, index: usize, item: T) {
314 self.items.insert(index, item)
315 }
316
317 pub fn remove_if_many(&mut self, index: usize) -> RemoveIfMany<'_, Self> {
318 TakeIfMany::with(self, index, |items, index| items.items.remove(index))
319 }
320
321 pub fn swap_remove_if_many(&mut self, index: usize) -> RemoveIfMany<'_, Self> {
322 TakeIfMany::with(self, index, |items, index| items.items.swap_remove(index))
323 }
324
325 pub fn dedup(&mut self)
326 where
327 T: PartialEq,
328 {
329 self.items.dedup()
330 }
331
332 pub fn dedup_by<F>(&mut self, f: F)
333 where
334 F: FnMut(&mut T, &mut T) -> bool,
335 {
336 self.items.dedup_by(f)
337 }
338
339 pub fn dedup_by_key<K, F>(&mut self, f: F)
340 where
341 K: PartialEq,
342 F: FnMut(&mut T) -> K,
343 {
344 self.items.dedup_by_key(f)
345 }
346
347 pub fn len(&self) -> NonZeroUsize {
348 unsafe { NonZeroUsize::new_maybe_unchecked(self.items.len()) }
350 }
351
352 pub fn capacity(&self) -> NonZeroUsize {
353 unsafe { NonZeroUsize::new_maybe_unchecked(self.items.capacity()) }
355 }
356
357 pub const fn as_vec(&self) -> &Vec<T> {
358 &self.items
359 }
360
361 pub const unsafe fn as_mut_vec(&mut self) -> &mut Vec<T> {
378 &mut self.items
379 }
380
381 pub fn as_slice1(&self) -> &Slice1<T> {
382 unsafe { Slice1::from_slice_unchecked(self.items.as_slice()) }
384 }
385
386 pub fn as_mut_slice1(&mut self) -> &mut Slice1<T> {
387 unsafe { Slice1::from_mut_slice_unchecked(self.items.as_mut_slice()) }
389 }
390
391 pub fn as_ptr(&self) -> *const T {
392 self.items.as_ptr()
393 }
394
395 pub fn as_mut_ptr(&mut self) -> *mut T {
396 self.items.as_mut_ptr()
397 }
398}
399
400impl<T, const N: usize> Vec1<[T; N]> {
403 pub fn into_flattened(self) -> Vec1<T> {
404 unsafe { Vec1::from_vec_unchecked(self.items.into_flattened()) }
407 }
408}
409
410#[cfg(feature = "arbitrary")]
411#[cfg_attr(docsrs, doc(cfg(feature = "arbitrary")))]
412impl<'a, T> Arbitrary<'a> for Vec1<T>
413where
414 T: Arbitrary<'a>,
415{
416 fn arbitrary(unstructured: &mut Unstructured<'a>) -> arbitrary::Result<Self> {
417 iter1::head_and_tail(T::arbitrary(unstructured), unstructured.arbitrary_iter()?).collect1()
418 }
419
420 fn size_hint(depth: usize) -> (usize, Option<usize>) {
421 (T::size_hint(depth).0, None)
422 }
423}
424
425impl<T> AsMut<[T]> for Vec1<T> {
426 fn as_mut(&mut self) -> &mut [T] {
427 self.items.as_mut()
428 }
429}
430
431impl<T> AsMut<Slice1<T>> for Vec1<T> {
432 fn as_mut(&mut self) -> &mut Slice1<T> {
433 self.as_mut_slice1()
434 }
435}
436
437impl<T> AsRef<[T]> for Vec1<T> {
438 fn as_ref(&self) -> &[T] {
439 self.items.as_ref()
440 }
441}
442
443impl<T> AsRef<Slice1<T>> for Vec1<T> {
444 fn as_ref(&self) -> &Slice1<T> {
445 self.as_slice1()
446 }
447}
448
449impl<T> Borrow<[T]> for Vec1<T> {
450 fn borrow(&self) -> &[T] {
451 self.items.borrow()
452 }
453}
454
455impl<T> Borrow<Slice1<T>> for Vec1<T> {
456 fn borrow(&self) -> &Slice1<T> {
457 self.as_slice1()
458 }
459}
460
461impl<T> BorrowMut<[T]> for Vec1<T> {
462 fn borrow_mut(&mut self) -> &mut [T] {
463 self.items.borrow_mut()
464 }
465}
466
467impl<T> BorrowMut<Slice1<T>> for Vec1<T> {
468 fn borrow_mut(&mut self) -> &mut Slice1<T> {
469 self.as_mut_slice1()
470 }
471}
472
473impl<T, R> ByRange<usize, R> for Vec1<T>
474where
475 R: RangeBounds<usize>,
476{
477 type Range = IndexRange;
478 type Error = RangeError<usize>;
479
480 fn segment(&mut self, range: R) -> Result<Segment<'_, Self>, Self::Error> {
481 let n = self.items.len();
482 Segment::intersected_strict_subset(&mut self.items, n, range)
483 }
484}
485
486impl<T> ByTail for Vec1<T> {
487 type Range = IndexRange;
488
489 fn tail(&mut self) -> Segment<'_, Self> {
490 self.items.tail().rekind()
491 }
492
493 fn rtail(&mut self) -> Segment<'_, Self> {
494 self.items.rtail().rekind()
495 }
496}
497
498impl<T> ClosedVec for Vec1<T> {
499 type Item = T;
500
501 fn as_vec(&self) -> &Vec<Self::Item> {
502 self.as_ref()
503 }
504}
505
506impl<T> Debug for Vec1<T>
507where
508 T: Debug,
509{
510 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
511 formatter.debug_list().entries(self.items.iter()).finish()
512 }
513}
514
515impl<T> Deref for Vec1<T> {
516 type Target = Slice1<T>;
517
518 fn deref(&self) -> &Self::Target {
519 self.as_slice1()
520 }
521}
522
523impl<T> DerefMut for Vec1<T> {
524 fn deref_mut(&mut self) -> &mut Self::Target {
525 self.as_mut_slice1()
526 }
527}
528
529impl<T> Extend<T> for Vec1<T> {
530 fn extend<I>(&mut self, extension: I)
531 where
532 I: IntoIterator<Item = T>,
533 {
534 self.items.extend(extension)
535 }
536}
537
538impl<'a, T> Extend<&'a T> for Vec1<T>
539where
540 T: 'a + Copy,
541{
542 fn extend<I>(&mut self, extension: I)
543 where
544 I: IntoIterator<Item = &'a T>,
545 {
546 self.items.extend(extension)
547 }
548}
549
550impl<T, const N: usize> From<[T; N]> for Vec1<T>
551where
552 [T; N]: Array1,
553{
554 fn from(items: [T; N]) -> Self {
555 unsafe { Vec1::from_vec_unchecked(Vec::from(items)) }
557 }
558}
559
560impl<'a, T, const N: usize> From<&'a [T; N]> for Vec1<T>
561where
562 [T; N]: Array1,
563 T: Copy,
564{
565 fn from(items: &'a [T; N]) -> Self {
566 unsafe { Vec1::from_vec_unchecked(items.iter().copied().collect()) }
568 }
569}
570
571impl<'a, T, const N: usize> From<&'a mut [T; N]> for Vec1<T>
572where
573 [T; N]: Array1,
574 T: Copy,
575{
576 fn from(items: &'a mut [T; N]) -> Self {
577 Vec1::from(&*items)
578 }
579}
580
581impl<T> From<BoxedSlice1<T>> for Vec1<T> {
582 fn from(items: BoxedSlice1<T>) -> Self {
583 unsafe { Vec1::from_vec_unchecked(Vec::from(items.into_boxed_slice())) }
585 }
586}
587
588impl<'a, T> From<CowSlice1<'a, T>> for Vec1<T>
589where
590 Slice1<T>: ToOwned<Owned = Vec1<T>>,
591{
592 fn from(items: CowSlice1<'a, T>) -> Self {
593 items.into_owned()
594 }
595}
596
597impl<'a, T> From<&'a Slice1<T>> for Vec1<T>
598where
599 T: Clone,
600{
601 fn from(items: &'a Slice1<T>) -> Self {
602 unsafe { Vec1::from_vec_unchecked(Vec::from(items.as_slice())) }
604 }
605}
606
607impl<'a, T> From<&'a mut Slice1<T>> for Vec1<T>
608where
609 T: Clone,
610{
611 fn from(items: &'a mut Slice1<T>) -> Self {
612 Vec1::from(&*items)
613 }
614}
615
616impl<'a> From<&'a Str1> for Vec1<u8> {
617 fn from(items: &'a Str1) -> Self {
618 unsafe { Vec1::from_vec_unchecked(Vec::from(items.as_str())) }
620 }
621}
622
623impl From<String1> for Vec1<u8> {
624 fn from(items: String1) -> Self {
625 unsafe { Vec1::from_vec_unchecked(Vec::from(items.into_string())) }
627 }
628}
629
630impl<T> From<Vec1<T>> for Vec<T> {
631 fn from(items: Vec1<T>) -> Self {
632 items.items
633 }
634}
635
636impl<T> From<VecDeque1<T>> for Vec1<T> {
637 fn from(items: VecDeque1<T>) -> Self {
638 unsafe { Vec1::from_vec_unchecked(Vec::from(items.into_vec_deque())) }
640 }
641}
642
643impl<T> FromIterator1<T> for Vec1<T> {
644 fn from_iter1<I>(items: I) -> Self
645 where
646 I: IntoIterator1<Item = T>,
647 {
648 unsafe { Vec1::from_vec_unchecked(items.into_iter().collect()) }
650 }
651}
652
653#[cfg(feature = "rayon")]
654#[cfg_attr(docsrs, doc(cfg(feature = "rayon")))]
655impl<T> FromParallelIterator1<T> for Vec1<T>
656where
657 T: Send,
658{
659 fn from_par_iter1<I>(items: I) -> Self
660 where
661 I: IntoParallelIterator1<Item = T>,
662 {
663 unsafe { Vec1::from_vec_unchecked(items.into_par_iter().collect()) }
665 }
666}
667
668impl<T, I> Index<I> for Vec1<T>
669where
670 Vec<T>: Index<I>,
671{
672 type Output = <Vec<T> as Index<I>>::Output;
673
674 fn index(&self, at: I) -> &Self::Output {
675 self.items.index(at)
676 }
677}
678
679impl<T, I> IndexMut<I> for Vec1<T>
680where
681 Vec<T>: IndexMut<I>,
682{
683 fn index_mut(&mut self, at: I) -> &mut Self::Output {
684 self.items.index_mut(at)
685 }
686}
687
688impl<T> IntoIterator for Vec1<T> {
689 type Item = T;
690 type IntoIter = vec::IntoIter<T>;
691
692 fn into_iter(self) -> Self::IntoIter {
693 self.items.into_iter()
694 }
695}
696
697impl<'a, T> IntoIterator for &'a Vec1<T> {
698 type Item = &'a T;
699 type IntoIter = slice::Iter<'a, T>;
700
701 fn into_iter(self) -> Self::IntoIter {
702 self.items.iter()
703 }
704}
705
706impl<'a, T> IntoIterator for &'a mut Vec1<T> {
707 type Item = &'a mut T;
708 type IntoIter = slice::IterMut<'a, T>;
709
710 fn into_iter(self) -> Self::IntoIter {
711 self.items.iter_mut()
712 }
713}
714
715impl<T> IntoIterator1 for Vec1<T> {
716 fn into_iter1(self) -> Iterator1<Self::IntoIter> {
717 unsafe { Iterator1::from_iter_unchecked(self.items) }
719 }
720}
721
722impl<T> IntoIterator1 for &'_ Vec1<T> {
723 fn into_iter1(self) -> Iterator1<Self::IntoIter> {
724 self.iter1()
725 }
726}
727
728impl<T> IntoIterator1 for &'_ mut Vec1<T> {
729 fn into_iter1(self) -> Iterator1<Self::IntoIter> {
730 self.iter1_mut()
731 }
732}
733
734#[cfg(feature = "rayon")]
735#[cfg_attr(docsrs, doc(cfg(feature = "rayon")))]
736impl<T> IntoParallelIterator for Vec1<T>
737where
738 T: Send,
739{
740 type Item = T;
741 type Iter = <Vec<T> as IntoParallelIterator>::Iter;
742
743 fn into_par_iter(self) -> Self::Iter {
744 self.items.into_par_iter()
745 }
746}
747
748#[cfg(feature = "rayon")]
749#[cfg_attr(docsrs, doc(cfg(feature = "rayon")))]
750impl<'a, T> IntoParallelIterator for &'a Vec1<T>
751where
752 T: Sync,
753{
754 type Item = &'a T;
755 type Iter = <&'a Vec<T> as IntoParallelIterator>::Iter;
756
757 fn into_par_iter(self) -> Self::Iter {
758 (&self.items).into_par_iter()
759 }
760}
761
762#[cfg(feature = "rayon")]
763#[cfg_attr(docsrs, doc(cfg(feature = "rayon")))]
764impl<'a, T> IntoParallelIterator for &'a mut Vec1<T>
765where
766 T: Send,
767{
768 type Item = &'a mut T;
769 type Iter = <&'a mut Vec<T> as IntoParallelIterator>::Iter;
770
771 fn into_par_iter(self) -> Self::Iter {
772 (&mut self.items).into_par_iter()
773 }
774}
775
776#[cfg(feature = "rayon")]
777#[cfg_attr(docsrs, doc(cfg(feature = "rayon")))]
778impl<T> IntoParallelIterator1 for Vec1<T>
779where
780 T: Send,
781{
782 fn into_par_iter1(self) -> ParallelIterator1<Self::Iter> {
783 unsafe { ParallelIterator1::from_par_iter_unchecked(self.items) }
785 }
786}
787
788#[cfg(feature = "rayon")]
789#[cfg_attr(docsrs, doc(cfg(feature = "rayon")))]
790impl<T> IntoParallelIterator1 for &'_ Vec1<T>
791where
792 T: Sync,
793{
794 fn into_par_iter1(self) -> ParallelIterator1<Self::Iter> {
795 unsafe { ParallelIterator1::from_par_iter_unchecked(&self.items) }
797 }
798}
799
800#[cfg(feature = "rayon")]
801#[cfg_attr(docsrs, doc(cfg(feature = "rayon")))]
802impl<T> IntoParallelIterator1 for &'_ mut Vec1<T>
803where
804 T: Send,
805{
806 fn into_par_iter1(self) -> ParallelIterator1<Self::Iter> {
807 unsafe { ParallelIterator1::from_par_iter_unchecked(&mut self.items) }
809 }
810}
811
812#[cfg(feature = "schemars")]
813#[cfg_attr(docsrs, doc(cfg(feature = "schemars")))]
814impl<T> JsonSchema for Vec1<T>
815where
816 T: JsonSchema,
817{
818 fn schema_name() -> Cow<'static, str> {
819 Vec::<T>::schema_name()
820 }
821
822 fn json_schema(generator: &mut SchemaGenerator) -> Schema {
823 use crate::schemars;
824
825 schemars::json_subschema_with_non_empty_property_for::<Vec<T>>(
826 schemars::NON_EMPTY_KEY_ARRAY,
827 generator,
828 )
829 }
830
831 fn inline_schema() -> bool {
832 Vec::<T>::inline_schema()
833 }
834
835 fn schema_id() -> Cow<'static, str> {
836 Vec::<T>::schema_id()
837 }
838}
839
840crate::impl_partial_eq_for_non_empty!([for U, const N: usize in [U; N]] <= [for T in Vec1<T>]);
841crate::impl_partial_eq_for_non_empty!([for U, const N: usize in &[U; N]] <= [for T in Vec1<T>]);
842crate::impl_partial_eq_for_non_empty!([for U in [U]] <= [for T in Vec1<T>]);
843crate::impl_partial_eq_for_non_empty!([for U in &[U]] <= [for T in Vec1<T>]);
844crate::impl_partial_eq_for_non_empty!([for U in &mut [U]] <= [for T in Vec1<T>]);
845crate::impl_partial_eq_for_non_empty!([for U in &Slice1<U>] == [for T in Vec1<T>]);
846crate::impl_partial_eq_for_non_empty!([for U in &mut Slice1<U>] == [for T in Vec1<T>]);
847crate::impl_partial_eq_for_non_empty!([for U in Vec1<U>] => [for T in [T]]);
848crate::impl_partial_eq_for_non_empty!([for U in Vec1<U>] => [for T in &[T]]);
849crate::impl_partial_eq_for_non_empty!([for U in Vec1<U>] => [for T in &mut [T]]);
850crate::impl_partial_eq_for_non_empty!([for U in Vec1<U>] == [for T in &Slice1<T>]);
851crate::impl_partial_eq_for_non_empty!([for U in Vec1<U>] == [for T in &mut Slice1<T>]);
852
853impl<T> Segmentation for Vec1<T> {
854 type Kind = Self;
855 type Target = Vec<T>;
856}
857
858impl<'a, T> TryFrom<&'a [T]> for Vec1<T>
859where
860 T: Clone,
861{
862 type Error = EmptyError<&'a [T]>;
863
864 fn try_from(items: &'a [T]) -> Result<Self, Self::Error> {
865 Slice1::try_from_slice(items).map(Vec1::from)
866 }
867}
868
869impl<'a, T> TryFrom<&'a mut [T]> for Vec1<T>
870where
871 T: Clone,
872{
873 type Error = EmptyError<&'a mut [T]>;
874
875 fn try_from(items: &'a mut [T]) -> Result<Self, Self::Error> {
876 Slice1::try_from_mut_slice(items).map(Vec1::from)
877 }
878}
879
880impl<T> TryFrom<Vec<T>> for Vec1<T> {
881 type Error = EmptyError<Vec<T>>;
882
883 fn try_from(items: Vec<T>) -> Result<Self, Self::Error> {
884 FromMaybeEmpty::try_from_maybe_empty(items)
885 }
886}
887
888impl<'a, T> TryFrom<&'a Vec<T>> for &'a Vec1<T> {
889 type Error = EmptyError<&'a Vec<T>>;
890
891 fn try_from(items: &'a Vec<T>) -> Result<Self, Self::Error> {
892 FromMaybeEmpty::try_from_maybe_empty(items)
893 }
894}
895
896impl<'a, T> TryFrom<&'a mut Vec<T>> for &'a mut Vec1<T> {
897 type Error = EmptyError<&'a mut Vec<T>>;
898
899 fn try_from(items: &'a mut Vec<T>) -> Result<Self, Self::Error> {
900 FromMaybeEmpty::try_from_maybe_empty(items)
901 }
902}
903
904#[cfg(feature = "std")]
905#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
906impl Write for Vec1<u8> {
907 fn write(&mut self, buffer: &[u8]) -> io::Result<usize> {
908 self.items.extend_from_slice(buffer);
909 Ok(buffer.len())
910 }
911
912 fn write_vectored(&mut self, buffers: &[IoSlice<'_>]) -> io::Result<usize> {
913 let len = buffers.iter().map(|buffer| buffer.len()).sum();
914 self.items.reserve(len);
915 for buffer in buffers {
916 self.items.extend_from_slice(buffer);
917 }
918 Ok(len)
919 }
920
921 fn write_all(&mut self, buffer: &[u8]) -> io::Result<()> {
922 self.items.extend_from_slice(buffer);
923 Ok(())
924 }
925
926 fn flush(&mut self) -> io::Result<()> {
927 Ok(())
928 }
929}
930
931#[derive(Debug)]
932pub struct DrainSegment<'a, T> {
933 drain: Drain<'a, T>,
934 range: &'a mut IndexRange,
935 after: IndexRange,
936}
937
938impl<T> AsRef<[T]> for DrainSegment<'_, T> {
939 fn as_ref(&self) -> &[T] {
940 self.drain.as_ref()
941 }
942}
943
944impl<T> DoubleEndedIterator for DrainSegment<'_, T> {
945 fn next_back(&mut self) -> Option<Self::Item> {
946 self.drain.next_back()
947 }
948}
949
950impl<T> Drop for DrainSegment<'_, T> {
951 fn drop(&mut self) {
952 *self.range = self.after;
953 }
954}
955
956impl<T> ExactSizeIterator for DrainSegment<'_, T> {
957 fn len(&self) -> usize {
958 self.drain.len()
959 }
960}
961
962impl<T> FusedIterator for DrainSegment<'_, T> {}
963
964impl<T> Iterator for DrainSegment<'_, T> {
965 type Item = T;
966
967 fn next(&mut self) -> Option<Self::Item> {
968 self.drain.next()
969 }
970}
971
972#[derive(Debug)]
973pub struct SwapDrainSegment<'a, T> {
974 drain: DrainSegment<'a, T>,
975 swapped: Option<T>,
976}
977
978impl<T> DoubleEndedIterator for SwapDrainSegment<'_, T> {
979 fn next_back(&mut self) -> Option<Self::Item> {
980 let next = self.drain.next();
981 next.or_else(|| self.swapped.take())
982 }
983}
984
985impl<T> ExactSizeIterator for SwapDrainSegment<'_, T> {
986 fn len(&self) -> usize {
987 self.drain
988 .len()
989 .checked_add(if self.swapped.is_some() { 1 } else { 0 })
990 .expect("overflow in iterator length")
991 }
992}
993
994impl<T> FusedIterator for SwapDrainSegment<'_, T> {}
995
996impl<T> Iterator for SwapDrainSegment<'_, T> {
997 type Item = T;
998
999 fn next(&mut self) -> Option<Self::Item> {
1000 let swapped = self.swapped.take();
1001 swapped.or_else(|| self.drain.next())
1002 }
1003}
1004
1005pub type Segment<'a, K> = segment::Segment<'a, K, Vec<ItemFor<K>>, IndexRange>;
1006
1007impl<T> Segment<'_, Vec<T>> {
1008 pub fn drain<R>(&mut self, range: R) -> DrainSegment<'_, T>
1009 where
1010 IndexRange: Project<R, Output = IndexRange, Error = RangeError<usize>>,
1011 R: RangeBounds<usize>,
1012 {
1013 let DrainRange {
1014 intersection,
1015 before,
1016 after,
1017 } = DrainRange::project_and_intersect(self.range, range).expect("invalid drain range");
1018 self.range = before;
1019 DrainSegment {
1020 drain: self.items.drain(intersection),
1021 range: &mut self.range,
1022 after,
1023 }
1024 }
1025}
1026
1027impl<T> Segment<'_, Vec1<T>> {
1028 pub fn swap_drain<R>(&mut self, range: R) -> SwapDrainSegment<'_, T>
1033 where
1034 IndexRange: Project<R, Output = IndexRange, Error = RangeError<usize>>,
1035 R: RangeBounds<usize>,
1036 {
1037 let DrainRange {
1038 mut intersection,
1039 before,
1040 after,
1041 } = DrainRange::project_and_intersect(self.range, range).expect("invalid drain range");
1042 if self.range.is_prefix() && intersection.is_prefix() {
1043 self.items
1056 .as_mut_slice()
1057 .swap(intersection.start(), intersection.end());
1058 intersection.advance_by(1);
1059 self.range = before;
1060 let mut drain = DrainSegment {
1061 drain: self.items.drain(intersection),
1062 range: &mut self.range,
1063 after,
1064 };
1065 let swapped = drain.next_back();
1066 SwapDrainSegment { drain, swapped }
1067 }
1068 else {
1069 self.range = before;
1070 SwapDrainSegment {
1071 drain: DrainSegment {
1072 drain: self.items.drain(intersection),
1073 range: &mut self.range,
1074 after,
1075 },
1076 swapped: None,
1077 }
1078 }
1079 }
1080}
1081
1082impl<K, T> Segment<'_, K>
1083where
1084 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1085{
1086 pub fn split_off(&mut self, at: usize) -> Vec<T> {
1087 let at = self
1088 .range
1089 .project(at)
1090 .unwrap_or_else(|_| range::panic_index_out_of_bounds());
1091 let range = IndexRange::unchecked(at, self.range.end());
1092 let items = self.items.drain(range).collect();
1093 self.range = range;
1094 items
1095 }
1096
1097 pub fn resize(&mut self, len: usize, fill: T)
1098 where
1099 T: Clone,
1100 {
1101 self.resize_with(len, move || fill.clone())
1102 }
1103
1104 pub fn resize_with<F>(&mut self, len: usize, f: F)
1105 where
1106 F: FnMut() -> T,
1107 {
1108 let from = self.len();
1109 let to = len;
1110 if to > from {
1111 let n = to - from;
1112 self.extend(iter::repeat_with(f).take(n))
1113 }
1114 else {
1115 self.truncate(to)
1116 }
1117 }
1118
1119 pub fn truncate(&mut self, len: usize) {
1120 if let Some(range) = self.range.truncate_from_end(len) {
1121 self.items.drain(range);
1122 }
1123 }
1124
1125 pub fn retain<F>(&mut self, mut f: F)
1126 where
1127 F: FnMut(&T) -> bool,
1128 {
1129 self.retain_mut(move |item| f(&*item))
1130 }
1131
1132 pub fn retain_mut<F>(&mut self, f: F)
1133 where
1134 F: FnMut(&mut T) -> bool,
1135 {
1136 self.items.retain_mut(self.range.retain_mut_from_end(f))
1137 }
1138
1139 pub fn insert(&mut self, index: usize, item: T) {
1140 let index = self
1141 .range
1142 .project(index)
1143 .unwrap_or_else(|_| range::panic_index_out_of_bounds());
1144 self.items.insert(index, item);
1145 self.range.put_from_end(1);
1146 }
1147
1148 pub fn insert_back(&mut self, item: T) {
1149 self.items.insert(self.range.end(), item);
1150 self.range.put_from_end(1);
1151 }
1152
1153 pub fn remove(&mut self, index: usize) -> T {
1154 let index = self
1155 .range
1156 .project(index)
1157 .unwrap_or_else(|_| range::panic_index_out_of_bounds());
1158 let item = self.items.remove(index);
1159 self.range.take_from_end(1);
1160 item
1161 }
1162
1163 pub fn remove_back(&mut self) -> Option<T> {
1164 if self.range.is_empty() {
1165 None
1166 }
1167 else {
1168 let item = self.items.remove(self.range.end() - 1);
1169 self.range.take_from_end(1);
1170 Some(item)
1171 }
1172 }
1173
1174 pub fn swap_remove(&mut self, index: usize) -> T {
1175 if self.range.is_empty() {
1176 range::panic_index_out_of_bounds()
1177 }
1178 else {
1179 let index = self
1180 .range
1181 .project(index)
1182 .unwrap_or_else(|_| range::panic_index_out_of_bounds());
1183 let swapped = self.range.end() - 1;
1184 self.items.as_mut_slice().swap(index, swapped);
1185 let item = self.items.remove(swapped);
1186 self.range.take_from_end(1);
1187 item
1188 }
1189 }
1190
1191 pub fn clear(&mut self) {
1192 self.items.drain(self.range.get_and_clear_from_end());
1193 }
1194
1195 pub fn len(&self) -> usize {
1196 self.range.len()
1197 }
1198
1199 pub fn iter(&self) -> Take<Skip<slice::Iter<'_, T>>> {
1200 self.items.iter().skip(self.range.start()).take(self.len())
1201 }
1202
1203 pub fn iter_mut(&mut self) -> Take<Skip<slice::IterMut<'_, T>>> {
1204 let body = self.len();
1205 self.items.iter_mut().skip(self.range.start()).take(body)
1206 }
1207
1208 pub fn as_slice(&self) -> &[T] {
1209 &self.items.as_slice()[self.range.start()..self.range.end()]
1210 }
1211
1212 pub fn as_mut_slice(&mut self) -> &mut [T] {
1213 &mut self.items.as_mut_slice()[self.range.start()..self.range.end()]
1214 }
1215
1216 pub fn as_ptr(&self) -> *const T {
1217 self.as_slice().as_ptr()
1218 }
1219
1220 pub fn as_mut_ptr(&mut self) -> *mut T {
1221 self.as_mut_slice().as_mut_ptr()
1222 }
1223
1224 pub fn is_empty(&self) -> bool {
1225 self.len() == 0
1226 }
1227}
1228
1229impl<K, T> AsMut<[T]> for Segment<'_, K>
1230where
1231 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1232{
1233 fn as_mut(&mut self) -> &mut [T] {
1234 self.as_mut_slice()
1235 }
1236}
1237
1238impl<K, T> AsRef<[T]> for Segment<'_, K>
1239where
1240 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1241{
1242 fn as_ref(&self) -> &[T] {
1243 self.as_slice()
1244 }
1245}
1246
1247impl<K, T> Borrow<[T]> for Segment<'_, K>
1248where
1249 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1250{
1251 fn borrow(&self) -> &[T] {
1252 self.as_slice()
1253 }
1254}
1255
1256impl<K, T> BorrowMut<[T]> for Segment<'_, K>
1257where
1258 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1259{
1260 fn borrow_mut(&mut self) -> &mut [T] {
1261 self.as_mut_slice()
1262 }
1263}
1264
1265impl<K, T, R> ByRange<usize, R> for Segment<'_, K>
1266where
1267 IndexRange: Project<R, Output = IndexRange, Error = RangeError<usize>>,
1268 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1269 R: RangeBounds<usize>,
1270{
1271 type Range = IndexRange;
1272 type Error = RangeError<usize>;
1273
1274 fn segment(&mut self, range: R) -> Result<Segment<'_, K>, Self::Error> {
1275 self.project_and_intersect(range)
1276 }
1277}
1278
1279impl<K, T> ByTail for Segment<'_, K>
1280where
1281 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1282{
1283 type Range = IndexRange;
1284
1285 fn tail(&mut self) -> Segment<'_, K> {
1286 self.project_tail_range()
1287 }
1288
1289 fn rtail(&mut self) -> Segment<'_, K> {
1290 let n = self.len();
1291 self.project_rtail_range(n)
1292 }
1293}
1294
1295impl<K, T> Deref for Segment<'_, K>
1296where
1297 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1298{
1299 type Target = [T];
1300
1301 fn deref(&self) -> &Self::Target {
1302 self.as_slice()
1303 }
1304}
1305
1306impl<K, T> DerefMut for Segment<'_, K>
1307where
1308 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1309{
1310 fn deref_mut(&mut self) -> &mut Self::Target {
1311 self.as_mut_slice()
1312 }
1313}
1314
1315impl<K, T> Eq for Segment<'_, K>
1316where
1317 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1318 T: Eq,
1319{
1320}
1321
1322impl<K, T> Extend<T> for Segment<'_, K>
1323where
1324 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1325{
1326 fn extend<I>(&mut self, items: I)
1327 where
1328 I: IntoIterator<Item = T>,
1329 {
1330 let n = self.items.len();
1331 let tail = self.items.split_off(self.range.end());
1335 self.items.extend(items);
1336 self.items.extend(tail);
1337 let n = self.items.len() - n;
1338 self.range.put_from_end(n);
1339 }
1340}
1341
1342impl<K, T> Ord for Segment<'_, K>
1362where
1363 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1364 T: Ord,
1365{
1366 fn cmp(&self, other: &Self) -> Ordering {
1367 self.as_slice().cmp(other.as_slice())
1368 }
1369}
1370
1371impl<'a, KT, KU, T, U> PartialEq<Segment<'a, KU>> for Segment<'a, KT>
1372where
1373 KT: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1374 KU: ClosedVec<Item = U> + Segmentation<Target = Vec<U>>,
1375 T: PartialEq<U>,
1376{
1377 fn eq(&self, other: &Segment<'a, KU>) -> bool {
1378 self.as_slice().eq(other.as_slice())
1379 }
1380}
1381
1382impl<K, T> PartialOrd<Self> for Segment<'_, K>
1383where
1384 K: ClosedVec<Item = T> + Segmentation<Target = Vec<T>>,
1385 T: PartialOrd<T>,
1386{
1387 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1388 self.as_slice().partial_cmp(other.as_slice())
1389 }
1390}
1391
1392#[derive(Debug)]
1393struct DrainRange {
1394 intersection: IndexRange,
1395 before: IndexRange,
1396 after: IndexRange,
1397}
1398
1399impl DrainRange {
1400 fn project_and_intersect<R>(segment: IndexRange, range: R) -> Result<Self, RangeError<usize>>
1401 where
1402 IndexRange: Project<R, Output = IndexRange, Error = RangeError<usize>>,
1403 R: RangeBounds<usize>,
1404 {
1405 let intersection = segment.intersect(segment.project(range)?)?;
1406 let before = IndexRange::unchecked(
1407 segment.start(),
1408 intersection
1409 .start()
1410 .checked_add(1)
1411 .unwrap_or_else(|| range::panic_end_overflow()),
1412 );
1413 let after = IndexRange::unchecked(segment.start(), segment.end() - intersection.len());
1414 Ok(DrainRange {
1415 intersection,
1416 before,
1417 after,
1418 })
1419 }
1420}
1421
1422#[macro_export]
1423macro_rules! vec1 {
1424 ($($item:expr $(,)?)+) => {{
1425 extern crate alloc;
1426
1427 let items = alloc::vec![$($item,)+];
1428 unsafe { $crate::vec1::Vec1::from_vec_unchecked(items) }
1430 }};
1431 ($item:expr ; $N:expr) => {{
1432 extern crate alloc;
1433
1434 const fn non_zero_usize_capacity<const N: usize>()
1435 where
1436 [(); N]: $crate::array1::Array1,
1437 {}
1438 non_zero_usize_capacity::<$N>();
1439
1440 let items = alloc::vec![$item; $N];
1441 unsafe { $crate::vec1::Vec1::from_vec_unchecked(items) }
1443 }};
1444}
1445pub use vec1;
1446
1447#[cfg(test)]
1448pub mod harness {
1449 use rstest::fixture;
1450
1451 use crate::iter1::{self, FromIterator1};
1452 use crate::vec1::Vec1;
1453
1454 #[fixture]
1455 pub fn xs1(#[default(4)] end: u8) -> Vec1<u8> {
1456 Vec1::from_iter1(iter1::harness::xs1(end))
1457 }
1458}
1459
1460#[cfg(test)]
1461mod tests {
1462 use alloc::vec;
1463 use alloc::vec::Vec;
1464 use core::iter;
1465 use core::mem;
1466 use core::ops::RangeBounds;
1467 use rstest::rstest;
1468 #[cfg(feature = "serde")]
1469 use serde_test::Token;
1470
1471 use crate::iter1::IntoIterator1;
1472 #[cfg(feature = "schemars")]
1473 use crate::schemars;
1474 use crate::segment::range::{IndexRange, Project, RangeError};
1475 use crate::segment::{ByRange, ByTail};
1476 #[cfg(feature = "serde")]
1477 use crate::serde::{self, harness::sequence};
1478 use crate::slice1::{Slice1, slice1};
1479 use crate::vec1::Vec1;
1480 use crate::vec1::harness::{self, xs1};
1481
1482 #[rstest]
1483 fn vec1_from_vec_macro_eq_vec1_from_vec1_macro_by_rep_expr() {
1484 assert_eq!(
1485 Vec1::try_from(vec![0u8, 1, 2, 3]).unwrap(),
1486 vec1![0u8, 1, 2, 3],
1487 );
1488 }
1489
1490 #[rstest]
1491 fn vec1_from_vec_macro_eq_vec1_from_vec1_macro_by_expr_literal() {
1492 assert_eq!(Vec1::try_from(vec![0u8; 4]).unwrap(), vec1![0u8; 4]);
1493 }
1494
1495 #[rstest]
1499 #[case::ignore_and_retain(|_| true, (None, slice1![0, 1, 2, 3, 4]))]
1500 #[case::ignore_and_do_not_retain(|_| false, (Some(4), slice1![4]))]
1501 #[case::compare_and_retain_none(
1502 |x: *const _| unsafe {
1503 *x > 4
1504 },
1505 (Some(4), slice1![4]),
1506 )]
1507 #[case::compare_and_retain_some(
1508 |x: *const _| unsafe {
1509 *x < 3
1510 },
1511 (None, slice1![0, 1, 2]),
1512 )]
1513 fn retain_until_only_from_vec1_then_output_and_vec1_eq<F>(
1514 mut xs1: Vec1<u8>,
1515 #[case] mut f: F,
1516 #[case] expected: (Option<u8>, &Slice1<u8>),
1517 ) where
1518 F: FnMut(*const u8) -> bool,
1519 {
1520 let x = xs1.retain_until_only(|x| f(x as *const u8)).copied();
1526 assert_eq!((x, xs1.as_slice1()), expected);
1527 }
1528
1529 #[rstest]
1530 fn pop_if_many_from_vec1_until_and_after_only_then_vec1_eq_first(mut xs1: Vec1<u8>) {
1531 let first = *xs1.first();
1532 let mut tail = xs1.as_slice()[1..].to_vec();
1533 while let Ok(item) = xs1.pop_if_many().or_get_only() {
1534 assert_eq!(tail.pop().unwrap(), item);
1535 }
1536 for _ in 0..3 {
1537 assert_eq!(xs1.pop_if_many().or_get_only(), Err(&first));
1538 }
1539 assert_eq!(xs1.as_slice(), &[first]);
1540 }
1541
1542 #[rstest]
1546 #[case::ignore_and_pop(|_| true, (Some(4), slice1![0, 1, 2, 3]))]
1547 #[case::ignore_and_do_not_pop(|_| false, (None, slice1![0, 1, 2, 3, 4]))]
1548 #[case::compare_and_pop(|x: *mut _| unsafe { *x > 1 }, (Some(4), slice1![0, 1, 2, 3]))]
1549 #[case::compare_and_do_not_pop(|x: *mut _| unsafe { *x < 1 }, (None, slice1![0, 1, 2, 3, 4]))]
1550 #[case::mutate_and_pop(
1551 |x: *mut _| unsafe {
1552 *x = 42;
1553 true
1554 },
1555 (Some(42), slice1![0, 1, 2, 3]),
1556 )]
1557 #[case::mutate_and_do_not_pop(
1558 |x: *mut _| unsafe {
1559 *x = 42;
1560 false
1561 },
1562 (None, slice1![0, 1, 2, 3, 42]),
1563 )]
1564 fn pop_if_many_and_from_vec1_then_popped_and_vec1_eq<F>(
1565 mut xs1: Vec1<u8>,
1566 #[case] f: F,
1567 #[case] expected: (Option<u8>, &Slice1<u8>),
1568 ) where
1569 F: FnOnce(*mut u8) -> bool,
1570 {
1571 let x = xs1.pop_if_many_and(|x| f(x as *mut u8));
1577 assert_eq!((x, xs1.as_slice1()), expected);
1578 }
1579
1580 #[rstest]
1581 #[case::empty_at_front(0..0, &[])]
1582 #[case::empty_at_back(4..4, &[])]
1583 #[case::one_at_front(0..1, &[0])]
1584 #[case::one_at_back(4.., &[4])]
1585 #[case::middle(1..4, &[1, 2, 3])]
1586 #[case::tail(1.., &[1, 2, 3, 4])]
1587 #[case::rtail(..4, &[0, 1, 2, 3])]
1588 fn collect_segment_iter_of_vec1_into_vec_then_eq<R>(
1589 mut xs1: Vec1<u8>,
1590 #[case] range: R,
1591 #[case] expected: &[u8],
1592 ) where
1593 R: RangeBounds<usize>,
1594 {
1595 let xss = xs1.segment(range).unwrap();
1596 let xs: Vec<_> = xss.iter().copied().collect();
1597 assert_eq!(xs.as_slice(), expected);
1598 }
1599
1600 #[rstest]
1601 #[case::one_into_empty_front(0..0, [42], slice1![42, 0, 1, 2, 3, 4])]
1602 #[case::many_into_empty_front(0..0, [42, 88], slice1![42, 88, 0, 1, 2, 3, 4])]
1603 #[case::one_into_empty_back(5..5, [42], slice1![0, 1, 2, 3, 4, 42])]
1604 #[case::many_into_empty_back(5..5, [42, 88], slice1![0, 1, 2, 3, 4, 42, 88])]
1605 #[case::one_into_empty_middle(2..2, [42], slice1![0, 1, 42, 2, 3, 4])]
1606 #[case::many_into_empty_middle(2..2, [42, 88], slice1![0, 1, 42, 88, 2, 3, 4])]
1607 #[case::one_into_non_empty(0..2, [42], slice1![0, 1, 42, 2, 3, 4])]
1608 #[case::many_into_non_empty(0..2, [42, 88], slice1![0, 1, 42, 88, 2, 3, 4])]
1609 fn insert_back_into_vec1_segment_then_vec1_eq<R, T>(
1610 mut xs1: Vec1<u8>,
1611 #[case] range: R,
1612 #[case] items: T,
1613 #[case] expected: &Slice1<u8>,
1614 ) where
1615 R: RangeBounds<usize>,
1616 T: IntoIterator1<Item = u8>,
1617 {
1618 let mut xss = xs1.segment(range).unwrap();
1619 for item in items {
1620 xss.insert_back(item);
1621 }
1622 assert_eq!(xs1.as_slice1(), expected);
1623 }
1624
1625 #[rstest]
1626 #[case::empty_tail(harness::xs1(0))]
1627 #[case::one_tail(harness::xs1(1))]
1628 #[case::many_tail(harness::xs1(2))]
1629 fn remove_back_all_from_tail_of_vec1_then_vec1_eq_head(#[case] mut xs1: Vec1<u8>) {
1630 let n = xs1.len().get();
1631 let mut tail = xs1.tail();
1632 iter::from_fn(|| tail.remove_back())
1633 .take(n)
1634 .for_each(|_| {});
1635 assert!(tail.is_empty());
1636 assert_eq!(xs1.as_slice(), &[0]);
1637 }
1638
1639 #[rstest]
1640 #[case::empty_tail(harness::xs1(0))]
1641 #[case::one_tail(harness::xs1(1))]
1642 #[case::many_tail(harness::xs1(2))]
1643 fn clear_tail_of_vec1_then_vec1_eq_head(#[case] mut xs1: Vec1<u8>) {
1644 xs1.tail().clear();
1645 assert_eq!(xs1.as_slice(), &[0]);
1646 }
1647
1648 #[rstest]
1649 #[case::empty_rtail(harness::xs1(0))]
1650 #[case::one_rtail(harness::xs1(1))]
1651 #[case::many_rtail(harness::xs1(2))]
1652 fn clear_rtail_of_vec1_then_vec1_eq_tail(#[case] mut xs1: Vec1<u8>) {
1653 let tail = *xs1.last();
1654 xs1.rtail().clear();
1655 assert_eq!(xs1.as_slice(), &[tail]);
1656 }
1657
1658 #[rstest]
1659 #[case::empty_tail(harness::xs1(0))]
1660 #[case::one_tail_empty_rtail(harness::xs1(1))]
1661 #[case::many_tail_one_rtail(harness::xs1(2))]
1662 #[case::many_tail_many_rtail(harness::xs1(3))]
1663 fn clear_tail_rtail_of_vec1_then_vec1_eq_head_and_tail(#[case] mut xs1: Vec1<u8>) {
1664 let n = xs1.len().get();
1665 let head_and_tail = [0, *xs1.last()];
1666 xs1.tail().rtail().clear();
1667 assert_eq!(
1668 xs1.as_slice(),
1669 if n > 1 {
1670 &head_and_tail[..]
1671 }
1672 else {
1673 &head_and_tail[..1]
1674 }
1675 );
1676 }
1677
1678 #[rstest]
1679 #[case::tail(harness::xs1(3), 1..)]
1680 #[case::rtail(harness::xs1(3), ..3)]
1681 #[case::middle(harness::xs1(9), 4..8)]
1682 fn retain_none_from_vec1_segment_then_segment_is_empty<R>(
1683 #[case] mut xs1: Vec1<u8>,
1684 #[case] range: R,
1685 ) where
1686 R: RangeBounds<usize>,
1687 {
1688 let mut xss = xs1.segment(range).unwrap();
1689 xss.retain(|_| false);
1690 assert!(xss.is_empty());
1691 }
1692
1693 #[rstest]
1694 #[case::tail(harness::xs1(3), 1.., slice1![0])]
1695 #[case::rtail(harness::xs1(3), ..3, slice1![3])]
1696 #[case::middle(harness::xs1(9), 4..8, slice1![0, 1, 2, 3, 8, 9])]
1697 fn retain_none_from_vec1_segment_then_vec1_eq<R>(
1698 #[case] mut xs1: Vec1<u8>,
1699 #[case] range: R,
1700 #[case] expected: &Slice1<u8>,
1701 ) where
1702 R: RangeBounds<usize>,
1703 {
1704 xs1.segment(range).unwrap().retain(|_| false);
1705 assert_eq!(xs1.as_slice1(), expected);
1706 }
1707
1708 #[rstest]
1709 #[case::empty_tail(harness::xs1(0), 1.., .., slice1![0])]
1710 #[case::one_tail(harness::xs1(1), 1.., .., slice1![0])]
1711 #[case::many_tail(harness::xs1(2), 1.., .., slice1![0])]
1712 #[case::many_tail(harness::xs1(2), 1.., 1.., slice1![0, 1])]
1713 #[case::many_tail(harness::xs1(2), 1.., ..1, slice1![0, 2])]
1714 #[case::empty_rtail(harness::xs1(0), ..0, .., slice1![0])]
1715 #[case::one_rtail(harness::xs1(1), ..1, .., slice1![1])]
1716 #[case::many_rtail(harness::xs1(2), ..2, .., slice1![2])]
1717 #[case::many_rtail(harness::xs1(2), ..2, 1.., slice1![0, 2])]
1718 fn swap_drain_from_vec1_segment_then_vec1_eq<S, D>(
1719 #[case] mut xs1: Vec1<u8>,
1720 #[case] segment: S,
1721 #[case] drain: D,
1722 #[case] expected: &Slice1<u8>,
1723 ) where
1724 IndexRange: Project<D, Output = IndexRange, Error = RangeError<usize>>,
1725 S: RangeBounds<usize>,
1726 D: RangeBounds<usize>,
1727 {
1728 xs1.segment(segment).unwrap().swap_drain(drain);
1729 assert_eq!(xs1.as_slice1(), expected);
1730 }
1731
1732 #[rstest]
1733 #[case::empty_tail(harness::xs1(0), 1.., .., slice1![0])]
1734 #[case::one_tail(harness::xs1(1), 1.., .., slice1![0])]
1735 #[case::many_tail(harness::xs1(2), 1.., .., slice1![0])]
1736 #[case::many_tail(harness::xs1(2), 1.., 1.., slice1![0, 1])]
1737 #[case::empty_rtail(harness::xs1(0), ..0, .., slice1![0])]
1738 #[case::one_rtail(harness::xs1(1), ..1, .., slice1![1])]
1739 #[case::many_rtail(harness::xs1(2), ..2, .., slice1![2])]
1740 #[case::many_rtail(harness::xs1(2), ..2, 1.., slice1![0])]
1741 fn leak_swap_drain_of_vec1_segment_then_vec1_eq<S, D>(
1742 #[case] mut xs1: Vec1<u8>,
1743 #[case] segment: S,
1744 #[case] drain: D,
1745 #[case] expected: &Slice1<u8>,
1746 ) where
1747 IndexRange: Project<D, Output = IndexRange, Error = RangeError<usize>>,
1748 S: RangeBounds<usize>,
1749 D: RangeBounds<usize>,
1750 {
1751 let mut xss = xs1.segment(segment).unwrap();
1752 mem::forget(xss.swap_drain(drain));
1753 assert_eq!(xs1.as_slice1(), expected);
1754 }
1755
1756 #[cfg(feature = "schemars")]
1757 #[rstest]
1758 fn vec1_json_schema_has_non_empty_property() {
1759 schemars::harness::assert_json_schema_has_non_empty_property::<Vec1<u8>>(
1760 schemars::NON_EMPTY_KEY_ARRAY,
1761 );
1762 }
1763
1764 #[cfg(feature = "serde")]
1765 #[rstest]
1766 fn de_serialize_vec1_into_and_from_tokens_eq(
1767 xs1: Vec1<u8>,
1768 sequence: impl Iterator<Item = Token>,
1769 ) {
1770 serde::harness::assert_into_and_from_tokens_eq::<_, Vec<_>>(xs1, sequence)
1771 }
1772
1773 #[cfg(feature = "serde")]
1774 #[rstest]
1775 fn deserialize_vec1_from_empty_tokens_then_empty_error(
1776 #[with(0)] sequence: impl Iterator<Item = Token>,
1777 ) {
1778 serde::harness::assert_deserialize_error_eq_empty_error::<Vec1<u8>, Vec<_>>(sequence)
1779 }
1780}
1781
1782mod _compile_fail_tests {
1783 #[doc(hidden)]
1787 const fn _empty_rep_expr_metaparameters_then_vec1_compilation_fails() {}
1788
1789 #[doc(hidden)]
1793 const fn _empty_expr_count_metaparameters_then_vec1_compilation_fails() {}
1794}