@@ -462,6 +462,40 @@ impl<T> VecSet<T> {
462
462
pub fn into_vec ( self ) -> Vec < T > {
463
463
self . into_iter ( ) . collect ( )
464
464
}
465
+
466
+ /// Takes ownership of provided vector and converts it into `VecSet`.
467
+ ///
468
+ /// # Safety
469
+ ///
470
+ /// The vector must have no duplicate elements. One way to guarantee it is to sort the vector
471
+ /// (e.g. by using [`[T]::sort`][slice-sort]) and then drop duplicate elements (e.g. by using
472
+ /// [`Vec::dedup`]).
473
+ ///
474
+ /// # Example
475
+ ///
476
+ /// ```
477
+ /// use vecmap::VecSet;
478
+ ///
479
+ /// let mut vec = vec!["b", "a", "c", "b"];
480
+ /// vec.sort();
481
+ /// vec.dedup();
482
+ /// // SAFETY: We've just deduplicated the vector.
483
+ /// let set = unsafe { VecSet::from_vec_unchecked(vec) };
484
+ ///
485
+ /// assert_eq!(set, VecSet::from(["b", "a", "c"]));
486
+ /// ```
487
+ ///
488
+ /// [slice-sort]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort
489
+ pub unsafe fn from_vec_unchecked ( mut vec : Vec < T > ) -> Self {
490
+ let ( ptr, len, cap) = ( vec. as_mut_ptr ( ) , vec. len ( ) , vec. capacity ( ) ) ;
491
+ core:: mem:: forget ( vec) ;
492
+ // SAFETY: `Vec<T>` and `Vec<(T, ())>` have the same memory layout.
493
+ let base = unsafe { Vec :: from_raw_parts ( ptr. cast ( ) , len, cap) } ;
494
+ VecSet {
495
+ // SAFETY: The caller ensures that the vector does not contain duplicate elements.
496
+ base : unsafe { VecMap :: from_vec_unchecked ( base) } ,
497
+ }
498
+ }
465
499
}
466
500
467
501
// Lookup operations.
0 commit comments