• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #ifndef TimeRanges_h
27 #define TimeRanges_h
28 
29 #include "bindings/v8/ScriptWrappable.h"
30 #include "public/platform/WebTimeRange.h"
31 #include "wtf/PassRefPtr.h"
32 #include "wtf/RefCounted.h"
33 #include "wtf/Vector.h"
34 
35 #include <algorithm>
36 
37 namespace WebCore {
38 
39 class ExceptionState;
40 
41 class TimeRanges : public RefCounted<TimeRanges>, public ScriptWrappable {
42 public:
create()43     static PassRefPtr<TimeRanges> create()
44     {
45         return adoptRef(new TimeRanges);
46     }
create(double start,double end)47     static PassRefPtr<TimeRanges> create(double start, double end)
48     {
49         return adoptRef(new TimeRanges(start, end));
50     }
51     static PassRefPtr<TimeRanges> create(const blink::WebTimeRanges&);
52 
53     PassRefPtr<TimeRanges> copy() const;
54     void intersectWith(const TimeRanges*);
55     void unionWith(const TimeRanges*);
56 
length()57     unsigned length() const { return m_ranges.size(); }
58     double start(unsigned index, ExceptionState&) const;
59     double end(unsigned index, ExceptionState&) const;
60 
61     void add(double start, double end);
62 
63     bool contain(double time) const;
64 
65     double nearest(double time) const;
66 
67 private:
TimeRanges()68     TimeRanges()
69     {
70         ScriptWrappable::init(this);
71     }
72 
73     TimeRanges(double start, double end);
74 
75     void invert();
76 
77     // We consider all the Ranges to be semi-bounded as follow: [start, end[
78     struct Range {
RangeRange79         Range() { }
RangeRange80         Range(double start, double end)
81         {
82             m_start = start;
83             m_end = end;
84         }
85         double m_start;
86         double m_end;
87 
isPointInRangeRange88         inline bool isPointInRange(double point) const
89         {
90             return m_start <= point && point < m_end;
91         }
92 
isOverlappingRangeRange93         inline bool isOverlappingRange(const Range& range) const
94         {
95             return isPointInRange(range.m_start) || isPointInRange(range.m_end) || range.isPointInRange(m_start);
96         }
97 
isContiguousWithRangeRange98         inline bool isContiguousWithRange(const Range& range) const
99         {
100             return range.m_start == m_end || range.m_end == m_start;
101         }
102 
unionWithOverlappingOrContiguousRangeRange103         inline Range unionWithOverlappingOrContiguousRange(const Range& range) const
104         {
105             Range ret;
106 
107             ret.m_start = std::min(m_start, range.m_start);
108             ret.m_end = std::max(m_end, range.m_end);
109 
110             return ret;
111         }
112 
isBeforeRangeRange113         inline bool isBeforeRange(const Range& range) const
114         {
115             return range.m_start >= m_end;
116         }
117     };
118 
119     Vector<Range> m_ranges;
120 };
121 
122 } // namespace WebCore
123 
124 #endif
125