blob: 31e4dd446f2448126470392726c9f1bb38276a52 [file] [log] [blame]
// Copyright 2023 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CORE_FXCRT_CODE_POINT_VIEW_H_
#define CORE_FXCRT_CODE_POINT_VIEW_H_
#include "build/build_config.h"
#include "core/fxcrt/check_op.h"
#include "core/fxcrt/string_view_template.h"
#include "core/fxcrt/utf16.h"
namespace pdfium {
#if defined(WCHAR_T_IS_16_BIT)
// A view over a UTF-16 `WideStringView` suitable for iterating by code point
// using a range-based `for` loop.
class CodePointView final {
public:
class Iterator {
public:
~Iterator();
bool operator==(const Iterator& other) const {
return current_ == other.current_;
}
bool operator!=(const Iterator& other) const {
return current_ != other.current_;
}
Iterator& operator++() {
current_ = next_;
code_point_ = Decode();
return *this;
}
char32_t operator*() const {
DCHECK_NE(kSentinel, code_point_);
return code_point_;
}
private:
friend class CodePointView;
static constexpr char32_t kSentinel = -1;
explicit Iterator(WideStringView str_view);
char32_t Decode();
WideStringView current_;
WideStringView next_;
char32_t code_point_;
};
explicit CodePointView(WideStringView backing);
~CodePointView();
Iterator begin() const { return Iterator(backing_); }
Iterator end() const { return Iterator(WideStringView()); }
private:
WideStringView backing_;
};
#else
using CodePointView = WideStringView;
#endif // defined(WCHAR_T_IS_16_BIT)
} // namespace pdfium
#endif // CORE_FXCRT_CODE_POINT_VIEW_H_