Commit 53df9899 authored by Koji Ishii's avatar Koji Ishii Committed by Commit Bot

[LayoutNG] Change FragmentRange to use shared code

This patch changes NGPaintFragment::FragmentRange to use the
generic range/iterator in NGPaintFragment::List/iterator.

Also changed the naming to match to std iterator.

No behavior changes.

Bug: 714962
Change-Id: I0df61e989949dff1e404928b23e124227cafec3c
Reviewed-on: https://chromium-review.googlesource.com/c/1309953
Commit-Queue: Koji Ishii <kojii@chromium.org>
Reviewed-by: default avatarYoshifumi Inoue <yosin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#604512}
parent 36e76bf3
......@@ -930,30 +930,6 @@ bool NGPaintFragment::ShouldPaintDragCaret() const {
return ToLayoutBlock(GetLayoutObject())->ShouldPaintDragCaret();
}
// ----
NGPaintFragment& NGPaintFragment::FragmentRange::front() const {
DCHECK(first_);
return *first_;
}
NGPaintFragment& NGPaintFragment::FragmentRange::back() const {
DCHECK(first_);
NGPaintFragment* last = first_;
for (NGPaintFragment* fragment : *this)
last = fragment;
return *last;
}
wtf_size_t NGPaintFragment::FragmentRange::size() const {
wtf_size_t size = 0;
for (NGPaintFragment* fragment : *this) {
ANALYZER_ALLOW_UNUSED(fragment);
++size;
}
return size;
}
String NGPaintFragment::DebugName() const {
StringBuilder name;
......@@ -979,6 +955,8 @@ String NGPaintFragment::DebugName() const {
return name.ToString();
}
template class CORE_TEMPLATE_EXPORT
NGPaintFragment::List<NGPaintFragment::TraverseNextForSameLayoutObject>;
template class CORE_TEMPLATE_EXPORT
NGPaintFragment::List<NGPaintFragment::TraverseNextSibling>;
......
......@@ -66,26 +66,26 @@ class CORE_EXPORT NGPaintFragment : public RefCounted<NGPaintFragment>,
const NGBreakToken*);
template <typename Traverse>
class List final {
class List {
public:
explicit List(NGPaintFragment* first) : first_(first) {}
class Iterator final
class iterator final
: public std::iterator<std::forward_iterator_tag, NGPaintFragment*> {
public:
explicit Iterator(NGPaintFragment* first) : current_(first) {}
explicit iterator(NGPaintFragment* first) : current_(first) {}
NGPaintFragment* operator*() const { return current_; }
NGPaintFragment* operator->() const { return current_; }
Iterator& operator++() {
iterator& operator++() {
DCHECK(current_);
current_ = Traverse::Next(current_);
return *this;
}
bool operator==(const Iterator& other) const {
bool operator==(const iterator& other) const {
return current_ == other.current_;
}
bool operator!=(const Iterator& other) const {
bool operator!=(const iterator& other) const {
return current_ != other.current_;
}
......@@ -93,8 +93,8 @@ class CORE_EXPORT NGPaintFragment : public RefCounted<NGPaintFragment>,
NGPaintFragment* current_;
};
Iterator begin() const { return Iterator(first_); }
Iterator end() const { return Iterator(nullptr); }
iterator begin() const { return iterator(first_); }
iterator end() const { return iterator(nullptr); }
// Returns the first |NGPaintFragment| in |FragmentRange| as STL container.
// It is error to call |front()| for empty range.
......@@ -236,12 +236,19 @@ class CORE_EXPORT NGPaintFragment : public RefCounted<NGPaintFragment>,
static bool TryMarkLastLineBoxDirtyFor(const LayoutObject& layout_object);
// A range of fragments for |FragmentsFor()|.
class CORE_EXPORT FragmentRange {
class TraverseNextForSameLayoutObject {
public:
static NGPaintFragment* Next(NGPaintFragment* current) {
return current->next_for_same_layout_object_;
}
};
class CORE_EXPORT FragmentRange
: public List<TraverseNextForSameLayoutObject> {
public:
explicit FragmentRange(
NGPaintFragment* first,
bool is_in_layout_ng_inline_formatting_context = true)
: first_(first),
: List(first),
is_in_layout_ng_inline_formatting_context_(
is_in_layout_ng_inline_formatting_context) {}
......@@ -249,50 +256,7 @@ class CORE_EXPORT NGPaintFragment : public RefCounted<NGPaintFragment>,
return is_in_layout_ng_inline_formatting_context_;
}
bool IsEmpty() const { return !first_; }
class iterator final
: public std::iterator<std::forward_iterator_tag, NGPaintFragment*> {
public:
explicit iterator(NGPaintFragment* first) : current_(first) {}
NGPaintFragment* operator*() const { return current_; }
NGPaintFragment* operator->() const { return current_; }
iterator& operator++() {
CHECK(current_);
current_ = current_->next_for_same_layout_object_;
return *this;
}
bool operator==(const iterator& other) const {
return current_ == other.current_;
}
bool operator!=(const iterator& other) const {
return current_ != other.current_;
}
private:
NGPaintFragment* current_;
};
iterator begin() const { return iterator(first_); }
iterator end() const { return iterator(nullptr); }
// Returns the first |NGPaintFragment| in |FragmentRange| as STL container.
// It is error to call |front()| for empty range.
NGPaintFragment& front() const;
// Returns the last |NGPaintFragment| in |FragmentRange| as STL container.
// It is error to call |back()| for empty range.
// Note: The complexity of |back()| is O(n) where n is number of elements
// in this |FragmentRange|.
NGPaintFragment& back() const;
// Returns number of fragments in this range. The complexity is O(n) where n
// is number of elements.
wtf_size_t size() const;
private:
NGPaintFragment* first_;
bool is_in_layout_ng_inline_formatting_context_;
};
......@@ -381,6 +345,8 @@ class CORE_EXPORT NGPaintFragment : public RefCounted<NGPaintFragment>,
LayoutRect selection_visual_rect_;
};
extern template class CORE_EXTERN_TEMPLATE_EXPORT
NGPaintFragment::List<NGPaintFragment::TraverseNextForSameLayoutObject>;
extern template class CORE_EXTERN_TEMPLATE_EXPORT
NGPaintFragment::List<NGPaintFragment::TraverseNextSibling>;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment