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