yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
rom_diff.cc
Go to the documentation of this file.
1#include "rom/rom_diff.h"
2
3#include <algorithm>
4#include <cstddef>
5#include <cstdint>
6#include <utility>
7#include <vector>
8
9namespace yaze::rom {
10
11DiffSummary ComputeDiffRanges(const std::vector<uint8_t>& before,
12 const std::vector<uint8_t>& after) {
13 DiffSummary summary;
14
15 const size_t min_size = std::min(before.size(), after.size());
16 const size_t max_size = std::max(before.size(), after.size());
17
18 bool in_diff = false;
19 uint32_t diff_start = 0;
20
21 for (size_t i = 0; i < min_size; ++i) {
22 if (before[i] != after[i]) {
23 if (!in_diff) {
24 in_diff = true;
25 diff_start = static_cast<uint32_t>(i);
26 }
27 summary.total_bytes_changed++;
28 continue;
29 }
30
31 if (in_diff) {
32 summary.ranges.emplace_back(diff_start, static_cast<uint32_t>(i));
33 in_diff = false;
34 }
35 }
36
37 if (in_diff) {
38 summary.ranges.emplace_back(diff_start, static_cast<uint32_t>(min_size));
39 }
40
41 if (before.size() != after.size()) {
42 // Treat the size delta as a single tail diff.
43 summary.ranges.emplace_back(static_cast<uint32_t>(min_size),
44 static_cast<uint32_t>(max_size));
45 summary.total_bytes_changed += (max_size - min_size);
46 }
47
48 // Merge adjacent ranges (possible when a diff ends exactly at min_size and we
49 // also add a tail diff due to size delta).
50 if (summary.ranges.size() > 1) {
51 std::sort(summary.ranges.begin(), summary.ranges.end());
52 std::vector<std::pair<uint32_t, uint32_t>> merged;
53 merged.reserve(summary.ranges.size());
54 for (const auto& r : summary.ranges) {
55 if (merged.empty() || merged.back().second < r.first) {
56 merged.push_back(r);
57 continue;
58 }
59 merged.back().second = std::max(merged.back().second, r.second);
60 }
61 summary.ranges = std::move(merged);
62 }
63
64 return summary;
65}
66
67} // namespace yaze::rom
68
DiffSummary ComputeDiffRanges(const std::vector< uint8_t > &before, const std::vector< uint8_t > &after)
Definition rom_diff.cc:11
std::vector< std::pair< uint32_t, uint32_t > > ranges
Definition rom_diff.h:16