Commit e4310baf authored by Michael Reeves's avatar Michael Reeves

Split MergeEditLine and friends.

parent 03b7aafa
......@@ -29,7 +29,8 @@ set(kdiff3part_PART_SRCS
SourceData.cpp
Overview.cpp
Logging.cpp
FileNameLineEdit.cpp )
FileNameLineEdit.cpp
MergeEditLine.cpp )
add_library(kdiff3part MODULE ${kdiff3part_PART_SRCS})
......
/***************************************************************************
* Copyright (C) 2002-2007 by Joachim Eibl <joachim.eibl at gmx.de> *
* Copyright (C) 2018 Michael Reeves reeves.87@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "MergeEditLine.h"
QString MergeEditLine::getString(const LineData* pLineDataA, const LineData* pLineDataB, const LineData* pLineDataC)
{
if(isRemoved())
{
return QString();
}
if(!isModified())
{
int src = m_src;
if(src == 0)
{
return QString();
}
const Diff3Line& d3l = *m_id3l;
const LineData* pld = nullptr;
Q_ASSERT(src == A || src == B || src == C);
if(src == A && d3l.getLineA().isValid())
pld = &pLineDataA[d3l.getLineA()];
else if(src == B && d3l.getLineB().isValid())
pld = &pLineDataB[d3l.getLineB()];
else if(src == C && d3l.getLineC().isValid())
pld = &pLineDataC[d3l.getLineC()];
//Not an error.
if(pld == nullptr)
{
return QString();
}
return QString(pld->getLine(), pld->size());
}
else
{
return m_str;
}
return QString();
}
/***************************************************************************
* Copyright (C) 2002-2007 by Joachim Eibl <joachim.eibl at gmx.de> *
* Copyright (C) 2018 Michael Reeves reeves.87@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef MERGEEDITLINE_H
#include "diff.h"
#include <QString>
class MergeResultWindow;
class MergeEditLine
{
public:
explicit MergeEditLine(const Diff3LineList::const_iterator& i, e_SrcSelector src = None)
{
m_id3l = i;
m_src = src;
m_bLineRemoved = false;
}
void setConflict()
{
m_src = None;
m_bLineRemoved = false;
m_str = QString();
}
bool isConflict() { return m_src == None && !m_bLineRemoved && m_str.isEmpty(); }
void setRemoved(e_SrcSelector src = None)
{
m_src = src;
m_bLineRemoved = true;
m_str = QString();
}
bool isRemoved() { return m_bLineRemoved; }
bool isEditableText() { return !isConflict() && !isRemoved(); }
void setString(const QString& s)
{
m_str = s;
m_bLineRemoved = false;
m_src = None;
}
QString getString(const LineData* pLineDataA, const LineData* pLineDataB, const LineData* pLineDataC);
bool isModified() { return !m_str.isEmpty() || (m_bLineRemoved && m_src == None); }
void setSource(e_SrcSelector src, bool bLineRemoved)
{
m_src = src;
m_bLineRemoved = bLineRemoved;
}
e_SrcSelector src() { return m_src; }
Diff3LineList::const_iterator id3l() { return m_id3l; }
private:
Diff3LineList::const_iterator m_id3l;
e_SrcSelector m_src; // 1, 2 or 3 for A, B or C respectively, or 0 when line is from neither source.
QString m_str; // String when modified by user or null-string when orig data is used.
bool m_bLineRemoved;
};
class MergeEditLineList : private std::list<MergeEditLine>
{ // I want to know the size immediately!
private:
typedef std::list<MergeEditLine> BASE;
int m_size;
int* m_pTotalSize;
public:
typedef std::list<MergeEditLine>::iterator iterator;
typedef std::list<MergeEditLine>::reverse_iterator reverse_iterator;
typedef std::list<MergeEditLine>::const_iterator const_iterator;
MergeEditLineList()
{
m_size = 0;
m_pTotalSize = nullptr;
}
void clear()
{
ds(-m_size);
BASE::clear();
}
void push_back(const MergeEditLine& m)
{
ds(+1);
BASE::push_back(m);
}
void push_front(const MergeEditLine& m)
{
ds(+1);
BASE::push_front(m);
}
void pop_back()
{
ds(-1);
BASE::pop_back();
}
iterator erase(iterator i)
{
ds(-1);
return BASE::erase(i);
}
iterator insert(iterator i, const MergeEditLine& m)
{
ds(+1);
return BASE::insert(i, m);
}
int size()
{
if(!m_pTotalSize) m_size = (int)BASE::size();
return m_size;
}
iterator begin() { return BASE::begin(); }
iterator end() { return BASE::end(); }
reverse_iterator rbegin() { return BASE::rbegin(); }
reverse_iterator rend() { return BASE::rend(); }
MergeEditLine& front() { return BASE::front(); }
MergeEditLine& back() { return BASE::back(); }
bool empty() { return m_size == 0; }
void splice(iterator destPos, MergeEditLineList& srcList, iterator srcFirst, iterator srcLast)
{
int* pTotalSize = getTotalSizePtr() ? getTotalSizePtr() : srcList.getTotalSizePtr();
srcList.setTotalSizePtr(nullptr); // Force size-recalc after splice, because splice doesn't handle size-tracking
setTotalSizePtr(nullptr);
BASE::splice(destPos, srcList, srcFirst, srcLast);
srcList.setTotalSizePtr(pTotalSize);
setTotalSizePtr(pTotalSize);
}
void setTotalSizePtr(int* pTotalSize)
{
if(pTotalSize == nullptr && m_pTotalSize != nullptr) { *m_pTotalSize -= size(); }
else if(pTotalSize != nullptr && m_pTotalSize == nullptr)
{
*pTotalSize += size();
}
m_pTotalSize = pTotalSize;
}
int* getTotalSizePtr()
{
return m_pTotalSize;
}
private:
void ds(int deltaSize)
{
m_size += deltaSize;
if(m_pTotalSize != nullptr) *m_pTotalSize += deltaSize;
}
};
class MergeLine
{
public:
Diff3LineList::const_iterator id3l;
int d3lLineIdx = -1; // Needed to show the correct window pos.
int srcRangeLength = 0; // how many src-lines have this properties
e_MergeDetails mergeDetails = eDefault;
bool bConflict = false;
bool bWhiteSpaceConflict = false;
bool bDelta = false;
e_SrcSelector srcSelect = None;
MergeEditLineList mergeEditLineList;
void split(MergeLine& ml2, int d3lLineIdx2) // The caller must insert the ml2 after this ml in the m_mergeLineList
{
if(d3lLineIdx2 < d3lLineIdx || d3lLineIdx2 >= d3lLineIdx + srcRangeLength)
return; //Error
ml2.mergeDetails = mergeDetails;
ml2.bConflict = bConflict;
ml2.bWhiteSpaceConflict = bWhiteSpaceConflict;
ml2.bDelta = bDelta;
ml2.srcSelect = srcSelect;
ml2.d3lLineIdx = d3lLineIdx2;
ml2.srcRangeLength = srcRangeLength - (d3lLineIdx2 - d3lLineIdx);
srcRangeLength = d3lLineIdx2 - d3lLineIdx; // current MergeLine controls fewer lines
ml2.id3l = id3l;
for(int i = 0; i < srcRangeLength; ++i)
++ml2.id3l;
ml2.mergeEditLineList.clear();
// Search for best place to splice
for(MergeEditLineList::iterator i = mergeEditLineList.begin(); i != mergeEditLineList.end(); ++i)
{
if(i->id3l() == ml2.id3l)
{
ml2.mergeEditLineList.splice(ml2.mergeEditLineList.begin(), mergeEditLineList, i, mergeEditLineList.end());
return;
}
}
ml2.mergeEditLineList.setTotalSizePtr(mergeEditLineList.getTotalSizePtr());
ml2.mergeEditLineList.push_back(MergeEditLine(ml2.id3l));
}
void join(MergeLine& ml2) // The caller must remove the ml2 from the m_mergeLineList after this call
{
srcRangeLength += ml2.srcRangeLength;
ml2.mergeEditLineList.clear();
mergeEditLineList.clear();
mergeEditLineList.push_back(MergeEditLine(id3l)); // Create a simple conflict
if(ml2.bConflict) bConflict = true;
if(!ml2.bWhiteSpaceConflict) bWhiteSpaceConflict = false;
if(ml2.bDelta) bDelta = true;
}
};
typedef std::list<MergeLine> MergeLineList;
#endif
......@@ -603,7 +603,7 @@ int MergeResultWindow::getMaxTextWidth()
for(melIt = ml.mergeEditLineList.begin(); melIt != ml.mergeEditLineList.end(); ++melIt)
{
MergeEditLine& mel = *melIt;
QString s = mel.getString(this);
QString s = mel.getString(m_pldA, m_pldB, m_pldC);
QTextLayout textLayout(s, font(), this);
textLayout.beginLayout();
......@@ -1323,7 +1323,7 @@ void MergeResultWindow::collectHistoryInformation(
// End of the history
}
MergeResultWindow::MergeEditLineList& MergeResultWindow::HistoryMapEntry::choice(bool bThreeInputs)
MergeEditLineList& MergeResultWindow::HistoryMapEntry::choice(bool bThreeInputs)
{
if(!bThreeInputs)
return mellA.empty() ? mellB : mellA;
......@@ -1490,8 +1490,8 @@ void MergeResultWindow::slotMergeHistory()
// If the end of start is empty and the first line at the end is empty remove the last line of start
if(!iMLLStart->mergeEditLineList.empty() && !iMLLEnd->mergeEditLineList.empty())
{
QString lastLineOfStart = iMLLStart->mergeEditLineList.back().getString(this);
QString firstLineOfEnd = iMLLEnd->mergeEditLineList.front().getString(this);
QString lastLineOfStart = iMLLStart->mergeEditLineList.back().getString(m_pldA, m_pldB, m_pldC);
QString firstLineOfEnd = iMLLEnd->mergeEditLineList.front().getString(m_pldA, m_pldB, m_pldC);
if(lastLineOfStart.mid(lead.length()).trimmed().isEmpty() && firstLineOfEnd.mid(lead.length()).trimmed().isEmpty())
iMLLStart->mergeEditLineList.pop_back();
}
......@@ -1549,7 +1549,7 @@ bool MergeResultWindow::doRelevantChangesExist()
}
// Returns the iterator to the MergeLine after the split
MergeResultWindow::MergeLineList::iterator MergeResultWindow::splitAtDiff3LineIdx(int d3lLineIdx)
MergeLineList::iterator MergeResultWindow::splitAtDiff3LineIdx(int d3lLineIdx)
{
MergeLineList::iterator i;
for(i = m_mergeLineList.begin(); i != m_mergeLineList.end(); ++i)
......@@ -1657,45 +1657,6 @@ void MergeResultWindow::timerEvent(QTimerEvent*)
}
}
QString MergeResultWindow::MergeEditLine::getString(const MergeResultWindow* mrw)
{
if(isRemoved())
{
return QString();
}
if(!isModified())
{
int src = m_src;
if(src == 0)
{
return QString();
}
const Diff3Line& d3l = *m_id3l;
const LineData* pld = nullptr;
Q_ASSERT(src == A || src == B || src == C);
if(src == A && d3l.getLineA().isValid())
pld = &mrw->m_pldA[d3l.getLineA()];
else if(src == B && d3l.getLineB().isValid())
pld = &mrw->m_pldB[d3l.getLineB()];
else if(src == C && d3l.getLineC().isValid())
pld = &mrw->m_pldC[d3l.getLineC()];
//Not an error.
if(pld == nullptr)
{
return QString();
}
return QString(pld->getLine(), pld->size());
}
else
{
return m_str;
}
return QString();
}
/// Converts the cursor-posOnScreen into a text index, considering tabulators.
int convertToPosInText(const QString& /*s*/, int posOnScreen, int /*tabSize*/)
{
......@@ -1979,7 +1940,7 @@ void MergeResultWindow::paintEvent(QPaintEvent*)
if(mlIt == m_currentMergeLineIt) rangeMark |= 4; // Mark of the current line
QString s;
s = mel.getString(this);
s = mel.getString(m_pldA, m_pldB, m_pldC);
writeLine(p, line, s, mel.src(), ml.mergeDetails, rangeMark,
mel.isModified(), mel.isRemoved(), ml.bWhiteSpaceConflict);
......@@ -2302,7 +2263,7 @@ void MergeResultWindow::keyPressEvent(QKeyEvent* e)
MergeEditLineList::iterator melIt;
calcIteratorFromLineNr(y, mlIt, melIt);
QString str = melIt->getString(this);
QString str = melIt->getString(m_pldA, m_pldB, m_pldC);
int x = convertToPosInText(str, m_cursorXPos, m_pOptions->m_tabSize);
QTextLayout textLayoutOrig(str, font(), this);
......@@ -2342,7 +2303,7 @@ void MergeResultWindow::keyPressEvent(QKeyEvent* e)
calcIteratorFromLineNr(y + 1, mlIt1, melIt1);
if(melIt1->isEditableText())
{
QString s2 = melIt1->getString(this);
QString s2 = melIt1->getString(m_pldA, m_pldB, m_pldC);
melIt->setString(str + s2);
// Remove the line
......@@ -2376,7 +2337,7 @@ void MergeResultWindow::keyPressEvent(QKeyEvent* e)
calcIteratorFromLineNr(y - 1, mlIt1, melIt1);
if(melIt1->isEditableText())
{
QString s1 = melIt1->getString(this);
QString s1 = melIt1->getString(m_pldA, m_pldB, m_pldC);
melIt1->setString(s1 + str);
// Remove the previous line
......@@ -2413,7 +2374,7 @@ void MergeResultWindow::keyPressEvent(QKeyEvent* e)
MergeEditLineList::iterator melIt1 = melIt;
for(;;)
{
const QString s = melIt1->getString(this);
const QString s = melIt1->getString(m_pldA, m_pldB, m_pldC);
if(!s.isEmpty())
{
int i;
......@@ -2617,7 +2578,7 @@ void MergeResultWindow::keyPressEvent(QKeyEvent* e)
y = qBound(0, y, m_totalSize - 1);
calcIteratorFromLineNr(y, mlIt, melIt);
str = melIt->getString(this);
str = melIt->getString(m_pldA, m_pldB, m_pldC);
x = qBound(0, x, (int)str.length());
......@@ -2690,8 +2651,8 @@ void MergeResultWindow::keyPressEvent(QKeyEvent* e)
void MergeResultWindow::calcIteratorFromLineNr(
int line,
MergeResultWindow::MergeLineList::iterator& mlIt,
MergeResultWindow::MergeEditLineList::iterator& melIt)
MergeLineList::iterator& mlIt,
MergeEditLineList::iterator& melIt)
{
for(mlIt = m_mergeLineList.begin(); mlIt != m_mergeLineList.end(); ++mlIt)
{
......@@ -2730,7 +2691,7 @@ QString MergeResultWindow::getSelection()
int outPos = 0;
if(mel.isEditableText())
{
const QString str = mel.getString(this);
const QString str = mel.getString(m_pldA, m_pldB, m_pldC);
// Consider tabs
......@@ -2780,7 +2741,7 @@ bool MergeResultWindow::deleteSelection2(QString& s, int& x, int& y,
deleteSelection();
y = m_cursorYPos;
calcIteratorFromLineNr(y, mlIt, melIt);
s = melIt->getString(this);
s = melIt->getString(m_pldA, m_pldB, m_pldC);
x = convertToPosInText(s, m_cursorXPos, m_pOptions->m_tabSize);
return true;
}
......@@ -2844,7 +2805,7 @@ void MergeResultWindow::deleteSelection()
if(mel.isEditableText() && m_selection.lineWithin(line))
{
QString lineString = mel.getString(this);
QString lineString = mel.getString(m_pldA, m_pldB, m_pldC);
int firstPosInLine = m_selection.firstPosInLine(line);
int lastPosInLine = m_selection.lastPosInLine(line);
......@@ -2900,7 +2861,7 @@ void MergeResultWindow::pasteClipboard(bool bFromSelection)
calcIteratorFromLineNr(y, mlIt, melIt);
melItAfter = melIt;
++melItAfter;
QString str = melIt->getString(this);
QString str = melIt->getString(m_pldA, m_pldB, m_pldC);
int x = convertToPosInText(str, m_cursorXPos, m_pOptions->m_tabSize);
if(!QApplication::clipboard()->supportsSelection())
......@@ -3012,7 +2973,7 @@ bool MergeResultWindow::saveDocument(const QString& fileName, QTextCodec* pEncod
if(mel.isEditableText())
{
QString str = mel.getString(this);
QString str = mel.getString(m_pldA, m_pldB, m_pldC);
if(line > 0) // Prepend line feed, but not for first line
{
......@@ -3047,14 +3008,14 @@ bool MergeResultWindow::saveDocument(const QString& fileName, QTextCodec* pEncod
QString MergeResultWindow::getString(int lineIdx)
{
MergeResultWindow::MergeLineList::iterator mlIt;
MergeResultWindow::MergeEditLineList::iterator melIt;
MergeLineList::iterator mlIt;
MergeEditLineList::iterator melIt;
if(m_mergeLineList.empty())
{
return QString();
}
calcIteratorFromLineNr(lineIdx, mlIt, melIt);
QString s = melIt->getString(this);
QString s = melIt->getString(m_pldA, m_pldB, m_pldC);
return s;
}
......
......@@ -16,6 +16,7 @@
#include "selection.h"
#include "Overview.h"
#include "FileNameLineEdit.h"
#include "MergeEditLine.h"
#include <QWidget>
#include <QTimer>
......@@ -147,144 +148,8 @@ private:
void showUnsolvedConflictsStatusMessage();
private:
class MergeEditLine
{
public:
explicit MergeEditLine(const Diff3LineList::const_iterator &i, e_SrcSelector src=None){m_id3l=i; m_src=src; m_bLineRemoved=false; }
void setConflict() { m_src=None; m_bLineRemoved=false; m_str=QString(); }
bool isConflict() { return m_src==None && !m_bLineRemoved && m_str.isEmpty(); }
void setRemoved(e_SrcSelector src=None) { m_src=src; m_bLineRemoved=true; m_str=QString(); }
bool isRemoved() { return m_bLineRemoved; }
bool isEditableText() { return !isConflict() && !isRemoved(); }
void setString( const QString& s ){ m_str=s; m_bLineRemoved=false; m_src=None; }
QString getString( const MergeResultWindow* );
bool isModified() { return ! m_str.isEmpty() || (m_bLineRemoved && m_src==None); }
void setSource( e_SrcSelector src, bool bLineRemoved ) { m_src=src; m_bLineRemoved =bLineRemoved; }
e_SrcSelector src() { return m_src; }
Diff3LineList::const_iterator id3l(){return m_id3l;}
// getString() is implemented as MergeResultWindow::getString()
private:
Diff3LineList::const_iterator m_id3l;
e_SrcSelector m_src; // 1, 2 or 3 for A, B or C respectively, or 0 when line is from neither source.
QString m_str; // String when modified by user or null-string when orig data is used.
bool m_bLineRemoved;
};
class MergeEditLineList : private std::list<MergeEditLine>
{ // I want to know the size immediately!
private:
typedef std::list<MergeEditLine> BASE;
int m_size;
int* m_pTotalSize;
public:
typedef std::list<MergeEditLine>::iterator iterator;
typedef std::list<MergeEditLine>::reverse_iterator reverse_iterator;
typedef std::list<MergeEditLine>::const_iterator const_iterator;
MergeEditLineList(){m_size=0; m_pTotalSize=nullptr; }
void clear() { ds(-m_size); BASE::clear(); }
void push_back( const MergeEditLine& m) { ds(+1); BASE::push_back(m); }
void push_front( const MergeEditLine& m) { ds(+1); BASE::push_front(m); }
void pop_back() { ds(-1); BASE::pop_back(); }
iterator erase( iterator i ) { ds(-1); return BASE::erase(i); }
iterator insert( iterator i, const MergeEditLine& m ) { ds(+1); return BASE::insert(i,m); }
int size(){ if (!m_pTotalSize) m_size = (int) BASE::size(); return m_size; }
iterator begin(){return BASE::begin();}
iterator end(){return BASE::end();}
reverse_iterator rbegin(){return BASE::rbegin();}
reverse_iterator rend(){return BASE::rend();}
MergeEditLine& front(){return BASE::front();}
MergeEditLine& back(){return BASE::back();}
bool empty() { return m_size==0; }
void splice(iterator destPos, MergeEditLineList& srcList, iterator srcFirst, iterator srcLast)
{
int* pTotalSize = getTotalSizePtr() ? getTotalSizePtr() : srcList.getTotalSizePtr();
srcList.setTotalSizePtr(nullptr); // Force size-recalc after splice, because splice doesn't handle size-tracking
setTotalSizePtr(nullptr);
BASE::splice( destPos, srcList, srcFirst, srcLast );
srcList.setTotalSizePtr( pTotalSize );
setTotalSizePtr( pTotalSize );
}
void setTotalSizePtr(int* pTotalSize)
{
if ( pTotalSize==nullptr && m_pTotalSize!=nullptr ) { *m_pTotalSize -= size(); }
else if ( pTotalSize!=nullptr && m_pTotalSize==nullptr ) { *pTotalSize += size(); }
m_pTotalSize = pTotalSize;
}
int* getTotalSizePtr()
{
return m_pTotalSize;
}
private:
void ds(int deltaSize)
{
m_size+=deltaSize;
if (m_pTotalSize!=nullptr) *m_pTotalSize+=deltaSize;
}
};
friend class MergeEditLine;
class MergeLine
{
public:
Diff3LineList::const_iterator id3l;
int d3lLineIdx = -1; // Needed to show the correct window pos.
int srcRangeLength = 0; // how many src-lines have this properties
e_MergeDetails mergeDetails = eDefault;
bool bConflict = false;
bool bWhiteSpaceConflict = false;
bool bDelta = false;
e_SrcSelector srcSelect = None;
MergeEditLineList mergeEditLineList;
void split( MergeLine& ml2, int d3lLineIdx2 ) // The caller must insert the ml2 after this ml in the m_mergeLineList
{
if ( d3lLineIdx2<d3lLineIdx || d3lLineIdx2 >= d3lLineIdx + srcRangeLength )
return; //Error
ml2.mergeDetails = mergeDetails;
ml2.bConflict = bConflict;
ml2.bWhiteSpaceConflict = bWhiteSpaceConflict;
ml2.bDelta = bDelta;
ml2.srcSelect = srcSelect;
ml2.d3lLineIdx = d3lLineIdx2;
ml2.srcRangeLength = srcRangeLength - (d3lLineIdx2-d3lLineIdx);
srcRangeLength = d3lLineIdx2-d3lLineIdx; // current MergeLine controls fewer lines
ml2.id3l = id3l;
for(int i=0; i<srcRangeLength; ++i)
++ml2.id3l;
ml2.mergeEditLineList.clear();
// Search for best place to splice
for(MergeEditLineList::iterator i=mergeEditLineList.begin(); i!=mergeEditLineList.end();++i)
{
if (i->id3l()==ml2.id3l)
{
ml2.mergeEditLineList.splice( ml2.mergeEditLineList.begin(), mergeEditLineList, i, mergeEditLineList.end() );
return;
}
}
ml2.mergeEditLineList.setTotalSizePtr( mergeEditLineList.getTotalSizePtr() );
ml2.mergeEditLineList.push_back(MergeEditLine(ml2.id3l));
}
void join( MergeLine& ml2 ) // The caller must remove the ml2 from the m_mergeLineList after this call
{
srcRangeLength += ml2.srcRangeLength;
ml2.mergeEditLineList.clear();
mergeEditLineList.clear();
mergeEditLineList.push_back(MergeEditLine(id3l)); // Create a simple conflict
if ( ml2.bConflict ) bConflict = true;
if ( !ml2.bWhiteSpaceConflict ) bWhiteSpaceConflict = false;
if ( ml2.bDelta ) bDelta = true;
}
};
private:
static bool sameKindCheck( const MergeLine& ml1, const MergeLine& ml2 );
struct HistoryMapEntry
{
static bool sameKindCheck(const MergeLine& ml1, const MergeLine& ml2);
struct HistoryMapEntry {
MergeEditLineList mellA;
MergeEditLineList mellB;
MergeEditLineList mellC;
......@@ -294,7 +159,6 @@ private:
typedef std::map<QString,HistoryMapEntry> HistoryMap;
void collectHistoryInformation( e_SrcSelector src, Diff3LineList::const_iterator &iHistoryBegin, Diff3LineList::const_iterator &iHistoryEnd, HistoryMap& historyMap, std::list< HistoryMap::iterator >& hitList );
typedef std::list<MergeLine> MergeLineList;
MergeLineList m_mergeLineList;
MergeLineList::iterator m_currentMergeLineIt;
bool isItAtEnd( bool bIncrement, MergeLineList::iterator i )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment