15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef TimeRanges_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define TimeRanges_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptWrappable.h"
3051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/WebTimeRange.h"
3193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/PassRefPtr.h"
3293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/RefCounted.h"
3393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/Vector.h"
3493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <algorithm>
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39df95704c49daea886ddad70775bda23618d6274dBen Murdochclass ExceptionState;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass TimeRanges : public RefCountedWillBeGarbageCollected<TimeRanges>, public ScriptWrappable {
427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DEFINE_WRAPPERTYPEINFO();
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We consider all the Ranges to be semi-bounded as follow: [start, end[
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct Range {
46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        ALLOW_ONLY_INLINE_ALLOCATION();
47197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    public:
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Range() { }
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        Range(double start, double end)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_start = start;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_end = end;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        double m_start;
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        double m_end;
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        inline bool isPointInRange(double point) const
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return m_start <= point && point < m_end;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
61e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        inline bool isOverlappingRange(const Range& range) const
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return isPointInRange(range.m_start) || isPointInRange(range.m_end) || range.isPointInRange(m_start);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        inline bool isContiguousWithRange(const Range& range) const
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return range.m_start == m_end || range.m_end == m_start;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
71e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        inline Range unionWithOverlappingOrContiguousRange(const Range& range) const
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Range ret;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ret.m_start = std::min(m_start, range.m_start);
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ret.m_end = std::max(m_end, range.m_end);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return ret;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        inline bool isBeforeRange(const Range& range) const
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return range.m_start >= m_end;
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
87197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        void trace(Visitor*) { }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
89e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    static PassRefPtrWillBeRawPtr<TimeRanges> create()
91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return adoptRefWillBeNoop(new TimeRanges);
93197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
94197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    static PassRefPtrWillBeRawPtr<TimeRanges> create(double start, double end)
95197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
96197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return adoptRefWillBeNoop(new TimeRanges(start, end));
97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    static PassRefPtrWillBeRawPtr<TimeRanges> create(const blink::WebTimeRanges&);
99197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    PassRefPtrWillBeRawPtr<TimeRanges> copy() const;
101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void intersectWith(const TimeRanges*);
102197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void unionWith(const TimeRanges*);
103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    unsigned length() const { return m_ranges.size(); }
105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    double start(unsigned index, ExceptionState&) const;
106197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    double end(unsigned index, ExceptionState&) const;
107197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
108197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void add(double start, double end);
109197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
110197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool contain(double time) const;
111197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    double nearest(double newPlaybackPosition, double currentPlaybackPosition) const;
113197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
114197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void trace(Visitor*);
115197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
116197021e6b966cfb06891637935ef33fff06433d1Ben Murdochprivate:
1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    TimeRanges() { }
118197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TimeRanges(double start, double end);
120197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void invert();
122197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
123197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WillBeHeapVector<Range> m_ranges;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
128c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::TimeRanges::Range);
129197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif // TimeRanges_h
131