From 1789a1f6d4f8ac15c3e0cb91f92b49c1943943fc Mon Sep 17 00:00:00 2001 From: Maxim Pimenov Date: Fri, 25 Jan 2019 16:14:36 +0300 Subject: [PATCH] Review fixes. --- 3party/bsdiff-courgette/bsdiff/bsdiff.h | 21 +++++-------------- .../bsdiff-courgette/bsdiff/bsdiff_search.h | 12 +++++------ .../mwm_diff_tests/bsdiff_search_tests.cpp | 18 ++++++++-------- 3 files changed, 20 insertions(+), 31 deletions(-) diff --git a/3party/bsdiff-courgette/bsdiff/bsdiff.h b/3party/bsdiff-courgette/bsdiff/bsdiff.h index 69b6478fed..9a3d44fe67 100644 --- a/3party/bsdiff-courgette/bsdiff/bsdiff.h +++ b/3party/bsdiff-courgette/bsdiff/bsdiff.h @@ -143,20 +143,9 @@ BSDiffStatus CreateBinaryPatch(OldReader & old_reader, old_source.Read(old_buf.data(), old_buf.size()); const uint8_t * old = old_buf.data(); - std::vector I; - try - { - I.resize(old_size + 1); - } - catch (...) - { - LOG(LERROR, ("Could not allocate I[], ", ((old_size + 1) * sizeof(int)), "bytes")); - return MEM_ERROR; - } - + std::vector suffix_array(old_size + 1); base::Timer suf_sort_timer; - divsuf::saint_t result = divsuf::divsufsort_include_empty( - old, I.data(), old_size); + divsuf::saint_t result = divsuf::divsufsort_include_empty(old, suffix_array.data(), old_size); LOG(LINFO, ("Done divsufsort", suf_sort_timer.ElapsedSeconds())); if (result != 0) return UNEXPECTED_ERROR; @@ -221,8 +210,8 @@ BSDiffStatus CreateBinaryPatch(OldReader & old_reader, scan += match.size; for (int scsc = scan; scan < new_size; ++scan) { - match = search( - I, old, old_size, newbuf + scan, new_size - scan); + match = search(suffix_array, old, old_size, newbuf + scan, + new_size - scan); for (; scsc < scan + match.size; scsc++) if ((scsc + lastoffset < old_size) && @@ -348,7 +337,7 @@ BSDiffStatus CreateBinaryPatch(OldReader & old_reader, WriteVarUint(diff_skips.GetWriter(), pending_diff_zeros); - I.clear(); + suffix_array.clear(); MBSPatchHeader header; // The string will have a null terminator that we don't use, hence '-1'. diff --git a/3party/bsdiff-courgette/bsdiff/bsdiff_search.h b/3party/bsdiff-courgette/bsdiff/bsdiff_search.h index e54687d8c1..6ca9350163 100644 --- a/3party/bsdiff-courgette/bsdiff/bsdiff_search.h +++ b/3party/bsdiff-courgette/bsdiff/bsdiff_search.h @@ -67,11 +67,11 @@ inline int matchlen(const unsigned char* buf1, } // Finds a suffix in |old| that has the longest common prefix with |keybuf|, -// aided by suffix array |I| of |old|. Returns the match length, and writes to +// aided by suffix array |sa| of |old|. Returns the match length, and writes to // |pos| a position of best match in |old|. If multiple such positions exist, // |pos| would take an arbitrary one. template -SearchResult search(const T & I, +SearchResult search(const T & sa, const unsigned char* srcbuf, int srcsize, const unsigned char* keybuf, @@ -81,15 +81,15 @@ SearchResult search(const T & I, while (hi - lo > 1) { int mid = (lo + hi) / 2; if (std::lexicographical_compare( - srcbuf + I[mid], srcbuf + srcsize, keybuf, keybuf + keysize)) { + srcbuf + sa[mid], srcbuf + srcsize, keybuf, keybuf + keysize)) { lo = mid; } else { hi = mid; } } - int x = matchlen(srcbuf + I[lo], keybuf, std::min(srcsize - I[lo], keysize)); - int y = matchlen(srcbuf + I[hi], keybuf, std::min(srcsize - I[hi], keysize)); - return (x > y) ? SearchResult(I[lo], x) : SearchResult(I[hi], y); + int x = matchlen(srcbuf + sa[lo], keybuf, std::min(srcsize - sa[lo], keysize)); + int y = matchlen(srcbuf + sa[hi], keybuf, std::min(srcsize - sa[hi], keysize)); + return (x > y) ? SearchResult(sa[lo], x) : SearchResult(sa[hi], y); } } // namespace bsdiff diff --git a/generator/mwm_diff/mwm_diff_tests/bsdiff_search_tests.cpp b/generator/mwm_diff/mwm_diff_tests/bsdiff_search_tests.cpp index 39c707019c..dea1fb6fea 100644 --- a/generator/mwm_diff/mwm_diff_tests/bsdiff_search_tests.cpp +++ b/generator/mwm_diff/mwm_diff_tests/bsdiff_search_tests.cpp @@ -19,9 +19,9 @@ UNIT_TEST(BSDiffSearchTest_Search) // 012345678901234567890123456789012345678901234 string const str = "the quick brown fox jumps over the lazy dog."; int const size = static_cast(str.size()); - unsigned char const * const buf = reinterpret_cast(str.data()); - vector I(size + 1); - divsuf::divsufsort_include_empty(buf, I.data(), size); + auto buf = reinterpret_cast(str.data()); + vector suffix_array(size + 1); + divsuf::divsufsort_include_empty(buf, suffix_array.data(), size); // Specific queries. struct @@ -63,11 +63,11 @@ UNIT_TEST(BSDiffSearchTest_Search) { auto const & testCase = testCases[idx]; int const querySize = static_cast(testCase.m_query_str.size()); - unsigned char const * const query_buf = - reinterpret_cast(testCase.m_query_str.data()); + auto query_buf = reinterpret_cast(testCase.m_query_str.data()); // Perform the search. - bsdiff::SearchResult const match = bsdiff::search(I, buf, size, query_buf, querySize); + bsdiff::SearchResult const match = + bsdiff::search(suffix_array, buf, size, query_buf, querySize); // Check basic properties and match with expected values. TEST_GREATER_OR_EQUAL(match.size, 0, ()); @@ -108,8 +108,8 @@ UNIT_TEST(BSDiffSearchTest_SearchExact) unsigned char const * const buf = reinterpret_cast(testCases[idx].data()); - vector I(size + 1); - divsuf::divsufsort_include_empty(buf, I.data(), size); + vector suffix_array(size + 1); + divsuf::divsufsort_include_empty(buf, suffix_array.data(), size); // Test exact matches for every non-empty substring. for (int lo = 0; lo < size; ++lo) @@ -122,7 +122,7 @@ UNIT_TEST(BSDiffSearchTest_SearchExact) unsigned char const * const query_buf = reinterpret_cast(query.c_str()); bsdiff::SearchResult const match = - bsdiff::search(I, buf, size, query_buf, querySize); + bsdiff::search(suffix_array, buf, size, query_buf, querySize); TEST_EQUAL(querySize, match.size, ()); TEST_GREATER_OR_EQUAL(match.pos, 0, ());