acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
unicode.h
1#pragma once
2
3
4#include "acme/prototype/collection/range.h"
5
6
7#if WCHAR_T_SIZE == 16
8
9CLASS_DECL_ACME wstring wd32_to_wd16_str(const ::wd32_character * pcwsz, character_count input_size = -1);
10
11#endif
12
13CLASS_DECL_ACME string wd16_to_ansi_str(const ::wd16_character * pwsz, character_count srclen = -1);
14
15CLASS_DECL_ACME string wd32_to_ansi_str(const ::wd32_character * pwsz, character_count srclen = -1);
16
17
18
19CLASS_DECL_ACME string get_utf8_char(const_char_pointer psz);
20inline bool next_unicode_character(::string & strChar, const ::ansi_character*& psz)
21{
22 strChar = get_utf8_char(psz);
23 if (strChar.is_empty())
24 {
25
26 return false;
27 }
28 psz += strChar.length();
29 return true;
30
31}
32::i32 get_utf8_char_length(const_char_pointer psz);
33string get_utf8_char(const_char_pointer psz, const_char_pointer pszEnd);
34::const_ansi_range get_utf8_char(::const_ansi_range & range);
35
36bool get_utf8_char(string & strChar, const_char_pointer &psz, const_char_pointer pszEnd);
37string get_utf8_char(const_char_pointer pszBeg, const_char_pointer psz, character_count i);
38string utf8_next_char(const_char_pointer pszBeg, const_char_pointer psz, character_count i = 0);
39string utf8_previous_char(const_char_pointer pszBeg, const_char_pointer psz, character_count i = 0);
40CLASS_DECL_ACME character_count unicode_to_utf8_length(::i64 ch);
41::i32 unicode_to_utf8_2_or_more(::ansi_character * dest, ::i32 ch);
42
43
44CLASS_DECL_ACME const_char_pointer utf8_dec(const_char_pointer pszBeg, const_char_pointer psz);
45
46
47//inline ::i32 unicode_index(const_char_pointer &input, character_count * psrclen);
48//inline ::i32 unicode_index(const ::wd16_character *& input, character_count * psrclen);
49//inline ::i32 unicode_index(const ::wd32_character *& input, character_count * psrclen);
50
51
52// return Unicode Index and
53// number of characters need to be consumed to parse a Unicode Character
54inline ::i32 unicode_index_length(const_char_pointer pszChar, ::i32 & len);
55inline ::i32 unicode_index_length(const ::wd16_character * pszChar, ::i32 & len);
56inline ::i32 unicode_index_length(const ::wd32_character * pszChar, ::i32 & len) { len = *pszChar != 0; return *pszChar; }
57
58
59inline ::i32 consume_unicode_index_length(const_char_pointer &pszChar);
60inline ::i32 consume_unicode_index_length(const ::wd16_character * & pszChar);
61inline ::i32 consume_unicode_index_length(const ::wd32_character * & pszChar) { return *pszChar++; }
62
63
64inline ::i32 unicode_index(const_char_pointer pszChar) { ::i32 len = 0; return unicode_index_length(pszChar, len); }
65inline ::i32 unicode_index(const ::wd16_character * pszChar) { ::i32 len = 0; return unicode_index_length(pszChar, len); }
66inline ::i32 unicode_index(const ::wd32_character * pszChar) { ::i32 len = 0; return unicode_index_length(pszChar, len); }
67
68
69inline bool is_legal_unicode_index(::i32 iUnicodeIndex);
70
71
72CLASS_DECL_ACME ::i32 unicode_to_lower_case(::i32 i);
73CLASS_DECL_ACME ::i32 unicode_to_upper_case(::i32 i);
74
75
76#define UNI_DECLARE_IS_FUNCTION(function) \
77inline bool function(::i32 i); \
78inline bool function(const_char_pointer psz); \
79inline bool function(const ::wd16_character * psz); \
80inline bool function(const ::wd32_character * psz);
81
82#define UNI_IMPLEMENT_IS_FUNCTION(function) \
83inline bool function(const_char_pointer psz) { return function(unicode_index(psz)); } \
84inline bool function(const ::wd16_character * psz) { return function(unicode_index(psz)); } \
85inline bool function(const ::wd32_character * psz) { return function(unicode_index(psz)); }
86
87
88UNI_DECLARE_IS_FUNCTION(unicode_is_whitespace);
89UNI_DECLARE_IS_FUNCTION(unicode_is_lower_case);
90UNI_DECLARE_IS_FUNCTION(unicode_is_upper_case);
91UNI_DECLARE_IS_FUNCTION(unicode_is_title_case);
92UNI_DECLARE_IS_FUNCTION(unicode_is_letter);
93UNI_DECLARE_IS_FUNCTION(unicode_is_letter_or_digit);
94UNI_DECLARE_IS_FUNCTION(unicode_is_digit);
95UNI_DECLARE_IS_FUNCTION(unicode_is_assigned);
96UNI_DECLARE_IS_FUNCTION(unicode_is_space_char);
97UNI_DECLARE_IS_FUNCTION(unicode_is_number);
98UNI_DECLARE_IS_FUNCTION(unicode_is_mirrored);
99
100
101UNI_IMPLEMENT_IS_FUNCTION(unicode_is_whitespace);
102UNI_IMPLEMENT_IS_FUNCTION(unicode_is_lower_case);
103UNI_IMPLEMENT_IS_FUNCTION(unicode_is_upper_case);
104UNI_IMPLEMENT_IS_FUNCTION(unicode_is_title_case);
105UNI_IMPLEMENT_IS_FUNCTION(unicode_is_letter);
106UNI_IMPLEMENT_IS_FUNCTION(unicode_is_letter_or_digit);
107UNI_IMPLEMENT_IS_FUNCTION(unicode_is_digit);
108UNI_IMPLEMENT_IS_FUNCTION(unicode_is_assigned);
109UNI_IMPLEMENT_IS_FUNCTION(unicode_is_space_char);
110UNI_IMPLEMENT_IS_FUNCTION(unicode_is_number);
111UNI_IMPLEMENT_IS_FUNCTION(unicode_is_mirrored);
112
113
114inline ::i32 unicode_to_title_case(::i32 i);
115inline ::i32 unicode_to_numeric_value(::i32 i, ::f32 * f);
116inline ECharCategory unicode_get_category(::i32 i);
117inline ::i32 unicode_get_combining_class(::i32 i);
118inline ::i32 unicode_size_of_tables();
119
120
121CLASS_DECL_ACME ::i32 unicode_to_lower_case(::i32 i);
122CLASS_DECL_ACME ::i32 unicode_to_upper_case(::i32 i);
123
124
125//inline const_char_pointer _string_scan(::const_ansi_range range, ::const_ansi_range rangeCharacters) noexcept;
126//inline const ::wd16_character * _string_scan(::const_wd16_range range, ::const_wd16_range rangeCharacters) noexcept;
127//inline const ::wd32_character * _string_scan(::const_wd32_range range, ::const_wd32_range rangeCharacters) noexcept;
128
129
130//template < prototype_character CHARACTER >
131//inline const CHARACTER * string_scan(const ::range < CHARACTER > & block, const ::range < CHARACTER > & blockCharacters) noexcept;
132
133
134inline ::i32 ansichar_unicode_len(::wd32_character i);
135
136
137
138
139
140
141
142template < typename TYPE1, typename TYPE2 >
143inline ::std::strong_ordering compare(const TYPE1 & str1, const TYPE2 & str2);
144
145
146template < typename TYPE1, typename TYPE2 >
147inline ::std::strong_ordering case_insensitive_order(const TYPE1 & str1, const TYPE2 & str2);
148
149
150template < typename TYPE1, typename TYPE2 >
151inline bool equals(const TYPE1 & str1, const TYPE2 & str2) { return compare(str1, str2) == 0; }
152
153
154template < typename TYPE1, typename TYPE2 >
155inline bool case_insensitive_equals(const TYPE1 & str1, const TYPE2 & str2) { return case_insensitive_order(str1, str2) == 0; }
156
157
158template < typename TYPE1, typename TYPE2 >
159inline TYPE1 equals_get(const TYPE1 & str1, const TYPE2 & str2, const TYPE1 & strOnEqual, const TYPE1 & strOnDifferent);
160
161
162template < typename TYPE1, typename TYPE2 >
163inline TYPE1 equals_ci_get(const TYPE1 & str1, const TYPE2 & str2, const TYPE1 & strOnEqual, const TYPE1 & strOnDifferent);
164
165
166
167
168template < prototype_character CHARACTER >
169inline bool case_insensitive_range_begins(::range < const CHARACTER * > range, ::range < const CHARACTER * > rangePrefix)
170{
171
172 return range.begins(rangePrefix, ::comparison::case_insensitive< CHARACTER >());
173
174}
175
176
177template < prototype_character CHARACTER >
178inline bool case_insensitive_range_ends(::range < const CHARACTER * > range, ::range < const CHARACTER * > rangeSuffix)
179{
180
181 return range.ends(rangeSuffix, ::comparison::case_insensitive< CHARACTER >());
182
183}
184
185
186template < prototype_character CHARACTER >
187constexpr bool case_insensitive_sz_begins_sz(const CHARACTER * psz, const CHARACTER * pszPrefix)
188{
189
190 bool b;
191
192 if (sz_contains_sz_prefix(b, psz, pszPrefix))
193 {
194
195 return b;
196
197 }
198
199 while (*psz && *pszPrefix)
200 {
201
202 if (::comparison::case_insensitive < CHARACTER >()(*psz, *pszPrefix))
203 {
204
205 return false;
206
207 }
208
209 psz++;
210
211 pszPrefix++;
212
213 }
214
215 return true;
216
217}
218//template < prototype_character CHARACTER >
219//constexpr bool case_insensitive_sz_ends_sz(const CHARACTER * psz, const CHARACTER * pszSuffix)
220//{
221//
222// return case_insensitive_string_range_ends<CHARACTER>(psz, pszSuffix);
223//
224//}
225
226
227inline bool string_begins(const_char_pointer pz, const_char_pointer pzPrefix)
228{ return null_terminated_begins_null_terminated(pz, pzPrefix, ::comparison::comparison<::ansi_character>()); }
229inline bool string_begins(const ::wd16_character * pz, const ::wd16_character * pzPrefix)
230{ return null_terminated_begins_null_terminated(pz, pzPrefix, ::comparison::comparison<::wd16_character>());}
231inline bool string_begins(const ::wd32_character * pz, const ::wd32_character * pzPrefix)
232{ return null_terminated_begins_null_terminated(pz, pzPrefix, ::comparison::comparison<::wd32_character>());}
233
234
235template < prototype_character CHARACTER >
236inline bool _string_begins(const CHARACTER * psz, character_count len, const CHARACTER * pszPrefix, character_count & lenPrefix)
237{
238 return string_begins<const CHARACTER>({ psz, len }, { pszPrefix, (character_count)(lenPrefix = string_safe_length(pszPrefix)) });
239}
240
241//inline bool _string_begins(const ::wd16_character * psz, character_count len, const ::wd16_character * pszPrefix, character_count & lenPrefix)
242//{
243// return string_begins<const ::wd16_character>({ psz, len }, { pszPrefix, (character_count)(lenPrefix = string_safe_length(pszPrefix)) });
244//}
245//inline bool _string_begins(const ::wd16_character* psz, character_count len, const ::wd16_character* pszPrefix, character_count& lenPrefix)
246//{
247// return string_begins<const ::wd16_character>({ psz, len }, { pszPrefix, (character_count)(lenPrefix = string_safe_length(pszPrefix)) });
248//}
249//inline bool _string_begins(const ::wd32_character* psz, character_count len, const ::wd32_character* pszPrefix, character_count& lenPrefix)
250//{
251// return string_begins<const ::wd32_character>({ psz, len }, { pszPrefix, (character_count)(lenPrefix = string_safe_length(pszPrefix)) });
252//}
253
254
255
256inline bool string_ends(const_char_pointer psz, const_char_pointer pszSuffix)
257{ return ::null_terminated_ends(psz, pszSuffix, ::comparison::comparison<::ansi_character>()); }
258inline bool string_ends(const ::wd16_character * psz, const ::wd16_character * pszSuffix)
259{ return ::null_terminated_ends(psz, pszSuffix, ::comparison::comparison<::wd16_character>()); }
260inline bool string_ends(const ::wd32_character * psz, const ::wd32_character * pszSuffix)
261{ return ::null_terminated_ends(psz, pszSuffix, ::comparison::comparison<::wd32_character>()); }
262
263//template < prototype_character CHARACTER >
264//inline bool _string_ends(const CHARACTER * psz, character_count len, const CHARACTER * pszSuffix, character_count& lenSuffix)
265//{
266// return _range_ends<const CHARACTER>({ psz, len }, { pszSuffix, (character_count)(lenSuffix = string_safe_length(pszSuffix)) });
267//}
268//inline bool _string_ends(const ::wd16_character* psz, character_count len, const ::wd16_character* pszSuffix, character_count& lenSuffix)
269//{
270// return string_ends<const ::wd16_character>({ psz, len }, { pszSuffix, (character_count)(lenSuffix = string_safe_length(pszSuffix)) });
271//}
272//inline bool _string_ends(const ::wd32_character* psz, character_count len, const ::wd32_character* pszSuffix, character_count& lenSuffix)
273//{
274// return string_ends<const ::wd32_character>({ psz, len }, { pszSuffix, (character_count)(lenSuffix = string_safe_length(pszSuffix)) });
275//}
276
277
278
279
280
281inline bool case_insensitive_string_begins(const_char_pointer psz, const_char_pointer pszPrefix)
282{ return null_terminated_begins_null_terminated(psz, pszPrefix, ::comparison::case_insensitive<::ansi_character>()); }
283inline bool case_insensitive_string_begins(const ::wd16_character * psz, const ::wd16_character * pszPrefix)
284{ return null_terminated_begins_null_terminated(psz, pszPrefix, ::comparison::case_insensitive<::wd16_character>()); }
285inline bool case_insensitive_string_begins(const ::wd32_character * psz, const ::wd32_character * pszPrefix)
286{ return null_terminated_begins_null_terminated(psz, pszPrefix, ::comparison::case_insensitive<::wd32_character>()); }
287
288
289//template < prototype_character CHARACTER >
290//inline bool case_insensitive__string_begins(const CHARACTER * psz, character_count len, const CHARACTER * pszPrefix, character_count & lenPrefix)
291//{
292// return case_insensitive_string_begins<const CHARACTER>({ psz, len }, { pszPrefix, (character_count)(lenPrefix = string_safe_length(pszPrefix)) });
293//}
294//inline bool case_insensitive__string_begins(const ::wd16_character* psz, character_count len, const ::wd16_character* pszPrefix, character_count& lenPrefix)
295//{
296// return case_insensitive_string_begins<const ::wd16_character>({ psz, len }, { pszPrefix, (character_count)(lenPrefix = string_safe_length(pszPrefix)) });
297//}
298//inline bool case_insensitive__string_begins(const ::wd32_character* psz, character_count len, const ::wd32_character* pszPrefix, character_count& lenPrefix)
299//{
300// return case_insensitive_string_begins<const ::wd32_character>({ psz, len }, { pszPrefix, (character_count)(lenPrefix = string_safe_length(pszPrefix)) });
301//}
302
303inline bool case_insensitive_string_ends(const_char_pointer psz, const_char_pointer pszSuffix)
304{ return ::null_terminated_ends(psz, pszSuffix, ::comparison::case_insensitive<::ansi_character>());}
305inline bool case_insensitive_string_ends(const ::wd16_character * psz, const ::wd16_character * pszSuffix)
306{ return ::null_terminated_ends(psz, pszSuffix, ::comparison::case_insensitive<::wd16_character>());}
307inline bool case_insensitive_string_ends(const ::wd32_character * psz, const ::wd32_character * pszSuffix)
308{ return ::null_terminated_ends(psz, pszSuffix, ::comparison::case_insensitive<::wd32_character>());}
309
310//template < prototype_character CHARACTER >
311//inline bool case_insensitive__string_ends(const CHARACTER * psz, character_count len, const CHARACTER * pszSuffix, character_count & lenSuffix)
312//{
313// return case_insensitive_string_ends<const CHARACTER>({ psz, len }, { pszSuffix, (character_count)(lenSuffix = string_safe_length(pszSuffix)) });
314//}
315//inline bool case_insensitive__string_ends(const ::wd16_character* psz, character_count len, const ::wd16_character* pszSuffix, character_count& lenSuffix)
316//{
317// return case_insensitive_string_ends<const ::wd16_character>({ psz, len }, { pszSuffix, (character_count)(lenSuffix = string_safe_length(pszSuffix)) });
318//}
319//inline bool case_insensitive__string_ends(const ::wd32_character* psz, character_count len, const ::wd32_character* pszSuffix, character_count& lenSuffix)
320//{
321// return case_insensitive_string_ends<const ::wd32_character>({ psz, len }, { pszSuffix, (character_count)(lenSuffix = string_safe_length(pszSuffix)) });
322//}
323
324
325template < typename CHAR_TYPE >
326bool string_eat_before(string_base < CHAR_TYPE > & strBefore, const string_base < CHAR_TYPE > & strSeparator, string_base < CHAR_TYPE > & str, bool bEatEverythingIfNotFound);
327
328
329template < typename CHAR_TYPE >
330bool string_eat_before_let_separator(string_base < CHAR_TYPE > & strBefore, const string_base < CHAR_TYPE > & strSeparator, string_base < CHAR_TYPE > & str, bool bEatEverythingIfNotFound);
331
332template < typename CHAR_STRING >
333inline bool is_trimmed_string_empty(CHAR_STRING p);
334
335
336inline bool is_trimmed_empty(const_char_pointer p) { return is_trimmed_string_empty(p); }
337inline bool is_trimmed_empty(const ::wd16_character * p) { return is_trimmed_string_empty(p); }
338inline bool is_trimmed_empty(const ::wd32_character * p) { return is_trimmed_string_empty(p); }
339
340
341#pragma
342
343// return number of characters need to be consumed to parse a Unicode Character
344inline ::i32 unicode_len(const_char_pointer pszChar);
345inline ::i32 unicode_len(const ::wd16_character * pszChar) { return utf16_is_1st_surrogate(*pszChar) ? 2 : 1; }
346inline ::i32 unicode_len(const ::wd32_character * pszChar) { return 1; }
347
348
349inline ::i32 ansichar_unicode_len(::wd32_character i);
350inline ::i32 wd16char_unicode_len(::wd32_character i) { return utf32_is_surrogated(i) ? 2 : 1; }
351inline ::i32 wd32char_unicode_len(::wd32_character i) { return 1; }
352
353// return number of characters needed to represent the Unicode Character
354inline ::i32 char_unicode_len(const_char_pointer ,::wd32_character i) { return ansichar_unicode_len(i); }
355inline ::i32 char_unicode_len(const ::wd16_character *, ::wd32_character i) { return wd16char_unicode_len(i); }
356inline ::i32 char_unicode_len(const ::wd32_character *, ::wd32_character i) { return wd32char_unicode_len(i); }
357
358
359
360
361
362inline bool unicode_is_whitespace(::i32 i);
363inline bool unicode_is_space_char(::i32 i);
364inline ::i32 unicode_to_lower_case(::i32 i);
365inline ::i32 unicode_to_upper_case(::i32 i);
366inline ::i32 unicode_to_title_case(::i32 i);
367inline ::i32 unicode_to_numeric_value(::i32 i, ::f32 * f);
368
369
370inline bool unicode_is_lower_case(::i32 iUniIndex);
371inline bool unicode_is_upper_case(::i32 iUniIndex);
372inline bool unicode_is_title_case(::i32 iUniIndex);
373inline bool unicode_is_letter(::i32 iUniIndex);
374inline bool unicode_is_letter_or_digit(::i32 iUniIndex);
375inline bool unicode_is_digit(::i32 iUniIndex);
376inline bool unicode_is_number(::i32 iUniIndex);
377inline bool unicode_is_assigned(::i32 iUniIndex);
378inline bool unicode_is_space_char(::i32 iUniIndex);
379
380
381// bool is_whitespace(const ::scoped_string & scopedstrUtf8Char, const_char_pointer pszEnd);
382
383bool unicode_is_number(const ::scoped_string & scopedstrUtf8Char);
384// bool to_numeric_value(const ::scoped_string & scopedstrUtf8Char, ::f32 *f);
385
386inline ECharCategory unicode_get_category(::i32 i);
387inline ::i32 unicode_get_combining_class(::i32 i);
388inline bool unicode_is_mirrored(::i32 i);
389
390string unicode_get_category_name(const ::scoped_string & scopedstrUtf8Char);
391ECharCategory unicode_get_category(const ::scoped_string & scopedstrUtf8Char);
392
393::i32 unicode_get_combining_class(const ::scoped_string & scopedstrUtf8Char);
394bool unicode_is_mirrored(const ::scoped_string & scopedstrUtf8Char);
395
396::i32 unicode_size_of_tables();
397
398
399inline bool unicode_is_kanji(::i64 i) { return i >= 0x4E00 && i <= 0x9FBF; }
400inline bool unicode_is_hiragana(::i64 i) { return i >= 0x3040 && i <= 0x309F; }
401inline bool unicode_is_katakana(::i64 i) { return i >= 0x30A0 && i <= 0x30FF; }
402inline bool unicode_is_japanese(::i64 i) { return unicode_is_kanji(i) || unicode_is_hiragana(i) || unicode_is_katakana(i); }
403inline bool unicode_is_kanji(const_char_pointer pszUtf8) { return unicode_is_kanji(unicode_index(pszUtf8)); }
404inline bool unicode_is_hiragana(const_char_pointer pszUtf8) { return unicode_is_hiragana(unicode_index(pszUtf8)); }
405inline bool unicode_is_katakana(const_char_pointer pszUtf8) { return unicode_is_katakana(unicode_index(pszUtf8)); }
406inline bool unicode_is_japanese(const_char_pointer pszUtf8) { return unicode_is_japanese(unicode_index(pszUtf8)); }
407
408
409void * unicode_char_bidi_names_non_usage_warning();
410
411
412::i32 unicode_ref_tables();
413const_char_pointer unicode_get_category_name(::i32 i);
414
415
416//template < typename POINTER >
417//inline ::string as_string(const ::platform::system()->m_pheapmanagement->memory(::heap::e_memory_main)->allocate < POINTER > & memoryallocpointer)
418//{
419//
420// string str;
421//
422// str.assign(memoryallocpointer.m_p, memoryallocpointer.m_iSize);
423//
424// return str;
425//
426//}
427
428
429CLASS_DECL_ACME string type_name(const ::std::type_info& typeinfo);
430
431
432//CLASS_DECL_ACME string demangle_name(const_char_pointer pszMangledName);
433
434
435//CLASS_DECL_ACME string demangle_typeid(const ::std::type_info & typeinfo);
436
437
438//CLASS_DECL_ACME void copy(::string & str, const subparticle & subparticle);
439
440
441CLASS_DECL_ACME string string_from_strdup(const_char_pointer psz);
442
443
444//CLASS_DECL_ACME void copy(::string & str, const subparticle & subparticle);
445
446
447
Definition __begin.h:14
Definition _template_after_initial_concepts.h:15
Definition range.h:223
Definition aaa_want_to_remove_str_wstring.h:94