35 std::tuple<bool, int> scoreSub(
37 const TestMark::LinearizedRecord left_[],
39 const TestMark::LinearizedRecord right_[],
40 int right_index_)
const {
42 const TestMark::LinearizedRecord& lrec_(left_[left_index_]);
43 const TestMark::LinearizedRecord& rrec_(right_[right_index_]);
44 auto same_(lrec_.me->isEqualValueHash(*rrec_.me)
45 && lrec_.label == rrec_.label);
47 return std::make_tuple(
true, 1);
49 return std::make_tuple(
false, -1);
54 const TestMark::LinearizedRecord right_[],
55 int right_index_)
const {
61 const TestMark::LinearizedRecord left_[],
62 int left_index_)
const {
69 return score1_ > score2_;
84 return doGetHashCode();
89 long double precision_)
const {
90 if(
typeid(*
this) ==
typeid(other_))
91 return doIsEqual(other_, precision_);
98 long double precision_)
const {
99 if(
typeid(*
this) ==
typeid(other_))
100 return doIsEqualValue(other_, precision_);
107 long double precision_)
const {
108 if(
typeid(*
this) !=
typeid(other_))
110 if(doGetHashCode() != other_.doGetHashCode())
112 return doIsEqualValue(other_, precision_);
116 std::vector<LinearizedRecord>& array_)
const {
122 const std::string& prefix_)
const {
123 doPrintOpen(os_, prefix_);
128 const std::string& prefix_)
const {
129 doPrintClose(os_, prefix_);
134 doSerializeMark(serializer_);
140 doDeserializeMark(factory_, deserializer_);
143 void TestMark::computeDiff(
145 const std::vector<LinearizedRecord>& left_,
146 const std::vector<LinearizedRecord>& right_,
147 std::vector<LinearizedRecord>& left_result_,
148 std::vector<LinearizedRecord>& right_result_,
157 std::vector<LinearizedRecord> left_nested_;
158 std::vector<LinearizedRecord> right_nested_;
159 for(
const auto& diff_rec_ : diff_array_) {
162 switch(diff_rec_.action) {
165 left_term_ = diff_rec_.left_index;
168 left_term_ = left_index_ + diff_rec_.right_index - right_index_;
174 for(; left_index_ < left_term_; ++left_index_, ++right_index_) {
175 left_result_.push_back(left_[left_index_]);
176 right_result_.push_back(right_[right_index_]);
177 diff_.
addMatch(left_result_.size() - 1, right_result_.size() - 1);
180 left_nested_.clear();
181 right_nested_.clear();
182 left_[left_index_].me->doDiffArray(level_ + 1, left_nested_);
183 right_[right_index_].me->doDiffArray(level_ + 1, right_nested_);
194 switch(diff_rec_.action) {
196 left_result_.push_back(left_[left_index_]);
197 right_result_.push_back(right_[right_index_]);
203 if(left_[left_index_].me->isEqualValue(*right_[right_index_].me))
204 diff_.
addMatch(left_result_.size() - 1, right_result_.size() - 1);
206 diff_.
addChange(left_result_.size() - 1, right_result_.size() - 1);
209 left_nested_.clear();
210 right_nested_.clear();
211 left_[left_index_].me->doDiffArray(level_ + 1, left_nested_);
212 right_[right_index_].me->doDiffArray(level_ + 1, right_nested_);
227 left_result_.push_back(left_[left_index_]);
228 diff_.
addInsert(left_result_.size() - 1);
231 left_nested_.clear();
232 right_nested_.clear();
233 left_[left_index_].me->doDiffArray(level_ + 1, left_nested_);
246 right_result_.push_back(right_[right_index_]);
247 diff_.
addDelete(right_result_.size() - 1);
250 left_nested_.clear();
251 right_nested_.clear();
252 right_[right_index_].me->doDiffArray(level_ + 1, right_nested_);
271 for(; left_index_ < left_.size(); ++left_index_, ++right_index_) {
272 assert(right_index_ < right_.size());
274 left_result_.push_back(left_[left_index_]);
275 right_result_.push_back(right_[right_index_]);
276 diff_.
addMatch(left_result_.size() - 1, right_result_.size() - 1);
279 left_nested_.clear();
280 right_nested_.clear();
281 left_[left_index_].me->doDiffArray(level_ + 1, left_nested_);
282 right_[right_index_].me->doDiffArray(level_ + 1, right_nested_);
291 assert(right_index_ == right_.size());
294 void TestMark::computeDiff(
296 std::vector<LinearizedRecord>& left_,
297 std::vector<LinearizedRecord>& right_,
300 std::vector<LinearizedRecord> left_array_;
301 left_array_.push_back({0,
this,
""});
302 std::vector<LinearizedRecord> right_array_;
303 right_array_.push_back({0, &other_,
""});
306 std::vector<LinearizedRecord> left_result_;
307 std::vector<LinearizedRecord> right_result_;
308 computeDiff(0, left_array_, right_array_, left_result_, right_result_, diff_);
311 left_.swap(left_result_);
312 right_.swap(right_result_);
317 std::vector<LinearizedRecord> array_;
326 std::vector<LinearizedRecord> array_;