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 <algorithm>
30#include <wtf/PassRefPtr.h>
31#include <wtf/RefCounted.h>
32#include <wtf/Vector.h>
33
34namespace WebCore {
35
36typedef int ExceptionCode;
37
38class TimeRanges : public RefCounted<TimeRanges> {
39public:
40    static PassRefPtr<TimeRanges> create()
41    {
42        return adoptRef(new TimeRanges);
43    }
44    static PassRefPtr<TimeRanges> create(double start, double end)
45    {
46        return adoptRef(new TimeRanges(start, end));
47    }
48
49    PassRefPtr<TimeRanges> copy() const;
50    void invert();
51    void intersectWith(const TimeRanges*);
52    void unionWith(const TimeRanges*);
53
54    unsigned length() const { return m_ranges.size(); }
55    double start(unsigned index, ExceptionCode&) const;
56    double end(unsigned index, ExceptionCode&) const;
57
58    void add(double start, double end);
59
60    bool contain(double time) const;
61
62    double nearest(double time) const;
63
64    double totalDuration() const;
65
66private:
67    TimeRanges() { }
68    TimeRanges(double start, double end);
69    TimeRanges(const TimeRanges&);
70
71    // We consider all the Ranges to be semi-bounded as follow: [start, end[
72    struct Range {
73        Range() { }
74        Range(double start, double end)
75        {
76            m_start = start;
77            m_end = end;
78        }
79        double m_start;
80        double m_end;
81
82        inline bool isPointInRange(double point) const
83        {
84            return m_start <= point && point < m_end;
85        }
86
87        inline bool isOverlappingRange(const Range& range) const
88        {
89            return isPointInRange(range.m_start) || isPointInRange(range.m_end) || range.isPointInRange(m_start);
90        }
91
92        inline bool isContiguousWithRange(const Range& range) const
93        {
94            return range.m_start == m_end || range.m_end == m_start;
95        }
96
97        inline Range unionWithOverlappingOrContiguousRange(const Range& range) const
98        {
99            Range ret;
100
101            ret.m_start = std::min(m_start, range.m_start);
102            ret.m_end = std::max(m_end, range.m_end);
103
104            return ret;
105        }
106
107        inline bool isBeforeRange(const Range& range) const
108        {
109            return range.m_start >= m_end;
110        }
111    };
112
113    Vector<Range> m_ranges;
114};
115
116} // namespace WebCore
117
118#endif
119