blob: 1fe7bab09b94c73cea537f4042eabcbbeb3b7457 [file] [log] [blame]
// 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_