1 /*
2  *  This file is part of KDiff3.
3  *
4  * SPDX-FileCopyrightText: 2002-2011 Joachim Eibl, joachim.eibl at gmx.de
5  * SPDX-FileCopyrightText: 2018-2020 Michael Reeves reeves.87@gmail.com
6  * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8 
9 #include "merger.h"
10 
11 #include <list>
12 
Merger(const DiffList * pDiffList1,const DiffList * pDiffList2)13 Merger::Merger(const DiffList* pDiffList1, const DiffList* pDiffList2)
14     : md1(pDiffList1, 0), md2(pDiffList2, 1)
15 {
16 }
17 
MergeData(const DiffList * p,int i)18 Merger::MergeData::MergeData(const DiffList* p, int i)
19 {
20     idx = i;
21     pDiffList = p;
22     if(p != nullptr)
23     {
24         it = p->begin();
25         update();
26     }
27 }
28 
eq() const29 bool Merger::MergeData::eq() const
30 {
31     return pDiffList == nullptr || d.numberOfEquals() > 0;
32 }
33 
isEnd() const34 bool Merger::MergeData::isEnd() const
35 {
36     return (pDiffList == nullptr || (it == pDiffList->end() && d.numberOfEquals() == 0 &&
37                                      (idx == 0 ? d.diff1() == 0 : d.diff2() == 0)));
38 }
39 
update()40 void Merger::MergeData::update()
41 {
42     if(d.numberOfEquals() > 0)
43         d.adjustNumberOfEquals(-1);
44     else if(idx == 0 && d.diff1() > 0)
45         d.adjustDiff1(-1);
46     else if(idx == 1 && d.diff2() > 0)
47         d.adjustDiff2(-1);
48 
49     while(d.numberOfEquals() == 0 && ((idx == 0 && d.diff1() == 0) || (idx == 1 && d.diff2() == 0)) && pDiffList != nullptr && it != pDiffList->end())
50     {
51         d = *it;
52         ++it;
53     }
54 }
55 
next()56 void Merger::next()
57 {
58     md1.update();
59     md2.update();
60 }
61 
whatChanged()62 ChangeFlags Merger::whatChanged()
63 {
64     ChangeFlags changed = ChangeFlag::NoChange;
65     changed |= md1.eq() ? ChangeFlag::NoChange : ChangeFlag::AChanged;
66     changed |= md2.eq() ? ChangeFlag::NoChange : ChangeFlag::BChanged;
67     return changed;
68 }
69 
isEndReached()70 bool Merger::isEndReached()
71 {
72     return md1.isEnd() && md2.isEnd();
73 }
74