15d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// found in the LICENSE file.
45d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
55d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#ifndef CompositionUnderlineRangeFilter_h
65d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#define CompositionUnderlineRangeFilter_h
75d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
85d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/editing/CompositionUnderline.h"
95d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "wtf/NotFound.h"
105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "wtf/Vector.h"
115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
12c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// A visitor class to yield elements of a sorted (by startOffset) list of
155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// underlines, visiting only elements that intersect with specified *inclusive*
165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// range [indexLo, indexHi].
175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)class CompositionUnderlineRangeFilter {
185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(CompositionUnderlineRangeFilter);
195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)public:
205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    class ConstIterator {
215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    public:
225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        ConstIterator(): m_filter(nullptr), m_index(0) { }
235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        const CompositionUnderline& operator*()
245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        {
255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            ASSERT(m_index != kNotFound);
265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return m_filter->m_underlines[m_index];
275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        ConstIterator& operator++()
295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        {
305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            if (m_index != kNotFound)
315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                m_index = m_filter->seekValidIndex(m_index + 1);
325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return *this;
335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        const CompositionUnderline* operator->()
355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        {
365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            ASSERT(m_index != kNotFound);
375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return &m_filter->m_underlines[m_index];
385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        bool operator==(const ConstIterator& other)
405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        {
415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return other.m_index == m_index && other.m_filter == m_filter;
425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        bool operator!=(const ConstIterator& other) { return !operator==(other); }
445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    private:
465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        friend class CompositionUnderlineRangeFilter;
475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        ConstIterator(CompositionUnderlineRangeFilter* filter, size_t index)
495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            : m_filter(filter)
505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            , m_index(index) { }
515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        CompositionUnderlineRangeFilter* m_filter;
525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        size_t m_index;
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    };
545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    CompositionUnderlineRangeFilter(const Vector<CompositionUnderline>& underlines, size_t indexLo, size_t indexHi);
565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    ConstIterator begin() { return ConstIterator(this, seekValidIndex(0)); }
585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    const ConstIterator& end() { return m_theEnd; }
595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)private:
615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    friend class ConstIterator;
625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Returns |index| if |m_underlines[index]| intersects with range
645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // [m_indexLo, m_indexHi]. Otherwise returns the index of the next
655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // intersecting interval, or END if there are none left.
665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    size_t seekValidIndex(size_t index);
675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Assume that elements of |m_underlines| are sorted by |.startOffset|.
695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    const Vector<CompositionUnderline>& m_underlines;
705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // The "query range" is the inclusive range [m_indexLo, m_indexHi].
715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    const size_t m_indexLo;
725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    const size_t m_indexHi;
735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    const ConstIterator m_theEnd;
745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)};
755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif
79