NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
utf_iterator.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_STRING_UTF_ITERATOR_HPP__
2#define NEFORCE_CORE_STRING_UTF_ITERATOR_HPP__
3
11
13NEFORCE_BEGIN_NAMESPACE__
14
20
32public:
34 using reference = const codepoint&;
35 using pointer = const codepoint*;
38
39private:
40 const byte_t* data_ = nullptr;
41 size_t remaining_ = 0;
42 size_t consumed_ = 0;
43 codepoint current_;
44
45 void decode_current() noexcept {
46 if ((data_ != nullptr) && remaining_ > 0) {
47 size_t pos = 0;
48 current_ = codepoint::decode_utf8(data_, pos, remaining_);
49 consumed_ = pos;
50 } else {
51 current_ = codepoint::null();
52 consumed_ = 0;
53 }
54 }
55
56public:
60 utf8_iterator() noexcept = default;
61
67 utf8_iterator(const byte_t* data, size_t remaining) noexcept :
68 data_(data),
69 remaining_(remaining) {
70 decode_current();
71 }
72
77 NEFORCE_NODISCARD reference operator*() const noexcept { return current_; }
78
83 NEFORCE_NODISCARD pointer operator->() const noexcept { return &current_; }
84
90 if ((data_ != nullptr) && remaining_ > 0) {
91 data_ += consumed_;
92 remaining_ -= _NEFORCE min(remaining_, consumed_);
93 decode_current();
94 }
95 return *this;
96 }
97
102 utf8_iterator operator++(int) noexcept {
103 const utf8_iterator tmp = *this;
104 ++*this;
105 return move(tmp);
106 }
107
113 NEFORCE_NODISCARD bool operator==(const utf8_iterator& other) const noexcept {
114 if (remaining_ == 0 && other.remaining_ == 0) {
115 return true;
116 }
117 return data_ == other.data_ && remaining_ == other.remaining_;
118 }
119
125 NEFORCE_NODISCARD bool operator!=(const utf8_iterator& other) const noexcept { return !(*this == other); }
126};
127
135 const byte_t* data_;
136 size_t size_;
137
138public:
143 explicit utf8_range(const string_view sv) noexcept :
144 data_(reinterpret_cast<const byte_t*>(sv.data())),
145 size_(sv.size()) {}
146
147 explicit utf8_range(const byte_t* data, const size_t size) noexcept :
148 data_(data),
149 size_(size) {}
150
155 NEFORCE_NODISCARD utf8_iterator begin() const noexcept { return {data_, size_}; }
156
161 NEFORCE_NODISCARD utf8_iterator end() const noexcept { return {nullptr, 0}; }
162};
163 // UtfIterator
165
166NEFORCE_END_NAMESPACE__
167#endif // NEFORCE_CORE_STRING_UTF_ITERATOR_HPP__
Unicode码点包装类
static codepoint decode_utf8(const byte_t *data, size_t &i, size_t len) noexcept
从UTF-8字节流解码一个码点,并推进索引
static constexpr codepoint null() noexcept
构造空字符U+0000
UTF-8前向迭代器,遍历字符串中的Unicode码点
forward_iterator_tag iterator_category
迭代器类别
utf8_iterator operator++(int) noexcept
后置递增操作符
codepoint value_type
值类型
const codepoint & reference
引用类型
bool operator!=(const utf8_iterator &other) const noexcept
不等比较操作符
ptrdiff_t difference_type
差值类型
pointer operator->() const noexcept
成员访问操作符
const codepoint * pointer
指针类型
reference operator*() const noexcept
解引用操作符
bool operator==(const utf8_iterator &other) const noexcept
相等比较操作符
utf8_iterator() noexcept=default
默认构造函数,构造结束迭代器
utf8_iterator & operator++() noexcept
前置递增操作符
UTF-8码点遍历范围
utf8_iterator end() const noexcept
获取结束迭代器
utf8_range(const string_view sv) noexcept
构造函数
utf8_iterator begin() const noexcept
获取起始迭代器
Unicode码点处理类
constexpr const T & min(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(b, a)))
返回两个值中的较小者
unsigned char byte_t
字节类型,定义为无符号字符
int64_t ptrdiff_t
指针差类型
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针