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