| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SKY_ENGINE_CORE_EDITING_COMPOSITIONUNDERLINERANGEFILTER_H_ |
| #define SKY_ENGINE_CORE_EDITING_COMPOSITIONUNDERLINERANGEFILTER_H_ |
| |
| #include "sky/engine/core/editing/CompositionUnderline.h" |
| #include "sky/engine/wtf/NotFound.h" |
| #include "sky/engine/wtf/Vector.h" |
| |
| namespace blink { |
| |
| // A visitor class to yield elements of a sorted (by startOffset) list of |
| // underlines, visiting only elements that intersect with specified *inclusive* |
| // range [indexLo, indexHi]. |
| class CompositionUnderlineRangeFilter { |
| WTF_MAKE_NONCOPYABLE(CompositionUnderlineRangeFilter); |
| public: |
| class ConstIterator { |
| public: |
| ConstIterator(): m_filter(nullptr), m_index(0) { } |
| const CompositionUnderline& operator*() |
| { |
| ASSERT(m_index != kNotFound); |
| return m_filter->m_underlines[m_index]; |
| } |
| ConstIterator& operator++() |
| { |
| if (m_index != kNotFound) |
| m_index = m_filter->seekValidIndex(m_index + 1); |
| return *this; |
| } |
| const CompositionUnderline* operator->() |
| { |
| ASSERT(m_index != kNotFound); |
| return &m_filter->m_underlines[m_index]; |
| } |
| bool operator==(const ConstIterator& other) |
| { |
| return other.m_index == m_index && other.m_filter == m_filter; |
| } |
| bool operator!=(const ConstIterator& other) { return !operator==(other); } |
| |
| private: |
| friend class CompositionUnderlineRangeFilter; |
| |
| ConstIterator(CompositionUnderlineRangeFilter* filter, size_t index) |
| : m_filter(filter) |
| , m_index(index) { } |
| CompositionUnderlineRangeFilter* m_filter; |
| size_t m_index; |
| }; |
| |
| CompositionUnderlineRangeFilter(const Vector<CompositionUnderline>& underlines, size_t indexLo, size_t indexHi); |
| |
| ConstIterator begin() { return ConstIterator(this, seekValidIndex(0)); } |
| const ConstIterator& end() { return m_theEnd; } |
| |
| private: |
| friend class ConstIterator; |
| |
| // Returns |index| if |m_underlines[index]| intersects with range |
| // [m_indexLo, m_indexHi]. Otherwise returns the index of the next |
| // intersecting interval, or END if there are none left. |
| size_t seekValidIndex(size_t index); |
| |
| // Assume that elements of |m_underlines| are sorted by |.startOffset|. |
| const Vector<CompositionUnderline>& m_underlines; |
| // The "query range" is the inclusive range [m_indexLo, m_indexHi]. |
| const size_t m_indexLo; |
| const size_t m_indexHi; |
| const ConstIterator m_theEnd; |
| }; |
| |
| } // namespace blink |
| |
| #endif // SKY_ENGINE_CORE_EDITING_COMPOSITIONUNDERLINERANGEFILTER_H_ |