diff --git a/src/LineRef.h b/src/LineRef.h index f887dc1..d83af37 100644 --- a/src/LineRef.h +++ b/src/LineRef.h @@ -1,89 +1,90 @@ /* * KDiff3 - Text Diff And Merge Tool * * SPDX-FileCopyrightText: 2018-2020 Michael Reeves reeves.87@gmail.com * SPDX-License-Identifier: GPL-2.0-or-later */ #ifndef LINEREF_H #define LINEREF_H #include "TypeUtils.h" #include #include #include class LineRef { public: typedef qint32 LineType; - inline LineRef() = default; - inline LineRef(const LineType i) { mLineNumber = i; } - inline LineRef(const qint64 i) + inline LineRef() noexcept = default; + inline LineRef(const LineType i) noexcept { mLineNumber = i; } + inline LineRef(const qint64 i) noexcept { if(i <= TYPE_MAX(LineType)) mLineNumber = (LineType)i; else mLineNumber = -1; } - inline operator LineType() const { return mLineNumber; } - inline LineRef& operator=(const LineType lineIn) { + inline operator LineType() const noexcept { return mLineNumber; } + inline LineRef& operator=(const LineType lineIn) noexcept + { mLineNumber = lineIn; return *this; } inline LineRef& operator+=(const LineType& inLine) { mLineNumber += inLine; return *this; }; LineRef& operator++() { ++mLineNumber; return *this; }; const LineRef operator++(int) { LineRef line(*this); ++mLineNumber; return line; }; LineRef& operator--() { --mLineNumber; return *this; }; const LineRef operator--(int) { LineRef line(*this); --mLineNumber; return line; }; - inline void invalidate() { mLineNumber = -1; } - inline bool isValid() const { return mLineNumber != -1; } + inline void invalidate() noexcept { mLineNumber = -1; } + inline bool isValid() const noexcept { return mLineNumber != -1; } private: LineType mLineNumber = -1; }; /* This is here because its easy to unknowingly break these conditions. The resulting compiler errors are a bit cryptic if you aren't famialar with the C++ language. Also some IDEs with clangd or ccls integration can automatically check static_asserts without doing a full compile. */ static_assert(std::is_copy_constructible::value, "LineRef must be copy 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 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 LineRef::LineType LineIndex; #endif