51
51
pub fn add ( & mut self , new_elem : T ) -> Result < ( ) > {
52
52
// Ensure set elements are lexicographically ordered
53
53
if let Some ( last_elem) = self . inner . last ( ) {
54
- if new_elem. der_cmp ( last_elem) ? != Ordering :: Greater {
55
- return Err ( ErrorKind :: SetOrdering . into ( ) ) ;
54
+ match new_elem. der_cmp ( last_elem) ? {
55
+ Ordering :: Less => return Err ( ErrorKind :: SetOrdering . into ( ) ) ,
56
+ Ordering :: Equal => return Err ( ErrorKind :: SetDuplicate . into ( ) ) ,
57
+ Ordering :: Greater => ( ) ,
56
58
}
57
59
}
58
60
@@ -360,7 +362,6 @@ where
360
362
type Error = Error ;
361
363
362
364
fn try_from ( mut vec : Vec < T > ) -> Result < SetOfVec < T > > {
363
- // TODO(tarcieri): use `[T]::sort_by` here?
364
365
der_sort ( vec. as_mut_slice ( ) ) ?;
365
366
Ok ( SetOfVec { inner : vec } )
366
367
}
@@ -422,9 +423,15 @@ fn der_sort<T: DerOrd>(slice: &mut [T]) -> Result<()> {
422
423
for i in 0 ..slice. len ( ) {
423
424
let mut j = i;
424
425
425
- while j > 0 && slice[ j - 1 ] . der_cmp ( & slice[ j] ) ? == Ordering :: Greater {
426
- slice. swap ( j - 1 , j) ;
427
- j -= 1 ;
426
+ while j > 0 {
427
+ match slice[ j - 1 ] . der_cmp ( & slice[ j] ) ? {
428
+ Ordering :: Less => break ,
429
+ Ordering :: Equal => return Err ( ErrorKind :: SetDuplicate . into ( ) ) ,
430
+ Ordering :: Greater => {
431
+ slice. swap ( j - 1 , j) ;
432
+ j -= 1 ;
433
+ }
434
+ }
428
435
}
429
436
}
430
437
@@ -452,21 +459,28 @@ fn validate<T: DerOrd>(slice: &[T]) -> Result<()> {
452
459
Ok ( ( ) )
453
460
}
454
461
455
- #[ cfg( all ( test, feature = "alloc" ) ) ]
462
+ #[ cfg( test) ]
456
463
mod tests {
457
- use super :: { SetOf , SetOfVec } ;
458
- use alloc:: vec:: Vec ;
464
+ use super :: SetOf ;
465
+ #[ cfg( feature = "alloc" ) ]
466
+ use super :: SetOfVec ;
467
+ use crate :: ErrorKind ;
459
468
460
469
#[ test]
461
470
fn setof_tryfrom_array ( ) {
462
471
let arr = [ 3u16 , 2 , 1 , 65535 , 0 ] ;
463
472
let set = SetOf :: try_from ( arr) . unwrap ( ) ;
464
- assert_eq ! (
465
- set. iter( ) . cloned( ) . collect:: <Vec <u16 >>( ) ,
466
- & [ 0 , 1 , 2 , 3 , 65535 ]
467
- ) ;
473
+ assert ! ( set. iter( ) . copied( ) . eq( [ 0 , 1 , 2 , 3 , 65535 ] ) ) ;
468
474
}
469
475
476
+ #[ test]
477
+ fn setof_tryfrom_array_reject_duplicates ( ) {
478
+ let arr = [ 1u16 , 1 ] ;
479
+ let err = SetOf :: try_from ( arr) . err ( ) . unwrap ( ) ;
480
+ assert_eq ! ( err. kind( ) , ErrorKind :: SetDuplicate ) ;
481
+ }
482
+
483
+ #[ cfg( feature = "alloc" ) ]
470
484
#[ test]
471
485
fn setofvec_tryfrom_array ( ) {
472
486
let arr = [ 3u16 , 2 , 1 , 65535 , 0 ] ;
@@ -481,4 +495,12 @@ mod tests {
481
495
let set = SetOfVec :: try_from ( vec) . unwrap ( ) ;
482
496
assert_eq ! ( set. as_ref( ) , & [ 0 , 1 , 2 , 3 , 65535 ] ) ;
483
497
}
498
+
499
+ #[ cfg( feature = "alloc" ) ]
500
+ #[ test]
501
+ fn setofvec_tryfrom_vec_reject_duplicates ( ) {
502
+ let vec = vec ! [ 1u16 , 1 ] ;
503
+ let err = SetOfVec :: try_from ( vec) . err ( ) . unwrap ( ) ;
504
+ assert_eq ! ( err. kind( ) , ErrorKind :: SetDuplicate ) ;
505
+ }
484
506
}
0 commit comments