| // Copyright 2024 The PDFium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "core/fxcrt/code_point_view.h" | |
| #include "core/fxcrt/utf16.h" | |
| #if !defined(WCHAR_T_IS_16_BIT) | |
| #error "Building on wrong platform". | |
| #endif | |
| namespace pdfium { | |
| CodePointView::CodePointView(WideStringView backing) : backing_(backing) {} | |
| CodePointView::~CodePointView() = default; | |
| CodePointView::Iterator::Iterator(WideStringView str_view) | |
| : current_(str_view), code_point_(Decode()) {} | |
| CodePointView::Iterator::~Iterator() = default; | |
| char32_t CodePointView::Iterator::Decode() { | |
| if (current_.IsEmpty()) { | |
| return kSentinel; | |
| } | |
| char32_t code_point = current_.Front(); | |
| next_ = current_.Substr(1); | |
| if (IsHighSurrogate(code_point)) { | |
| if (!next_.IsEmpty() && IsLowSurrogate(next_.Front())) { | |
| code_point = SurrogatePair(code_point, next_.Front()).ToCodePoint(); | |
| next_ = next_.Substr(1); | |
| } | |
| } | |
| return code_point; | |
| } | |
| } // namespace pdfium |