Flutter Engine
text_range.h
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef FLUTTER_SHELL_PLATFORM_COMMON_TEXT_RANGE_H_
6 #define FLUTTER_SHELL_PLATFORM_COMMON_TEXT_RANGE_H_
7 
8 #include <algorithm>
9 
10 #include "flutter/fml/logging.h"
11 
12 namespace flutter {
13 
14 // A directional range of text.
15 //
16 // A |TextRange| describes a range of text with |base| and |extent| positions.
17 // In the case where |base| == |extent|, the range is said to be collapsed, and
18 // when |base| > |extent|, the range is said to be reversed.
19 class TextRange {
20  public:
21  explicit TextRange(size_t position) : base_(position), extent_(position) {}
22  explicit TextRange(size_t base, size_t extent)
23  : base_(base), extent_(extent) {}
24  TextRange(const TextRange&) = default;
25  TextRange& operator=(const TextRange&) = default;
26 
27  virtual ~TextRange() = default;
28 
29  // The base position of the range.
30  size_t base() const { return base_; }
31 
32  // Sets the base position of the range.
33  void set_base(size_t pos) { base_ = pos; }
34 
35  // The extent position of the range.
36  size_t extent() const { return extent_; }
37 
38  // Sets the extent position of the range.
39  void set_extent(size_t pos) { extent_ = pos; }
40 
41  // The lesser of the base and extent positions.
42  size_t start() const { return std::min(base_, extent_); }
43 
44  // Sets the start position of the range.
45  void set_start(size_t pos) {
46  if (base_ <= extent_) {
47  base_ = pos;
48  } else {
49  extent_ = pos;
50  }
51  }
52 
53  // The greater of the base and extent positions.
54  size_t end() const { return std::max(base_, extent_); }
55 
56  // Sets the end position of the range.
57  void set_end(size_t pos) {
58  if (base_ <= extent_) {
59  extent_ = pos;
60  } else {
61  base_ = pos;
62  }
63  }
64 
65  // The position of a collapsed range.
66  //
67  // Asserts that the range is of length 0.
68  size_t position() const {
69  FML_DCHECK(base_ == extent_);
70  return extent_;
71  }
72 
73  // The length of the range.
74  size_t length() const { return end() - start(); }
75 
76  // Returns true if the range is of length 0.
77  bool collapsed() const { return base_ == extent_; }
78 
79  // Returns true if the base is greater than the extent.
80  bool reversed() const { return base_ > extent_; }
81 
82  // Returns true if |position| is contained within the range.
83  bool Contains(size_t position) const {
84  return position >= start() && position <= end();
85  }
86 
87  // Returns true if |range| is contained within the range.
88  bool Contains(const TextRange& range) const {
89  return range.start() >= start() && range.end() <= end();
90  }
91 
92  bool operator==(const TextRange& other) const {
93  return base_ == other.base_ && extent_ == other.extent_;
94  }
95 
96  private:
97  size_t base_;
98  size_t extent_;
99 };
100 
101 } // namespace flutter
102 
103 #endif // FLUTTER_SHELL_PLATFORM_COMMON_TEXT_RANGE_H_
TextRange(size_t position)
Definition: text_range.h:21
#define FML_DCHECK(condition)
Definition: logging.h:86
virtual ~TextRange()=default
size_t extent() const
Definition: text_range.h:36
TextRange & operator=(const TextRange &)=default
TextRange(size_t base, size_t extent)
Definition: text_range.h:22
bool Contains(const TextRange &range) const
Definition: text_range.h:88
void set_extent(size_t pos)
Definition: text_range.h:39
size_t end() const
Definition: text_range.h:54
bool collapsed() const
Definition: text_range.h:77
bool Contains(size_t position) const
Definition: text_range.h:83
bool operator==(const TextRange &other) const
Definition: text_range.h:92
size_t position() const
Definition: text_range.h:68
void set_end(size_t pos)
Definition: text_range.h:57
size_t start() const
Definition: text_range.h:42
size_t length() const
Definition: text_range.h:74
void set_base(size_t pos)
Definition: text_range.h:33
size_t base() const
Definition: text_range.h:30
void set_start(size_t pos)
Definition: text_range.h:45
bool reversed() const
Definition: text_range.h:80