1- #include < cstring>
2- #include < exception>
3-
4- #ifdef CAGE_DEBUG
5- #include " utf8/checked.h"
6- #else
7- #include " utf8/unchecked.h"
8- namespace utf8
9- {
10- using namespace unchecked ;
11- }
12- #endif
1+ #include < string_view>
2+
3+ #include " uni_algo/conv.h"
134
145#include < cage-core/pointerRangeHolder.h>
156#include < cage-core/utf.h>
167
17- #define TRY_BEGIN \
18- try \
8+ namespace cage
9+ {
10+ namespace
1911 {
20- #define TRY_END \
21- } \
22- catch (const std::exception &e) \
23- { \
24- CAGE_LOG_THROW (e.what ()); \
25- CAGE_THROW_ERROR (InvalidUtfString, " string with invalid utf encoding" ); \
12+ std::string_view view (PointerRange<const char > buffer)
13+ {
14+ return std::string_view (buffer.begin (), buffer.end ());
15+ }
16+
17+ std::u32string_view view (PointerRange<const uint32> buffer)
18+ {
19+ return std::u32string_view ((const char32_t *)buffer.begin (), (const char32_t *)buffer.end ());
20+ }
2621 }
2722
28- namespace cage
29- {
3023 bool utfValid (PointerRange<const char > buffer)
3124 {
32- TRY_BEGIN
33- return utf8::is_valid (buffer.begin (), buffer.end ());
34- TRY_END
25+ return una::is_valid_utf8 (view (buffer));
3526 }
3627
3728 bool utfValid (const String &str)
@@ -46,9 +37,7 @@ namespace cage
4637
4738 uint32 utf32Length (PointerRange<const char > buffer)
4839 {
49- TRY_BEGIN
50- return numeric_cast<uint32>(utf8::distance (buffer.begin (), buffer.end ()));
51- TRY_END
40+ return una::utf8to32u (view (buffer)).length ();
5241 }
5342
5443 uint32 utf32Length (const String &str)
@@ -63,30 +52,13 @@ namespace cage
6352
6453 uint32 utf8Length (PointerRange<const uint32> buffer)
6554 {
66- TRY_BEGIN
67- const uint32 *b = buffer.begin ();
68- const uint32 *e = buffer.end ();
69- char tmp[7 ];
70- uint32 result = 0 ;
71- while (b != e)
72- {
73- char *d = utf8::utf32to8 (b, b + 1 , tmp);
74- result += numeric_cast<uint32>(d - tmp);
75- b++;
76- }
77- return result;
78- TRY_END
55+ return una::utf32to8u (view (buffer)).length ();
7956 }
8057
81- Holder<PointerRange<uint32>> utf8to32 (PointerRange<const char > inBuffer )
58+ Holder<PointerRange<uint32>> utf8to32 (PointerRange<const char > buffer )
8259 {
83- PointerRangeHolder<uint32> result;
84- result.resize (utf32Length (inBuffer));
85- TRY_BEGIN
86- uint32 *end = utf8::utf8to32 (inBuffer.begin (), inBuffer.end (), result.data ());
87- CAGE_ASSERT (end == result.data () + result.size ());
88- return result;
89- TRY_END
60+ const auto t = una::utf8to32u (view (buffer));
61+ return PointerRangeHolder<uint32>(t.begin (), t.end ());
9062 }
9163
9264 Holder<PointerRange<uint32>> utf8to32 (const String &str)
@@ -101,11 +73,10 @@ namespace cage
10173
10274 void utf8to32 (PointerRange<uint32> &outBuffer, PointerRange<const char > inBuffer)
10375 {
104- CAGE_ASSERT (outBuffer.size () >= utf32Length (inBuffer));
105- TRY_BEGIN
106- uint32 *end = utf8::utf8to32 (inBuffer.begin (), inBuffer.end (), outBuffer.begin ());
107- outBuffer = { outBuffer.begin (), end };
108- TRY_END
76+ const auto t = una::utf8to32u (view (inBuffer));
77+ CAGE_ASSERT (outBuffer.size () >= t.size ());
78+ detail::memcpy (outBuffer.data (), t.data (), t.size () * sizeof (uint32));
79+ outBuffer = PointerRange<uint32>(outBuffer.begin (), outBuffer.begin () + t.size ());
10980 }
11081
11182 void utf8to32 (PointerRange<uint32> &outBuffer, const String &str)
@@ -120,31 +91,21 @@ namespace cage
12091
12192 Holder<PointerRange<char >> utf32to8 (PointerRange<const uint32> buffer)
12293 {
123- PointerRangeHolder<char > result;
124- result.resize (utf8Length (buffer));
125- TRY_BEGIN
126- char *end = utf8::utf32to8 (buffer.begin (), buffer.end (), result.data ());
127- CAGE_ASSERT (end == result.data () + result.size ());
128- return result;
129- TRY_END
94+ const auto t = una::utf32to8u (view (buffer));
95+ return PointerRangeHolder<char >(t.begin (), t.end ());
13096 }
13197
13298 void utf32to8 (PointerRange<char > &outBuffer, PointerRange<const uint32> inBuffer)
13399 {
134- CAGE_ASSERT (outBuffer.size () >= utf8Length (inBuffer));
135- TRY_BEGIN
136- char *end = utf8::utf32to8 (inBuffer.begin (), inBuffer.end (), outBuffer.begin ());
137- outBuffer = { outBuffer.begin (), end };
138- TRY_END
100+ const auto t = una::utf32to8u (view (inBuffer));
101+ CAGE_ASSERT (outBuffer.size () >= t.size ());
102+ detail::memcpy (outBuffer.data (), t.data (), t.size () * sizeof (char ));
103+ outBuffer = PointerRange<char >(outBuffer.begin (), outBuffer.begin () + t.size ());
139104 }
140105
141- String utf32to8string (PointerRange<const uint32> inBuffer )
106+ String utf32to8string (PointerRange<const uint32> buffer )
142107 {
143- if (utf8Length (inBuffer) > String::MaxLength)
144- CAGE_THROW_ERROR (Exception, " utf string too long" );
145- char buff[String::MaxLength];
146- PointerRange<char > pr = { buff, buff + String::MaxLength - 1 };
147- utf32to8 (pr, inBuffer);
148- return String (pr);
108+ const auto t = una::utf32to8u (view (buffer));
109+ return String (PointerRange<const char >((const char *)t.data (), (const char *)t.data () + t.size ()));
149110 }
150111}
0 commit comments