joachim99@8
|
1 /***************************************************************************
|
joachim99@8
|
2 merger.cpp - description
|
joachim99@8
|
3 -------------------
|
joachim99@8
|
4 begin : Sun Mar 24 2002
|
joachim99@77
|
5 copyright : (C) 2002-2007 by Joachim Eibl
|
joachim99@69
|
6 email : joachim.eibl at gmx.de
|
joachim99@8
|
7 ***************************************************************************/
|
joachim99@8
|
8
|
joachim99@8
|
9 /***************************************************************************
|
joachim99@8
|
10 * *
|
joachim99@8
|
11 * This program is free software; you can redistribute it and/or modify *
|
joachim99@8
|
12 * it under the terms of the GNU General Public License as published by *
|
joachim99@8
|
13 * the Free Software Foundation; either version 2 of the License, or *
|
joachim99@8
|
14 * (at your option) any later version. *
|
joachim99@8
|
15 * *
|
joachim99@8
|
16 ***************************************************************************/
|
joachim99@8
|
17
|
joachim99@8
|
18 #include "merger.h"
|
joachim99@8
|
19 #include <assert.h>
|
joachim99@8
|
20 #include <iostream>
|
joachim99@8
|
21 #include <iomanip>
|
joachim99@8
|
22
|
joachim99@8
|
23 Merger::Merger( const DiffList* pDiffListAB, const DiffList* pDiffListCA )
|
joachim99@8
|
24 : md1( pDiffListAB, 0 ), md2( pDiffListCA, 1 )
|
joachim99@8
|
25 {
|
joachim99@8
|
26 }
|
joachim99@8
|
27
|
joachim99@8
|
28
|
joachim99@8
|
29 Merger::MergeData::MergeData( const DiffList* p, int i )
|
joachim99@8
|
30 : d(0,0,0)
|
joachim99@8
|
31 {
|
joachim99@8
|
32 idx=i;
|
joachim99@8
|
33 pDiffList = p;
|
joachim99@8
|
34 if ( p!=0 )
|
joachim99@8
|
35 {
|
joachim99@8
|
36 it=p->begin();
|
joachim99@8
|
37 update();
|
joachim99@8
|
38 }
|
joachim99@8
|
39 }
|
joachim99@8
|
40
|
joachim99@8
|
41 bool Merger::MergeData::eq()
|
joachim99@8
|
42 {
|
joachim99@8
|
43 return pDiffList==0 || d.nofEquals > 0;
|
joachim99@8
|
44 }
|
joachim99@8
|
45
|
joachim99@8
|
46 bool Merger::MergeData::isEnd()
|
joachim99@8
|
47 {
|
joachim99@8
|
48 return ( pDiffList==0 || ( it==pDiffList->end() && d.nofEquals==0 &&
|
joachim99@8
|
49 ( idx == 0 ? d.diff1==0 : d.diff2==0 )
|
joachim99@8
|
50 ) );
|
joachim99@8
|
51 }
|
joachim99@8
|
52
|
joachim99@8
|
53 void Merger::MergeData::update()
|
joachim99@8
|
54 {
|
joachim99@8
|
55 if ( d.nofEquals > 0 )
|
joachim99@8
|
56 --d.nofEquals;
|
joachim99@8
|
57 else if ( idx==0 && d.diff1 > 0 )
|
joachim99@8
|
58 --d.diff1;
|
joachim99@8
|
59 else if ( idx==1 && d.diff2 > 0 )
|
joachim99@8
|
60 --d.diff2;
|
joachim99@8
|
61
|
joachim99@8
|
62 while( d.nofEquals == 0 && (idx==0 && d.diff1 == 0 || idx==1 && d.diff2 == 0)
|
joachim99@8
|
63 && pDiffList!=0 && it != pDiffList->end() )
|
joachim99@8
|
64 {
|
joachim99@8
|
65 d = *it;
|
joachim99@8
|
66 ++it;
|
joachim99@8
|
67 }
|
joachim99@8
|
68 }
|
joachim99@8
|
69
|
joachim99@8
|
70 void Merger::next()
|
joachim99@8
|
71 {
|
joachim99@8
|
72 md1.update();
|
joachim99@8
|
73 md2.update();
|
joachim99@8
|
74 }
|
joachim99@8
|
75
|
joachim99@8
|
76 int Merger::whatChanged()
|
joachim99@8
|
77 {
|
joachim99@8
|
78 int changed = 0;
|
joachim99@8
|
79 changed |= md1.eq() ? 0 : 1;
|
joachim99@8
|
80 changed |= md2.eq() ? 0 : 2;
|
joachim99@8
|
81 return changed;
|
joachim99@8
|
82 }
|
joachim99@8
|
83
|
joachim99@8
|
84 bool Merger::isEndReached()
|
joachim99@8
|
85 {
|
joachim99@8
|
86 return md1.isEnd() && md2.isEnd();
|
joachim99@8
|
87 }
|