@@ -2102,6 +2102,132 @@ fn test_extend_from_within() {
2102
2102
assert_eq ! ( v, [ "a" , "b" , "c" , "b" , "c" , "a" , "b" ] ) ;
2103
2103
}
2104
2104
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
+
2105
2231
// Regression test for issue #82533
2106
2232
#[ test]
2107
2233
fn test_extend_from_within_panicing_clone ( ) {
0 commit comments