File indexing completed on 2024-04-28 15:30:57
0001 /* 0002 SPDX-FileCopyrightText: 2016 Dominik Haumann <dhaumann@kde.org> 0003 SPDX-FileCopyrightText: 2007 Mirko Stocker <me@misto.ch> 0004 SPDX-FileCopyrightText: 2003-2005 Hamish Rodda <rodda@kde.org> 0005 SPDX-FileCopyrightText: 2002 Christian Couder <christian@kdevelop.org> 0006 SPDX-FileCopyrightText: 2001, 2003 Christoph Cullmann <cullmann@kde.org> 0007 SPDX-FileCopyrightText: 2001 Joseph Wenninger <jowenn@kde.org> 0008 SPDX-FileCopyrightText: 1999 Jochen Wilhelmy <digisnap@cs.tu-berlin.de> 0009 0010 SPDX-License-Identifier: LGPL-2.0-or-later 0011 */ 0012 0013 #include "range.h" 0014 0015 using namespace KTextEditor; 0016 0017 Range Range::fromString(const QStringRef &str) Q_DECL_NOEXCEPT 0018 { 0019 return fromString(QStringView(str)); 0020 } 0021 0022 Range Range::fromString(QStringView str) Q_DECL_NOEXCEPT 0023 { 0024 const int startIndex = str.indexOf(QLatin1Char('[')); 0025 const int endIndex = str.indexOf(QLatin1Char(']')); 0026 const int closeIndex = str.indexOf(QLatin1Char(')')); // end of first cursor 0027 0028 if (startIndex < 0 || endIndex < 0 || closeIndex < 0 || closeIndex < startIndex || endIndex < closeIndex || endIndex < startIndex) { 0029 return invalid(); 0030 } 0031 0032 return Range(Cursor::fromString(str.mid(startIndex + 1, closeIndex - startIndex)), Cursor::fromString(str.mid(closeIndex + 2, endIndex - closeIndex - 2))); 0033 } 0034 0035 void Range::setRange(const Range &range) Q_DECL_NOEXCEPT 0036 { 0037 m_start = range.start(); 0038 m_end = range.end(); 0039 } 0040 0041 void Range::setRange(const Cursor &start, const Cursor &end) Q_DECL_NOEXCEPT 0042 { 0043 if (start > end) { 0044 setRange(Range(end, start)); 0045 } else { 0046 setRange(Range(start, end)); 0047 } 0048 } 0049 0050 bool Range::confineToRange(const Range &range) Q_DECL_NOEXCEPT 0051 { 0052 if (start() < range.start()) { 0053 if (end() > range.end()) { 0054 setRange(range); 0055 } else { 0056 setStart(range.start()); 0057 } 0058 } else if (end() > range.end()) { 0059 setEnd(range.end()); 0060 } else { 0061 return false; 0062 } 0063 0064 return true; 0065 } 0066 0067 bool Range::expandToRange(const Range &range) Q_DECL_NOEXCEPT 0068 { 0069 if (start() > range.start()) { 0070 if (end() < range.end()) { 0071 setRange(range); 0072 } else { 0073 setStart(range.start()); 0074 } 0075 } else if (end() < range.end()) { 0076 setEnd(range.end()); 0077 } else { 0078 return false; 0079 } 0080 0081 return true; 0082 } 0083 0084 void Range::setBothLines(int line) Q_DECL_NOEXCEPT 0085 { 0086 setRange(Range(line, start().column(), line, end().column())); 0087 } 0088 0089 void KTextEditor::Range::setBothColumns(int column) Q_DECL_NOEXCEPT 0090 { 0091 setRange(Range(start().line(), column, end().line(), column)); 0092 } 0093 0094 LineRange LineRange::fromString(QStringView str) Q_DECL_NOEXCEPT 0095 { 0096 // parse format "[start, end]" 0097 const int startIndex = str.indexOf(QLatin1Char('[')); 0098 const int endIndex = str.indexOf(QLatin1Char(']')); 0099 const int commaIndex = str.indexOf(QLatin1Char(',')); 0100 0101 if (startIndex < 0 || endIndex < 0 || commaIndex < 0 || commaIndex < startIndex || endIndex < commaIndex || endIndex < startIndex) { 0102 return invalid(); 0103 } 0104 0105 bool ok1 = false; 0106 bool ok2 = false; 0107 0108 const int start = str.mid(startIndex + 1, commaIndex - startIndex - 1).toString().toInt(&ok1); // FIXME KF6: Qt 5.15.2 and higher: remove .toString() 0109 const int end = str.mid(commaIndex + 1, endIndex - commaIndex - 1).toString().toInt(&ok2); // FIXME KF6: Qt 5.15.2 and higher: remove .toString() 0110 0111 if (!ok1 || !ok2) { 0112 return invalid(); 0113 } 0114 0115 return {start, end}; 0116 } 0117 0118 namespace QTest 0119 { 0120 // Cursor: template specialization for QTest::toString() 0121 template<> 0122 char *toString(const KTextEditor::Cursor &cursor) 0123 { 0124 QByteArray ba = "Cursor[" + QByteArray::number(cursor.line()) + ", " + QByteArray::number(cursor.column()) + ']'; 0125 return qstrdup(ba.data()); 0126 } 0127 0128 // Range: template specialization for QTest::toString() 0129 template<> 0130 char *toString(const KTextEditor::Range &range) 0131 { 0132 QByteArray ba = "Range["; 0133 ba += QByteArray::number(range.start().line()) + ", " + QByteArray::number(range.start().column()) + " - "; 0134 ba += QByteArray::number(range.end().line()) + ", " + QByteArray::number(range.end().column()); 0135 ba += ']'; 0136 return qstrdup(ba.data()); 0137 } 0138 0139 // LineRange: template specialization for QTest::toString() 0140 template<> 0141 char *toString(const KTextEditor::LineRange &range) 0142 { 0143 QByteArray ba = "LineRange["; 0144 ba += QByteArray::number(range.start()) + ", " + QByteArray::number(range.end()); 0145 ba += ']'; 0146 return qstrdup(ba.data()); 0147 } 0148 }