19 #ifndef LIB_CS_ENCODING_H
20 #define LIB_CS_ENCODING_H
29 template <
typename Container,
typename Value>
30 concept EncodingInsert =
requires(Container r_str, Container::const_iterator r_iter, Value r_value)
31 { r_iter = r_str.insert(r_iter, r_value); };
36 using size_type = std::ptrdiff_t;
37 using storage_unit = uint8_t;
39 template <
typename Iterator>
40 static Iterator advance(Iterator iter_begin, Iterator iter_end, size_type count)
42 auto iter = iter_begin;
43 storage_unit value = 0;
45 while (iter != iter_end && count != 0) {
48 if (value < 0x80 || value > 0xBf) {
56 while (iter != iter_end && *iter >= 0x80 && *iter <= 0xBF) {
64 template <
typename Iterator>
65 static size_type distance(Iterator iter_begin, Iterator iter_end)
69 for (
auto iter = iter_begin; iter != iter_end; ++iter) {
70 storage_unit value = *iter;
72 if (value < 0x80 || value > 0xBF) {
81 template <
typename Container>
82 requires EncodingInsert<Container, uint32_t>
83 static typename Container::const_iterator insert(Container &str1,
84 typename Container::const_iterator iter, CsChar c, size_type count = 1)
86 uint32_t value = c.unicode();
88 for (size_type x = 0; x < count; ++x) {
89 if (value <= 0x007F) {
90 iter = str1.insert(iter, value);
92 }
else if (value <= 0x07FF) {
93 iter = str1.insert(iter, ((value) & 0x3F) | 0x80);
94 iter = str1.insert(iter, ((value >> 6) & 0x1F) | 0xC0);
96 }
else if (value <= 0xFFFF) {
97 iter = str1.insert(iter, ((value ) & 0x3F) | 0x80);
98 iter = str1.insert(iter, ((value >> 6 ) & 0x3F) | 0x80);
99 iter = str1.insert(iter, ((value >> 12) & 0x0F) | 0xE0);
102 iter = str1.insert(iter, ((value ) & 0x3F) | 0x80);
103 iter = str1.insert(iter, ((value >> 6 ) & 0x3F) | 0x80);
104 iter = str1.insert(iter, ((value >> 12) & 0x3F) | 0x80);
105 iter = str1.insert(iter, ((value >> 18) & 0x07) | 0xF0);
113 static size_type walk(size_type len, std::vector<storage_unit>::const_iterator iter)
115 size_type retval = 0;
121 for (size_type x = 0; x < len; ++x) {
122 uint8_t value = *iter;
124 count = numOfBytes(value);
133 for (size_type x = 0; x > len; --x) {
139 uint8_t value = *iter;
141 if ((value & 0xC0) != 0x80) {
152 static CsChar getCodePoint(std::vector<storage_unit>::const_iterator iter)
157 if ((tmp & 0x80) == 0) {
160 }
else if ((tmp & 0xE0) == 0xC0) {
161 value = (tmp & 0x1F) << 6;
164 value |= (tmp & 0x3F);
167 }
else if ((tmp & 0xF0) == 0xE0) {
168 value = (tmp & 0x0F) << 12;
171 value |= (tmp & 0x3F) << 6;
174 value |= (tmp & 0x3F);
177 value = (tmp & 0x07) << 18;
180 value |= (tmp & 0x3F) << 12;
183 value |= (tmp & 0x3F) << 6;
186 value |= (tmp & 0x3F);
190 return CsChar(value);
194 static size_type numOfBytes(uint8_t value)
196 if ((value & 0x80) == 0) {
199 }
else if ((value & 0xE0) == 0xC0) {
202 }
else if ((value & 0xF0) == 0xE0) {
205 }
else if ((value & 0xF8) == 0xF0) {
217 using size_type = std::ptrdiff_t;
218 using storage_unit = uint16_t;
220 template <
typename Iterator>
221 static Iterator advance(Iterator iter_begin, Iterator iter_end, size_type count)
223 auto iter = iter_begin;
224 storage_unit value = 0;
226 while (iter != iter_end && count != 0) {
229 if (value < 0xDC00 || value > 0xDFFF) {
237 if (value >= 0xD800 && value <= 0xDBFF) {
244 template <
typename Iterator>
245 static size_type distance(Iterator iter_begin, Iterator iter_end)
247 size_type retval = 0;
249 for (
auto iter = iter_begin; iter != iter_end; ++iter) {
250 storage_unit value = *iter;
252 if (value < 0xDC00 || value > 0xDFFF) {
261 template <
typename Container>
262 static typename Container::const_iterator insert(Container &str1,
263 typename Container::const_iterator iter, CsChar c, size_type count = 1)
265 uint32_t value = c.unicode();
267 for (size_type x = 0; x < count; ++x) {
269 if ((value <= 0xD7FF) || ((value >= 0xE000) && (value <= 0xFFFF))) {
270 iter = str1.insert(iter, value);
275 iter = str1.insert(iter, ((value ) & 0x03FF) + 0xDC00);
276 iter = str1.insert(iter, ((value >> 10) & 0x03FF) + 0xD800);
284 static size_type walk(size_type len, std::vector<storage_unit>::const_iterator iter)
286 size_type retval = 0;
292 for (size_type x = 0; x < len; ++x) {
293 uint16_t value = *iter;
295 count = numOfBytes(value);
304 for (size_type x = 0; x > len; --x) {
310 uint16_t value = *iter;
312 if ((value & 0xFC00) != 0xDC00) {
325 static CsChar getCodePoint(std::vector<storage_unit>::const_iterator iter)
328 uint16_t tmp = *iter;
330 if ((tmp & 0xFC00) != 0xD800) {
334 value = (tmp & 0x03FF) << 10;
337 value |= (tmp & 0x03FF);
341 return CsChar(value);
345 static size_type numOfBytes(uint16_t value)
347 if ((value & 0xFC00) == 0xD800) {
#define LIB_CS_STRING_EXPORT
Definition: cs_char.h:35