File indexing completed on 2024-12-08 08:09:35

0001 // clang-format off
0002 /*
0003  * KDiff3 - Text Diff And Merge Tool
0004  *
0005  * SPDX-FileCopyrightText: 2002-2011 Joachim Eibl, joachim.eibl at gmx.de
0006  * SPDX-FileCopyrightText: 2018-2020 Michael Reeves reeves.87@gmail.com
0007  * SPDX-License-Identifier: GPL-2.0-or-later
0008  */
0009 // clang-format on
0010 
0011 #include "selection.h"
0012 #include "TypeUtils.h"
0013 
0014 #include <QtGlobal>
0015 
0016 #include <utility>   // for swap
0017 
0018 QtSizeType Selection::firstPosInLine(LineRef l) const
0019 {
0020     assert(firstLine.isValid());
0021 
0022     LineRef l1 = firstLine;
0023     LineRef l2 = lastLine;
0024     QtSizeType p1 = firstPos;
0025     QtSizeType p2 = lastPos;
0026     if(l1 > l2)
0027     {
0028         std::swap(l1, l2);
0029         std::swap(p1, p2);
0030     }
0031     if(l1 == l2 && p1 > p2)
0032     {
0033         std::swap(p1, p2);
0034     }
0035 
0036     if(l == l1)
0037         return p1;
0038 
0039     return 0;
0040 }
0041 
0042 QtSizeType Selection::lastPosInLine(LineRef l) const
0043 {
0044     assert(firstLine.isValid());
0045 
0046     LineRef l1 = firstLine;
0047     LineRef l2 = lastLine;
0048     QtSizeType p1 = firstPos;
0049     QtSizeType p2 = lastPos;
0050 
0051     if(l1 > l2)
0052     {
0053         std::swap(l1, l2);
0054         std::swap(p1, p2);
0055     }
0056     if(l1 == l2 && p1 > p2)
0057     {
0058         std::swap(p1, p2);
0059     }
0060 
0061     if(l == l2)
0062         return p2;
0063 
0064     return limits<qint32>::max();
0065 }
0066 
0067 bool Selection::within(LineRef l, QtSizeType p) const
0068 {
0069     if(!firstLine.isValid())
0070         return false;
0071 
0072     LineRef l1 = firstLine;
0073     LineRef l2 = lastLine;
0074     QtSizeType p1 = firstPos;
0075     QtSizeType p2 = lastPos;
0076     if(l1 > l2)
0077     {
0078         std::swap(l1, l2);
0079         std::swap(p1, p2);
0080     }
0081     if(l1 == l2 && p1 > p2)
0082     {
0083         std::swap(p1, p2);
0084     }
0085     if(l1 <= l && l <= l2)
0086     {
0087         if(l1 == l2)
0088             return p >= p1 && p < p2;
0089         if(l == l1)
0090             return p >= p1;
0091         if(l == l2)
0092             return p < p2;
0093         return true;
0094     }
0095     return false;
0096 }
0097 
0098 bool Selection::lineWithin(LineRef l) const
0099 {
0100     if(!firstLine.isValid())
0101         return false;
0102     LineRef l1 = firstLine;
0103     LineRef l2 = lastLine;
0104 
0105     if(l1 > l2)
0106     {
0107         std::swap(l1, l2);
0108     }
0109 
0110     return (l1 <= l && l <= l2);
0111 }