@@ -3,10 +3,9 @@ const DiffMatchPatch = @This();
3
3
const std = @import ("std" );
4
4
const testing = std .testing ;
5
5
const Allocator = std .mem .Allocator ;
6
- const ArrayListUnmanaged = std .ArrayListUnmanaged ;
7
6
8
7
/// DMP with default configuration options
9
- pub const default = DiffMatchPatch {};
8
+ pub const default : DiffMatchPatch = . {};
10
9
11
10
pub const Diff = struct {
12
11
pub const Operation = enum {
@@ -97,9 +96,9 @@ pub fn diff(
97
96
return dmp .diffInternal (allocator , before , after , check_lines , deadline );
98
97
}
99
98
100
- const DiffList = ArrayListUnmanaged (Diff );
99
+ const DiffList = std . ArrayListUnmanaged (Diff );
101
100
102
- /// Deinit an `ArrayListUnmanaged(Diff)` and the allocated slices of
101
+ /// Deinit an `std. ArrayListUnmanaged(Diff)` and the allocated slices of
103
102
/// text in each `Diff`.
104
103
pub fn deinitDiffList (allocator : Allocator , diffs : * DiffList ) void {
105
104
defer diffs .deinit (allocator );
@@ -130,7 +129,7 @@ fn diffInternal(
130
129
) DiffError ! DiffList {
131
130
// Check for equality (speedup).
132
131
if (std .mem .eql (u8 , before , after )) {
133
- var diffs = DiffList {} ;
132
+ var diffs : DiffList = .empty ;
134
133
errdefer deinitDiffList (allocator , & diffs );
135
134
if (before .len != 0 ) {
136
135
try diffs .ensureUnusedCapacity (allocator , 1 );
@@ -224,7 +223,7 @@ fn diffCompute(
224
223
) DiffError ! DiffList {
225
224
if (before .len == 0 ) {
226
225
// Just add some text (speedup).
227
- var diffs = DiffList {} ;
226
+ var diffs : DiffList = .empty ;
228
227
errdefer deinitDiffList (allocator , & diffs );
229
228
try diffs .ensureUnusedCapacity (allocator , 1 );
230
229
diffs .appendAssumeCapacity (.{
@@ -236,7 +235,7 @@ fn diffCompute(
236
235
237
236
if (after .len == 0 ) {
238
237
// Just delete some text (speedup).
239
- var diffs = DiffList {} ;
238
+ var diffs : DiffList = .empty ;
240
239
errdefer deinitDiffList (allocator , & diffs );
241
240
try diffs .ensureUnusedCapacity (allocator , 1 );
242
241
diffs .appendAssumeCapacity (.{
@@ -250,7 +249,7 @@ fn diffCompute(
250
249
const short_text = if (before .len > after .len ) after else before ;
251
250
252
251
if (std .mem .indexOf (u8 , long_text , short_text )) | index | {
253
- var diffs = DiffList {} ;
252
+ var diffs : DiffList = .empty ;
254
253
errdefer deinitDiffList (allocator , & diffs );
255
254
// Shorter text is inside the longer text (speedup).
256
255
const op : Diff.Operation = if (before .len > after .len )
@@ -276,7 +275,7 @@ fn diffCompute(
276
275
if (short_text .len == 1 ) {
277
276
// Single character string.
278
277
// After the previous speedup, the character can't be an equality.
279
- var diffs = DiffList {} ;
278
+ var diffs : DiffList = .empty ;
280
279
errdefer deinitDiffList (allocator , & diffs );
281
280
try diffs .ensureUnusedCapacity (allocator , 2 );
282
281
diffs .appendAssumeCapacity (.{
@@ -442,30 +441,30 @@ fn diffHalfMatchInternal(
442
441
const seed = long_text [i .. i + long_text .len / 4 ];
443
442
var j : isize = -1 ;
444
443
445
- var best_common = std .ArrayListUnmanaged (u8 ){} ;
444
+ var best_common : std .ArrayListUnmanaged (u8 ) = .empty ;
446
445
defer best_common .deinit (allocator );
447
446
var best_long_text_a : []const u8 = "" ;
448
447
var best_long_text_b : []const u8 = "" ;
449
448
var best_short_text_a : []const u8 = "" ;
450
449
var best_short_text_b : []const u8 = "" ;
451
450
452
451
while (j < short_text .len and b : {
453
- j = @as (isize , @intCast (std .mem .indexOf (u8 , short_text [@as ( usize , @ intCast (j + 1 ) ).. ], seed ) orelse break :b false )) + j + 1 ;
452
+ j = @as (isize , @intCast (std .mem .indexOf (u8 , short_text [@intCast (j + 1 ).. ], seed ) orelse break :b false )) + j + 1 ;
454
453
break :b true ;
455
454
}) {
456
- const prefix_length = diffCommonPrefix (long_text [i .. ], short_text [@as ( usize , @ intCast (j ) ).. ]);
457
- const suffix_length = diffCommonSuffix (long_text [0.. i ], short_text [0.. @as ( usize , @ intCast (j ) )]);
455
+ const prefix_length = diffCommonPrefix (long_text [i .. ], short_text [@intCast (j ).. ]);
456
+ const suffix_length = diffCommonSuffix (long_text [0.. i ], short_text [0.. @intCast (j )]);
458
457
if (best_common .items .len < suffix_length + prefix_length ) {
459
458
best_common .clearRetainingCapacity ();
460
- const a = short_text [@as ( usize , @ intCast (j - @as (isize , @intCast (suffix_length ) ))) .. @as (usize , @intCast (j - @as (isize , @intCast (suffix_length )))) + suffix_length ];
459
+ const a = short_text [@intCast (j - @as (isize , @intCast (suffix_length ))) .. @as (usize , @intCast (j - @as (isize , @intCast (suffix_length )))) + suffix_length ];
461
460
try best_common .appendSlice (allocator , a );
462
- const b = short_text [@as ( usize , @ intCast (j ) ) .. @as (usize , @intCast (j )) + prefix_length ];
461
+ const b = short_text [@intCast (j ) .. @as (usize , @intCast (j )) + prefix_length ];
463
462
try best_common .appendSlice (allocator , b );
464
463
465
464
best_long_text_a = long_text [0 .. i - suffix_length ];
466
465
best_long_text_b = long_text [i + prefix_length .. ];
467
- best_short_text_a = short_text [0.. @as ( usize , @ intCast (j - @as (isize , @intCast (suffix_length ) )))];
468
- best_short_text_b = short_text [@as ( usize , @ intCast (j + @as (isize , @intCast (prefix_length ) ))).. ];
466
+ best_short_text_a = short_text [0.. @intCast (j - @as (isize , @intCast (suffix_length )))];
467
+ best_short_text_b = short_text [@intCast (j + @as (isize , @intCast (prefix_length ))).. ];
469
468
}
470
469
}
471
470
if (best_common .items .len * 2 >= long_text .len ) {
@@ -511,10 +510,10 @@ fn diffBisect(
511
510
const v_offset = max_d ;
512
511
const v_length = 2 * max_d ;
513
512
514
- var v1 = try ArrayListUnmanaged (isize ).initCapacity (allocator , @as ( usize , @ intCast (v_length ) ));
513
+ var v1 : std . ArrayListUnmanaged (isize ) = try .initCapacity (allocator , @intCast (v_length ));
515
514
defer v1 .deinit (allocator );
516
515
v1 .items .len = @intCast (v_length );
517
- var v2 = try ArrayListUnmanaged (isize ).initCapacity (allocator , @as ( usize , @ intCast (v_length ) ));
516
+ var v2 : std . ArrayListUnmanaged (isize ) = try .initCapacity (allocator , @intCast (v_length ));
518
517
defer v2 .deinit (allocator );
519
518
v2 .items .len = @intCast (v_length );
520
519
@@ -626,7 +625,7 @@ fn diffBisect(
626
625
}
627
626
// Diff took too long and hit the deadline or
628
627
// number of diffs equals number of characters, no commonality at all.
629
- var diffs = DiffList {} ;
628
+ var diffs : DiffList = .empty ;
630
629
errdefer deinitDiffList (allocator , & diffs );
631
630
try diffs .ensureUnusedCapacity (allocator , 2 );
632
631
diffs .appendAssumeCapacity (.{
@@ -715,8 +714,8 @@ fn diffLineMode(
715
714
var pointer : usize = 0 ;
716
715
var count_delete : usize = 0 ;
717
716
var count_insert : usize = 0 ;
718
- var text_delete = ArrayListUnmanaged (u8 ){} ;
719
- var text_insert = ArrayListUnmanaged (u8 ){} ;
717
+ var text_delete : std . ArrayListUnmanaged (u8 ) = .empty ;
718
+ var text_insert : std . ArrayListUnmanaged (u8 ) = .empty ;
720
719
defer {
721
720
text_delete .deinit (allocator );
722
721
text_insert .deinit (allocator );
@@ -774,7 +773,7 @@ fn diffLineMode(
774
773
const LinesToCharsResult = struct {
775
774
chars_1 : []const u8 ,
776
775
chars_2 : []const u8 ,
777
- line_array : ArrayListUnmanaged ([]const u8 ),
776
+ line_array : std . ArrayListUnmanaged ([]const u8 ),
778
777
779
778
pub fn deinit (self : * LinesToCharsResult , allocator : Allocator ) void {
780
779
allocator .free (self .chars_1 );
@@ -795,9 +794,9 @@ fn diffLinesToChars(
795
794
text1 : []const u8 ,
796
795
text2 : []const u8 ,
797
796
) DiffError ! LinesToCharsResult {
798
- var line_array = ArrayListUnmanaged ([]const u8 ){} ;
797
+ var line_array : std . ArrayListUnmanaged ([]const u8 ) = .empty ;
799
798
errdefer line_array .deinit (allocator );
800
- var line_hash = std .StringHashMapUnmanaged (usize ){} ;
799
+ var line_hash : std .StringHashMapUnmanaged (usize ) = .empty ;
801
800
defer line_hash .deinit (allocator );
802
801
// e.g. line_array[4] == "Hello\n"
803
802
// e.g. line_hash.get("Hello\n") == 4
@@ -823,13 +822,13 @@ fn diffLinesToChars(
823
822
fn diffLinesToCharsMunge (
824
823
allocator : std.mem.Allocator ,
825
824
text : []const u8 ,
826
- line_array : * ArrayListUnmanaged ([]const u8 ),
825
+ line_array : * std . ArrayListUnmanaged ([]const u8 ),
827
826
line_hash : * std .StringHashMapUnmanaged (usize ),
828
827
max_lines : usize ,
829
828
) DiffError ! []const u8 {
830
829
var line_start : isize = 0 ;
831
830
var line_end : isize = -1 ;
832
- var chars = ArrayListUnmanaged (u8 ){} ;
831
+ var chars : std . ArrayListUnmanaged (u8 ) = .empty ;
833
832
defer chars .deinit (allocator );
834
833
// Walk the text, pulling out a Substring for each line.
835
834
// TODO this can be handled with a Reader, avoiding all the manual splitting
@@ -866,10 +865,10 @@ fn diffCharsToLines(
866
865
char_diffs : * DiffList ,
867
866
line_array : []const []const u8 ,
868
867
) DiffError ! DiffList {
869
- var diffs = DiffList {} ;
868
+ var diffs : DiffList = .empty ;
870
869
errdefer deinitDiffList (allocator , & diffs );
871
870
try diffs .ensureTotalCapacity (allocator , char_diffs .items .len );
872
- var text = ArrayListUnmanaged (u8 ){} ;
871
+ var text : std . ArrayListUnmanaged (u8 ) = .empty ;
873
872
defer text .deinit (allocator );
874
873
875
874
for (char_diffs .items ) | * d | {
@@ -895,10 +894,10 @@ fn diffCleanupMerge(allocator: std.mem.Allocator, diffs: *DiffList) DiffError!vo
895
894
var count_delete : usize = 0 ;
896
895
var count_insert : usize = 0 ;
897
896
898
- var text_delete = ArrayListUnmanaged (u8 ){} ;
897
+ var text_delete : std . ArrayListUnmanaged (u8 ) = .empty ;
899
898
defer text_delete .deinit (allocator );
900
899
901
- var text_insert = ArrayListUnmanaged (u8 ){} ;
900
+ var text_insert : std . ArrayListUnmanaged (u8 ) = .empty ;
902
901
defer text_insert .deinit (allocator );
903
902
904
903
var common_length : usize = undefined ;
@@ -1068,7 +1067,7 @@ fn diffCleanupMerge(allocator: std.mem.Allocator, diffs: *DiffList) DiffError!vo
1068
1067
pub fn diffCleanupSemantic (allocator : std.mem.Allocator , diffs : * DiffList ) DiffError ! void {
1069
1068
var changes = false ;
1070
1069
// Stack of indices where equalities are found.
1071
- var equalities = ArrayListUnmanaged (isize ){} ;
1070
+ var equalities : std . ArrayListUnmanaged (isize ) = .empty ;
1072
1071
defer equalities .deinit (allocator );
1073
1072
// Always equal to equalities[equalitiesLength-1][1]
1074
1073
var last_equality : ? []const u8 = null ;
@@ -1210,15 +1209,15 @@ pub fn diffCleanupSemanticLossless(
1210
1209
diffs .items [pointer + 1 ].operation == .equal )
1211
1210
{
1212
1211
// This is a single edit surrounded by equalities.
1213
- var equality_1 = std .ArrayListUnmanaged (u8 ){} ;
1212
+ var equality_1 : std .ArrayListUnmanaged (u8 ) = .empty ;
1214
1213
defer equality_1 .deinit (allocator );
1215
1214
try equality_1 .appendSlice (allocator , diffs .items [pointer - 1 ].text );
1216
1215
1217
- var edit = std .ArrayListUnmanaged (u8 ){} ;
1216
+ var edit : std .ArrayListUnmanaged (u8 ) = .empty ;
1218
1217
defer edit .deinit (allocator );
1219
1218
try edit .appendSlice (allocator , diffs .items [pointer ].text );
1220
1219
1221
- var equality_2 = std .ArrayListUnmanaged (u8 ){} ;
1220
+ var equality_2 : std .ArrayListUnmanaged (u8 ) = .empty ;
1222
1221
defer equality_2 .deinit (allocator );
1223
1222
try equality_2 .appendSlice (allocator , diffs .items [pointer + 1 ].text );
1224
1223
@@ -1244,15 +1243,15 @@ pub fn diffCleanupSemanticLossless(
1244
1243
1245
1244
// Second, step character by character right,
1246
1245
// looking for the best fit.
1247
- var best_equality_1 = ArrayListUnmanaged (u8 ){} ;
1246
+ var best_equality_1 : std . ArrayListUnmanaged (u8 ) = .empty ;
1248
1247
defer best_equality_1 .deinit (allocator );
1249
1248
try best_equality_1 .appendSlice (allocator , equality_1 .items );
1250
1249
1251
- var best_edit = ArrayListUnmanaged (u8 ){} ;
1250
+ var best_edit : std . ArrayListUnmanaged (u8 ) = .empty ;
1252
1251
defer best_edit .deinit (allocator );
1253
1252
try best_edit .appendSlice (allocator , edit .items );
1254
1253
1255
- var best_equality_2 = ArrayListUnmanaged (u8 ){} ;
1254
+ var best_equality_2 : std . ArrayListUnmanaged (u8 ) = .empty ;
1256
1255
defer best_equality_2 .deinit (allocator );
1257
1256
try best_equality_2 .appendSlice (allocator , equality_2 .items );
1258
1257
@@ -1775,7 +1774,7 @@ fn testDiffCharsToLines(
1775
1774
expected : []const Diff ,
1776
1775
},
1777
1776
) ! void {
1778
- var char_diffs = try DiffList .initCapacity (allocator , params .diffs .len );
1777
+ var char_diffs : DiffList = try .initCapacity (allocator , params .diffs .len );
1779
1778
defer deinitDiffList (allocator , & char_diffs );
1780
1779
1781
1780
for (params .diffs ) | item | {
@@ -1790,7 +1789,7 @@ fn testDiffCharsToLines(
1790
1789
1791
1790
test diffCharsToLines {
1792
1791
// Convert chars up to lines.
1793
- var diff_list = DiffList {} ;
1792
+ var diff_list : DiffList = .empty ;
1794
1793
defer deinitDiffList (testing .allocator , & diff_list );
1795
1794
try diff_list .ensureTotalCapacity (testing .allocator , 2 );
1796
1795
diff_list .appendSliceAssumeCapacity (&.{
@@ -1817,7 +1816,7 @@ fn testDiffCleanupMerge(allocator: std.mem.Allocator, params: struct {
1817
1816
input : []const Diff ,
1818
1817
expected : []const Diff ,
1819
1818
}) ! void {
1820
- var diffs = try DiffList .initCapacity (allocator , params .input .len );
1819
+ var diffs : DiffList = try .initCapacity (allocator , params .input .len );
1821
1820
defer deinitDiffList (allocator , & diffs );
1822
1821
1823
1822
for (params .input ) | item | {
@@ -2021,7 +2020,7 @@ fn testDiffCleanupSemanticLossless(
2021
2020
expected : []const Diff ,
2022
2021
},
2023
2022
) ! void {
2024
- var diffs = try DiffList .initCapacity (allocator , params .input .len );
2023
+ var diffs : DiffList = try .initCapacity (allocator , params .input .len );
2025
2024
defer deinitDiffList (allocator , & diffs );
2026
2025
2027
2026
for (params .input ) | item | {
@@ -2034,7 +2033,7 @@ fn testDiffCleanupSemanticLossless(
2034
2033
}
2035
2034
2036
2035
fn sliceToDiffList (allocator : Allocator , diff_slice : []const Diff ) ! DiffList {
2037
- var diff_list = DiffList {} ;
2036
+ var diff_list : DiffList = .empty ;
2038
2037
errdefer deinitDiffList (allocator , & diff_list );
2039
2038
try diff_list .ensureTotalCapacity (allocator , diff_slice .len );
2040
2039
for (diff_slice ) | d | {
@@ -2278,7 +2277,7 @@ test diffBisect {
2278
2277
}
2279
2278
2280
2279
fn diffHalfMatchLeak (allocator : Allocator ) ! void {
2281
- const dmp = DiffMatchPatch {} ;
2280
+ const dmp : DiffMatchPatch = .default ;
2282
2281
const text1 = "The quick brown fox jumps over the lazy dog." ;
2283
2282
const text2 = "That quick brown fox jumped over a lazy dog." ;
2284
2283
var diffs = try dmp .diff (allocator , text2 , text1 , true );
@@ -2609,7 +2608,7 @@ fn testDiffCleanupSemantic(
2609
2608
expected : []const Diff ,
2610
2609
},
2611
2610
) ! void {
2612
- var diffs = try DiffList .initCapacity (allocator , params .input .len );
2611
+ var diffs : DiffList = try .initCapacity (allocator , params .input .len );
2613
2612
defer deinitDiffList (allocator , & diffs );
2614
2613
2615
2614
for (params .input ) | item | {
@@ -2788,7 +2787,7 @@ fn testDiffCleanupEfficiency(
2788
2787
expected : []const Diff ,
2789
2788
},
2790
2789
) ! void {
2791
- var diffs = try DiffList .initCapacity (allocator , params .input .len );
2790
+ var diffs : DiffList = try .initCapacity (allocator , params .input .len );
2792
2791
defer deinitDiffList (allocator , & diffs );
2793
2792
for (params .input ) | item | {
2794
2793
diffs .appendAssumeCapacity (.{ .operation = item .operation , .text = try allocator .dupe (u8 , item .text ) });
@@ -2800,12 +2799,12 @@ fn testDiffCleanupEfficiency(
2800
2799
2801
2800
test "diffCleanupEfficiency" {
2802
2801
const allocator = testing .allocator ;
2803
- var dmp = DiffMatchPatch {} ;
2802
+ var dmp : DiffMatchPatch = .default ;
2804
2803
dmp .diff_edit_cost = 4 ;
2805
2804
{ // Null case.
2806
- var diffs = DiffList {} ;
2805
+ var diffs : DiffList = .empty ;
2807
2806
try dmp .diffCleanupEfficiency (allocator , & diffs );
2808
- try testing .expectEqualDeep (DiffList {} , diffs );
2807
+ try testing .expectEqualDeep (DiffList . empty , diffs );
2809
2808
}
2810
2809
{ // No elimination.
2811
2810
const dslice : []const Diff = &.{
0 commit comments