| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_UI_LIB_ESCHER_GEOMETRY_INTERVAL_H_ |
| #define SRC_UI_LIB_ESCHER_GEOMETRY_INTERVAL_H_ |
| |
| #include <vector> |
| |
| #include "src/ui/lib/escher/geometry/types.h" |
| |
| namespace escher { |
| |
| // This class represents an interval on the real number line. The intervals |
| // represented are closed (i.e. they contain the endpoints). |
| class Interval { |
| public: |
| // Non-empty interval. No error-checking; it is up to the caller to ensure that |
| // all components of max are >= the corresponding component of min. |
| Interval(float min, float max); |
| |
| // Empty Interval - Set max smaller than min. |
| constexpr Interval() : min_(1), max_(0) {} |
| |
| float min() const { return min_; } |
| float max() const { return max_; } |
| |
| bool operator==(const Interval& interval) const { |
| return min_ == interval.min_ && max_ == interval.max_; |
| } |
| bool operator!=(const Interval& interval) const { return !(*this == interval); } |
| |
| bool is_empty() const { return *this == Interval(); } |
| |
| // Expand this interval to encompass the other. Return a new interval. |
| Interval Join(const Interval& interval); |
| |
| // Shrink this interval to be the intersection of this with the other. If the |
| // intervals do not intersect, this interval becomes empty. Return a new interval. |
| Interval Intersect(const Interval& interval) const; |
| |
| float length() const { |
| FX_DCHECK(!is_empty()); |
| return max_ - min_; |
| } |
| |
| // Return true if the other interval is completely contained by this one. |
| bool Contains(const Interval& interval) const { |
| return interval.min_ >= min_ && interval.max_ <= max_; |
| } |
| |
| bool Contains(const float& t) const { return min_ <= t && t <= max_; } |
| |
| private: |
| float min_; |
| float max_; |
| }; |
| |
| // Debugging. |
| ESCHER_DEBUG_PRINTABLE(Interval); |
| |
| } // namespace escher |
| |
| #endif // SRC_UI_LIB_ESCHER_GEOMETRY_INTERVAL_H_ |