300class FragmentWidthIterator {
301public:
302 typedef std::pair<unsigned, unsigned> WidthRange;
303 typedef ptrdiff_t difference_type;
304 typedef WidthRange value_type;
305 typedef WidthRange* pointer;
306 typedef WidthRange& reference;
307 typedef std::forward_iterator_tag iterator_category;
308
309 FragmentWidthIterator(const FlowContentsIterator::TextFragment& fragment, unsigned fragmentIndex)
310 : m_fragment(fragment)
311 , m_fragmentIndex(fragmentIndex)
312 {
313 }
314
315 FragmentWidthIterator& operator++()
316 {
317 ++m_fragmentIndex;
318 return *this;
319 }
320
321 FragmentWidthIterator operator++(int)
322 {
323 FragmentWidthIterator result(*this);
324 this->operator++();
325 return result;
326 }
327
328 FragmentWidthIterator& operator--()
329 {
330 --m_fragmentIndex;
331 return *this;
332 }
333
334 FragmentWidthIterator operator--(int)
335 {
336 FragmentWidthIterator result(*this);
337 this->operator--();
338 return result;
339 }
340
341 bool operator==(const FragmentWidthIterator& other) const { return m_fragmentIndex == other.m_fragmentIndex; }
342 bool operator!=(const FragmentWidthIterator& other) const { return !(*this == other); }
343 const WidthRange operator*() const { return std::make_pair(m_fragment.start(), m_fragmentIndex); }
344
345private:
346 FlowContentsIterator::TextFragment m_fragment;
347 unsigned m_fragmentIndex { 0 };
348};
349
350static FragmentWidthIterator begin(const FlowContentsIterator::TextFragment& fragment) { return FragmentWidthIterator(fragment, fragment.start()); }
351static FragmentWidthIterator end(const FlowContentsIterator::TextFragment& fragment) { return FragmentWidthIterator(fragment, fragment.end()); }
352