aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Selection.cxx23
-rw-r--r--src/Selection.h9
2 files changed, 18 insertions, 14 deletions
diff --git a/src/Selection.cxx b/src/Selection.cxx
index 7b517cc4a..20fb1efca 100644
--- a/src/Selection.cxx
+++ b/src/Selection.cxx
@@ -170,20 +170,15 @@ bool SelectionRange::ContainsCharacter(SelectionPosition spCharacter) const noex
}
SelectionSegment SelectionRange::Intersect(SelectionSegment check) const noexcept {
- const SelectionSegment inOrder(caret, anchor);
- if ((inOrder.start <= check.end) || (inOrder.end >= check.start)) {
- SelectionSegment portion = check;
- if (portion.start < inOrder.start)
- portion.start = inOrder.start;
- if (portion.end > inOrder.end)
- portion.end = inOrder.end;
- if (portion.start > portion.end)
- return SelectionSegment();
- else
- return portion;
- } else {
- return SelectionSegment();
- }
+ const SelectionSegment inOrder = AsSegment();
+ if ((inOrder.start > check.end) || (inOrder.end < check.start)) {
+ // Nothing in common, not even touching so return empty *invalid* segment
+ return {};
+ }
+ return {
+ std::max(check.start, inOrder.start),
+ std::min(check.end, inOrder.end)
+ };
}
void SelectionRange::Swap() noexcept {
diff --git a/src/Selection.h b/src/Selection.h
index 57de92a57..8ffcbb0bb 100644
--- a/src/Selection.h
+++ b/src/Selection.h
@@ -81,6 +81,12 @@ struct SelectionSegment {
end = a;
}
}
+ constexpr SelectionSegment(Sci::Position a, Sci::Position b) :
+ SelectionSegment(SelectionPosition(a), SelectionPosition(b)) {
+ }
+ [[nodiscard]] constexpr bool operator ==(const SelectionSegment &other) const noexcept {
+ return (start == other.start) && (end == other.end);
+ }
bool Empty() const noexcept {
return start == end;
}
@@ -115,6 +121,9 @@ struct SelectionRange {
constexpr SelectionRange(Sci::Position caret_, Sci::Position anchor_) noexcept : caret(caret_), anchor(anchor_) {
}
explicit SelectionRange(std::string_view sv);
+ SelectionSegment AsSegment() const noexcept {
+ return {caret, anchor};
+ }
bool Empty() const noexcept {
return anchor == caret;
}