xref: /aosp_15_r20/external/libchrome/ui/gfx/range/range_f.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #ifndef UI_GFX_RANGE_RANGE_F_H_
6*635a8641SAndroid Build Coastguard Worker #define UI_GFX_RANGE_RANGE_F_H_
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include <limits>
9*635a8641SAndroid Build Coastguard Worker #include <ostream>
10*635a8641SAndroid Build Coastguard Worker #include <string>
11*635a8641SAndroid Build Coastguard Worker 
12*635a8641SAndroid Build Coastguard Worker #include "ui/gfx/range/gfx_range_export.h"
13*635a8641SAndroid Build Coastguard Worker #include "ui/gfx/range/range.h"
14*635a8641SAndroid Build Coastguard Worker 
15*635a8641SAndroid Build Coastguard Worker namespace gfx {
16*635a8641SAndroid Build Coastguard Worker 
17*635a8641SAndroid Build Coastguard Worker // A float version of Range. RangeF is made of a start and end position; when
18*635a8641SAndroid Build Coastguard Worker // they are the same, the range is empty. Note that |start_| can be greater
19*635a8641SAndroid Build Coastguard Worker // than |end_| to respect the directionality of the range.
20*635a8641SAndroid Build Coastguard Worker class GFX_RANGE_EXPORT RangeF {
21*635a8641SAndroid Build Coastguard Worker  public:
22*635a8641SAndroid Build Coastguard Worker   // Creates an empty range {0,0}.
RangeF()23*635a8641SAndroid Build Coastguard Worker   constexpr RangeF() : RangeF(0.f) {}
24*635a8641SAndroid Build Coastguard Worker 
25*635a8641SAndroid Build Coastguard Worker   // Initializes the range with a start and end.
RangeF(float start,float end)26*635a8641SAndroid Build Coastguard Worker   constexpr RangeF(float start, float end) : start_(start), end_(end) {}
27*635a8641SAndroid Build Coastguard Worker 
28*635a8641SAndroid Build Coastguard Worker   // Initializes the range with the same start and end positions.
RangeF(float position)29*635a8641SAndroid Build Coastguard Worker   constexpr explicit RangeF(float position) : RangeF(position, position) {}
30*635a8641SAndroid Build Coastguard Worker 
31*635a8641SAndroid Build Coastguard Worker   // Returns a range that is invalid, which is {float_max,float_max}.
InvalidRange()32*635a8641SAndroid Build Coastguard Worker   static constexpr RangeF InvalidRange() {
33*635a8641SAndroid Build Coastguard Worker     return RangeF(std::numeric_limits<float>::max());
34*635a8641SAndroid Build Coastguard Worker   }
35*635a8641SAndroid Build Coastguard Worker 
36*635a8641SAndroid Build Coastguard Worker   // Checks if the range is valid through comparison to InvalidRange().
IsValid()37*635a8641SAndroid Build Coastguard Worker   constexpr bool IsValid() const { return *this != InvalidRange(); }
38*635a8641SAndroid Build Coastguard Worker 
39*635a8641SAndroid Build Coastguard Worker   // Getters and setters.
start()40*635a8641SAndroid Build Coastguard Worker   constexpr float start() const { return start_; }
set_start(float start)41*635a8641SAndroid Build Coastguard Worker   void set_start(float start) { start_ = start; }
42*635a8641SAndroid Build Coastguard Worker 
end()43*635a8641SAndroid Build Coastguard Worker   constexpr float end() const { return end_; }
set_end(float end)44*635a8641SAndroid Build Coastguard Worker   void set_end(float end) { end_ = end; }
45*635a8641SAndroid Build Coastguard Worker 
46*635a8641SAndroid Build Coastguard Worker   // Returns the absolute value of the length.
length()47*635a8641SAndroid Build Coastguard Worker   constexpr float length() const { return GetMax() - GetMin(); }
48*635a8641SAndroid Build Coastguard Worker 
is_reversed()49*635a8641SAndroid Build Coastguard Worker   constexpr bool is_reversed() const { return start() > end(); }
is_empty()50*635a8641SAndroid Build Coastguard Worker   constexpr bool is_empty() const { return start() == end(); }
51*635a8641SAndroid Build Coastguard Worker 
52*635a8641SAndroid Build Coastguard Worker   // Returns the minimum and maximum values.
GetMin()53*635a8641SAndroid Build Coastguard Worker   constexpr float GetMin() const { return start() < end() ? start() : end(); }
GetMax()54*635a8641SAndroid Build Coastguard Worker   constexpr float GetMax() const { return start() > end() ? start() : end(); }
55*635a8641SAndroid Build Coastguard Worker 
56*635a8641SAndroid Build Coastguard Worker   constexpr bool operator==(const RangeF& other) const {
57*635a8641SAndroid Build Coastguard Worker     return start() == other.start() && end() == other.end();
58*635a8641SAndroid Build Coastguard Worker   }
59*635a8641SAndroid Build Coastguard Worker   constexpr bool operator!=(const RangeF& other) const {
60*635a8641SAndroid Build Coastguard Worker     return !(*this == other);
61*635a8641SAndroid Build Coastguard Worker   }
EqualsIgnoringDirection(const RangeF & other)62*635a8641SAndroid Build Coastguard Worker   constexpr bool EqualsIgnoringDirection(const RangeF& other) const {
63*635a8641SAndroid Build Coastguard Worker     return GetMin() == other.GetMin() && GetMax() == other.GetMax();
64*635a8641SAndroid Build Coastguard Worker   }
65*635a8641SAndroid Build Coastguard Worker 
66*635a8641SAndroid Build Coastguard Worker   // Returns true if this range intersects the specified |range|.
Intersects(const RangeF & range)67*635a8641SAndroid Build Coastguard Worker   constexpr bool Intersects(const RangeF& range) const {
68*635a8641SAndroid Build Coastguard Worker     return IsValid() && range.IsValid() &&
69*635a8641SAndroid Build Coastguard Worker            !(range.GetMax() < GetMin() || range.GetMin() >= GetMax());
70*635a8641SAndroid Build Coastguard Worker   }
71*635a8641SAndroid Build Coastguard Worker 
72*635a8641SAndroid Build Coastguard Worker   // Returns true if this range contains the specified |range|.
Contains(const RangeF & range)73*635a8641SAndroid Build Coastguard Worker   constexpr bool Contains(const RangeF& range) const {
74*635a8641SAndroid Build Coastguard Worker     return IsValid() && range.IsValid() && GetMin() <= range.GetMin() &&
75*635a8641SAndroid Build Coastguard Worker            range.GetMax() <= GetMax();
76*635a8641SAndroid Build Coastguard Worker   }
77*635a8641SAndroid Build Coastguard Worker 
78*635a8641SAndroid Build Coastguard Worker   // Computes the intersection of this range with the given |range|.
79*635a8641SAndroid Build Coastguard Worker   // If they don't intersect, it returns an InvalidRange().
80*635a8641SAndroid Build Coastguard Worker   // The returned range is always empty or forward (never reversed).
81*635a8641SAndroid Build Coastguard Worker   RangeF Intersect(const RangeF& range) const;
82*635a8641SAndroid Build Coastguard Worker   RangeF Intersect(const Range& range) const;
83*635a8641SAndroid Build Coastguard Worker 
84*635a8641SAndroid Build Coastguard Worker   // Floor/Ceil/Round the start and end values of the given RangeF.
85*635a8641SAndroid Build Coastguard Worker   Range Floor() const;
86*635a8641SAndroid Build Coastguard Worker   Range Ceil() const;
87*635a8641SAndroid Build Coastguard Worker   Range Round() const;
88*635a8641SAndroid Build Coastguard Worker 
89*635a8641SAndroid Build Coastguard Worker   std::string ToString() const;
90*635a8641SAndroid Build Coastguard Worker 
91*635a8641SAndroid Build Coastguard Worker  private:
92*635a8641SAndroid Build Coastguard Worker   float start_;
93*635a8641SAndroid Build Coastguard Worker   float end_;
94*635a8641SAndroid Build Coastguard Worker };
95*635a8641SAndroid Build Coastguard Worker 
96*635a8641SAndroid Build Coastguard Worker GFX_RANGE_EXPORT std::ostream& operator<<(std::ostream& os,
97*635a8641SAndroid Build Coastguard Worker                                           const RangeF& range);
98*635a8641SAndroid Build Coastguard Worker 
99*635a8641SAndroid Build Coastguard Worker }  // namespace gfx
100*635a8641SAndroid Build Coastguard Worker 
101*635a8641SAndroid Build Coastguard Worker #endif  // UI_GFX_RANGE_RANGE_F_H_
102