/src/icu/icu4c/source/common/bytesinkutil.h
Line | Count | Source |
1 | | // © 2017 and later: Unicode, Inc. and others. |
2 | | // License & terms of use: http://www.unicode.org/copyright.html |
3 | | |
4 | | // bytesinkutil.h |
5 | | // created: 2017sep14 Markus W. Scherer |
6 | | |
7 | | #ifndef BYTESINKUTIL_H |
8 | | #define BYTESINKUTIL_H |
9 | | |
10 | | #include <type_traits> |
11 | | |
12 | | #include "unicode/utypes.h" |
13 | | #include "unicode/bytestream.h" |
14 | | #include "unicode/edits.h" |
15 | | #include "charstr.h" |
16 | | #include "cmemory.h" |
17 | | #include "uassert.h" |
18 | | #include "ustr_imp.h" |
19 | | |
20 | | U_NAMESPACE_BEGIN |
21 | | |
22 | | class ByteSink; |
23 | | class Edits; |
24 | | |
25 | | class U_COMMON_API CharStringByteSink : public ByteSink { |
26 | | public: |
27 | | CharStringByteSink(CharString* dest); |
28 | | ~CharStringByteSink() override; |
29 | | |
30 | | CharStringByteSink() = delete; |
31 | | CharStringByteSink(const CharStringByteSink&) = delete; |
32 | | CharStringByteSink& operator=(const CharStringByteSink&) = delete; |
33 | | |
34 | | void Append(const char* bytes, int32_t n) override; |
35 | | |
36 | | char* GetAppendBuffer(int32_t min_capacity, |
37 | | int32_t desired_capacity_hint, |
38 | | char* scratch, |
39 | | int32_t scratch_capacity, |
40 | | int32_t* result_capacity) override; |
41 | | |
42 | | private: |
43 | | CharString& dest_; |
44 | | }; |
45 | | |
46 | | // CharString doesn't provide the public API that StringByteSink requires a |
47 | | // string class to have so this template specialization replaces the default |
48 | | // implementation of StringByteSink<CharString> with CharStringByteSink. |
49 | | template<> |
50 | | class StringByteSink<CharString> : public CharStringByteSink { |
51 | | public: |
52 | 16.6k | StringByteSink(CharString* dest) : CharStringByteSink(dest) { } |
53 | 0 | StringByteSink(CharString* dest, int32_t /*initialAppendCapacity*/) : CharStringByteSink(dest) { } |
54 | | }; |
55 | | |
56 | | class U_COMMON_API ByteSinkUtil { |
57 | | public: |
58 | | ByteSinkUtil() = delete; // all static |
59 | | |
60 | | /** (length) bytes were mapped to valid (s16, s16Length). */ |
61 | | static UBool appendChange(int32_t length, |
62 | | const char16_t *s16, int32_t s16Length, |
63 | | ByteSink &sink, Edits *edits, UErrorCode &errorCode); |
64 | | |
65 | | /** The bytes at [s, limit[ were mapped to valid (s16, s16Length). */ |
66 | | static UBool appendChange(const uint8_t *s, const uint8_t *limit, |
67 | | const char16_t *s16, int32_t s16Length, |
68 | | ByteSink &sink, Edits *edits, UErrorCode &errorCode); |
69 | | |
70 | | /** (length) bytes were mapped/changed to valid code point c. */ |
71 | | static void appendCodePoint(int32_t length, UChar32 c, ByteSink &sink, Edits *edits = nullptr); |
72 | | |
73 | | /** The few bytes at [src, nextSrc[ were mapped/changed to valid code point c. */ |
74 | | static inline void appendCodePoint(const uint8_t *src, const uint8_t *nextSrc, UChar32 c, |
75 | 0 | ByteSink &sink, Edits *edits = nullptr) { |
76 | 0 | appendCodePoint(static_cast<int32_t>(nextSrc - src), c, sink, edits); |
77 | 0 | } |
78 | | |
79 | | /** Append the two-byte character (U+0080..U+07FF). */ |
80 | | static void appendTwoBytes(UChar32 c, ByteSink &sink); |
81 | | |
82 | | static UBool appendUnchanged(const uint8_t *s, int32_t length, |
83 | | ByteSink &sink, uint32_t options, Edits *edits, |
84 | 49.7M | UErrorCode &errorCode) { |
85 | 49.7M | if (U_FAILURE(errorCode)) { return false; } |
86 | 49.7M | if (length > 0) { appendNonEmptyUnchanged(s, length, sink, options, edits); } |
87 | 49.7M | return true; |
88 | 49.7M | } |
89 | | |
90 | | static UBool appendUnchanged(const uint8_t *s, const uint8_t *limit, |
91 | | ByteSink &sink, uint32_t options, Edits *edits, |
92 | | UErrorCode &errorCode); |
93 | | |
94 | | /** |
95 | | * Calls a lambda that writes to a ByteSink with a CheckedArrayByteSink |
96 | | * and then returns through u_terminateChars(), in order to implement |
97 | | * the classic ICU4C C API writing to a fix sized buffer on top of a |
98 | | * contemporary C++ API. |
99 | | * |
100 | | * @param buffer receiving buffer |
101 | | * @param capacity capacity of receiving buffer |
102 | | * @param lambda that gets called with the sink as an argument |
103 | | * @param status set to U_BUFFER_OVERFLOW_ERROR on overflow |
104 | | * @return number of bytes written, or needed (in case of overflow) |
105 | | * @internal |
106 | | */ |
107 | | template <typename F, |
108 | | typename = std::enable_if_t< |
109 | | std::is_invocable_r_v<void, F, ByteSink&, UErrorCode&>>> |
110 | | static int32_t viaByteSinkToTerminatedChars(char* buffer, int32_t capacity, |
111 | | F&& lambda, |
112 | 1.52M | UErrorCode& status) { |
113 | 1.52M | if (U_FAILURE(status)) { return 0; } |
114 | 1.52M | CheckedArrayByteSink sink(buffer, capacity); |
115 | 1.52M | lambda(sink, status); |
116 | 1.52M | if (U_FAILURE(status)) { return 0; } |
117 | | |
118 | 1.50M | int32_t reslen = sink.NumberOfBytesAppended(); |
119 | | |
120 | 1.50M | if (sink.Overflowed()) { |
121 | 51.0k | status = U_BUFFER_OVERFLOW_ERROR; |
122 | 51.0k | return reslen; |
123 | 51.0k | } |
124 | | |
125 | 1.45M | return u_terminateChars(buffer, capacity, reslen, &status); |
126 | 1.50M | } locid.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<icu_79::Locale::init(icu_79::StringPiece, signed char)::$_0::operator()(std::__1::basic_string_view<char, std::__1::char_traits<char> >, char*, int, UErrorCode&) const::{lambda(icu_79::ByteSink&, UErrorCode&)#1}, void>(char*, int, icu_79::Locale::init(icu_79::StringPiece, signed char)::$_0::operator()(std::__1::basic_string_view<char, std::__1::char_traits<char> >, char*, int, UErrorCode&) const::{lambda(icu_79::ByteSink&, UErrorCode&)#1}&&, UErrorCode&)Line | Count | Source | 112 | 1.05M | UErrorCode& status) { | 113 | 1.05M | if (U_FAILURE(status)) { return 0; } | 114 | 1.05M | CheckedArrayByteSink sink(buffer, capacity); | 115 | 1.05M | lambda(sink, status); | 116 | 1.05M | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 1.04M | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 1.04M | if (sink.Overflowed()) { | 121 | 49.8k | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 49.8k | return reslen; | 123 | 49.8k | } | 124 | | | 125 | 999k | return u_terminateChars(buffer, capacity, reslen, &status); | 126 | 1.04M | } |
Unexecuted instantiation: loclikely.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_addLikelySubtags_79::$_0, void>(char*, int, uloc_addLikelySubtags_79::$_0&&, UErrorCode&) Unexecuted instantiation: loclikely.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_minimizeSubtags_79::$_0, void>(char*, int, uloc_minimizeSubtags_79::$_0&&, UErrorCode&) uloc.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_getKeywordValue_79::$_0, void>(char*, int, uloc_getKeywordValue_79::$_0&&, UErrorCode&) Line | Count | Source | 112 | 441k | UErrorCode& status) { | 113 | 441k | if (U_FAILURE(status)) { return 0; } | 114 | 441k | CheckedArrayByteSink sink(buffer, capacity); | 115 | 441k | lambda(sink, status); | 116 | 441k | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 428k | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 428k | if (sink.Overflowed()) { | 121 | 166 | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 166 | return reslen; | 123 | 166 | } | 124 | | | 125 | 428k | return u_terminateChars(buffer, capacity, reslen, &status); | 126 | 428k | } |
Unexecuted instantiation: uloc.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_getParent_79::$_0, void>(char*, int, uloc_getParent_79::$_0&&, UErrorCode&) Unexecuted instantiation: uloc.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_getLanguage_79::$_0, void>(char*, int, uloc_getLanguage_79::$_0&&, UErrorCode&) Unexecuted instantiation: uloc.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_getScript_79::$_0, void>(char*, int, uloc_getScript_79::$_0&&, UErrorCode&) uloc.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_getCountry_79::$_0, void>(char*, int, uloc_getCountry_79::$_0&&, UErrorCode&) Line | Count | Source | 112 | 1.90k | UErrorCode& status) { | 113 | 1.90k | if (U_FAILURE(status)) { return 0; } | 114 | 1.90k | CheckedArrayByteSink sink(buffer, capacity); | 115 | 1.90k | lambda(sink, status); | 116 | 1.90k | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 1.90k | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 1.90k | if (sink.Overflowed()) { | 121 | 0 | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 0 | return reslen; | 123 | 0 | } | 124 | | | 125 | 1.90k | return u_terminateChars(buffer, capacity, reslen, &status); | 126 | 1.90k | } |
Unexecuted instantiation: uloc.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_getVariant_79::$_0, void>(char*, int, uloc_getVariant_79::$_0&&, UErrorCode&) uloc.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_getName_79::$_0, void>(char*, int, uloc_getName_79::$_0&&, UErrorCode&) Line | Count | Source | 112 | 11.1k | UErrorCode& status) { | 113 | 11.1k | if (U_FAILURE(status)) { return 0; } | 114 | 11.1k | CheckedArrayByteSink sink(buffer, capacity); | 115 | 11.1k | lambda(sink, status); | 116 | 11.1k | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 10.5k | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 10.5k | if (sink.Overflowed()) { | 121 | 273 | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 273 | return reslen; | 123 | 273 | } | 124 | | | 125 | 10.2k | return u_terminateChars(buffer, capacity, reslen, &status); | 126 | 10.5k | } |
Unexecuted instantiation: uloc.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_getBaseName_79::$_0, void>(char*, int, uloc_getBaseName_79::$_0&&, UErrorCode&) uloc.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_canonicalize_79::$_0, void>(char*, int, uloc_canonicalize_79::$_0&&, UErrorCode&) Line | Count | Source | 112 | 3.91k | UErrorCode& status) { | 113 | 3.91k | if (U_FAILURE(status)) { return 0; } | 114 | 3.91k | CheckedArrayByteSink sink(buffer, capacity); | 115 | 3.91k | lambda(sink, status); | 116 | 3.91k | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 3.30k | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 3.30k | if (sink.Overflowed()) { | 121 | 312 | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 312 | return reslen; | 123 | 312 | } | 124 | | | 125 | 2.99k | return u_terminateChars(buffer, capacity, reslen, &status); | 126 | 3.30k | } |
Unexecuted instantiation: uloc_tag.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_toLanguageTag_79::$_0, void>(char*, int, uloc_toLanguageTag_79::$_0&&, UErrorCode&) uloc_tag.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<uloc_forLanguageTag_79::$_0, void>(char*, int, uloc_forLanguageTag_79::$_0&&, UErrorCode&) Line | Count | Source | 112 | 2.13k | UErrorCode& status) { | 113 | 2.13k | if (U_FAILURE(status)) { return 0; } | 114 | 2.13k | CheckedArrayByteSink sink(buffer, capacity); | 115 | 2.13k | lambda(sink, status); | 116 | 2.13k | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 2.13k | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 2.13k | if (sink.Overflowed()) { | 121 | 332 | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 332 | return reslen; | 123 | 332 | } | 124 | | | 125 | 1.80k | return u_terminateChars(buffer, capacity, reslen, &status); | 126 | 2.13k | } |
ucasemap.cpp:int icu_79::ByteSinkUtil::viaByteSinkToTerminatedChars<ucasemap_mapUTF8_79(int, unsigned int, icu_79::BreakIterator*, char*, int, char const*, int, void (*)(int, unsigned int, icu_79::BreakIterator*, unsigned char const*, int, icu_79::ByteSink&, icu_79::Edits*, UErrorCode&), icu_79::Edits*, UErrorCode&)::$_0, void>(char*, int, ucasemap_mapUTF8_79(int, unsigned int, icu_79::BreakIterator*, char*, int, char const*, int, void (*)(int, unsigned int, icu_79::BreakIterator*, unsigned char const*, int, icu_79::ByteSink&, icu_79::Edits*, UErrorCode&), icu_79::Edits*, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 112 | 7.42k | UErrorCode& status) { | 113 | 7.42k | if (U_FAILURE(status)) { return 0; } | 114 | 7.42k | CheckedArrayByteSink sink(buffer, capacity); | 115 | 7.42k | lambda(sink, status); | 116 | 7.42k | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 7.41k | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 7.41k | if (sink.Overflowed()) { | 121 | 93 | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 93 | return reslen; | 123 | 93 | } | 124 | | | 125 | 7.32k | return u_terminateChars(buffer, capacity, reslen, &status); | 126 | 7.41k | } |
|
127 | | |
128 | | /** |
129 | | * Calls a lambda that writes to a ByteSink with a CharStringByteSink and |
130 | | * then returns a CharString, in order to implement a contemporary C++ API |
131 | | * on top of a C/C++ compatibility ByteSink API. |
132 | | * |
133 | | * @param lambda that gets called with the sink as an argument |
134 | | * @param status to check and report |
135 | | * @return the resulting string, or an empty string (in case of error) |
136 | | * @internal |
137 | | */ |
138 | | template <typename F, |
139 | | typename = std::enable_if_t< |
140 | | std::is_invocable_r_v<void, F, ByteSink&, UErrorCode&>>> |
141 | 3.67M | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { |
142 | 3.67M | if (U_FAILURE(status)) { return {}; } |
143 | 3.67M | CharString result; |
144 | 3.67M | CharStringByteSink sink(&result); |
145 | 3.67M | lambda(sink, status); |
146 | 3.67M | return result; |
147 | 3.67M | } loclikely.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_addLikelySubtags_79(char const*, UErrorCode&)::$_0, void>(ulocimp_addLikelySubtags_79(char const*, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 53.7k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 53.7k | if (U_FAILURE(status)) { return {}; } | 143 | 53.7k | CharString result; | 144 | 53.7k | CharStringByteSink sink(&result); | 145 | 53.7k | lambda(sink, status); | 146 | 53.7k | return result; | 147 | 53.7k | } |
loclikely.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_minimizeSubtags_79(char const*, bool, UErrorCode&)::$_0, void>(ulocimp_minimizeSubtags_79(char const*, bool, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 19.7k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 19.7k | if (U_FAILURE(status)) { return {}; } | 143 | 19.7k | CharString result; | 144 | 19.7k | CharStringByteSink sink(&result); | 145 | 19.7k | lambda(sink, status); | 146 | 19.7k | return result; | 147 | 19.7k | } |
uloc.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_getKeywords_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, char, bool, UErrorCode&)::$_0, void>(ulocimp_getKeywords_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, char, bool, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 13.2k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 13.2k | if (U_FAILURE(status)) { return {}; } | 143 | 13.2k | CharString result; | 144 | 13.2k | CharStringByteSink sink(&result); | 145 | 13.2k | lambda(sink, status); | 146 | 13.2k | return result; | 147 | 13.2k | } |
uloc.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_getKeywordValue_79(char const*, std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0, void>(ulocimp_getKeywordValue_79(char const*, std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 515k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 515k | if (U_FAILURE(status)) { return {}; } | 143 | 515k | CharString result; | 144 | 515k | CharStringByteSink sink(&result); | 145 | 515k | lambda(sink, status); | 146 | 515k | return result; | 147 | 515k | } |
uloc.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_getLanguage_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0, void>(ulocimp_getLanguage_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 3.03k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 3.03k | if (U_FAILURE(status)) { return {}; } | 143 | 3.03k | CharString result; | 144 | 3.03k | CharStringByteSink sink(&result); | 145 | 3.03k | lambda(sink, status); | 146 | 3.03k | return result; | 147 | 3.03k | } |
uloc.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_getScript_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0, void>(ulocimp_getScript_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 3.03k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 3.03k | if (U_FAILURE(status)) { return {}; } | 143 | 3.03k | CharString result; | 144 | 3.03k | CharStringByteSink sink(&result); | 145 | 3.03k | lambda(sink, status); | 146 | 3.03k | return result; | 147 | 3.03k | } |
uloc.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_getRegion_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0, void>(ulocimp_getRegion_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 233k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 233k | if (U_FAILURE(status)) { return {}; } | 143 | 233k | CharString result; | 144 | 233k | CharStringByteSink sink(&result); | 145 | 233k | lambda(sink, status); | 146 | 233k | return result; | 147 | 233k | } |
uloc.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_getVariant_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0, void>(ulocimp_getVariant_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 6.06k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 6.06k | if (U_FAILURE(status)) { return {}; } | 143 | 6.06k | CharString result; | 144 | 6.06k | CharStringByteSink sink(&result); | 145 | 6.06k | lambda(sink, status); | 146 | 6.06k | return result; | 147 | 6.06k | } |
uloc.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_getParent_79(char const*, UErrorCode&)::$_0, void>(ulocimp_getParent_79(char const*, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 436k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 436k | if (U_FAILURE(status)) { return {}; } | 143 | 436k | CharString result; | 144 | 436k | CharStringByteSink sink(&result); | 145 | 436k | lambda(sink, status); | 146 | 436k | return result; | 147 | 436k | } |
uloc.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_getName_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0, void>(ulocimp_getName_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 124k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 124k | if (U_FAILURE(status)) { return {}; } | 143 | 124k | CharString result; | 144 | 124k | CharStringByteSink sink(&result); | 145 | 124k | lambda(sink, status); | 146 | 124k | return result; | 147 | 124k | } |
uloc.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_getBaseName_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0, void>(ulocimp_getBaseName_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 1.88M | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 1.88M | if (U_FAILURE(status)) { return {}; } | 143 | 1.88M | CharString result; | 144 | 1.88M | CharStringByteSink sink(&result); | 145 | 1.88M | lambda(sink, status); | 146 | 1.88M | return result; | 147 | 1.88M | } |
uloc.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_canonicalize_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0, void>(ulocimp_canonicalize_79(std::__1::basic_string_view<char, std::__1::char_traits<char> >, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 95.9k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 95.9k | if (U_FAILURE(status)) { return {}; } | 143 | 95.9k | CharString result; | 144 | 95.9k | CharStringByteSink sink(&result); | 145 | 95.9k | lambda(sink, status); | 146 | 95.9k | return result; | 147 | 95.9k | } |
Unexecuted instantiation: uloc_tag.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_toLanguageTag_79(char const*, bool, UErrorCode&)::$_0, void>(ulocimp_toLanguageTag_79(char const*, bool, UErrorCode&)::$_0&&, UErrorCode&) uloc_tag.cpp:icu_79::CharString icu_79::ByteSinkUtil::viaByteSinkToCharString<ulocimp_forLanguageTag_79(char const*, int, int*, UErrorCode&)::$_0, void>(ulocimp_forLanguageTag_79(char const*, int, int*, UErrorCode&)::$_0&&, UErrorCode&) Line | Count | Source | 141 | 289k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 289k | if (U_FAILURE(status)) { return {}; } | 143 | 289k | CharString result; | 144 | 289k | CharStringByteSink sink(&result); | 145 | 289k | lambda(sink, status); | 146 | 289k | return result; | 147 | 289k | } |
|
148 | | |
149 | | private: |
150 | | static void appendNonEmptyUnchanged(const uint8_t *s, int32_t length, |
151 | | ByteSink &sink, uint32_t options, Edits *edits); |
152 | | }; |
153 | | |
154 | | U_NAMESPACE_END |
155 | | |
156 | | #endif //BYTESINKUTIL_H |