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