joachim99@8: /*************************************************************************** joachim99@8: merger.cpp - description joachim99@8: ------------------- joachim99@8: begin : Sun Mar 24 2002 joachim99@77: copyright : (C) 2002-2007 by Joachim Eibl joachim99@69: email : joachim.eibl at gmx.de joachim99@8: ***************************************************************************/ joachim99@8: joachim99@8: /*************************************************************************** joachim99@8: * * joachim99@8: * This program is free software; you can redistribute it and/or modify * joachim99@8: * it under the terms of the GNU General Public License as published by * joachim99@8: * the Free Software Foundation; either version 2 of the License, or * joachim99@8: * (at your option) any later version. * joachim99@8: * * joachim99@8: ***************************************************************************/ joachim99@8: joachim99@8: #include "merger.h" joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: joachim99@8: Merger::Merger( const DiffList* pDiffListAB, const DiffList* pDiffListCA ) joachim99@8: : md1( pDiffListAB, 0 ), md2( pDiffListCA, 1 ) joachim99@8: { joachim99@8: } joachim99@8: joachim99@8: joachim99@8: Merger::MergeData::MergeData( const DiffList* p, int i ) joachim99@8: : d(0,0,0) joachim99@8: { joachim99@8: idx=i; joachim99@8: pDiffList = p; joachim99@8: if ( p!=0 ) joachim99@8: { joachim99@8: it=p->begin(); joachim99@8: update(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: bool Merger::MergeData::eq() joachim99@8: { joachim99@8: return pDiffList==0 || d.nofEquals > 0; joachim99@8: } joachim99@8: joachim99@8: bool Merger::MergeData::isEnd() joachim99@8: { joachim99@8: return ( pDiffList==0 || ( it==pDiffList->end() && d.nofEquals==0 && joachim99@8: ( idx == 0 ? d.diff1==0 : d.diff2==0 ) joachim99@8: ) ); joachim99@8: } joachim99@8: joachim99@8: void Merger::MergeData::update() joachim99@8: { joachim99@8: if ( d.nofEquals > 0 ) joachim99@8: --d.nofEquals; joachim99@8: else if ( idx==0 && d.diff1 > 0 ) joachim99@8: --d.diff1; joachim99@8: else if ( idx==1 && d.diff2 > 0 ) joachim99@8: --d.diff2; joachim99@8: joachim99@8: while( d.nofEquals == 0 && (idx==0 && d.diff1 == 0 || idx==1 && d.diff2 == 0) joachim99@8: && pDiffList!=0 && it != pDiffList->end() ) joachim99@8: { joachim99@8: d = *it; joachim99@8: ++it; joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: void Merger::next() joachim99@8: { joachim99@8: md1.update(); joachim99@8: md2.update(); joachim99@8: } joachim99@8: joachim99@8: int Merger::whatChanged() joachim99@8: { joachim99@8: int changed = 0; joachim99@8: changed |= md1.eq() ? 0 : 1; joachim99@8: changed |= md2.eq() ? 0 : 2; joachim99@8: return changed; joachim99@8: } joachim99@8: joachim99@8: bool Merger::isEndReached() joachim99@8: { joachim99@8: return md1.isEnd() && md2.isEnd(); joachim99@8: }