1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker //
5*6777b538SAndroid Build Coastguard Worker // An Interval<T> is a data structure used to represent a contiguous, mutable
6*6777b538SAndroid Build Coastguard Worker // range over an ordered type T. Supported operations include testing a value to
7*6777b538SAndroid Build Coastguard Worker // see whether it is included in the interval, comparing two intervals, and
8*6777b538SAndroid Build Coastguard Worker // performing their union, intersection, and difference. For the purposes of
9*6777b538SAndroid Build Coastguard Worker // this library, an "ordered type" is any type that induces a total order on its
10*6777b538SAndroid Build Coastguard Worker // values via its less-than operator (operator<()). Examples of such types are
11*6777b538SAndroid Build Coastguard Worker // basic arithmetic types like int and double as well as class types like
12*6777b538SAndroid Build Coastguard Worker // string.
13*6777b538SAndroid Build Coastguard Worker //
14*6777b538SAndroid Build Coastguard Worker // An Interval<T> is represented using the usual C++ STL convention, namely as
15*6777b538SAndroid Build Coastguard Worker // the half-open interval [min, max). A point p is considered to be contained in
16*6777b538SAndroid Build Coastguard Worker // the interval iff p >= min && p < max. One consequence of this definition is
17*6777b538SAndroid Build Coastguard Worker // that for any non-empty interval, min is contained in the interval but max is
18*6777b538SAndroid Build Coastguard Worker // not. There is no canonical representation for the empty interval; rather, any
19*6777b538SAndroid Build Coastguard Worker // interval where max <= min is regarded as empty. As a consequence, two empty
20*6777b538SAndroid Build Coastguard Worker // intervals will still compare as equal despite possibly having different
21*6777b538SAndroid Build Coastguard Worker // underlying min() or max() values. Also beware of the terminology used here:
22*6777b538SAndroid Build Coastguard Worker // the library uses the terms "min" and "max" rather than "begin" and "end" as
23*6777b538SAndroid Build Coastguard Worker // is conventional for the STL.
24*6777b538SAndroid Build Coastguard Worker //
25*6777b538SAndroid Build Coastguard Worker // T is required to be default- and copy-constructable, to have an assignment
26*6777b538SAndroid Build Coastguard Worker // operator, and the full complement of comparison operators (<, <=, ==, !=, >=,
27*6777b538SAndroid Build Coastguard Worker // >). A difference operator (operator-()) is required if Interval<T>::Length
28*6777b538SAndroid Build Coastguard Worker // is used.
29*6777b538SAndroid Build Coastguard Worker //
30*6777b538SAndroid Build Coastguard Worker // For equality comparisons, Interval<T> supports an Equals() method and an
31*6777b538SAndroid Build Coastguard Worker // operator==() which delegates to it. Two intervals are considered equal if
32*6777b538SAndroid Build Coastguard Worker // either they are both empty or if their corresponding min and max fields
33*6777b538SAndroid Build Coastguard Worker // compare equal. For ordered comparisons, Interval<T> also provides the
34*6777b538SAndroid Build Coastguard Worker // comparator Interval<T>::Less and an operator<() which delegates to it.
35*6777b538SAndroid Build Coastguard Worker // Unfortunately this comparator is currently buggy because its behavior is
36*6777b538SAndroid Build Coastguard Worker // inconsistent with Equals(): two empty ranges with different representations
37*6777b538SAndroid Build Coastguard Worker // may be regarded as equivalent by Equals() but regarded as different by
38*6777b538SAndroid Build Coastguard Worker // the comparator. Bug 9240050 has been created to address this.
39*6777b538SAndroid Build Coastguard Worker //
40*6777b538SAndroid Build Coastguard Worker // This class is thread-compatible if T is thread-compatible. (See
41*6777b538SAndroid Build Coastguard Worker // go/thread-compatible).
42*6777b538SAndroid Build Coastguard Worker //
43*6777b538SAndroid Build Coastguard Worker // Examples:
44*6777b538SAndroid Build Coastguard Worker // Interval<int> r1(0, 100); // The interval [0, 100).
45*6777b538SAndroid Build Coastguard Worker // EXPECT_TRUE(r1.Contains(0));
46*6777b538SAndroid Build Coastguard Worker // EXPECT_TRUE(r1.Contains(50));
47*6777b538SAndroid Build Coastguard Worker // EXPECT_FALSE(r1.Contains(100)); // 100 is just outside the interval.
48*6777b538SAndroid Build Coastguard Worker //
49*6777b538SAndroid Build Coastguard Worker // Interval<int> r2(50, 150); // The interval [50, 150).
50*6777b538SAndroid Build Coastguard Worker // EXPECT_TRUE(r1.Intersects(r2));
51*6777b538SAndroid Build Coastguard Worker // EXPECT_FALSE(r1.Contains(r2));
52*6777b538SAndroid Build Coastguard Worker // EXPECT_TRUE(r1.IntersectWith(r2)); // Mutates r1.
53*6777b538SAndroid Build Coastguard Worker // EXPECT_EQ(Interval<int>(50, 100), r1); // r1 is now [50, 100).
54*6777b538SAndroid Build Coastguard Worker //
55*6777b538SAndroid Build Coastguard Worker // Interval<int> r3(1000, 2000); // The interval [1000, 2000).
56*6777b538SAndroid Build Coastguard Worker // EXPECT_TRUE(r1.IntersectWith(r3)); // Mutates r1.
57*6777b538SAndroid Build Coastguard Worker // EXPECT_TRUE(r1.Empty()); // Now r1 is empty.
58*6777b538SAndroid Build Coastguard Worker // EXPECT_FALSE(r1.Contains(r1.min())); // e.g. doesn't contain its own min.
59*6777b538SAndroid Build Coastguard Worker
60*6777b538SAndroid Build Coastguard Worker #ifndef NET_BASE_INTERVAL_H_
61*6777b538SAndroid Build Coastguard Worker #define NET_BASE_INTERVAL_H_
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard Worker #include <algorithm>
66*6777b538SAndroid Build Coastguard Worker #include <functional>
67*6777b538SAndroid Build Coastguard Worker #include <ostream>
68*6777b538SAndroid Build Coastguard Worker #include <utility>
69*6777b538SAndroid Build Coastguard Worker #include <vector>
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker namespace net {
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker template <typename T>
74*6777b538SAndroid Build Coastguard Worker class Interval {
75*6777b538SAndroid Build Coastguard Worker private:
76*6777b538SAndroid Build Coastguard Worker // TODO(rtenneti): Implement after suupport for std::decay.
77*6777b538SAndroid Build Coastguard Worker #if 0
78*6777b538SAndroid Build Coastguard Worker // Type trait for deriving the return type for Interval::Length. If
79*6777b538SAndroid Build Coastguard Worker // operator-() is not defined for T, then the return type is void. This makes
80*6777b538SAndroid Build Coastguard Worker // the signature for Length compile so that the class can be used for such T,
81*6777b538SAndroid Build Coastguard Worker // but code that calls Length would still generate a compilation error.
82*6777b538SAndroid Build Coastguard Worker template <typename U>
83*6777b538SAndroid Build Coastguard Worker class DiffTypeOrVoid {
84*6777b538SAndroid Build Coastguard Worker private:
85*6777b538SAndroid Build Coastguard Worker template <typename V>
86*6777b538SAndroid Build Coastguard Worker static auto f(const V* v) -> decltype(*v - *v);
87*6777b538SAndroid Build Coastguard Worker template <typename V>
88*6777b538SAndroid Build Coastguard Worker static void f(...);
89*6777b538SAndroid Build Coastguard Worker
90*6777b538SAndroid Build Coastguard Worker public:
91*6777b538SAndroid Build Coastguard Worker using type = typename std::decay<decltype(f<U>(0))>::type;
92*6777b538SAndroid Build Coastguard Worker };
93*6777b538SAndroid Build Coastguard Worker #endif
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker public:
96*6777b538SAndroid Build Coastguard Worker // Compatibility alias.
97*6777b538SAndroid Build Coastguard Worker using Less = std::less<Interval>;
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker // Construct an Interval representing an empty interval.
Interval()100*6777b538SAndroid Build Coastguard Worker Interval() : min_(), max_() {}
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker // Construct an Interval representing the interval [min, max). If min < max,
103*6777b538SAndroid Build Coastguard Worker // the constructed object will represent the non-empty interval containing all
104*6777b538SAndroid Build Coastguard Worker // values from min up to (but not including) max. On the other hand, if min >=
105*6777b538SAndroid Build Coastguard Worker // max, the constructed object will represent the empty interval.
Interval(const T & min,const T & max)106*6777b538SAndroid Build Coastguard Worker Interval(const T& min, const T& max) : min_(min), max_(max) {}
107*6777b538SAndroid Build Coastguard Worker
min()108*6777b538SAndroid Build Coastguard Worker const T& min() const { return min_; }
max()109*6777b538SAndroid Build Coastguard Worker const T& max() const { return max_; }
SetMin(const T & t)110*6777b538SAndroid Build Coastguard Worker void SetMin(const T& t) { min_ = t; }
SetMax(const T & t)111*6777b538SAndroid Build Coastguard Worker void SetMax(const T& t) { max_ = t; }
112*6777b538SAndroid Build Coastguard Worker
Set(const T & min,const T & max)113*6777b538SAndroid Build Coastguard Worker void Set(const T& min, const T& max) {
114*6777b538SAndroid Build Coastguard Worker SetMin(min);
115*6777b538SAndroid Build Coastguard Worker SetMax(max);
116*6777b538SAndroid Build Coastguard Worker }
117*6777b538SAndroid Build Coastguard Worker
Clear()118*6777b538SAndroid Build Coastguard Worker void Clear() { *this = {}; }
CopyFrom(const Interval & i)119*6777b538SAndroid Build Coastguard Worker void CopyFrom(const Interval& i) { *this = i; }
Equals(const Interval & i)120*6777b538SAndroid Build Coastguard Worker bool Equals(const Interval& i) const { return *this == i; }
Empty()121*6777b538SAndroid Build Coastguard Worker bool Empty() const { return min() >= max(); }
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Worker // Returns the length of this interval. The value returned is zero if
124*6777b538SAndroid Build Coastguard Worker // IsEmpty() is true; otherwise the value returned is max() - min().
Length()125*6777b538SAndroid Build Coastguard Worker const T Length() const { return (min_ >= max_ ? min_ : max_) - min_; }
126*6777b538SAndroid Build Coastguard Worker
127*6777b538SAndroid Build Coastguard Worker // Returns true iff t >= min() && t < max().
Contains(const T & t)128*6777b538SAndroid Build Coastguard Worker bool Contains(const T& t) const { return min() <= t && max() > t; }
129*6777b538SAndroid Build Coastguard Worker
130*6777b538SAndroid Build Coastguard Worker // Returns true iff *this and i are non-empty, and *this includes i. "*this
131*6777b538SAndroid Build Coastguard Worker // includes i" means that for all t, if i.Contains(t) then this->Contains(t).
132*6777b538SAndroid Build Coastguard Worker // Note the unintuitive consequence of this definition: this method always
133*6777b538SAndroid Build Coastguard Worker // returns false when i is the empty interval.
Contains(const Interval & i)134*6777b538SAndroid Build Coastguard Worker bool Contains(const Interval& i) const {
135*6777b538SAndroid Build Coastguard Worker return !Empty() && !i.Empty() && min() <= i.min() && max() >= i.max();
136*6777b538SAndroid Build Coastguard Worker }
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker // Returns true iff there exists some point t for which this->Contains(t) &&
139*6777b538SAndroid Build Coastguard Worker // i.Contains(t) evaluates to true, i.e. if the intersection is non-empty.
Intersects(const Interval & i)140*6777b538SAndroid Build Coastguard Worker bool Intersects(const Interval& i) const {
141*6777b538SAndroid Build Coastguard Worker return !Empty() && !i.Empty() && min() < i.max() && max() > i.min();
142*6777b538SAndroid Build Coastguard Worker }
143*6777b538SAndroid Build Coastguard Worker
144*6777b538SAndroid Build Coastguard Worker // Returns true iff there exists some point t for which this->Contains(t) &&
145*6777b538SAndroid Build Coastguard Worker // i.Contains(t) evaluates to true, i.e. if the intersection is non-empty.
146*6777b538SAndroid Build Coastguard Worker // Furthermore, if the intersection is non-empty and the intersection pointer
147*6777b538SAndroid Build Coastguard Worker // is not null, this method stores the calculated intersection in
148*6777b538SAndroid Build Coastguard Worker // *intersection.
149*6777b538SAndroid Build Coastguard Worker bool Intersects(const Interval& i, Interval* out) const;
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard Worker // Sets *this to be the intersection of itself with i. Returns true iff
152*6777b538SAndroid Build Coastguard Worker // *this was modified.
153*6777b538SAndroid Build Coastguard Worker bool IntersectWith(const Interval& i);
154*6777b538SAndroid Build Coastguard Worker
155*6777b538SAndroid Build Coastguard Worker // Calculates the smallest interval containing both *this i, and updates *this
156*6777b538SAndroid Build Coastguard Worker // to represent that interval, and returns true iff *this was modified.
157*6777b538SAndroid Build Coastguard Worker bool SpanningUnion(const Interval& i);
158*6777b538SAndroid Build Coastguard Worker
159*6777b538SAndroid Build Coastguard Worker // Determines the difference between two intervals as in
160*6777b538SAndroid Build Coastguard Worker // Difference(Interval&, vector*), but stores the results directly in out
161*6777b538SAndroid Build Coastguard Worker // parameters rather than dynamically allocating an Interval* and appending
162*6777b538SAndroid Build Coastguard Worker // it to a vector. If two results are generated, the one with the smaller
163*6777b538SAndroid Build Coastguard Worker // value of min() will be stored in *lo and the other in *hi. Otherwise (if
164*6777b538SAndroid Build Coastguard Worker // fewer than two results are generated), unused arguments will be set to the
165*6777b538SAndroid Build Coastguard Worker // empty interval (it is possible that *lo will be empty and *hi non-empty).
166*6777b538SAndroid Build Coastguard Worker // The method returns true iff the intersection of *this and i is non-empty.
167*6777b538SAndroid Build Coastguard Worker bool Difference(const Interval& i, Interval* lo, Interval* hi) const;
168*6777b538SAndroid Build Coastguard Worker
169*6777b538SAndroid Build Coastguard Worker friend bool operator==(const Interval& a, const Interval& b) {
170*6777b538SAndroid Build Coastguard Worker bool ae = a.Empty();
171*6777b538SAndroid Build Coastguard Worker bool be = b.Empty();
172*6777b538SAndroid Build Coastguard Worker if (ae && be)
173*6777b538SAndroid Build Coastguard Worker return true; // All empties are equal.
174*6777b538SAndroid Build Coastguard Worker if (ae != be)
175*6777b538SAndroid Build Coastguard Worker return false; // Empty cannot equal nonempty.
176*6777b538SAndroid Build Coastguard Worker return a.min() == b.min() && a.max() == b.max();
177*6777b538SAndroid Build Coastguard Worker }
178*6777b538SAndroid Build Coastguard Worker
179*6777b538SAndroid Build Coastguard Worker friend bool operator!=(const Interval& a, const Interval& b) {
180*6777b538SAndroid Build Coastguard Worker return !(a == b);
181*6777b538SAndroid Build Coastguard Worker }
182*6777b538SAndroid Build Coastguard Worker
183*6777b538SAndroid Build Coastguard Worker // Defines a comparator which can be used to induce an order on Intervals, so
184*6777b538SAndroid Build Coastguard Worker // that, for example, they can be stored in an ordered container such as
185*6777b538SAndroid Build Coastguard Worker // std::set. The ordering is arbitrary, but does provide the guarantee that,
186*6777b538SAndroid Build Coastguard Worker // for non-empty intervals X and Y, if X contains Y, then X <= Y.
187*6777b538SAndroid Build Coastguard Worker // TODO(kosak): The current implementation of this comparator has a problem
188*6777b538SAndroid Build Coastguard Worker // because the ordering it induces is inconsistent with that of Equals(). In
189*6777b538SAndroid Build Coastguard Worker // particular, this comparator does not properly consider all empty intervals
190*6777b538SAndroid Build Coastguard Worker // equivalent. Bug b/9240050 has been created to track this.
191*6777b538SAndroid Build Coastguard Worker friend bool operator<(const Interval& a, const Interval& b) {
192*6777b538SAndroid Build Coastguard Worker return a.min() < b.min() || (a.min() == b.min() && a.max() > b.max());
193*6777b538SAndroid Build Coastguard Worker }
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Worker friend std::ostream& operator<<(std::ostream& out, const Interval& i) {
196*6777b538SAndroid Build Coastguard Worker return out << "[" << i.min() << ", " << i.max() << ")";
197*6777b538SAndroid Build Coastguard Worker }
198*6777b538SAndroid Build Coastguard Worker
199*6777b538SAndroid Build Coastguard Worker private:
200*6777b538SAndroid Build Coastguard Worker T min_; // Inclusive lower bound.
201*6777b538SAndroid Build Coastguard Worker T max_; // Exclusive upper bound.
202*6777b538SAndroid Build Coastguard Worker };
203*6777b538SAndroid Build Coastguard Worker
204*6777b538SAndroid Build Coastguard Worker //==============================================================================
205*6777b538SAndroid Build Coastguard Worker // Implementation details: Clients can stop reading here.
206*6777b538SAndroid Build Coastguard Worker
207*6777b538SAndroid Build Coastguard Worker template <typename T>
Intersects(const Interval & i,Interval * out)208*6777b538SAndroid Build Coastguard Worker bool Interval<T>::Intersects(const Interval& i, Interval* out) const {
209*6777b538SAndroid Build Coastguard Worker if (!Intersects(i))
210*6777b538SAndroid Build Coastguard Worker return false;
211*6777b538SAndroid Build Coastguard Worker if (out != nullptr) {
212*6777b538SAndroid Build Coastguard Worker *out = Interval(std::max(min(), i.min()), std::min(max(), i.max()));
213*6777b538SAndroid Build Coastguard Worker }
214*6777b538SAndroid Build Coastguard Worker return true;
215*6777b538SAndroid Build Coastguard Worker }
216*6777b538SAndroid Build Coastguard Worker
217*6777b538SAndroid Build Coastguard Worker template <typename T>
IntersectWith(const Interval & i)218*6777b538SAndroid Build Coastguard Worker bool Interval<T>::IntersectWith(const Interval& i) {
219*6777b538SAndroid Build Coastguard Worker if (Empty())
220*6777b538SAndroid Build Coastguard Worker return false;
221*6777b538SAndroid Build Coastguard Worker bool modified = false;
222*6777b538SAndroid Build Coastguard Worker if (i.min() > min()) {
223*6777b538SAndroid Build Coastguard Worker SetMin(i.min());
224*6777b538SAndroid Build Coastguard Worker modified = true;
225*6777b538SAndroid Build Coastguard Worker }
226*6777b538SAndroid Build Coastguard Worker if (i.max() < max()) {
227*6777b538SAndroid Build Coastguard Worker SetMax(i.max());
228*6777b538SAndroid Build Coastguard Worker modified = true;
229*6777b538SAndroid Build Coastguard Worker }
230*6777b538SAndroid Build Coastguard Worker return modified;
231*6777b538SAndroid Build Coastguard Worker }
232*6777b538SAndroid Build Coastguard Worker
233*6777b538SAndroid Build Coastguard Worker template <typename T>
SpanningUnion(const Interval & i)234*6777b538SAndroid Build Coastguard Worker bool Interval<T>::SpanningUnion(const Interval& i) {
235*6777b538SAndroid Build Coastguard Worker if (i.Empty())
236*6777b538SAndroid Build Coastguard Worker return false;
237*6777b538SAndroid Build Coastguard Worker if (Empty()) {
238*6777b538SAndroid Build Coastguard Worker *this = i;
239*6777b538SAndroid Build Coastguard Worker return true;
240*6777b538SAndroid Build Coastguard Worker }
241*6777b538SAndroid Build Coastguard Worker bool modified = false;
242*6777b538SAndroid Build Coastguard Worker if (i.min() < min()) {
243*6777b538SAndroid Build Coastguard Worker SetMin(i.min());
244*6777b538SAndroid Build Coastguard Worker modified = true;
245*6777b538SAndroid Build Coastguard Worker }
246*6777b538SAndroid Build Coastguard Worker if (i.max() > max()) {
247*6777b538SAndroid Build Coastguard Worker SetMax(i.max());
248*6777b538SAndroid Build Coastguard Worker modified = true;
249*6777b538SAndroid Build Coastguard Worker }
250*6777b538SAndroid Build Coastguard Worker return modified;
251*6777b538SAndroid Build Coastguard Worker }
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker template <typename T>
Difference(const Interval & i,Interval * lo,Interval * hi)254*6777b538SAndroid Build Coastguard Worker bool Interval<T>::Difference(const Interval& i,
255*6777b538SAndroid Build Coastguard Worker Interval* lo,
256*6777b538SAndroid Build Coastguard Worker Interval* hi) const {
257*6777b538SAndroid Build Coastguard Worker // Initialize *lo and *hi to empty
258*6777b538SAndroid Build Coastguard Worker *lo = {};
259*6777b538SAndroid Build Coastguard Worker *hi = {};
260*6777b538SAndroid Build Coastguard Worker if (Empty())
261*6777b538SAndroid Build Coastguard Worker return false;
262*6777b538SAndroid Build Coastguard Worker if (i.Empty()) {
263*6777b538SAndroid Build Coastguard Worker *lo = *this;
264*6777b538SAndroid Build Coastguard Worker return false;
265*6777b538SAndroid Build Coastguard Worker }
266*6777b538SAndroid Build Coastguard Worker if (min() < i.max() && min() >= i.min() && max() > i.max()) {
267*6777b538SAndroid Build Coastguard Worker // [------ this ------)
268*6777b538SAndroid Build Coastguard Worker // [------ i ------)
269*6777b538SAndroid Build Coastguard Worker // [-- result ---)
270*6777b538SAndroid Build Coastguard Worker *hi = Interval(i.max(), max());
271*6777b538SAndroid Build Coastguard Worker return true;
272*6777b538SAndroid Build Coastguard Worker }
273*6777b538SAndroid Build Coastguard Worker if (max() > i.min() && max() <= i.max() && min() < i.min()) {
274*6777b538SAndroid Build Coastguard Worker // [------ this ------)
275*6777b538SAndroid Build Coastguard Worker // [------ i ------)
276*6777b538SAndroid Build Coastguard Worker // [- result -)
277*6777b538SAndroid Build Coastguard Worker *lo = Interval(min(), i.min());
278*6777b538SAndroid Build Coastguard Worker return true;
279*6777b538SAndroid Build Coastguard Worker }
280*6777b538SAndroid Build Coastguard Worker if (min() < i.min() && max() > i.max()) {
281*6777b538SAndroid Build Coastguard Worker // [------- this --------)
282*6777b538SAndroid Build Coastguard Worker // [---- i ----)
283*6777b538SAndroid Build Coastguard Worker // [ R1 ) [ R2 )
284*6777b538SAndroid Build Coastguard Worker // There are two results: R1 and R2.
285*6777b538SAndroid Build Coastguard Worker *lo = Interval(min(), i.min());
286*6777b538SAndroid Build Coastguard Worker *hi = Interval(i.max(), max());
287*6777b538SAndroid Build Coastguard Worker return true;
288*6777b538SAndroid Build Coastguard Worker }
289*6777b538SAndroid Build Coastguard Worker if (min() >= i.min() && max() <= i.max()) {
290*6777b538SAndroid Build Coastguard Worker // [--- this ---)
291*6777b538SAndroid Build Coastguard Worker // [------ i --------)
292*6777b538SAndroid Build Coastguard Worker // Intersection is <this>, so difference yields the empty interval.
293*6777b538SAndroid Build Coastguard Worker return true;
294*6777b538SAndroid Build Coastguard Worker }
295*6777b538SAndroid Build Coastguard Worker *lo = *this; // No intersection.
296*6777b538SAndroid Build Coastguard Worker return false;
297*6777b538SAndroid Build Coastguard Worker }
298*6777b538SAndroid Build Coastguard Worker
299*6777b538SAndroid Build Coastguard Worker } // namespace net
300*6777b538SAndroid Build Coastguard Worker
301*6777b538SAndroid Build Coastguard Worker #endif // NET_BASE_INTERVAL_H_
302