@@ -216,14 +216,17 @@ impl Literals {
216
216
if self . lits . is_empty ( ) {
217
217
return self . to_empty ( ) ;
218
218
}
219
+ let mut old: Vec < Lit > = self . lits . iter ( ) . cloned ( ) . collect ( ) ;
219
220
let mut new = self . to_empty ( ) ;
220
221
' OUTER :
221
- for lit1 in & self . lits {
222
+ while let Some ( mut candidate) = old. pop ( ) {
223
+ if candidate. is_empty ( ) {
224
+ continue ;
225
+ }
222
226
if new. lits . is_empty ( ) {
223
- new. lits . push ( lit1 . clone ( ) ) ;
227
+ new. lits . push ( candidate ) ;
224
228
continue ;
225
229
}
226
- let mut candidate = lit1. clone ( ) ;
227
230
for lit2 in & mut new. lits {
228
231
if lit2. is_empty ( ) {
229
232
continue ;
@@ -236,11 +239,14 @@ impl Literals {
236
239
lit2. cut = candidate. cut ;
237
240
continue ' OUTER ;
238
241
}
239
- if candidate. len ( ) <= lit2. len ( ) {
242
+ if candidate. len ( ) < lit2. len ( ) {
240
243
if let Some ( i) = position ( & candidate, & lit2) {
241
- lit2. truncate ( i) ;
242
- lit2. cut ( ) ;
243
244
candidate. cut ( ) ;
245
+ let mut lit3 = lit2. clone ( ) ;
246
+ lit3. truncate ( i) ;
247
+ lit3. cut ( ) ;
248
+ old. push ( lit3) ;
249
+ lit2. clear ( ) ;
244
250
}
245
251
} else {
246
252
if let Some ( i) = position ( & lit2, & candidate) {
@@ -1381,6 +1387,9 @@ mod tests {
1381
1387
test_unamb ! ( unambiguous11,
1382
1388
vec![ M ( "zazb" ) , M ( "azb" ) ] , vec![ C ( "azb" ) , C ( "z" ) ] ) ;
1383
1389
test_unamb ! ( unambiguous12, vec![ M ( "foo" ) , C ( "foo" ) ] , vec![ C ( "foo" ) ] ) ;
1390
+ test_unamb ! ( unambiguous13,
1391
+ vec![ M ( "ABCX" ) , M ( "CDAX" ) , M ( "BCX" ) ] ,
1392
+ vec![ C ( "A" ) , C ( "BCX" ) , C ( "CD" ) ] ) ;
1384
1393
1385
1394
// ************************************************************************
1386
1395
// Tests for suffix trimming.
0 commit comments