@@ -2102,6 +2102,132 @@ fn test_extend_from_within() {
21022102 assert_eq ! ( v, [ "a" , "b" , "c" , "b" , "c" , "a" , "b" ] ) ;
21032103}
21042104
2105+ #[ test]
2106+ fn test_vec_dedup_by ( ) {
2107+ let mut vec: Vec < i32 > = vec ! [ 1 , -1 , 2 , 3 , 1 , -5 , 5 , -2 , 2 ] ;
2108+
2109+ vec. dedup_by ( |a, b| a. abs ( ) == b. abs ( ) ) ;
2110+
2111+ assert_eq ! ( vec, [ 1 , 2 , 3 , 1 , -5 , -2 ] ) ;
2112+ }
2113+
2114+ #[ test]
2115+ fn test_vec_dedup_empty ( ) {
2116+ let mut vec: Vec < i32 > = Vec :: new ( ) ;
2117+
2118+ vec. dedup ( ) ;
2119+
2120+ assert_eq ! ( vec, [ ] ) ;
2121+ }
2122+
2123+ #[ test]
2124+ fn test_vec_dedup_one ( ) {
2125+ let mut vec = vec ! [ 12i32 ] ;
2126+
2127+ vec. dedup ( ) ;
2128+
2129+ assert_eq ! ( vec, [ 12 ] ) ;
2130+ }
2131+
2132+ #[ test]
2133+ fn test_vec_dedup_multiple_ident ( ) {
2134+ let mut vec = vec ! [ 12 , 12 , 12 , 12 , 12 , 11 , 11 , 11 , 11 , 11 , 11 ] ;
2135+
2136+ vec. dedup ( ) ;
2137+
2138+ assert_eq ! ( vec, [ 12 , 11 ] ) ;
2139+ }
2140+
2141+ #[ test]
2142+ fn test_vec_dedup_partialeq ( ) {
2143+ #[ derive( Debug ) ]
2144+ struct Foo ( i32 , i32 ) ;
2145+
2146+ impl PartialEq for Foo {
2147+ fn eq ( & self , other : & Foo ) -> bool {
2148+ self . 0 == other. 0
2149+ }
2150+ }
2151+
2152+ let mut vec = vec ! [ Foo ( 0 , 1 ) , Foo ( 0 , 5 ) , Foo ( 1 , 7 ) , Foo ( 1 , 9 ) ] ;
2153+
2154+ vec. dedup ( ) ;
2155+ assert_eq ! ( vec, [ Foo ( 0 , 1 ) , Foo ( 1 , 7 ) ] ) ;
2156+ }
2157+
2158+ #[ test]
2159+ fn test_vec_dedup ( ) {
2160+ let mut vec: Vec < bool > = Vec :: with_capacity ( 8 ) ;
2161+ let mut template = vec. clone ( ) ;
2162+
2163+ for x in 0u8 ..255u8 {
2164+ vec. clear ( ) ;
2165+ template. clear ( ) ;
2166+
2167+ let iter = ( 0 ..8 ) . map ( move |bit| ( x >> bit) & 1 == 1 ) ;
2168+ vec. extend ( iter) ;
2169+ template. extend_from_slice ( & vec) ;
2170+
2171+ let ( dedup, _) = template. partition_dedup ( ) ;
2172+ vec. dedup ( ) ;
2173+
2174+ assert_eq ! ( vec, dedup) ;
2175+ }
2176+ }
2177+
2178+ #[ test]
2179+ fn test_vec_dedup_panicking ( ) {
2180+ #[ derive( Debug ) ]
2181+ struct Panic {
2182+ drop_counter : & ' static AtomicU32 ,
2183+ value : bool ,
2184+ index : usize ,
2185+ }
2186+
2187+ impl PartialEq for Panic {
2188+ fn eq ( & self , other : & Self ) -> bool {
2189+ self . value == other. value
2190+ }
2191+ }
2192+
2193+ impl Drop for Panic {
2194+ fn drop ( & mut self ) {
2195+ let x = self . drop_counter . fetch_add ( 1 , Ordering :: SeqCst ) ;
2196+ assert ! ( x != 4 ) ;
2197+ }
2198+ }
2199+
2200+ static DROP_COUNTER : AtomicU32 = AtomicU32 :: new ( 0 ) ;
2201+ let expected = [
2202+ Panic { drop_counter : & DROP_COUNTER , value : false , index : 0 } ,
2203+ Panic { drop_counter : & DROP_COUNTER , value : false , index : 5 } ,
2204+ Panic { drop_counter : & DROP_COUNTER , value : true , index : 6 } ,
2205+ Panic { drop_counter : & DROP_COUNTER , value : true , index : 7 } ,
2206+ ] ;
2207+ let mut vec = vec ! [
2208+ Panic { drop_counter: & DROP_COUNTER , value: false , index: 0 } ,
2209+ // these elements get deduplicated
2210+ Panic { drop_counter: & DROP_COUNTER , value: false , index: 1 } ,
2211+ Panic { drop_counter: & DROP_COUNTER , value: false , index: 2 } ,
2212+ Panic { drop_counter: & DROP_COUNTER , value: false , index: 3 } ,
2213+ Panic { drop_counter: & DROP_COUNTER , value: false , index: 4 } ,
2214+ // here it panics
2215+ Panic { drop_counter: & DROP_COUNTER , value: false , index: 5 } ,
2216+ Panic { drop_counter: & DROP_COUNTER , value: true , index: 6 } ,
2217+ Panic { drop_counter: & DROP_COUNTER , value: true , index: 7 } ,
2218+ ] ;
2219+
2220+ let _ = std:: panic:: catch_unwind ( std:: panic:: AssertUnwindSafe ( || {
2221+ vec. dedup ( ) ;
2222+ } ) ) ;
2223+
2224+ let ok = vec. iter ( ) . zip ( expected. iter ( ) ) . all ( |( x, y) | x. index == y. index ) ;
2225+
2226+ if !ok {
2227+ panic ! ( "expected: {:?}\n got: {:?}\n " , expected, vec) ;
2228+ }
2229+ }
2230+
21052231// Regression test for issue #82533
21062232#[ test]
21072233fn test_extend_from_within_panicing_clone ( ) {
0 commit comments