/* * Copyright (c) 2022, Idan Horowitz * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace JS::Intl { class SegmentIterator final : public Object { JS_OBJECT(SegmentIterator, Object); GC_DECLARE_ALLOCATOR(SegmentIterator); public: static GC::Ref create(Realm&, Unicode::Segmenter const&, Utf16View const&, Segments const&); virtual ~SegmentIterator() override = default; Unicode::Segmenter& iterating_segmenter() { return *m_iterating_segmenter; } Utf16View const& iterated_string() const { return m_iterated_string; } size_t iterated_string_next_segment_code_unit_index() const { return m_iterating_segmenter->current_boundary(); } Segments const& segments() { return m_segments; } private: SegmentIterator(Realm&, Unicode::Segmenter const&, Utf16View const&, Segments const&); virtual void visit_edges(Cell::Visitor&) override; NonnullOwnPtr m_iterating_segmenter; // [[IteratingSegmenter]] Utf16View m_iterated_string; // [[IteratedString]] GC::Ref m_segments; }; }