/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.7k | 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.2M | UErrorCode &errorCode) { |
85 | 49.2M | if (U_FAILURE(errorCode)) { return false; } |
86 | 49.2M | if (length > 0) { appendNonEmptyUnchanged(s, length, sink, options, edits); } |
87 | 49.2M | return true; |
88 | 49.2M | } |
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.51M | UErrorCode& status) { |
113 | 1.51M | if (U_FAILURE(status)) { return 0; } |
114 | 1.51M | CheckedArrayByteSink sink(buffer, capacity); |
115 | 1.51M | lambda(sink, status); |
116 | 1.51M | if (U_FAILURE(status)) { return 0; } |
117 | | |
118 | 1.49M | int32_t reslen = sink.NumberOfBytesAppended(); |
119 | | |
120 | 1.49M | if (sink.Overflowed()) { |
121 | 51.3k | status = U_BUFFER_OVERFLOW_ERROR; |
122 | 51.3k | return reslen; |
123 | 51.3k | } |
124 | | |
125 | 1.44M | return u_terminateChars(buffer, capacity, reslen, &status); |
126 | 1.49M | } 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 | 50.1k | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 50.1k | return reslen; | 123 | 50.1k | } | 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 | 433k | UErrorCode& status) { | 113 | 433k | if (U_FAILURE(status)) { return 0; } | 114 | 433k | CheckedArrayByteSink sink(buffer, capacity); | 115 | 433k | lambda(sink, status); | 116 | 433k | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 420k | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 420k | if (sink.Overflowed()) { | 121 | 167 | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 167 | return reslen; | 123 | 167 | } | 124 | | | 125 | 420k | return u_terminateChars(buffer, capacity, reslen, &status); | 126 | 420k | } |
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.88k | UErrorCode& status) { | 113 | 1.88k | if (U_FAILURE(status)) { return 0; } | 114 | 1.88k | CheckedArrayByteSink sink(buffer, capacity); | 115 | 1.88k | lambda(sink, status); | 116 | 1.88k | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 1.88k | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 1.88k | if (sink.Overflowed()) { | 121 | 0 | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 0 | return reslen; | 123 | 0 | } | 124 | | | 125 | 1.88k | return u_terminateChars(buffer, capacity, reslen, &status); | 126 | 1.88k | } |
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 | 10.9k | UErrorCode& status) { | 113 | 10.9k | if (U_FAILURE(status)) { return 0; } | 114 | 10.9k | CheckedArrayByteSink sink(buffer, capacity); | 115 | 10.9k | lambda(sink, status); | 116 | 10.9k | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 10.3k | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 10.3k | if (sink.Overflowed()) { | 121 | 281 | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 281 | return reslen; | 123 | 281 | } | 124 | | | 125 | 10.0k | return u_terminateChars(buffer, capacity, reslen, &status); | 126 | 10.3k | } |
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.90k | UErrorCode& status) { | 113 | 3.90k | if (U_FAILURE(status)) { return 0; } | 114 | 3.90k | CheckedArrayByteSink sink(buffer, capacity); | 115 | 3.90k | lambda(sink, status); | 116 | 3.90k | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 3.30k | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 3.30k | if (sink.Overflowed()) { | 121 | 317 | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 317 | return reslen; | 123 | 317 | } | 124 | | | 125 | 2.98k | 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.11k | UErrorCode& status) { | 113 | 2.11k | if (U_FAILURE(status)) { return 0; } | 114 | 2.11k | CheckedArrayByteSink sink(buffer, capacity); | 115 | 2.11k | lambda(sink, status); | 116 | 2.11k | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 2.11k | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 2.11k | if (sink.Overflowed()) { | 121 | 344 | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 344 | return reslen; | 123 | 344 | } | 124 | | | 125 | 1.77k | return u_terminateChars(buffer, capacity, reslen, &status); | 126 | 2.11k | } |
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.30k | UErrorCode& status) { | 113 | 7.30k | if (U_FAILURE(status)) { return 0; } | 114 | 7.30k | CheckedArrayByteSink sink(buffer, capacity); | 115 | 7.30k | lambda(sink, status); | 116 | 7.30k | if (U_FAILURE(status)) { return 0; } | 117 | | | 118 | 7.28k | int32_t reslen = sink.NumberOfBytesAppended(); | 119 | | | 120 | 7.28k | if (sink.Overflowed()) { | 121 | 73 | status = U_BUFFER_OVERFLOW_ERROR; | 122 | 73 | return reslen; | 123 | 73 | } | 124 | | | 125 | 7.20k | return u_terminateChars(buffer, capacity, reslen, &status); | 126 | 7.28k | } |
|
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.72M | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { |
142 | 3.72M | if (U_FAILURE(status)) { return {}; } |
143 | 3.72M | CharString result; |
144 | 3.72M | CharStringByteSink sink(&result); |
145 | 3.72M | lambda(sink, status); |
146 | 3.72M | return result; |
147 | 3.72M | } 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.4k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 53.4k | if (U_FAILURE(status)) { return {}; } | 143 | 53.4k | CharString result; | 144 | 53.4k | CharStringByteSink sink(&result); | 145 | 53.4k | lambda(sink, status); | 146 | 53.4k | return result; | 147 | 53.4k | } |
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.6k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 19.6k | if (U_FAILURE(status)) { return {}; } | 143 | 19.6k | CharString result; | 144 | 19.6k | CharStringByteSink sink(&result); | 145 | 19.6k | lambda(sink, status); | 146 | 19.6k | return result; | 147 | 19.6k | } |
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.3k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 13.3k | if (U_FAILURE(status)) { return {}; } | 143 | 13.3k | CharString result; | 144 | 13.3k | CharStringByteSink sink(&result); | 145 | 13.3k | lambda(sink, status); | 146 | 13.3k | return result; | 147 | 13.3k | } |
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 | 534k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 534k | if (U_FAILURE(status)) { return {}; } | 143 | 534k | CharString result; | 144 | 534k | CharStringByteSink sink(&result); | 145 | 534k | lambda(sink, status); | 146 | 534k | return result; | 147 | 534k | } |
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 | 2.99k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 2.99k | if (U_FAILURE(status)) { return {}; } | 143 | 2.99k | CharString result; | 144 | 2.99k | CharStringByteSink sink(&result); | 145 | 2.99k | lambda(sink, status); | 146 | 2.99k | return result; | 147 | 2.99k | } |
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 | 2.99k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 2.99k | if (U_FAILURE(status)) { return {}; } | 143 | 2.99k | CharString result; | 144 | 2.99k | CharStringByteSink sink(&result); | 145 | 2.99k | lambda(sink, status); | 146 | 2.99k | return result; | 147 | 2.99k | } |
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 | 243k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 243k | if (U_FAILURE(status)) { return {}; } | 143 | 243k | CharString result; | 144 | 243k | CharStringByteSink sink(&result); | 145 | 243k | lambda(sink, status); | 146 | 243k | return result; | 147 | 243k | } |
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 | 5.98k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 5.98k | if (U_FAILURE(status)) { return {}; } | 143 | 5.98k | CharString result; | 144 | 5.98k | CharStringByteSink sink(&result); | 145 | 5.98k | lambda(sink, status); | 146 | 5.98k | return result; | 147 | 5.98k | } |
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 | 442k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 442k | if (U_FAILURE(status)) { return {}; } | 143 | 442k | CharString result; | 144 | 442k | CharStringByteSink sink(&result); | 145 | 442k | lambda(sink, status); | 146 | 442k | return result; | 147 | 442k | } |
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 | 135k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 135k | if (U_FAILURE(status)) { return {}; } | 143 | 135k | CharString result; | 144 | 135k | CharStringByteSink sink(&result); | 145 | 135k | lambda(sink, status); | 146 | 135k | return result; | 147 | 135k | } |
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.3k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 95.3k | if (U_FAILURE(status)) { return {}; } | 143 | 95.3k | CharString result; | 144 | 95.3k | CharStringByteSink sink(&result); | 145 | 95.3k | lambda(sink, status); | 146 | 95.3k | return result; | 147 | 95.3k | } |
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 | 290k | static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { | 142 | 290k | if (U_FAILURE(status)) { return {}; } | 143 | 290k | CharString result; | 144 | 290k | CharStringByteSink sink(&result); | 145 | 290k | lambda(sink, status); | 146 | 290k | return result; | 147 | 290k | } |
|
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 |