mitsein/
vec1.rs

1//! A non-empty [`Vec`][`vec`].
2
3#![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        // SAFETY: The input iterator `items` is non-empty and `extend` either pushes one or more
93        //         items or panics, so `self` must be non-empty here.
94        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    /// # Safety
153    ///
154    /// `items` must be non-empty. For example, it is unsound to call this function with the
155    /// immediate output of [`Vec::new()`][`Vec::new`].
156    ///
157    /// [`Vec::new`]: alloc::vec::Vec::new
158    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        // SAFETY: The input iterator `items` is non-empty and `extend` either pushes one or more
180        //         items or panics, so `items` must be non-empty here.
181        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        // SAFETY: `self` must be non-empty.
213        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        // SAFETY: `self` must be non-empty.
223        unsafe { BoxedSlice1::from_boxed_slice_unchecked(self.items.into_boxed_slice()) }
224    }
225
226    pub fn leak<'a>(self) -> &'a mut Slice1<T> {
227        // SAFETY: `self` must be non-empty.
228        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                // The last item is **not** retained and there is more than one item.
250                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        // SAFETY: `with` executes this closure only if `self` contains more than one item.
301        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        // SAFETY: `self` must be non-empty.
349        unsafe { NonZeroUsize::new_maybe_unchecked(self.items.len()) }
350    }
351
352    pub fn capacity(&self) -> NonZeroUsize {
353        // SAFETY: `self` must be non-empty.
354        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    /// # Safety
362    ///
363    /// The [`Vec`] behind the returned mutable reference **must not** be empty when the reference
364    /// is dropped. Consider the following example:
365    ///
366    /// ```rust,no_run
367    /// use mitsein::prelude::*;
368    ///
369    /// let mut xs = vec1![0i32, 1, 2, 3];
370    /// // This block is unsound. The `&mut Vec<_>` is dropped in the block and so `xs` can be
371    /// // freely manipulated after the block despite violation of the non-empty guarantee.
372    /// unsafe {
373    ///     xs.as_mut_vec().clear();
374    /// }
375    /// let x = xs.first(); // Undefined behavior!
376    /// ```
377    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        // SAFETY: `self` must be non-empty.
383        unsafe { Slice1::from_slice_unchecked(self.items.as_slice()) }
384    }
385
386    pub fn as_mut_slice1(&mut self) -> &mut Slice1<T> {
387        // SAFETY: `self` must be non-empty.
388        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
400// A bound `[T; N]: Array1` is not necessary here, because `Vec::into_flattened` panics when `N` is
401// zero. See below.
402impl<T, const N: usize> Vec1<[T; N]> {
403    pub fn into_flattened(self) -> Vec1<T> {
404        // SAFETY: `self` must be non-empty and `Vec::into_flattened` panics if `N` is zero, so the
405        //         flattened `Vec` cannot be empty.
406        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        // SAFETY: `items` must be non-empty.
556        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        // SAFETY: `items` must be non-empty.
567        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        // SAFETY: `items` must be non-empty.
584        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        // SAFETY: `items` must be non-empty.
603        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        // SAFETY: `items` must be non-empty.
619        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        // SAFETY: `items` must be non-empty.
626        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        // SAFETY: `items` must be non-empty.
639        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        // SAFETY: `items` must be non-empty.
649        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        // SAFETY: `items` must be non-empty.
664        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        // SAFETY: `self` must be non-empty.
718        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        // SAFETY: `self` must be non-empty.
784        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        // SAFETY: `self` must be non-empty.
796        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        // SAFETY: `self` must be non-empty.
808        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    // This implementation, like `DrainSegment`, assumes that no items before the start of the
1029    // drain range are ever forgotten in the target `Vec`. The `Vec` documentation does not specify
1030    // this, but the implementation behaves this way and it is very reasonable behavior that is
1031    // very unlikely to change. This API is unsound if this assumption does not hold.
1032    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            // If both the segment and drain ranges are prefixes, then the target `Vec` may be left
1044            // empty if the drain iterator leaks (e.g., via `mem::forget`). Before the drain
1045            // operation begins and data beyond the start of the drain range may be left
1046            // uninitialized, the target `Vec` and drain must be configured such that the non-empty
1047            // invariant cannot be compromised.
1048            //
1049            // Because the segment is a prefix and strict subset of a `Vec1`, this code can assume
1050            // that there is at least one item beyond the end of the drain range. This item is
1051            // swapped with the first in the target `Vec` and the drain range is advanced by one.
1052            // This guarantees that the target `Vec` is not empty if the drain iterator leaks. If
1053            // the drain iterator is dropped, its range is removed from the target `Vec` and its
1054            // remainder is restored with the swapped item in the correct position.
1055            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        // Split off the remainder beyond the segment to avoid spurious inserts and copying. This
1332        // comes at the cost of a necessary allocation and bulk copy, which isn't great when
1333        // extending from a small number of items with a small remainder.
1334        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
1342// TODO: At time of writing, this implementation conflicts with the `Extend` implementation above
1343//       (E0119). However, `T` does not generalize `&'i T` here, because the associated `Target`
1344//       type is the same (`Vec<T>`) in both implementations (and a reference would be added to all
1345//       `T`)! This appears to be a limitation rather than a true conflict. See other segment
1346//       implementations as well.
1347//
1348// impl<'i, K, T> Extend<&'i T> for Segment<'_, K>
1349// where
1350//     K: ClosedVec<Item = T> + SegmentedOver<Target = Vec<T>>,
1351//     T: 'i + Copy,
1352// {
1353//     fn extend<I>(&mut self, items: I)
1354//     where
1355//         I: IntoIterator<Item = &'i T>,
1356//     {
1357//         self.extend(items.into_iter().copied())
1358//     }
1359// }
1360
1361impl<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        // SAFETY: There must be one or more `item` metavariables in the repetition.
1429        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        // SAFETY: The literal `$N` is non-zero.
1442        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    // SAFETY: The `FnMut`s constructed in cases (the parameter `f`) must not stash or otherwise
1496    //         allow access to the parameter beyond the scope of their bodies. (This is difficult
1497    //         to achieve in this context.)
1498    #[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        // TODO: The type parameter `F` must be a `FnMut` over `*const u8` instead of `&u8` here,
1521        //       because `rstest` constructs the case in a way that the `&u8` has a lifetime that
1522        //       is too specific and too long (it would borrow the item beyond
1523        //       `retain_until_only`). Is there a way to prevent this without introducing `*const
1524        //       u8` and unsafe code in cases for `f`? If so, do that instead!
1525        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    // SAFETY: The `FnOnce`s constructed in cases (the parameter `f`) must not stash or otherwise
1543    //         allow access to the parameter beyond the scope of their bodies. (This is difficult
1544    //         to achieve in this context.)
1545    #[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        // TODO: The type parameter `F` must be a `FnOnce` over `*mut u8` instead of `&mut u8`
1572        //       here, because `rstest` constructs the case in a way that the `&mut u8` has a
1573        //       lifetime that is too specific and too long (it would borrow the item beyond
1574        //       `pop_if_many_and`). Is there a way to prevent this without introducing `*mut u8`
1575        //       and unsafe code in cases for `f`? If so, do that instead!
1576        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    /// ```compile_fail
1784    /// let xs = mitsein::vec1![];
1785    /// ```
1786    #[doc(hidden)]
1787    const fn _empty_rep_expr_metaparameters_then_vec1_compilation_fails() {}
1788
1789    /// ```compile_fail,E0277
1790    /// let xs = mitsein::vec1![0u8; 0];
1791    /// ```
1792    #[doc(hidden)]
1793    const fn _empty_expr_count_metaparameters_then_vec1_compilation_fails() {}
1794}