@@ -396,18 +396,29 @@ where
396
396
}
397
397
398
398
/// Adds a value to the set, replacing the existing value, if any, that is
399
- /// equal to the given one. Returns the replaced value.
399
+ /// equal to the given one, without altering its insertion order. Returns
400
+ /// the replaced value.
400
401
///
401
402
/// Computes in **O(1)** time (average).
402
403
pub fn replace ( & mut self , value : T ) -> Option < T > {
404
+ self . replace_full ( value) . 1
405
+ }
406
+
407
+ /// Adds a value to the set, replacing the existing value, if any, that is
408
+ /// equal to the given one, without altering its insertion order. Returns
409
+ /// the index of the item and its replaced value.
410
+ ///
411
+ /// Computes in **O(1)** time (average).
412
+ pub fn replace_full ( & mut self , value : T ) -> ( usize , Option < T > ) {
403
413
use super :: map:: Entry :: * ;
404
414
405
415
match self . map . entry ( value) {
406
416
Vacant ( e) => {
417
+ let index = e. index ( ) ;
407
418
e. insert ( ( ) ) ;
408
- None
419
+ ( index , None )
409
420
}
410
- Occupied ( e) => Some ( e. replace_key ( ) ) ,
421
+ Occupied ( e) => ( e . index ( ) , Some ( e. replace_key ( ) ) ) ,
411
422
}
412
423
}
413
424
@@ -1484,6 +1495,112 @@ mod tests {
1484
1495
}
1485
1496
}
1486
1497
1498
+ #[ test]
1499
+ fn replace ( ) {
1500
+ let replace = [ 0 , 4 , 2 , 12 , 8 , 7 , 11 , 5 ] ;
1501
+ let not_present = [ 1 , 3 , 6 , 9 , 10 ] ;
1502
+ let mut set = IndexSet :: with_capacity ( replace. len ( ) ) ;
1503
+
1504
+ for ( i, & elt) in enumerate ( & replace) {
1505
+ assert_eq ! ( set. len( ) , i) ;
1506
+ set. replace ( elt) ;
1507
+ assert_eq ! ( set. len( ) , i + 1 ) ;
1508
+ assert_eq ! ( set. get( & elt) , Some ( & elt) ) ;
1509
+ }
1510
+ println ! ( "{:?}" , set) ;
1511
+
1512
+ for & elt in & not_present {
1513
+ assert ! ( set. get( & elt) . is_none( ) ) ;
1514
+ }
1515
+ }
1516
+
1517
+ #[ test]
1518
+ fn replace_full ( ) {
1519
+ let replace = vec ! [ 9 , 2 , 7 , 1 , 4 , 6 , 13 ] ;
1520
+ let present = vec ! [ 1 , 6 , 2 ] ;
1521
+ let mut set = IndexSet :: with_capacity ( replace. len ( ) ) ;
1522
+
1523
+ for ( i, & elt) in enumerate ( & replace) {
1524
+ assert_eq ! ( set. len( ) , i) ;
1525
+ let ( index, replaced) = set. replace_full ( elt) ;
1526
+ assert ! ( replaced. is_none( ) ) ;
1527
+ assert_eq ! ( Some ( index) , set. get_full( & elt) . map( |x| x. 0 ) ) ;
1528
+ assert_eq ! ( set. len( ) , i + 1 ) ;
1529
+ }
1530
+
1531
+ let len = set. len ( ) ;
1532
+ for & elt in & present {
1533
+ let ( index, replaced) = set. replace_full ( elt) ;
1534
+ assert_eq ! ( Some ( elt) , replaced) ;
1535
+ assert_eq ! ( Some ( index) , set. get_full( & elt) . map( |x| x. 0 ) ) ;
1536
+ assert_eq ! ( set. len( ) , len) ;
1537
+ }
1538
+ }
1539
+
1540
+ #[ test]
1541
+ fn replace_2 ( ) {
1542
+ let mut set = IndexSet :: with_capacity ( 16 ) ;
1543
+
1544
+ let mut values = vec ! [ ] ;
1545
+ values. extend ( 0 ..16 ) ;
1546
+ values. extend ( if cfg ! ( miri) { 32 ..64 } else { 128 ..267 } ) ;
1547
+
1548
+ for & i in & values {
1549
+ let old_set = set. clone ( ) ;
1550
+ set. replace ( i) ;
1551
+ for value in old_set. iter ( ) {
1552
+ if set. get ( value) . is_none ( ) {
1553
+ println ! ( "old_set: {:?}" , old_set) ;
1554
+ println ! ( "set: {:?}" , set) ;
1555
+ panic ! ( "did not find {} in set" , value) ;
1556
+ }
1557
+ }
1558
+ }
1559
+
1560
+ for & i in & values {
1561
+ assert ! ( set. get( & i) . is_some( ) , "did not find {}" , i) ;
1562
+ }
1563
+ }
1564
+
1565
+ #[ test]
1566
+ fn replace_dup ( ) {
1567
+ let mut elements = vec ! [ 0 , 2 , 4 , 6 , 8 ] ;
1568
+ let mut set: IndexSet < u8 > = elements. drain ( ..) . collect ( ) ;
1569
+ {
1570
+ let ( i, v) = set. get_full ( & 0 ) . unwrap ( ) ;
1571
+ assert_eq ! ( set. len( ) , 5 ) ;
1572
+ assert_eq ! ( i, 0 ) ;
1573
+ assert_eq ! ( * v, 0 ) ;
1574
+ }
1575
+ {
1576
+ let replaced = set. replace ( 0 ) ;
1577
+ let ( i, v) = set. get_full ( & 0 ) . unwrap ( ) ;
1578
+ assert_eq ! ( set. len( ) , 5 ) ;
1579
+ assert_eq ! ( replaced, Some ( 0 ) ) ;
1580
+ assert_eq ! ( i, 0 ) ;
1581
+ assert_eq ! ( * v, 0 ) ;
1582
+ }
1583
+ }
1584
+
1585
+ #[ test]
1586
+ fn replace_order ( ) {
1587
+ let replace = [ 0 , 4 , 2 , 12 , 8 , 7 , 11 , 5 , 3 , 17 , 19 , 22 , 23 ] ;
1588
+ let mut set = IndexSet :: new ( ) ;
1589
+
1590
+ for & elt in & replace {
1591
+ set. replace ( elt) ;
1592
+ }
1593
+
1594
+ assert_eq ! ( set. iter( ) . count( ) , set. len( ) ) ;
1595
+ assert_eq ! ( set. iter( ) . count( ) , replace. len( ) ) ;
1596
+ for ( a, b) in replace. iter ( ) . zip ( set. iter ( ) ) {
1597
+ assert_eq ! ( a, b) ;
1598
+ }
1599
+ for ( i, v) in ( 0 ..replace. len ( ) ) . zip ( set. iter ( ) ) {
1600
+ assert_eq ! ( set. get_index( i) . unwrap( ) , v) ;
1601
+ }
1602
+ }
1603
+
1487
1604
#[ test]
1488
1605
fn grow ( ) {
1489
1606
let insert = [ 0 , 4 , 2 , 12 , 8 , 7 , 11 ] ;
0 commit comments