From 5ac570375c0b05de5d0ce51e83765040b62af918 Mon Sep 17 00:00:00 2001 From: Michael Reeves Date: Tue, 26 Mar 2019 19:13:15 -0400 Subject: [PATCH] Finish LineRef --- src/LineRef.h | 31 ++++++++++++++++++++----------- src/SourceData.cpp | 2 +- src/diff.cpp | 24 ++++++++++++------------ src/gnudiff_diff.h | 4 +--- src/kdiff3.cpp | 4 ++-- 5 files changed, 36 insertions(+), 29 deletions(-) diff --git a/src/LineRef.h b/src/LineRef.h index ac6a000..7379133 100644 --- a/src/LineRef.h +++ b/src/LineRef.h @@ -25,13 +25,21 @@ #include #include +#define TYPE_MAX(x) std::numeric_limits::max() class LineRef { public: typedef qint32 LineType; - LineRef() = default; - LineRef(const LineType i) { mLineNumber = i; } - operator LineType() const { return mLineNumber; } + inline LineRef() = default; + inline LineRef(const LineType i) { mLineNumber = i; } + inline LineRef(const qint64 i) + { + if(i <= TYPE_MAX(LineType)) + mLineNumber = (LineType)i; + else + mLineNumber = -1; + } + inline operator LineType() const { return mLineNumber; } inline void operator= (const LineType lineIn) { mLineNumber = lineIn; } inline LineRef& operator+=(const LineType& inLine) { @@ -39,22 +47,23 @@ class LineRef return *this; }; - void invalidate() { mLineNumber = -1; } - bool isValid() const { return mLineNumber != -1; } + inline void invalidate() { mLineNumber = -1; } + inline bool isValid() const { return mLineNumber != -1; } private: LineType mLineNumber = -1; }; -static_assert(std::is_copy_constructible::value, ""); -static_assert(std::is_copy_assignable::value, ""); -static_assert(std::is_move_constructible::value, ""); -static_assert(std::is_move_assignable::value, ""); -static_assert(std::is_convertible::value, ""); -static_assert(std::is_convertible::value, ""); +static_assert(std::is_copy_constructible::value, "LineRef must be copt constuctible."); +static_assert(std::is_copy_assignable::value, "LineRef must copy assignable."); +static_assert(std::is_move_constructible::value, "LineRef must be move constructible."); +static_assert(std::is_move_assignable::value, "LineRef not must be move assignable."); +static_assert(std::is_convertible::value, "Can not convert LineRef to int."); +static_assert(std::is_convertible::value, "Can not convert int to LineRef."); typedef LineRef::LineType LineCount; typedef size_t PtrDiffRef; typedef LineRef::LineType LineIndex; #endif + diff --git a/src/SourceData.cpp b/src/SourceData.cpp index 11bbb63..02aa541 100644 --- a/src/SourceData.cpp +++ b/src/SourceData.cpp @@ -173,7 +173,7 @@ const LineData* SourceData::getLineDataForDisplay() const LineRef SourceData::getSizeLines() const { - return (LineRef::LineType)(m_normalData.m_vSize); + return (LineRef)(m_normalData.m_vSize); } qint64 SourceData::getSizeBytes() const diff --git a/src/diff.cpp b/src/diff.cpp index a353d23..db9b00f 100644 --- a/src/diff.cpp +++ b/src/diff.cpp @@ -105,8 +105,8 @@ void calcDiff3LineListUsingAB( // First make d3ll for AB (from pDiffListAB) DiffList::const_iterator i = pDiffListAB->begin(); - int lineA = 0; - int lineB = 0; + LineRef::LineType lineA = 0; + LineRef::LineType lineB = 0; Diff d(0, 0, 0); for(;;) @@ -170,8 +170,8 @@ void calcDiff3LineListUsingAC( DiffList::const_iterator i = pDiffListAC->begin(); Diff3LineList::iterator i3 = d3ll.begin(); - int lineA = 0; - int lineC = 0; + LineRef::LineType lineA = 0; + LineRef::LineType lineC = 0; Diff d(0, 0, 0); for(;;) @@ -242,8 +242,8 @@ void calcDiff3LineListUsingBC( DiffList::const_iterator i = pDiffListBC->begin(); Diff3LineList::iterator i3b = d3ll.begin(); Diff3LineList::iterator i3c = d3ll.begin(); - int lineB = 0; - int lineC = 0; + LineRef::LineType lineB = 0; + LineRef::LineType lineC = 0; Diff d(0, 0, 0); for(;;) @@ -572,19 +572,19 @@ static bool runDiff(const LineData* p1, LineRef size1, const LineData* p2, LineR gnuDiff.ignore_case = false; GnuDiff::change* script = gnuDiff.diff_2_files(&comparisonInput); - LineRef equalLinesAtStart = (LineRef::LineType)comparisonInput.file[0].prefix_lines; + LineRef equalLinesAtStart = (LineRef)comparisonInput.file[0].prefix_lines; LineRef currentLine1 = 0; LineRef currentLine2 = 0; GnuDiff::change* p = nullptr; for(GnuDiff::change* e = script; e; e = p) { Diff d(0, 0, 0); - d.nofEquals = (LineRef::LineType)(e->line0 - currentLine1); + d.nofEquals = (LineRef)(e->line0 - currentLine1); Q_ASSERT(d.nofEquals == e->line1 - currentLine2); d.diff1 = e->deleted; d.diff2 = e->inserted; - currentLine1 += (LineRef::LineType)(d.nofEquals + d.diff1); - currentLine2 += (LineRef::LineType)(d.nofEquals + d.diff2); + currentLine1 += (LineRef)(d.nofEquals + d.diff1); + currentLine2 += (LineRef)(d.nofEquals + d.diff2); diffList.push_back(d); p = e->link; @@ -1303,8 +1303,8 @@ void calcDiff(const QChar* p1, LineRef size1, const QChar* p2, LineRef size2, Di DiffList::iterator i; for(i = diffList.begin(); i != diffList.end(); ++i) { - l1 += (LineRef::LineType)(i->nofEquals + i->diff1); - l2 += (LineRef::LineType)(i->nofEquals + i->diff2); + l1 += (LineRef)(i->nofEquals + i->diff1); + l2 += (LineRef)(i->nofEquals + i->diff2); } Q_ASSERT(l1 == size1 && l2 == size2); diff --git a/src/gnudiff_diff.h b/src/gnudiff_diff.h index 46326d6..4669cc8 100644 --- a/src/gnudiff_diff.h +++ b/src/gnudiff_diff.h @@ -43,12 +43,10 @@ #include "LineRef.h" /* The integer type of a line number. */ typedef qint64 GNULineRef; - -#define LINEREF_MAX std::numeric_limits::max() #define GNULINEREF_MAX std::numeric_limits::max() static_assert(sizeof(int) >= sizeof(qint32), "Legacy LP32 systems/compilers not supported");// e.g. Windows 16-bit static_assert(std::is_signed::value, "GNULineRef must be signed."); -static_assert(sizeof(GNULineRef) >= sizeof(size_t),"GNULineRef must be able to recieve size_t values."); +static_assert(sizeof(GNULineRef) >= sizeof(size_t),"GNULineRef must be able to receive size_t values."); inline bool isEndOfLine( QChar c ) { diff --git a/src/kdiff3.cpp b/src/kdiff3.cpp index 73aa86f..276d7f6 100644 --- a/src/kdiff3.cpp +++ b/src/kdiff3.cpp @@ -820,8 +820,8 @@ void KDiff3App::slotFilePrint() QPrinter printer; QPointer printDialog=QPointer(new QPrintDialog(&printer, this)); - LineRef firstSelectionD3LIdx = -1; - LineRef lastSelectionD3LIdx = -1; + LineRef firstSelectionD3LIdx; + LineRef lastSelectionD3LIdx; m_pDiffTextWindow1->getSelectionRange(&firstSelectionD3LIdx, &lastSelectionD3LIdx, eD3LLineCoords); -- GitLab