mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Replaces selection_base() and selection_extent() with selection() and SetSelection(int, int) with SetSelection(range). This also adds the following convenience methods to TextRange: * reversed() * Contains(size_t position) * Contains(const TextRange& range) as well as operator== for use in unit tests. When Flutter migrates to C++20, we can replace that method with a default declaration.
71 lines
2.1 KiB
C++
71 lines
2.1 KiB
C++
// Copyright 2013 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include <algorithm>
|
|
|
|
#include "flutter/fml/logging.h"
|
|
|
|
// A directional range of text.
|
|
//
|
|
// A |TextRange| describes a range of text with |base| and |extent| positions.
|
|
// In the case where |base| == |extent|, the range is said to be collapsed, and
|
|
// when |base| > |extent|, the range is said to be reversed.
|
|
class TextRange {
|
|
public:
|
|
explicit TextRange(size_t position) : base_(position), extent_(position) {}
|
|
explicit TextRange(size_t base, size_t extent)
|
|
: base_(base), extent_(extent) {}
|
|
TextRange(const TextRange&) = default;
|
|
TextRange& operator=(const TextRange&) = default;
|
|
|
|
virtual ~TextRange() = default;
|
|
|
|
// Returns the base position of the range.
|
|
size_t base() const { return base_; }
|
|
|
|
// Returns the extent position of the range.
|
|
size_t extent() const { return extent_; }
|
|
|
|
// Returns the lesser of the base and extent positions.
|
|
size_t start() const { return std::min(base_, extent_); }
|
|
|
|
// Returns the greater of the base and extent positions.
|
|
size_t end() const { return std::max(base_, extent_); }
|
|
|
|
// Returns the position of a collapsed range.
|
|
//
|
|
// Asserts that the range is of length 0.
|
|
size_t position() const {
|
|
FML_DCHECK(base_ == extent_);
|
|
return extent_;
|
|
}
|
|
|
|
// Returns the length of the range.
|
|
size_t length() const { return end() - start(); }
|
|
|
|
// Returns true if the range is of length 0.
|
|
bool collapsed() const { return base_ == extent_; }
|
|
|
|
// Returns true if the base is greater than the extent.
|
|
bool reversed() const { return base_ > extent_; }
|
|
|
|
// Returns true if |position| is contained within the range.
|
|
bool Contains(size_t position) const {
|
|
return position >= start() && position <= end();
|
|
}
|
|
|
|
// Returns true if |range| is contained within the range.
|
|
bool Contains(const TextRange& range) const {
|
|
return range.start() >= start() && range.end() <= end();
|
|
}
|
|
|
|
bool operator==(const TextRange& other) const {
|
|
return base_ == other.base_ && extent_ == other.extent_;
|
|
}
|
|
|
|
private:
|
|
size_t base_;
|
|
size_t extent_;
|
|
};
|