@@ -324,7 +324,7 @@ pub(crate) struct ClauseState {
324
324
// The ids of the solvables this clause is watching
325
325
pub watched_literals : [ Literal ; 2 ] ,
326
326
// The ids of the next clause in each linked list that this clause is part of
327
- pub ( crate ) next_watches : [ ClauseId ; 2 ] ,
327
+ pub ( crate ) next_watches : [ Option < ClauseId > ; 2 ] ,
328
328
}
329
329
330
330
impl ClauseState {
@@ -417,15 +417,15 @@ impl ClauseState {
417
417
418
418
let clause = Self {
419
419
watched_literals,
420
- next_watches : [ ClauseId :: null ( ) , ClauseId :: null ( ) ] ,
420
+ next_watches : [ None , None ] ,
421
421
} ;
422
422
423
423
debug_assert ! ( !clause. has_watches( ) || watched_literals[ 0 ] != watched_literals[ 1 ] ) ;
424
424
425
425
clause
426
426
}
427
427
428
- pub fn link_to_clause ( & mut self , watch_index : usize , linked_clause : ClauseId ) {
428
+ pub fn link_to_clause ( & mut self , watch_index : usize , linked_clause : Option < ClauseId > ) {
429
429
self . next_watches [ watch_index] = linked_clause;
430
430
}
431
431
@@ -444,7 +444,7 @@ impl ClauseState {
444
444
}
445
445
446
446
#[ inline]
447
- pub fn next_watched_clause ( & self , solvable_id : InternalSolvableId ) -> ClauseId {
447
+ pub fn next_watched_clause ( & self , solvable_id : InternalSolvableId ) -> Option < ClauseId > {
448
448
if solvable_id == self . watched_literals [ 0 ] . solvable_id ( ) {
449
449
self . next_watches [ 0 ]
450
450
} else {
@@ -650,7 +650,7 @@ mod test {
650
650
use super :: * ;
651
651
use crate :: { internal:: arena:: ArenaId , solver:: decision:: Decision } ;
652
652
653
- fn clause ( next_clauses : [ ClauseId ; 2 ] , watch_literals : [ Literal ; 2 ] ) -> ClauseState {
653
+ fn clause ( next_clauses : [ Option < ClauseId > ; 2 ] , watch_literals : [ Literal ; 2 ] ) -> ClauseState {
654
654
ClauseState {
655
655
watched_literals : watch_literals,
656
656
next_watches : next_clauses,
@@ -691,21 +691,24 @@ mod test {
691
691
#[ test]
692
692
fn test_unlink_clause_different ( ) {
693
693
let clause1 = clause (
694
- [ ClauseId :: from_usize ( 2 ) , ClauseId :: from_usize ( 3 ) ] ,
694
+ [
695
+ ClauseId :: from_usize ( 2 ) . into ( ) ,
696
+ ClauseId :: from_usize ( 3 ) . into ( ) ,
697
+ ] ,
695
698
[
696
699
InternalSolvableId :: from_usize ( 1596 ) . negative ( ) ,
697
700
InternalSolvableId :: from_usize ( 1211 ) . negative ( ) ,
698
701
] ,
699
702
) ;
700
703
let clause2 = clause (
701
- [ ClauseId :: null ( ) , ClauseId :: from_usize ( 3 ) ] ,
704
+ [ None , ClauseId :: from_usize ( 3 ) . into ( ) ] ,
702
705
[
703
706
InternalSolvableId :: from_usize ( 1596 ) . negative ( ) ,
704
707
InternalSolvableId :: from_usize ( 1208 ) . negative ( ) ,
705
708
] ,
706
709
) ;
707
710
let clause3 = clause (
708
- [ ClauseId :: null ( ) , ClauseId :: null ( ) ] ,
711
+ [ None , None ] ,
709
712
[
710
713
InternalSolvableId :: from_usize ( 1211 ) . negative ( ) ,
711
714
InternalSolvableId :: from_usize ( 42 ) . negative ( ) ,
@@ -723,10 +726,7 @@ mod test {
723
726
InternalSolvableId :: from_usize( 1211 ) . negative( )
724
727
]
725
728
) ;
726
- assert_eq ! (
727
- clause1. next_watches,
728
- [ ClauseId :: null( ) , ClauseId :: from_usize( 3 ) ]
729
- )
729
+ assert_eq ! ( clause1. next_watches, [ None , ClauseId :: from_usize( 3 ) . into( ) ] )
730
730
}
731
731
732
732
// Unlink 1
@@ -740,24 +740,24 @@ mod test {
740
740
InternalSolvableId :: from_usize( 1211 ) . negative( )
741
741
]
742
742
) ;
743
- assert_eq ! (
744
- clause1. next_watches,
745
- [ ClauseId :: from_usize( 2 ) , ClauseId :: null( ) ]
746
- )
743
+ assert_eq ! ( clause1. next_watches, [ ClauseId :: from_usize( 2 ) . into( ) , None ] )
747
744
}
748
745
}
749
746
750
747
#[ test]
751
748
fn test_unlink_clause_same ( ) {
752
749
let clause1 = clause (
753
- [ ClauseId :: from_usize ( 2 ) , ClauseId :: from_usize ( 2 ) ] ,
750
+ [
751
+ ClauseId :: from_usize ( 2 ) . into ( ) ,
752
+ ClauseId :: from_usize ( 2 ) . into ( ) ,
753
+ ] ,
754
754
[
755
755
InternalSolvableId :: from_usize ( 1596 ) . negative ( ) ,
756
756
InternalSolvableId :: from_usize ( 1211 ) . negative ( ) ,
757
757
] ,
758
758
) ;
759
759
let clause2 = clause (
760
- [ ClauseId :: null ( ) , ClauseId :: null ( ) ] ,
760
+ [ None , None ] ,
761
761
[
762
762
InternalSolvableId :: from_usize ( 1596 ) . negative ( ) ,
763
763
InternalSolvableId :: from_usize ( 1211 ) . negative ( ) ,
@@ -775,10 +775,7 @@ mod test {
775
775
InternalSolvableId :: from_usize( 1211 ) . negative( )
776
776
]
777
777
) ;
778
- assert_eq ! (
779
- clause1. next_watches,
780
- [ ClauseId :: null( ) , ClauseId :: from_usize( 2 ) ]
781
- )
778
+ assert_eq ! ( clause1. next_watches, [ None , ClauseId :: from_usize( 2 ) . into( ) ] )
782
779
}
783
780
784
781
// Unlink 1
@@ -792,10 +789,7 @@ mod test {
792
789
InternalSolvableId :: from_usize( 1211 ) . negative( )
793
790
]
794
791
) ;
795
- assert_eq ! (
796
- clause1. next_watches,
797
- [ ClauseId :: from_usize( 2 ) , ClauseId :: null( ) ]
798
- )
792
+ assert_eq ! ( clause1. next_watches, [ ClauseId :: from_usize( 2 ) . into( ) , None ] )
799
793
}
800
794
}
801
795
@@ -820,7 +814,10 @@ mod test {
820
814
821
815
// No conflict, still one candidate available
822
816
decisions
823
- . try_add_decision ( Decision :: new ( candidate1. into ( ) , false , ClauseId :: null ( ) ) , 1 )
817
+ . try_add_decision (
818
+ Decision :: new ( candidate1. into ( ) , false , ClauseId :: from_usize ( 0 ) ) ,
819
+ 1 ,
820
+ )
824
821
. unwrap ( ) ;
825
822
let ( clause, conflict, _kind) = ClauseState :: requires (
826
823
parent,
@@ -834,7 +831,10 @@ mod test {
834
831
835
832
// Conflict, no candidates available
836
833
decisions
837
- . try_add_decision ( Decision :: new ( candidate2. into ( ) , false , ClauseId :: null ( ) ) , 1 )
834
+ . try_add_decision (
835
+ Decision :: new ( candidate2. into ( ) , false , ClauseId :: install_root ( ) ) ,
836
+ 1 ,
837
+ )
838
838
. unwrap ( ) ;
839
839
let ( clause, conflict, _kind) = ClauseState :: requires (
840
840
parent,
@@ -848,7 +848,7 @@ mod test {
848
848
849
849
// Panic
850
850
decisions
851
- . try_add_decision ( Decision :: new ( parent, false , ClauseId :: null ( ) ) , 1 )
851
+ . try_add_decision ( Decision :: new ( parent, false , ClauseId :: install_root ( ) ) , 1 )
852
852
. unwrap ( ) ;
853
853
let panicked = std:: panic:: catch_unwind ( || {
854
854
ClauseState :: requires (
@@ -878,7 +878,7 @@ mod test {
878
878
879
879
// Conflict, forbidden package installed
880
880
decisions
881
- . try_add_decision ( Decision :: new ( forbidden, true , ClauseId :: null ( ) ) , 1 )
881
+ . try_add_decision ( Decision :: new ( forbidden, true , ClauseId :: install_root ( ) ) , 1 )
882
882
. unwrap ( ) ;
883
883
let ( clause, conflict, _kind) =
884
884
ClauseState :: constrains ( parent, forbidden, VersionSetId :: from_usize ( 0 ) , & decisions) ;
@@ -888,7 +888,7 @@ mod test {
888
888
889
889
// Panic
890
890
decisions
891
- . try_add_decision ( Decision :: new ( parent, false , ClauseId :: null ( ) ) , 1 )
891
+ . try_add_decision ( Decision :: new ( parent, false , ClauseId :: install_root ( ) ) , 1 )
892
892
. unwrap ( ) ;
893
893
let panicked = std:: panic:: catch_unwind ( || {
894
894
ClauseState :: constrains ( parent, forbidden, VersionSetId :: from_usize ( 0 ) , & decisions)
0 commit comments