24#ifndef PXR_BASE_GF_INTERVAL_H
25#define PXR_BASE_GF_INTERVAL_H
32#include "pxr/base/gf/api.h"
39PXR_NAMESPACE_OPEN_SCOPE
69 bool minClosed=
true,
bool maxClosed=
true) :
78 return _min == rhs._min && _max == rhs._max;
83 return !(*
this == rhs);
90 return _min < rhs._min;
94 return _max < rhs._max;
102 size_t Hash()
const {
return hash_value(*
this); }
104 friend inline size_t hash_value(
GfInterval const &i) {
109 double GetMin()
const {
return _min.value; }
112 double GetMax()
const {
return _max.value; }
116 _min = _Bound(v, _min.closed);
121 _min = _Bound(v, minClosed);
126 _max = _Bound(v, _max.closed);
131 _max = _Bound(v, maxClosed);
148 return (_max.value != -std::numeric_limits<double>::infinity()
149 && _max.value != std::numeric_limits<double>::infinity());
154 return (_min.value != -std::numeric_limits<double>::infinity()
155 && _min.value != std::numeric_limits<double>::infinity());
165 return (_min.value > _max.value) ||
166 ((_min.value == _max.value)
167 && (! _min.closed || !_max.closed));
173 return GfMax( 0.0, _max.value - _min.value );
177 double Size()
const {
return GetSize(); }
182 return ((d > _min.value) || (d == _min.value && _min.closed))
183 && ((d < _max.value) || (d == _max.value && _max.closed));
187 bool In(
double d)
const {
return Contains(d); }
193 return (*
this & i) == i;
213 if (_min.value < rhs._min.value)
215 else if (_min.value == rhs._min.value)
216 _min.closed &= rhs._min.closed;
219 if (_max.value > rhs._max.value)
221 else if (_max.value == rhs._max.value)
222 _max.closed &= rhs._max.closed;
235 if (_min.value > rhs._min.value)
237 else if (_min.value == rhs._min.value)
238 _min.closed |= rhs._min.closed;
241 if (_max.value < rhs._max.value)
243 else if (_max.value == rhs._max.value)
244 _max.closed |= rhs._max.closed;
252 _min.value += rhs._min.value;
253 _max.value += rhs._max.value;
254 _min.closed &= rhs._min.closed;
255 _max.closed &= rhs._max.closed;
262 return *
this += -rhs;
267 return GfInterval(-_max.value, -_min.value, _max.closed, _min.closed);
272 const _Bound a = _min * rhs._min;
273 const _Bound b = _min * rhs._max;
274 const _Bound c = _max * rhs._min;
275 const _Bound d = _max * rhs._max;
276 _max = _Max( _Max(a,b), _Max(c,d) );
277 _min = _Min( _Min(a,b), _Min(c,d) );
290 return !(rhs < *
this);
296 return !(*
this < rhs);
343 return GfInterval( -std::numeric_limits<double>::infinity(),
344 std::numeric_limits<double>::infinity(),
357 _Bound(
double val,
bool isClosed) :
363 if (value == -std::numeric_limits<double>::infinity() ||
364 value == std::numeric_limits<double>::infinity()) {
369 bool operator==(
const _Bound &rhs)
const {
370 return value == rhs.value && closed == rhs.closed;
373 bool operator!=(
const _Bound &rhs)
const {
374 return !(*
this == rhs);
377 bool operator<(
const _Bound &rhs)
const {
378 return value < rhs.value || (value == rhs.value && closed && !rhs.closed);
381 _Bound & operator=(
const _Bound &rhs) {
386 _Bound operator*(
const _Bound &rhs)
const {
387 return _Bound( value * rhs.value, closed & rhs.closed );
389 friend inline size_t hash_value(
const _Bound &b) {
395 inline static const _Bound &
396 _Min(
const _Bound &a,
const _Bound &b ) {
397 return (a.value < b.value
398 || ((a.value == b.value) && a.closed && !b.closed)) ?
403 inline static const _Bound &
404 _Max(
const _Bound &a,
const _Bound &b ) {
405 return (a.value < b.value
406 || ((a.value == b.value) && !a.closed && b.closed)) ?
418PXR_NAMESPACE_CLOSE_SCOPE
A basic mathematical interval class.
GfInterval()
Construct an empty open interval, (0,0).
bool operator>=(const GfInterval &rhs)
Greater than or equal operator.
GfInterval(double val)
Construct a closed interval representing the single point, as [val,val].
bool operator<=(const GfInterval &rhs)
Less than or equal operator.
double GetMax() const
Maximum value.
GfInterval & operator+=(const GfInterval &rhs)
Interval addition.
static GfInterval GetFullInterval()
Returns the full interval (-inf, inf).
GfInterval operator|(const GfInterval &rhs) const
Union operator.
bool operator>(const GfInterval &rhs)
Greater than operator.
bool IsFinite() const
Returns true if both the maximum and minimum value are finite.
GfInterval operator-(const GfInterval &rhs) const
Subtraction operator.
bool operator<(const GfInterval &rhs) const
Less-than operator.
GfInterval & operator*=(const GfInterval &rhs)
Interval multiplication.
double GetMin() const
Minimum value.
GfInterval & operator-=(const GfInterval &rhs)
Interval subtraction.
bool IsMaxFinite() const
Returns true if the maximum value is finite.
double GetSize() const
Width of the interval.
void SetMin(double v, bool minClosed)
Set minimum value and boundary condition.
GfInterval operator-() const
Interval unary minus.
bool IsEmpty() const
Return true iff the interval is empty.
void SetMax(double v, bool maxClosed)
Set maximum value and boundary condition.
bool IsMinClosed() const
Minimum boundary condition.
bool IsMaxOpen() const
Maximum boundary condition.
bool operator!=(const GfInterval &rhs) const
Inequality operator.
bool operator==(const GfInterval &rhs) const
Equality operator.
bool IsMinFinite() const
Returns true if the minimum value is finite.
void SetMin(double v)
Set minimum value.
GfInterval operator&(const GfInterval &rhs) const
Intersection operator.
GfInterval(double min, double max, bool minClosed=true, bool maxClosed=true)
Construct an interval with the given arguments.
size_t Hash() const
Hash value.
GfInterval operator*(const GfInterval &rhs) const
Multiplication operator.
GfInterval & operator|=(const GfInterval &rhs)
Returns the interval that bounds the union of this interval and rhs.
GfInterval operator+(const GfInterval &rhs) const
Addition operator.
bool Contains(const GfInterval &i) const
Return true iff the interval i is entirely contained in the interval.
void SetMax(double v)
Set maximum value.
bool Intersects(const GfInterval &i) const
Return true iff the given interval i intersects this interval.
bool Contains(double d) const
Return true iff the value d is contained in the interval.
bool IsMinOpen() const
Minimum boundary condition.
bool IsMaxClosed() const
Maximum boundary condition.
GfInterval & operator&=(const GfInterval &rhs)
Boolean intersection.
static size_t Combine(Args &&... args)
Produce a hash code by combining the hash codes of several objects.
Assorted mathematical utility functions.
T GfMax(T a1, T a2)
Returns the largest of the given values.
GF_API std::ostream & operator<<(std::ostream &, const GfBBox3d &)
Output a GfBBox3d using the format [(range) matrix zeroArea].
size_t hash_value(const half h)
Overload hash_value for half.