19 #ifndef LIB_CS_ENCODING_H
20 #define LIB_CS_ENCODING_H
32 using size_type = std::ptrdiff_t;
33 using storage_unit = uint8_t;
35 template <
typename Iterator>
36 static Iterator advance(Iterator iter_begin, Iterator iter_end, size_type count)
38 auto iter = iter_begin;
39 storage_unit value = 0;
41 while (iter != iter_end && count != 0) {
44 if (value < 0x80 || value > 0xBf) {
52 while (iter != iter_end && *iter >= 0x80 && *iter <= 0xBF) {
60 template <
typename Iterator>
61 static size_type distance(Iterator iter_begin, Iterator iter_end)
65 for (
auto iter = iter_begin; iter != iter_end; ++iter) {
66 storage_unit value = *iter;
68 if (value < 0x80 || value > 0xBF) {
77 template <
typename Container>
78 static typename Container::const_iterator insert(Container &str1,
79 typename Container::const_iterator iter, CsChar c, size_type count = 1)
81 uint32_t value = c.unicode();
83 for (size_type x = 0; x < count; ++x) {
84 if (value <= 0x007F) {
85 iter = str1.insert(iter, value);
87 }
else if (value <= 0x07FF) {
88 iter = str1.insert(iter, ((value) & 0x3F) | 0x80);
89 iter = str1.insert(iter, ((value >> 6) & 0x1F) | 0xC0);
91 }
else if (value <= 0xFFFF) {
92 iter = str1.insert(iter, ((value ) & 0x3F) | 0x80);
93 iter = str1.insert(iter, ((value >> 6 ) & 0x3F) | 0x80);
94 iter = str1.insert(iter, ((value >> 12) & 0x0F) | 0xE0);
97 iter = str1.insert(iter, ((value ) & 0x3F) | 0x80);
98 iter = str1.insert(iter, ((value >> 6 ) & 0x3F) | 0x80);
99 iter = str1.insert(iter, ((value >> 12) & 0x3F) | 0x80);
100 iter = str1.insert(iter, ((value >> 18) & 0x07) | 0xF0);
108 static size_type walk(size_type len, std::vector<storage_unit>::const_iterator iter)
110 size_type retval = 0;
116 for (size_type x = 0; x < len; ++x) {
117 uint8_t value = *iter;
119 count = numOfBytes(value);
128 for (size_type x = 0; x > len; --x) {
134 uint8_t value = *iter;
136 if ((value & 0xC0) != 0x80) {
147 static CsChar getCodePoint(std::vector<storage_unit>::const_iterator iter)
152 if ((tmp & 0x80) == 0) {
155 }
else if ((tmp & 0xE0) == 0xC0) {
156 value = (tmp & 0x1F) << 6;
159 value |= (tmp & 0x3F);
162 }
else if ((tmp & 0xF0) == 0xE0) {
163 value = (tmp & 0x0F) << 12;
166 value |= (tmp & 0x3F) << 6;
169 value |= (tmp & 0x3F);
172 value = (tmp & 0x07) << 18;
175 value |= (tmp & 0x3F) << 12;
178 value |= (tmp & 0x3F) << 6;
181 value |= (tmp & 0x3F);
185 return CsChar(value);
189 static size_type numOfBytes(uint8_t value)
191 if ((value & 0x80) == 0) {
194 }
else if ((value & 0xE0) == 0xC0) {
197 }
else if ((value & 0xF0) == 0xE0) {
200 }
else if ((value & 0xF8) == 0xF0) {
212 using size_type = std::ptrdiff_t;
213 using storage_unit = uint16_t;
215 template <
typename Iterator>
216 static Iterator advance(Iterator iter_begin, Iterator iter_end, size_type count)
218 auto iter = iter_begin;
219 storage_unit value = 0;
221 while (iter != iter_end && count != 0) {
224 if (value < 0xDC00 || value > 0xDFFF) {
232 if (value >= 0xD800 && value <= 0xDBFF) {
239 template <
typename Iterator>
240 static size_type distance(Iterator iter_begin, Iterator iter_end)
242 size_type retval = 0;
244 for (
auto iter = iter_begin; iter != iter_end; ++iter) {
245 storage_unit value = *iter;
247 if (value < 0xDC00 || value > 0xDFFF) {
256 template <
typename Container>
257 static typename Container::const_iterator insert(Container &str1,
258 typename Container::const_iterator iter, CsChar c, size_type count = 1)
260 uint32_t value = c.unicode();
262 for (size_type x = 0; x < count; ++x) {
264 if ((value <= 0xD7FF) || ((value >= 0xE000) && (value <= 0xFFFF))) {
265 iter = str1.insert(iter, value);
270 iter = str1.insert(iter, ((value ) & 0x03FF) + 0xDC00);
271 iter = str1.insert(iter, ((value >> 10) & 0x03FF) + 0xD800);
279 static size_type walk(size_type len, std::vector<storage_unit>::const_iterator iter)
281 size_type retval = 0;
287 for (size_type x = 0; x < len; ++x) {
288 uint16_t value = *iter;
290 count = numOfBytes(value);
299 for (size_type x = 0; x > len; --x) {
305 uint16_t value = *iter;
307 if ((value & 0xFC00) != 0xDC00) {
320 static CsChar getCodePoint(std::vector<storage_unit>::const_iterator iter)
323 uint16_t tmp = *iter;
325 if ((tmp & 0xFC00) != 0xD800) {
329 value = (tmp & 0x03FF) << 10;
332 value |= (tmp & 0x03FF);
336 return CsChar(value);
340 static size_type numOfBytes(uint16_t value)
342 if ((value & 0xFC00) == 0xD800) {
#define LIB_CS_STRING_EXPORT
Definition: cs_char.h:35