2
2
//! based on Myers' algorithm.
3
3
#[ cfg( test) ]
4
4
mod tests;
5
- use std:: cmp:: Ordering ;
6
5
use std:: cmp:: { max, min} ;
7
6
use std:: collections:: HashMap ;
8
7
#[ cfg( test) ]
@@ -11,65 +10,14 @@ extern crate quickcheck;
11
10
#[ macro_use( quickcheck) ]
12
11
extern crate quickcheck_macros;
13
12
14
- #[ derive( Debug , Clone , Copy ) ]
15
- enum MaybeInf {
16
- INF ,
17
- MINF ,
18
- Value ( usize ) ,
19
- }
20
- use MaybeInf :: * ;
21
-
22
- impl PartialEq for MaybeInf {
23
- fn eq ( & self , other : & Self ) -> bool {
24
- match ( * self , * other) {
25
- ( MaybeInf :: Value ( a) , MaybeInf :: Value ( b) ) => a. eq ( & b) ,
26
- _ => false ,
27
- }
28
- }
29
- }
30
-
31
- impl PartialOrd for MaybeInf {
32
- fn partial_cmp ( & self , other : & Self ) -> Option < Ordering > {
33
- match ( * self , * other) {
34
- ( Value ( a) , Value ( b) ) => a. partial_cmp ( & b) ,
35
- ( INF , INF ) | ( MINF , MINF ) => None ,
36
- ( MINF , _) | ( _, INF ) => Some ( Ordering :: Less ) ,
37
- ( INF , _) | ( _, MINF ) => Some ( Ordering :: Greater ) ,
38
- }
39
- }
40
- }
41
- use std:: ops:: { Add , Sub } ;
42
- impl Add for MaybeInf {
43
- type Output = Self ;
44
- fn add ( self , rhs : Self ) -> Self :: Output {
45
- match ( self , rhs) {
46
- ( Value ( a) , Value ( b) ) => Value ( a + b) ,
47
- ( INF , MINF ) | ( MINF , INF ) => unreachable ! ( ) ,
48
- ( INF , _) => INF ,
49
- ( MINF , _) => MINF ,
50
- }
51
- }
52
- }
53
- impl Sub for MaybeInf {
54
- type Output = Self ;
55
- fn sub ( self , rhs : Self ) -> Self :: Output {
56
- match ( self , rhs) {
57
- ( Value ( a) , Value ( b) ) => Value ( a - b) ,
58
- ( INF , INF ) | ( MINF , MINF ) => unreachable ! ( ) ,
59
- ( INF , _) => INF ,
60
- ( MINF , _) => MINF ,
61
- }
62
- }
63
- }
64
-
65
13
struct Difference < ' a , X , Y > {
66
14
xv : & ' a [ X ] ,
67
15
yv : & ' a [ Y ] ,
68
16
69
17
// working memory for forward path
70
- vf : Vec < MaybeInf > ,
18
+ vf : Vec < usize > ,
71
19
// working memory for backward path
72
- vb : Vec < MaybeInf > ,
20
+ vb : Vec < usize > ,
73
21
offset_d : i64 ,
74
22
}
75
23
80
28
fn new ( xv : & ' a [ X ] , yv : & ' a [ Y ] ) -> Self {
81
29
let dmax = xv. len ( ) + yv. len ( ) + 1 ;
82
30
let offset_d = yv. len ( ) as i64 ;
83
- let vf = vec ! [ MINF ; dmax] ;
84
- let vb = vec ! [ INF ; dmax] ;
31
+ let vf = vec ! [ 0usize ; dmax] ;
32
+ let vb = vec ! [ ! 0usize ; dmax] ;
85
33
Self {
86
34
xv,
87
35
yv,
108
56
move |k : i64 | -> usize { ( k + offset) as usize }
109
57
} ;
110
58
111
- self . vf [ ktoi ( kmidf) ] = Value ( xl ) ;
112
- self . vb [ ktoi ( kmidb) ] = Value ( xr ) ;
59
+ self . vf [ ktoi ( kmidf) ] = xl ;
60
+ self . vb [ ktoi ( kmidb) ] = xr ;
113
61
114
62
let mut kminf = kmidf;
115
63
let mut kmaxf = kmidf;
@@ -125,15 +73,15 @@ where
125
73
if kminf > kmin {
126
74
kminf -= 1 ;
127
75
if let Some ( x) = self . vf . get_mut ( ktoi ( kminf - 1 ) ) {
128
- * x = MINF
76
+ * x = 0
129
77
}
130
78
} else {
131
79
kminf += 1 ;
132
80
}
133
81
if kmaxf < kmax {
134
82
kmaxf += 1 ;
135
83
if let Some ( x) = self . vf . get_mut ( ktoi ( kmaxf + 1 ) ) {
136
- * x = MINF ;
84
+ * x = 0 ;
137
85
}
138
86
} else {
139
87
kmaxf -= 1
@@ -143,22 +91,11 @@ where
143
91
for k in ( kminf..=kmaxf) . step_by ( 2 ) {
144
92
let ik = ktoi ( k) ;
145
93
let x = if d == 0 {
146
- Value ( xl )
94
+ xl
147
95
} else {
148
96
let lo = self . vf . get ( ktoi ( k - 1 ) ) . cloned ( ) ;
149
97
let hi = self . vf . get ( ktoi ( k + 1 ) ) . cloned ( ) ;
150
- match ( lo, hi) {
151
- ( None , None ) => unreachable ! ( ) ,
152
- ( Some ( x) , None ) => x,
153
- ( None , Some ( x) ) => x,
154
- ( Some ( lo) , Some ( hi) ) => {
155
- if hi + Value ( 1 ) > lo {
156
- hi + Value ( 1 )
157
- } else {
158
- lo
159
- }
160
- }
161
- }
98
+ max ( lo. map ( |x| x + 1 ) , hi) . unwrap ( )
162
99
} ;
163
100
let y = gety ( x, k) ;
164
101
let mut u = x;
0 commit comments