_ZN6icu_7818CharStringByteSinkC2EPNS_10CharStringE:
  124|   500k|CharStringByteSink::CharStringByteSink(CharString* dest) : dest_(*dest) {
  125|   500k|}
_ZN6icu_7818CharStringByteSinkD2Ev:
  127|   500k|CharStringByteSink::~CharStringByteSink() = default;
_ZN6icu_7818CharStringByteSink6AppendEPKci:
  130|   285k|CharStringByteSink::Append(const char* bytes, int32_t n) {
  131|   285k|    UErrorCode status = U_ZERO_ERROR;
  132|   285k|    dest_.append(bytes, n, status);
  133|       |    // Any errors are silently ignored.
  134|   285k|}
_ZN6icu_7818CharStringByteSink15GetAppendBufferEiiPciPi:
  141|   211k|                                    int32_t* result_capacity) {
  142|   211k|    if (min_capacity < 1 || scratch_capacity < min_capacity) {
  ------------------
  |  Branch (142:9): [True: 0, False: 211k]
  |  Branch (142:29): [True: 0, False: 211k]
  ------------------
  143|      0|        *result_capacity = 0;
  144|      0|        return nullptr;
  145|      0|    }
  146|       |
  147|   211k|    UErrorCode status = U_ZERO_ERROR;
  148|   211k|    char* result = dest_.getAppendBuffer(
  149|   211k|            min_capacity,
  150|   211k|            desired_capacity_hint,
  151|   211k|            *result_capacity,
  152|   211k|            status);
  153|   211k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (153:9): [True: 211k, False: 0]
  ------------------
  154|   211k|        return result;
  155|   211k|    }
  156|       |
  157|      0|    *result_capacity = scratch_capacity;
  158|      0|    return scratch;
  159|   211k|}

locid.cpp:_ZN6icu_7812ByteSinkUtil28viaByteSinkToTerminatedCharsIZZNS_6Locale4initENS_11StringPieceEaENK3$_0clENSt3__117basic_string_viewIcNS5_11char_traitsIcEEEEPciR10UErrorCodeEUlRNS_8ByteSinkESC_E_vEEiSA_iOT_SC_:
  112|  1.40k|                                                UErrorCode& status) {
  113|  1.40k|        if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (113:13): [True: 0, False: 1.40k]
  ------------------
  114|  1.40k|        CheckedArrayByteSink sink(buffer, capacity);
  115|  1.40k|        lambda(sink, status);
  116|  1.40k|        if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (116:13): [True: 0, False: 1.40k]
  ------------------
  117|       |
  118|  1.40k|        int32_t reslen = sink.NumberOfBytesAppended();
  119|       |
  120|  1.40k|        if (sink.Overflowed()) {
  ------------------
  |  Branch (120:13): [True: 0, False: 1.40k]
  ------------------
  121|      0|            status = U_BUFFER_OVERFLOW_ERROR;
  122|      0|            return reslen;
  123|      0|        }
  124|       |
  125|  1.40k|        return u_terminateChars(buffer, capacity, reslen, &status);
  ------------------
  |  |  406|  1.40k|#define u_terminateChars U_ICU_ENTRY_POINT_RENAME(u_terminateChars)
  |  |  ------------------
  |  |  |  |  123|  1.40k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.40k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.40k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  126|  1.40k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil28viaByteSinkToTerminatedCharsIZ23uloc_getKeywordValue_78E3$_0vEEiPciOT_R10UErrorCode:
  112|  9.33k|                                                UErrorCode& status) {
  113|  9.33k|        if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (113:13): [True: 0, False: 9.33k]
  ------------------
  114|  9.33k|        CheckedArrayByteSink sink(buffer, capacity);
  115|  9.33k|        lambda(sink, status);
  116|  9.33k|        if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (116:13): [True: 0, False: 9.33k]
  ------------------
  117|       |
  118|  9.33k|        int32_t reslen = sink.NumberOfBytesAppended();
  119|       |
  120|  9.33k|        if (sink.Overflowed()) {
  ------------------
  |  Branch (120:13): [True: 0, False: 9.33k]
  ------------------
  121|      0|            status = U_BUFFER_OVERFLOW_ERROR;
  122|      0|            return reslen;
  123|      0|        }
  124|       |
  125|  9.33k|        return u_terminateChars(buffer, capacity, reslen, &status);
  ------------------
  |  |  406|  9.33k|#define u_terminateChars U_ICU_ENTRY_POINT_RENAME(u_terminateChars)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  126|  9.33k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ26ulocimp_getKeywordValue_78PKcNSt3__117basic_string_viewIcNS4_11char_traitsIcEEEER10UErrorCodeE3$_0vEENS_10CharStringEOT_SA_:
  141|  18.6k|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|  18.6k|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 18.6k]
  ------------------
  143|  18.6k|        CharString result;
  144|  18.6k|        CharStringByteSink sink(&result);
  145|  18.6k|        lambda(sink, status);
  146|  18.6k|        return result;
  147|  18.6k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ20ulocimp_getRegion_78NSt3__117basic_string_viewIcNS2_11char_traitsIcEEEER10UErrorCodeE3$_0vEENS_10CharStringEOT_S8_:
  141|  9.33k|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|  9.33k|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 9.33k]
  ------------------
  143|  9.33k|        CharString result;
  144|  9.33k|        CharStringByteSink sink(&result);
  145|  9.33k|        lambda(sink, status);
  146|  9.33k|        return result;
  147|  9.33k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ20ulocimp_getParent_78PKcR10UErrorCodeE3$_0vEENS_10CharStringEOT_S5_:
  141|    497|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|    497|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 497]
  ------------------
  143|    497|        CharString result;
  144|    497|        CharStringByteSink sink(&result);
  145|    497|        lambda(sink, status);
  146|    497|        return result;
  147|    497|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ18ulocimp_getName_78NSt3__117basic_string_viewIcNS2_11char_traitsIcEEEER10UErrorCodeE3$_0vEENS_10CharStringEOT_S8_:
  141|  6.44k|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|  6.44k|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 6.44k]
  ------------------
  143|  6.44k|        CharString result;
  144|  6.44k|        CharStringByteSink sink(&result);
  145|  6.44k|        lambda(sink, status);
  146|  6.44k|        return result;
  147|  6.44k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS2_11char_traitsIcEEEER10UErrorCodeE3$_0vEENS_10CharStringEOT_S8_:
  141|  67.0k|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|  67.0k|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 67.0k]
  ------------------
  143|  67.0k|        CharString result;
  144|  67.0k|        CharStringByteSink sink(&result);
  145|  67.0k|        lambda(sink, status);
  146|  67.0k|        return result;
  147|  67.0k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ23ulocimp_canonicalize_78NSt3__117basic_string_viewIcNS2_11char_traitsIcEEEER10UErrorCodeE3$_0vEENS_10CharStringEOT_S8_:
  141|      1|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|      1|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 1]
  ------------------
  143|      1|        CharString result;
  144|      1|        CharStringByteSink sink(&result);
  145|      1|        lambda(sink, status);
  146|      1|        return result;
  147|      1|    }

_ZN6icu_788ByteSinkD2Ev:
   15|   535k|ByteSink::~ByteSink() {}
_ZN6icu_7820CheckedArrayByteSinkC2EPci:
   32|  35.8k|    : outbuf_(outbuf), capacity_(capacity < 0 ? 0 : capacity),
  ------------------
  |  Branch (32:34): [True: 0, False: 35.8k]
  ------------------
   33|  35.8k|      size_(0), appended_(0), overflowed_(false) {
   34|  35.8k|}
_ZN6icu_7820CheckedArrayByteSink6AppendEPKci:
   44|  1.56k|void CheckedArrayByteSink::Append(const char* bytes, int32_t n) {
   45|  1.56k|  if (n <= 0) {
  ------------------
  |  Branch (45:7): [True: 0, False: 1.56k]
  ------------------
   46|      0|    return;
   47|      0|  }
   48|  1.56k|  if (n > (INT32_MAX - appended_)) {
  ------------------
  |  Branch (48:7): [True: 0, False: 1.56k]
  ------------------
   49|       |    // TODO: Report as integer overflow, not merely buffer overflow.
   50|      0|    appended_ = INT32_MAX;
   51|      0|    overflowed_ = true;
   52|      0|    return;
   53|      0|  }
   54|  1.56k|  appended_ += n;
   55|  1.56k|  int32_t available = capacity_ - size_;
   56|  1.56k|  if (n > available) {
  ------------------
  |  Branch (56:7): [True: 162, False: 1.40k]
  ------------------
   57|    162|    n = available;
   58|    162|    overflowed_ = true;
   59|    162|  }
   60|  1.56k|  if (n > 0 && bytes != (outbuf_ + size_)) {
  ------------------
  |  Branch (60:7): [True: 1.40k, False: 162]
  |  Branch (60:16): [True: 1.40k, False: 0]
  ------------------
   61|  1.40k|    uprv_memcpy(outbuf_ + size_, bytes, n);
  ------------------
  |  |   42|  1.40k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.40k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  1.40k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  1.40k|    _Pragma("clang diagnostic push") \
  |  |   45|  1.40k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  1.40k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.40k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  1.40k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.40k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  1.40k|    _Pragma("clang diagnostic pop") \
  |  |   49|  1.40k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  1.40k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  1.40k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.40k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   62|  1.40k|  }
   63|  1.56k|  size_ += n;
   64|  1.56k|}
_ZN6icu_7820CheckedArrayByteSink15GetAppendBufferEiiPciPi:
   70|    162|                                            int32_t* result_capacity) {
   71|    162|  if (min_capacity < 1 || scratch_capacity < min_capacity) {
  ------------------
  |  Branch (71:7): [True: 0, False: 162]
  |  Branch (71:27): [True: 0, False: 162]
  ------------------
   72|      0|    *result_capacity = 0;
   73|      0|    return nullptr;
   74|      0|  }
   75|    162|  int32_t available = capacity_ - size_;
   76|    162|  if (available >= min_capacity) {
  ------------------
  |  Branch (76:7): [True: 0, False: 162]
  ------------------
   77|      0|    *result_capacity = available;
   78|      0|    return outbuf_ + size_;
   79|    162|  } else {
   80|    162|    *result_capacity = scratch_capacity;
   81|    162|    return scratch;
   82|    162|  }
   83|    162|}

_ZN6icu_7810CharStringC2EOS0_:
   30|  28.0k|        : buffer(std::move(src.buffer)), len(src.len) {
   31|  28.0k|    src.len = 0;  // not strictly necessary because we make no guarantees on the source string
   32|  28.0k|}
_ZN6icu_7810CharStringaSEOS0_:
   34|  19.0k|CharString& CharString::operator=(CharString&& src) noexcept {
   35|  19.0k|    buffer = std::move(src.buffer);
   36|  19.0k|    len = src.len;
   37|  19.0k|    src.len = 0;  // not strictly necessary because we make no guarantees on the source string
   38|  19.0k|    return *this;
   39|  19.0k|}
_ZN6icu_7810CharString6appendEcR10UErrorCode:
  113|   237k|CharString &CharString::append(char c, UErrorCode &errorCode) {
  114|   237k|    if(ensureCapacity(len+2, 0, errorCode)) {
  ------------------
  |  Branch (114:8): [True: 237k, False: 0]
  ------------------
  115|   237k|        buffer[len++]=c;
  116|   237k|        buffer[len]=0;
  117|   237k|    }
  118|   237k|    return *this;
  119|   237k|}
_ZN6icu_7810CharString6appendEPKciR10UErrorCode:
  121|   888k|CharString &CharString::append(const char *s, int32_t sLength, UErrorCode &errorCode) {
  122|   888k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (122:8): [True: 0, False: 888k]
  ------------------
  123|      0|        return *this;
  124|      0|    }
  125|   888k|    if(sLength<-1 || (s==nullptr && sLength!=0)) {
  ------------------
  |  Branch (125:8): [True: 0, False: 888k]
  |  Branch (125:23): [True: 0, False: 888k]
  |  Branch (125:37): [True: 0, False: 0]
  ------------------
  126|      0|        errorCode=U_ILLEGAL_ARGUMENT_ERROR;
  127|      0|        return *this;
  128|      0|    }
  129|   888k|    if(sLength<0) {
  ------------------
  |  Branch (129:8): [True: 2.03k, False: 886k]
  ------------------
  130|  2.03k|        sLength= static_cast<int32_t>(uprv_strlen(s));
  ------------------
  |  |   37|  2.03k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  2.03k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  131|  2.03k|    }
  132|   888k|    if(sLength>0) {
  ------------------
  |  Branch (132:8): [True: 886k, False: 2.67k]
  ------------------
  133|   886k|        if(s==(buffer.getAlias()+len)) {
  ------------------
  |  Branch (133:12): [True: 186k, False: 699k]
  ------------------
  134|       |            // The caller wrote into the getAppendBuffer().
  135|   186k|            if(sLength>=(buffer.getCapacity()-len)) {
  ------------------
  |  Branch (135:16): [True: 0, False: 186k]
  ------------------
  136|       |                // The caller wrote too much.
  137|      0|                errorCode=U_INTERNAL_PROGRAM_ERROR;
  138|   186k|            } else {
  139|   186k|                buffer[len+=sLength]=0;
  140|   186k|            }
  141|   699k|        } else if(buffer.getAlias()<=s && s<(buffer.getAlias()+len) &&
  ------------------
  |  Branch (141:19): [True: 158k, False: 540k]
  |  Branch (141:43): [True: 0, False: 158k]
  ------------------
  142|   699k|                  sLength>=(buffer.getCapacity()-len)
  ------------------
  |  Branch (142:19): [True: 0, False: 0]
  ------------------
  143|   699k|        ) {
  144|       |            // (Part of) this string is appended to itself which requires reallocation,
  145|       |            // so we have to make a copy of the substring and append that.
  146|      0|            return append(CharString(s, sLength, errorCode), errorCode);
  147|   699k|        } else if(ensureCapacity(len+sLength+1, 0, errorCode)) {
  ------------------
  |  Branch (147:19): [True: 699k, False: 0]
  ------------------
  148|   699k|            uprv_memcpy(buffer.getAlias()+len, s, sLength);
  ------------------
  |  |   42|   699k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   699k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   699k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   699k|    _Pragma("clang diagnostic push") \
  |  |   45|   699k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   699k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   699k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   699k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   699k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   699k|    _Pragma("clang diagnostic pop") \
  |  |   49|   699k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   699k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   699k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   699k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  149|   699k|            buffer[len+=sLength]=0;
  150|   699k|        }
  151|   886k|    }
  152|   888k|    return *this;
  153|   888k|}
_ZN6icu_7810CharString15getAppendBufferEiiRiR10UErrorCode:
  190|   211k|                                  UErrorCode &errorCode) {
  191|   211k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (191:8): [True: 0, False: 211k]
  ------------------
  192|      0|        resultCapacity=0;
  193|      0|        return nullptr;
  194|      0|    }
  195|   211k|    int32_t appendCapacity=buffer.getCapacity()-len-1;  // -1 for NUL
  196|   211k|    if(appendCapacity>=minCapacity) {
  ------------------
  |  Branch (196:8): [True: 211k, False: 0]
  ------------------
  197|   211k|        resultCapacity=appendCapacity;
  198|   211k|        return buffer.getAlias()+len;
  199|   211k|    }
  200|      0|    if(ensureCapacity(len+minCapacity+1, len+desiredCapacityHint+1, errorCode)) {
  ------------------
  |  Branch (200:8): [True: 0, False: 0]
  ------------------
  201|      0|        resultCapacity=buffer.getCapacity()-len-1;
  202|      0|        return buffer.getAlias()+len;
  203|      0|    }
  204|      0|    resultCapacity=0;
  205|      0|    return nullptr;
  206|      0|}
_ZN6icu_7810CharString20appendInvariantCharsERKNS_13UnicodeStringER10UErrorCode:
  208|  2.03k|CharString &CharString::appendInvariantChars(const UnicodeString &s, UErrorCode &errorCode) {
  209|  2.03k|    return appendInvariantChars(s.getBuffer(), s.length(), errorCode);
  210|  2.03k|}
_ZN6icu_7810CharString20appendInvariantCharsEPKDsiR10UErrorCode:
  212|  7.41k|CharString &CharString::appendInvariantChars(const char16_t* uchars, int32_t ucharsLen, UErrorCode &errorCode) {
  213|  7.41k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (213:8): [True: 0, False: 7.41k]
  ------------------
  214|      0|        return *this;
  215|      0|    }
  216|  7.41k|    if (!uprv_isInvariantUString(uchars, ucharsLen)) {
  ------------------
  |  | 1518|  7.41k|#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
  |  |  ------------------
  |  |  |  |  123|  7.41k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.41k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.41k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (216:9): [True: 20, False: 7.39k]
  ------------------
  217|     20|        errorCode = U_INVARIANT_CONVERSION_ERROR;
  218|     20|        return *this;
  219|     20|    }
  220|  7.39k|    if(ensureCapacity(len+ucharsLen+1, 0, errorCode)) {
  ------------------
  |  Branch (220:8): [True: 7.39k, False: 0]
  ------------------
  221|  7.39k|        u_UCharsToChars(uchars, buffer.getAlias()+len, ucharsLen);
  ------------------
  |  |  211|  7.39k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  7.39k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.39k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.39k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  222|  7.39k|        len += ucharsLen;
  223|  7.39k|        buffer[len] = 0;
  224|  7.39k|    }
  225|  7.39k|    return *this;
  226|  7.41k|}
_ZN6icu_7810CharString14ensureCapacityEiiR10UErrorCode:
  230|   943k|                                 UErrorCode &errorCode) {
  231|   943k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (231:8): [True: 0, False: 943k]
  ------------------
  232|      0|        return false;
  233|      0|    }
  234|   943k|    if(capacity>buffer.getCapacity()) {
  ------------------
  |  Branch (234:8): [True: 43.6k, False: 899k]
  ------------------
  235|  43.6k|        if(desiredCapacityHint==0) {
  ------------------
  |  Branch (235:12): [True: 43.6k, False: 0]
  ------------------
  236|  43.6k|            desiredCapacityHint=capacity+buffer.getCapacity();
  237|  43.6k|        }
  238|  43.6k|        if( (desiredCapacityHint<=capacity || buffer.resize(desiredCapacityHint, len+1)==nullptr) &&
  ------------------
  |  Branch (238:14): [True: 0, False: 43.6k]
  |  Branch (238:47): [True: 0, False: 43.6k]
  ------------------
  239|  43.6k|            buffer.resize(capacity, len+1)==nullptr
  ------------------
  |  Branch (239:13): [True: 0, False: 0]
  ------------------
  240|  43.6k|        ) {
  241|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  242|      0|            return false;
  243|      0|        }
  244|  43.6k|    }
  245|   943k|    return true;
  246|   943k|}

_ZN6icu_7810CharStringD2Ev:
   56|  1.06M|    ~CharString() {}
_ZN6icu_7810CharString4dataEv:
   85|   509k|    char *data() { return buffer.getAlias(); }
_ZN6icu_7810CharString6appendENS_11StringPieceER10UErrorCode:
  131|   434k|    CharString &append(StringPiece s, UErrorCode &errorCode) {
  132|   434k|        return append(s.data(), s.length(), errorCode);
  133|   434k|    }
_ZN6icu_7810CharStringC2Ev:
   43|   972k|    CharString() : len(0) { buffer[0]=0; }
_ZN6icu_7810CharString6appendERKS0_R10UErrorCode:
  134|   141k|    CharString &append(const CharString &s, UErrorCode &errorCode) {
  135|   141k|        return append(s.data(), s.length(), errorCode);
  136|   141k|    }
_ZNK6icu_7810CharString4dataEv:
   84|   192k|    const char *data() const { return buffer.getAlias(); }
_ZNK6icu_7810CharString6lengthEv:
   80|   382k|    int32_t length() const { return len; }
_ZN6icu_7810CharStringC2ENS_11StringPieceER10UErrorCode:
   44|  58.8k|    CharString(StringPiece s, UErrorCode &errorCode) : len(0) {
   45|  58.8k|        buffer[0]=0;
   46|  58.8k|        append(s, errorCode);
   47|  58.8k|    }
_ZN6icu_7810CharStringC2EPKciR10UErrorCode:
   52|  1.23k|    CharString(const char *s, int32_t sLength, UErrorCode &errorCode) : len(0) {
   53|  1.23k|        buffer[0]=0;
   54|  1.23k|        append(s, sLength, errorCode);
   55|  1.23k|    }
_ZNK6icu_7810CharString7isEmptyEv:
   79|   419k|    UBool isEmpty() const { return len==0; }
_ZNK6icu_7810CharStringixEi:
   81|  4.28k|    char operator[](int32_t index) const { return buffer[index]; }
_ZNK6icu_7810CharStringeqERKS0_:
  108|  12.9k|    bool operator==(const CharString& other) const {
  109|  12.9k|        return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0);
  ------------------
  |  |  101|  12.9k|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|  12.9k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (109:16): [True: 12.9k, False: 0]
  |  Branch (109:42): [True: 0, False: 12.9k]
  |  Branch (109:54): [True: 12.2k, False: 746]
  ------------------
  110|  12.9k|    }
_ZNK6icu_7810CharStringeqENS_11StringPieceE:
  115|  8.86k|    bool operator==(StringPiece other) const {
  116|  8.86k|        return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0);
  ------------------
  |  |  101|    441|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|    441|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (116:16): [True: 441, False: 8.41k]
  |  Branch (116:42): [True: 0, False: 441]
  |  Branch (116:54): [True: 0, False: 441]
  ------------------
  117|  8.86k|    }
_ZN6icu_7810CharString5clearEv:
  127|   157k|    CharString &clear() { len=0; buffer[0]=0; return *this; }

_ZN6icu_7813CharStringMapD2Ev:
   33|     10|    ~CharStringMap() {
   34|     10|        uhash_close(map);
  ------------------
  |  |  991|     10|#define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close)
  |  |  ------------------
  |  |  |  |  123|     10|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     10|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     10|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   35|     10|    }
_ZN6icu_7813CharStringMapC2EiR10UErrorCode:
   25|      5|    CharStringMap(int32_t size, UErrorCode &errorCode) {
   26|      5|        map = uhash_openSize(uhash_hashChars, uhash_compareChars, uhash_compareChars,
  ------------------
  |  | 1031|      5|#define uhash_openSize U_ICU_ENTRY_POINT_RENAME(uhash_openSize)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      map = uhash_openSize(uhash_hashChars, uhash_compareChars, uhash_compareChars,
  ------------------
  |  | 1011|      5|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      map = uhash_openSize(uhash_hashChars, uhash_compareChars, uhash_compareChars,
  ------------------
  |  |  993|      5|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      map = uhash_openSize(uhash_hashChars, uhash_compareChars, uhash_compareChars,
  ------------------
  |  |  993|      5|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   27|      5|                             size, &errorCode);
   28|      5|    }
_ZN6icu_7813CharStringMap3putEPKcS2_R10UErrorCode:
   45|  1.29k|    void put(const char *key, const char *value, UErrorCode &errorCode) {
   46|  1.29k|        uhash_put(map, const_cast<char *>(key), const_cast<char *>(value), &errorCode);
  ------------------
  |  | 1032|  1.29k|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|  1.29k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.29k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.29k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   47|  1.29k|    }
_ZN6icu_7813CharStringMapC2EOS0_:
   29|     10|    CharStringMap(CharStringMap &&other) noexcept : map(other.map) {
   30|     10|        other.map = nullptr;
   31|     10|    }
_ZNK6icu_7813CharStringMap3getEPKc:
   44|  1.88k|    const char *get(const char *key) const { return static_cast<const char *>(uhash_get(map, key)); }
  ------------------
  |  | 1007|  1.88k|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|  1.88k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.88k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.88k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------

uprv_malloc_78:
   45|   393k|uprv_malloc(size_t s) {
   46|       |#if U_DEBUG && defined(UPRV_MALLOC_COUNT)
   47|       |#if 1
   48|       |  putchar('>');
   49|       |  fflush(stdout);
   50|       |#else
   51|       |  fprintf(stderr,"MALLOC\t#%d\t%ul bytes\t%ul total\n", ++n,s,(b+=s)); fflush(stderr);
   52|       |#endif
   53|       |#endif
   54|   393k|    if (s > 0) {
  ------------------
  |  Branch (54:9): [True: 393k, False: 0]
  ------------------
   55|   393k|        if (pAlloc) {
  ------------------
  |  Branch (55:13): [True: 0, False: 393k]
  ------------------
   56|      0|            return (*pAlloc)(pContext, s);
   57|   393k|        } else {
   58|   393k|            return uprv_default_malloc(s);
  ------------------
  |  |  615|   393k|# define uprv_default_malloc(x) malloc(x)
  ------------------
   59|   393k|        }
   60|   393k|    } else {
   61|      0|        return (void *)zeroMem;
   62|      0|    }
   63|   393k|}
uprv_realloc_78:
   66|    804|uprv_realloc(void * buffer, size_t size) {
   67|       |#if U_DEBUG && defined(UPRV_MALLOC_COUNT)
   68|       |  putchar('~');
   69|       |  fflush(stdout);
   70|       |#endif
   71|    804|    if (buffer == zeroMem) {
  ------------------
  |  Branch (71:9): [True: 0, False: 804]
  ------------------
   72|      0|        return uprv_malloc(size);
  ------------------
  |  | 1524|      0|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   73|    804|    } else if (size == 0) {
  ------------------
  |  Branch (73:16): [True: 0, False: 804]
  ------------------
   74|      0|        if (pFree) {
  ------------------
  |  Branch (74:13): [True: 0, False: 0]
  ------------------
   75|      0|            (*pFree)(pContext, buffer);
   76|      0|        } else {
   77|      0|            uprv_default_free(buffer);
  ------------------
  |  |  617|      0|# define uprv_default_free(x) free(x)
  ------------------
   78|      0|        }
   79|      0|        return (void *)zeroMem;
   80|    804|    } else {
   81|    804|        if (pRealloc) {
  ------------------
  |  Branch (81:13): [True: 0, False: 804]
  ------------------
   82|      0|            return (*pRealloc)(pContext, buffer, size);
   83|    804|        } else {
   84|    804|            return uprv_default_realloc(buffer, size);
  ------------------
  |  |  616|    804|# define uprv_default_realloc(x,y) realloc(x,y)
  ------------------
   85|    804|        }
   86|    804|    }
   87|    804|}
uprv_free_78:
   90|   423k|uprv_free(void *buffer) {
   91|       |#if U_DEBUG && defined(UPRV_MALLOC_COUNT)
   92|       |  putchar('<');
   93|       |  fflush(stdout);
   94|       |#endif
   95|   423k|    if (buffer != zeroMem) {
  ------------------
  |  Branch (95:9): [True: 423k, False: 0]
  ------------------
   96|   423k|        if (pFree) {
  ------------------
  |  Branch (96:13): [True: 0, False: 423k]
  ------------------
   97|      0|            (*pFree)(pContext, buffer);
   98|   423k|        } else {
   99|   423k|            uprv_default_free(buffer);
  ------------------
  |  |  617|   423k|# define uprv_default_free(x) free(x)
  ------------------
  100|   423k|        }
  101|   423k|    }
  102|   423k|}

_ZN6icu_7815MaybeStackArrayIcLi40EEC2Ev:
  344|  1.03M|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayIcLi40EED2Ev:
  363|  1.06M|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIcLi40EEC2EOS1_:
  479|  28.0k|        : ptr(src.ptr), capacity(src.capacity), needToRelease(src.needToRelease) {
  480|  28.0k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (480:9): [True: 28.0k, False: 0]
  ------------------
  481|  28.0k|        ptr = stackArray;
  482|  28.0k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|  28.0k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  28.0k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  28.0k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  28.0k|    _Pragma("clang diagnostic push") \
  |  |   45|  28.0k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  28.0k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  28.0k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  28.0k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  28.0k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  28.0k|    _Pragma("clang diagnostic pop") \
  |  |   49|  28.0k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  28.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  28.0k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  28.0k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  483|  28.0k|    } else {
  484|      0|        src.resetToStackArray();  // take ownership away from src
  485|      0|    }
  486|  28.0k|}
_ZN6icu_7815MaybeStackArrayIcLi40EEaSEOS1_:
  490|  19.0k|MaybeStackArray<T, stackCapacity>::operator=(MaybeStackArray <T, stackCapacity>&& src) noexcept {
  491|  19.0k|    releaseArray();  // in case this instance had its own memory allocated
  492|  19.0k|    capacity = src.capacity;
  493|  19.0k|    needToRelease = src.needToRelease;
  494|  19.0k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (494:9): [True: 19.0k, False: 0]
  ------------------
  495|  19.0k|        ptr = stackArray;
  496|  19.0k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|  19.0k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  19.0k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  19.0k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  19.0k|    _Pragma("clang diagnostic push") \
  |  |   45|  19.0k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  19.0k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  19.0k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  19.0k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  19.0k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  19.0k|    _Pragma("clang diagnostic pop") \
  |  |   49|  19.0k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  19.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  19.0k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  19.0k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  497|  19.0k|    } else {
  498|      0|        ptr = src.ptr;
  499|      0|        src.resetToStackArray();  // take ownership away from src
  500|      0|    }
  501|  19.0k|    return *this;
  502|  19.0k|}
_ZNK6icu_7815MaybeStackArrayIcLi40EE11getCapacityEv:
  376|  1.38M|    int32_t getCapacity() const { return capacity; }
_ZNK6icu_7815MaybeStackArrayIcLi40EE8getAliasEv:
  381|  3.36M|    T *getAlias() const { return ptr; }
_ZNK6icu_7815MaybeStackArrayIcLi40EEixEl:
  395|  4.28k|    const T &operator[](ptrdiff_t i) const { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIcLi40EEixEl:
  402|  2.55M|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIcLi40EE6resizeEii:
  505|  43.6k|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|  43.6k|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 43.6k, False: 0]
  ------------------
  507|       |#if U_DEBUG && defined(UPRV_MALLOC_COUNT)
  508|       |        ::fprintf(::stderr, "MaybeStackArray (resize) alloc %d * %lu\n", newCapacity, sizeof(T));
  509|       |#endif
  510|  43.6k|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|  43.6k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  43.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  43.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  43.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|  43.6k|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 43.6k, False: 0]
  ------------------
  512|  43.6k|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 43.6k, False: 0]
  ------------------
  513|  43.6k|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 43.6k]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|  43.6k|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 43.6k]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|  43.6k|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|  43.6k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  43.6k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  43.6k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  43.6k|    _Pragma("clang diagnostic push") \
  |  |   45|  43.6k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  43.6k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  43.6k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  43.6k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  43.6k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  43.6k|    _Pragma("clang diagnostic pop") \
  |  |   49|  43.6k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  43.6k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  43.6k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  43.6k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|  43.6k|            }
  521|  43.6k|            releaseArray();
  522|  43.6k|            ptr=p;
  523|  43.6k|            capacity=newCapacity;
  524|  43.6k|            needToRelease=true;
  525|  43.6k|        }
  526|  43.6k|        return p;
  527|  43.6k|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|  43.6k|}
_ZN6icu_7815MaybeStackArrayIcLi40EE12releaseArrayEv:
  458|  1.12M|    void releaseArray() {
  459|  1.12M|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 43.6k, False: 1.07M]
  ------------------
  460|  43.6k|            uprv_free(ptr);
  ------------------
  |  | 1503|  43.6k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  43.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  43.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  43.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|  43.6k|        }
  462|  1.12M|    }
_ZN6icu_7815MaybeStackArrayIlLi2EED2Ev:
  363|  9.45k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIlLi2EE12releaseArrayEv:
  458|  9.45k|    void releaseArray() {
  459|  9.45k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 0, False: 9.45k]
  ------------------
  460|      0|            uprv_free(ptr);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      0|        }
  462|  9.45k|    }
_ZN6icu_7815MaybeStackArrayIlLi2EEC2Ev:
  344|  9.45k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZNK6icu_7824MaybeStackHeaderAndArrayI9decNumbercLi34EE8getAliasEv:
  594|  44.4k|    H *getAlias() const { return ptr; }
_ZN6icu_7824MaybeStackHeaderAndArrayI9decNumbercLi34EED2Ev:
  584|  7.73k|    ~MaybeStackHeaderAndArray() { releaseMemory(); }
_ZN6icu_7824MaybeStackHeaderAndArrayI9decNumbercLi34EE13releaseMemoryEv:
  662|  8.95k|    void releaseMemory() {
  663|  8.95k|        if(needToRelease) {
  ------------------
  |  Branch (663:12): [True: 1.21k, False: 7.73k]
  ------------------
  664|  1.21k|            uprv_free(ptr);
  ------------------
  |  | 1503|  1.21k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  1.21k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.21k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.21k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  665|  1.21k|        }
  666|  8.95k|    }
_ZN6icu_7824MaybeStackHeaderAndArrayI9decNumbercLi34EEC2Ev:
  580|  7.73k|    MaybeStackHeaderAndArray() : ptr(&stackHeader), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7824MaybeStackHeaderAndArrayI9decNumbercLi34EE6resizeEii:
  677|  1.21k|                                                                int32_t length) {
  678|  1.21k|    if(newCapacity>=0) {
  ------------------
  |  Branch (678:8): [True: 1.21k, False: 0]
  ------------------
  679|       |#if U_DEBUG && defined(UPRV_MALLOC_COUNT)
  680|       |      ::fprintf(::stderr,"MaybeStackHeaderAndArray alloc %d + %d * %ul\n", sizeof(H),newCapacity,sizeof(T));
  681|       |#endif
  682|  1.21k|        H *p=(H *)uprv_malloc(sizeof(H)+newCapacity*sizeof(T));
  ------------------
  |  | 1524|  1.21k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.21k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.21k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.21k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  683|  1.21k|        if(p!=nullptr) {
  ------------------
  |  Branch (683:12): [True: 1.21k, False: 0]
  ------------------
  684|  1.21k|            if(length<0) {
  ------------------
  |  Branch (684:16): [True: 0, False: 1.21k]
  ------------------
  685|      0|                length=0;
  686|  1.21k|            } else if(length>0) {
  ------------------
  |  Branch (686:23): [True: 0, False: 1.21k]
  ------------------
  687|      0|                if(length>capacity) {
  ------------------
  |  Branch (687:20): [True: 0, False: 0]
  ------------------
  688|      0|                    length=capacity;
  689|      0|                }
  690|      0|                if(length>newCapacity) {
  ------------------
  |  Branch (690:20): [True: 0, False: 0]
  ------------------
  691|      0|                    length=newCapacity;
  692|      0|                }
  693|      0|            }
  694|  1.21k|            uprv_memcpy(p, ptr, sizeof(H)+(size_t)length*sizeof(T));
  ------------------
  |  |   42|  1.21k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.21k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  1.21k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  1.21k|    _Pragma("clang diagnostic push") \
  |  |   45|  1.21k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  1.21k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.21k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  1.21k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.21k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  1.21k|    _Pragma("clang diagnostic pop") \
  |  |   49|  1.21k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  1.21k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  1.21k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.21k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  695|  1.21k|            releaseMemory();
  696|  1.21k|            ptr=p;
  697|  1.21k|            capacity=newCapacity;
  698|  1.21k|            needToRelease=true;
  699|  1.21k|        }
  700|  1.21k|        return p;
  701|  1.21k|    } else {
  702|      0|        return nullptr;
  703|      0|    }
  704|  1.21k|}
_ZNK6icu_7824MaybeStackHeaderAndArrayI9decNumbercLi34EE13getArrayStartEv:
  599|  16.4k|    T *getArrayStart() const { return reinterpret_cast<T *>(getAlias()+1); }
_ZNK6icu_7824MaybeStackHeaderAndArrayI9decNumbercLi34EE13getArrayLimitEv:
  604|  4.12k|    T *getArrayLimit() const { return getArrayStart()+capacity; }
_ZNK6icu_7824MaybeStackHeaderAndArrayI9decNumbercLi34EEcvPS1_Ev:
  610|  10.7k|    operator H *() const { return ptr; }
_ZN6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EED2Ev:
  363|  7.26k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EE12releaseArrayEv:
  458|  8.48k|    void releaseArray() {
  459|  8.48k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 1.12k, False: 7.36k]
  ------------------
  460|  1.12k|            uprv_free(ptr);
  ------------------
  |  | 1503|  1.12k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  1.12k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.12k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.12k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|  1.12k|        }
  462|  8.48k|    }
_ZN6icu_7815MaybeStackArrayINS_8SpanInfoELi8EEC2Ev:
  344|  9.45k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayINS_8SpanInfoELi8EED2Ev:
  363|  9.45k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayINS_8SpanInfoELi8EE12releaseArrayEv:
  458|  9.45k|    void releaseArray() {
  459|  9.45k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 0, False: 9.45k]
  ------------------
  460|      0|            uprv_free(ptr);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      0|        }
  462|  9.45k|    }
_ZN6icu_7815MaybeStackArrayINS_6number4impl14CompactModInfoELi12EEC2Ev:
  344|  3.37k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayINS_6number4impl14CompactModInfoELi12EED2Ev:
  363|  3.37k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayINS_6number4impl14CompactModInfoELi12EE12releaseArrayEv:
  458|  3.37k|    void releaseArray() {
  459|  3.37k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 0, False: 3.37k]
  ------------------
  460|      0|            uprv_free(ptr);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      0|        }
  462|  3.37k|    }
_ZN6icu_7815MaybeStackArrayIhLi20EEC2Ei10UErrorCode:
  350|  2.02k|    MaybeStackArray(int32_t newCapacity, UErrorCode status) : MaybeStackArray() {
  351|  2.02k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (351:13): [True: 0, False: 2.02k]
  ------------------
  352|      0|            return;
  353|      0|        }
  354|  2.02k|        if (capacity < newCapacity) {
  ------------------
  |  Branch (354:13): [True: 0, False: 2.02k]
  ------------------
  355|      0|            if (resize(newCapacity) == nullptr) {
  ------------------
  |  Branch (355:17): [True: 0, False: 0]
  ------------------
  356|      0|                status = U_MEMORY_ALLOCATION_ERROR;
  357|      0|            }
  358|      0|        }
  359|  2.02k|    }
_ZN6icu_7815MaybeStackArrayIhLi20EEC2Ev:
  344|  2.02k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayIhLi20EE12releaseArrayEv:
  458|  2.02k|    void releaseArray() {
  459|  2.02k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 0, False: 2.02k]
  ------------------
  460|      0|            uprv_free(ptr);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      0|        }
  462|  2.02k|    }
_ZN6icu_7815MaybeStackArrayIhLi20EED2Ev:
  363|  2.02k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIhLi20EEixEl:
  402|  30.4k|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZNK6icu_7815MaybeStackArrayIhLi20EE8getAliasEv:
  381|  2.02k|    T *getAlias() const { return ptr; }
_ZN6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EEC2Ev:
  344|  3.89k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EEC2EOS3_:
  479|  3.89k|        : ptr(src.ptr), capacity(src.capacity), needToRelease(src.needToRelease) {
  480|  3.89k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (480:9): [True: 2.67k, False: 1.21k]
  ------------------
  481|  2.67k|        ptr = stackArray;
  482|  2.67k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|  2.67k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.67k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  2.67k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  2.67k|    _Pragma("clang diagnostic push") \
  |  |   45|  2.67k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  2.67k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.67k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  2.67k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.67k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  2.67k|    _Pragma("clang diagnostic pop") \
  |  |   49|  2.67k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  2.67k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  2.67k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.67k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  483|  2.67k|    } else {
  484|  1.21k|        src.resetToStackArray();  // take ownership away from src
  485|  1.21k|    }
  486|  3.89k|}
_ZN6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EE17resetToStackArrayEv:
  463|  1.21k|    void resetToStackArray() {
  464|  1.21k|        ptr=stackArray;
  465|  1.21k|        capacity=stackCapacity;
  466|  1.21k|        needToRelease=false;
  467|  1.21k|    }
_ZNK6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EE11getCapacityEv:
  376|  3.66k|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EE6resizeEii:
  505|  1.21k|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|  1.21k|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 1.21k, False: 0]
  ------------------
  507|       |#if U_DEBUG && defined(UPRV_MALLOC_COUNT)
  508|       |        ::fprintf(::stderr, "MaybeStackArray (resize) alloc %d * %lu\n", newCapacity, sizeof(T));
  509|       |#endif
  510|  1.21k|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|  1.21k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.21k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.21k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.21k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|  1.21k|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 1.21k, False: 0]
  ------------------
  512|  1.21k|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 0, False: 1.21k]
  ------------------
  513|      0|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 0]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|      0|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 0]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|      0|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|      0|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      0|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      0|    _Pragma("clang diagnostic push") \
  |  |   45|      0|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      0|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      0|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      0|    _Pragma("clang diagnostic pop") \
  |  |   49|      0|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|      0|            }
  521|  1.21k|            releaseArray();
  522|  1.21k|            ptr=p;
  523|  1.21k|            capacity=newCapacity;
  524|  1.21k|            needToRelease=true;
  525|  1.21k|        }
  526|  1.21k|        return p;
  527|  1.21k|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|  1.21k|}
_ZNK6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EE8getAliasEv:
  381|  6.75k|    T *getAlias() const { return ptr; }
_ZN6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EEixEl:
  402|  1.81k|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7810MemoryPoolINS_13UnicodeStringELi8EEC2Ev:
  760|      1|    MemoryPool() : fCount(0), fPool() {}
_ZN6icu_7815MaybeStackArrayIPNS_13UnicodeStringELi8EEC2Ev:
  344|      1|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7810MemoryPoolINS_13UnicodeStringELi8EED2Ev:
  762|      1|    ~MemoryPool() {
  763|      1|        for (int32_t i = 0; i < fCount; ++i) {
  ------------------
  |  Branch (763:29): [True: 0, False: 1]
  ------------------
  764|      0|            delete fPool[i];
  765|      0|        }
  766|      1|    }
_ZN6icu_7815MaybeStackArrayIPNS_13UnicodeStringELi8EED2Ev:
  363|      1|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIPNS_13UnicodeStringELi8EE12releaseArrayEv:
  458|      1|    void releaseArray() {
  459|      1|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 0, False: 1]
  ------------------
  460|      0|            uprv_free(ptr);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      0|        }
  462|      1|    }
_ZN6icu_7811LocalMemoryIPKcEC2EPS2_:
  195|      5|    explicit LocalMemory(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7811LocalMemoryIiEC2EPi:
  195|      5|    explicit LocalMemory(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7811LocalMemoryIPKcE22allocateInsteadAndCopyEii:
  294|      5|inline T *LocalMemory<T>::allocateInsteadAndCopy(int32_t newCapacity, int32_t length) {
  295|      5|    if(newCapacity>0) {
  ------------------
  |  Branch (295:8): [True: 5, False: 0]
  ------------------
  296|      5|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|      5|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  297|      5|        if(p!=nullptr) {
  ------------------
  |  Branch (297:12): [True: 5, False: 0]
  ------------------
  298|      5|            if(length>0) {
  ------------------
  |  Branch (298:16): [True: 0, False: 5]
  ------------------
  299|      0|                if(length>newCapacity) {
  ------------------
  |  Branch (299:20): [True: 0, False: 0]
  ------------------
  300|      0|                    length=newCapacity;
  301|      0|                }
  302|      0|                uprv_memcpy(p, LocalPointerBase<T>::ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|      0|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      0|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      0|    _Pragma("clang diagnostic push") \
  |  |   45|      0|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      0|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      0|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      0|    _Pragma("clang diagnostic pop") \
  |  |   49|      0|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  303|      0|            }
  304|      5|            uprv_free(LocalPointerBase<T>::ptr);
  ------------------
  |  | 1503|      5|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  305|      5|            LocalPointerBase<T>::ptr=p;
  306|      5|        }
  307|      5|        return p;
  308|      5|    } else {
  309|      0|        return nullptr;
  310|      0|    }
  311|      5|}
_ZN6icu_7811LocalMemoryIiE22allocateInsteadAndCopyEii:
  294|      5|inline T *LocalMemory<T>::allocateInsteadAndCopy(int32_t newCapacity, int32_t length) {
  295|      5|    if(newCapacity>0) {
  ------------------
  |  Branch (295:8): [True: 5, False: 0]
  ------------------
  296|      5|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|      5|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  297|      5|        if(p!=nullptr) {
  ------------------
  |  Branch (297:12): [True: 5, False: 0]
  ------------------
  298|      5|            if(length>0) {
  ------------------
  |  Branch (298:16): [True: 0, False: 5]
  ------------------
  299|      0|                if(length>newCapacity) {
  ------------------
  |  Branch (299:20): [True: 0, False: 0]
  ------------------
  300|      0|                    length=newCapacity;
  301|      0|                }
  302|      0|                uprv_memcpy(p, LocalPointerBase<T>::ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|      0|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      0|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      0|    _Pragma("clang diagnostic push") \
  |  |   45|      0|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      0|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      0|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      0|    _Pragma("clang diagnostic pop") \
  |  |   49|      0|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  303|      0|            }
  304|      5|            uprv_free(LocalPointerBase<T>::ptr);
  ------------------
  |  | 1503|      5|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  305|      5|            LocalPointerBase<T>::ptr=p;
  306|      5|        }
  307|      5|        return p;
  308|      5|    } else {
  309|      0|        return nullptr;
  310|      0|    }
  311|      5|}
_ZNK6icu_7811LocalMemoryIPKcEixEl:
  274|  1.29k|    T &operator[](ptrdiff_t i) const { return LocalPointerBase<T>::ptr[i]; }
_ZNK6icu_7811LocalMemoryIiEixEl:
  274|  1.29k|    T &operator[](ptrdiff_t i) const { return LocalPointerBase<T>::ptr[i]; }
_ZN6icu_7811LocalMemoryIiED2Ev:
  206|      5|    ~LocalMemory() {
  207|      5|        uprv_free(LocalPointerBase<T>::ptr);
  ------------------
  |  | 1503|      5|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  208|      5|    }
_ZN6icu_7811LocalMemoryIPKcED2Ev:
  206|      5|    ~LocalMemory() {
  207|      5|        uprv_free(LocalPointerBase<T>::ptr);
  ------------------
  |  | 1503|      5|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  208|      5|    }
_ZN6icu_7815MaybeStackArrayI11max_align_tLi14EEC2Ev:
  344|      1|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZNK6icu_7815MaybeStackArrayI11max_align_tLi14EE11getCapacityEv:
  376|      1|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayI11max_align_tLi14EE12releaseArrayEv:
  458|      1|    void releaseArray() {
  459|      1|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 0, False: 1]
  ------------------
  460|      0|            uprv_free(ptr);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      0|        }
  462|      1|    }
_ZNK6icu_7815MaybeStackArrayI11max_align_tLi14EE8getAliasEv:
  381|      2|    T *getAlias() const { return ptr; }
_ZN6icu_7815MaybeStackArrayI11max_align_tLi14EED2Ev:
  363|      1|    ~MaybeStackArray() { releaseArray(); }
umutex.cpp:_ZZN6icu_78L9umtx_initEvENK3$_0clEv:
  144|      1|#define STATIC_NEW(type) [] () { \
  145|      1|    alignas(type) static char storage[sizeof(type)]; \
  146|      1|    return new(storage) type();} ()
umutex.cpp:_ZZN6icu_78L9umtx_initEvENK3$_1clEv:
  144|      1|#define STATIC_NEW(type) [] () { \
  145|      1|    alignas(type) static char storage[sizeof(type)]; \
  146|      1|    return new(storage) type();} ()
unifiedcache.cpp:_ZZN6icu_78L9cacheInitER10UErrorCodeENK3$_0clEv:
  144|      1|#define STATIC_NEW(type) [] () { \
  145|      1|    alignas(type) static char storage[sizeof(type)]; \
  146|      1|    return new(storage) type();} ()
unifiedcache.cpp:_ZZN6icu_78L9cacheInitER10UErrorCodeENK3$_1clEv:
  144|      1|#define STATIC_NEW(type) [] () { \
  145|      1|    alignas(type) static char storage[sizeof(type)]; \
  146|      1|    return new(storage) type();} ()

uprv_isASCIILetter_78:
   52|   490k|uprv_isASCIILetter(char c) {
   53|       |#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY
   54|       |    return
   55|       |        ('a'<=c && c<='i') || ('j'<=c && c<='r') || ('s'<=c && c<='z') ||
   56|       |        ('A'<=c && c<='I') || ('J'<=c && c<='R') || ('S'<=c && c<='Z');
   57|       |#else
   58|   490k|    return ('a'<=c && c<='z') || ('A'<=c && c<='Z');
  ------------------
  |  Branch (58:13): [True: 270k, False: 219k]
  |  Branch (58:23): [True: 270k, False: 0]
  |  Branch (58:35): [True: 219k, False: 651]
  |  Branch (58:45): [True: 219k, False: 0]
  ------------------
   59|   490k|#endif
   60|   490k|}
uprv_toupper_78:
   63|   204k|uprv_toupper(char c) {
   64|       |#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY
   65|       |    if(('a'<=c && c<='i') || ('j'<=c && c<='r') || ('s'<=c && c<='z')) {
   66|       |        c=(char)(c+('A'-'a'));
   67|       |    }
   68|       |#else
   69|   204k|    if('a'<=c && c<='z') {
  ------------------
  |  Branch (69:8): [True: 0, False: 204k]
  |  Branch (69:18): [True: 0, False: 0]
  ------------------
   70|      0|        c=(char)(c+('A'-'a'));
   71|      0|    }
   72|   204k|#endif
   73|   204k|    return c;
   74|   204k|}
uprv_asciitolower_78:
  103|   758k|uprv_asciitolower(char c) {
  104|   758k|    if(0x41<=c && c<=0x5a) {
  ------------------
  |  Branch (104:8): [True: 758k, False: 1]
  |  Branch (104:19): [True: 5, False: 758k]
  ------------------
  105|      5|        c=(char)(c+0x20);
  106|      5|    }
  107|   758k|    return c;
  108|   758k|}
T_CString_toLowerCase_78:
  124|      1|{
  125|      1|    char* origPtr = str;
  126|       |
  127|      1|    if (str) {
  ------------------
  |  Branch (127:9): [True: 1, False: 0]
  ------------------
  128|      1|        do
  129|      6|            *str = uprv_tolower(*str);
  ------------------
  |  |   68|      6|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|      6|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|      6|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|      6|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|      6|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  130|      6|        while (*(str++));
  ------------------
  |  Branch (130:16): [True: 5, False: 1]
  ------------------
  131|      1|    }
  132|       |
  133|      1|    return origPtr;
  134|      1|}
T_CString_toUpperCase_78:
  138|  6.44k|{
  139|  6.44k|    char* origPtr = str;
  140|       |
  141|  6.44k|    if (str) {
  ------------------
  |  Branch (141:9): [True: 6.44k, False: 0]
  ------------------
  142|  6.44k|        do
  143|  25.7k|            *str = uprv_toupper(*str);
  ------------------
  |  | 1547|  25.7k|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|  25.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  25.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  25.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|  25.7k|        while (*(str++));
  ------------------
  |  Branch (144:16): [True: 19.3k, False: 6.44k]
  ------------------
  145|  6.44k|    }
  146|       |
  147|  6.44k|    return origPtr;
  148|  6.44k|}
T_CString_integerToString_78:
  158|  6.54k|{
  159|  6.54k|    char      tbuf[30];
  160|  6.54k|    int32_t   tbx    = sizeof(tbuf);
  161|  6.54k|    uint8_t   digit;
  162|  6.54k|    int32_t   length = 0;
  163|  6.54k|    uint32_t  uval;
  164|       |    
  165|  6.54k|    U_ASSERT(radix>=2 && radix<=16);
  ------------------
  |  |   35|  6.54k|#   define U_ASSERT(exp) (void)0
  ------------------
  166|  6.54k|    uval = (uint32_t) v;
  167|  6.54k|    if(v<0 && radix == 10) {
  ------------------
  |  Branch (167:8): [True: 0, False: 6.54k]
  |  Branch (167:15): [True: 0, False: 0]
  ------------------
  168|       |        /* Only in base 10 do we conside numbers to be signed. */
  169|      0|        uval = (uint32_t)(-v); 
  170|      0|        buffer[length++] = '-';
  171|      0|    }
  172|       |    
  173|  6.54k|    tbx = sizeof(tbuf)-1;
  174|  6.54k|    tbuf[tbx] = 0;   /* We are generating the digits backwards.  Null term the end. */
  175|  6.54k|    do {
  176|  6.54k|        digit = (uint8_t)(uval % radix);
  177|  6.54k|        tbuf[--tbx] = (char)(T_CString_itosOffset(digit));
  ------------------
  |  |   81|  6.54k|#define T_CString_itosOffset(a) ((a)<=9?('0'+(a)):('A'+(a)-10))
  |  |  ------------------
  |  |  |  Branch (81:34): [True: 6.54k, False: 0]
  |  |  ------------------
  ------------------
  178|  6.54k|        uval  = uval / radix;
  179|  6.54k|    } while (uval != 0);
  ------------------
  |  Branch (179:14): [True: 0, False: 6.54k]
  ------------------
  180|       |    
  181|       |    /* copy converted number into user buffer  */
  182|  6.54k|    uprv_strcpy(buffer+length, tbuf+tbx);
  ------------------
  |  |   36|  6.54k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  6.54k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  183|  6.54k|    length += sizeof(tbuf) - tbx -1;
  184|  6.54k|    return length;
  185|  6.54k|}
uprv_strnicmp_78:
  274|   135k|uprv_strnicmp(const char *str1, const char *str2, uint32_t n) {
  275|   135k|    if(str1==nullptr) {
  ------------------
  |  Branch (275:8): [True: 0, False: 135k]
  ------------------
  276|      0|        if(str2==nullptr) {
  ------------------
  |  Branch (276:12): [True: 0, False: 0]
  ------------------
  277|      0|            return 0;
  278|      0|        } else {
  279|      0|            return -1;
  280|      0|        }
  281|   135k|    } else if(str2==nullptr) {
  ------------------
  |  Branch (281:15): [True: 0, False: 135k]
  ------------------
  282|      0|        return 1;
  283|   135k|    } else {
  284|       |        /* compare non-nullptr strings lexically with lowercase */
  285|   135k|        int rc;
  286|   135k|        unsigned char c1, c2;
  287|       |
  288|   137k|        for(; n--;) {
  ------------------
  |  Branch (288:15): [True: 137k, False: 0]
  ------------------
  289|   137k|            c1=(unsigned char)*str1;
  290|   137k|            c2=(unsigned char)*str2;
  291|   137k|            if(c1==0) {
  ------------------
  |  Branch (291:16): [True: 0, False: 137k]
  ------------------
  292|      0|                if(c2==0) {
  ------------------
  |  Branch (292:20): [True: 0, False: 0]
  ------------------
  293|      0|                    return 0;
  294|      0|                } else {
  295|      0|                    return -1;
  296|      0|                }
  297|   137k|            } else if(c2==0) {
  ------------------
  |  Branch (297:23): [True: 0, False: 137k]
  ------------------
  298|      0|                return 1;
  299|   137k|            } else {
  300|       |                /* compare non-zero characters with lowercase */
  301|   137k|                rc=(int)(unsigned char)uprv_tolower(c1)-(int)(unsigned char)uprv_tolower(c2);
  ------------------
  |  |   68|   137k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|   137k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|   137k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|   137k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|   137k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                              rc=(int)(unsigned char)uprv_tolower(c1)-(int)(unsigned char)uprv_tolower(c2);
  ------------------
  |  |   68|   137k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|   137k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|   137k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|   137k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|   137k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  302|   137k|                if(rc!=0) {
  ------------------
  |  Branch (302:20): [True: 135k, False: 1.10k]
  ------------------
  303|   135k|                    return rc;
  304|   135k|                }
  305|   137k|            }
  306|  1.10k|            ++str1;
  307|  1.10k|            ++str2;
  308|  1.10k|        }
  309|   135k|    }
  310|       |
  311|      0|    return 0;
  312|   135k|}
uprv_strdup_78:
  315|  1.54k|uprv_strdup(const char *src) {
  316|  1.54k|    size_t len = uprv_strlen(src) + 1;
  ------------------
  |  |   37|  1.54k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.54k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  317|  1.54k|    char *dup = (char *) uprv_malloc(len);
  ------------------
  |  | 1524|  1.54k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.54k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.54k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.54k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  318|       |
  319|  1.54k|    if (dup) {
  ------------------
  |  Branch (319:9): [True: 1.54k, False: 0]
  ------------------
  320|  1.54k|        uprv_memcpy(dup, src, len);
  ------------------
  |  |   42|  1.54k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.54k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  1.54k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  1.54k|    _Pragma("clang diagnostic push") \
  |  |   45|  1.54k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  1.54k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.54k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  1.54k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.54k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  1.54k|    _Pragma("clang diagnostic pop") \
  |  |   49|  1.54k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  1.54k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  1.54k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.54k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  321|  1.54k|    }
  322|       |
  323|  1.54k|    return dup;
  324|  1.54k|}

_ZN6icu_789ErrorCodeD2Ev:
   24|    886|ErrorCode::~ErrorCode() {}

_ZN6icu_7821locale_available_initEv:
   58|      1|void U_CALLCONV locale_available_init() {
   59|       |    // This function is a friend of class Locale.
   60|       |    // This function is only invoked via umtx_initOnce().
   61|       |    
   62|       |    // for now, there is a hardcoded list, so just walk through that list and set it up.
   63|       |    //  Note: this function is a friend of class Locale.
   64|      1|    availableLocaleListCount = uloc_countAvailable();
  ------------------
  |  | 1110|      1|#define uloc_countAvailable U_ICU_ENTRY_POINT_RENAME(uloc_countAvailable)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   65|      1|    if(availableLocaleListCount) {
  ------------------
  |  Branch (65:8): [True: 1, False: 0]
  ------------------
   66|      1|       availableLocaleList = new Locale[availableLocaleListCount];
   67|      1|    }
   68|      1|    if (availableLocaleList == nullptr) {
  ------------------
  |  Branch (68:9): [True: 0, False: 1]
  ------------------
   69|      0|        availableLocaleListCount= 0;
   70|      0|    }
   71|    886|    for (int32_t locCount=availableLocaleListCount-1; locCount>=0; --locCount) {
  ------------------
  |  Branch (71:55): [True: 885, False: 1]
  ------------------
   72|    885|        availableLocaleList[locCount].setFromPOSIXID(uloc_getAvailable(locCount));
  ------------------
  |  | 1112|    885|#define uloc_getAvailable U_ICU_ENTRY_POINT_RENAME(uloc_getAvailable)
  |  |  ------------------
  |  |  |  |  123|    885|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    885|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    885|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   73|    885|    }
   74|      1|    ucln_common_registerCleanup(UCLN_COMMON_LOCALE_AVAILABLE, locale_available_cleanup);
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|      1|}
_ZN6icu_786Locale19getAvailableLocalesERi:
   79|  4.72k|{
   80|  4.72k|    umtx_initOnce(gInitOnceLocale, &locale_available_init);
   81|  4.72k|    count = availableLocaleListCount;
   82|  4.72k|    return availableLocaleList;
   83|  4.72k|}
uloc_getAvailable_78:
  223|    885|uloc_getAvailable(int32_t offset) {
  224|    885|    icu::ErrorCode status;
  225|    885|    _load_installedLocales(status);
  226|    885|    if (status.isFailure()) {
  ------------------
  |  Branch (226:9): [True: 0, False: 885]
  ------------------
  227|      0|        return nullptr;
  228|      0|    }
  229|    885|    if (offset > gAvailableLocaleCounts[0]) {
  ------------------
  |  Branch (229:9): [True: 0, False: 885]
  ------------------
  230|       |        // *status = U_ILLEGAL_ARGUMENT_ERROR;
  231|      0|        return nullptr;
  232|      0|    }
  233|    885|    return gAvailableLocaleNames[0][offset];
  234|    885|}
uloc_countAvailable_78:
  237|      1|uloc_countAvailable() {
  238|      1|    icu::ErrorCode status;
  239|      1|    _load_installedLocales(status);
  240|      1|    if (status.isFailure()) {
  ------------------
  |  Branch (240:9): [True: 0, False: 1]
  ------------------
  241|      0|        return 0;
  242|      0|    }
  243|      1|    return gAvailableLocaleCounts[0];
  244|      1|}
locavailable.cpp:_ZN12_GLOBAL__N_122_load_installedLocalesER10UErrorCode:
  216|    886|void _load_installedLocales(UErrorCode& status) {
  217|    886|    umtx_initOnce(ginstalledLocalesInitOnce, &loadInstalledLocales, status);
  218|    886|}
locavailable.cpp:_ZN12_GLOBAL__N_120loadInstalledLocalesER10UErrorCode:
  208|      1|void U_CALLCONV loadInstalledLocales(UErrorCode& status) {
  209|      1|    ucln_common_registerCleanup(UCLN_COMMON_ULOC, uloc_cleanup);
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  210|       |
  211|      1|    icu::LocalUResourceBundlePointer rb(ures_openDirect(nullptr, "res_index", &status));
  ------------------
  |  | 1693|      1|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  212|      1|    AvailableLocalesSink sink;
  213|      1|    ures_getAllItemsWithFallback(rb.getAlias(), "", sink, status);
  ------------------
  |  | 1658|      1|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  214|      1|}
locavailable.cpp:_ZN12_GLOBAL__N_120AvailableLocalesSink3putEPKcRN6icu_7813ResourceValueEaR10UErrorCode:
  103|      1|    void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) override {
  104|      1|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (104:13): [True: 0, False: 1]
  ------------------
  105|      1|        ResourceTable resIndexTable = value.getTable(status);
  106|      1|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (106:13): [True: 0, False: 1]
  ------------------
  107|      4|        for (int32_t i = 0; resIndexTable.getKeyAndValue(i, key, value); ++i) {
  ------------------
  |  Branch (107:29): [True: 3, False: 1]
  ------------------
  108|      3|            ULocAvailableType type;
  109|      3|            if (uprv_strcmp(key, "InstalledLocales") == 0) {
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (109:17): [True: 1, False: 2]
  ------------------
  110|      1|                type = ULOC_AVAILABLE_DEFAULT;
  111|      2|            } else if (uprv_strcmp(key, "AliasLocales") == 0) {
  ------------------
  |  |   38|      2|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      2|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (111:24): [True: 1, False: 1]
  ------------------
  112|      1|                type = ULOC_AVAILABLE_ONLY_LEGACY_ALIASES;
  113|      1|            } else {
  114|       |                // CLDRVersion, etc.
  115|      1|                continue;
  116|      1|            }
  117|      2|            ResourceTable availableLocalesTable = value.getTable(status);
  118|      2|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (118:17): [True: 0, False: 2]
  ------------------
  119|      0|                return;
  120|      0|            }
  121|      2|            gAvailableLocaleCounts[type] = availableLocalesTable.getSize();
  122|      2|            gAvailableLocaleNames[type] = static_cast<const char**>(
  123|      2|                uprv_malloc(gAvailableLocaleCounts[type] * sizeof(const char*)));
  ------------------
  |  | 1524|      2|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      2|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      2|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      2|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  124|      2|            if (gAvailableLocaleNames[type] == nullptr) {
  ------------------
  |  Branch (124:17): [True: 0, False: 2]
  ------------------
  125|      0|                status = U_MEMORY_ALLOCATION_ERROR;
  126|      0|                return;
  127|      0|            }
  128|    940|            for (int32_t j = 0; availableLocalesTable.getKeyAndValue(j, key, value); ++j) {
  ------------------
  |  Branch (128:33): [True: 938, False: 2]
  ------------------
  129|    938|                gAvailableLocaleNames[type][j] = key;
  130|    938|            }
  131|      2|        }
  132|      1|    }

_ZN6icu_7811LocaleBased12setLocaleIDsEPKcS2_R10UErrorCode:
   46|  9.33k|void LocaleBased::setLocaleIDs(const char* validID, const char* actualID, UErrorCode& status) {
   47|  9.33k|    setValidLocaleID(validID, status);
   48|  9.33k|    setActualLocaleID(actualID,status);
   49|  9.33k|}
_ZN6icu_7811LocaleBased11setLocaleIDEPKcRPNS_10CharStringER10UErrorCode:
   51|  18.6k|void LocaleBased::setLocaleID(const char* id, CharString*& dest, UErrorCode& status) {
   52|  18.6k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (52:9): [True: 0, False: 18.6k]
  ------------------
   53|  18.6k|    if (id == nullptr || *id == 0) {
  ------------------
  |  Branch (53:9): [True: 0, False: 18.6k]
  |  Branch (53:26): [True: 0, False: 18.6k]
  ------------------
   54|      0|        delete dest;
   55|      0|        dest = nullptr;
   56|  18.6k|    } else {
   57|  18.6k|        if (dest == nullptr) {
  ------------------
  |  Branch (57:13): [True: 18.6k, False: 0]
  ------------------
   58|  18.6k|            dest = new CharString(id, status);
   59|  18.6k|            if (dest == nullptr) {
  ------------------
  |  Branch (59:17): [True: 0, False: 18.6k]
  ------------------
   60|      0|                status = U_MEMORY_ALLOCATION_ERROR;
   61|      0|                return;
   62|      0|            }
   63|  18.6k|        } else {
   64|      0|            dest->copyFrom(id, status);
   65|      0|        }
   66|  18.6k|    }
   67|  18.6k|}

_ZN6icu_7811LocaleBasedC2ERPNS_10CharStringES3_:
  101|  9.33k|    valid(validAlias), actual(actualAlias) {
  102|  9.33k|}
_ZN6icu_7811LocaleBased16setValidLocaleIDEPKcR10UErrorCode:
  110|  9.33k|inline void LocaleBased::setValidLocaleID(const char* id, UErrorCode& status) {
  111|  9.33k|    setLocaleID(id, valid, status);
  112|  9.33k|}
_ZN6icu_7811LocaleBased17setActualLocaleIDEPKcR10UErrorCode:
  113|  9.33k|inline void LocaleBased::setActualLocaleID(const char* id, UErrorCode& status) {
  114|  9.33k|    setLocaleID(id, actual, status);
  115|  9.33k|}

_ZN6icu_7827locale_set_default_internalEPKcR10UErrorCode:
  168|      1|Locale *locale_set_default_internal(const char *id, UErrorCode& status) {
  169|       |    // Synchronize this entire function.
  170|      1|    Mutex lock(&gDefaultLocaleMutex);
  171|       |
  172|      1|    UBool canonicalize = false;
  173|       |
  174|       |    // If given a nullptr string for the locale id, grab the default
  175|       |    //   name from the system.
  176|       |    //   (Different from most other locale APIs, where a null name means use
  177|       |    //    the current ICU default locale.)
  178|      1|    if (id == nullptr) {
  ------------------
  |  Branch (178:9): [True: 1, False: 0]
  ------------------
  179|      1|        id = uprv_getDefaultLocaleID();   // This function not thread safe? TODO: verify.
  ------------------
  |  | 1505|      1|#define uprv_getDefaultLocaleID U_ICU_ENTRY_POINT_RENAME(uprv_getDefaultLocaleID)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|      1|        canonicalize = true; // always canonicalize host ID
  181|      1|    }
  182|       |
  183|      1|    CharString localeNameBuf =
  184|      1|        canonicalize ? ulocimp_canonicalize(id, status) : ulocimp_getName(id, status);
  ------------------
  |  | 1197|      1|#define ulocimp_canonicalize U_ICU_ENTRY_POINT_RENAME(ulocimp_canonicalize)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      canonicalize ? ulocimp_canonicalize(id, status) : ulocimp_getName(id, status);
  ------------------
  |  | 1204|      0|#define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (184:9): [True: 1, False: 0]
  ------------------
  185|       |
  186|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (186:9): [True: 0, False: 1]
  ------------------
  187|      0|        return gDefaultLocale;
  188|      0|    }
  189|       |
  190|      1|    if (gDefaultLocalesHashT == nullptr) {
  ------------------
  |  Branch (190:9): [True: 1, False: 0]
  ------------------
  191|      1|        gDefaultLocalesHashT = uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &status);
  ------------------
  |  | 1030|      1|#define uhash_open U_ICU_ENTRY_POINT_RENAME(uhash_open)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      gDefaultLocalesHashT = uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &status);
  ------------------
  |  | 1011|      1|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      gDefaultLocalesHashT = uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &status);
  ------------------
  |  |  993|      1|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|      1|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (192:13): [True: 0, False: 1]
  ------------------
  193|      0|            return gDefaultLocale;
  194|      0|        }
  195|      1|        uhash_setValueDeleter(gDefaultLocalesHashT, deleteLocale);
  ------------------
  |  | 1044|      1|#define uhash_setValueDeleter U_ICU_ENTRY_POINT_RENAME(uhash_setValueDeleter)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  196|      1|        ucln_common_registerCleanup(UCLN_COMMON_LOCALE, locale_cleanup);
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  197|      1|    }
  198|       |
  199|      1|    Locale* newDefault = static_cast<Locale*>(uhash_get(gDefaultLocalesHashT, localeNameBuf.data()));
  ------------------
  |  | 1007|      1|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  200|      1|    if (newDefault == nullptr) {
  ------------------
  |  Branch (200:9): [True: 1, False: 0]
  ------------------
  201|      1|        newDefault = new Locale(Locale::eBOGUS);
  202|      1|        if (newDefault == nullptr) {
  ------------------
  |  Branch (202:13): [True: 0, False: 1]
  ------------------
  203|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  204|      0|            return gDefaultLocale;
  205|      0|        }
  206|      1|        newDefault->init(localeNameBuf.data(), false);
  207|      1|        uhash_put(gDefaultLocalesHashT, const_cast<char*>(newDefault->getName()), newDefault, &status);
  ------------------
  |  | 1032|      1|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  208|      1|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (208:13): [True: 0, False: 1]
  ------------------
  209|      0|            return gDefaultLocale;
  210|      0|        }
  211|      1|    }
  212|      1|    gDefaultLocale = newDefault;
  213|      1|    return gDefaultLocale;
  214|      1|}
locale_get_default_78:
  230|   128k|{
  231|   128k|    U_NAMESPACE_USE
  ------------------
  |  |  112|   128k|#   define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
  ------------------
  232|   128k|    return Locale::getDefault().getName();
  233|   128k|}
_ZN6icu_786LocaleD2Ev:
  247|  45.2k|{
  248|  45.2k|    if ((baseName != fullName) && (baseName != fullNameBuffer)) {
  ------------------
  |  Branch (248:9): [True: 0, False: 45.2k]
  |  Branch (248:35): [True: 0, False: 0]
  ------------------
  249|      0|        uprv_free(baseName);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|      0|    }
  251|  45.2k|    baseName = nullptr;
  252|       |    /*if fullName is on the heap, we free it*/
  253|  45.2k|    if (fullName != fullNameBuffer)
  ------------------
  |  Branch (253:9): [True: 0, False: 45.2k]
  ------------------
  254|      0|    {
  255|      0|        uprv_free(fullName);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|      0|        fullName = nullptr;
  257|      0|    }
  258|  45.2k|}
_ZN6icu_786LocaleC2Ev:
  261|  15.0k|    : UObject(), fullName(fullNameBuffer), baseName(nullptr)
  262|  15.0k|{
  263|  15.0k|    init(nullptr, false);
  264|  15.0k|}
_ZN6icu_786LocaleC2ENS0_11ELocaleTypeE:
  272|      1|    : UObject(), fullName(fullNameBuffer), baseName(nullptr)
  273|      1|{
  274|      1|    setToBogus();
  275|      1|}
_ZN6icu_786LocaleC2EPKcS2_S2_S2_:
  282|    516|    : UObject(), fullName(fullNameBuffer), baseName(nullptr)
  283|    516|{
  284|    516|    if( (newLanguage==nullptr) && (newCountry == nullptr) && (newVariant == nullptr) )
  ------------------
  |  Branch (284:9): [True: 0, False: 516]
  |  Branch (284:35): [True: 0, False: 0]
  |  Branch (284:62): [True: 0, False: 0]
  ------------------
  285|      0|    {
  286|      0|        init(nullptr, false); /* shortcut */
  287|      0|    }
  288|    516|    else
  289|    516|    {
  290|    516|        UErrorCode status = U_ZERO_ERROR;
  291|    516|        int32_t lsize = 0;
  292|    516|        int32_t csize = 0;
  293|    516|        int32_t vsize = 0;
  294|    516|        int32_t ksize = 0;
  295|       |
  296|       |        // Check the sizes of the input strings.
  297|       |
  298|       |        // Language
  299|    516|        if ( newLanguage != nullptr )
  ------------------
  |  Branch (299:14): [True: 516, False: 0]
  ------------------
  300|    516|        {
  301|    516|            lsize = static_cast<int32_t>(uprv_strlen(newLanguage));
  ------------------
  |  |   37|    516|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|    516|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  302|    516|            if ( lsize < 0 || lsize > ULOC_STRING_LIMIT ) { // int32 wrap
  ------------------
  |  |   76|    516|#define ULOC_STRING_LIMIT 357913941
  ------------------
  |  Branch (302:18): [True: 0, False: 516]
  |  Branch (302:31): [True: 0, False: 516]
  ------------------
  303|      0|                setToBogus();
  304|      0|                return;
  305|      0|            }
  306|    516|        }
  307|       |
  308|    516|        CharString togo(newLanguage, lsize, status); // start with newLanguage
  309|       |
  310|       |        // _Country
  311|    516|        if ( newCountry != nullptr )
  ------------------
  |  Branch (311:14): [True: 0, False: 516]
  ------------------
  312|      0|        {
  313|      0|            csize = static_cast<int32_t>(uprv_strlen(newCountry));
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  314|      0|            if ( csize < 0 || csize > ULOC_STRING_LIMIT ) { // int32 wrap
  ------------------
  |  |   76|      0|#define ULOC_STRING_LIMIT 357913941
  ------------------
  |  Branch (314:18): [True: 0, False: 0]
  |  Branch (314:31): [True: 0, False: 0]
  ------------------
  315|      0|                setToBogus();
  316|      0|                return;
  317|      0|            }
  318|      0|        }
  319|       |
  320|       |        // _Variant
  321|    516|        if ( newVariant != nullptr )
  ------------------
  |  Branch (321:14): [True: 0, False: 516]
  ------------------
  322|      0|        {
  323|       |            // remove leading _'s
  324|      0|            while(newVariant[0] == SEP_CHAR)
  ------------------
  |  |  243|      0|#define SEP_CHAR '_'
  ------------------
  |  Branch (324:19): [True: 0, False: 0]
  ------------------
  325|      0|            {
  326|      0|                newVariant++;
  327|      0|            }
  328|       |
  329|       |            // remove trailing _'s
  330|      0|            vsize = static_cast<int32_t>(uprv_strlen(newVariant));
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  331|      0|            if ( vsize < 0 || vsize > ULOC_STRING_LIMIT ) { // int32 wrap
  ------------------
  |  |   76|      0|#define ULOC_STRING_LIMIT 357913941
  ------------------
  |  Branch (331:18): [True: 0, False: 0]
  |  Branch (331:31): [True: 0, False: 0]
  ------------------
  332|      0|                setToBogus();
  333|      0|                return;
  334|      0|            }
  335|      0|            while( (vsize>1) && (newVariant[vsize-1] == SEP_CHAR) )
  ------------------
  |  |  243|      0|#define SEP_CHAR '_'
  ------------------
  |  Branch (335:20): [True: 0, False: 0]
  |  Branch (335:33): [True: 0, False: 0]
  ------------------
  336|      0|            {
  337|      0|                vsize--;
  338|      0|            }
  339|      0|        }
  340|       |
  341|    516|        if ( newKeywords != nullptr)
  ------------------
  |  Branch (341:14): [True: 0, False: 516]
  ------------------
  342|      0|        {
  343|      0|            ksize = static_cast<int32_t>(uprv_strlen(newKeywords));
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  344|      0|            if ( ksize < 0 || ksize > ULOC_STRING_LIMIT ) {
  ------------------
  |  |   76|      0|#define ULOC_STRING_LIMIT 357913941
  ------------------
  |  Branch (344:18): [True: 0, False: 0]
  |  Branch (344:31): [True: 0, False: 0]
  ------------------
  345|      0|              setToBogus();
  346|      0|              return;
  347|      0|            }
  348|      0|        }
  349|       |
  350|       |        // We've checked the input sizes, now build up the full locale string..
  351|       |
  352|       |        // newLanguage is already copied
  353|       |
  354|    516|        if ( ( vsize != 0 ) || (csize != 0) )  // at least:  __v
  ------------------
  |  Branch (354:14): [True: 0, False: 516]
  |  Branch (354:32): [True: 0, False: 516]
  ------------------
  355|      0|        {                                      //            ^
  356|      0|            togo.append(SEP_CHAR, status);
  ------------------
  |  |  243|      0|#define SEP_CHAR '_'
  ------------------
  357|      0|        }
  358|       |
  359|    516|        if ( csize != 0 )
  ------------------
  |  Branch (359:14): [True: 0, False: 516]
  ------------------
  360|      0|        {
  361|      0|            togo.append(newCountry, status);
  362|      0|        }
  363|       |
  364|    516|        if ( vsize != 0)
  ------------------
  |  Branch (364:14): [True: 0, False: 516]
  ------------------
  365|      0|        {
  366|      0|            togo.append(SEP_CHAR, status)
  ------------------
  |  |  243|      0|#define SEP_CHAR '_'
  ------------------
  367|      0|                .append(newVariant, vsize, status);
  368|      0|        }
  369|       |
  370|    516|        if ( ksize != 0)
  ------------------
  |  Branch (370:14): [True: 0, False: 516]
  ------------------
  371|      0|        {
  372|      0|            if (uprv_strchr(newKeywords, '=')) {
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |  |  Branch (40:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  373|      0|                togo.append('@', status); /* keyword parsing */
  374|      0|            }
  375|      0|            else {
  376|      0|                togo.append('_', status); /* Variant parsing with a script */
  377|      0|                if ( vsize == 0) {
  ------------------
  |  Branch (377:22): [True: 0, False: 0]
  ------------------
  378|      0|                    togo.append('_', status); /* No country found */
  379|      0|                }
  380|      0|            }
  381|      0|            togo.append(newKeywords, status);
  382|      0|        }
  383|       |
  384|    516|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (384:13): [True: 0, False: 516]
  ------------------
  385|       |            // Something went wrong with appending, etc.
  386|      0|            setToBogus();
  387|      0|            return;
  388|      0|        }
  389|       |        // Parse it, because for example 'language' might really be a complete
  390|       |        // string.
  391|    516|        init(togo.data(), false);
  392|    516|    }
  393|    516|}
_ZN6icu_786LocaleC2ERKS0_:
  396|  27.2k|    : UObject(other), fullName(fullNameBuffer), baseName(nullptr)
  397|  27.2k|{
  398|  27.2k|    *this = other;
  399|  27.2k|}
_ZN6icu_786LocaleC2EOS0_:
  402|  3.80k|    : UObject(other), fullName(fullNameBuffer), baseName(fullName) {
  403|  3.80k|  *this = std::move(other);
  404|  3.80k|}
_ZN6icu_786LocaleaSERKS0_:
  406|  55.6k|Locale& Locale::operator=(const Locale& other) {
  407|  55.6k|    if (this == &other) {
  ------------------
  |  Branch (407:9): [True: 0, False: 55.6k]
  ------------------
  408|      0|        return *this;
  409|      0|    }
  410|       |
  411|  55.6k|    setToBogus();
  412|       |
  413|  55.6k|    if (other.fullName == other.fullNameBuffer) {
  ------------------
  |  Branch (413:9): [True: 55.6k, False: 0]
  ------------------
  414|  55.6k|        uprv_strcpy(fullNameBuffer, other.fullNameBuffer);
  ------------------
  |  |   36|  55.6k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  55.6k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  415|  55.6k|    } else if (other.fullName == nullptr) {
  ------------------
  |  Branch (415:16): [True: 0, False: 0]
  ------------------
  416|      0|        fullName = nullptr;
  417|      0|    } else {
  418|      0|        fullName = uprv_strdup(other.fullName);
  ------------------
  |  | 1541|      0|#define uprv_strdup U_ICU_ENTRY_POINT_RENAME(uprv_strdup)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  419|      0|        if (fullName == nullptr) return *this;
  ------------------
  |  Branch (419:13): [True: 0, False: 0]
  ------------------
  420|      0|    }
  421|       |
  422|  55.6k|    if (other.baseName == other.fullName) {
  ------------------
  |  Branch (422:9): [True: 55.6k, False: 0]
  ------------------
  423|  55.6k|        baseName = fullName;
  424|  55.6k|    } else if (other.baseName != nullptr) {
  ------------------
  |  Branch (424:16): [True: 0, False: 0]
  ------------------
  425|      0|        baseName = uprv_strdup(other.baseName);
  ------------------
  |  | 1541|      0|#define uprv_strdup U_ICU_ENTRY_POINT_RENAME(uprv_strdup)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  426|      0|        if (baseName == nullptr) return *this;
  ------------------
  |  Branch (426:13): [True: 0, False: 0]
  ------------------
  427|      0|    }
  428|       |
  429|  55.6k|    uprv_strcpy(language, other.language);
  ------------------
  |  |   36|  55.6k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  55.6k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  430|  55.6k|    uprv_strcpy(script, other.script);
  ------------------
  |  |   36|  55.6k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  55.6k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  431|  55.6k|    uprv_strcpy(country, other.country);
  ------------------
  |  |   36|  55.6k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  55.6k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  432|       |
  433|  55.6k|    variantBegin = other.variantBegin;
  434|  55.6k|    fIsBogus = other.fIsBogus;
  435|       |
  436|  55.6k|    return *this;
  437|  55.6k|}
_ZN6icu_786LocaleaSEOS0_:
  439|  3.80k|Locale& Locale::operator=(Locale&& other) noexcept {
  440|  3.80k|    if ((baseName != fullName) && (baseName != fullNameBuffer)) uprv_free(baseName);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (440:9): [True: 0, False: 3.80k]
  |  Branch (440:35): [True: 0, False: 0]
  ------------------
  441|  3.80k|    if (fullName != fullNameBuffer) uprv_free(fullName);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (441:9): [True: 0, False: 3.80k]
  ------------------
  442|       |
  443|  3.80k|    if (other.fullName == other.fullNameBuffer || other.baseName == other.fullNameBuffer) {
  ------------------
  |  Branch (443:9): [True: 3.80k, False: 0]
  |  Branch (443:51): [True: 0, False: 0]
  ------------------
  444|  3.80k|        uprv_strcpy(fullNameBuffer, other.fullNameBuffer);
  ------------------
  |  |   36|  3.80k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  3.80k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  445|  3.80k|    }
  446|  3.80k|    if (other.fullName == other.fullNameBuffer) {
  ------------------
  |  Branch (446:9): [True: 3.80k, False: 0]
  ------------------
  447|  3.80k|        fullName = fullNameBuffer;
  448|  3.80k|    } else {
  449|      0|        fullName = other.fullName;
  450|      0|    }
  451|       |
  452|  3.80k|    if (other.baseName == other.fullNameBuffer) {
  ------------------
  |  Branch (452:9): [True: 3.80k, False: 0]
  ------------------
  453|  3.80k|        baseName = fullNameBuffer;
  454|  3.80k|    } else if (other.baseName == other.fullName) {
  ------------------
  |  Branch (454:16): [True: 0, False: 0]
  ------------------
  455|      0|        baseName = fullName;
  456|      0|    } else {
  457|      0|        baseName = other.baseName;
  458|      0|    }
  459|       |
  460|  3.80k|    uprv_strcpy(language, other.language);
  ------------------
  |  |   36|  3.80k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  3.80k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  461|  3.80k|    uprv_strcpy(script, other.script);
  ------------------
  |  |   36|  3.80k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  3.80k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  462|  3.80k|    uprv_strcpy(country, other.country);
  ------------------
  |  |   36|  3.80k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  3.80k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  463|       |
  464|  3.80k|    variantBegin = other.variantBegin;
  465|  3.80k|    fIsBogus = other.fIsBogus;
  466|       |
  467|  3.80k|    other.baseName = other.fullName = other.fullNameBuffer;
  468|       |
  469|  3.80k|    return *this;
  470|  3.80k|}
_ZNK6icu_786LocaleeqERKS0_:
  479|  3.37k|{
  480|  3.37k|    return (uprv_strcmp(other.fullName, fullName) == 0);
  ------------------
  |  |   38|  3.37k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  3.37k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  481|  3.37k|}
_ZN6icu_786Locale4initEPKca:
 1832|  16.4k|{
 1833|  16.4k|    return localeID == nullptr ? *this = getDefault() : init(StringPiece{localeID}, canonicalize);
  ------------------
  |  Branch (1833:12): [True: 15.0k, False: 1.40k]
  ------------------
 1834|  16.4k|}
_ZN6icu_786Locale4initENS_11StringPieceEa:
 1838|  1.40k|{
 1839|  1.40k|    fIsBogus = false;
 1840|       |    /* Free our current storage */
 1841|  1.40k|    if ((baseName != fullName) && (baseName != fullNameBuffer)) {
  ------------------
  |  Branch (1841:9): [True: 517, False: 885]
  |  Branch (1841:35): [True: 517, False: 0]
  ------------------
 1842|    517|        uprv_free(baseName);
  ------------------
  |  | 1503|    517|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    517|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    517|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    517|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1843|    517|    }
 1844|  1.40k|    baseName = nullptr;
 1845|  1.40k|    if(fullName != fullNameBuffer) {
  ------------------
  |  Branch (1845:8): [True: 0, False: 1.40k]
  ------------------
 1846|      0|        uprv_free(fullName);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1847|      0|        fullName = fullNameBuffer;
 1848|      0|    }
 1849|       |
 1850|       |    // not a loop:
 1851|       |    // just an easy way to have a common error-exit
 1852|       |    // without goto and without another function
 1853|  1.40k|    do {
 1854|  1.40k|        char *separator;
 1855|  1.40k|        char *field[5] = {nullptr};
 1856|  1.40k|        int32_t fieldLen[5] = {0};
 1857|  1.40k|        int32_t fieldIdx;
 1858|  1.40k|        int32_t variantField;
 1859|  1.40k|        int32_t length;
 1860|  1.40k|        UErrorCode err;
 1861|       |
 1862|       |        /* preset all fields to empty */
 1863|  1.40k|        language[0] = script[0] = country[0] = 0;
 1864|       |
 1865|  1.40k|        const auto parse = [canonicalize](std::string_view localeID,
 1866|  1.40k|                                          char* name,
 1867|  1.40k|                                          int32_t nameCapacity,
 1868|  1.40k|                                          UErrorCode& status) {
 1869|  1.40k|            return ByteSinkUtil::viaByteSinkToTerminatedChars(
 1870|  1.40k|                name, nameCapacity,
 1871|  1.40k|                [&](ByteSink& sink, UErrorCode& status) {
 1872|  1.40k|                    if (canonicalize) {
 1873|  1.40k|                        ulocimp_canonicalize(localeID, sink, status);
 1874|  1.40k|                    } else {
 1875|  1.40k|                        ulocimp_getName(localeID, sink, status);
 1876|  1.40k|                    }
 1877|  1.40k|                },
 1878|  1.40k|                status);
 1879|  1.40k|        };
 1880|       |
 1881|       |        // "canonicalize" the locale ID to ICU/Java format
 1882|  1.40k|        err = U_ZERO_ERROR;
 1883|  1.40k|        length = parse(localeID, fullName, sizeof fullNameBuffer, err);
 1884|       |
 1885|  1.40k|        if (err == U_BUFFER_OVERFLOW_ERROR || length >= static_cast<int32_t>(sizeof(fullNameBuffer))) {
  ------------------
  |  Branch (1885:13): [True: 0, False: 1.40k]
  |  Branch (1885:47): [True: 0, False: 1.40k]
  ------------------
 1886|      0|            U_ASSERT(baseName == nullptr);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1887|       |            /*Go to heap for the fullName if necessary*/
 1888|      0|            char* newFullName = static_cast<char*>(uprv_malloc(sizeof(char) * (length + 1)));
  ------------------
  |  | 1524|      0|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1889|      0|            if (newFullName == nullptr) {
  ------------------
  |  Branch (1889:17): [True: 0, False: 0]
  ------------------
 1890|      0|                break; // error: out of memory
 1891|      0|            }
 1892|      0|            fullName = newFullName;
 1893|      0|            err = U_ZERO_ERROR;
 1894|      0|            length = parse(localeID, fullName, length + 1, err);
 1895|      0|        }
 1896|  1.40k|        if(U_FAILURE(err) || err == U_STRING_NOT_TERMINATED_WARNING) {
  ------------------
  |  Branch (1896:12): [True: 0, False: 1.40k]
  |  Branch (1896:30): [True: 0, False: 1.40k]
  ------------------
 1897|       |            /* should never occur */
 1898|      0|            break;
 1899|      0|        }
 1900|       |
 1901|  1.40k|        variantBegin = length;
 1902|       |
 1903|       |        /* after uloc_getName/canonicalize() we know that only '_' are separators */
 1904|       |        /* But _ could also appeared in timezone such as "en@timezone=America/Los_Angeles" */
 1905|  1.40k|        separator = field[0] = fullName;
 1906|  1.40k|        fieldIdx = 1;
 1907|  1.40k|        char* at = uprv_strchr(fullName, '@');
  ------------------
  |  |   40|  1.40k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  1.40k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1908|  2.54k|        while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != nullptr &&
  ------------------
  |  |   40|  2.54k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  2.54k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1908:16): [True: 1.14k, False: 1.40k]
  ------------------
 1909|  2.54k|               fieldIdx < UPRV_LENGTHOF(field)-1 &&
  ------------------
  |  |   99|  1.14k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1909:16): [True: 1.14k, False: 0]
  ------------------
 1910|  2.54k|               (at == nullptr || separator < at)) {
  ------------------
  |  Branch (1910:17): [True: 1.14k, False: 0]
  |  Branch (1910:34): [True: 0, False: 0]
  ------------------
 1911|  1.14k|            field[fieldIdx] = separator + 1;
 1912|  1.14k|            fieldLen[fieldIdx - 1] = static_cast<int32_t>(separator - field[fieldIdx - 1]);
 1913|  1.14k|            fieldIdx++;
 1914|  1.14k|        }
 1915|       |        // variant may contain @foo or .foo POSIX cruft; remove it
 1916|  1.40k|        separator = uprv_strchr(field[fieldIdx-1], '@');
  ------------------
  |  |   40|  1.40k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  1.40k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1917|  1.40k|        char* sep2 = uprv_strchr(field[fieldIdx-1], '.');
  ------------------
  |  |   40|  1.40k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  1.40k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1918|  1.40k|        if (separator!=nullptr || sep2!=nullptr) {
  ------------------
  |  Branch (1918:13): [True: 0, False: 1.40k]
  |  Branch (1918:35): [True: 0, False: 1.40k]
  ------------------
 1919|      0|            if (separator==nullptr || (sep2!=nullptr && separator > sep2)) {
  ------------------
  |  Branch (1919:17): [True: 0, False: 0]
  |  Branch (1919:40): [True: 0, False: 0]
  |  Branch (1919:57): [True: 0, False: 0]
  ------------------
 1920|      0|                separator = sep2;
 1921|      0|            }
 1922|      0|            fieldLen[fieldIdx - 1] = static_cast<int32_t>(separator - field[fieldIdx - 1]);
 1923|  1.40k|        } else {
 1924|  1.40k|            fieldLen[fieldIdx - 1] = length - static_cast<int32_t>(field[fieldIdx - 1] - fullName);
 1925|  1.40k|        }
 1926|       |
 1927|  1.40k|        if (fieldLen[0] >= static_cast<int32_t>(sizeof(language)))
  ------------------
  |  Branch (1927:13): [True: 0, False: 1.40k]
  ------------------
 1928|      0|        {
 1929|      0|            break; // error: the language field is too long
 1930|      0|        }
 1931|       |
 1932|  1.40k|        variantField = 1; /* Usually the 2nd one, except when a script or country is also used. */
 1933|  1.40k|        if (fieldLen[0] > 0) {
  ------------------
  |  Branch (1933:13): [True: 1.40k, False: 0]
  ------------------
 1934|       |            /* We have a language */
 1935|  1.40k|            uprv_memcpy(language, fullName, fieldLen[0]);
  ------------------
  |  |   42|  1.40k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.40k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  1.40k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  1.40k|    _Pragma("clang diagnostic push") \
  |  |   45|  1.40k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  1.40k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.40k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  1.40k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.40k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  1.40k|    _Pragma("clang diagnostic pop") \
  |  |   49|  1.40k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  1.40k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  1.40k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.40k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1936|  1.40k|            language[fieldLen[0]] = 0;
 1937|  1.40k|        }
 1938|  1.40k|        if (fieldLen[1] == 4 && uprv_isASCIILetter(field[1][0]) &&
  ------------------
  |  | 1514|    180|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|    180|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    180|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    180|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1938:13): [True: 180, False: 1.22k]
  |  Branch (1938:33): [True: 180, False: 0]
  ------------------
 1939|  1.40k|                uprv_isASCIILetter(field[1][1]) && uprv_isASCIILetter(field[1][2]) &&
  ------------------
  |  | 1514|    180|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|    180|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    180|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    180|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                              uprv_isASCIILetter(field[1][1]) && uprv_isASCIILetter(field[1][2]) &&
  ------------------
  |  | 1514|    180|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|    180|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    180|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    180|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1939:17): [True: 180, False: 0]
  |  Branch (1939:52): [True: 180, False: 0]
  ------------------
 1940|  1.40k|                uprv_isASCIILetter(field[1][3])) {
  ------------------
  |  | 1514|    180|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|    180|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    180|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    180|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1940:17): [True: 180, False: 0]
  ------------------
 1941|       |            /* We have at least a script */
 1942|    180|            uprv_memcpy(script, field[1], fieldLen[1]);
  ------------------
  |  |   42|    180|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    180|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|    180|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|    180|    _Pragma("clang diagnostic push") \
  |  |   45|    180|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|    180|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|    180|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|    180|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|    180|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|    180|    _Pragma("clang diagnostic pop") \
  |  |   49|    180|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|    180|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|    180|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    180|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1943|    180|            script[fieldLen[1]] = 0;
 1944|    180|            variantField++;
 1945|    180|        }
 1946|       |
 1947|  1.40k|        if (fieldLen[variantField] == 2 || fieldLen[variantField] == 3) {
  ------------------
  |  Branch (1947:13): [True: 950, False: 452]
  |  Branch (1947:44): [True: 13, False: 439]
  ------------------
 1948|       |            /* We have a country */
 1949|    963|            uprv_memcpy(country, field[variantField], fieldLen[variantField]);
  ------------------
  |  |   42|    963|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    963|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|    963|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|    963|    _Pragma("clang diagnostic push") \
  |  |   45|    963|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|    963|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|    963|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|    963|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|    963|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|    963|    _Pragma("clang diagnostic pop") \
  |  |   49|    963|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|    963|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|    963|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    963|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1950|    963|            country[fieldLen[variantField]] = 0;
 1951|    963|            variantField++;
 1952|    963|        } else if (fieldLen[variantField] == 0) {
  ------------------
  |  Branch (1952:20): [True: 439, False: 0]
  ------------------
 1953|    439|            variantField++; /* script or country empty but variant in next field (i.e. en__POSIX) */
 1954|    439|        }
 1955|       |
 1956|  1.40k|        if (fieldLen[variantField] > 0) {
  ------------------
  |  Branch (1956:13): [True: 3, False: 1.39k]
  ------------------
 1957|       |            /* We have a variant */
 1958|      3|            variantBegin = static_cast<int32_t>(field[variantField] - fullName);
 1959|      3|        }
 1960|       |
 1961|  1.40k|        err = U_ZERO_ERROR;
 1962|  1.40k|        initBaseName(err);
 1963|  1.40k|        if (U_FAILURE(err)) {
  ------------------
  |  Branch (1963:13): [True: 0, False: 1.40k]
  ------------------
 1964|      0|            break;
 1965|      0|        }
 1966|       |
 1967|  1.40k|        if (canonicalize) {
  ------------------
  |  Branch (1967:13): [True: 885, False: 517]
  ------------------
 1968|    885|            if (!isKnownCanonicalizedLocale(fullName, err)) {
  ------------------
  |  Branch (1968:17): [True: 717, False: 168]
  ------------------
 1969|    717|                CharString replaced;
 1970|       |                // Not sure it is already canonicalized
 1971|    717|                if (canonicalizeLocale(*this, replaced, err)) {
  ------------------
  |  Branch (1971:21): [True: 0, False: 717]
  ------------------
 1972|      0|                    U_ASSERT(U_SUCCESS(err));
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1973|       |                    // If need replacement, call init again.
 1974|      0|                    init(replaced.data(), false);
 1975|      0|                }
 1976|    717|                if (U_FAILURE(err)) {
  ------------------
  |  Branch (1976:21): [True: 0, False: 717]
  ------------------
 1977|      0|                    break;
 1978|      0|                }
 1979|    717|            }
 1980|    885|        }   // if (canonicalize) {
 1981|       |
 1982|       |        // successful end of init()
 1983|  1.40k|        return *this;
 1984|  1.40k|    } while(0); /*loop doesn't iterate*/
  ------------------
  |  Branch (1984:13): [Folded - Ignored]
  ------------------
 1985|       |
 1986|       |    // when an error occurs, then set this object to "bogus" (there is no UErrorCode here)
 1987|      0|    setToBogus();
 1988|       |
 1989|      0|    return *this;
 1990|  1.40k|}
_ZN6icu_786Locale12initBaseNameER10UErrorCode:
 1999|  1.40k|Locale::initBaseName(UErrorCode &status) {
 2000|  1.40k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (2000:9): [True: 0, False: 1.40k]
  ------------------
 2001|      0|        return;
 2002|      0|    }
 2003|  1.40k|    U_ASSERT(baseName==nullptr || baseName==fullName);
  ------------------
  |  |   35|  1.40k|#   define U_ASSERT(exp) (void)0
  ------------------
 2004|  1.40k|    const char *atPtr = uprv_strchr(fullName, '@');
  ------------------
  |  |   40|  1.40k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  1.40k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2005|  1.40k|    const char *eqPtr = uprv_strchr(fullName, '=');
  ------------------
  |  |   40|  1.40k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  1.40k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2006|  1.40k|    if (atPtr && eqPtr && atPtr < eqPtr) {
  ------------------
  |  Branch (2006:9): [True: 0, False: 1.40k]
  |  Branch (2006:18): [True: 0, False: 0]
  |  Branch (2006:27): [True: 0, False: 0]
  ------------------
 2007|       |        // Key words exist.
 2008|      0|        int32_t baseNameLength = static_cast<int32_t>(atPtr - fullName);
 2009|      0|        char* newBaseName = static_cast<char*>(uprv_malloc(baseNameLength + 1));
  ------------------
  |  | 1524|      0|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2010|      0|        if (newBaseName == nullptr) {
  ------------------
  |  Branch (2010:13): [True: 0, False: 0]
  ------------------
 2011|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 2012|      0|            return;
 2013|      0|        }
 2014|      0|        baseName = newBaseName;
 2015|      0|        uprv_strncpy(baseName, fullName, baseNameLength);
  ------------------
  |  |   43|      0|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2016|      0|        baseName[baseNameLength] = 0;
 2017|       |
 2018|       |        // The original computation of variantBegin leaves it equal to the length
 2019|       |        // of fullName if there is no variant.  It should instead be
 2020|       |        // the length of the baseName.
 2021|      0|        if (variantBegin > baseNameLength) {
  ------------------
  |  Branch (2021:13): [True: 0, False: 0]
  ------------------
 2022|      0|            variantBegin = baseNameLength;
 2023|      0|        }
 2024|  1.40k|    } else {
 2025|  1.40k|        baseName = fullName;
 2026|  1.40k|    }
 2027|  1.40k|}
_ZNK6icu_786Locale8hashCodeEv:
 2032|  4.40k|{
 2033|  4.40k|    return ustr_hashCharsN(fullName, static_cast<int32_t>(uprv_strlen(fullName)));
  ------------------
  |  | 1878|  4.40k|#define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN)
  |  |  ------------------
  |  |  |  |  123|  4.40k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.40k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.40k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return ustr_hashCharsN(fullName, static_cast<int32_t>(uprv_strlen(fullName)));
  ------------------
  |  |   37|  4.40k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  4.40k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2034|  4.40k|}
_ZN6icu_786Locale10setToBogusEv:
 2037|  55.6k|Locale::setToBogus() {
 2038|       |    /* Free our current storage */
 2039|  55.6k|    if((baseName != fullName) && (baseName != fullNameBuffer)) {
  ------------------
  |  Branch (2039:8): [True: 42.3k, False: 13.2k]
  |  Branch (2039:34): [True: 42.3k, False: 0]
  ------------------
 2040|  42.3k|        uprv_free(baseName);
  ------------------
  |  | 1503|  42.3k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  42.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  42.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  42.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2041|  42.3k|    }
 2042|  55.6k|    baseName = nullptr;
 2043|  55.6k|    if(fullName != fullNameBuffer) {
  ------------------
  |  Branch (2043:8): [True: 0, False: 55.6k]
  ------------------
 2044|      0|        uprv_free(fullName);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2045|      0|        fullName = fullNameBuffer;
 2046|      0|    }
 2047|  55.6k|    *fullNameBuffer = 0;
 2048|  55.6k|    *language = 0;
 2049|  55.6k|    *script = 0;
 2050|  55.6k|    *country = 0;
 2051|  55.6k|    fIsBogus = true;
 2052|  55.6k|    variantBegin = 0;
 2053|  55.6k|}
_ZN6icu_786Locale10getDefaultEv:
 2057|   143k|{
 2058|   143k|    {
 2059|   143k|        Mutex lock(&gDefaultLocaleMutex);
 2060|   143k|        if (gDefaultLocale != nullptr) {
  ------------------
  |  Branch (2060:13): [True: 143k, False: 1]
  ------------------
 2061|   143k|            return *gDefaultLocale;
 2062|   143k|        }
 2063|   143k|    }
 2064|      1|    UErrorCode status = U_ZERO_ERROR;
 2065|      1|    return *locale_set_default_internal(nullptr, status);
 2066|   143k|}
_ZN6icu_786Locale14setFromPOSIXIDEPKc:
 2267|    885|{
 2268|    885|    init(posixID, true);
 2269|    885|}
_ZNK6icu_786Locale15getKeywordValueEPKcPciR10UErrorCode:
 2606|  9.33k|{
 2607|  9.33k|    return uloc_getKeywordValue(fullName, keywordName, buffer, bufLen, &status);
  ------------------
  |  | 1130|  9.33k|#define uloc_getKeywordValue U_ICU_ENTRY_POINT_RENAME(uloc_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2608|  9.33k|}
_ZNK6icu_786Locale11getBaseNameEv:
 2748|    919|Locale::getBaseName() const {
 2749|    919|    return baseName;
 2750|    919|}
locid.cpp:_ZN6icu_7812_GLOBAL__N_118canonicalizeLocaleERKNS_6LocaleERNS_10CharStringER10UErrorCode:
 1776|    717|{
 1777|    717|    if (U_FAILURE(status)) { return false; }
  ------------------
  |  Branch (1777:9): [True: 0, False: 717]
  ------------------
 1778|    717|    AliasReplacer replacer(status);
 1779|    717|    return replacer.replace(locale, out, status);
 1780|    717|}
locid.cpp:_ZN6icu_7812_GLOBAL__N_113AliasReplacerC2ER10UErrorCode:
 1062|    717|            language(nullptr), script(nullptr), region(nullptr),
 1063|    717|            extensions(nullptr),
 1064|       |            // store value in variants only once
 1065|    717|            variants(nullptr,
 1066|    717|                     ([](UElement e1, UElement e2) -> UBool {
 1067|    717|                       return 0==uprv_strcmp((const char*)e1.pointer,
 1068|    717|                                             (const char*)e2.pointer);}),
 1069|    717|                     status),
 1070|    717|            data(nullptr) {
 1071|    717|    }
locid.cpp:_ZN6icu_7812_GLOBAL__N_113AliasReplacer7replaceERKNS_6LocaleERNS_10CharStringER10UErrorCode:
 1627|    717|{
 1628|    717|    data = AliasData::singleton(status);
 1629|    717|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1629:9): [True: 0, False: 717]
  ------------------
 1630|      0|        return false;
 1631|      0|    }
 1632|    717|    U_ASSERT(data != nullptr);
  ------------------
  |  |   35|    717|#   define U_ASSERT(exp) (void)0
  ------------------
 1633|    717|    out.clear();
 1634|    717|    language = locale.getLanguage();
 1635|    717|    if (!notEmpty(language)) {
  ------------------
  |  Branch (1635:9): [True: 0, False: 717]
  ------------------
 1636|      0|        language = nullptr;
 1637|      0|    }
 1638|    717|    script = locale.getScript();
 1639|    717|    if (!notEmpty(script)) {
  ------------------
  |  Branch (1639:9): [True: 612, False: 105]
  ------------------
 1640|    612|        script = nullptr;
 1641|    612|    }
 1642|    717|    region = locale.getCountry();
 1643|    717|    if (!notEmpty(region)) {
  ------------------
  |  Branch (1643:9): [True: 189, False: 528]
  ------------------
 1644|    189|        region = nullptr;
 1645|    189|    }
 1646|    717|    const char* variantsStr = locale.getVariant();
 1647|    717|    CharString variantsBuff(variantsStr, -1, status);
 1648|    717|    if (!variantsBuff.isEmpty()) {
  ------------------
  |  Branch (1648:9): [True: 1, False: 716]
  ------------------
 1649|      1|        if (U_FAILURE(status)) { return false; }
  ------------------
  |  Branch (1649:13): [True: 0, False: 1]
  ------------------
 1650|      1|        char* start = variantsBuff.data();
 1651|      1|        T_CString_toLowerCase(start);
  ------------------
  |  |   69|      1|#define T_CString_toLowerCase U_ICU_ENTRY_POINT_RENAME(T_CString_toLowerCase)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1652|      1|        char* end;
 1653|      1|        while ((end = uprv_strchr(start, SEP_CHAR)) != nullptr &&
  ------------------
  |  |   40|      1|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1653:16): [True: 0, False: 1]
  ------------------
 1654|      1|               U_SUCCESS(status)) {
  ------------------
  |  Branch (1654:16): [True: 0, False: 0]
  ------------------
 1655|      0|            *end = NULL_CHAR;  // null terminate inside variantsBuff
  ------------------
  |  |  244|      0|#define NULL_CHAR '\0'
  ------------------
 1656|       |            // do not add "" or duplicate data to variants
 1657|      0|            if (*start && !variants.contains(start)) {
  ------------------
  |  Branch (1657:17): [True: 0, False: 0]
  |  Branch (1657:27): [True: 0, False: 0]
  ------------------
 1658|      0|                variants.addElement(start, status);
 1659|      0|            }
 1660|      0|            start = end + 1;
 1661|      0|        }
 1662|       |        // do not add "" or duplicate data to variants
 1663|      1|        if (*start && !variants.contains(start)) {
  ------------------
  |  Branch (1663:13): [True: 1, False: 0]
  |  Branch (1663:23): [True: 1, False: 0]
  ------------------
 1664|      1|            variants.addElement(start, status);
 1665|      1|        }
 1666|      1|    }
 1667|    717|    if (U_FAILURE(status)) { return false; }
  ------------------
  |  Branch (1667:9): [True: 0, False: 717]
  ------------------
 1668|       |
 1669|       |    // Sort the variants
 1670|    717|    variants.sort([](UElement e1, UElement e2) -> int32_t {
 1671|    717|        return uprv_strcmp((const char*)e1.pointer, (const char*)e2.pointer);
 1672|    717|    }, status);
 1673|       |
 1674|       |    // A changed count to assert when loop too many times.
 1675|    717|    int changed = 0;
 1676|       |    // A UVector to to hold CharString allocated by the replace* method
 1677|       |    // and freed when out of scope from his function.
 1678|    717|    UVector stringsToBeFreed([](void *obj) { delete static_cast<CharString*>(obj); },
 1679|    717|                             nullptr, 10, status);
 1680|    717|    while (U_SUCCESS(status)) {
  ------------------
  |  Branch (1680:12): [True: 717, False: 0]
  ------------------
 1681|       |        // Something wrong with the data cause looping here more than 10 times
 1682|       |        // already.
 1683|    717|        U_ASSERT(changed < 5);
  ------------------
  |  |   35|    717|#   define U_ASSERT(exp) (void)0
  ------------------
 1684|       |        // From observation of key in data/misc/metadata.txt
 1685|       |        // we know currently we only need to search in the following combination
 1686|       |        // of fields for type in languageAlias:
 1687|       |        // * lang_region_variant
 1688|       |        // * lang_region
 1689|       |        // * lang_variant
 1690|       |        // * lang
 1691|       |        // * und_variant
 1692|       |        // This assumption is ensured by the U_ASSERT in readLanguageAlias
 1693|       |        //
 1694|       |        //                      lang  REGION variant
 1695|    717|        if (    replaceLanguage(true, true,  true,  stringsToBeFreed, status) ||
  ------------------
  |  Branch (1695:17): [True: 0, False: 717]
  ------------------
 1696|    717|                replaceLanguage(true, true,  false, stringsToBeFreed, status) ||
  ------------------
  |  Branch (1696:17): [True: 0, False: 717]
  ------------------
 1697|    717|                replaceLanguage(true, false, true,  stringsToBeFreed, status) ||
  ------------------
  |  Branch (1697:17): [True: 0, False: 717]
  ------------------
 1698|    717|                replaceLanguage(true, false, false, stringsToBeFreed, status) ||
  ------------------
  |  Branch (1698:17): [True: 0, False: 717]
  ------------------
 1699|    717|                replaceLanguage(false,false, true,  stringsToBeFreed, status) ||
  ------------------
  |  Branch (1699:17): [True: 0, False: 717]
  ------------------
 1700|    717|                replaceTerritory(stringsToBeFreed, status) ||
  ------------------
  |  Branch (1700:17): [True: 0, False: 717]
  ------------------
 1701|    717|                replaceScript(status) ||
  ------------------
  |  Branch (1701:17): [True: 0, False: 717]
  ------------------
 1702|    717|                replaceVariant(status)) {
  ------------------
  |  Branch (1702:17): [True: 0, False: 717]
  ------------------
 1703|       |            // Some values in data is changed, try to match from the beginning
 1704|       |            // again.
 1705|      0|            changed++;
 1706|      0|            continue;
 1707|      0|        }
 1708|       |        // Nothing changed. Break out.
 1709|    717|        break;
 1710|    717|    }  // while(1)
 1711|       |
 1712|    717|    if (U_FAILURE(status)) { return false; }
  ------------------
  |  Branch (1712:9): [True: 0, False: 717]
  ------------------
 1713|       |    // Nothing changed and we know the order of the variants are not change
 1714|       |    // because we have no variant or only one.
 1715|    717|    const char* extensionsStr = locale_getKeywordsStart(locale.getName());
  ------------------
  |  |  138|    717|#define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart)
  |  |  ------------------
  |  |  |  |  123|    717|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    717|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    717|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1716|    717|    if (changed == 0 && variants.size() <= 1 && extensionsStr == nullptr) {
  ------------------
  |  Branch (1716:9): [True: 717, False: 0]
  |  Branch (1716:25): [True: 717, False: 0]
  |  Branch (1716:49): [True: 717, False: 0]
  ------------------
 1717|    717|        return false;
 1718|    717|    }
 1719|      0|    outputToString(out, status);
 1720|      0|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1720:9): [True: 0, False: 0]
  ------------------
 1721|      0|        return false;
 1722|      0|    }
 1723|      0|    if (extensionsStr != nullptr) {
  ------------------
  |  Branch (1723:9): [True: 0, False: 0]
  ------------------
 1724|      0|        changed = 0;
 1725|      0|        Locale temp(locale);
 1726|      0|        LocalPointer<icu::StringEnumeration> iter(locale.createKeywords(status));
 1727|      0|        if (U_SUCCESS(status) && !iter.isNull()) {
  ------------------
  |  Branch (1727:13): [True: 0, False: 0]
  |  Branch (1727:34): [True: 0, False: 0]
  ------------------
 1728|      0|            const char* key;
 1729|      0|            while ((key = iter->next(nullptr, status)) != nullptr) {
  ------------------
  |  Branch (1729:20): [True: 0, False: 0]
  ------------------
 1730|      0|                if (uprv_strcmp("sd", key) == 0 || uprv_strcmp("rg", key) == 0 ||
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                              if (uprv_strcmp("sd", key) == 0 || uprv_strcmp("rg", key) == 0 ||
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1730:21): [True: 0, False: 0]
  |  Branch (1730:52): [True: 0, False: 0]
  ------------------
 1731|      0|                        uprv_strcmp("t", key) == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1731:25): [True: 0, False: 0]
  ------------------
 1732|      0|                    auto value = locale.getKeywordValue<CharString>(key, status);
 1733|      0|                    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1733:25): [True: 0, False: 0]
  ------------------
 1734|      0|                        status = U_ZERO_ERROR;
 1735|      0|                        continue;
 1736|      0|                    }
 1737|      0|                    CharString replacement;
 1738|      0|                    if (uprv_strlen(key) == 2) {
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1738:25): [True: 0, False: 0]
  ------------------
 1739|      0|                        if (replaceSubdivision(value.toStringPiece(), replacement, status)) {
  ------------------
  |  Branch (1739:29): [True: 0, False: 0]
  ------------------
 1740|      0|                            changed++;
 1741|      0|                            temp.setKeywordValue(key, replacement.data(), status);
 1742|      0|                        }
 1743|      0|                    } else {
 1744|      0|                        U_ASSERT(uprv_strcmp(key, "t") == 0);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1745|      0|                        if (replaceTransformedExtensions(value, replacement, status)) {
  ------------------
  |  Branch (1745:29): [True: 0, False: 0]
  ------------------
 1746|      0|                            changed++;
 1747|      0|                            temp.setKeywordValue(key, replacement.data(), status);
 1748|      0|                        }
 1749|      0|                    }
 1750|      0|                    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1750:25): [True: 0, False: 0]
  ------------------
 1751|      0|                        return false;
 1752|      0|                    }
 1753|      0|                }
 1754|      0|            }
 1755|      0|        }
 1756|      0|        if (changed != 0) {
  ------------------
  |  Branch (1756:13): [True: 0, False: 0]
  ------------------
 1757|      0|            extensionsStr = locale_getKeywordsStart(temp.getName());
  ------------------
  |  |  138|      0|#define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1758|      0|        }
 1759|      0|        out.append(extensionsStr, status);
 1760|      0|    }
 1761|      0|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1761:9): [True: 0, False: 0]
  ------------------
 1762|      0|        return false;
 1763|      0|    }
 1764|       |    // If the tag is not changed, return.
 1765|      0|    if (uprv_strcmp(out.data(), locale.getName()) == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1765:9): [True: 0, False: 0]
  ------------------
 1766|      0|        out.clear();
 1767|      0|        return false;
 1768|      0|    }
 1769|      0|    return true;
 1770|      0|}
locid.cpp:_ZN6icu_7812_GLOBAL__N_19AliasData9singletonER10UErrorCode:
  623|    717|    static const AliasData* singleton(UErrorCode& status) {
  624|    717|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (624:13): [True: 0, False: 717]
  ------------------
  625|       |            // Do not get into loadData if the status already has error.
  626|      0|            return nullptr;
  627|      0|        }
  628|    717|        umtx_initOnce(AliasData::gInitOnce, &AliasData::loadData, status);
  629|    717|        return gSingleton;
  630|    717|    }
locid.cpp:_ZN6icu_7812_GLOBAL__N_19AliasData8loadDataER10UErrorCode:
  896|      1|{
  897|       |#ifdef LOCALE_CANONICALIZATION_DEBUG
  898|       |    UDate start = uprv_getRawUTCtime();
  899|       |#endif  // LOCALE_CANONICALIZATION_DEBUG
  900|      1|    ucln_common_registerCleanup(UCLN_COMMON_LOCALE_ALIAS, cleanup);
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  901|      1|    AliasDataBuilder builder;
  902|      1|    gSingleton = builder.build(status);
  903|       |#ifdef LOCALE_CANONICALIZATION_DEBUG
  904|       |    UDate end = uprv_getRawUTCtime();
  905|       |    printf("AliasData::loadData took total %f ms\n", end - start);
  906|       |#endif  // LOCALE_CANONICALIZATION_DEBUG
  907|      1|}
locid.cpp:_ZN6icu_7812_GLOBAL__N_116AliasDataBuilderC2Ev:
  544|      1|    AliasDataBuilder() {
  545|      1|    }
locid.cpp:_ZN6icu_7812_GLOBAL__N_116AliasDataBuilder5buildER10UErrorCode:
  913|      1|AliasDataBuilder::build(UErrorCode &status) {
  914|      1|    if (U_FAILURE(status)) { return nullptr; }
  ------------------
  |  Branch (914:9): [True: 0, False: 1]
  ------------------
  915|       |
  916|      1|    LocalUResourceBundlePointer metadata(
  917|      1|        ures_openDirect(nullptr, "metadata", &status));
  ------------------
  |  | 1693|      1|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  918|      1|    LocalUResourceBundlePointer metadataAlias(
  919|      1|        ures_getByKey(metadata.getAlias(), "alias", nullptr, &status));
  ------------------
  |  | 1661|      1|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  920|      1|    LocalUResourceBundlePointer languageAlias(
  921|      1|        ures_getByKey(metadataAlias.getAlias(), "language", nullptr, &status));
  ------------------
  |  | 1661|      1|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  922|      1|    LocalUResourceBundlePointer scriptAlias(
  923|      1|        ures_getByKey(metadataAlias.getAlias(), "script", nullptr, &status));
  ------------------
  |  | 1661|      1|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  924|      1|    LocalUResourceBundlePointer territoryAlias(
  925|      1|        ures_getByKey(metadataAlias.getAlias(), "territory", nullptr, &status));
  ------------------
  |  | 1661|      1|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  926|      1|    LocalUResourceBundlePointer variantAlias(
  927|      1|        ures_getByKey(metadataAlias.getAlias(), "variant", nullptr, &status));
  ------------------
  |  | 1661|      1|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  928|      1|    LocalUResourceBundlePointer subdivisionAlias(
  929|      1|        ures_getByKey(metadataAlias.getAlias(), "subdivision", nullptr, &status));
  ------------------
  |  | 1661|      1|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  930|       |
  931|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (931:9): [True: 0, False: 1]
  ------------------
  932|      0|        return nullptr;
  933|      0|    }
  934|      1|    int32_t languagesLength = 0, scriptLength = 0, territoryLength = 0,
  935|      1|            variantLength = 0, subdivisionLength = 0;
  936|       |
  937|       |    // Read the languageAlias into languageTypes, languageReplacementIndexes
  938|       |    // and strings
  939|      1|    UniqueCharStrings strings(status);
  940|      1|    LocalMemory<const char*> languageTypes;
  941|      1|    LocalMemory<int32_t> languageReplacementIndexes;
  942|      1|    readLanguageAlias(languageAlias.getAlias(),
  943|      1|                      &strings,
  944|      1|                      languageTypes,
  945|      1|                      languageReplacementIndexes,
  946|      1|                      languagesLength,
  947|      1|                      status);
  948|       |
  949|       |    // Read the scriptAlias into scriptTypes, scriptReplacementIndexes
  950|       |    // and strings
  951|      1|    LocalMemory<const char*> scriptTypes;
  952|      1|    LocalMemory<int32_t> scriptReplacementIndexes;
  953|      1|    readScriptAlias(scriptAlias.getAlias(),
  954|      1|                    &strings,
  955|      1|                    scriptTypes,
  956|      1|                    scriptReplacementIndexes,
  957|      1|                    scriptLength,
  958|      1|                    status);
  959|       |
  960|       |    // Read the territoryAlias into territoryTypes, territoryReplacementIndexes
  961|       |    // and strings
  962|      1|    LocalMemory<const char*> territoryTypes;
  963|      1|    LocalMemory<int32_t> territoryReplacementIndexes;
  964|      1|    readTerritoryAlias(territoryAlias.getAlias(),
  965|      1|                       &strings,
  966|      1|                       territoryTypes,
  967|      1|                       territoryReplacementIndexes,
  968|      1|                       territoryLength, status);
  969|       |
  970|       |    // Read the variantAlias into variantTypes, variantReplacementIndexes
  971|       |    // and strings
  972|      1|    LocalMemory<const char*> variantTypes;
  973|      1|    LocalMemory<int32_t> variantReplacementIndexes;
  974|      1|    readVariantAlias(variantAlias.getAlias(),
  975|      1|                     &strings,
  976|      1|                     variantTypes,
  977|      1|                     variantReplacementIndexes,
  978|      1|                     variantLength, status);
  979|       |
  980|       |    // Read the subdivisionAlias into subdivisionTypes, subdivisionReplacementIndexes
  981|       |    // and strings
  982|      1|    LocalMemory<const char*> subdivisionTypes;
  983|      1|    LocalMemory<int32_t> subdivisionReplacementIndexes;
  984|      1|    readSubdivisionAlias(subdivisionAlias.getAlias(),
  985|      1|                         &strings,
  986|      1|                         subdivisionTypes,
  987|      1|                         subdivisionReplacementIndexes,
  988|      1|                         subdivisionLength, status);
  989|       |
  990|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (990:9): [True: 0, False: 1]
  ------------------
  991|      0|        return nullptr;
  992|      0|    }
  993|       |
  994|       |    // We can only use strings after freeze it.
  995|      1|    strings.freeze();
  996|       |
  997|       |    // Build the languageMap from languageTypes & languageReplacementIndexes
  998|      1|    CharStringMap languageMap(490, status);
  999|    501|    for (int32_t i = 0; U_SUCCESS(status) && i < languagesLength; i++) {
  ------------------
  |  Branch (999:25): [True: 501, False: 0]
  |  Branch (999:46): [True: 500, False: 1]
  ------------------
 1000|    500|        languageMap.put(languageTypes[i],
 1001|    500|                        strings.get(languageReplacementIndexes[i]),
 1002|    500|                        status);
 1003|    500|    }
 1004|       |
 1005|       |    // Build the scriptMap from scriptTypes & scriptReplacementIndexes
 1006|      1|    CharStringMap scriptMap(1, status);
 1007|      2|    for (int32_t i = 0; U_SUCCESS(status) && i < scriptLength; i++) {
  ------------------
  |  Branch (1007:25): [True: 2, False: 0]
  |  Branch (1007:46): [True: 1, False: 1]
  ------------------
 1008|      1|        scriptMap.put(scriptTypes[i],
 1009|      1|                      strings.get(scriptReplacementIndexes[i]),
 1010|      1|                      status);
 1011|      1|    }
 1012|       |
 1013|       |    // Build the territoryMap from territoryTypes & territoryReplacementIndexes
 1014|      1|    CharStringMap territoryMap(650, status);
 1015|    641|    for (int32_t i = 0; U_SUCCESS(status) && i < territoryLength; i++) {
  ------------------
  |  Branch (1015:25): [True: 641, False: 0]
  |  Branch (1015:46): [True: 640, False: 1]
  ------------------
 1016|    640|        territoryMap.put(territoryTypes[i],
 1017|    640|                         strings.get(territoryReplacementIndexes[i]),
 1018|    640|                         status);
 1019|    640|    }
 1020|       |
 1021|       |    // Build the variantMap from variantTypes & variantReplacementIndexes.
 1022|      1|    CharStringMap variantMap(2, status);
 1023|      3|    for (int32_t i = 0; U_SUCCESS(status) && i < variantLength; i++) {
  ------------------
  |  Branch (1023:25): [True: 3, False: 0]
  |  Branch (1023:46): [True: 2, False: 1]
  ------------------
 1024|      2|        variantMap.put(variantTypes[i],
 1025|      2|                       strings.get(variantReplacementIndexes[i]),
 1026|      2|                       status);
 1027|      2|    }
 1028|       |
 1029|       |    // Build the subdivisionMap from subdivisionTypes & subdivisionReplacementIndexes.
 1030|      1|    CharStringMap subdivisionMap(2, status);
 1031|    148|    for (int32_t i = 0; U_SUCCESS(status) && i < subdivisionLength; i++) {
  ------------------
  |  Branch (1031:25): [True: 148, False: 0]
  |  Branch (1031:46): [True: 147, False: 1]
  ------------------
 1032|    147|        subdivisionMap.put(subdivisionTypes[i],
 1033|    147|                       strings.get(subdivisionReplacementIndexes[i]),
 1034|    147|                       status);
 1035|    147|    }
 1036|       |
 1037|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1037:9): [True: 0, False: 1]
  ------------------
 1038|      0|        return nullptr;
 1039|      0|    }
 1040|       |
 1041|       |    // copy hashtables
 1042|      1|    auto *data = new AliasData(
 1043|      1|        std::move(languageMap),
 1044|      1|        std::move(scriptMap),
 1045|      1|        std::move(territoryMap),
 1046|      1|        std::move(variantMap),
 1047|      1|        std::move(subdivisionMap),
 1048|      1|        strings.orphanCharStrings());
 1049|       |
 1050|      1|    if (data == nullptr) {
  ------------------
  |  Branch (1050:9): [True: 0, False: 1]
  ------------------
 1051|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1052|      0|    }
 1053|      1|    return data;
 1054|      1|}
locid.cpp:_ZN6icu_7812_GLOBAL__N_116AliasDataBuilder17readLanguageAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCode:
  740|      1|{
  741|      1|    return readAlias(
  742|      1|        alias, strings, types, replacementIndexes, length,
  743|       |#if U_DEBUG
  744|       |        [](const char* type) {
  745|       |            // Assert the aliasFrom only contains the following possibilities
  746|       |            // language_REGION_variant
  747|       |            // language_REGION
  748|       |            // language_variant
  749|       |            // language
  750|       |            // und_variant
  751|       |            Locale test(type);
  752|       |            // Assert no script in aliasFrom
  753|       |            U_ASSERT(test.getScript()[0] == '\0');
  754|       |            // Assert when language is und, no REGION in aliasFrom.
  755|       |            U_ASSERT(test.getLanguage()[0] != '\0' || test.getCountry()[0] == '\0');
  756|       |        },
  757|       |#else
  758|      1|        [](const char*) {},
  759|      1|#endif
  760|      1|        [](const UChar*) {}, status);
  761|      1|}
locid.cpp:_ZN6icu_7812_GLOBAL__N_116AliasDataBuilder9readAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiPFvS8_EPFvPKDsER10UErrorCode:
  695|      5|        UErrorCode &status) {
  696|      5|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (696:9): [True: 0, False: 5]
  ------------------
  697|      0|        return;
  698|      0|    }
  699|      5|    length = ures_getSize(alias);
  ------------------
  |  | 1674|      5|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  700|      5|    const char** rawTypes = types.allocateInsteadAndCopy(length);
  701|      5|    if (rawTypes == nullptr) {
  ------------------
  |  Branch (701:9): [True: 0, False: 5]
  ------------------
  702|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  703|      0|        return;
  704|      0|    }
  705|      5|    int32_t* rawIndexes = replacementIndexes.allocateInsteadAndCopy(length);
  706|      5|    if (rawIndexes == nullptr) {
  ------------------
  |  Branch (706:9): [True: 0, False: 5]
  ------------------
  707|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  708|      0|        return;
  709|      0|    }
  710|  1.29k|    for (int i = 0; U_SUCCESS(status) && ures_hasNext(alias); i++) {
  ------------------
  |  | 1689|  1.29k|#define ures_hasNext U_ICU_ENTRY_POINT_RENAME(ures_hasNext)
  |  |  ------------------
  |  |  |  |  123|  1.29k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.29k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.29k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (710:21): [True: 1.29k, False: 0]
  |  Branch (710:42): [True: 1.29k, False: 5]
  ------------------
  711|  1.29k|        LocalUResourceBundlePointer res(
  712|  1.29k|            ures_getNextResource(alias, nullptr, &status));
  ------------------
  |  | 1672|  1.29k|#define ures_getNextResource U_ICU_ENTRY_POINT_RENAME(ures_getNextResource)
  |  |  ------------------
  |  |  |  |  123|  1.29k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.29k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.29k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  713|  1.29k|        const char* aliasFrom = ures_getKey(res.getAlias());
  ------------------
  |  | 1666|  1.29k|#define ures_getKey U_ICU_ENTRY_POINT_RENAME(ures_getKey)
  |  |  ------------------
  |  |  |  |  123|  1.29k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.29k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.29k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  714|  1.29k|        const UChar* aliasTo =
  715|  1.29k|            ures_getStringByKey(res.getAlias(), "replacement", nullptr, &status);
  ------------------
  |  | 1677|  1.29k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|  1.29k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.29k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.29k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  716|  1.29k|        if (U_FAILURE(status)) return;
  ------------------
  |  Branch (716:13): [True: 0, False: 1.29k]
  ------------------
  717|       |
  718|  1.29k|        checkType(aliasFrom);
  719|  1.29k|        checkReplacement(aliasTo);
  720|       |
  721|  1.29k|        rawTypes[i] = aliasFrom;
  722|  1.29k|        rawIndexes[i] = strings->add(aliasTo, status);
  723|  1.29k|    }
  724|      5|}
locid.cpp:_ZZN6icu_7812_GLOBAL__N_116AliasDataBuilder17readLanguageAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCodeENK3$_0clES8_:
  758|    500|        [](const char*) {},
locid.cpp:_ZZN6icu_7812_GLOBAL__N_116AliasDataBuilder17readLanguageAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCodeENK3$_1clEPKDs:
  760|    500|        [](const UChar*) {}, status);
locid.cpp:_ZN6icu_7812_GLOBAL__N_116AliasDataBuilder15readScriptAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCode:
  777|      1|{
  778|      1|    return readAlias(
  779|      1|        alias, strings, types, replacementIndexes, length,
  780|       |#if U_DEBUG
  781|       |        [](const char* type) {
  782|       |            U_ASSERT(uprv_strlen(type) == 4);
  783|       |        },
  784|       |        [](const UChar* replacement) {
  785|       |            U_ASSERT(u_strlen(replacement) == 4);
  786|       |        },
  787|       |#else
  788|      1|        [](const char*) {},
  789|      1|        [](const UChar*) { },
  790|      1|#endif
  791|      1|        status);
  792|      1|}
locid.cpp:_ZZN6icu_7812_GLOBAL__N_116AliasDataBuilder15readScriptAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCodeENK3$_0clES8_:
  788|      1|        [](const char*) {},
locid.cpp:_ZZN6icu_7812_GLOBAL__N_116AliasDataBuilder15readScriptAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCodeENK3$_1clEPKDs:
  789|      1|        [](const UChar*) { },
locid.cpp:_ZN6icu_7812_GLOBAL__N_116AliasDataBuilder18readTerritoryAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCode:
  808|      1|{
  809|      1|    return readAlias(
  810|      1|        alias, strings, types, replacementIndexes, length,
  811|       |#if U_DEBUG
  812|       |        [](const char* type) {
  813|       |            U_ASSERT(uprv_strlen(type) == 2 || uprv_strlen(type) == 3);
  814|       |        },
  815|       |#else
  816|      1|        [](const char*) {},
  817|      1|#endif
  818|      1|        [](const UChar*) { },
  819|      1|        status);
  820|      1|}
locid.cpp:_ZZN6icu_7812_GLOBAL__N_116AliasDataBuilder18readTerritoryAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCodeENK3$_0clES8_:
  816|    640|        [](const char*) {},
locid.cpp:_ZZN6icu_7812_GLOBAL__N_116AliasDataBuilder18readTerritoryAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCodeENK3$_1clEPKDs:
  818|    640|        [](const UChar*) { },
locid.cpp:_ZN6icu_7812_GLOBAL__N_116AliasDataBuilder16readVariantAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCode:
  836|      1|{
  837|      1|    return readAlias(
  838|      1|        alias, strings, types, replacementIndexes, length,
  839|       |#if U_DEBUG
  840|       |        [](const char* type) {
  841|       |            U_ASSERT(uprv_strlen(type) >= 4 && uprv_strlen(type) <= 8);
  842|       |            U_ASSERT(uprv_strlen(type) != 4 ||
  843|       |                     (type[0] >= '0' && type[0] <= '9'));
  844|       |        },
  845|       |        [](const UChar* replacement) {
  846|       |            int32_t len = u_strlen(replacement);
  847|       |            U_ASSERT(len >= 4 && len <= 8);
  848|       |            U_ASSERT(len != 4 ||
  849|       |                     (*replacement >= u'0' &&
  850|       |                      *replacement <= u'9'));
  851|       |        },
  852|       |#else
  853|      1|        [](const char*) {},
  854|      1|        [](const UChar*) { },
  855|      1|#endif
  856|      1|        status);
  857|      1|}
locid.cpp:_ZZN6icu_7812_GLOBAL__N_116AliasDataBuilder16readVariantAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCodeENK3$_0clES8_:
  853|      2|        [](const char*) {},
locid.cpp:_ZZN6icu_7812_GLOBAL__N_116AliasDataBuilder16readVariantAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCodeENK3$_1clEPKDs:
  854|      2|        [](const UChar*) { },
locid.cpp:_ZN6icu_7812_GLOBAL__N_116AliasDataBuilder20readSubdivisionAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCode:
  873|      1|{
  874|      1|    return readAlias(
  875|      1|        alias, strings, types, replacementIndexes, length,
  876|       |#if U_DEBUG
  877|       |        [](const char* type) {
  878|       |            U_ASSERT(uprv_strlen(type) >= 3 && uprv_strlen(type) <= 8);
  879|       |        },
  880|       |#else
  881|      1|        [](const char*) {},
  882|      1|#endif
  883|      1|        [](const UChar*) { },
  884|      1|        status);
  885|      1|}
locid.cpp:_ZZN6icu_7812_GLOBAL__N_116AliasDataBuilder20readSubdivisionAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCodeENK3$_0clES8_:
  881|    147|        [](const char*) {},
locid.cpp:_ZZN6icu_7812_GLOBAL__N_116AliasDataBuilder20readSubdivisionAliasEP15UResourceBundlePNS_17UniqueCharStringsERNS_11LocalMemoryIPKcEERNS6_IiEERiR10UErrorCodeENK3$_1clEPKDs:
  883|    147|        [](const UChar*) { },
locid.cpp:_ZN6icu_7812_GLOBAL__N_19AliasDataC2ENS_13CharStringMapES2_S2_S2_S2_PNS_10CharStringE:
  650|      1|        : language(std::move(languageMap)),
  651|      1|          script(std::move(scriptMap)),
  652|      1|          territory(std::move(territoryMap)),
  653|      1|          variant(std::move(variantMap)),
  654|      1|          subdivision(std::move(subdivisionMap)),
  655|      1|          strings(strings) {
  656|      1|    }
locid.cpp:_ZN6icu_7812_GLOBAL__N_113AliasReplacer8notEmptyEPKc:
 1090|  4.64k|    inline bool notEmpty(const char* str) {
 1091|  4.64k|        return str && str[0] != NULL_CHAR;
  ------------------
  |  |  244|  2.68k|#define NULL_CHAR '\0'
  ------------------
  |  Branch (1091:16): [True: 2.68k, False: 1.96k]
  |  Branch (1091:23): [True: 1.88k, False: 801]
  ------------------
 1092|  4.64k|    }
locid.cpp:_ZN6icu_7812_GLOBAL__N_113AliasReplacer15replaceLanguageEbbbRNS_7UVectorER10UErrorCode:
 1271|  3.58k|{
 1272|  3.58k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1272:9): [True: 0, False: 3.58k]
  ------------------
 1273|      0|        return false;
 1274|      0|    }
 1275|  3.58k|    if (    (checkRegion && region == nullptr) ||
  ------------------
  |  Branch (1275:14): [True: 1.43k, False: 2.15k]
  |  Branch (1275:29): [True: 378, False: 1.05k]
  ------------------
 1276|  3.58k|            (checkVariants && variants.size() == 0)) {
  ------------------
  |  Branch (1276:14): [True: 1.96k, False: 1.24k]
  |  Branch (1276:31): [True: 1.95k, False: 3]
  ------------------
 1277|       |        // Nothing to search.
 1278|  2.33k|        return false;
 1279|  2.33k|    }
 1280|  1.24k|    int32_t variant_size = checkVariants ? variants.size() : 1;
  ------------------
  |  Branch (1280:28): [True: 3, False: 1.24k]
  ------------------
 1281|       |    // Since we may have more than one variant, we need to loop through them.
 1282|  1.24k|    const char* searchLanguage = checkLanguage ? language : "und";
  ------------------
  |  Branch (1282:34): [True: 1.24k, False: 1]
  ------------------
 1283|  1.24k|    const char* searchRegion = checkRegion ? region : nullptr;
  ------------------
  |  Branch (1283:32): [True: 529, False: 719]
  ------------------
 1284|  1.24k|    const char* searchVariant = nullptr;
 1285|  1.24k|    for (int32_t variant_index = 0;
 1286|  2.49k|            variant_index < variant_size;
  ------------------
  |  Branch (1286:13): [True: 1.24k, False: 1.24k]
  ------------------
 1287|  1.24k|            variant_index++) {
 1288|  1.24k|        if (checkVariants) {
  ------------------
  |  Branch (1288:13): [True: 3, False: 1.24k]
  ------------------
 1289|      3|            U_ASSERT(variant_index < variant_size);
  ------------------
  |  |   35|      3|#   define U_ASSERT(exp) (void)0
  ------------------
 1290|      3|            searchVariant = static_cast<const char*>(variants.elementAt(variant_index));
 1291|      3|        }
 1292|       |
 1293|  1.24k|        if (searchVariant != nullptr && uprv_strlen(searchVariant) < 4) {
  ------------------
  |  |   37|      3|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1293:13): [True: 3, False: 1.24k]
  |  Branch (1293:41): [True: 0, False: 3]
  ------------------
 1294|       |            // Do not consider  ill-formed variant subtag.
 1295|      0|            searchVariant = nullptr;
 1296|      0|        }
 1297|  1.24k|        CharString typeKey;
 1298|  1.24k|        generateKey(searchLanguage, searchRegion, searchVariant, typeKey,
 1299|  1.24k|                    status);
 1300|  1.24k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1300:13): [True: 0, False: 1.24k]
  ------------------
 1301|      0|            return false;
 1302|      0|        }
 1303|  1.24k|        const char *replacement = data->languageMap().get(typeKey.data());
 1304|  1.24k|        if (replacement == nullptr) {
  ------------------
  |  Branch (1304:13): [True: 1.24k, False: 0]
  ------------------
 1305|       |            // Found no replacement data.
 1306|  1.24k|            continue;
 1307|  1.24k|        }
 1308|       |
 1309|      0|        const char* replacedLanguage = nullptr;
 1310|      0|        const char* replacedScript = nullptr;
 1311|      0|        const char* replacedRegion = nullptr;
 1312|      0|        const char* replacedVariant = nullptr;
 1313|      0|        const char* replacedExtensions = nullptr;
 1314|      0|        parseLanguageReplacement(replacement,
 1315|      0|                                 replacedLanguage,
 1316|      0|                                 replacedScript,
 1317|      0|                                 replacedRegion,
 1318|      0|                                 replacedVariant,
 1319|      0|                                 replacedExtensions,
 1320|      0|                                 toBeFreed,
 1321|      0|                                 status);
 1322|      0|        replacedLanguage =
 1323|      0|            (replacedLanguage != nullptr && uprv_strcmp(replacedLanguage, "und") == 0) ?
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1323:14): [True: 0, False: 0]
  |  Branch (1323:45): [True: 0, False: 0]
  ------------------
 1324|      0|            language : replacedLanguage;
 1325|      0|        replacedScript = deleteOrReplace(script, nullptr, replacedScript);
 1326|      0|        replacedRegion = deleteOrReplace(region, searchRegion, replacedRegion);
 1327|      0|        replacedVariant = deleteOrReplace(
 1328|      0|            searchVariant, searchVariant, replacedVariant);
 1329|       |
 1330|      0|        if (    same(language, replacedLanguage) &&
  ------------------
  |  Branch (1330:17): [True: 0, False: 0]
  ------------------
 1331|      0|                same(script, replacedScript) &&
  ------------------
  |  Branch (1331:17): [True: 0, False: 0]
  ------------------
 1332|      0|                same(region, replacedRegion) &&
  ------------------
  |  Branch (1332:17): [True: 0, False: 0]
  ------------------
 1333|      0|                same(searchVariant, replacedVariant) &&
  ------------------
  |  Branch (1333:17): [True: 0, False: 0]
  ------------------
 1334|      0|                replacedExtensions == nullptr) {
  ------------------
  |  Branch (1334:17): [True: 0, False: 0]
  ------------------
 1335|       |            // Replacement produce no changes.
 1336|      0|            continue;
 1337|      0|        }
 1338|       |
 1339|      0|        language = replacedLanguage;
 1340|      0|        region = replacedRegion;
 1341|      0|        script = replacedScript;
 1342|      0|        if (searchVariant != nullptr) {
  ------------------
  |  Branch (1342:13): [True: 0, False: 0]
  ------------------
 1343|      0|            if (notEmpty(replacedVariant)) {
  ------------------
  |  Branch (1343:17): [True: 0, False: 0]
  ------------------
 1344|      0|                variants.setElementAt((void*)replacedVariant, variant_index);
 1345|      0|            } else {
 1346|      0|                variants.removeElementAt(variant_index);
 1347|      0|            }
 1348|      0|        }
 1349|      0|        if (replacedExtensions != nullptr) {
  ------------------
  |  Branch (1349:13): [True: 0, False: 0]
  ------------------
 1350|       |            // DO NOTHING
 1351|       |            // UTS35 does not specify what should we do if we have extensions in the
 1352|       |            // replacement. Currently we know only the following 4 "BCP47 LegacyRules" have
 1353|       |            // extensions in them languageAlias:
 1354|       |            //  i_default => en_x_i_default
 1355|       |            //  i_enochian => und_x_i_enochian
 1356|       |            //  i_mingo => see_x_i_mingo
 1357|       |            //  zh_min => nan_x_zh_min
 1358|       |            // But all of them are already changed by code inside ultag_parse() before
 1359|       |            // hitting this code.
 1360|      0|        }
 1361|       |
 1362|       |        // Something changed by language alias data.
 1363|      0|        return true;
 1364|      0|    }
 1365|       |    // Nothing changed by language alias data.
 1366|  1.24k|    return false;
 1367|  1.24k|}
locid.cpp:_ZN6icu_7812_GLOBAL__N_113AliasReplacer11generateKeyEPKcS3_S3_RNS_10CharStringER10UErrorCode:
 1169|  1.24k|{
 1170|  1.24k|    if (U_FAILURE(status)) { return out; }
  ------------------
  |  Branch (1170:9): [True: 0, False: 1.24k]
  ------------------
 1171|  1.24k|    out.append(language, status);
 1172|  1.24k|    if (notEmpty(region)) {
  ------------------
  |  Branch (1172:9): [True: 529, False: 719]
  ------------------
 1173|    529|        out.append(SEP_CHAR, status)
  ------------------
  |  |  243|    529|#define SEP_CHAR '_'
  ------------------
 1174|    529|            .append(region, status);
 1175|    529|    }
 1176|  1.24k|    if (notEmpty(variant)) {
  ------------------
  |  Branch (1176:9): [True: 3, False: 1.24k]
  ------------------
 1177|      3|       out.append(SEP_CHAR, status)
  ------------------
  |  |  243|      3|#define SEP_CHAR '_'
  ------------------
 1178|      3|           .append(variant, status);
 1179|      3|    }
 1180|  1.24k|    return out;
 1181|  1.24k|}
locid.cpp:_ZNK6icu_7812_GLOBAL__N_19AliasData11languageMapEv:
  632|  1.24k|    const CharStringMap& languageMap() const { return language; }
locid.cpp:_ZN6icu_7812_GLOBAL__N_113AliasReplacer16replaceTerritoryERNS_7UVectorER10UErrorCode:
 1371|    717|{
 1372|    717|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1372:9): [True: 0, False: 717]
  ------------------
 1373|      0|        return false;
 1374|      0|    }
 1375|    717|    if (region == nullptr) {
  ------------------
  |  Branch (1375:9): [True: 189, False: 528]
  ------------------
 1376|       |        // No region to search.
 1377|    189|        return false;
 1378|    189|    }
 1379|    528|    const char *replacement = data->territoryMap().get(region);
 1380|    528|    if (replacement == nullptr) {
  ------------------
  |  Branch (1380:9): [True: 528, False: 0]
  ------------------
 1381|       |        // Found no replacement data for this region.
 1382|    528|        return false;
 1383|    528|    }
 1384|      0|    const char* replacedRegion = replacement;
 1385|      0|    const char* firstSpace = uprv_strchr(replacement, ' ');
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1386|      0|    if (firstSpace != nullptr) {
  ------------------
  |  Branch (1386:9): [True: 0, False: 0]
  ------------------
 1387|       |        // If there are are more than one region in the replacement.
 1388|       |        // We need to check which one match based on the language.
 1389|       |        // Cannot use nullptr for language because that will construct
 1390|       |        // the default locale, in that case, use "und" to get the correct
 1391|       |        // locale.
 1392|      0|        Locale l = LocaleBuilder()
 1393|      0|            .setLanguage(language == nullptr ? "und" : language)
  ------------------
  |  Branch (1393:26): [True: 0, False: 0]
  ------------------
 1394|      0|            .setScript(script)
 1395|      0|            .build(status);
 1396|      0|        l.addLikelySubtags(status);
 1397|      0|        const char* likelyRegion = l.getCountry();
 1398|      0|        LocalPointer<CharString> item;
 1399|      0|        if (likelyRegion != nullptr && uprv_strlen(likelyRegion) > 0) {
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1399:13): [True: 0, False: 0]
  |  Branch (1399:40): [True: 0, False: 0]
  ------------------
 1400|      0|            size_t len = uprv_strlen(likelyRegion);
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1401|      0|            const char* foundInReplacement = uprv_strstr(replacement,
  ------------------
  |  |   41|      0|#define uprv_strstr(s, c) U_STANDARD_CPP_NAMESPACE strstr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1402|      0|                                                         likelyRegion);
 1403|      0|            if (foundInReplacement != nullptr) {
  ------------------
  |  Branch (1403:17): [True: 0, False: 0]
  ------------------
 1404|       |                // Assuming the case there are no three letter region code in
 1405|       |                // the replacement of territoryAlias
 1406|      0|                U_ASSERT(foundInReplacement == replacement ||
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1407|      0|                         *(foundInReplacement-1) == ' ');
 1408|      0|                U_ASSERT(foundInReplacement[len] == ' ' ||
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1409|      0|                         foundInReplacement[len] == '\0');
 1410|      0|                item.adoptInsteadAndCheckErrorCode(
 1411|      0|                    new CharString(foundInReplacement, static_cast<int32_t>(len), status), status);
 1412|      0|            }
 1413|      0|        }
 1414|      0|        if (item.isNull() && U_SUCCESS(status)) {
  ------------------
  |  Branch (1414:13): [True: 0, False: 0]
  |  Branch (1414:30): [True: 0, False: 0]
  ------------------
 1415|      0|            item.adoptInsteadAndCheckErrorCode(
 1416|      0|                new CharString(replacement,
 1417|      0|                               static_cast<int32_t>(firstSpace - replacement), status), status);
 1418|      0|        }
 1419|      0|        if (U_FAILURE(status)) { return false; }
  ------------------
  |  Branch (1419:13): [True: 0, False: 0]
  ------------------
 1420|      0|        replacedRegion = item->data();
 1421|      0|        toBeFreed.adoptElement(item.orphan(), status);
 1422|      0|        if (U_FAILURE(status)) { return false; }
  ------------------
  |  Branch (1422:13): [True: 0, False: 0]
  ------------------
 1423|      0|    }
 1424|      0|    U_ASSERT(!same(region, replacedRegion));
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1425|      0|    region = replacedRegion;
 1426|       |    // The region is changed by data in territory alias.
 1427|      0|    return true;
 1428|      0|}
locid.cpp:_ZNK6icu_7812_GLOBAL__N_19AliasData12territoryMapEv:
  634|    528|    const CharStringMap& territoryMap() const { return territory; }
locid.cpp:_ZN6icu_7812_GLOBAL__N_113AliasReplacer13replaceScriptER10UErrorCode:
 1432|    717|{
 1433|    717|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1433:9): [True: 0, False: 717]
  ------------------
 1434|      0|        return false;
 1435|      0|    }
 1436|    717|    if (script == nullptr) {
  ------------------
  |  Branch (1436:9): [True: 612, False: 105]
  ------------------
 1437|       |        // No script to search.
 1438|    612|        return false;
 1439|    612|    }
 1440|    105|    const char *replacement = data->scriptMap().get(script);
 1441|    105|    if (replacement == nullptr) {
  ------------------
  |  Branch (1441:9): [True: 105, False: 0]
  ------------------
 1442|       |        // Found no replacement data for this script.
 1443|    105|        return false;
 1444|    105|    }
 1445|      0|    U_ASSERT(!same(script, replacement));
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1446|      0|    script = replacement;
 1447|       |    // The script is changed by data in script alias.
 1448|      0|    return true;
 1449|    105|}
locid.cpp:_ZNK6icu_7812_GLOBAL__N_19AliasData9scriptMapEv:
  633|    105|    const CharStringMap& scriptMap() const { return script; }
locid.cpp:_ZN6icu_7812_GLOBAL__N_113AliasReplacer14replaceVariantER10UErrorCode:
 1453|    717|{
 1454|    717|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1454:9): [True: 0, False: 717]
  ------------------
 1455|      0|        return false;
 1456|      0|    }
 1457|       |    // Since we may have more than one variant, we need to loop through them.
 1458|    718|    for (int32_t i = 0; i < variants.size(); i++) {
  ------------------
  |  Branch (1458:25): [True: 1, False: 717]
  ------------------
 1459|      1|        const char* variant = static_cast<const char*>(variants.elementAt(i));
 1460|      1|        const char *replacement = data->variantMap().get(variant);
 1461|      1|        if (replacement == nullptr) {
  ------------------
  |  Branch (1461:13): [True: 1, False: 0]
  ------------------
 1462|       |            // Found no replacement data for this variant.
 1463|      1|            continue;
 1464|      1|        }
 1465|      0|        U_ASSERT((uprv_strlen(replacement) >= 5  &&
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1466|      0|                  uprv_strlen(replacement) <= 8) ||
 1467|      0|                 (uprv_strlen(replacement) == 4 &&
 1468|      0|                  replacement[0] >= '0' &&
 1469|      0|                  replacement[0] <= '9'));
 1470|      0|        if (!same(variant, replacement)) {
  ------------------
  |  Branch (1470:13): [True: 0, False: 0]
  ------------------
 1471|      0|            variants.setElementAt((void*)replacement, i);
 1472|       |            // Special hack to handle hepburn-heploc => alalc97
 1473|      0|            if (uprv_strcmp(variant, "heploc") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1473:17): [True: 0, False: 0]
  ------------------
 1474|      0|                for (int32_t j = 0; j < variants.size(); j++) {
  ------------------
  |  Branch (1474:37): [True: 0, False: 0]
  ------------------
 1475|      0|                     if (uprv_strcmp((const char*)(variants.elementAt(j)),
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1475:26): [True: 0, False: 0]
  ------------------
 1476|      0|                                     "hepburn") == 0) {
 1477|      0|                         variants.removeElementAt(j);
 1478|      0|                     }
 1479|      0|                }
 1480|      0|            }
 1481|      0|            return true;
 1482|      0|        }
 1483|      0|    }
 1484|    717|    return false;
 1485|    717|}
locid.cpp:_ZNK6icu_7812_GLOBAL__N_19AliasData10variantMapEv:
  635|      1|    const CharStringMap& variantMap() const { return variant; }
locid.cpp:_ZN6icu_7812_GLOBAL__N_113AliasReplacerD2Ev:
 1072|    717|    ~AliasReplacer() {
 1073|    717|    }
locid.cpp:_ZZN6icu_786Locale4initENS_11StringPieceEaENK3$_0clENSt3__117basic_string_viewIcNS3_11char_traitsIcEEEEPciR10UErrorCode:
 1868|  1.40k|                                          UErrorCode& status) {
 1869|  1.40k|            return ByteSinkUtil::viaByteSinkToTerminatedChars(
 1870|  1.40k|                name, nameCapacity,
 1871|  1.40k|                [&](ByteSink& sink, UErrorCode& status) {
 1872|  1.40k|                    if (canonicalize) {
 1873|  1.40k|                        ulocimp_canonicalize(localeID, sink, status);
 1874|  1.40k|                    } else {
 1875|  1.40k|                        ulocimp_getName(localeID, sink, status);
 1876|  1.40k|                    }
 1877|  1.40k|                },
 1878|  1.40k|                status);
 1879|  1.40k|        };
locid.cpp:_ZZZN6icu_786Locale4initENS_11StringPieceEaENK3$_0clENSt3__117basic_string_viewIcNS3_11char_traitsIcEEEEPciR10UErrorCodeENKUlRNS_8ByteSinkESA_E_clESC_SA_:
 1871|  1.40k|                [&](ByteSink& sink, UErrorCode& status) {
 1872|  1.40k|                    if (canonicalize) {
  ------------------
  |  Branch (1872:25): [True: 885, False: 517]
  ------------------
 1873|    885|                        ulocimp_canonicalize(localeID, sink, status);
  ------------------
  |  | 1197|    885|#define ulocimp_canonicalize U_ICU_ENTRY_POINT_RENAME(ulocimp_canonicalize)
  |  |  ------------------
  |  |  |  |  123|    885|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    885|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    885|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1874|    885|                    } else {
 1875|    517|                        ulocimp_getName(localeID, sink, status);
  ------------------
  |  | 1204|    517|#define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName)
  |  |  ------------------
  |  |  |  |  123|    517|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    517|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    517|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1876|    517|                    }
 1877|  1.40k|                },
locid.cpp:_ZN6icu_7812_GLOBAL__N_126isKnownCanonicalizedLocaleEPKcR10UErrorCode:
 1786|    885|{
 1787|    885|    if (U_FAILURE(status)) { return false; }
  ------------------
  |  Branch (1787:9): [True: 0, False: 885]
  ------------------
 1788|       |
 1789|    885|    if (    uprv_strcmp(locale, "c") == 0 ||
  ------------------
  |  |   38|    885|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|    885|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1789:13): [True: 0, False: 885]
  ------------------
 1790|    885|            uprv_strcmp(locale, "en") == 0 ||
  ------------------
  |  |   38|    885|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|    885|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1790:13): [True: 1, False: 884]
  ------------------
 1791|    885|            uprv_strcmp(locale, "en_US") == 0) {
  ------------------
  |  |   38|    884|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|    884|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1791:13): [True: 1, False: 883]
  ------------------
 1792|      2|        return true;
 1793|      2|    }
 1794|       |
 1795|       |    // common well-known Canonicalized.
 1796|    883|    umtx_initOnce(gKnownCanonicalizedInitOnce,
 1797|    883|                  &loadKnownCanonicalized, status);
 1798|    883|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1798:9): [True: 0, False: 883]
  ------------------
 1799|      0|        return false;
 1800|      0|    }
 1801|    883|    U_ASSERT(gKnownCanonicalized != nullptr);
  ------------------
  |  |   35|    883|#   define U_ASSERT(exp) (void)0
  ------------------
 1802|    883|    return uhash_geti(gKnownCanonicalized, locale) != 0;
  ------------------
  |  | 1008|    883|#define uhash_geti U_ICU_ENTRY_POINT_RENAME(uhash_geti)
  |  |  ------------------
  |  |  |  |  123|    883|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    883|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    883|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1803|    883|}
locid.cpp:_ZN6icu_7812_GLOBAL__N_122loadKnownCanonicalizedER10UErrorCode:
  518|      1|void U_CALLCONV loadKnownCanonicalized(UErrorCode &status) {
  519|      1|    ucln_common_registerCleanup(UCLN_COMMON_LOCALE_KNOWN_CANONICALIZED,
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|      1|                                cleanupKnownCanonicalized);
  521|      1|    LocalUHashtablePointer newKnownCanonicalizedMap(
  522|      1|        uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &status));
  ------------------
  |  | 1030|      1|#define uhash_open U_ICU_ENTRY_POINT_RENAME(uhash_open)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &status));
  ------------------
  |  | 1011|      1|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &status));
  ------------------
  |  |  993|      1|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  523|      1|    for (int32_t i = 0;
  524|    179|            U_SUCCESS(status) && i < UPRV_LENGTHOF(KNOWN_CANONICALIZED);
  ------------------
  |  |   99|    179|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (524:13): [True: 179, False: 0]
  |  Branch (524:34): [True: 178, False: 1]
  ------------------
  525|    178|            i++) {
  526|    178|        uhash_puti(newKnownCanonicalizedMap.getAlias(),
  ------------------
  |  | 1033|    178|#define uhash_puti U_ICU_ENTRY_POINT_RENAME(uhash_puti)
  |  |  ------------------
  |  |  |  |  123|    178|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    178|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    178|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  527|    178|                   (void*)KNOWN_CANONICALIZED[i],
  528|    178|                   1, &status);
  529|    178|    }
  530|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (530:9): [True: 0, False: 1]
  ------------------
  531|      0|        return;
  532|      0|    }
  533|       |
  534|      1|    gKnownCanonicalized = newKnownCanonicalizedMap.orphan();
  535|      1|}

_Z39ulocimp_getRegionForSupplementalData_78PKcbR10UErrorCode:
  434|  9.33k|                                     UErrorCode& status) {
  435|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (435:9): [True: 0, False: 9.33k]
  ------------------
  436|      0|        return {};
  437|      0|    }
  438|  9.33k|    icu::CharString rgBuf = GetRegionFromKey(localeID, "rg", status);
  439|  9.33k|    if (U_SUCCESS(status) && rgBuf.isEmpty()) {
  ------------------
  |  Branch (439:9): [True: 9.33k, False: 0]
  |  Branch (439:30): [True: 9.33k, False: 0]
  ------------------
  440|       |        // No valid rg keyword value, try for unicode_region_subtag
  441|  9.33k|        rgBuf = ulocimp_getRegion(localeID == nullptr ? uloc_getDefault() : localeID, status);
  ------------------
  |  | 1206|  9.33k|#define ulocimp_getRegion U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegion)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      rgBuf = ulocimp_getRegion(localeID == nullptr ? uloc_getDefault() : localeID, status);
  ------------------
  |  | 1118|      0|#define uloc_getDefault U_ICU_ENTRY_POINT_RENAME(uloc_getDefault)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (441:35): [True: 0, False: 9.33k]
  ------------------
  442|  9.33k|        if (U_SUCCESS(status) && rgBuf.isEmpty() && inferRegion) {
  ------------------
  |  Branch (442:13): [True: 9.33k, False: 0]
  |  Branch (442:34): [True: 2.82k, False: 6.51k]
  |  Branch (442:53): [True: 0, False: 2.82k]
  ------------------
  443|       |            // Second check for sd keyword value
  444|      0|            rgBuf = GetRegionFromKey(localeID, "sd", status);
  445|      0|            if (U_SUCCESS(status) && rgBuf.isEmpty()) {
  ------------------
  |  Branch (445:17): [True: 0, False: 0]
  |  Branch (445:38): [True: 0, False: 0]
  ------------------
  446|       |                // no unicode_region_subtag but inferRegion true, try likely subtags
  447|      0|                UErrorCode rgStatus = U_ZERO_ERROR;
  448|      0|                icu::CharString locBuf = ulocimp_addLikelySubtags(localeID, rgStatus);
  ------------------
  |  | 1196|      0|#define ulocimp_addLikelySubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_addLikelySubtags)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  449|      0|                if (U_SUCCESS(rgStatus)) {
  ------------------
  |  Branch (449:21): [True: 0, False: 0]
  ------------------
  450|      0|                    rgBuf = ulocimp_getRegion(locBuf.toStringPiece(), status);
  ------------------
  |  | 1206|      0|#define ulocimp_getRegion U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegion)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  451|      0|                }
  452|      0|            }
  453|      0|        }
  454|  9.33k|    }
  455|       |
  456|  9.33k|    return rgBuf;
  457|  9.33k|}
loclikely.cpp:_ZN12_GLOBAL__N_116GetRegionFromKeyEPKcNSt3__117basic_string_viewIcNS2_11char_traitsIcEEEER10UErrorCode:
  400|  9.33k|GetRegionFromKey(const char* localeID, std::string_view key, UErrorCode& status) {
  401|  9.33k|    icu::CharString result;
  402|       |    // First check for keyword value
  403|  9.33k|    icu::CharString kw = ulocimp_getKeywordValue(localeID, key, status);
  ------------------
  |  | 1200|  9.33k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  404|  9.33k|    int32_t len = kw.length();
  405|       |    // In UTS35
  406|       |    //   type = alphanum{3,8} (sep alphanum{3,8})* ;
  407|       |    // so we know the subdivision must fit the type already.
  408|       |    //
  409|       |    //   unicode_subdivision_id = unicode_region_subtag unicode_subdivision_suffix ;
  410|       |    //   unicode_region_subtag = (alpha{2} | digit{3}) ;
  411|       |    //   unicode_subdivision_suffix = alphanum{1,4} ;
  412|       |    // But we also know there are no id in start with digit{3} in
  413|       |    // https://github.com/unicode-org/cldr/blob/main/common/validity/subdivision.xml
  414|       |    // Therefore we can simplify as
  415|       |    // unicode_subdivision_id = alpha{2} alphanum{1,4}
  416|       |    //
  417|       |    // and only need to accept/reject the code based on the alpha{2} and the length.
  418|  9.33k|    if (U_SUCCESS(status) && len >= 3 && len <= 6 &&
  ------------------
  |  Branch (418:9): [True: 9.33k, False: 0]
  |  Branch (418:30): [True: 0, False: 9.33k]
  |  Branch (418:42): [True: 0, False: 0]
  ------------------
  419|  9.33k|        uprv_isASCIILetter(kw[0]) && uprv_isASCIILetter(kw[1])) {
  ------------------
  |  | 1514|      0|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      uprv_isASCIILetter(kw[0]) && uprv_isASCIILetter(kw[1])) {
  ------------------
  |  | 1514|      0|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (419:9): [True: 0, False: 0]
  |  Branch (419:38): [True: 0, False: 0]
  ------------------
  420|       |        // Additional Check
  421|      0|        static icu::RegionValidateMap valid;
  422|      0|        const char region[] = {kw[0], kw[1], '\0'};
  423|      0|        if (valid.isSet(region)) {
  ------------------
  |  Branch (423:13): [True: 0, False: 0]
  ------------------
  424|      0|            result.append(uprv_toupper(kw[0]), status);
  ------------------
  |  | 1547|      0|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  425|      0|            result.append(uprv_toupper(kw[1]), status);
  ------------------
  |  | 1547|      0|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  426|      0|        }
  427|      0|    }
  428|  9.33k|    return result;
  429|  9.33k|}

_ZN6icu_785MutexC2EPNS_6UMutexE:
   58|   691k|    Mutex(UMutex *mutex = nullptr) : fMutex(mutex) {
   59|   691k|        umtx_lock(fMutex);
  ------------------
  |  | 1250|   691k|#define umtx_lock U_ICU_ENTRY_POINT_RENAME(umtx_lock)
  |  |  ------------------
  |  |  |  |  123|   691k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   691k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   691k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   60|   691k|    }
_ZN6icu_785MutexD2Ev:
   61|   691k|    ~Mutex() {
   62|   691k|        umtx_unlock(fMutex);
  ------------------
  |  | 1251|   691k|#define umtx_unlock U_ICU_ENTRY_POINT_RENAME(umtx_unlock)
  |  |  ------------------
  |  |  |  |  123|   691k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   691k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   691k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   63|   691k|    }

_ZN6icu_7812PatternProps12isWhiteSpaceEi:
  155|  21.9M|PatternProps::isWhiteSpace(UChar32 c) {
  156|  21.9M|    if(c<0) {
  ------------------
  |  Branch (156:8): [True: 0, False: 21.9M]
  ------------------
  157|      0|        return false;
  158|  21.9M|    } else if(c<=0xff) {
  ------------------
  |  Branch (158:15): [True: 12.4M, False: 9.46M]
  ------------------
  159|  12.4M|        return (latin1[c] >> 2) & 1;
  160|  12.4M|    } else if(0x200e<=c && c<=0x2029) {
  ------------------
  |  Branch (160:15): [True: 8.10M, False: 1.35M]
  |  Branch (160:28): [True: 24.1k, False: 8.08M]
  ------------------
  161|  24.1k|        return c<=0x200f || 0x2028<=c;
  ------------------
  |  Branch (161:16): [True: 240, False: 23.9k]
  |  Branch (161:29): [True: 0, False: 23.9k]
  ------------------
  162|  9.44M|    } else {
  163|  9.44M|        return false;
  164|  9.44M|    }
  165|  21.9M|}

uprv_floor_78:
  440|  16.2k|{
  441|  16.2k|    return floor(x);
  442|  16.2k|}
uprv_round_78:
  452|  3.46k|{
  453|  3.46k|    return uprv_floor(x + 0.5);
  ------------------
  |  | 1499|  3.46k|#define uprv_floor U_ICU_ENTRY_POINT_RENAME(uprv_floor)
  |  |  ------------------
  |  |  |  |  123|  3.46k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.46k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.46k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  454|  3.46k|}
uprv_add32_overflow_78:
  524|   162k|uprv_add32_overflow(int32_t a, int32_t b, int32_t* res) {
  525|       |    // NOTE: Some compilers (GCC, Clang) have primitives available, like __builtin_add_overflow.
  526|       |    // This function could be optimized by calling one of those primitives.
  527|   162k|    auto a64 = static_cast<int64_t>(a);
  528|   162k|    auto b64 = static_cast<int64_t>(b);
  529|   162k|    int64_t res64 = a64 + b64;
  530|   162k|    *res = static_cast<int32_t>(res64);
  531|   162k|    return res64 != *res;
  532|   162k|}
u_setDataDirectory_78:
 1316|      1|u_setDataDirectory(const char *directory) {
 1317|      1|    char *newDataDir;
 1318|      1|    int32_t length;
 1319|       |
 1320|      1|    if(directory==nullptr || *directory==0) {
  ------------------
  |  Branch (1320:8): [True: 0, False: 1]
  |  Branch (1320:30): [True: 1, False: 0]
  ------------------
 1321|       |        /* A small optimization to prevent the malloc and copy when the
 1322|       |        shared library is used, and this is a way to make sure that nullptr
 1323|       |        is never returned.
 1324|       |        */
 1325|      1|        newDataDir = (char *)"";
 1326|      1|    }
 1327|      0|    else {
 1328|      0|        length=(int32_t)uprv_strlen(directory);
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1329|      0|        newDataDir = (char *)uprv_malloc(length + 2);
  ------------------
  |  | 1524|      0|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1330|       |        /* Exit out if newDataDir could not be created. */
 1331|      0|        if (newDataDir == nullptr) {
  ------------------
  |  Branch (1331:13): [True: 0, False: 0]
  ------------------
 1332|      0|            return;
 1333|      0|        }
 1334|      0|        uprv_strcpy(newDataDir, directory);
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1335|       |
 1336|       |#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)
 1337|       |        {
 1338|       |            char *p;
 1339|       |            while((p = uprv_strchr(newDataDir, U_FILE_ALT_SEP_CHAR)) != nullptr) {
 1340|       |                *p = U_FILE_SEP_CHAR;
 1341|       |            }
 1342|       |        }
 1343|       |#endif
 1344|      0|    }
 1345|       |
 1346|      1|    if (gDataDirectory && *gDataDirectory) {
  ------------------
  |  Branch (1346:9): [True: 0, False: 1]
  |  Branch (1346:27): [True: 0, False: 0]
  ------------------
 1347|      0|        uprv_free(gDataDirectory);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1348|      0|    }
 1349|      1|    gDataDirectory = newDataDir;
 1350|      1|    ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup);
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1351|      1|}
uprv_pathIsAbsolute_78:
 1355|  1.54k|{
 1356|  1.54k|  if(!path || !*path) {
  ------------------
  |  Branch (1356:6): [True: 0, False: 1.54k]
  |  Branch (1356:15): [True: 0, False: 1.54k]
  ------------------
 1357|      0|    return false;
 1358|      0|  }
 1359|       |
 1360|  1.54k|  if(*path == U_FILE_SEP_CHAR) {
  ------------------
  |  |  130|  1.54k|#   define U_FILE_SEP_CHAR '/'
  ------------------
  |  Branch (1360:6): [True: 0, False: 1.54k]
  ------------------
 1361|      0|    return true;
 1362|      0|  }
 1363|       |
 1364|       |#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)
 1365|       |  if(*path == U_FILE_ALT_SEP_CHAR) {
 1366|       |    return true;
 1367|       |  }
 1368|       |#endif
 1369|       |
 1370|       |#if U_PLATFORM_USES_ONLY_WIN32_API
 1371|       |  if( (((path[0] >= 'A') && (path[0] <= 'Z')) ||
 1372|       |       ((path[0] >= 'a') && (path[0] <= 'z'))) &&
 1373|       |      path[1] == ':' ) {
 1374|       |    return true;
 1375|       |  }
 1376|       |#endif
 1377|       |
 1378|  1.54k|  return false;
 1379|  1.54k|}
u_getDataDirectory_78:
 1499|  2.36k|u_getDataDirectory() {
 1500|  2.36k|    umtx_initOnce(gDataDirInitOnce, &dataDirectoryInitFn);
 1501|  2.36k|    return gDataDirectory;
 1502|  2.36k|}
uprv_getDefaultLocaleID_78:
 1686|      1|{
 1687|      1|#if U_POSIX_LOCALE
 1688|       |/*
 1689|       |  Note that:  (a '!' means the ID is improper somehow)
 1690|       |     LC_ALL  ---->     default_loc          codepage
 1691|       |--------------------------------------------------------
 1692|       |     ab.CD             ab                   CD
 1693|       |     ab@CD             ab__CD               -
 1694|       |     ab@CD.EF          ab__CD               EF
 1695|       |
 1696|       |     ab_CD.EF@GH       ab_CD_GH             EF
 1697|       |
 1698|       |Some 'improper' ways to do the same as above:
 1699|       |  !  ab_CD@GH.EF       ab_CD_GH             EF
 1700|       |  !  ab_CD.EF@GH.IJ    ab_CD_GH             EF
 1701|       |  !  ab_CD@ZZ.EF@GH.IJ ab_CD_GH             EF
 1702|       |
 1703|       |     _CD@GH            _CD_GH               -
 1704|       |     _CD.EF@GH         _CD_GH               EF
 1705|       |
 1706|       |The variant cannot have dots in it.
 1707|       |The 'rightmost' variant (@xxx) wins.
 1708|       |The leftmost codepage (.xxx) wins.
 1709|       |*/
 1710|      1|    const char* posixID = uprv_getPOSIXIDForDefaultLocale();
 1711|       |
 1712|       |    /* Format: (no spaces)
 1713|       |    ll [ _CC ] [ . MM ] [ @ VV]
 1714|       |
 1715|       |      l = lang, C = ctry, M = charmap, V = variant
 1716|       |    */
 1717|       |
 1718|      1|    if (gCorrectedPOSIXLocale != nullptr) {
  ------------------
  |  Branch (1718:9): [True: 0, False: 1]
  ------------------
 1719|      0|        return gCorrectedPOSIXLocale;
 1720|      0|    }
 1721|       |
 1722|       |    // Copy the ID into owned memory.
 1723|       |    // Over-allocate in case we replace "C" with "en_US_POSIX" (+10), + null termination
 1724|      1|    char *correctedPOSIXLocale = static_cast<char *>(uprv_malloc(uprv_strlen(posixID) + 10 + 1));
  ------------------
  |  | 1524|      1|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  char *correctedPOSIXLocale = static_cast<char *>(uprv_malloc(uprv_strlen(posixID) + 10 + 1));
  ------------------
  |  |   37|      1|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1725|      1|    if (correctedPOSIXLocale == nullptr) {
  ------------------
  |  Branch (1725:9): [True: 0, False: 1]
  ------------------
 1726|      0|        return nullptr;
 1727|      0|    }
 1728|      1|    uprv_strcpy(correctedPOSIXLocale, posixID);
  ------------------
  |  |   36|      1|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1729|       |
 1730|      1|    char *limit;
 1731|      1|    if ((limit = uprv_strchr(correctedPOSIXLocale, '.')) != nullptr) {
  ------------------
  |  |   40|      1|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1731:9): [True: 0, False: 1]
  ------------------
 1732|      0|        *limit = 0;
 1733|      0|    }
 1734|      1|    if ((limit = uprv_strchr(correctedPOSIXLocale, '@')) != nullptr) {
  ------------------
  |  |   40|      1|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1734:9): [True: 0, False: 1]
  ------------------
 1735|      0|        *limit = 0;
 1736|      0|    }
 1737|       |
 1738|      1|    if ((uprv_strcmp("C", correctedPOSIXLocale) == 0) // no @ variant
  ------------------
  |  |   38|      1|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1738:9): [True: 0, False: 1]
  ------------------
 1739|      1|        || (uprv_strcmp("POSIX", correctedPOSIXLocale) == 0)) {
  ------------------
  |  |   38|      1|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1739:12): [True: 0, False: 1]
  ------------------
 1740|       |      // Raw input was C.* or POSIX.*, Give it a nice POSIX default value.
 1741|       |      // (The "C"/"POSIX" case is handled in uprv_getPOSIXIDForCategory())
 1742|      0|      uprv_strcpy(correctedPOSIXLocale, "en_US_POSIX");
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1743|      0|    }
 1744|       |
 1745|       |    /* Note that we scan the *uncorrected* ID. */
 1746|      1|    const char *p;
 1747|      1|    if ((p = uprv_strrchr(posixID, '@')) != nullptr) {
  ------------------
  |  |   42|      1|#define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1747:9): [True: 0, False: 1]
  ------------------
 1748|      0|        p++;
 1749|       |
 1750|       |        /* Take care of any special cases here.. */
 1751|      0|        if (!uprv_strcmp(p, "nynorsk")) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1751:13): [True: 0, False: 0]
  ------------------
 1752|      0|            p = "NY";
 1753|       |            /* Don't worry about no__NY. In practice, it won't appear. */
 1754|      0|        }
 1755|       |
 1756|      0|        if (uprv_strchr(correctedPOSIXLocale,'_') == nullptr) {
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1756:13): [True: 0, False: 0]
  ------------------
 1757|      0|            uprv_strcat(correctedPOSIXLocale, "__"); /* aa@b -> aa__b (note this can make the new locale 1 char longer) */
  ------------------
  |  |   39|      0|#define uprv_strcat(dst, src) U_STANDARD_CPP_NAMESPACE strcat(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1758|      0|        }
 1759|      0|        else {
 1760|      0|            uprv_strcat(correctedPOSIXLocale, "_"); /* aa_CC@b -> aa_CC_b */
  ------------------
  |  |   39|      0|#define uprv_strcat(dst, src) U_STANDARD_CPP_NAMESPACE strcat(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1761|      0|        }
 1762|       |
 1763|      0|        const char *q;
 1764|      0|        if ((q = uprv_strchr(p, '.')) != nullptr) {
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1764:13): [True: 0, False: 0]
  ------------------
 1765|       |            /* How big will the resulting string be? */
 1766|      0|            int32_t len = (int32_t)(uprv_strlen(correctedPOSIXLocale) + (q-p));
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1767|      0|            uprv_strncat(correctedPOSIXLocale, p, q-p); // do not include charset
  ------------------
  |  |   45|      0|#define uprv_strncat(dst, src, n) U_STANDARD_CPP_NAMESPACE strncat(dst, src, n)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1768|      0|            correctedPOSIXLocale[len] = 0;
 1769|      0|        }
 1770|      0|        else {
 1771|       |            /* Anything following the @ sign */
 1772|      0|            uprv_strcat(correctedPOSIXLocale, p);
  ------------------
  |  |   39|      0|#define uprv_strcat(dst, src) U_STANDARD_CPP_NAMESPACE strcat(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1773|      0|        }
 1774|       |
 1775|       |        /* Should there be a map from 'no@nynorsk' -> no_NO_NY here?
 1776|       |         * How about 'russian' -> 'ru'?
 1777|       |         * Many of the other locales using ISO codes will be handled by the
 1778|       |         * canonicalization functions in uloc_getDefault.
 1779|       |         */
 1780|      0|    }
 1781|       |
 1782|      1|    if (gCorrectedPOSIXLocale == nullptr) {
  ------------------
  |  Branch (1782:9): [True: 1, False: 0]
  ------------------
 1783|      1|        gCorrectedPOSIXLocale = correctedPOSIXLocale;
 1784|      1|        gCorrectedPOSIXLocaleHeapAllocated = true;
 1785|      1|        ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup);
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1786|      1|        correctedPOSIXLocale = nullptr;
 1787|      1|    }
 1788|      1|    posixID = gCorrectedPOSIXLocale;
 1789|       |
 1790|      1|    if (correctedPOSIXLocale != nullptr) {  /* Was already set - clean up. */
  ------------------
  |  Branch (1790:9): [True: 0, False: 1]
  ------------------
 1791|      0|        uprv_free(correctedPOSIXLocale);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1792|      0|    }
 1793|       |
 1794|      1|    return posixID;
 1795|       |
 1796|       |#elif U_PLATFORM_USES_ONLY_WIN32_API
 1797|       |#define POSIX_LOCALE_CAPACITY 64
 1798|       |    UErrorCode status = U_ZERO_ERROR;
 1799|       |    char *correctedPOSIXLocale = nullptr;
 1800|       |
 1801|       |    // If we have already figured this out just use the cached value
 1802|       |    if (gCorrectedPOSIXLocale != nullptr) {
 1803|       |        return gCorrectedPOSIXLocale;
 1804|       |    }
 1805|       |
 1806|       |    // No cached value, need to determine the current value
 1807|       |    static WCHAR windowsLocale[LOCALE_NAME_MAX_LENGTH] = {};
 1808|       |    int length = GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SNAME, windowsLocale, LOCALE_NAME_MAX_LENGTH);
 1809|       |
 1810|       |    // Now we should have a Windows locale name that needs converted to the POSIX style.
 1811|       |    if (length > 0) // If length is 0, then the GetLocaleInfoEx failed.
 1812|       |    {
 1813|       |        // First we need to go from UTF-16 to char (and also convert from _ to - while we're at it.)
 1814|       |        char modifiedWindowsLocale[LOCALE_NAME_MAX_LENGTH] = {};
 1815|       |
 1816|       |        int32_t i;
 1817|       |        for (i = 0; i < UPRV_LENGTHOF(modifiedWindowsLocale); i++)
 1818|       |        {
 1819|       |            if (windowsLocale[i] == '_')
 1820|       |            {
 1821|       |                modifiedWindowsLocale[i] = '-';
 1822|       |            }
 1823|       |            else
 1824|       |            {
 1825|       |                modifiedWindowsLocale[i] = static_cast<char>(windowsLocale[i]);
 1826|       |            }
 1827|       |
 1828|       |            if (modifiedWindowsLocale[i] == '\0')
 1829|       |            {
 1830|       |                break;
 1831|       |            }
 1832|       |        }
 1833|       |
 1834|       |        if (i >= UPRV_LENGTHOF(modifiedWindowsLocale))
 1835|       |        {
 1836|       |            // Ran out of room, can't really happen, maybe we'll be lucky about a matching
 1837|       |            // locale when tags are dropped
 1838|       |            modifiedWindowsLocale[UPRV_LENGTHOF(modifiedWindowsLocale) - 1] = '\0';
 1839|       |        }
 1840|       |
 1841|       |        // Now normalize the resulting name
 1842|       |        correctedPOSIXLocale = static_cast<char *>(uprv_malloc(POSIX_LOCALE_CAPACITY + 1));
 1843|       |        /* TODO: Should we just exit on memory allocation failure? */
 1844|       |        if (correctedPOSIXLocale)
 1845|       |        {
 1846|       |            int32_t posixLen = uloc_canonicalize(modifiedWindowsLocale, correctedPOSIXLocale, POSIX_LOCALE_CAPACITY, &status);
 1847|       |            if (U_SUCCESS(status))
 1848|       |            {
 1849|       |                *(correctedPOSIXLocale + posixLen) = 0;
 1850|       |                gCorrectedPOSIXLocale = correctedPOSIXLocale;
 1851|       |                gCorrectedPOSIXLocaleHeapAllocated = true;
 1852|       |                ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup);
 1853|       |            }
 1854|       |            else
 1855|       |            {
 1856|       |                uprv_free(correctedPOSIXLocale);
 1857|       |            }
 1858|       |        }
 1859|       |    }
 1860|       |
 1861|       |    // If unable to find a locale we can agree upon, use en-US by default
 1862|       |    if (gCorrectedPOSIXLocale == nullptr) {
 1863|       |        gCorrectedPOSIXLocale = "en_US";
 1864|       |    }
 1865|       |    return gCorrectedPOSIXLocale;
 1866|       |
 1867|       |#elif U_PLATFORM == U_PF_OS400
 1868|       |    /* locales are process scoped and are by definition thread safe */
 1869|       |    static char correctedLocale[64];
 1870|       |    const  char *localeID = getenv("LC_ALL");
 1871|       |           char *p;
 1872|       |
 1873|       |    if (localeID == nullptr)
 1874|       |        localeID = getenv("LANG");
 1875|       |    if (localeID == nullptr)
 1876|       |        localeID = setlocale(LC_ALL, nullptr);
 1877|       |    /* Make sure we have something... */
 1878|       |    if (localeID == nullptr)
 1879|       |        return "en_US_POSIX";
 1880|       |
 1881|       |    /* Extract the locale name from the path. */
 1882|       |    if((p = uprv_strrchr(localeID, '/')) != nullptr)
 1883|       |    {
 1884|       |        /* Increment p to start of locale name. */
 1885|       |        p++;
 1886|       |        localeID = p;
 1887|       |    }
 1888|       |
 1889|       |    /* Copy to work location. */
 1890|       |    uprv_strcpy(correctedLocale, localeID);
 1891|       |
 1892|       |    /* Strip off the '.locale' extension. */
 1893|       |    if((p = uprv_strchr(correctedLocale, '.')) != nullptr) {
 1894|       |        *p = 0;
 1895|       |    }
 1896|       |
 1897|       |    /* Upper case the locale name. */
 1898|       |    T_CString_toUpperCase(correctedLocale);
 1899|       |
 1900|       |    /* See if we are using the POSIX locale.  Any of the
 1901|       |    * following are equivalent and use the same QLGPGCMA
 1902|       |    * (POSIX) locale.
 1903|       |    * QLGPGCMA2 means UCS2
 1904|       |    * QLGPGCMA_4 means UTF-32
 1905|       |    * QLGPGCMA_8 means UTF-8
 1906|       |    */
 1907|       |    if ((uprv_strcmp("C", correctedLocale) == 0) ||
 1908|       |        (uprv_strcmp("POSIX", correctedLocale) == 0) ||
 1909|       |        (uprv_strncmp("QLGPGCMA", correctedLocale, 8) == 0))
 1910|       |    {
 1911|       |        uprv_strcpy(correctedLocale, "en_US_POSIX");
 1912|       |    }
 1913|       |    else
 1914|       |    {
 1915|       |        int16_t LocaleLen;
 1916|       |
 1917|       |        /* Lower case the lang portion. */
 1918|       |        for(p = correctedLocale; *p != 0 && *p != '_'; p++)
 1919|       |        {
 1920|       |            *p = uprv_tolower(*p);
 1921|       |        }
 1922|       |
 1923|       |        /* Adjust for Euro.  After '_E' add 'URO'. */
 1924|       |        LocaleLen = uprv_strlen(correctedLocale);
 1925|       |        if (correctedLocale[LocaleLen - 2] == '_' &&
 1926|       |            correctedLocale[LocaleLen - 1] == 'E')
 1927|       |        {
 1928|       |            uprv_strcat(correctedLocale, "URO");
 1929|       |        }
 1930|       |
 1931|       |        /* If using Lotus-based locale then convert to
 1932|       |         * equivalent non Lotus.
 1933|       |         */
 1934|       |        else if (correctedLocale[LocaleLen - 2] == '_' &&
 1935|       |            correctedLocale[LocaleLen - 1] == 'L')
 1936|       |        {
 1937|       |            correctedLocale[LocaleLen - 2] = 0;
 1938|       |        }
 1939|       |
 1940|       |        /* There are separate simplified and traditional
 1941|       |         * locales called zh_HK_S and zh_HK_T.
 1942|       |         */
 1943|       |        else if (uprv_strncmp(correctedLocale, "zh_HK", 5) == 0)
 1944|       |        {
 1945|       |            uprv_strcpy(correctedLocale, "zh_HK");
 1946|       |        }
 1947|       |
 1948|       |        /* A special zh_CN_GBK locale...
 1949|       |        */
 1950|       |        else if (uprv_strcmp(correctedLocale, "zh_CN_GBK") == 0)
 1951|       |        {
 1952|       |            uprv_strcpy(correctedLocale, "zh_CN");
 1953|       |        }
 1954|       |
 1955|       |    }
 1956|       |
 1957|       |    return correctedLocale;
 1958|       |#endif
 1959|       |
 1960|      1|}
putil.cpp:_ZL19dataDirectoryInitFnv:
 1424|      1|static void U_CALLCONV dataDirectoryInitFn() {
 1425|       |    /* If we already have the directory, then return immediately. Will happen if user called
 1426|       |     * u_setDataDirectory().
 1427|       |     */
 1428|      1|    if (gDataDirectory) {
  ------------------
  |  Branch (1428:9): [True: 0, False: 1]
  ------------------
 1429|      0|        return;
 1430|      0|    }
 1431|       |
 1432|      1|    const char *path = nullptr;
 1433|       |#if defined(ICU_DATA_DIR_PREFIX_ENV_VAR)
 1434|       |    char datadir_path_buffer[PATH_MAX];
 1435|       |#endif
 1436|       |
 1437|       |    /*
 1438|       |    When ICU_NO_USER_DATA_OVERRIDE is defined, users aren't allowed to
 1439|       |    override ICU's data with the ICU_DATA environment variable. This prevents
 1440|       |    problems where multiple custom copies of ICU's specific version of data
 1441|       |    are installed on a system. Either the application must define the data
 1442|       |    directory with u_setDataDirectory, define ICU_DATA_DIR when compiling
 1443|       |    ICU, set the data with udata_setCommonData or trust that all of the
 1444|       |    required data is contained in ICU's data library that contains
 1445|       |    the entry point defined by U_ICUDATA_ENTRY_POINT.
 1446|       |
 1447|       |    There may also be some platforms where environment variables
 1448|       |    are not allowed.
 1449|       |    */
 1450|      1|#   if !defined(ICU_NO_USER_DATA_OVERRIDE) && !UCONFIG_NO_FILE_IO
 1451|       |    /* First try to get the environment variable */
 1452|      1|#     if U_PLATFORM_HAS_WINUWP_API == 0  // Windows UWP does not support getenv
 1453|      1|        path=getenv("ICU_DATA");
 1454|      1|#     endif
 1455|      1|#   endif
 1456|       |
 1457|       |    /* ICU_DATA_DIR may be set as a compile option.
 1458|       |     * U_ICU_DATA_DEFAULT_DIR is provided and is set by ICU at compile time
 1459|       |     * and is used only when data is built in archive mode eliminating the need
 1460|       |     * for ICU_DATA_DIR to be set. U_ICU_DATA_DEFAULT_DIR is set to the installation
 1461|       |     * directory of the data dat file. Users should use ICU_DATA_DIR if they want to
 1462|       |     * set their own path.
 1463|       |     */
 1464|       |#if defined(ICU_DATA_DIR) || defined(U_ICU_DATA_DEFAULT_DIR)
 1465|       |    if(path==nullptr || *path==0) {
 1466|       |# if defined(ICU_DATA_DIR_PREFIX_ENV_VAR)
 1467|       |        const char *prefix = getenv(ICU_DATA_DIR_PREFIX_ENV_VAR);
 1468|       |# endif
 1469|       |# ifdef ICU_DATA_DIR
 1470|       |        path=ICU_DATA_DIR;
 1471|       |# else
 1472|       |        path=U_ICU_DATA_DEFAULT_DIR;
 1473|       |# endif
 1474|       |# if defined(ICU_DATA_DIR_PREFIX_ENV_VAR)
 1475|       |        if (prefix != nullptr) {
 1476|       |            snprintf(datadir_path_buffer, sizeof(datadir_path_buffer), "%s%s", prefix, path);
 1477|       |            path=datadir_path_buffer;
 1478|       |        }
 1479|       |# endif
 1480|       |    }
 1481|       |#endif
 1482|       |
 1483|       |#if defined(ICU_DATA_DIR_WINDOWS)
 1484|       |    char datadir_path_buffer[MAX_PATH];
 1485|       |    if (getIcuDataDirectoryUnderWindowsDirectory(datadir_path_buffer, UPRV_LENGTHOF(datadir_path_buffer))) {
 1486|       |        path = datadir_path_buffer;
 1487|       |    }
 1488|       |#endif
 1489|       |
 1490|      1|    if(path==nullptr) {
  ------------------
  |  Branch (1490:8): [True: 1, False: 0]
  ------------------
 1491|       |        /* It looks really bad, set it to something. */
 1492|      1|        path = "";
 1493|      1|    }
 1494|       |
 1495|      1|    u_setDataDirectory(path);
  ------------------
  |  |  347|      1|#define u_setDataDirectory U_ICU_ENTRY_POINT_RENAME(u_setDataDirectory)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1496|      1|}
putil.cpp:_ZL31uprv_getPOSIXIDForDefaultLocalev:
 1660|      1|{
 1661|      1|    static const char* posixID = nullptr;
 1662|      1|    if (posixID == nullptr) {
  ------------------
  |  Branch (1662:9): [True: 1, False: 0]
  ------------------
 1663|      1|        posixID = uprv_getPOSIXIDForCategory(LC_MESSAGES);
 1664|      1|    }
 1665|      1|    return posixID;
 1666|      1|}
putil.cpp:_ZL26uprv_getPOSIXIDForCategoryi:
 1597|      1|{
 1598|      1|    const char* posixID = nullptr;
 1599|      1|    if (category == LC_MESSAGES || category == LC_CTYPE) {
  ------------------
  |  Branch (1599:9): [True: 1, False: 0]
  |  Branch (1599:36): [True: 0, False: 0]
  ------------------
 1600|       |        /*
 1601|       |        * On Solaris two different calls to setlocale can result in
 1602|       |        * different values. Only get this value once.
 1603|       |        *
 1604|       |        * We must check this first because an application can set this.
 1605|       |        *
 1606|       |        * LC_ALL can't be used because it's platform dependent. The LANG
 1607|       |        * environment variable seems to affect LC_CTYPE variable by default.
 1608|       |        * Here is what setlocale(LC_ALL, nullptr) can return.
 1609|       |        * HPUX can return 'C C C C C C C'
 1610|       |        * Solaris can return /en_US/C/C/C/C/C on the second try.
 1611|       |        * Linux can return LC_CTYPE=C;LC_NUMERIC=C;...
 1612|       |        *
 1613|       |        * The default codepage detection also needs to use LC_CTYPE.
 1614|       |        *
 1615|       |        * Do not call setlocale(LC_*, "")! Using an empty string instead
 1616|       |        * of nullptr, will modify the libc behavior.
 1617|       |        */
 1618|      1|        posixID = setlocale(category, nullptr);
 1619|      1|        if ((posixID == nullptr)
  ------------------
  |  Branch (1619:13): [True: 0, False: 1]
  ------------------
 1620|      1|            || (uprv_strcmp("C", posixID) == 0)
  ------------------
  |  |   38|      1|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1620:16): [True: 1, False: 0]
  ------------------
 1621|      1|            || (uprv_strcmp("POSIX", posixID) == 0))
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1621:16): [True: 0, False: 0]
  ------------------
 1622|      1|        {
 1623|       |            /* Maybe we got some garbage.  Try something more reasonable */
 1624|      1|            posixID = getenv("LC_ALL");
 1625|       |            /* Solaris speaks POSIX -  See IEEE Std 1003.1-2008
 1626|       |             * This is needed to properly handle empty env. variables
 1627|       |             */
 1628|       |#if U_PLATFORM == U_PF_SOLARIS
 1629|       |            if ((posixID == 0) || (posixID[0] == '\0')) {
 1630|       |                posixID = getenv(category == LC_MESSAGES ? "LC_MESSAGES" : "LC_CTYPE");
 1631|       |                if ((posixID == 0) || (posixID[0] == '\0')) {
 1632|       |#else
 1633|      1|            if (posixID == nullptr) {
  ------------------
  |  Branch (1633:17): [True: 1, False: 0]
  ------------------
 1634|      1|                posixID = getenv(category == LC_MESSAGES ? "LC_MESSAGES" : "LC_CTYPE");
  ------------------
  |  Branch (1634:34): [True: 1, False: 0]
  ------------------
 1635|      1|                if (posixID == nullptr) {
  ------------------
  |  Branch (1635:21): [True: 1, False: 0]
  ------------------
 1636|      1|#endif
 1637|      1|                    posixID = getenv("LANG");
 1638|      1|                }
 1639|      1|            }
 1640|      1|        }
 1641|      1|    }
 1642|      1|    if ((posixID == nullptr)
  ------------------
  |  Branch (1642:9): [True: 1, False: 0]
  ------------------
 1643|      1|        || (uprv_strcmp("C", posixID) == 0)
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1643:12): [True: 0, False: 0]
  ------------------
 1644|      1|        || (uprv_strcmp("POSIX", posixID) == 0))
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1644:12): [True: 0, False: 0]
  ------------------
 1645|      1|    {
 1646|       |        /* Nothing worked.  Give it a nice POSIX default value. */
 1647|      1|        posixID = "en_US_POSIX";
 1648|       |        // Note: this test will not catch 'C.UTF-8',
 1649|       |        // that will be handled in uprv_getDefaultLocaleID().
 1650|       |        // Leave this mapping here for the uprv_getPOSIXIDForDefaultCodepage()
 1651|       |        // caller which expects to see "en_US_POSIX" in many branches.
 1652|      1|    }
 1653|      1|    return posixID;
 1654|      1|}

_ZN6icu_7813ResourceValueD2Ev:
   18|  25.0k|ResourceValue::~ResourceValue() {}
_ZN6icu_7812ResourceSinkD2Ev:
   20|  25.3k|ResourceSink::~ResourceSink() {}

_ZN6icu_7813ResourceArrayC2EPKtPKjiRKNS_14ResourceTracerE:
   53|  2.09k|            items16(i16), items32(i32), length(len),
   54|  2.09k|            fTraceInfo(traceInfo) {}
_ZNK6icu_7813ResourceArray7getSizeEv:
   59|  2.09k|    int32_t getSize() const { return length; }
_ZN6icu_7813ResourceTableC2EPKtPKiS2_PKjiRKNS_14ResourceTracerE:
   89|   121k|            keys16(k16), keys32(k32), items16(i16), items32(i32), length(len),
   90|   121k|            fTraceInfo(traceInfo) {}
_ZNK6icu_7813ResourceTable7getSizeEv:
   95|      2|    int32_t getSize() const { return length; }
_ZNK6icu_7813ResourceValue16getUnicodeStringER10UErrorCode:
  141|   168k|    inline UnicodeString getUnicodeString(UErrorCode &errorCode) const {
  142|   168k|        int32_t len = 0;
  143|   168k|        const char16_t *r = getString(len, errorCode);
  144|   168k|        return UnicodeString(true, r, len);
  145|   168k|    }
_ZN6icu_7813ResourceValueC2Ev:
  254|  25.0k|    ResourceValue() {}
_ZN6icu_7812ResourceSinkC2Ev:
  266|  25.3k|    ResourceSink() {}

_ZN6icu_7814ResourceTracerC2Ev:
  116|  25.0k|    ResourceTracer() {}
_ZN6icu_7814ResourceTracerC2EPKv:
  118|   344k|    ResourceTracer(const void*) {}
_ZN6icu_7814ResourceTracerC2EPKvPKc:
  120|  17.5k|    ResourceTracer(const void*, const char*) {}
_ZN6icu_7814ResourceTracerC2EPKvi:
  122|  7.76k|    ResourceTracer(const void*, int32_t) {}
_ZN6icu_7814ResourceTracerC2ERKS0_PKc:
  124|   407k|    ResourceTracer(const ResourceTracer&, const char*) {}
_ZN6icu_7814ResourceTracerC2ERKS0_i:
  126|  7.24k|    ResourceTracer(const ResourceTracer&, int32_t) {}
_ZNK6icu_7814ResourceTracer5traceEPKc:
  128|   481k|    void trace(const char*) const {}
_ZNK6icu_7814ResourceTracer9traceOpenEv:
  130|  83.9k|    void traceOpen() const {}
_ZNK6icu_7814ResourceTracer10maybeTraceEPKc:
  132|  4.28k|    void maybeTrace(const char*) const {}
_ZN6icu_7810FileTracer9traceOpenEPKcS2_S2_:
  140|  2.36k|    static void traceOpen(const char*, const char*, const char*) {}

_ZNK6icu_7812SharedObject6addRefEv:
   23|  3.89k|SharedObject::addRef() const {
   24|  3.89k|    umtx_atomic_inc(&hardRefCount);
   25|  3.89k|}
_ZNK6icu_7812SharedObject9removeRefEv:
   36|  6.75k|SharedObject::removeRef() const {
   37|  6.75k|    const UnifiedCacheBase *cache = this->cachePtr;
   38|  6.75k|    int32_t updatedRefCount = umtx_atomic_dec(&hardRefCount);
   39|  6.75k|    U_ASSERT(updatedRefCount >= 0);
  ------------------
  |  |   35|  6.75k|#   define U_ASSERT(exp) (void)0
  ------------------
   40|  6.75k|    if (updatedRefCount == 0) {
  ------------------
  |  Branch (40:9): [True: 3.37k, False: 3.37k]
  ------------------
   41|  3.37k|        if (cache) {
  ------------------
  |  Branch (41:13): [True: 3.37k, False: 0]
  ------------------
   42|  3.37k|            cache->handleUnreferencedObject();
   43|  3.37k|        } else {
   44|      0|            delete this;
   45|      0|        }
   46|  3.37k|    }
   47|  6.75k|}

_ZN6icu_7816UnifiedCacheBaseC2Ev:
   30|      1|    UnifiedCacheBase() { }
_ZN6icu_7812SharedObjectC2Ev:
   58|    517|            softRefCount(0),
   59|    517|            hardRefCount(0),
   60|    517|            cachePtr(nullptr) {}
_ZN6icu_7812SharedObject7copyPtrINS_17SharedPluralRulesEEEvPKT_RS5_:
  144|  3.37k|    static void copyPtr(const T *src, const T *&dest) {
  145|  3.37k|        if(src != dest) {
  ------------------
  |  Branch (145:12): [True: 3.37k, False: 0]
  ------------------
  146|  3.37k|            if(dest != nullptr) { dest->removeRef(); }
  ------------------
  |  Branch (146:16): [True: 0, False: 3.37k]
  ------------------
  147|  3.37k|            dest = src;
  148|  3.37k|            if(src != nullptr) { src->addRef(); }
  ------------------
  |  Branch (148:16): [True: 3.37k, False: 0]
  ------------------
  149|  3.37k|        }
  150|  3.37k|    }
_ZN6icu_7812SharedObject8clearPtrINS_17SharedPluralRulesEEEvRPKT_:
  156|  3.37k|    static void clearPtr(const T *&ptr) {
  157|  3.37k|        if (ptr != nullptr) {
  ------------------
  |  Branch (157:13): [True: 3.37k, False: 0]
  ------------------
  158|  3.37k|            ptr->removeRef();
  159|  3.37k|            ptr = nullptr;
  160|  3.37k|        }
  161|  3.37k|    }

_ZN6icu_7815SimpleFormatterD2Ev:
   61|  12.1k|SimpleFormatter::~SimpleFormatter() {}
_ZN6icu_7815SimpleFormatter27applyPatternMinMaxArgumentsERKNS_13UnicodeStringEiiR10UErrorCode:
   66|  12.1k|        UErrorCode &errorCode) {
   67|  12.1k|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (67:9): [True: 0, False: 12.1k]
  ------------------
   68|      0|        return false;
   69|      0|    }
   70|       |    // Parse consistent with MessagePattern, but
   71|       |    // - support only simple numbered arguments
   72|       |    // - build a simple binary structure into the result string
   73|  12.1k|    const char16_t *patternBuffer = pattern.getBuffer();
   74|  12.1k|    int32_t patternLength = pattern.length();
   75|       |    // Reserve the first char for the number of arguments.
   76|  12.1k|    compiledPattern.setTo(static_cast<char16_t>(0));
   77|  12.1k|    int32_t textLength = 0;
   78|  12.1k|    int32_t maxArg = -1;
   79|  12.1k|    UBool inQuote = false;
   80|  41.4k|    for (int32_t i = 0; i < patternLength;) {
  ------------------
  |  Branch (80:25): [True: 29.2k, False: 12.1k]
  ------------------
   81|  29.2k|        char16_t c = patternBuffer[i++];
   82|  29.2k|        if (c == APOS) {
  ------------------
  |  Branch (82:13): [True: 0, False: 29.2k]
  ------------------
   83|      0|            if (i < patternLength && (c = patternBuffer[i]) == APOS) {
  ------------------
  |  Branch (83:17): [True: 0, False: 0]
  |  Branch (83:38): [True: 0, False: 0]
  ------------------
   84|       |                // double apostrophe, skip the second one
   85|      0|                ++i;
   86|      0|            } else if (inQuote) {
  ------------------
  |  Branch (86:24): [True: 0, False: 0]
  ------------------
   87|       |                // skip the quote-ending apostrophe
   88|      0|                inQuote = false;
   89|      0|                continue;
   90|      0|            } else if (c == OPEN_BRACE || c == CLOSE_BRACE) {
  ------------------
  |  Branch (90:24): [True: 0, False: 0]
  |  Branch (90:43): [True: 0, False: 0]
  ------------------
   91|       |                // Skip the quote-starting apostrophe, find the end of the quoted literal text.
   92|      0|                ++i;
   93|      0|                inQuote = true;
   94|      0|            } else {
   95|       |                // The apostrophe is part of literal text.
   96|      0|                c = APOS;
   97|      0|            }
   98|  29.2k|        } else if (!inQuote && c == OPEN_BRACE) {
  ------------------
  |  Branch (98:20): [True: 29.2k, False: 0]
  |  Branch (98:32): [True: 12.1k, False: 17.0k]
  ------------------
   99|  12.1k|            if (textLength > 0) {
  ------------------
  |  Branch (99:17): [True: 256, False: 11.9k]
  ------------------
  100|    256|                compiledPattern.setCharAt(compiledPattern.length() - textLength - 1,
  101|    256|                                          static_cast<char16_t>(ARG_NUM_LIMIT + textLength));
  102|    256|                textLength = 0;
  103|    256|            }
  104|  12.1k|            int32_t argNumber;
  105|  12.1k|            if ((i + 1) < patternLength &&
  ------------------
  |  Branch (105:17): [True: 12.1k, False: 0]
  ------------------
  106|  12.1k|                    0 <= (argNumber = patternBuffer[i] - DIGIT_ZERO) && argNumber <= 9 &&
  ------------------
  |  Branch (106:21): [True: 12.1k, False: 0]
  |  Branch (106:73): [True: 12.1k, False: 0]
  ------------------
  107|  12.1k|                    patternBuffer[i + 1] == CLOSE_BRACE) {
  ------------------
  |  Branch (107:21): [True: 12.1k, False: 0]
  ------------------
  108|  12.1k|                i += 2;
  109|  12.1k|            } else {
  110|       |                // Multi-digit argument number (no leading zero) or syntax error.
  111|       |                // MessagePattern permits PatternProps.skipWhiteSpace(pattern, index)
  112|       |                // around the number, but this class does not.
  113|      0|                argNumber = -1;
  114|      0|                if (i < patternLength && DIGIT_ONE <= (c = patternBuffer[i++]) && c <= DIGIT_NINE) {
  ------------------
  |  Branch (114:21): [True: 0, False: 0]
  |  Branch (114:42): [True: 0, False: 0]
  |  Branch (114:83): [True: 0, False: 0]
  ------------------
  115|      0|                    argNumber = c - DIGIT_ZERO;
  116|      0|                    while (i < patternLength &&
  ------------------
  |  Branch (116:28): [True: 0, False: 0]
  ------------------
  117|      0|                            DIGIT_ZERO <= (c = patternBuffer[i++]) && c <= DIGIT_NINE) {
  ------------------
  |  Branch (117:29): [True: 0, False: 0]
  |  Branch (117:71): [True: 0, False: 0]
  ------------------
  118|      0|                        argNumber = argNumber * 10 + (c - DIGIT_ZERO);
  119|      0|                        if (argNumber >= ARG_NUM_LIMIT) {
  ------------------
  |  Branch (119:29): [True: 0, False: 0]
  ------------------
  120|      0|                            break;
  121|      0|                        }
  122|      0|                    }
  123|      0|                }
  124|      0|                if (argNumber < 0 || c != CLOSE_BRACE) {
  ------------------
  |  Branch (124:21): [True: 0, False: 0]
  |  Branch (124:38): [True: 0, False: 0]
  ------------------
  125|      0|                    errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  126|      0|                    return false;
  127|      0|                }
  128|      0|            }
  129|  12.1k|            if (argNumber > maxArg) {
  ------------------
  |  Branch (129:17): [True: 12.1k, False: 0]
  ------------------
  130|  12.1k|                maxArg = argNumber;
  131|  12.1k|            }
  132|  12.1k|            compiledPattern.append(static_cast<char16_t>(argNumber));
  133|  12.1k|            continue;
  134|  12.1k|        }  // else: c is part of literal text
  135|       |        // Append c and track the literal-text segment length.
  136|  17.0k|        if (textLength == 0) {
  ------------------
  |  Branch (136:13): [True: 12.1k, False: 4.84k]
  ------------------
  137|       |            // Reserve a char for the length of a new text segment, preset the maximum length.
  138|  12.1k|            compiledPattern.append(SEGMENT_LENGTH_PLACEHOLDER_CHAR);
  139|  12.1k|        }
  140|  17.0k|        compiledPattern.append(c);
  141|  17.0k|        if (++textLength == MAX_SEGMENT_LENGTH) {
  ------------------
  |  Branch (141:13): [True: 0, False: 17.0k]
  ------------------
  142|      0|            textLength = 0;
  143|      0|        }
  144|  17.0k|    }
  145|  12.1k|    if (textLength > 0) {
  ------------------
  |  Branch (145:9): [True: 11.9k, False: 256]
  ------------------
  146|  11.9k|        compiledPattern.setCharAt(compiledPattern.length() - textLength - 1,
  147|  11.9k|                                  static_cast<char16_t>(ARG_NUM_LIMIT + textLength));
  148|  11.9k|    }
  149|  12.1k|    int32_t argCount = maxArg + 1;
  150|  12.1k|    if (argCount < min || max < argCount) {
  ------------------
  |  Branch (150:9): [True: 0, False: 12.1k]
  |  Branch (150:27): [True: 0, False: 12.1k]
  ------------------
  151|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  152|      0|        return false;
  153|      0|    }
  154|  12.1k|    compiledPattern.setCharAt(0, static_cast<char16_t>(argCount));
  155|  12.1k|    return true;
  156|  12.1k|}

_ZN6icu_7811StringPieceC2EPKc:
   19|   628k|    : ptr_(str), length_((str == nullptr) ? 0 : static_cast<int32_t>(uprv_strlen(str))) { }
  ------------------
  |  |   37|   628k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   628k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (19:26): [True: 0, False: 628k]
  ------------------
_ZN6icu_7811StringPiece7compareES0_:
   73|   149k|int32_t StringPiece::compare(StringPiece other) {
   74|   149k|  int32_t i = 0;
   75|   373k|  for (; i < length(); i++) {
  ------------------
  |  Branch (75:10): [True: 336k, False: 37.3k]
  ------------------
   76|   336k|    if (i == other.length()) {
  ------------------
  |  Branch (76:9): [True: 0, False: 336k]
  ------------------
   77|       |      // this is longer
   78|      0|      return 1;
   79|      0|    }
   80|   336k|    char a = data()[i];
   81|   336k|    char b = other.data()[i];
   82|   336k|    if (a < b) {
  ------------------
  |  Branch (82:9): [True: 74.6k, False: 261k]
  ------------------
   83|  74.6k|      return -1;
   84|   261k|    } else if (a > b) {
  ------------------
  |  Branch (84:16): [True: 37.3k, False: 224k]
  ------------------
   85|  37.3k|      return 1;
   86|  37.3k|    }
   87|   336k|  }
   88|  37.3k|  if (i < other.length()) {
  ------------------
  |  Branch (88:7): [True: 0, False: 37.3k]
  ------------------
   89|       |    // other is longer
   90|      0|    return -1;
   91|      0|  }
   92|  37.3k|  return 0;
   93|  37.3k|}

_ZN6icu_7817StringTrieBuilderC2Ev:
   39|      1|StringTrieBuilder::StringTrieBuilder() : nodes(nullptr) {}
_ZN6icu_7817StringTrieBuilderD2Ev:
   41|      1|StringTrieBuilder::~StringTrieBuilder() {
   42|      1|    deleteCompactBuilder();
   43|      1|}
_ZN6icu_7817StringTrieBuilder20deleteCompactBuilderEv:
   62|      1|StringTrieBuilder::deleteCompactBuilder() {
   63|      1|    uhash_close(nodes);
  ------------------
  |  |  991|      1|#define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   64|      1|    nodes=nullptr;
   65|      1|}
_ZN6icu_7817StringTrieBuilder5buildE22UStringTrieBuildOptioniR10UErrorCode:
   69|      1|                       UErrorCode &errorCode) {
   70|      1|    if(buildOption==USTRINGTRIE_BUILD_FAST) {
  ------------------
  |  Branch (70:8): [True: 1, False: 0]
  ------------------
   71|      1|        writeNode(0, elementsLength, 0);
   72|      1|    } else /* USTRINGTRIE_BUILD_SMALL */ {
   73|      0|        createCompactBuilder(2*elementsLength, errorCode);
   74|      0|        Node *root=makeNode(0, elementsLength, 0, errorCode);
   75|      0|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (75:12): [True: 0, False: 0]
  ------------------
   76|      0|            root->markRightEdgesFirst(-1);
   77|      0|            root->write(*this);
   78|      0|        }
   79|      0|        deleteCompactBuilder();
   80|      0|    }
   81|      1|}
_ZN6icu_7817StringTrieBuilder9writeNodeEiii:
   87|    158|StringTrieBuilder::writeNode(int32_t start, int32_t limit, int32_t unitIndex) {
   88|    158|    UBool hasValue=false;
   89|    158|    int32_t value=0;
   90|    158|    int32_t type;
   91|    158|    if(unitIndex==getElementStringLength(start)) {
  ------------------
  |  Branch (91:8): [True: 65, False: 93]
  ------------------
   92|       |        // An intermediate or final value.
   93|     65|        value=getElementValue(start++);
   94|     65|        if(start==limit) {
  ------------------
  |  Branch (94:12): [True: 59, False: 6]
  ------------------
   95|     59|            return writeValueAndFinal(value, true);  // final-value node
   96|     59|        }
   97|      6|        hasValue=true;
   98|      6|    }
   99|       |    // Now all [start..limit[ strings are longer than unitIndex.
  100|     99|    int32_t minUnit=getElementUnit(start, unitIndex);
  101|     99|    int32_t maxUnit=getElementUnit(limit-1, unitIndex);
  102|     99|    if(minUnit==maxUnit) {
  ------------------
  |  Branch (102:8): [True: 72, False: 27]
  ------------------
  103|       |        // Linear-match node: All strings have the same character at unitIndex.
  104|     72|        int32_t lastUnitIndex=getLimitOfLinearMatch(start, limit-1, unitIndex);
  105|     72|        writeNode(start, limit, lastUnitIndex);
  106|       |        // Break the linear-match sequence into chunks of at most kMaxLinearMatchLength.
  107|     72|        int32_t length=lastUnitIndex-unitIndex;
  108|     72|        int32_t maxLinearMatchLength=getMaxLinearMatchLength();
  109|     72|        while(length>maxLinearMatchLength) {
  ------------------
  |  Branch (109:15): [True: 0, False: 72]
  ------------------
  110|      0|            lastUnitIndex-=maxLinearMatchLength;
  111|      0|            length-=maxLinearMatchLength;
  112|      0|            writeElementUnits(start, lastUnitIndex, maxLinearMatchLength);
  113|      0|            write(getMinLinearMatch()+maxLinearMatchLength-1);
  114|      0|        }
  115|     72|        writeElementUnits(start, unitIndex, length);
  116|     72|        type=getMinLinearMatch()+length-1;
  117|     72|    } else {
  118|       |        // Branch node.
  119|     27|        int32_t length=countElementUnits(start, limit, unitIndex);
  120|       |        // length>=2 because minUnit!=maxUnit.
  121|     27|        writeBranchSubNode(start, limit, unitIndex, length);
  122|     27|        if(--length<getMinLinearMatch()) {
  ------------------
  |  Branch (122:12): [True: 27, False: 0]
  ------------------
  123|     27|            type=length;
  124|     27|        } else {
  125|      0|            write(length);
  126|      0|            type=0;
  127|      0|        }
  128|     27|    }
  129|     99|    return writeValueAndType(hasValue, value, type);
  130|    158|}
_ZN6icu_7817StringTrieBuilder18writeBranchSubNodeEiiii:
  135|     32|StringTrieBuilder::writeBranchSubNode(int32_t start, int32_t limit, int32_t unitIndex, int32_t length) {
  136|     32|    char16_t middleUnits[kMaxSplitBranchLevels];
  137|     32|    int32_t lessThan[kMaxSplitBranchLevels];
  138|     32|    int32_t ltLength=0;
  139|     37|    while(length>getMaxBranchLinearSubNodeLength()) {
  ------------------
  |  Branch (139:11): [True: 5, False: 32]
  ------------------
  140|       |        // Branch on the middle unit.
  141|       |        // First, find the middle unit.
  142|      5|        int32_t i=skipElementsBySomeUnits(start, unitIndex, length/2);
  143|       |        // Encode the less-than branch first.
  144|      5|        middleUnits[ltLength]=getElementUnit(i, unitIndex);  // middle unit
  145|      5|        lessThan[ltLength]=writeBranchSubNode(start, i, unitIndex, length/2);
  146|      5|        ++ltLength;
  147|       |        // Continue for the greater-or-equal branch.
  148|      5|        start=i;
  149|      5|        length=length-length/2;
  150|      5|    }
  151|       |    // For each unit, find its elements array start and whether it has a final value.
  152|     32|    int32_t starts[kMaxBranchLinearSubNodeLength];
  153|     32|    UBool isFinal[kMaxBranchLinearSubNodeLength-1];
  154|     32|    int32_t unitNumber=0;
  155|     60|    do {
  156|     60|        int32_t i=starts[unitNumber]=start;
  157|     60|        char16_t unit=getElementUnit(i++, unitIndex);
  158|     60|        i=indexOfElementWithNextUnit(i, unitIndex, unit);
  159|     60|        isFinal[unitNumber]= start==i-1 && unitIndex+1==getElementStringLength(start);
  ------------------
  |  Branch (159:30): [True: 37, False: 23]
  |  Branch (159:44): [True: 7, False: 30]
  ------------------
  160|     60|        start=i;
  161|     60|    } while(++unitNumber<length-1);
  ------------------
  |  Branch (161:13): [True: 28, False: 32]
  ------------------
  162|       |    // unitNumber==length-1, and the maxUnit elements range is [start..limit[
  163|     32|    starts[unitNumber]=start;
  164|       |
  165|       |    // Write the sub-nodes in reverse order: The jump lengths are deltas from
  166|       |    // after their own positions, so if we wrote the minUnit sub-node first,
  167|       |    // then its jump delta would be larger.
  168|       |    // Instead we write the minUnit sub-node last, for a shorter delta.
  169|     32|    int32_t jumpTargets[kMaxBranchLinearSubNodeLength-1];
  170|     60|    do {
  171|     60|        --unitNumber;
  172|     60|        if(!isFinal[unitNumber]) {
  ------------------
  |  Branch (172:12): [True: 53, False: 7]
  ------------------
  173|     53|            jumpTargets[unitNumber]=writeNode(starts[unitNumber], starts[unitNumber+1], unitIndex+1);
  174|     53|        }
  175|     60|    } while(unitNumber>0);
  ------------------
  |  Branch (175:13): [True: 28, False: 32]
  ------------------
  176|       |    // The maxUnit sub-node is written as the very last one because we do
  177|       |    // not jump for it at all.
  178|     32|    unitNumber=length-1;
  179|     32|    writeNode(start, limit, unitIndex+1);
  180|     32|    int32_t offset=write(getElementUnit(start, unitIndex));
  181|       |    // Write the rest of this node's unit-value pairs.
  182|     92|    while(--unitNumber>=0) {
  ------------------
  |  Branch (182:11): [True: 60, False: 32]
  ------------------
  183|     60|        start=starts[unitNumber];
  184|     60|        int32_t value;
  185|     60|        if(isFinal[unitNumber]) {
  ------------------
  |  Branch (185:12): [True: 7, False: 53]
  ------------------
  186|       |            // Write the final value for the one string ending with this unit.
  187|      7|            value=getElementValue(start);
  188|     53|        } else {
  189|       |            // Write the delta to the start position of the sub-node.
  190|     53|            value=offset-jumpTargets[unitNumber];
  191|     53|        }
  192|     60|        writeValueAndFinal(value, isFinal[unitNumber]);
  193|     60|        offset=write(getElementUnit(start, unitIndex));
  194|     60|    }
  195|       |    // Write the split-branch nodes.
  196|     37|    while(ltLength>0) {
  ------------------
  |  Branch (196:11): [True: 5, False: 32]
  ------------------
  197|      5|        --ltLength;
  198|      5|        writeDeltaTo(lessThan[ltLength]);
  199|      5|        offset=write(middleUnits[ltLength]);
  200|      5|    }
  201|     32|    return offset;
  202|     32|}

uprv_stableBinarySearch_78:
   76|     60|                        UComparator *cmp, const void *context) {
   77|     60|    int32_t start=0;
   78|     60|    UBool found=false;
   79|       |
   80|       |    /* Binary search until we get down to a tiny sub-array. */
   81|     60|    while((limit-start)>=MIN_QSORT) {
  ------------------
  |  Branch (81:11): [True: 0, False: 60]
  ------------------
   82|      0|        int32_t i=(start+limit)/2;
   83|      0|        int32_t diff=cmp(context, item, array+i*itemSize);
   84|      0|        if(diff==0) {
  ------------------
  |  Branch (84:12): [True: 0, False: 0]
  ------------------
   85|       |            /*
   86|       |             * Found the item. We look for the *last* occurrence of such
   87|       |             * an item, for stable sorting.
   88|       |             * If we knew that there will be only few equal items,
   89|       |             * we could break now and enter the linear search.
   90|       |             * However, if there are many equal items, then it should be
   91|       |             * faster to continue with the binary search.
   92|       |             * It seems likely that we either have all unique items
   93|       |             * (where found will never become true in the insertion sort)
   94|       |             * or potentially many duplicates.
   95|       |             */
   96|      0|            found=true;
   97|      0|            start=i+1;
   98|      0|        } else if(diff<0) {
  ------------------
  |  Branch (98:19): [True: 0, False: 0]
  ------------------
   99|      0|            limit=i;
  100|      0|        } else {
  101|      0|            start=i;
  102|      0|        }
  103|      0|    }
  104|       |
  105|       |    /* Linear search over the remaining tiny sub-array. */
  106|    196|    while(start<limit) {
  ------------------
  |  Branch (106:11): [True: 173, False: 23]
  ------------------
  107|    173|        int32_t diff=cmp(context, item, array+start*itemSize);
  108|    173|        if(diff==0) {
  ------------------
  |  Branch (108:12): [True: 0, False: 173]
  ------------------
  109|      0|            found=true;
  110|    173|        } else if(diff<0) {
  ------------------
  |  Branch (110:19): [True: 37, False: 136]
  ------------------
  111|     37|            break;
  112|     37|        }
  113|    136|        ++start;
  114|    136|    }
  115|     60|    return found ? (start-1) : ~start;
  ------------------
  |  Branch (115:12): [True: 0, False: 60]
  ------------------
  116|     60|}
uprv_sortArray_78:
  258|    718|               UBool sortStable, UErrorCode *pErrorCode) {
  259|    718|    if(pErrorCode==nullptr || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (259:8): [True: 0, False: 718]
  |  Branch (259:31): [True: 0, False: 718]
  ------------------
  260|      0|        return;
  261|      0|    }
  262|    718|    if((length>0 && array==nullptr) || length<0 || itemSize<=0 || cmp==nullptr) {
  ------------------
  |  Branch (262:9): [True: 2, False: 716]
  |  Branch (262:21): [True: 0, False: 2]
  |  Branch (262:40): [True: 0, False: 718]
  |  Branch (262:52): [True: 0, False: 718]
  |  Branch (262:67): [True: 0, False: 718]
  ------------------
  263|      0|        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
  264|      0|        return;
  265|      0|    }
  266|       |
  267|    718|    if(length<=1) {
  ------------------
  |  Branch (267:8): [True: 717, False: 1]
  ------------------
  268|    717|        return;
  269|    717|    } else if(length<MIN_QSORT || sortStable) {
  ------------------
  |  Branch (269:15): [True: 0, False: 1]
  |  Branch (269:35): [True: 0, False: 1]
  ------------------
  270|      0|        insertionSort((char *)array, length, itemSize, cmp, context, pErrorCode);
  271|      1|    } else {
  272|      1|        quickSort((char *)array, length, itemSize, cmp, context, pErrorCode);
  273|      1|    }
  274|    718|}
uarrsort.cpp:_ZL16sizeInMaxAlignTsi:
   39|      2|static constexpr int32_t sizeInMaxAlignTs(int32_t sizeInBytes) {
   40|      2|    return (sizeInBytes + sizeof(std::max_align_t) - 1) / sizeof(std::max_align_t);
   41|      2|}
uarrsort.cpp:_ZL15doInsertionSortPciiPFiPKvS1_S1_ES1_Pv:
  120|     11|                UComparator *cmp, const void *context, void *pv) {
  121|     11|    int32_t j;
  122|       |
  123|     71|    for(j=1; j<length; ++j) {
  ------------------
  |  Branch (123:14): [True: 60, False: 11]
  ------------------
  124|     60|        char *item=array+j*itemSize;
  125|     60|        int32_t insertionPoint=uprv_stableBinarySearch(array, j, item, itemSize, cmp, context);
  ------------------
  |  | 1539|     60|#define uprv_stableBinarySearch U_ICU_ENTRY_POINT_RENAME(uprv_stableBinarySearch)
  |  |  ------------------
  |  |  |  |  123|     60|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     60|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     60|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  126|     60|        if(insertionPoint<0) {
  ------------------
  |  Branch (126:12): [True: 60, False: 0]
  ------------------
  127|     60|            insertionPoint=~insertionPoint;
  128|     60|        } else {
  129|      0|            ++insertionPoint;  /* one past the last equal item */
  130|      0|        }
  131|     60|        if(insertionPoint<j) {
  ------------------
  |  Branch (131:12): [True: 37, False: 23]
  ------------------
  132|     37|            char *dest=array+insertionPoint*itemSize;
  133|     37|            uprv_memcpy(pv, item, itemSize);  /* v=array[j] */
  ------------------
  |  |   42|     37|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     37|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|     37|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|     37|    _Pragma("clang diagnostic push") \
  |  |   45|     37|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|     37|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     37|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|     37|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     37|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|     37|    _Pragma("clang diagnostic pop") \
  |  |   49|     37|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     37|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|     37|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     37|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  134|     37|            uprv_memmove(dest+itemSize, dest, (j-insertionPoint)*(size_t)itemSize);
  ------------------
  |  |   51|     37|#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     37|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   52|     37|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   53|     37|    _Pragma("clang diagnostic push") \
  |  |   54|     37|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   55|     37|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     37|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   56|     37|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     37|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   57|     37|    _Pragma("clang diagnostic pop") \
  |  |   58|     37|    U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     37|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   59|     37|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     37|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  135|     37|            uprv_memcpy(dest, pv, itemSize);  /* array[insertionPoint]=v */
  ------------------
  |  |   42|     37|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     37|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|     37|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|     37|    _Pragma("clang diagnostic push") \
  |  |   45|     37|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|     37|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     37|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|     37|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     37|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|     37|    _Pragma("clang diagnostic pop") \
  |  |   49|     37|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     37|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|     37|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     37|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  136|     37|        }
  137|     60|    }
  138|     11|}
uarrsort.cpp:_ZL9quickSortPciiPFiPKvS1_S1_ES1_P10UErrorCode:
  236|      1|            UComparator *cmp, const void *context, UErrorCode *pErrorCode) {
  237|       |    /* allocate two intermediate item variables (x and w) */
  238|      1|    icu::MaybeStackArray<std::max_align_t, sizeInMaxAlignTs(STACK_ITEM_SIZE) * 2> xw;
  239|      1|    if(sizeInMaxAlignTs(itemSize)*2 > xw.getCapacity() &&
  ------------------
  |  Branch (239:8): [True: 0, False: 1]
  ------------------
  240|      1|            xw.resize(sizeInMaxAlignTs(itemSize) * 2) == nullptr) {
  ------------------
  |  Branch (240:13): [True: 0, False: 0]
  ------------------
  241|      0|        *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
  242|      0|        return;
  243|      0|    }
  244|       |
  245|      1|    subQuickSort(array, 0, length, itemSize, cmp, context,
  246|      1|                 xw.getAlias(), xw.getAlias() + sizeInMaxAlignTs(itemSize));
  247|      1|}
uarrsort.cpp:_ZL12subQuickSortPciiiPFiPKvS1_S1_ES1_PvS4_:
  171|     11|             void *px, void *pw) {
  172|     11|    int32_t left, right;
  173|       |
  174|       |    /* start and left are inclusive, limit and right are exclusive */
  175|     22|    do {
  176|     22|        if((start+MIN_QSORT)>=limit) {
  ------------------
  |  Branch (176:12): [True: 11, False: 11]
  ------------------
  177|     11|            doInsertionSort(array+start*itemSize, limit-start, itemSize, cmp, context, px);
  178|     11|            break;
  179|     11|        }
  180|       |
  181|     11|        left=start;
  182|     11|        right=limit;
  183|       |
  184|       |        /* x=array[middle] */
  185|     11|        uprv_memcpy(px, array+(size_t)((start+limit)/2)*itemSize, itemSize);
  ------------------
  |  |   42|     11|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     11|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|     11|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|     11|    _Pragma("clang diagnostic push") \
  |  |   45|     11|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|     11|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     11|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|     11|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     11|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|     11|    _Pragma("clang diagnostic pop") \
  |  |   49|     11|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     11|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|     11|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     11|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  186|       |
  187|     65|        do {
  188|     65|            while(/* array[left]<x */
  189|    215|                  cmp(context, array+left*itemSize, px)<0
  ------------------
  |  Branch (189:19): [True: 150, False: 65]
  ------------------
  190|    150|            ) {
  191|    150|                ++left;
  192|    150|            }
  193|     65|            while(/* x<array[right-1] */
  194|    185|                  cmp(context, px, array+(right-1)*itemSize)<0
  ------------------
  |  Branch (194:19): [True: 120, False: 65]
  ------------------
  195|    120|            ) {
  196|    120|                --right;
  197|    120|            }
  198|       |
  199|       |            /* swap array[left] and array[right-1] via w; ++left; --right */
  200|     65|            if(left<right) {
  ------------------
  |  Branch (200:16): [True: 57, False: 8]
  ------------------
  201|     57|                --right;
  202|       |
  203|     57|                if(left<right) {
  ------------------
  |  Branch (203:20): [True: 57, False: 0]
  ------------------
  204|     57|                    uprv_memcpy(pw, array+(size_t)left*itemSize, itemSize);
  ------------------
  |  |   42|     57|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     57|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|     57|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|     57|    _Pragma("clang diagnostic push") \
  |  |   45|     57|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|     57|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     57|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|     57|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     57|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|     57|    _Pragma("clang diagnostic pop") \
  |  |   49|     57|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     57|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|     57|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     57|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|     57|                    uprv_memcpy(array+(size_t)left*itemSize, array+(size_t)right*itemSize, itemSize);
  ------------------
  |  |   42|     57|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     57|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|     57|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|     57|    _Pragma("clang diagnostic push") \
  |  |   45|     57|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|     57|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     57|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|     57|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     57|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|     57|    _Pragma("clang diagnostic pop") \
  |  |   49|     57|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     57|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|     57|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     57|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  206|     57|                    uprv_memcpy(array+(size_t)right*itemSize, pw, itemSize);
  ------------------
  |  |   42|     57|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     57|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|     57|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|     57|    _Pragma("clang diagnostic push") \
  |  |   45|     57|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|     57|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     57|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|     57|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     57|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|     57|    _Pragma("clang diagnostic pop") \
  |  |   49|     57|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     57|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|     57|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     57|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  207|     57|                }
  208|       |
  209|     57|                ++left;
  210|     57|            }
  211|     65|        } while(left<right);
  ------------------
  |  Branch (211:17): [True: 54, False: 11]
  ------------------
  212|       |
  213|       |        /* sort sub-arrays */
  214|     11|        if((right-start)<(limit-left)) {
  ------------------
  |  Branch (214:12): [True: 5, False: 6]
  ------------------
  215|       |            /* sort [start..right[ */
  216|      5|            if(start<(right-1)) {
  ------------------
  |  Branch (216:16): [True: 4, False: 1]
  ------------------
  217|      4|                subQuickSort(array, start, right, itemSize, cmp, context, px, pw);
  218|      4|            }
  219|       |
  220|       |            /* sort [left..limit[ */
  221|      5|            start=left;
  222|      6|        } else {
  223|       |            /* sort [left..limit[ */
  224|      6|            if(left<(limit-1)) {
  ------------------
  |  Branch (224:16): [True: 6, False: 0]
  ------------------
  225|      6|                subQuickSort(array, left, limit, itemSize, cmp, context, px, pw);
  226|      6|            }
  227|       |
  228|       |            /* sort [start..right[ */
  229|      6|            limit=right;
  230|      6|        }
  231|     11|    } while(start<(limit-1));
  ------------------
  |  Branch (231:13): [True: 11, False: 0]
  ------------------
  232|     11|}

u_charDigitValue_78:
  343|  3.51k|u_charDigitValue(UChar32 c) {
  344|  3.51k|    uint32_t props;
  345|  3.51k|    int32_t value;
  346|  3.51k|    GET_PROPS(c, props);
  ------------------
  |  |   44|  3.51k|#define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c))
  |  |  ------------------
  |  |  |  |  360|  3.51k|#define UTRIE2_GET16(trie, c) _UTRIE2_GET((trie), index, (trie)->indexLength, (c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  871|  3.51k|    (trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  845|  3.51k|    ((uint32_t)(c)<0xd800 ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (845:6): [True: 3.51k, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  846|  3.51k|        _UTRIE2_INDEX_RAW(0, (trie)->index, c) : \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  815|  3.51k|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  |  |  816|  3.51k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  817|  3.51k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  847|  3.51k|        (uint32_t)(c)<=0xffff ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (847:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  848|      0|            _UTRIE2_INDEX_RAW( \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  815|      0|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (815:30): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  816|      0|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  817|      0|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  849|      0|                (c)<=0xdbff ? UTRIE2_LSCP_INDEX_2_OFFSET-(0xd800>>UTRIE2_SHIFT_2) : 0, \
  |  |  |  |  |  |  |  |  850|      0|                (trie)->index, c) : \
  |  |  |  |  |  |  |  |  851|      0|            (uint32_t)(c)>0x10ffff ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (851:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  852|      0|                (asciiOffset)+UTRIE2_BAD_UTF8_DATA_OFFSET : \
  |  |  |  |  |  |  |  |  853|      0|                (c)>=(trie)->highStart ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (853:17): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|      0|                    (trie)->highValueIndex : \
  |  |  |  |  |  |  |  |  855|      0|                    _UTRIE2_INDEX_FROM_SUPP((trie)->index, c))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  833|      0|    (((int32_t)((trieIndex)[ \
  |  |  |  |  |  |  |  |  |  |  834|      0|        (trieIndex)[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+ \
  |  |  |  |  |  |  |  |  |  |  835|      0|                      ((c)>>UTRIE2_SHIFT_1)]+ \
  |  |  |  |  |  |  |  |  |  |  836|      0|        (((c)>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK)]) \
  |  |  |  |  |  |  |  |  |  |  837|      0|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  838|      0|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  347|  3.51k|    value=(int32_t)GET_NUMERIC_TYPE_VALUE(props)-UPROPS_NTV_DECIMAL_START;
  ------------------
  |  |   68|  3.51k|#define GET_NUMERIC_TYPE_VALUE(props) ((props)>>UPROPS_NUMERIC_TYPE_VALUE_SHIFT)
  ------------------
  348|  3.51k|    if(value<=9) {
  ------------------
  |  Branch (348:8): [True: 3.51k, False: 0]
  ------------------
  349|  3.51k|        return value;
  350|  3.51k|    } else {
  351|      0|        return -1;
  352|      0|    }
  353|  3.51k|}
u_digit_78:
  449|  3.51k|u_digit(UChar32 ch, int8_t radix) {
  450|  3.51k|    int8_t value;
  451|  3.51k|    if((uint8_t)(radix-2)<=(36-2)) {
  ------------------
  |  Branch (451:8): [True: 3.51k, False: 0]
  ------------------
  452|  3.51k|        value=(int8_t)u_charDigitValue(ch);
  ------------------
  |  |  220|  3.51k|#define u_charDigitValue U_ICU_ENTRY_POINT_RENAME(u_charDigitValue)
  |  |  ------------------
  |  |  |  |  123|  3.51k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.51k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.51k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  453|  3.51k|        if(value<0) {
  ------------------
  |  Branch (453:12): [True: 0, False: 3.51k]
  ------------------
  454|       |            /* ch is not a decimal digit, try latin letters */
  455|      0|            if(ch>=0x61 && ch<=0x7A) {
  ------------------
  |  Branch (455:16): [True: 0, False: 0]
  |  Branch (455:28): [True: 0, False: 0]
  ------------------
  456|      0|                value=(int8_t)(ch-0x57);  /* ch - 'a' + 10 */
  457|      0|            } else if(ch>=0x41 && ch<=0x5A) {
  ------------------
  |  Branch (457:23): [True: 0, False: 0]
  |  Branch (457:35): [True: 0, False: 0]
  ------------------
  458|      0|                value=(int8_t)(ch-0x37);  /* ch - 'A' + 10 */
  459|      0|            } else if(ch>=0xFF41 && ch<=0xFF5A) {
  ------------------
  |  Branch (459:23): [True: 0, False: 0]
  |  Branch (459:37): [True: 0, False: 0]
  ------------------
  460|      0|                value=(int8_t)(ch-0xFF37);  /* fullwidth ASCII a-z */
  461|      0|            } else if(ch>=0xFF21 && ch<=0xFF3A) {
  ------------------
  |  Branch (461:23): [True: 0, False: 0]
  |  Branch (461:37): [True: 0, False: 0]
  ------------------
  462|      0|                value=(int8_t)(ch-0xFF17);  /* fullwidth ASCII A-Z */
  463|      0|            }
  464|      0|        }
  465|  3.51k|    } else {
  466|      0|        value=-1;   /* invalid radix */
  467|      0|    }
  468|  3.51k|    return (int8_t)((value<radix) ? value : -1);
  ------------------
  |  Branch (468:21): [True: 3.51k, False: 0]
  ------------------
  469|  3.51k|}

_ZN6icu_7810UCharsTrieD2Ev:
   27|  4.72k|UCharsTrie::~UCharsTrie() {
   28|  4.72k|    uprv_free(ownedArray_);
  ------------------
  |  | 1503|  4.72k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  4.72k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.72k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.72k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   29|  4.72k|}
_ZNK6icu_7810UCharsTrie7currentEv:
   32|  4.42k|UCharsTrie::current() const {
   33|  4.42k|    const char16_t *pos=pos_;
   34|  4.42k|    if(pos==nullptr) {
  ------------------
  |  Branch (34:8): [True: 174, False: 4.25k]
  ------------------
   35|    174|        return USTRINGTRIE_NO_MATCH;
   36|  4.25k|    } else {
   37|  4.25k|        int32_t node;
   38|  4.25k|        return (remainingMatchLength_<0 && (node=*pos)>=kMinValueLead) ?
  ------------------
  |  Branch (38:17): [True: 4.24k, False: 6]
  |  Branch (38:44): [True: 4.22k, False: 21]
  ------------------
   39|  4.22k|                valueResult(node) : USTRINGTRIE_NO_VALUE;
   40|  4.25k|    }
   41|  4.42k|}
_ZN6icu_7810UCharsTrie16nextForCodePointEi:
   53|  11.0M|UCharsTrie::nextForCodePoint(UChar32 cp) {
   54|  11.0M|    return cp<=0xffff ?
  ------------------
  |  Branch (54:12): [True: 11.0M, False: 756]
  ------------------
   55|  11.0M|        next(cp) :
   56|  11.0M|        (USTRINGTRIE_HAS_NEXT(next(U16_LEAD(cp))) ?
  ------------------
  |  |   95|    756|#define USTRINGTRIE_HAS_NEXT(result) ((result)&1)
  |  |  ------------------
  |  |  |  Branch (95:38): [True: 0, False: 756]
  |  |  ------------------
  ------------------
   57|      0|            next(U16_TRAIL(cp)) :
  ------------------
  |  |  132|      0|#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
  ------------------
   58|    756|            USTRINGTRIE_NO_MATCH);
   59|  11.0M|}
_ZN6icu_7810UCharsTrie10branchNextEPKDsii:
   62|  8.98k|UCharsTrie::branchNext(const char16_t *pos, int32_t length, int32_t uchar) {
   63|       |    // Branch according to the current unit.
   64|  8.98k|    if(length==0) {
  ------------------
  |  Branch (64:8): [True: 0, False: 8.98k]
  ------------------
   65|      0|        length=*pos++;
   66|      0|    }
   67|  8.98k|    ++length;
   68|       |    // The length of the branch is the number of units to select from.
   69|       |    // The data structure encodes a binary search.
   70|  20.4k|    while(length>kMaxBranchLinearSubNodeLength) {
  ------------------
  |  Branch (70:11): [True: 11.4k, False: 8.98k]
  ------------------
   71|  11.4k|        if(uchar<*pos++) {
  ------------------
  |  Branch (71:12): [True: 6.26k, False: 5.18k]
  ------------------
   72|  6.26k|            length>>=1;
   73|  6.26k|            pos=jumpByDelta(pos);
   74|  6.26k|        } else {
   75|  5.18k|            length=length-(length>>1);
   76|  5.18k|            pos=skipDelta(pos);
   77|  5.18k|        }
   78|  11.4k|    }
   79|       |    // Drop down to linear search for the last few units.
   80|       |    // length>=2 because the loop body above sees length>kMaxBranchLinearSubNodeLength>=3
   81|       |    // and divides length by 2.
   82|  17.0k|    do {
   83|  17.0k|        if(uchar==*pos++) {
  ------------------
  |  Branch (83:12): [True: 7.46k, False: 9.56k]
  ------------------
   84|  7.46k|            UStringTrieResult result;
   85|  7.46k|            int32_t node=*pos;
   86|  7.46k|            if(node&kValueIsFinal) {
  ------------------
  |  Branch (86:16): [True: 49, False: 7.41k]
  ------------------
   87|       |                // Leave the final value for getValue() to read.
   88|     49|                result=USTRINGTRIE_FINAL_VALUE;
   89|  7.41k|            } else {
   90|       |                // Use the non-final value as the jump delta.
   91|  7.41k|                ++pos;
   92|       |                // int32_t delta=readValue(pos, node);
   93|  7.41k|                int32_t delta;
   94|  7.41k|                if(node<kMinTwoUnitValueLead) {
  ------------------
  |  Branch (94:20): [True: 7.41k, False: 0]
  ------------------
   95|  7.41k|                    delta=node;
   96|  7.41k|                } else if(node<kThreeUnitValueLead) {
  ------------------
  |  Branch (96:27): [True: 0, False: 0]
  ------------------
   97|      0|                    delta=((node-kMinTwoUnitValueLead)<<16)|*pos++;
   98|      0|                } else {
   99|      0|                    delta=(pos[0]<<16)|pos[1];
  100|      0|                    pos+=2;
  101|      0|                }
  102|       |                // end readValue()
  103|  7.41k|                pos+=delta;
  104|  7.41k|                node=*pos;
  105|  7.41k|                result= node>=kMinValueLead ? valueResult(node) : USTRINGTRIE_NO_VALUE;
  ------------------
  |  Branch (105:25): [True: 2.57k, False: 4.83k]
  ------------------
  106|  7.41k|            }
  107|  7.46k|            pos_=pos;
  108|  7.46k|            return result;
  109|  7.46k|        }
  110|  9.56k|        --length;
  111|  9.56k|        pos=skipValue(pos);
  112|  9.56k|    } while(length>1);
  ------------------
  |  Branch (112:13): [True: 8.04k, False: 1.52k]
  ------------------
  113|  1.52k|    if(uchar==*pos++) {
  ------------------
  |  Branch (113:8): [True: 71, False: 1.45k]
  ------------------
  114|     71|        pos_=pos;
  115|     71|        int32_t node=*pos;
  116|     71|        return node>=kMinValueLead ? valueResult(node) : USTRINGTRIE_NO_VALUE;
  ------------------
  |  Branch (116:16): [True: 29, False: 42]
  ------------------
  117|  1.45k|    } else {
  118|  1.45k|        stop();
  119|  1.45k|        return USTRINGTRIE_NO_MATCH;
  120|  1.45k|    }
  121|  1.52k|}
_ZN6icu_7810UCharsTrie8nextImplEPKDsi:
  124|  10.6k|UCharsTrie::nextImpl(const char16_t *pos, int32_t uchar) {
  125|  10.6k|    int32_t node=*pos++;
  126|  10.7k|    for(;;) {
  127|  10.7k|        if(node<kMinLinearMatch) {
  ------------------
  |  Branch (127:12): [True: 8.98k, False: 1.81k]
  ------------------
  128|  8.98k|            return branchNext(pos, node, uchar);
  129|  8.98k|        } else if(node<kMinValueLead) {
  ------------------
  |  Branch (129:19): [True: 1.70k, False: 109]
  ------------------
  130|       |            // Match the first of length+1 units.
  131|  1.70k|            int32_t length=node-kMinLinearMatch;  // Actual match length minus 1.
  132|  1.70k|            if(uchar==*pos++) {
  ------------------
  |  Branch (132:16): [True: 1.69k, False: 11]
  ------------------
  133|  1.69k|                remainingMatchLength_=--length;
  134|  1.69k|                pos_=pos;
  135|  1.69k|                return (length<0 && (node=*pos)>=kMinValueLead) ?
  ------------------
  |  Branch (135:25): [True: 81, False: 1.61k]
  |  Branch (135:37): [True: 80, False: 1]
  ------------------
  136|  1.61k|                        valueResult(node) : USTRINGTRIE_NO_VALUE;
  137|  1.69k|            } else {
  138|       |                // No match.
  139|     11|                break;
  140|     11|            }
  141|  1.70k|        } else if(node&kValueIsFinal) {
  ------------------
  |  Branch (141:19): [True: 2, False: 107]
  ------------------
  142|       |            // No further matching units.
  143|      2|            break;
  144|    107|        } else {
  145|       |            // Skip intermediate value.
  146|    107|            pos=skipNodeValue(pos, node);
  147|    107|            node&=kNodeTypeMask;
  148|    107|        }
  149|  10.7k|    }
  150|     13|    stop();
  151|     13|    return USTRINGTRIE_NO_MATCH;
  152|  10.6k|}
_ZN6icu_7810UCharsTrie4nextEi:
  155|  11.0M|UCharsTrie::next(int32_t uchar) {
  156|  11.0M|    const char16_t *pos=pos_;
  157|  11.0M|    if(pos==nullptr) {
  ------------------
  |  Branch (157:8): [True: 11.0M, False: 12.3k]
  ------------------
  158|  11.0M|        return USTRINGTRIE_NO_MATCH;
  159|  11.0M|    }
  160|  12.3k|    int32_t length=remainingMatchLength_;  // Actual remaining match length minus 1.
  161|  12.3k|    if(length>=0) {
  ------------------
  |  Branch (161:8): [True: 1.65k, False: 10.6k]
  ------------------
  162|       |        // Remaining part of a linear-match node.
  163|  1.65k|        if(uchar==*pos++) {
  ------------------
  |  Branch (163:12): [True: 1.64k, False: 7]
  ------------------
  164|  1.64k|            remainingMatchLength_=--length;
  165|  1.64k|            pos_=pos;
  166|  1.64k|            int32_t node;
  167|  1.64k|            return (length<0 && (node=*pos)>=kMinValueLead) ?
  ------------------
  |  Branch (167:21): [True: 1.59k, False: 48]
  |  Branch (167:33): [True: 1.59k, False: 0]
  ------------------
  168|  1.59k|                    valueResult(node) : USTRINGTRIE_NO_VALUE;
  169|  1.64k|        } else {
  170|      7|            stop();
  171|      7|            return USTRINGTRIE_NO_MATCH;
  172|      7|        }
  173|  1.65k|    }
  174|  10.6k|    return nextImpl(pos, uchar);
  175|  12.3k|}

_ZN6icu_7817UCharsTrieElement5setToERKNS_13UnicodeStringEiRS1_R10UErrorCode:
   67|     72|                         UnicodeString &strings, UErrorCode &errorCode) {
   68|     72|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (68:8): [True: 0, False: 72]
  ------------------
   69|      0|        return;
   70|      0|    }
   71|     72|    int32_t length=s.length();
   72|     72|    if(length>0xffff) {
  ------------------
  |  Branch (72:8): [True: 0, False: 72]
  ------------------
   73|       |        // Too long: We store the length in 1 unit.
   74|      0|        errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
   75|      0|        return;
   76|      0|    }
   77|     72|    stringOffset=strings.length();
   78|     72|    strings.append(static_cast<char16_t>(length));
   79|     72|    value=val;
   80|     72|    strings.append(s);
   81|     72|}
_ZNK6icu_7817UCharsTrieElement15compareStringToERKS0_RKNS_13UnicodeStringE:
   84|    573|UCharsTrieElement::compareStringTo(const UCharsTrieElement &other, const UnicodeString &strings) const {
   85|    573|    return getString(strings).compare(other.getString(strings));
   86|    573|}
_ZN6icu_7817UCharsTrieBuilderC2ER10UErrorCode:
   89|      1|        : elements(nullptr), elementsCapacity(0), elementsLength(0),
   90|      1|          uchars(nullptr), ucharsCapacity(0), ucharsLength(0) {}
_ZN6icu_7817UCharsTrieBuilderD2Ev:
   92|      1|UCharsTrieBuilder::~UCharsTrieBuilder() {
   93|      1|    delete[] elements;
   94|      1|    uprv_free(uchars);
  ------------------
  |  | 1503|      1|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   95|      1|}
_ZN6icu_7817UCharsTrieBuilder3addERKNS_13UnicodeStringEiR10UErrorCode:
   98|     72|UCharsTrieBuilder::add(const UnicodeString &s, int32_t value, UErrorCode &errorCode) {
   99|     72|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (99:8): [True: 0, False: 72]
  ------------------
  100|      0|        return *this;
  101|      0|    }
  102|     72|    if(ucharsLength>0) {
  ------------------
  |  Branch (102:8): [True: 0, False: 72]
  ------------------
  103|       |        // Cannot add elements after building.
  104|      0|        errorCode=U_NO_WRITE_PERMISSION;
  105|      0|        return *this;
  106|      0|    }
  107|     72|    if(elementsLength==elementsCapacity) {
  ------------------
  |  Branch (107:8): [True: 1, False: 71]
  ------------------
  108|      1|        int32_t newCapacity;
  109|      1|        if(elementsCapacity==0) {
  ------------------
  |  Branch (109:12): [True: 1, False: 0]
  ------------------
  110|      1|            newCapacity=1024;
  111|      1|        } else {
  112|      0|            newCapacity=4*elementsCapacity;
  113|      0|        }
  114|      1|        UCharsTrieElement *newElements=new UCharsTrieElement[newCapacity];
  115|      1|        if(newElements==nullptr) {
  ------------------
  |  Branch (115:12): [True: 0, False: 1]
  ------------------
  116|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  117|      0|            return *this;
  118|      0|        }
  119|      1|        if(elementsLength>0) {
  ------------------
  |  Branch (119:12): [True: 0, False: 1]
  ------------------
  120|      0|            uprv_memcpy(newElements, elements, (size_t)elementsLength*sizeof(UCharsTrieElement));
  ------------------
  |  |   42|      0|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      0|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      0|    _Pragma("clang diagnostic push") \
  |  |   45|      0|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      0|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      0|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      0|    _Pragma("clang diagnostic pop") \
  |  |   49|      0|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  121|      0|        }
  122|      1|        delete[] elements;
  123|      1|        elements=newElements;
  124|      1|        elementsCapacity=newCapacity;
  125|      1|    }
  126|     72|    elements[elementsLength++].setTo(s, value, strings, errorCode);
  127|     72|    if(U_SUCCESS(errorCode) && strings.isBogus()) {
  ------------------
  |  Branch (127:8): [True: 72, False: 0]
  |  Branch (127:32): [True: 0, False: 72]
  ------------------
  128|      0|        errorCode=U_MEMORY_ALLOCATION_ERROR;
  129|      0|    }
  130|     72|    return *this;
  131|     72|}
_ZN6icu_7817UCharsTrieBuilder18buildUnicodeStringE22UStringTrieBuildOptionRNS_13UnicodeStringER10UErrorCode:
  163|      1|                                      UErrorCode &errorCode) {
  164|      1|    buildUChars(buildOption, errorCode);
  165|      1|    if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (165:8): [True: 1, False: 0]
  ------------------
  166|      1|        result.setTo(false, uchars+(ucharsCapacity-ucharsLength), ucharsLength);
  167|      1|    }
  168|      1|    return result;
  169|      1|}
_ZN6icu_7817UCharsTrieBuilder11buildUCharsE22UStringTrieBuildOptionR10UErrorCode:
  172|      1|UCharsTrieBuilder::buildUChars(UStringTrieBuildOption buildOption, UErrorCode &errorCode) {
  173|      1|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (173:8): [True: 0, False: 1]
  ------------------
  174|      0|        return;
  175|      0|    }
  176|      1|    if(uchars!=nullptr && ucharsLength>0) {
  ------------------
  |  Branch (176:8): [True: 0, False: 1]
  |  Branch (176:27): [True: 0, False: 0]
  ------------------
  177|       |        // Already built.
  178|      0|        return;
  179|      0|    }
  180|      1|    if(ucharsLength==0) {
  ------------------
  |  Branch (180:8): [True: 1, False: 0]
  ------------------
  181|      1|        if(elementsLength==0) {
  ------------------
  |  Branch (181:12): [True: 0, False: 1]
  ------------------
  182|      0|            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  183|      0|            return;
  184|      0|        }
  185|      1|        if(strings.isBogus()) {
  ------------------
  |  Branch (185:12): [True: 0, False: 1]
  ------------------
  186|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  187|      0|            return;
  188|      0|        }
  189|      1|        uprv_sortArray(elements, elementsLength, static_cast<int32_t>(sizeof(UCharsTrieElement)),
  ------------------
  |  | 1538|      1|#define uprv_sortArray U_ICU_ENTRY_POINT_RENAME(uprv_sortArray)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  190|      1|                      compareElementStrings, &strings,
  191|      1|                      false,  // need not be a stable sort
  192|      1|                      &errorCode);
  193|      1|        if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (193:12): [True: 0, False: 1]
  ------------------
  194|      0|            return;
  195|      0|        }
  196|       |        // Duplicate strings are not allowed.
  197|      1|        UnicodeString prev=elements[0].getString(strings);
  198|     72|        for(int32_t i=1; i<elementsLength; ++i) {
  ------------------
  |  Branch (198:26): [True: 71, False: 1]
  ------------------
  199|     71|            UnicodeString current=elements[i].getString(strings);
  200|     71|            if(prev==current) {
  ------------------
  |  Branch (200:16): [True: 0, False: 71]
  ------------------
  201|      0|                errorCode=U_ILLEGAL_ARGUMENT_ERROR;
  202|      0|                return;
  203|      0|            }
  204|     71|            prev.fastCopyFrom(current);
  205|     71|        }
  206|      1|    }
  207|       |    // Create and char16_t-serialize the trie for the elements.
  208|      1|    ucharsLength=0;
  209|      1|    int32_t capacity=strings.length();
  210|      1|    if(capacity<1024) {
  ------------------
  |  Branch (210:8): [True: 1, False: 0]
  ------------------
  211|      1|        capacity=1024;
  212|      1|    }
  213|      1|    if(ucharsCapacity<capacity) {
  ------------------
  |  Branch (213:8): [True: 1, False: 0]
  ------------------
  214|      1|        uprv_free(uchars);
  ------------------
  |  | 1503|      1|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  215|      1|        uchars=static_cast<char16_t *>(uprv_malloc(capacity*2));
  ------------------
  |  | 1524|      1|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  216|      1|        if(uchars==nullptr) {
  ------------------
  |  Branch (216:12): [True: 0, False: 1]
  ------------------
  217|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  218|      0|            ucharsCapacity=0;
  219|      0|            return;
  220|      0|        }
  221|      1|        ucharsCapacity=capacity;
  222|      1|    }
  223|      1|    StringTrieBuilder::build(buildOption, elementsLength, errorCode);
  224|      1|    if(uchars==nullptr) {
  ------------------
  |  Branch (224:8): [True: 0, False: 1]
  ------------------
  225|      0|        errorCode=U_MEMORY_ALLOCATION_ERROR;
  226|      0|    }
  227|      1|}
_ZNK6icu_7817UCharsTrieBuilder22getElementStringLengthEi:
  230|    195|UCharsTrieBuilder::getElementStringLength(int32_t i) const {
  231|    195|    return elements[i].getStringLength(strings);
  232|    195|}
_ZNK6icu_7817UCharsTrieBuilder14getElementUnitEii:
  235|    355|UCharsTrieBuilder::getElementUnit(int32_t i, int32_t unitIndex) const {
  236|    355|    return elements[i].charAt(unitIndex, strings);
  237|    355|}
_ZNK6icu_7817UCharsTrieBuilder15getElementValueEi:
  240|     72|UCharsTrieBuilder::getElementValue(int32_t i) const {
  241|     72|    return elements[i].getValue();
  242|     72|}
_ZNK6icu_7817UCharsTrieBuilder21getLimitOfLinearMatchEiii:
  245|     72|UCharsTrieBuilder::getLimitOfLinearMatch(int32_t first, int32_t last, int32_t unitIndex) const {
  246|     72|    const UCharsTrieElement &firstElement=elements[first];
  247|     72|    const UCharsTrieElement &lastElement=elements[last];
  248|     72|    int32_t minStringLength=firstElement.getStringLength(strings);
  249|    385|    while(++unitIndex<minStringLength &&
  ------------------
  |  Branch (249:11): [True: 326, False: 59]
  ------------------
  250|    385|            firstElement.charAt(unitIndex, strings)==
  ------------------
  |  Branch (250:13): [True: 313, False: 13]
  ------------------
  251|    326|            lastElement.charAt(unitIndex, strings)) {}
  252|     72|    return unitIndex;
  253|     72|}
_ZNK6icu_7817UCharsTrieBuilder17countElementUnitsEiii:
  256|     27|UCharsTrieBuilder::countElementUnits(int32_t start, int32_t limit, int32_t unitIndex) const {
  257|     27|    int32_t length=0;  // Number of different units at unitIndex.
  258|     27|    int32_t i=start;
  259|     92|    do {
  260|     92|        char16_t unit=elements[i++].charAt(unitIndex, strings);
  261|    188|        while(i<limit && unit==elements[i].charAt(unitIndex, strings)) {
  ------------------
  |  Branch (261:15): [True: 161, False: 27]
  |  Branch (261:26): [True: 96, False: 65]
  ------------------
  262|     96|            ++i;
  263|     96|        }
  264|     92|        ++length;
  265|     92|    } while(i<limit);
  ------------------
  |  Branch (265:13): [True: 65, False: 27]
  ------------------
  266|     27|    return length;
  267|     27|}
_ZNK6icu_7817UCharsTrieBuilder23skipElementsBySomeUnitsEiii:
  270|      5|UCharsTrieBuilder::skipElementsBySomeUnits(int32_t i, int32_t unitIndex, int32_t count) const {
  271|     23|    do {
  272|     23|        char16_t unit=elements[i++].charAt(unitIndex, strings);
  273|     51|        while(unit==elements[i].charAt(unitIndex, strings)) {
  ------------------
  |  Branch (273:15): [True: 28, False: 23]
  ------------------
  274|     28|            ++i;
  275|     28|        }
  276|     23|    } while(--count>0);
  ------------------
  |  Branch (276:13): [True: 18, False: 5]
  ------------------
  277|      5|    return i;
  278|      5|}
_ZNK6icu_7817UCharsTrieBuilder26indexOfElementWithNextUnitEiiDs:
  281|     60|UCharsTrieBuilder::indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, char16_t unit) const {
  282|    132|    while(unit==elements[i].charAt(unitIndex, strings)) {
  ------------------
  |  Branch (282:11): [True: 72, False: 60]
  ------------------
  283|     72|        ++i;
  284|     72|    }
  285|     60|    return i;
  286|     60|}
_ZN6icu_7817UCharsTrieBuilder14ensureCapacityEi:
  323|    392|UCharsTrieBuilder::ensureCapacity(int32_t length) {
  324|    392|    if(uchars==nullptr) {
  ------------------
  |  Branch (324:8): [True: 0, False: 392]
  ------------------
  325|      0|        return false;  // previous memory allocation had failed
  326|      0|    }
  327|    392|    if(length>ucharsCapacity) {
  ------------------
  |  Branch (327:8): [True: 0, False: 392]
  ------------------
  328|      0|        int32_t newCapacity=ucharsCapacity;
  329|      0|        do {
  330|      0|            newCapacity*=2;
  331|      0|        } while(newCapacity<=length);
  ------------------
  |  Branch (331:17): [True: 0, False: 0]
  ------------------
  332|      0|        char16_t *newUChars=static_cast<char16_t *>(uprv_malloc(newCapacity*2));
  ------------------
  |  | 1524|      0|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  333|      0|        if(newUChars==nullptr) {
  ------------------
  |  Branch (333:12): [True: 0, False: 0]
  ------------------
  334|       |            // unable to allocate memory
  335|      0|            uprv_free(uchars);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  336|      0|            uchars=nullptr;
  337|      0|            ucharsCapacity=0;
  338|      0|            return false;
  339|      0|        }
  340|      0|        u_memcpy(newUChars+(newCapacity-ucharsLength),
  ------------------
  |  |  334|      0|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  341|      0|                 uchars+(ucharsCapacity-ucharsLength), ucharsLength);
  342|      0|        uprv_free(uchars);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  343|      0|        uchars=newUChars;
  344|      0|        ucharsCapacity=newCapacity;
  345|      0|    }
  346|    392|    return true;
  347|    392|}
_ZN6icu_7817UCharsTrieBuilder5writeEi:
  350|    314|UCharsTrieBuilder::write(int32_t unit) {
  351|    314|    int32_t newLength=ucharsLength+1;
  352|    314|    if(ensureCapacity(newLength)) {
  ------------------
  |  Branch (352:8): [True: 314, False: 0]
  ------------------
  353|    314|        ucharsLength=newLength;
  354|    314|        uchars[ucharsCapacity - ucharsLength] = static_cast<char16_t>(unit);
  355|    314|    }
  356|    314|    return ucharsLength;
  357|    314|}
_ZN6icu_7817UCharsTrieBuilder5writeEPKDsi:
  360|     78|UCharsTrieBuilder::write(const char16_t *s, int32_t length) {
  361|     78|    int32_t newLength=ucharsLength+length;
  362|     78|    if(ensureCapacity(newLength)) {
  ------------------
  |  Branch (362:8): [True: 78, False: 0]
  ------------------
  363|     78|        ucharsLength=newLength;
  364|     78|        u_memcpy(uchars+(ucharsCapacity-ucharsLength), s, length);
  ------------------
  |  |  334|     78|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|     78|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     78|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     78|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  365|     78|    }
  366|     78|    return ucharsLength;
  367|     78|}
_ZN6icu_7817UCharsTrieBuilder17writeElementUnitsEiii:
  370|     72|UCharsTrieBuilder::writeElementUnits(int32_t i, int32_t unitIndex, int32_t length) {
  371|     72|    return write(elements[i].getString(strings).getBuffer()+unitIndex, length);
  372|     72|}
_ZN6icu_7817UCharsTrieBuilder18writeValueAndFinalEia:
  375|    119|UCharsTrieBuilder::writeValueAndFinal(int32_t i, UBool isFinal) {
  376|    119|    if(0<=i && i<=UCharsTrie::kMaxOneUnitValue) {
  ------------------
  |  Branch (376:8): [True: 119, False: 0]
  |  Branch (376:16): [True: 119, False: 0]
  ------------------
  377|    119|        return write(i|(isFinal<<15));
  378|    119|    }
  379|      0|    char16_t intUnits[3];
  380|      0|    int32_t length;
  381|      0|    if(i<0 || i>UCharsTrie::kMaxTwoUnitValue) {
  ------------------
  |  Branch (381:8): [True: 0, False: 0]
  |  Branch (381:15): [True: 0, False: 0]
  ------------------
  382|      0|        intUnits[0] = static_cast<char16_t>(UCharsTrie::kThreeUnitValueLead);
  383|      0|        intUnits[1] = static_cast<char16_t>(static_cast<uint32_t>(i) >> 16);
  384|      0|        intUnits[2] = static_cast<char16_t>(i);
  385|      0|        length=3;
  386|       |    // } else if(i<=UCharsTrie::kMaxOneUnitValue) {
  387|       |    //     intUnits[0]=(char16_t)(i);
  388|       |    //     length=1;
  389|      0|    } else {
  390|      0|        intUnits[0] = static_cast<char16_t>(UCharsTrie::kMinTwoUnitValueLead + (i >> 16));
  391|      0|        intUnits[1] = static_cast<char16_t>(i);
  392|      0|        length=2;
  393|      0|    }
  394|      0|    intUnits[0] = static_cast<char16_t>(intUnits[0] | (isFinal << 15));
  395|      0|    return write(intUnits, length);
  396|    119|}
_ZN6icu_7817UCharsTrieBuilder17writeValueAndTypeEaii:
  399|     99|UCharsTrieBuilder::writeValueAndType(UBool hasValue, int32_t value, int32_t node) {
  400|     99|    if(!hasValue) {
  ------------------
  |  Branch (400:8): [True: 93, False: 6]
  ------------------
  401|     93|        return write(node);
  402|     93|    }
  403|      6|    char16_t intUnits[3];
  404|      6|    int32_t length;
  405|      6|    if(value<0 || value>UCharsTrie::kMaxTwoUnitNodeValue) {
  ------------------
  |  Branch (405:8): [True: 0, False: 6]
  |  Branch (405:19): [True: 0, False: 6]
  ------------------
  406|      0|        intUnits[0] = static_cast<char16_t>(UCharsTrie::kThreeUnitNodeValueLead);
  407|      0|        intUnits[1] = static_cast<char16_t>(static_cast<uint32_t>(value) >> 16);
  408|      0|        intUnits[2] = static_cast<char16_t>(value);
  409|      0|        length=3;
  410|      6|    } else if(value<=UCharsTrie::kMaxOneUnitNodeValue) {
  ------------------
  |  Branch (410:15): [True: 6, False: 0]
  ------------------
  411|      6|        intUnits[0] = static_cast<char16_t>((value + 1) << 6);
  412|      6|        length=1;
  413|      6|    } else {
  414|      0|        intUnits[0] = static_cast<char16_t>(UCharsTrie::kMinTwoUnitNodeValueLead + ((value >> 10) & 0x7fc0));
  415|      0|        intUnits[1] = static_cast<char16_t>(value);
  416|      0|        length=2;
  417|      0|    }
  418|      6|    intUnits[0] |= static_cast<char16_t>(node);
  419|      6|    return write(intUnits, length);
  420|     99|}
_ZN6icu_7817UCharsTrieBuilder12writeDeltaToEi:
  423|      5|UCharsTrieBuilder::writeDeltaTo(int32_t jumpTarget) {
  424|      5|    int32_t i=ucharsLength-jumpTarget;
  425|      5|    U_ASSERT(i>=0);
  ------------------
  |  |   35|      5|#   define U_ASSERT(exp) (void)0
  ------------------
  426|      5|    if(i<=UCharsTrie::kMaxOneUnitDelta) {
  ------------------
  |  Branch (426:8): [True: 5, False: 0]
  ------------------
  427|      5|        return write(i);
  428|      5|    }
  429|      0|    char16_t intUnits[3];
  430|      0|    int32_t length;
  431|      0|    if(i<=UCharsTrie::kMaxTwoUnitDelta) {
  ------------------
  |  Branch (431:8): [True: 0, False: 0]
  ------------------
  432|      0|        intUnits[0] = static_cast<char16_t>(UCharsTrie::kMinTwoUnitDeltaLead + (i >> 16));
  433|      0|        length=1;
  434|      0|    } else {
  435|      0|        intUnits[0] = static_cast<char16_t>(UCharsTrie::kThreeUnitDeltaLead);
  436|      0|        intUnits[1] = static_cast<char16_t>(i >> 16);
  437|      0|        length=2;
  438|      0|    }
  439|      0|    intUnits[length++] = static_cast<char16_t>(i);
  440|      0|    return write(intUnits, length);
  441|      5|}
_ZNK6icu_7817UCharsTrieElement9getStringERKNS_13UnicodeStringE:
   42|  1.29k|    UnicodeString getString(const UnicodeString &strings) const {
   43|  1.29k|        int32_t length=strings[stringOffset];
   44|  1.29k|        return strings.tempSubString(stringOffset+1, length);
   45|  1.29k|    }
ucharstriebuilder.cpp:_ZN6icu_78L21compareElementStringsEPKvS1_S1_:
  136|    573|compareElementStrings(const void *context, const void *left, const void *right) {
  137|    573|    const UnicodeString *strings=static_cast<const UnicodeString *>(context);
  138|    573|    const UCharsTrieElement *leftElement=static_cast<const UCharsTrieElement *>(left);
  139|    573|    const UCharsTrieElement *rightElement=static_cast<const UCharsTrieElement *>(right);
  140|    573|    return leftElement->compareStringTo(*rightElement, *strings);
  141|    573|}
_ZNK6icu_7817UCharsTrieElement15getStringLengthERKNS_13UnicodeStringE:
   46|    267|    int32_t getStringLength(const UnicodeString &strings) const {
   47|    267|        return strings[stringOffset];
   48|    267|    }
_ZNK6icu_7817UCharsTrieElement6charAtEiRKNS_13UnicodeStringE:
   50|  1.46k|    char16_t charAt(int32_t index, const UnicodeString &strings) const {
   51|  1.46k|        return strings[stringOffset+1+index];
   52|  1.46k|    }
_ZNK6icu_7817UCharsTrieElement8getValueEv:
   54|     72|    int32_t getValue() const { return value; }

ucln_common_registerCleanup_78:
   67|  9.34k|{
   68|       |    // Thread safety messiness: From ticket 10295, calls to registerCleanup() may occur
   69|       |    // concurrently. Although such cases should be storing the same value, they raise errors
   70|       |    // from the thread sanity checker. Doing the store within a mutex avoids those.
   71|       |    // BUT that can trigger a recursive entry into std::call_once() in umutex.cpp when this code,
   72|       |    // running from the call_once function, tries to grab the ICU global mutex, which
   73|       |    // re-enters the mutex init path. So, work-around by special casing UCLN_COMMON_MUTEX, not
   74|       |    // using the ICU global mutex for it.
   75|       |    //
   76|       |    // No other point in ICU uses std::call_once().
   77|       |
   78|  9.34k|    U_ASSERT(UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT);
  ------------------
  |  |   35|  9.34k|#   define U_ASSERT(exp) (void)0
  ------------------
   79|  9.34k|    if (type == UCLN_COMMON_MUTEX) {
  ------------------
  |  Branch (79:9): [True: 1, False: 9.34k]
  ------------------
   80|      1|        gCommonCleanupFunctions[type] = func;
   81|  9.34k|    } else if (UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT)  {
  ------------------
  |  Branch (81:16): [True: 9.34k, False: 0]
  |  Branch (81:44): [True: 9.34k, False: 0]
  ------------------
   82|  9.34k|        icu::Mutex m;     // See ticket 10295 for discussion.
   83|  9.34k|        gCommonCleanupFunctions[type] = func;
   84|  9.34k|    }
   85|       |#if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
   86|       |    ucln_registerAutomaticCleanup();
   87|       |#endif
   88|  9.34k|}
ucln_registerCleanup_78:
   97|      1|{
   98|      1|    U_ASSERT(UCLN_START < type && type < UCLN_COMMON);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
   99|      1|    if (UCLN_START < type && type < UCLN_COMMON)
  ------------------
  |  Branch (99:9): [True: 1, False: 0]
  |  Branch (99:30): [True: 1, False: 0]
  ------------------
  100|      1|    {
  101|      1|        gLibCleanupFunctions[type] = func;
  102|      1|    }
  103|      1|}

udata_getHeaderSize_78:
   36|  1.58k|udata_getHeaderSize(const DataHeader *udh) {
   37|  1.58k|    if(udh==nullptr) {
  ------------------
  |  Branch (37:8): [True: 0, False: 1.58k]
  ------------------
   38|      0|        return 0;
   39|  1.58k|    } else if(udh->info.isBigEndian==U_IS_BIG_ENDIAN) {
  ------------------
  |  |  353|  1.58k|#   define U_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
  ------------------
  |  Branch (39:15): [True: 1.58k, False: 0]
  ------------------
   40|       |        /* same endianness */
   41|  1.58k|        return udh->dataHeader.headerSize;
   42|  1.58k|    } else {
   43|       |        /* opposite endianness */
   44|      0|        uint16_t x=udh->dataHeader.headerSize;
   45|      0|        return (uint16_t)((x<<8)|(x>>8));
   46|      0|    }
   47|  1.58k|}
udata_checkCommonData_78:
  326|      1|U_CFUNC void udata_checkCommonData(UDataMemory *udm, UErrorCode *err) {
  327|      1|    if (U_FAILURE(*err)) {
  ------------------
  |  Branch (327:9): [True: 0, False: 1]
  ------------------
  328|      0|        return;
  329|      0|    }
  330|       |
  331|      1|    if(udm==nullptr || udm->pHeader==nullptr) {
  ------------------
  |  Branch (331:8): [True: 0, False: 1]
  |  Branch (331:24): [True: 0, False: 1]
  ------------------
  332|      0|      *err=U_INVALID_FORMAT_ERROR;
  333|      1|    } else if(!(udm->pHeader->dataHeader.magic1==0xda &&
  ------------------
  |  Branch (333:17): [True: 1, False: 0]
  ------------------
  334|      1|        udm->pHeader->dataHeader.magic2==0x27 &&
  ------------------
  |  Branch (334:9): [True: 1, False: 0]
  ------------------
  335|      1|        udm->pHeader->info.isBigEndian==U_IS_BIG_ENDIAN &&
  ------------------
  |  |  353|      2|#   define U_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
  ------------------
  |  Branch (335:9): [True: 1, False: 0]
  ------------------
  336|      1|        udm->pHeader->info.charsetFamily==U_CHARSET_FAMILY)
  ------------------
  |  |  588|      1|#   define U_CHARSET_FAMILY U_ASCII_FAMILY
  |  |  ------------------
  |  |  |  |  531|      1|#define U_ASCII_FAMILY 0
  |  |  ------------------
  ------------------
  |  Branch (336:9): [True: 1, False: 0]
  ------------------
  337|      1|        ) {
  338|       |        /* header not valid */
  339|      0|        *err=U_INVALID_FORMAT_ERROR;
  340|      0|    }
  341|      1|    else if (udm->pHeader->info.dataFormat[0]==0x43 &&
  ------------------
  |  Branch (341:14): [True: 1, False: 0]
  ------------------
  342|      1|        udm->pHeader->info.dataFormat[1]==0x6d &&
  ------------------
  |  Branch (342:9): [True: 1, False: 0]
  ------------------
  343|      1|        udm->pHeader->info.dataFormat[2]==0x6e &&
  ------------------
  |  Branch (343:9): [True: 1, False: 0]
  ------------------
  344|      1|        udm->pHeader->info.dataFormat[3]==0x44 &&
  ------------------
  |  Branch (344:9): [True: 1, False: 0]
  ------------------
  345|      1|        udm->pHeader->info.formatVersion[0]==1
  ------------------
  |  Branch (345:9): [True: 1, False: 0]
  ------------------
  346|      1|        ) {
  347|       |        /* dataFormat="CmnD" */
  348|      1|        udm->vFuncs = &CmnDFuncs;
  349|      1|        udm->toc=(const char *)udm->pHeader+udata_getHeaderSize(udm->pHeader);
  ------------------
  |  |  887|      1|#define udata_getHeaderSize U_ICU_ENTRY_POINT_RENAME(udata_getHeaderSize)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  350|      1|    }
  351|      0|    else if(udm->pHeader->info.dataFormat[0]==0x54 &&
  ------------------
  |  Branch (351:13): [True: 0, False: 0]
  ------------------
  352|      0|        udm->pHeader->info.dataFormat[1]==0x6f &&
  ------------------
  |  Branch (352:9): [True: 0, False: 0]
  ------------------
  353|      0|        udm->pHeader->info.dataFormat[2]==0x43 &&
  ------------------
  |  Branch (353:9): [True: 0, False: 0]
  ------------------
  354|      0|        udm->pHeader->info.dataFormat[3]==0x50 &&
  ------------------
  |  Branch (354:9): [True: 0, False: 0]
  ------------------
  355|      0|        udm->pHeader->info.formatVersion[0]==1
  ------------------
  |  Branch (355:9): [True: 0, False: 0]
  ------------------
  356|      0|        ) {
  357|       |        /* dataFormat="ToCP" */
  358|      0|        udm->vFuncs = &ToCPFuncs;
  359|      0|        udm->toc=(const char *)udm->pHeader+udata_getHeaderSize(udm->pHeader);
  ------------------
  |  |  887|      0|#define udata_getHeaderSize U_ICU_ENTRY_POINT_RENAME(udata_getHeaderSize)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  360|      0|    }
  361|      0|    else {
  362|       |        /* dataFormat not recognized */
  363|      0|        *err=U_INVALID_FORMAT_ERROR;
  364|      0|    }
  365|       |
  366|      1|    if (U_FAILURE(*err)) {
  ------------------
  |  Branch (366:9): [True: 0, False: 1]
  ------------------
  367|       |        /* If the data is no good and we memory-mapped it ourselves,
  368|       |         *  close the memory mapping so it doesn't leak.  Note that this has
  369|       |         *  no effect on non-memory mapped data, other than clearing fields in udm.
  370|       |         */
  371|      0|        udata_close(udm);
  ------------------
  |  |  885|      0|#define udata_close U_ICU_ENTRY_POINT_RENAME(udata_close)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  372|      0|    }
  373|      1|}
ucmndata.cpp:_ZL17offsetTOCLookupFnPK11UDataMemoryPKcPiP10UErrorCode:
  229|  2.36k|                  UErrorCode *pErrorCode) {
  230|  2.36k|    (void)pErrorCode;
  231|  2.36k|    const UDataOffsetTOC  *toc = (UDataOffsetTOC *)pData->toc;
  232|  2.36k|    if(toc!=nullptr) {
  ------------------
  |  Branch (232:8): [True: 2.36k, False: 0]
  ------------------
  233|  2.36k|        const char *base=(const char *)toc;
  234|  2.36k|        int32_t number, count=(int32_t)toc->count;
  235|       |
  236|       |        /* perform a binary search for the data in the common data's table of contents */
  237|       |#if defined (UDATA_DEBUG_DUMP)
  238|       |        /* list the contents of the TOC each time .. not recommended */
  239|       |        for(number=0; number<count; ++number) {
  240|       |            fprintf(stderr, "\tx%d: %s\n", number, &base[toc->entry[number].nameOffset]);
  241|       |        }
  242|       |#endif
  243|  2.36k|        number=offsetTOCPrefixBinarySearch(tocEntryName, base, toc->entry, count);
  244|  2.36k|        if(number>=0) {
  ------------------
  |  Branch (244:12): [True: 1.58k, False: 784]
  ------------------
  245|       |            /* found it */
  246|  1.58k|            const UDataOffsetTOCEntry *entry=toc->entry+number;
  247|       |#ifdef UDATA_DEBUG
  248|       |            fprintf(stderr, "%s: Found.\n", tocEntryName);
  249|       |#endif
  250|  1.58k|            if((number+1) < count) {
  ------------------
  |  Branch (250:16): [True: 1.58k, False: 1]
  ------------------
  251|  1.58k|                *pLength = (int32_t)(entry[1].dataOffset - entry->dataOffset);
  252|  1.58k|            } else {
  253|      1|                *pLength = -1;
  254|      1|            }
  255|  1.58k|            return (const DataHeader *)(base+entry->dataOffset);
  256|  1.58k|        } else {
  257|       |#ifdef UDATA_DEBUG
  258|       |            fprintf(stderr, "%s: Not found.\n", tocEntryName);
  259|       |#endif
  260|    784|            return nullptr;
  261|    784|        }
  262|  2.36k|    } else {
  263|       |#ifdef UDATA_DEBUG
  264|       |        fprintf(stderr, "returning header\n");
  265|       |#endif
  266|       |
  267|      0|        return pData->pHeader;
  268|      0|    }
  269|  2.36k|}
ucmndata.cpp:_ZL27offsetTOCPrefixBinarySearchPKcS0_PK19UDataOffsetTOCEntryi:
  125|  2.36k|                            const UDataOffsetTOCEntry *toc, int32_t count) {
  126|  2.36k|    int32_t start=0;
  127|  2.36k|    int32_t limit=count;
  128|       |    /*
  129|       |     * Remember the shared prefix between s, start and limit,
  130|       |     * and don't compare that shared prefix again.
  131|       |     * The shared prefix should get longer as we narrow the [start, limit[ range.
  132|       |     */
  133|  2.36k|    int32_t startPrefixLength=0;
  134|  2.36k|    int32_t limitPrefixLength=0;
  135|  2.36k|    if(count==0) {
  ------------------
  |  Branch (135:8): [True: 0, False: 2.36k]
  ------------------
  136|      0|        return -1;
  137|      0|    }
  138|       |    /*
  139|       |     * Prime the prefix lengths so that we don't keep prefixLength at 0 until
  140|       |     * both the start and limit indexes have moved.
  141|       |     * At the same time, we find if s is one of the start and (limit-1) names,
  142|       |     * and if not, exclude them from the actual binary search.
  143|       |     */
  144|  2.36k|    if(0==strcmpAfterPrefix(s, names+toc[0].nameOffset, &startPrefixLength)) {
  ------------------
  |  Branch (144:8): [True: 1, False: 2.36k]
  ------------------
  145|      1|        return 0;
  146|      1|    }
  147|  2.36k|    ++start;
  148|  2.36k|    --limit;
  149|  2.36k|    if(0==strcmpAfterPrefix(s, names+toc[limit].nameOffset, &limitPrefixLength)) {
  ------------------
  |  Branch (149:8): [True: 1, False: 2.36k]
  ------------------
  150|      1|        return limit;
  151|      1|    }
  152|  27.7k|    while(start<limit) {
  ------------------
  |  Branch (152:11): [True: 26.9k, False: 784]
  ------------------
  153|  26.9k|        int32_t i=(start+limit)/2;
  154|  26.9k|        int32_t prefixLength=MIN(startPrefixLength, limitPrefixLength);
  ------------------
  |  |   97|  26.9k|#define MIN(a,b) (((a)<(b)) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (97:19): [True: 5.94k, False: 21.0k]
  |  |  ------------------
  ------------------
  155|  26.9k|        int32_t cmp=strcmpAfterPrefix(s, names+toc[i].nameOffset, &prefixLength);
  156|  26.9k|        if(cmp<0) {
  ------------------
  |  Branch (156:12): [True: 13.6k, False: 13.2k]
  ------------------
  157|  13.6k|            limit=i;
  158|  13.6k|            limitPrefixLength=prefixLength;
  159|  13.6k|        } else if(cmp==0) {
  ------------------
  |  Branch (159:19): [True: 1.58k, False: 11.6k]
  ------------------
  160|  1.58k|            return i;
  161|  11.6k|        } else {
  162|  11.6k|            start=i+1;
  163|  11.6k|            startPrefixLength=prefixLength;
  164|  11.6k|        }
  165|  26.9k|    }
  166|    784|    return -1;
  167|  2.36k|}
ucmndata.cpp:_ZL17strcmpAfterPrefixPKcS0_Pi:
  105|  31.6k|strcmpAfterPrefix(const char *s1, const char *s2, int32_t *pPrefixLength) {
  106|  31.6k|    int32_t pl=*pPrefixLength;
  107|  31.6k|    int32_t cmp=0;
  108|  31.6k|    s1+=pl;
  109|  31.6k|    s2+=pl;
  110|   116k|    for(;;) {
  111|   116k|        int32_t c1 = static_cast<uint8_t>(*s1++);
  112|   116k|        int32_t c2 = static_cast<uint8_t>(*s2++);
  113|   116k|        cmp=c1-c2;
  114|   116k|        if(cmp!=0 || c1==0) {  /* different or done */
  ------------------
  |  Branch (114:12): [True: 30.1k, False: 86.2k]
  |  Branch (114:22): [True: 1.58k, False: 84.6k]
  ------------------
  115|  31.6k|            break;
  116|  31.6k|        }
  117|  84.6k|        ++pl;  /* increment shared same-prefix length */
  118|  84.6k|    }
  119|  31.6k|    *pPrefixLength=pl;
  120|  31.6k|    return cmp;
  121|  31.6k|}

ucurr_forLocale_78:
  505|  9.33k|                UErrorCode* ec) {
  506|  9.33k|    if (U_FAILURE(*ec)) { return 0; }
  ------------------
  |  Branch (506:9): [True: 0, False: 9.33k]
  ------------------
  507|  9.33k|    if (buffCapacity < 0 || (buff == nullptr && buffCapacity > 0)) {
  ------------------
  |  Branch (507:9): [True: 0, False: 9.33k]
  |  Branch (507:30): [True: 0, False: 9.33k]
  |  Branch (507:49): [True: 0, False: 0]
  ------------------
  508|      0|        *ec = U_ILLEGAL_ARGUMENT_ERROR;
  509|      0|        return 0;
  510|      0|    }
  511|       |
  512|  9.33k|    UErrorCode localStatus = U_ZERO_ERROR;
  513|  9.33k|    CharString currency = ulocimp_getKeywordValue(locale, "currency", localStatus);
  ------------------
  |  | 1200|  9.33k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  514|  9.33k|    int32_t resLen = currency.length();
  515|       |
  516|  9.33k|    if (U_SUCCESS(localStatus) && resLen == 3 && uprv_isInvariantString(currency.data(), resLen)) {
  ------------------
  |  | 1517|      0|#define uprv_isInvariantString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantString)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (516:9): [True: 9.33k, False: 0]
  |  Branch (516:35): [True: 0, False: 9.33k]
  |  Branch (516:50): [True: 0, False: 0]
  ------------------
  517|      0|        if (resLen < buffCapacity) {
  ------------------
  |  Branch (517:13): [True: 0, False: 0]
  ------------------
  518|      0|            T_CString_toUpperCase(currency.data());
  ------------------
  |  |   70|      0|#define T_CString_toUpperCase U_ICU_ENTRY_POINT_RENAME(T_CString_toUpperCase)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  519|      0|            u_charsToUChars(currency.data(), buff, resLen);
  ------------------
  |  |  226|      0|#define u_charsToUChars U_ICU_ENTRY_POINT_RENAME(u_charsToUChars)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|      0|        }
  521|      0|        return u_terminateUChars(buff, buffCapacity, resLen, ec);
  ------------------
  |  |  408|      0|#define u_terminateUChars U_ICU_ENTRY_POINT_RENAME(u_terminateUChars)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  522|      0|    }
  523|       |
  524|       |    // get country or country_variant in `id'
  525|  9.33k|    CharString id = idForLocale(locale, ec);
  526|  9.33k|    if (U_FAILURE(*ec)) {
  ------------------
  |  Branch (526:9): [True: 0, False: 9.33k]
  ------------------
  527|      0|        return 0;
  528|      0|    }
  529|       |
  530|  9.33k|#if !UCONFIG_NO_SERVICE
  531|  9.33k|    const char16_t* result = CReg::get(id.data());
  532|  9.33k|    if (result) {
  ------------------
  |  Branch (532:9): [True: 0, False: 9.33k]
  ------------------
  533|      0|        if(buffCapacity > u_strlen(result)) {
  ------------------
  |  |  393|      0|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (533:12): [True: 0, False: 0]
  ------------------
  534|      0|            u_strcpy(buff, result);
  ------------------
  |  |  390|      0|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  535|      0|        }
  536|      0|        resLen = u_strlen(result);
  ------------------
  |  |  393|      0|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  537|      0|        return u_terminateUChars(buff, buffCapacity, resLen, ec);
  ------------------
  |  |  408|      0|#define u_terminateUChars U_ICU_ENTRY_POINT_RENAME(u_terminateUChars)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  538|      0|    }
  539|  9.33k|#endif
  540|       |    // Remove variants, which is only needed for registration.
  541|  9.33k|    char *idDelim = uprv_strchr(id.data(), VAR_DELIM);
  ------------------
  |  |   40|  9.33k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  542|  9.33k|    if (idDelim) {
  ------------------
  |  Branch (542:9): [True: 0, False: 9.33k]
  ------------------
  543|      0|        id.truncate(idDelim - id.data());
  544|      0|    }
  545|       |
  546|  9.33k|    const char16_t* s = nullptr;  // Currency code from data file.
  547|  9.33k|    if (id.isEmpty()) {
  ------------------
  |  Branch (547:9): [True: 2.82k, False: 6.51k]
  ------------------
  548|       |        // No point looking in the data for an empty string.
  549|       |        // This is what we would get.
  550|  2.82k|        localStatus = U_MISSING_RESOURCE_ERROR;
  551|  6.51k|    } else {
  552|       |        // Look up the CurrencyMap element in the root bundle.
  553|  6.51k|        localStatus = U_ZERO_ERROR;
  554|  6.51k|        UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus);
  ------------------
  |  | 1693|  6.51k|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|  6.51k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.51k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.51k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus);
  ------------------
  |  |   21|  6.51k|#define U_ICUDATA_CURR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "curr"
  |  |  ------------------
  |  |  |  |  154|  6.51k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  555|  6.51k|        UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus);
  ------------------
  |  | 1661|  6.51k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  6.51k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.51k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.51k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  556|  6.51k|        LocalUResourceBundlePointer countryArray(ures_getByKey(rb, id.data(), cm, &localStatus));
  ------------------
  |  | 1661|  6.51k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  6.51k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.51k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.51k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  557|       |        // https://unicode-org.atlassian.net/browse/ICU-21997
  558|       |        // Prefer to use currencies that are legal tender.
  559|  6.51k|        if (U_SUCCESS(localStatus)) {
  ------------------
  |  Branch (559:13): [True: 6.44k, False: 68]
  ------------------
  560|  6.44k|            int32_t arrayLength = ures_getSize(countryArray.getAlias());
  ------------------
  |  | 1674|  6.44k|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  561|  6.44k|            for (int32_t i = 0; i < arrayLength; ++i) {
  ------------------
  |  Branch (561:33): [True: 6.44k, False: 0]
  ------------------
  562|  6.44k|                LocalUResourceBundlePointer currencyReq(
  563|  6.44k|                    ures_getByIndex(countryArray.getAlias(), i, nullptr, &localStatus));
  ------------------
  |  | 1660|  6.44k|#define ures_getByIndex U_ICU_ENTRY_POINT_RENAME(ures_getByIndex)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  564|       |                // The currency is legal tender if it is *not* marked with tender{"false"}.
  565|  6.44k|                UErrorCode tenderStatus = localStatus;
  566|  6.44k|                const char16_t *tender =
  567|  6.44k|                    ures_getStringByKey(currencyReq.getAlias(), "tender", nullptr, &tenderStatus);
  ------------------
  |  | 1677|  6.44k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  568|  6.44k|                bool isTender = U_FAILURE(tenderStatus) || u_strcmp(tender, u"false") != 0;
  ------------------
  |  |  387|      0|#define u_strcmp U_ICU_ENTRY_POINT_RENAME(u_strcmp)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (568:33): [True: 6.44k, False: 0]
  |  Branch (568:60): [True: 0, False: 0]
  ------------------
  569|  6.44k|                if (!isTender && s != nullptr) {
  ------------------
  |  Branch (569:21): [True: 0, False: 6.44k]
  |  Branch (569:34): [True: 0, False: 0]
  ------------------
  570|       |                    // We already have a non-tender currency. Ignore all following non-tender ones.
  571|      0|                    continue;
  572|      0|                }
  573|       |                // Fetch the currency code.
  574|  6.44k|                s = ures_getStringByKey(currencyReq.getAlias(), "id", &resLen, &localStatus);
  ------------------
  |  | 1677|  6.44k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  575|  6.44k|                if (isTender) {
  ------------------
  |  Branch (575:21): [True: 6.44k, False: 0]
  ------------------
  576|  6.44k|                    break;
  577|  6.44k|                }
  578|  6.44k|            }
  579|  6.44k|            if (U_SUCCESS(localStatus) && s == nullptr) {
  ------------------
  |  Branch (579:17): [True: 6.44k, False: 0]
  |  Branch (579:43): [True: 0, False: 6.44k]
  ------------------
  580|      0|                localStatus = U_MISSING_RESOURCE_ERROR;
  581|      0|            }
  582|  6.44k|        }
  583|  6.51k|    }
  584|       |
  585|  9.33k|    if ((U_FAILURE(localStatus)) && strchr(id.data(), '_') != nullptr) {
  ------------------
  |  Branch (585:9): [True: 2.89k, False: 6.44k]
  |  Branch (585:37): [True: 0, False: 2.89k]
  ------------------
  586|       |        // We don't know about it.  Check to see if we support the variant.
  587|      0|        CharString parent = ulocimp_getParent(locale, *ec);
  ------------------
  |  | 1205|      0|#define ulocimp_getParent U_ICU_ENTRY_POINT_RENAME(ulocimp_getParent)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  588|      0|        *ec = U_USING_FALLBACK_WARNING;
  589|       |        // TODO: Loop over the parent rather than recursing and
  590|       |        // looking again for a currency keyword.
  591|      0|        return ucurr_forLocale(parent.data(), buff, buffCapacity, ec);
  ------------------
  |  |  832|      0|#define ucurr_forLocale U_ICU_ENTRY_POINT_RENAME(ucurr_forLocale)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  592|      0|    }
  593|  9.33k|    if (*ec == U_ZERO_ERROR || localStatus != U_ZERO_ERROR) {
  ------------------
  |  Branch (593:9): [True: 9.33k, False: 0]
  |  Branch (593:32): [True: 0, False: 0]
  ------------------
  594|       |        // There is nothing to fallback to. Report the failure/warning if possible.
  595|  9.33k|        *ec = localStatus;
  596|  9.33k|    }
  597|  9.33k|    if (U_SUCCESS(*ec)) {
  ------------------
  |  Branch (597:9): [True: 6.44k, False: 2.89k]
  ------------------
  598|  6.44k|        if(buffCapacity > resLen) {
  ------------------
  |  Branch (598:12): [True: 6.44k, False: 0]
  ------------------
  599|  6.44k|            u_strcpy(buff, s);
  ------------------
  |  |  390|  6.44k|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  600|  6.44k|        }
  601|  6.44k|    }
  602|  9.33k|    return u_terminateUChars(buff, buffCapacity, resLen, ec);
  ------------------
  |  |  408|  9.33k|#define u_terminateUChars U_ICU_ENTRY_POINT_RENAME(u_terminateUChars)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  603|  9.33k|}
ucurr_getName_78:
  645|  6.44k|              UErrorCode* ec) {
  646|       |
  647|       |    // Look up the Currencies resource for the given locale.  The
  648|       |    // Currencies locale data looks like this:
  649|       |    //|en {
  650|       |    //|  Currencies {
  651|       |    //|    USD { "US$", "US Dollar" }
  652|       |    //|    CHF { "Sw F", "Swiss Franc" }
  653|       |    //|    INR { "=0#Rs|1#Re|1<Rs", "=0#Rupees|1#Rupee|1<Rupees" }
  654|       |    //|    //...
  655|       |    //|  }
  656|       |    //|}
  657|       |
  658|  6.44k|    if (U_FAILURE(*ec)) {
  ------------------
  |  Branch (658:9): [True: 0, False: 6.44k]
  ------------------
  659|      0|        return nullptr;
  660|      0|    }
  661|       |
  662|  6.44k|    int32_t choice = (int32_t) nameStyle;
  663|  6.44k|    if (choice < 0 || choice > 4) {
  ------------------
  |  Branch (663:9): [True: 0, False: 6.44k]
  |  Branch (663:23): [True: 0, False: 6.44k]
  ------------------
  664|      0|        *ec = U_ILLEGAL_ARGUMENT_ERROR;
  665|      0|        return nullptr;
  666|      0|    }
  667|       |
  668|       |    // In the future, resource bundles may implement multi-level
  669|       |    // fallback.  That is, if a currency is not found in the en_US
  670|       |    // Currencies data, then the en Currencies data will be searched.
  671|       |    // Currently, if a Currencies datum exists in en_US and en, the
  672|       |    // en_US entry hides that in en.
  673|       |
  674|       |    // We want multi-level fallback for this resource, so we implement
  675|       |    // it manually.
  676|       |
  677|       |    // Use a separate UErrorCode here that does not propagate out of
  678|       |    // this function.
  679|  6.44k|    UErrorCode ec2 = U_ZERO_ERROR;
  680|       |
  681|  6.44k|    if (locale == nullptr) {
  ------------------
  |  Branch (681:9): [True: 0, False: 6.44k]
  ------------------
  682|      0|        locale = uloc_getDefault();
  ------------------
  |  | 1118|      0|#define uloc_getDefault U_ICU_ENTRY_POINT_RENAME(uloc_getDefault)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  683|      0|    }
  684|  6.44k|    CharString loc = ulocimp_getName(locale, ec2);
  ------------------
  |  | 1204|  6.44k|#define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  685|  6.44k|    if (U_FAILURE(ec2)) {
  ------------------
  |  Branch (685:9): [True: 0, False: 6.44k]
  ------------------
  686|      0|        *ec = U_ILLEGAL_ARGUMENT_ERROR;
  687|      0|        return nullptr;
  688|      0|    }
  689|       |
  690|  6.44k|    char buf[ISO_CURRENCY_CODE_LENGTH+1];
  691|  6.44k|    myUCharsToChars(buf, currency);
  692|       |    
  693|       |    /* Normalize the keyword value to uppercase */
  694|  6.44k|    T_CString_toUpperCase(buf);
  ------------------
  |  |   70|  6.44k|#define T_CString_toUpperCase U_ICU_ENTRY_POINT_RENAME(T_CString_toUpperCase)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  695|       |    
  696|  6.44k|    const char16_t* s = nullptr;
  697|  6.44k|    ec2 = U_ZERO_ERROR;
  698|  6.44k|    LocalUResourceBundlePointer rb(ures_open(U_ICUDATA_CURR, loc.data(), &ec2));
  ------------------
  |  | 1691|  6.44k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  LocalUResourceBundlePointer rb(ures_open(U_ICUDATA_CURR, loc.data(), &ec2));
  ------------------
  |  |   21|  6.44k|#define U_ICUDATA_CURR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "curr"
  |  |  ------------------
  |  |  |  |  154|  6.44k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  699|       |
  700|  6.44k|    if (nameStyle == UCURR_NARROW_SYMBOL_NAME || nameStyle == UCURR_FORMAL_SYMBOL_NAME || nameStyle == UCURR_VARIANT_SYMBOL_NAME) {
  ------------------
  |  Branch (700:9): [True: 0, False: 6.44k]
  |  Branch (700:50): [True: 0, False: 6.44k]
  |  Branch (700:91): [True: 0, False: 6.44k]
  ------------------
  701|      0|        CharString key;
  702|      0|        switch (nameStyle) {
  703|      0|        case UCURR_NARROW_SYMBOL_NAME:
  ------------------
  |  Branch (703:9): [True: 0, False: 0]
  ------------------
  704|      0|            key.append(CURRENCIES_NARROW, ec2);
  705|      0|            break;
  706|      0|        case UCURR_FORMAL_SYMBOL_NAME:
  ------------------
  |  Branch (706:9): [True: 0, False: 0]
  ------------------
  707|      0|            key.append(CURRENCIES_FORMAL, ec2);
  708|      0|            break;
  709|      0|        case UCURR_VARIANT_SYMBOL_NAME:
  ------------------
  |  Branch (709:9): [True: 0, False: 0]
  ------------------
  710|      0|            key.append(CURRENCIES_VARIANT, ec2);
  711|      0|            break;
  712|      0|        default:
  ------------------
  |  Branch (712:9): [True: 0, False: 0]
  ------------------
  713|      0|            *ec = U_UNSUPPORTED_ERROR;
  714|      0|            return nullptr;
  715|      0|        }
  716|      0|        key.append("/", ec2);
  717|      0|        key.append(buf, ec2);
  718|      0|        s = ures_getStringByKeyWithFallback(rb.getAlias(), key.data(), len, &ec2);
  ------------------
  |  | 1678|      0|#define ures_getStringByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getStringByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  719|      0|        if (ec2 == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (719:13): [True: 0, False: 0]
  ------------------
  720|      0|            *ec = U_USING_FALLBACK_WARNING;
  721|      0|            ec2 = U_ZERO_ERROR;
  722|      0|            choice = UCURR_SYMBOL_NAME;
  723|      0|        }
  724|      0|    }
  725|  6.44k|    if (s == nullptr) {
  ------------------
  |  Branch (725:9): [True: 6.44k, False: 0]
  ------------------
  726|  6.44k|        ures_getByKey(rb.getAlias(), CURRENCIES, rb.getAlias(), &ec2);
  ------------------
  |  | 1661|  6.44k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  727|  6.44k|        ures_getByKeyWithFallback(rb.getAlias(), buf, rb.getAlias(), &ec2);
  ------------------
  |  | 1662|  6.44k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  728|  6.44k|        s = ures_getStringByIndex(rb.getAlias(), choice, len, &ec2);
  ------------------
  |  | 1676|  6.44k|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  729|  6.44k|    }
  730|       |
  731|       |    // If we've succeeded we're done.  Otherwise, try to fallback.
  732|       |    // If that fails (because we are already at root) then exit.
  733|  6.44k|    if (U_SUCCESS(ec2)) {
  ------------------
  |  Branch (733:9): [True: 6.30k, False: 136]
  ------------------
  734|  6.30k|        if (ec2 == U_USING_DEFAULT_WARNING
  ------------------
  |  Branch (734:13): [True: 290, False: 6.01k]
  ------------------
  735|  6.30k|            || (ec2 == U_USING_FALLBACK_WARNING && *ec != U_USING_DEFAULT_WARNING)) {
  ------------------
  |  Branch (735:17): [True: 4.11k, False: 1.90k]
  |  Branch (735:52): [True: 3.10k, False: 1.01k]
  ------------------
  736|  3.39k|            *ec = ec2;
  737|  3.39k|        }
  738|  6.30k|    }
  739|       |
  740|       |    // We no longer support choice format data in names.  Data should not contain
  741|       |    // choice patterns.
  742|  6.44k|    if (isChoiceFormat != nullptr) {
  ------------------
  |  Branch (742:9): [True: 0, False: 6.44k]
  ------------------
  743|      0|        *isChoiceFormat = false;
  744|      0|    }
  745|  6.44k|    if (U_SUCCESS(ec2)) {
  ------------------
  |  Branch (745:9): [True: 6.30k, False: 136]
  ------------------
  746|  6.30k|        U_ASSERT(s != nullptr);
  ------------------
  |  |   35|  6.30k|#   define U_ASSERT(exp) (void)0
  ------------------
  747|  6.30k|        return s;
  748|  6.30k|    }
  749|       |
  750|       |    // If we fail to find a match, use the ISO 4217 code
  751|    136|    *len = u_strlen(currency); // Should == ISO_CURRENCY_CODE_LENGTH, but maybe not...?
  ------------------
  |  |  393|    136|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|    136|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    136|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    136|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  752|    136|    *ec = U_USING_DEFAULT_WARNING;
  753|    136|    return currency;
  754|  6.44k|}
uprv_getStaticCurrencyName_78:
 1633|  6.44k|{
 1634|  6.44k|    U_NAMESPACE_USE
  ------------------
  |  |  112|  6.44k|#   define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
  ------------------
 1635|       |
 1636|  6.44k|    int32_t len;
 1637|  6.44k|    const char16_t* currname = ucurr_getName(iso, loc, UCURR_SYMBOL_NAME,
  ------------------
  |  |  837|  6.44k|#define ucurr_getName U_ICU_ENTRY_POINT_RENAME(ucurr_getName)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1638|  6.44k|                                          nullptr /* isChoiceFormat */, &len, &ec);
 1639|  6.44k|    if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (1639:9): [True: 6.44k, False: 0]
  ------------------
 1640|  6.44k|        result.setTo(currname, len);
 1641|  6.44k|    }
 1642|  6.44k|}
ucurr.cpp:_ZL11idForLocalePKcP10UErrorCode:
  345|  9.33k|{
  346|  9.33k|    return ulocimp_getRegionForSupplementalData(locale, false, *ec);
  ------------------
  |  | 1207|  9.33k|#define ulocimp_getRegionForSupplementalData U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegionForSupplementalData)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  347|  9.33k|}
_ZN4CReg3getEPKc:
  420|  9.33k|    static const char16_t* get(const char* id) {
  421|  9.33k|        const char16_t* result = nullptr;
  422|  9.33k|        umtx_lock(&gCRegLock);
  ------------------
  |  | 1250|  9.33k|#define umtx_lock U_ICU_ENTRY_POINT_RENAME(umtx_lock)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  423|  9.33k|        CReg* p = gCRegHead;
  424|       |
  425|       |        /* register cleanup of the mutex */
  426|  9.33k|        ucln_common_registerCleanup(UCLN_COMMON_CURRENCY, currency_cleanup);
  ------------------
  |  |  617|  9.33k|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  427|  9.33k|        while (p) {
  ------------------
  |  Branch (427:16): [True: 0, False: 9.33k]
  ------------------
  428|      0|            if (uprv_strcmp(id, p->id) == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (428:17): [True: 0, False: 0]
  ------------------
  429|      0|                result = p->iso;
  430|      0|                break;
  431|      0|            }
  432|      0|            p = p->next;
  433|      0|        }
  434|  9.33k|        umtx_unlock(&gCRegLock);
  ------------------
  |  | 1251|  9.33k|#define umtx_unlock U_ICU_ENTRY_POINT_RENAME(umtx_unlock)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  435|  9.33k|        return result;
  436|  9.33k|    }
ucurr.cpp:_ZL15myUCharsToCharsPcPKDs:
  281|  6.44k|myUCharsToChars(char* resultOfLen4, const char16_t* currency) {
  282|  6.44k|    u_UCharsToChars(currency, resultOfLen4, ISO_CURRENCY_CODE_LENGTH);
  ------------------
  |  |  211|  6.44k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  u_UCharsToChars(currency, resultOfLen4, ISO_CURRENCY_CODE_LENGTH);
  ------------------
  |  |   74|  6.44k|#define ISO_CURRENCY_CODE_LENGTH 3
  ------------------
  283|  6.44k|    resultOfLen4[ISO_CURRENCY_CODE_LENGTH] = 0;
  ------------------
  |  |   74|  6.44k|#define ISO_CURRENCY_CODE_LENGTH 3
  ------------------
  284|  6.44k|    return resultOfLen4;
  285|  6.44k|}

_ZN6icu_7817UDataPathIteratorC2EPKcS2_S2_S2_aP10UErrorCode:
  451|      1|{
  452|       |#ifdef UDATA_DEBUG
  453|       |        fprintf(stderr, "SUFFIX1=%s PATH=%s\n", inSuffix, inPath);
  454|       |#endif
  455|       |    /** Path **/
  456|      1|    if(inPath == nullptr) {
  ------------------
  |  Branch (456:8): [True: 0, False: 1]
  ------------------
  457|      0|        path = u_getDataDirectory();
  ------------------
  |  |  271|      0|#define u_getDataDirectory U_ICU_ENTRY_POINT_RENAME(u_getDataDirectory)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  458|      1|    } else {
  459|      1|        path = inPath;
  460|      1|    }
  461|       |
  462|       |    /** Package **/
  463|      1|    if(pkg != nullptr) {
  ------------------
  |  Branch (463:8): [True: 1, False: 0]
  ------------------
  464|      1|      packageStub.append(U_FILE_SEP_CHAR, *pErrorCode).append(pkg, *pErrorCode);
  ------------------
  |  |  130|      1|#   define U_FILE_SEP_CHAR '/'
  ------------------
  465|       |#ifdef UDATA_DEBUG
  466|       |      fprintf(stderr, "STUB=%s [%d]\n", packageStub.data(), packageStub.length());
  467|       |#endif
  468|      1|    }
  469|       |
  470|       |    /** Item **/
  471|      1|    basename = findBasename(item);
  472|      1|    basenameLen = static_cast<int32_t>(uprv_strlen(basename));
  ------------------
  |  |   37|      1|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  473|       |
  474|       |    /** Item path **/
  475|      1|    if(basename == item) {
  ------------------
  |  Branch (475:8): [True: 1, False: 0]
  ------------------
  476|      1|        nextPath = path;
  477|      1|    } else {
  478|      0|        itemPath.append(item, static_cast<int32_t>(basename - item), *pErrorCode);
  479|      0|        nextPath = itemPath.data();
  480|      0|    }
  481|       |#ifdef UDATA_DEBUG
  482|       |    fprintf(stderr, "SUFFIX=%s [%p]\n", inSuffix, (void*) inSuffix);
  483|       |#endif
  484|       |
  485|       |    /** Suffix  **/
  486|      1|    if(inSuffix != nullptr) {
  ------------------
  |  Branch (486:8): [True: 1, False: 0]
  ------------------
  487|      1|        suffix = inSuffix;
  488|      1|    } else {
  489|      0|        suffix = "";
  490|      0|    }
  491|       |
  492|      1|    checkLastFour = doCheckLastFour;
  493|       |
  494|       |    /* pathBuffer will hold the output path strings returned by this iterator */
  495|       |
  496|       |#ifdef UDATA_DEBUG
  497|       |    fprintf(stderr, "0: init %s -> [path=%s], [base=%s], [suff=%s], [itempath=%s], [nextpath=%s], [checklast4=%s]\n",
  498|       |            item,
  499|       |            path,
  500|       |            basename,
  501|       |            suffix.data(),
  502|       |            itemPath.data(),
  503|       |            nextPath,
  504|       |            checkLastFour?"true":"false");
  505|       |#endif
  506|      1|}
_ZN6icu_7817UDataPathIterator4nextEP10UErrorCode:
  516|      1|{
  517|      1|    if(U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (517:8): [True: 0, False: 1]
  ------------------
  518|      0|        return nullptr;
  519|      0|    }
  520|       |
  521|      1|    const char *currentPath = nullptr;
  522|      1|    int32_t     pathLen = 0;
  523|      1|    const char *pathBasename;
  524|       |
  525|      1|    do
  526|      2|    {
  527|      2|        if( nextPath == nullptr ) {
  ------------------
  |  Branch (527:13): [True: 1, False: 1]
  ------------------
  528|      1|            break;
  529|      1|        }
  530|      1|        currentPath = nextPath;
  531|       |
  532|      1|        if(nextPath == itemPath.data()) { /* we were processing item's path. */
  ------------------
  |  Branch (532:12): [True: 0, False: 1]
  ------------------
  533|      0|            nextPath = path; /* start with regular path next tm. */
  534|      0|            pathLen = static_cast<int32_t>(uprv_strlen(currentPath));
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  535|      1|        } else {
  536|       |            /* fix up next for next time */
  537|      1|            nextPath = uprv_strchr(currentPath, U_PATH_SEP_CHAR);
  ------------------
  |  |   40|      1|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  538|      1|            if(nextPath == nullptr) {
  ------------------
  |  Branch (538:16): [True: 1, False: 0]
  ------------------
  539|       |                /* segment: entire path */
  540|      1|                pathLen = static_cast<int32_t>(uprv_strlen(currentPath));
  ------------------
  |  |   37|      1|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  541|      1|            } else {
  542|       |                /* segment: until next segment */
  543|      0|                pathLen = static_cast<int32_t>(nextPath - currentPath);
  544|       |                /* skip divider */
  545|      0|                nextPath ++;
  546|      0|            }
  547|      1|        }
  548|       |
  549|      1|        if(pathLen == 0) {
  ------------------
  |  Branch (549:12): [True: 1, False: 0]
  ------------------
  550|      1|            continue;
  551|      1|        }
  552|       |
  553|       |#ifdef UDATA_DEBUG
  554|       |        fprintf(stderr, "rest of path (IDD) = %s\n", currentPath);
  555|       |        fprintf(stderr, "                     ");
  556|       |        { 
  557|       |            int32_t qqq;
  558|       |            for(qqq=0;qqq<pathLen;qqq++)
  559|       |            {
  560|       |                fprintf(stderr, " ");
  561|       |            }
  562|       |
  563|       |            fprintf(stderr, "^\n");
  564|       |        }
  565|       |#endif
  566|      0|        pathBuffer.clear().append(currentPath, pathLen, *pErrorCode);
  567|       |
  568|       |        /* check for .dat files */
  569|      0|        pathBasename = findBasename(pathBuffer.data());
  570|       |
  571|      0|        if(checkLastFour && 
  ------------------
  |  Branch (571:12): [True: 0, False: 0]
  ------------------
  572|      0|           (pathLen>=4) &&
  ------------------
  |  Branch (572:12): [True: 0, False: 0]
  ------------------
  573|      0|           uprv_strncmp(pathBuffer.data() +(pathLen-4), suffix.data(), 4)==0 && /* suffix matches */
  ------------------
  |  |   44|      0|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (573:12): [True: 0, False: 0]
  ------------------
  574|      0|           uprv_strncmp(findBasename(pathBuffer.data()), basename, basenameLen)==0  && /* base matches */
  ------------------
  |  |   44|      0|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (574:12): [True: 0, False: 0]
  ------------------
  575|      0|           uprv_strlen(pathBasename)==(basenameLen+4)) { /* base+suffix = full len */
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (575:12): [True: 0, False: 0]
  ------------------
  576|       |
  577|       |#ifdef UDATA_DEBUG
  578|       |            fprintf(stderr, "Have %s file on the path: %s\n", suffix.data(), pathBuffer.data());
  579|       |#endif
  580|       |            /* do nothing */
  581|      0|        }
  582|      0|        else 
  583|      0|        {       /* regular dir path */
  584|      0|            if(pathBuffer[pathLen-1] != U_FILE_SEP_CHAR) {
  ------------------
  |  |  130|      0|#   define U_FILE_SEP_CHAR '/'
  ------------------
  |  Branch (584:16): [True: 0, False: 0]
  ------------------
  585|      0|                if((pathLen>=4) &&
  ------------------
  |  Branch (585:20): [True: 0, False: 0]
  ------------------
  586|      0|                   uprv_strncmp(pathBuffer.data()+(pathLen-4), ".dat", 4) == 0)
  ------------------
  |  |   44|      0|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (586:20): [True: 0, False: 0]
  ------------------
  587|      0|                {
  588|       |#ifdef UDATA_DEBUG
  589|       |                    fprintf(stderr, "skipping non-directory .dat file %s\n", pathBuffer.data());
  590|       |#endif
  591|      0|                    continue;
  592|      0|                }
  593|       |
  594|       |                /* Check if it is a directory with the same name as our package */
  595|      0|                if(!packageStub.isEmpty() &&
  ------------------
  |  Branch (595:20): [True: 0, False: 0]
  ------------------
  596|      0|                   (pathLen > packageStub.length()) &&
  ------------------
  |  Branch (596:20): [True: 0, False: 0]
  ------------------
  597|      0|                   !uprv_strcmp(pathBuffer.data() + pathLen - packageStub.length(), packageStub.data())) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (597:20): [True: 0, False: 0]
  ------------------
  598|       |#ifdef UDATA_DEBUG
  599|       |                  fprintf(stderr, "Found stub %s (will add package %s of len %d)\n", packageStub.data(), basename, basenameLen);
  600|       |#endif
  601|      0|                  pathBuffer.truncate(pathLen - packageStub.length());
  602|      0|                }
  603|      0|                pathBuffer.append(U_FILE_SEP_CHAR, *pErrorCode);
  ------------------
  |  |  130|      0|#   define U_FILE_SEP_CHAR '/'
  ------------------
  604|      0|            }
  605|       |
  606|       |            /* + basename */
  607|      0|            pathBuffer.append(packageStub.data()+1, packageStub.length()-1, *pErrorCode);
  608|       |
  609|      0|            if (!suffix.empty())  /* tack on suffix */
  ------------------
  |  Branch (609:17): [True: 0, False: 0]
  ------------------
  610|      0|            {
  611|      0|                if (suffix.length() > 4) {
  ------------------
  |  Branch (611:21): [True: 0, False: 0]
  ------------------
  612|       |                    // If the suffix is actually an item ("ibm-5348_P100-1997.cnv") and not an extension (".res")
  613|       |                    // then we need to ensure that the path ends with a separator.
  614|      0|                    pathBuffer.ensureEndsWithFileSeparator(*pErrorCode);
  615|      0|                }
  616|      0|                pathBuffer.append(suffix, *pErrorCode);
  617|      0|            }
  618|      0|        }
  619|       |
  620|       |#ifdef UDATA_DEBUG
  621|       |        fprintf(stderr, " -->  %s\n", pathBuffer.data());
  622|       |#endif
  623|       |
  624|      0|        return pathBuffer.data();
  625|       |
  626|      1|    } while(path);
  ------------------
  |  Branch (626:13): [True: 1, False: 0]
  ------------------
  627|       |
  628|       |    /* fell way off the end */
  629|      1|    return nullptr;
  630|      1|}
udata_openChoice_78:
 1406|  2.36k|                 UErrorCode *pErrorCode) {
 1407|       |#ifdef UDATA_DEBUG
 1408|       |  fprintf(stderr, "udata_openChoice(): Opening: %s : %s . %s\n", (path?path:"nullptr"), name, type);
 1409|       |#endif
 1410|       |
 1411|  2.36k|    if(pErrorCode==nullptr || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (1411:8): [True: 0, False: 2.36k]
  |  Branch (1411:31): [True: 0, False: 2.36k]
  ------------------
 1412|      0|        return nullptr;
 1413|  2.36k|    } else if(name==nullptr || *name==0 || isAcceptable==nullptr) {
  ------------------
  |  Branch (1413:15): [True: 0, False: 2.36k]
  |  Branch (1413:32): [True: 0, False: 2.36k]
  |  Branch (1413:44): [True: 0, False: 2.36k]
  ------------------
 1414|      0|        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
 1415|      0|        return nullptr;
 1416|  2.36k|    } else {
 1417|  2.36k|        return doOpenChoice(path, type, name, isAcceptable, context, pErrorCode);
 1418|  2.36k|    }
 1419|  2.36k|}
udata.cpp:_ZL12findBasenamePKc:
  225|    786|findBasename(const char *path) {
  226|    786|    const char *basename=uprv_strrchr(path, U_FILE_SEP_CHAR);
  ------------------
  |  |   42|    786|#define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
  |  |  ------------------
  |  |  |  |  393|    786|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  227|    786|    if(basename==nullptr) {
  ------------------
  |  Branch (227:8): [True: 786, False: 0]
  ------------------
  228|    786|        return path;
  229|    786|    } else {
  230|      0|        return basename+1;
  231|      0|    }
  232|    786|}
udata.cpp:_ZL16setCommonICUDataP11UDataMemoryaP10UErrorCode:
  174|      1|{
  175|      1|    UDataMemory  *newCommonData = UDataMemory_createNewInstance(pErr);
  ------------------
  |  |   79|      1|#define UDataMemory_createNewInstance U_ICU_ENTRY_POINT_RENAME(UDataMemory_createNewInstance)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  176|      1|    int32_t i;
  177|      1|    UBool didUpdate = false;
  178|      1|    if (U_FAILURE(*pErr)) {
  ------------------
  |  Branch (178:9): [True: 0, False: 1]
  ------------------
  179|      0|        return false;
  180|      0|    }
  181|       |
  182|       |    /*  For the assignment, other threads must cleanly see either the old            */
  183|       |    /*    or the new, not some partially initialized new.  The old can not be        */
  184|       |    /*    deleted - someone may still have a pointer to it lying around in           */
  185|       |    /*    their locals.                                                              */
  186|      1|    UDatamemory_assign(newCommonData, pData);
  ------------------
  |  |   84|      1|#define UDatamemory_assign U_ICU_ENTRY_POINT_RENAME(UDatamemory_assign)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  187|      1|    umtx_lock(nullptr);
  ------------------
  |  | 1250|      1|#define umtx_lock U_ICU_ENTRY_POINT_RENAME(umtx_lock)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  188|      1|    for (i = 0; i < UPRV_LENGTHOF(gCommonICUDataArray); ++i) {
  ------------------
  |  |   99|      1|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (188:17): [True: 1, False: 0]
  ------------------
  189|      1|        if (gCommonICUDataArray[i] == nullptr) {
  ------------------
  |  Branch (189:13): [True: 1, False: 0]
  ------------------
  190|      1|            gCommonICUDataArray[i] = newCommonData;
  191|      1|            didUpdate = true;
  192|      1|            break;
  193|      1|        } else if (gCommonICUDataArray[i]->pHeader == pData->pHeader) {
  ------------------
  |  Branch (193:20): [True: 0, False: 0]
  ------------------
  194|       |            /* The same data pointer is already in the array. */
  195|      0|            break;
  196|      0|        }
  197|      1|    }
  198|      1|    umtx_unlock(nullptr);
  ------------------
  |  | 1251|      1|#define umtx_unlock U_ICU_ENTRY_POINT_RENAME(umtx_unlock)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  199|       |
  200|      1|    if (i == UPRV_LENGTHOF(gCommonICUDataArray) && warn) {
  ------------------
  |  |   99|      2|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (200:9): [True: 0, False: 1]
  |  Branch (200:52): [True: 0, False: 0]
  ------------------
  201|      0|        *pErr = U_USING_DEFAULT_WARNING;
  202|      0|    }
  203|      1|    if (didUpdate) {
  ------------------
  |  Branch (203:9): [True: 1, False: 0]
  ------------------
  204|      1|        ucln_common_registerCleanup(UCLN_COMMON_UDATA, udata_cleanup);
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|      1|    } else {
  206|      0|        uprv_free(newCommonData);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  207|      0|    }
  208|      1|    return didUpdate;
  209|      1|}
udata.cpp:_ZL18udata_getHashTableR10UErrorCode:
  298|    785|static UHashtable *udata_getHashTable(UErrorCode &err) {
  299|    785|    umtx_initOnce(gCommonDataCacheInitOnce, &udata_initHashTable, err);
  300|    785|    return gCommonDataCache;
  301|    785|}
udata.cpp:_ZL19udata_initHashTableR10UErrorCode:
  283|      1|static void U_CALLCONV udata_initHashTable(UErrorCode &err) {
  284|      1|    U_ASSERT(gCommonDataCache == nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  285|      1|    gCommonDataCache = uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &err);
  ------------------
  |  | 1030|      1|#define uhash_open U_ICU_ENTRY_POINT_RENAME(uhash_open)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  gCommonDataCache = uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &err);
  ------------------
  |  | 1011|      1|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  gCommonDataCache = uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &err);
  ------------------
  |  |  993|      1|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  286|      1|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (286:9): [True: 0, False: 1]
  ------------------
  287|      0|       return;
  288|      0|    }
  289|      1|    U_ASSERT(gCommonDataCache != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  290|      1|    uhash_setValueDeleter(gCommonDataCache, DataCacheElement_deleter);
  ------------------
  |  | 1044|      1|#define uhash_setValueDeleter U_ICU_ENTRY_POINT_RENAME(uhash_setValueDeleter)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  291|      1|    ucln_common_registerCleanup(UCLN_COMMON_UDATA, udata_cleanup);
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  292|      1|}
udata.cpp:_ZL12doOpenChoicePKcS0_S0_PFaPvS0_S0_PK9UDataInfoES1_P10UErrorCode:
 1151|  2.36k|{
 1152|  2.36k|    UDataMemory         *retVal = nullptr;
 1153|       |
 1154|  2.36k|    const char         *dataPath;
 1155|       |
 1156|  2.36k|    int32_t             tocEntrySuffixIndex;
 1157|  2.36k|    const char         *tocEntryPathSuffix;
 1158|  2.36k|    UErrorCode          subErrorCode=U_ZERO_ERROR;
 1159|  2.36k|    const char         *treeChar;
 1160|       |
 1161|  2.36k|    UBool               isICUData = false;
 1162|       |
 1163|       |
 1164|  2.36k|    FileTracer::traceOpen(path, type, name);
 1165|       |
 1166|       |
 1167|       |    /* Is this path ICU data? */
 1168|  2.36k|    if(path == nullptr ||
  ------------------
  |  Branch (1168:8): [True: 823, False: 1.54k]
  ------------------
 1169|  2.36k|       !strcmp(path, U_ICUDATA_ALIAS) ||  /* "ICUDATA" */
  ------------------
  |  |   74|  1.54k|#define U_ICUDATA_ALIAS "ICUDATA"
  ------------------
  |  Branch (1169:8): [True: 1, False: 1.54k]
  ------------------
 1170|  2.36k|       !uprv_strncmp(path, U_ICUDATA_NAME U_TREE_SEPARATOR_STRING, /* "icudt26e-" */
  ------------------
  |  |   44|  1.54k|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|  1.54k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1170:8): [True: 1.54k, False: 0]
  ------------------
 1171|  2.36k|                     uprv_strlen(U_ICUDATA_NAME U_TREE_SEPARATOR_STRING)) ||  
 1172|  2.36k|       !uprv_strncmp(path, U_ICUDATA_ALIAS U_TREE_SEPARATOR_STRING, /* "ICUDATA-" */
  ------------------
  |  |   44|      0|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1172:8): [True: 0, False: 0]
  ------------------
 1173|  2.36k|                     uprv_strlen(U_ICUDATA_ALIAS U_TREE_SEPARATOR_STRING))) {
 1174|  2.36k|      isICUData = true;
 1175|  2.36k|    }
 1176|       |
 1177|       |#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)  /* Windows:  try "foo\bar" and "foo/bar" */
 1178|       |    /* remap from alternate path char to the main one */
 1179|       |    CharString altSepPath;
 1180|       |    if(path) {
 1181|       |        if(uprv_strchr(path,U_FILE_ALT_SEP_CHAR) != nullptr) {
 1182|       |            altSepPath.append(path, *pErrorCode);
 1183|       |            char *p;
 1184|       |            while ((p = uprv_strchr(altSepPath.data(), U_FILE_ALT_SEP_CHAR)) != nullptr) {
 1185|       |                *p = U_FILE_SEP_CHAR;
 1186|       |            }
 1187|       |#if defined (UDATA_DEBUG)
 1188|       |            fprintf(stderr, "Changed path from [%s] to [%s]\n", path, altSepPath.data());
 1189|       |#endif
 1190|       |            path = altSepPath.data();
 1191|       |        }
 1192|       |    }
 1193|       |#endif
 1194|       |
 1195|  2.36k|    CharString tocEntryName; /* entry name in tree format. ex:  'icudt28b/coll/ar.res' */
 1196|  2.36k|    CharString tocEntryPath; /* entry name in path format. ex:  'icudt28b\\coll\\ar.res' */
 1197|       |
 1198|  2.36k|    CharString pkgName;
 1199|  2.36k|    CharString treeName;
 1200|       |
 1201|       |    /* ======= Set up strings */
 1202|  2.36k|    if(path==nullptr) {
  ------------------
  |  Branch (1202:8): [True: 823, False: 1.54k]
  ------------------
 1203|    823|        pkgName.append(U_ICUDATA_NAME, *pErrorCode);
  ------------------
  |  |  154|    823|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  |  |  |  |  144|    823|#     define U_ICUDATA_TYPE_LETTER "l"
  |  |  ------------------
  ------------------
 1204|  1.54k|    } else {
 1205|  1.54k|        const char *pkg;
 1206|  1.54k|        const char *first;
 1207|  1.54k|        pkg = uprv_strrchr(path, U_FILE_SEP_CHAR);
  ------------------
  |  |   42|  1.54k|#define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  1.54k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1208|  1.54k|        first = uprv_strchr(path, U_FILE_SEP_CHAR);
  ------------------
  |  |   40|  1.54k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  1.54k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1209|  1.54k|        if(uprv_pathIsAbsolute(path) || (pkg != first)) { /* more than one slash in the path- not a tree name */
  ------------------
  |  | 1533|  1.54k|#define uprv_pathIsAbsolute U_ICU_ENTRY_POINT_RENAME(uprv_pathIsAbsolute)
  |  |  ------------------
  |  |  |  |  123|  1.54k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.54k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.54k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1209:12): [True: 0, False: 1.54k]
  |  Branch (1209:41): [True: 0, False: 1.54k]
  ------------------
 1210|       |            /* see if this is an /absolute/path/to/package  path */
 1211|      0|            if(pkg) {
  ------------------
  |  Branch (1211:16): [True: 0, False: 0]
  ------------------
 1212|      0|                pkgName.append(pkg+1, *pErrorCode);
 1213|      0|            } else {
 1214|      0|                pkgName.append(path, *pErrorCode);
 1215|      0|            }
 1216|  1.54k|        } else {
 1217|  1.54k|            treeChar = uprv_strchr(path, U_TREE_SEPARATOR);
  ------------------
  |  |   40|  1.54k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  1.54k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1218|  1.54k|            if(treeChar) { 
  ------------------
  |  Branch (1218:16): [True: 1.54k, False: 1]
  ------------------
 1219|  1.54k|                treeName.append(treeChar+1, *pErrorCode); /* following '-' */
 1220|  1.54k|                if(isICUData) {
  ------------------
  |  Branch (1220:20): [True: 1.54k, False: 0]
  ------------------
 1221|  1.54k|                    pkgName.append(U_ICUDATA_NAME, *pErrorCode);
  ------------------
  |  |  154|  1.54k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  |  |  |  |  144|  1.54k|#     define U_ICUDATA_TYPE_LETTER "l"
  |  |  ------------------
  ------------------
 1222|  1.54k|                } else {
 1223|      0|                    pkgName.append(path, static_cast<int32_t>(treeChar - path), *pErrorCode);
 1224|      0|                    if (first == nullptr) {
  ------------------
  |  Branch (1224:25): [True: 0, False: 0]
  ------------------
 1225|       |                        /*
 1226|       |                        This user data has no path, but there is a tree name.
 1227|       |                        Look up the correct path from the data cache later.
 1228|       |                        */
 1229|      0|                        path = pkgName.data();
 1230|      0|                    }
 1231|      0|                }
 1232|  1.54k|            } else {
 1233|      1|                if(isICUData) {
  ------------------
  |  Branch (1233:20): [True: 1, False: 0]
  ------------------
 1234|      1|                    pkgName.append(U_ICUDATA_NAME, *pErrorCode);
  ------------------
  |  |  154|      1|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  |  |  |  |  144|      1|#     define U_ICUDATA_TYPE_LETTER "l"
  |  |  ------------------
  ------------------
 1235|      1|                } else {
 1236|      0|                    pkgName.append(path, *pErrorCode);
 1237|      0|                }
 1238|      1|            }
 1239|  1.54k|        }
 1240|  1.54k|    }
 1241|       |
 1242|       |#ifdef UDATA_DEBUG
 1243|       |    fprintf(stderr, " P=%s T=%s\n", pkgName.data(), treeName.data());
 1244|       |#endif
 1245|       |
 1246|       |    /* setting up the entry name and file name 
 1247|       |     * Make up a full name by appending the type to the supplied
 1248|       |     *  name, assuming that a type was supplied.
 1249|       |     */
 1250|       |
 1251|       |    /* prepend the package */
 1252|  2.36k|    tocEntryName.append(pkgName, *pErrorCode);
 1253|  2.36k|    tocEntryPath.append(pkgName, *pErrorCode);
 1254|  2.36k|    tocEntrySuffixIndex = tocEntryName.length();
 1255|       |
 1256|  2.36k|    if(!treeName.isEmpty()) {
  ------------------
  |  Branch (1256:8): [True: 1.54k, False: 824]
  ------------------
 1257|  1.54k|        tocEntryName.append(U_TREE_ENTRY_SEP_CHAR, *pErrorCode).append(treeName, *pErrorCode);
  ------------------
  |  |   62|  1.54k|#define U_TREE_ENTRY_SEP_CHAR '/'
  ------------------
 1258|  1.54k|        tocEntryPath.append(U_FILE_SEP_CHAR, *pErrorCode).append(treeName, *pErrorCode);
  ------------------
  |  |  130|  1.54k|#   define U_FILE_SEP_CHAR '/'
  ------------------
 1259|  1.54k|    }
 1260|       |
 1261|  2.36k|    tocEntryName.append(U_TREE_ENTRY_SEP_CHAR, *pErrorCode).append(name, *pErrorCode);
  ------------------
  |  |   62|  2.36k|#define U_TREE_ENTRY_SEP_CHAR '/'
  ------------------
 1262|  2.36k|    tocEntryPath.append(U_FILE_SEP_CHAR, *pErrorCode).append(name, *pErrorCode);
  ------------------
  |  |  130|  2.36k|#   define U_FILE_SEP_CHAR '/'
  ------------------
 1263|  2.36k|    if(type!=nullptr && *type!=0) {
  ------------------
  |  Branch (1263:8): [True: 2.36k, False: 0]
  |  Branch (1263:25): [True: 2.36k, False: 0]
  ------------------
 1264|  2.36k|        tocEntryName.append(".", *pErrorCode).append(type, *pErrorCode);
 1265|  2.36k|        tocEntryPath.append(".", *pErrorCode).append(type, *pErrorCode);
 1266|  2.36k|    }
 1267|       |    // The +1 is for the U_FILE_SEP_CHAR that is always appended above.
 1268|  2.36k|    tocEntryPathSuffix = tocEntryPath.data() + tocEntrySuffixIndex + 1; /* suffix starts here */
 1269|       |
 1270|       |#ifdef UDATA_DEBUG
 1271|       |    fprintf(stderr, " tocEntryName = %s\n", tocEntryName.data());
 1272|       |    fprintf(stderr, " tocEntryPath = %s\n", tocEntryName.data());
 1273|       |#endif
 1274|       |
 1275|  2.36k|#if !defined(ICU_DATA_DIR_WINDOWS)
 1276|  2.36k|    if(path == nullptr) {
  ------------------
  |  Branch (1276:8): [True: 823, False: 1.54k]
  ------------------
 1277|    823|        path = COMMON_DATA_NAME; /* "icudt26e" */
  ------------------
  |  |   34|    823|#define COMMON_DATA_NAME U_ICUDATA_NAME
  |  |  ------------------
  |  |  |  |  154|    823|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  |  |  ------------------
  |  |  |  |  |  |  144|    823|#     define U_ICUDATA_TYPE_LETTER "l"
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1278|    823|    }
 1279|       |#else
 1280|       |    // When using the Windows system data, we expects only a single data file.
 1281|       |    path = COMMON_DATA_NAME; /* "icudt26e" */
 1282|       |#endif
 1283|       |
 1284|       |    /************************ Begin loop looking for ind. files ***************/
 1285|       |#ifdef UDATA_DEBUG
 1286|       |    fprintf(stderr, "IND: inBasename = %s, pkg=%s\n", "(n/a)", packageNameFromPath(path));
 1287|       |#endif
 1288|       |
 1289|       |    /* End of dealing with a null basename */
 1290|  2.36k|    dataPath = u_getDataDirectory();
  ------------------
  |  |  271|  2.36k|#define u_getDataDirectory U_ICU_ENTRY_POINT_RENAME(u_getDataDirectory)
  |  |  ------------------
  |  |  |  |  123|  2.36k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.36k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.36k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1291|       |
 1292|       |    /****    Time zone individual files override  */
 1293|  2.36k|    if (isICUData && isTimeZoneFile(name, type)) {
  ------------------
  |  Branch (1293:9): [True: 2.36k, False: 0]
  |  Branch (1293:22): [True: 0, False: 2.36k]
  ------------------
 1294|      0|        const char *tzFilesDir = u_getTimeZoneFilesDirectory(pErrorCode);
  ------------------
  |  |  287|      0|#define u_getTimeZoneFilesDirectory U_ICU_ENTRY_POINT_RENAME(u_getTimeZoneFilesDirectory)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1295|      0|        if (tzFilesDir[0] != 0) {
  ------------------
  |  Branch (1295:13): [True: 0, False: 0]
  ------------------
 1296|       |#ifdef UDATA_DEBUG
 1297|       |            fprintf(stderr, "Trying Time Zone Files directory = %s\n", tzFilesDir);
 1298|       |#endif
 1299|      0|            retVal = doLoadFromIndividualFiles(/* pkgName.data() */ "", tzFilesDir, tocEntryPathSuffix,
 1300|      0|                            /* path */ "", type, name, isAcceptable, context, &subErrorCode, pErrorCode);
 1301|      0|            if((retVal != nullptr) || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (1301:16): [True: 0, False: 0]
  |  Branch (1301:39): [True: 0, False: 0]
  ------------------
 1302|      0|                return retVal;
 1303|      0|            }
 1304|      0|        }
 1305|      0|    }
 1306|       |
 1307|       |    /****    COMMON PACKAGE  - only if packages are first. */
 1308|  2.36k|    if(gDataFileAccess == UDATA_PACKAGES_FIRST) {
  ------------------
  |  Branch (1308:8): [True: 0, False: 2.36k]
  ------------------
 1309|       |#ifdef UDATA_DEBUG
 1310|       |        fprintf(stderr, "Trying packages (UDATA_PACKAGES_FIRST)\n");
 1311|       |#endif
 1312|       |        /* #2 */
 1313|      0|        retVal = doLoadFromCommonData(isICUData, 
 1314|      0|                            pkgName.data(), dataPath, tocEntryPathSuffix, tocEntryName.data(),
 1315|      0|                            path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
 1316|      0|        if((retVal != nullptr) || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (1316:12): [True: 0, False: 0]
  |  Branch (1316:35): [True: 0, False: 0]
  ------------------
 1317|      0|            return retVal;
 1318|      0|        }
 1319|      0|    }
 1320|       |
 1321|       |    /****    INDIVIDUAL FILES  */
 1322|  2.36k|    if((gDataFileAccess==UDATA_PACKAGES_FIRST) ||
  ------------------
  |  Branch (1322:8): [True: 0, False: 2.36k]
  ------------------
 1323|  2.36k|       (gDataFileAccess==UDATA_FILES_FIRST)) {
  ------------------
  |  Branch (1323:8): [True: 2.36k, False: 0]
  ------------------
 1324|       |#ifdef UDATA_DEBUG
 1325|       |        fprintf(stderr, "Trying individual files\n");
 1326|       |#endif
 1327|       |        /* Check to make sure that there is a dataPath to iterate over */
 1328|  2.36k|        if ((dataPath && *dataPath) || !isICUData) {
  ------------------
  |  Branch (1328:14): [True: 2.36k, False: 0]
  |  Branch (1328:26): [True: 0, False: 2.36k]
  |  Branch (1328:40): [True: 0, False: 2.36k]
  ------------------
 1329|      0|            retVal = doLoadFromIndividualFiles(pkgName.data(), dataPath, tocEntryPathSuffix,
 1330|      0|                            path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
 1331|      0|            if((retVal != nullptr) || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (1331:16): [True: 0, False: 0]
  |  Branch (1331:39): [True: 0, False: 0]
  ------------------
 1332|      0|                return retVal;
 1333|      0|            }
 1334|      0|        }
 1335|  2.36k|    }
 1336|       |
 1337|       |    /****    COMMON PACKAGE  */
 1338|  2.36k|    if((gDataFileAccess==UDATA_ONLY_PACKAGES) || 
  ------------------
  |  Branch (1338:8): [True: 0, False: 2.36k]
  ------------------
 1339|  2.36k|       (gDataFileAccess==UDATA_FILES_FIRST)) {
  ------------------
  |  Branch (1339:8): [True: 2.36k, False: 0]
  ------------------
 1340|       |#ifdef UDATA_DEBUG
 1341|       |        fprintf(stderr, "Trying packages (UDATA_ONLY_PACKAGES || UDATA_FILES_FIRST)\n");
 1342|       |#endif
 1343|  2.36k|        retVal = doLoadFromCommonData(isICUData,
 1344|  2.36k|                            pkgName.data(), dataPath, tocEntryPathSuffix, tocEntryName.data(),
 1345|  2.36k|                            path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
 1346|  2.36k|        if((retVal != nullptr) || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (1346:12): [True: 1.58k, False: 784]
  |  Branch (1346:35): [True: 0, False: 784]
  ------------------
 1347|  1.58k|            return retVal;
 1348|  1.58k|        }
 1349|  2.36k|    }
 1350|       |    
 1351|       |    /* Load from DLL.  If we haven't attempted package load, we also haven't had any chance to
 1352|       |        try a DLL (static or setCommonData/etc)  load.
 1353|       |         If we ever have a "UDATA_ONLY_FILES", add it to the or list here.  */  
 1354|    784|    if(gDataFileAccess==UDATA_NO_FILES) {
  ------------------
  |  Branch (1354:8): [True: 0, False: 784]
  ------------------
 1355|       |#ifdef UDATA_DEBUG
 1356|       |        fprintf(stderr, "Trying common data (UDATA_NO_FILES)\n");
 1357|       |#endif
 1358|      0|        retVal = doLoadFromCommonData(isICUData,
 1359|      0|                            pkgName.data(), "", tocEntryPathSuffix, tocEntryName.data(),
 1360|      0|                            path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
 1361|      0|        if((retVal != nullptr) || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (1361:12): [True: 0, False: 0]
  |  Branch (1361:35): [True: 0, False: 0]
  ------------------
 1362|      0|            return retVal;
 1363|      0|        }
 1364|      0|    }
 1365|       |
 1366|       |    /* data not found */
 1367|    784|    if(U_SUCCESS(*pErrorCode)) {
  ------------------
  |  Branch (1367:8): [True: 784, False: 0]
  ------------------
 1368|    784|        if(U_SUCCESS(subErrorCode)) {
  ------------------
  |  Branch (1368:12): [True: 783, False: 1]
  ------------------
 1369|       |            /* file not found */
 1370|    783|            *pErrorCode=U_FILE_ACCESS_ERROR;
 1371|    783|        } else {
 1372|       |            /* entry point not found or rejected */
 1373|      1|            *pErrorCode=subErrorCode;
 1374|      1|        }
 1375|    784|    }
 1376|    784|    return retVal;
 1377|    784|}
udata.cpp:_ZL14isTimeZoneFilePKcS0_:
 1107|  2.36k|static UBool isTimeZoneFile(const char *name, const char *type) {
 1108|  2.36k|    return ((uprv_strcmp(type, "res") == 0) &&
  ------------------
  |  |   38|  2.36k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  2.36k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1108:13): [True: 2.36k, False: 0]
  ------------------
 1109|  2.36k|            (uprv_strcmp(name, "zoneinfo64") == 0 ||
  ------------------
  |  |   38|  2.36k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  2.36k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1109:14): [True: 0, False: 2.36k]
  ------------------
 1110|  2.36k|             uprv_strcmp(name, "timezoneTypes") == 0 ||
  ------------------
  |  |   38|  2.36k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  2.36k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1110:14): [True: 0, False: 2.36k]
  ------------------
 1111|  2.36k|             uprv_strcmp(name, "windowsZones") == 0 ||
  ------------------
  |  |   38|  2.36k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  2.36k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1111:14): [True: 0, False: 2.36k]
  ------------------
 1112|  2.36k|             uprv_strcmp(name, "metaZones") == 0));
  ------------------
  |  |   38|  2.36k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  2.36k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1112:14): [True: 0, False: 2.36k]
  ------------------
 1113|  2.36k|}
udata.cpp:_ZL13checkDataItemPK10DataHeaderPFaPvPKcS4_PK9UDataInfoES2_S4_S4_P10UErrorCodeSB_:
  949|  1.58k|{
  950|  1.58k|    UDataMemory  *rDataMem = nullptr;          /* the new UDataMemory, to be returned.        */
  951|       |
  952|  1.58k|    if (U_FAILURE(*fatalErr)) {
  ------------------
  |  Branch (952:9): [True: 0, False: 1.58k]
  ------------------
  953|      0|        return nullptr;
  954|      0|    }
  955|       |
  956|  1.58k|    if(pHeader->dataHeader.magic1==0xda &&
  ------------------
  |  Branch (956:8): [True: 1.58k, False: 0]
  ------------------
  957|  1.58k|        pHeader->dataHeader.magic2==0x27 &&
  ------------------
  |  Branch (957:9): [True: 1.58k, False: 0]
  ------------------
  958|  1.58k|        (isAcceptable==nullptr || isAcceptable(context, type, name, &pHeader->info))
  ------------------
  |  Branch (958:10): [True: 0, False: 1.58k]
  |  Branch (958:35): [True: 1.58k, False: 0]
  ------------------
  959|  1.58k|    ) {
  960|  1.58k|        rDataMem=UDataMemory_createNewInstance(fatalErr);
  ------------------
  |  |   79|  1.58k|#define UDataMemory_createNewInstance U_ICU_ENTRY_POINT_RENAME(UDataMemory_createNewInstance)
  |  |  ------------------
  |  |  |  |  123|  1.58k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.58k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.58k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  961|  1.58k|        if (U_FAILURE(*fatalErr)) {
  ------------------
  |  Branch (961:13): [True: 0, False: 1.58k]
  ------------------
  962|      0|            return nullptr;
  963|      0|        }
  964|  1.58k|        rDataMem->pHeader = pHeader;
  965|  1.58k|    } else {
  966|       |        /* the data is not acceptable, look further */
  967|       |        /* If we eventually find something good, this errorcode will be */
  968|       |        /*    cleared out.                                              */
  969|      0|        *nonFatalErr=U_INVALID_FORMAT_ERROR;
  970|      0|    }
  971|  1.58k|    return rDataMem;
  972|  1.58k|}
udata.cpp:_ZL20doLoadFromCommonDataaPKcS0_S0_S0_S0_S0_S0_PFaPvS0_S0_PK9UDataInfoES1_P10UErrorCodeS8_:
 1042|  2.36k|{
 1043|  2.36k|    UDataMemory        *pEntryData;
 1044|  2.36k|    const DataHeader   *pHeader;
 1045|  2.36k|    UDataMemory        *pCommonData;
 1046|  2.36k|    int32_t            commonDataIndex;
 1047|  2.36k|    UBool              checkedExtendedICUData = false;
 1048|       |    /* try to get common data.  The loop is for platforms such as the 390 that do
 1049|       |     *  not initially load the full set of ICU data.  If the lookup of an ICU data item
 1050|       |     *  fails, the full (but slower to load) set is loaded, the and the loop repeats,
 1051|       |     *  trying the lookup again.  Once the full set of ICU data is loaded, the loop wont
 1052|       |     *  repeat because the full set will be checked the first time through.
 1053|       |     *
 1054|       |     *  The loop also handles the fallback to a .dat file if the application linked
 1055|       |     *   to the stub data library rather than a real library.
 1056|       |     */
 1057|  3.15k|    for (commonDataIndex = isICUData ? 0 : -1;;) {
  ------------------
  |  Branch (1057:28): [True: 2.36k, False: 0]
  ------------------
 1058|  3.15k|        pCommonData=openCommonData(path, commonDataIndex, subErrorCode); /** search for pkg **/
 1059|       |
 1060|  3.15k|        if(U_SUCCESS(*subErrorCode) && pCommonData!=nullptr) {
  ------------------
  |  Branch (1060:12): [True: 3.15k, False: 0]
  |  Branch (1060:40): [True: 2.36k, False: 784]
  ------------------
 1061|  2.36k|            int32_t length;
 1062|       |
 1063|       |            /* look up the data piece in the common data */
 1064|  2.36k|            pHeader=pCommonData->vFuncs->Lookup(pCommonData, tocEntryName, &length, subErrorCode);
 1065|       |#ifdef UDATA_DEBUG
 1066|       |            fprintf(stderr, "%s: pHeader=%p - %s\n", tocEntryName, (void*) pHeader, u_errorName(*subErrorCode));
 1067|       |#endif
 1068|       |
 1069|  2.36k|            if(pHeader!=nullptr) {
  ------------------
  |  Branch (1069:16): [True: 1.58k, False: 784]
  ------------------
 1070|  1.58k|                pEntryData = checkDataItem(pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode);
 1071|       |#ifdef UDATA_DEBUG
 1072|       |                fprintf(stderr, "pEntryData=%p\n", (void*) pEntryData);
 1073|       |#endif
 1074|  1.58k|                if (U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (1074:21): [True: 0, False: 1.58k]
  ------------------
 1075|      0|                    return nullptr;
 1076|      0|                }
 1077|  1.58k|                if (pEntryData != nullptr) {
  ------------------
  |  Branch (1077:21): [True: 1.58k, False: 0]
  ------------------
 1078|  1.58k|                    pEntryData->length = length;
 1079|  1.58k|                    return pEntryData;
 1080|  1.58k|                }
 1081|  1.58k|            }
 1082|  2.36k|        }
 1083|       |        // If we failed due to being out-of-memory, then stop early and report the error.
 1084|  1.56k|        if (*subErrorCode == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (1084:13): [True: 0, False: 1.56k]
  ------------------
 1085|      0|            *pErrorCode = *subErrorCode;
 1086|      0|            return nullptr;
 1087|      0|        }
 1088|       |        /* Data wasn't found.  If we were looking for an ICUData item and there is
 1089|       |         * more data available, load it and try again,
 1090|       |         * otherwise break out of this loop. */
 1091|  1.56k|        if (!isICUData) {
  ------------------
  |  Branch (1091:13): [True: 0, False: 1.56k]
  ------------------
 1092|      0|            return nullptr;
 1093|  1.56k|        } else if (pCommonData != nullptr) {
  ------------------
  |  Branch (1093:20): [True: 784, False: 784]
  ------------------
 1094|    784|            ++commonDataIndex;  /* try the next data package */
 1095|    784|        } else if ((!checkedExtendedICUData) && extendICUData(subErrorCode)) {
  ------------------
  |  Branch (1095:20): [True: 784, False: 0]
  |  Branch (1095:49): [True: 0, False: 784]
  ------------------
 1096|      0|            checkedExtendedICUData = true;
 1097|       |            /* try this data package slot again: it changed from nullptr to non-nullptr */
 1098|    784|        } else {
 1099|    784|            return nullptr;
 1100|    784|        }
 1101|  1.56k|    }
 1102|  2.36k|}
udata.cpp:_ZL14openCommonDataPKciP10UErrorCode:
  673|  3.15k|{
  674|  3.15k|    UDataMemory tData;
  675|  3.15k|    const char *pathBuffer;
  676|  3.15k|    const char *inBasename;
  677|       |
  678|  3.15k|    if (U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (678:9): [True: 0, False: 3.15k]
  ------------------
  679|      0|        return nullptr;
  680|      0|    }
  681|       |
  682|  3.15k|    UDataMemory_init(&tData);
  ------------------
  |  |   80|  3.15k|#define UDataMemory_init U_ICU_ENTRY_POINT_RENAME(UDataMemory_init)
  |  |  ------------------
  |  |  |  |  123|  3.15k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.15k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.15k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  683|       |
  684|       |    /* ??????? TODO revisit this */ 
  685|  3.15k|    if (commonDataIndex >= 0) {
  ------------------
  |  Branch (685:9): [True: 3.15k, False: 1]
  ------------------
  686|       |        /* "mini-cache" for common ICU data */
  687|  3.15k|        if(commonDataIndex >= UPRV_LENGTHOF(gCommonICUDataArray)) {
  ------------------
  |  |   99|  3.15k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (687:12): [True: 0, False: 3.15k]
  ------------------
  688|      0|            return nullptr;
  689|      0|        }
  690|  3.15k|        {
  691|  3.15k|            Mutex lock;
  692|  3.15k|            if(gCommonICUDataArray[commonDataIndex] != nullptr) {
  ------------------
  |  Branch (692:16): [True: 2.36k, False: 785]
  ------------------
  693|  2.36k|                return gCommonICUDataArray[commonDataIndex];
  694|  2.36k|            }
  695|    785|#if !defined(ICU_DATA_DIR_WINDOWS)
  696|       |// When using the Windows system data, we expect only a single data file.
  697|    785|            int32_t i;
  698|    785|            for(i = 0; i < commonDataIndex; ++i) {
  ------------------
  |  Branch (698:24): [True: 784, False: 1]
  ------------------
  699|    784|                if(gCommonICUDataArray[i]->pHeader == &U_ICUDATA_ENTRY_POINT) {
  ------------------
  |  |  171|    784|#define U_ICUDATA_ENTRY_POINT  U_DEF2_ICUDATA_ENTRY_POINT(U_ICU_VERSION_MAJOR_NUM,U_LIB_SUFFIX_C_NAME)
  |  |  ------------------
  |  |  |  |  178|    784|#define U_DEF2_ICUDATA_ENTRY_POINT(major,suff) U_DEF_ICUDATA_ENTRY_POINT(major,suff)
  |  |  |  |  ------------------
  |  |  |  |  |  |  187|    784|#define U_DEF_ICUDATA_ENTRY_POINT(major, suff) icudt##major##_dat
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (699:20): [True: 784, False: 0]
  ------------------
  700|       |                    /* The linked-in data is already in the list. */
  701|    784|                    return nullptr;
  702|    784|                }
  703|    784|            }
  704|    785|#endif
  705|    785|        }
  706|       |
  707|       |        /* Add the linked-in data to the list. */
  708|       |        /*
  709|       |         * This is where we would check and call weakly linked partial-data-library
  710|       |         * access functions.
  711|       |         */
  712|       |        /*
  713|       |        if (uprv_getICUData_collation) {
  714|       |            setCommonICUDataPointer(uprv_getICUData_collation(), false, pErrorCode);
  715|       |        }
  716|       |        if (uprv_getICUData_conversion) {
  717|       |            setCommonICUDataPointer(uprv_getICUData_conversion(), false, pErrorCode);
  718|       |        }
  719|       |        */
  720|      1|#if !defined(ICU_DATA_DIR_WINDOWS)
  721|       |// When using the Windows system data, we expect only a single data file.
  722|      1|        setCommonICUDataPointer(&U_ICUDATA_ENTRY_POINT, false, pErrorCode);
  ------------------
  |  |  171|      1|#define U_ICUDATA_ENTRY_POINT  U_DEF2_ICUDATA_ENTRY_POINT(U_ICU_VERSION_MAJOR_NUM,U_LIB_SUFFIX_C_NAME)
  |  |  ------------------
  |  |  |  |  178|      1|#define U_DEF2_ICUDATA_ENTRY_POINT(major,suff) U_DEF_ICUDATA_ENTRY_POINT(major,suff)
  |  |  |  |  ------------------
  |  |  |  |  |  |  187|      1|#define U_DEF_ICUDATA_ENTRY_POINT(major, suff) icudt##major##_dat
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  723|      1|        {
  724|      1|            Mutex lock;
  725|      1|            return gCommonICUDataArray[commonDataIndex];
  726|    785|        }
  727|    785|#endif
  728|    785|    }
  729|       |
  730|       |
  731|       |    /* request is NOT for ICU Data.  */
  732|       |
  733|       |    /* Find the base name portion of the supplied path.   */
  734|       |    /*   inBasename will be left pointing somewhere within the original path string.      */
  735|      1|    inBasename = findBasename(path);
  736|       |#ifdef UDATA_DEBUG
  737|       |    fprintf(stderr, "inBasename = %s\n", inBasename);
  738|       |#endif
  739|       |
  740|      1|    if(*inBasename==0) {
  ------------------
  |  Branch (740:8): [True: 0, False: 1]
  ------------------
  741|       |        /* no basename.     This will happen if the original path was a directory name,   */
  742|       |        /*    like  "a/b/c/".   (Fallback to separate files will still work.)             */
  743|       |#ifdef UDATA_DEBUG
  744|       |        fprintf(stderr, "ocd: no basename in %s, bailing.\n", path);
  745|       |#endif
  746|      0|        if (U_SUCCESS(*pErrorCode)) {
  ------------------
  |  Branch (746:13): [True: 0, False: 0]
  ------------------
  747|      0|            *pErrorCode=U_FILE_ACCESS_ERROR;
  748|      0|        }
  749|      0|        return nullptr;
  750|      0|    }
  751|       |
  752|       |   /* Is the requested common data file already open and cached?                     */
  753|       |   /*   Note that the cache is keyed by the base name only.  The rest of the path,   */
  754|       |   /*     if any, is not considered.                                                 */
  755|      1|    UDataMemory  *dataToReturn = udata_findCachedData(inBasename, *pErrorCode);
  756|      1|    if (dataToReturn != nullptr || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (756:9): [True: 0, False: 1]
  |  Branch (756:36): [True: 0, False: 1]
  ------------------
  757|      0|        return dataToReturn;
  758|      0|    }
  759|       |
  760|       |    /* Requested item is not in the cache.
  761|       |     * Hunt it down, trying all the path locations
  762|       |     */
  763|       |
  764|      1|    UDataPathIterator iter(u_getDataDirectory(), inBasename, path, ".dat", true, pErrorCode);
  ------------------
  |  |  271|      1|#define u_getDataDirectory U_ICU_ENTRY_POINT_RENAME(u_getDataDirectory)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  765|       |
  766|      1|    while ((UDataMemory_isLoaded(&tData)==false) && (pathBuffer = iter.next(pErrorCode)) != nullptr)
  ------------------
  |  |   81|      1|#define UDataMemory_isLoaded U_ICU_ENTRY_POINT_RENAME(UDataMemory_isLoaded)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (766:12): [True: 1, False: 0]
  |  Branch (766:53): [True: 0, False: 1]
  ------------------
  767|      0|    {
  768|       |#ifdef UDATA_DEBUG
  769|       |        fprintf(stderr, "ocd: trying path %s - ", pathBuffer);
  770|       |#endif
  771|      0|        uprv_mapFile(&tData, pathBuffer, pErrorCode);
  ------------------
  |  | 1525|      0|#define uprv_mapFile U_ICU_ENTRY_POINT_RENAME(uprv_mapFile)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  772|       |#ifdef UDATA_DEBUG
  773|       |        fprintf(stderr, "%s\n", UDataMemory_isLoaded(&tData)?"LOADED":"not loaded");
  774|       |#endif
  775|      0|    }
  776|      1|    if (U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (776:9): [True: 0, False: 1]
  ------------------
  777|      0|        return nullptr;
  778|      0|    }
  779|       |
  780|      1|    if (U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (780:9): [True: 0, False: 1]
  ------------------
  781|      0|        return nullptr;
  782|      0|    }
  783|      1|    if (!UDataMemory_isLoaded(&tData)) {
  ------------------
  |  |   81|      1|#define UDataMemory_isLoaded U_ICU_ENTRY_POINT_RENAME(UDataMemory_isLoaded)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (783:9): [True: 1, False: 0]
  ------------------
  784|       |        /* no common data */
  785|      1|        *pErrorCode=U_FILE_ACCESS_ERROR;
  786|      1|        return nullptr;
  787|      1|    }
  788|       |
  789|       |    /* we have mapped a file, check its header */
  790|      0|    udata_checkCommonData(&tData, pErrorCode);
  ------------------
  |  |  884|      0|#define udata_checkCommonData U_ICU_ENTRY_POINT_RENAME(udata_checkCommonData)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  791|       |
  792|       |
  793|       |    /* Cache the UDataMemory struct for this .dat file,
  794|       |     *   so we won't need to hunt it down and map it again next time
  795|       |     *   something is needed from it.                */
  796|      0|    return udata_cacheDataItem(inBasename, &tData, pErrorCode);
  797|      1|}
udata.cpp:_ZL23setCommonICUDataPointerPKvaP10UErrorCode:
  214|      1|setCommonICUDataPointer(const void *pData, UBool /*warn*/, UErrorCode *pErrorCode) {
  215|      1|    UDataMemory tData;
  216|      1|    UDataMemory_init(&tData);
  ------------------
  |  |   80|      1|#define UDataMemory_init U_ICU_ENTRY_POINT_RENAME(UDataMemory_init)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  217|      1|    UDataMemory_setData(&tData, pData);
  ------------------
  |  |   83|      1|#define UDataMemory_setData U_ICU_ENTRY_POINT_RENAME(UDataMemory_setData)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  218|      1|    udata_checkCommonData(&tData, pErrorCode);
  ------------------
  |  |  884|      1|#define udata_checkCommonData U_ICU_ENTRY_POINT_RENAME(udata_checkCommonData)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  219|      1|    return setCommonICUData(&tData, false, pErrorCode);
  220|      1|}
udata.cpp:_ZL20udata_findCachedDataPKcR10UErrorCode:
  306|    785|{
  307|    785|    UHashtable        *htable;
  308|    785|    UDataMemory       *retVal = nullptr;
  309|    785|    DataCacheElement  *el;
  310|    785|    const char        *baseName;
  311|       |
  312|    785|    htable = udata_getHashTable(err);
  313|    785|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (313:9): [True: 1, False: 784]
  ------------------
  314|      1|        return nullptr;
  315|      1|    }
  316|       |
  317|    784|    baseName = findBasename(path);   /* Cache remembers only the base name, not the full path. */
  318|    784|    umtx_lock(nullptr);
  ------------------
  |  | 1250|    784|#define umtx_lock U_ICU_ENTRY_POINT_RENAME(umtx_lock)
  |  |  ------------------
  |  |  |  |  123|    784|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    784|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    784|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  319|    784|    el = static_cast<DataCacheElement*>(uhash_get(htable, baseName));
  ------------------
  |  | 1007|    784|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|    784|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    784|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    784|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  320|    784|    umtx_unlock(nullptr);
  ------------------
  |  | 1251|    784|#define umtx_unlock U_ICU_ENTRY_POINT_RENAME(umtx_unlock)
  |  |  ------------------
  |  |  |  |  123|    784|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    784|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    784|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  321|    784|    if (el != nullptr) {
  ------------------
  |  Branch (321:9): [True: 0, False: 784]
  ------------------
  322|      0|        retVal = el->item;
  323|      0|    }
  324|       |#ifdef UDATA_DEBUG
  325|       |    fprintf(stderr, "Cache: [%s] -> %p\n", baseName, (void*) retVal);
  326|       |#endif
  327|    784|    return retVal;
  328|    785|}
udata.cpp:_ZL13extendICUDataP10UErrorCode:
  811|    784|{
  812|    784|    UDataMemory   *pData;
  813|    784|    UDataMemory   copyPData;
  814|    784|    UBool         didUpdate = false;
  815|       |
  816|       |    /*
  817|       |     * There is a chance for a race condition here.
  818|       |     * Normally, ICU data is loaded from a DLL or via mmap() and
  819|       |     * setCommonICUData() will detect if the same address is set twice.
  820|       |     * If ICU is built with data loading via fread() then the address will
  821|       |     * be different each time the common data is loaded and we may add
  822|       |     * multiple copies of the data.
  823|       |     * In this case, use a mutex to prevent the race.
  824|       |     * Use a specific mutex to avoid nested locks of the global mutex.
  825|       |     */
  826|       |#if MAP_IMPLEMENTATION==MAP_STDIO
  827|       |    static UMutex extendICUDataMutex;
  828|       |    umtx_lock(&extendICUDataMutex);
  829|       |#endif
  830|    784|    if(!umtx_loadAcquire(gHaveTriedToLoadCommonData)) {
  ------------------
  |  Branch (830:8): [True: 1, False: 783]
  ------------------
  831|       |        /* See if we can explicitly open a .dat file for the ICUData. */
  832|      1|        pData = openCommonData(
  833|      1|                   U_ICUDATA_NAME,            /*  "icudt20l" , for example.          */
  ------------------
  |  |  154|      1|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  |  |  |  |  144|      1|#     define U_ICUDATA_TYPE_LETTER "l"
  |  |  ------------------
  ------------------
  834|      1|                   -1,                        /*  Pretend we're not opening ICUData  */
  835|      1|                   pErr);
  836|       |
  837|       |        /* How about if there is no pData, eh... */
  838|       |
  839|      1|       UDataMemory_init(&copyPData);
  ------------------
  |  |   80|      1|#define UDataMemory_init U_ICU_ENTRY_POINT_RENAME(UDataMemory_init)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  840|      1|       if(pData != nullptr) {
  ------------------
  |  Branch (840:11): [True: 0, False: 1]
  ------------------
  841|      0|          UDatamemory_assign(&copyPData, pData);
  ------------------
  |  |   84|      0|#define UDatamemory_assign U_ICU_ENTRY_POINT_RENAME(UDatamemory_assign)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  842|      0|          copyPData.map = nullptr;     /* The mapping for this data is owned by the hash table */
  843|      0|          copyPData.mapAddr = nullptr; /*   which will unmap it when ICU is shut down.         */
  844|       |                                       /* CommonICUData is also unmapped when ICU is shut down.*/
  845|       |                                       /* To avoid unmapping the data twice, zero out the map  */
  846|       |                                       /*   fields in the UDataMemory that we're assigning     */
  847|       |                                       /*   to CommonICUData.                                  */
  848|       |
  849|      0|          didUpdate = /* no longer using this result */
  850|      0|              setCommonICUData(&copyPData,/*  The new common data.                                */
  851|      0|                       false,             /*  No warnings if write didn't happen                  */
  852|      0|                       pErr);             /*  setCommonICUData honors errors; NOP if error set    */
  853|      0|        }
  854|       |
  855|      1|        umtx_storeRelease(gHaveTriedToLoadCommonData, 1);
  856|      1|    }
  857|       |
  858|    784|    didUpdate = findCommonICUDataByName(U_ICUDATA_NAME, *pErr);  /* Return 'true' when a racing writes out the extended                 */
  ------------------
  |  |  154|    784|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  |  |  |  |  144|    784|#     define U_ICUDATA_TYPE_LETTER "l"
  |  |  ------------------
  ------------------
  859|       |                                                          /* data after another thread has failed to see it (in openCommonData), so     */
  860|       |                                                          /* extended data can be examined.                                             */
  861|       |                                                          /* Also handles a race through here before gHaveTriedToLoadCommonData is set. */
  862|       |
  863|       |#if MAP_IMPLEMENTATION==MAP_STDIO
  864|       |    umtx_unlock(&extendICUDataMutex);
  865|       |#endif
  866|    784|    return didUpdate;               /* Return true if ICUData pointer was updated.   */
  867|       |                                    /*   (Could potentially have been done by another thread racing */
  868|       |                                    /*   us through here, but that's fine, we still return true    */
  869|       |                                    /*   so that current thread will also examine extended data.   */
  870|    784|}
udata.cpp:_ZL23findCommonICUDataByNamePKcR10UErrorCode:
  144|    784|{
  145|    784|    UBool found = false;
  146|    784|    int32_t i;
  147|       |
  148|    784|    UDataMemory  *pData = udata_findCachedData(inBasename, err);
  149|    784|    if (U_FAILURE(err) || pData == nullptr)
  ------------------
  |  Branch (149:9): [True: 1, False: 783]
  |  Branch (149:27): [True: 783, False: 0]
  ------------------
  150|    784|        return false;
  151|       |
  152|      0|    {
  153|      0|        Mutex lock;
  154|      0|        for (i = 0; i < UPRV_LENGTHOF(gCommonICUDataArray); ++i) {
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (154:21): [True: 0, False: 0]
  ------------------
  155|      0|            if ((gCommonICUDataArray[i] != nullptr) && (gCommonICUDataArray[i]->pHeader == pData->pHeader)) {
  ------------------
  |  Branch (155:17): [True: 0, False: 0]
  |  Branch (155:56): [True: 0, False: 0]
  ------------------
  156|       |                /* The data pointer is already in the array. */
  157|      0|                found = true;
  158|      0|                break;
  159|      0|            }
  160|      0|        }
  161|      0|    }
  162|      0|    return found;
  163|    784|}

UDataMemory_init_78:
   28|  4.73k|U_CFUNC void UDataMemory_init(UDataMemory *This) {
   29|  4.73k|    uprv_memset(This, 0, sizeof(UDataMemory));
  ------------------
  |  |  100|  4.73k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  4.73k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   30|  4.73k|    This->length=-1;
   31|  4.73k|}
UDatamemory_assign_78:
   34|      1|U_CFUNC void UDatamemory_assign(UDataMemory *dest, UDataMemory *source) {
   35|       |    /* UDataMemory Assignment.  Destination UDataMemory must be initialized first.  */
   36|      1|    UBool mallocedFlag = dest->heapAllocated;
   37|      1|    uprv_memcpy(dest, source, sizeof(UDataMemory));
  ------------------
  |  |   42|      1|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      1|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      1|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      1|    _Pragma("clang diagnostic push") \
  |  |   45|      1|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      1|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      1|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      1|    _Pragma("clang diagnostic pop") \
  |  |   49|      1|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      1|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      1|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   38|      1|    dest->heapAllocated = mallocedFlag;
   39|      1|}
UDataMemory_createNewInstance_78:
   41|  1.58k|U_CFUNC UDataMemory *UDataMemory_createNewInstance(UErrorCode *pErr) {
   42|  1.58k|    UDataMemory *This;
   43|       |
   44|  1.58k|    if (U_FAILURE(*pErr)) {
  ------------------
  |  Branch (44:9): [True: 0, False: 1.58k]
  ------------------
   45|      0|        return nullptr;
   46|      0|    }
   47|  1.58k|    This = (UDataMemory *)uprv_malloc(sizeof(UDataMemory));
  ------------------
  |  | 1524|  1.58k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.58k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.58k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.58k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   48|  1.58k|    if (This == nullptr) {
  ------------------
  |  Branch (48:9): [True: 0, False: 1.58k]
  ------------------
   49|      0|        *pErr = U_MEMORY_ALLOCATION_ERROR; }
   50|  1.58k|    else {
   51|  1.58k|        UDataMemory_init(This);
  ------------------
  |  |   80|  1.58k|#define UDataMemory_init U_ICU_ENTRY_POINT_RENAME(UDataMemory_init)
  |  |  ------------------
  |  |  |  |  123|  1.58k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.58k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.58k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   52|  1.58k|        This->heapAllocated = true;
   53|  1.58k|    }
   54|  1.58k|    return This;
   55|  1.58k|}
UDataMemory_normalizeDataPointer_78:
   59|      1|UDataMemory_normalizeDataPointer(const void *p) {
   60|       |    /* allow the data to be optionally prepended with an alignment-forcing double value */
   61|      1|    const DataHeader *pdh = (const DataHeader *)p;
   62|      1|    if(pdh==nullptr || (pdh->dataHeader.magic1==0xda && pdh->dataHeader.magic2==0x27)) {
  ------------------
  |  Branch (62:8): [True: 0, False: 1]
  |  Branch (62:25): [True: 1, False: 0]
  |  Branch (62:57): [True: 1, False: 0]
  ------------------
   63|      1|        return pdh;
   64|      1|    } else {
   65|       |#if U_PLATFORM == U_PF_OS400
   66|       |        /*
   67|       |        TODO: Fix this once the compiler implements this feature. Keep in sync with genccode.c
   68|       |
   69|       |        This is here because this platform can't currently put
   70|       |        const data into the read-only pages of an object or
   71|       |        shared library (service program). Only strings are allowed in read-only
   72|       |        pages, so we use char * strings to store the data.
   73|       |
   74|       |        In order to prevent the beginning of the data from ever matching the
   75|       |        magic numbers we must skip the initial double.
   76|       |        [grhoten 4/24/2003]
   77|       |        */
   78|       |        return (const DataHeader *)*((const void **)p+1);
   79|       |#else
   80|      0|        return (const DataHeader *)((const double *)p+1);
   81|      0|#endif
   82|      0|    }
   83|      1|}
UDataMemory_setData_78:
   86|      1|U_CFUNC void UDataMemory_setData (UDataMemory *This, const void *dataAddr) {
   87|      1|    This->pHeader = UDataMemory_normalizeDataPointer(dataAddr);
  ------------------
  |  |   82|      1|#define UDataMemory_normalizeDataPointer U_ICU_ENTRY_POINT_RENAME(UDataMemory_normalizeDataPointer)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   88|      1|}
udata_getMemory_78:
  104|  1.58k|udata_getMemory(UDataMemory *pData) {
  105|  1.58k|    if(pData!=nullptr && pData->pHeader!=nullptr) {
  ------------------
  |  Branch (105:8): [True: 1.58k, False: 0]
  |  Branch (105:26): [True: 1.58k, False: 0]
  ------------------
  106|  1.58k|        return (char *)(pData->pHeader)+udata_getHeaderSize(pData->pHeader);
  ------------------
  |  |  887|  1.58k|#define udata_getHeaderSize U_ICU_ENTRY_POINT_RENAME(udata_getHeaderSize)
  |  |  ------------------
  |  |  |  |  123|  1.58k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.58k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.58k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  107|  1.58k|    } else {
  108|      0|        return nullptr;
  109|      0|    }
  110|  1.58k|}
UDataMemory_isLoaded_78:
  159|      2|U_CFUNC UBool UDataMemory_isLoaded(const UDataMemory *This) {
  160|      2|    return This->pHeader != nullptr;
  161|      2|}

uhash_open_78:
  547|      5|           UErrorCode *status) {
  548|       |
  549|      5|    return _uhash_create(keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status);
  ------------------
  |  |   91|      5|#define DEFAULT_PRIME_INDEX 4
  ------------------
  550|      5|}
uhash_openSize_78:
  557|      5|               UErrorCode *status) {
  558|       |
  559|       |    /* Find the smallest index i for which PRIMES[i] >= size. */
  560|      5|    int32_t i = 0;
  561|     18|    while (i<(PRIMES_LENGTH-1) && PRIMES[i]<size) {
  ------------------
  |  |   90|     18|#define PRIMES_LENGTH UPRV_LENGTHOF(PRIMES)
  |  |  ------------------
  |  |  |  |   99|     18|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  |  |  ------------------
  ------------------
  |  Branch (561:12): [True: 18, False: 0]
  |  Branch (561:35): [True: 13, False: 5]
  ------------------
  562|     13|        ++i;
  563|     13|    }
  564|       |
  565|      5|    return _uhash_create(keyHash, keyComp, valueComp, i, status);
  566|      5|}
uhash_init_78:
  573|      1|           UErrorCode *status) {
  574|       |
  575|      1|    return _uhash_init(fillinResult, keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status);
  ------------------
  |  |   91|      1|#define DEFAULT_PRIME_INDEX 4
  ------------------
  576|      1|}
uhash_close_78:
  595|     12|uhash_close(UHashtable *hash) {
  596|     12|    if (hash == nullptr) {
  ------------------
  |  Branch (596:9): [True: 11, False: 1]
  ------------------
  597|     11|        return;
  598|     11|    }
  599|      1|    if (hash->elements != nullptr) {
  ------------------
  |  Branch (599:9): [True: 1, False: 0]
  ------------------
  600|      1|        if (hash->keyDeleter != nullptr || hash->valueDeleter != nullptr) {
  ------------------
  |  Branch (600:13): [True: 0, False: 1]
  |  Branch (600:44): [True: 0, False: 1]
  ------------------
  601|      0|            int32_t pos=UHASH_FIRST;
  ------------------
  |  |  610|      0|#define UHASH_FIRST (-1)
  ------------------
  602|      0|            UHashElement *e;
  603|      0|            while ((e = (UHashElement*) uhash_nextElement(hash, &pos)) != nullptr) {
  ------------------
  |  | 1029|      0|#define uhash_nextElement U_ICU_ENTRY_POINT_RENAME(uhash_nextElement)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (603:20): [True: 0, False: 0]
  ------------------
  604|      0|                HASH_DELETE_KEY_VALUE(hash, e->key.pointer, e->value.pointer);
  ------------------
  |  |  124|      0|#define HASH_DELETE_KEY_VALUE(hash, keypointer, valuepointer) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  125|      0|    if (hash->keyDeleter != nullptr && keypointer != nullptr) { \
  |  |  ------------------
  |  |  |  Branch (125:9): [True: 0, False: 0]
  |  |  |  Branch (125:40): [True: 0, False: 0]
  |  |  ------------------
  |  |  126|      0|        (*hash->keyDeleter)(keypointer); \
  |  |  127|      0|    } \
  |  |  128|      0|    if (hash->valueDeleter != nullptr && valuepointer != nullptr) { \
  |  |  ------------------
  |  |  |  Branch (128:9): [True: 0, False: 0]
  |  |  |  Branch (128:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  129|      0|        (*hash->valueDeleter)(valuepointer); \
  |  |  130|      0|    } \
  |  |  131|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  605|      0|            }
  606|      0|        }
  607|      1|        uprv_free(hash->elements);
  ------------------
  |  | 1503|      1|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  608|      1|        hash->elements = nullptr;
  609|      1|    }
  610|      1|    if (hash->allocated) {
  ------------------
  |  Branch (610:9): [True: 0, False: 1]
  ------------------
  611|      0|        uprv_free(hash);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  612|      0|    }
  613|      1|}
uhash_setKeyDeleter_78:
  636|      1|uhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn) {
  637|      1|    UObjectDeleter *result = hash->keyDeleter;
  638|      1|    hash->keyDeleter = fn;
  639|      1|    return result;
  640|      1|}
uhash_setValueDeleter_78:
  643|      2|uhash_setValueDeleter(UHashtable *hash, UObjectDeleter *fn) {
  644|      2|    UObjectDeleter *result = hash->valueDeleter;
  645|      2|    hash->valueDeleter = fn;
  646|      2|    return result;
  647|      2|}
uhash_count_78:
  659|  3.89k|uhash_count(const UHashtable *hash) {
  660|  3.89k|    return hash->count;
  661|  3.89k|}
uhash_get_78:
  665|   117k|          const void* key) {
  666|   117k|    UHashTok keyholder;
  667|   117k|    keyholder.pointer = (void*) key;
  668|   117k|    return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer;
  669|   117k|}
uhash_geti_78:
  681|  2.17k|           const void* key) {
  682|  2.17k|    UHashTok keyholder;
  683|  2.17k|    keyholder.pointer = (void*) key;
  684|  2.17k|    return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer;
  685|  2.17k|}
uhash_put_78:
  721|  4.17k|          UErrorCode *status) {
  722|  4.17k|    UHashTok keyholder, valueholder;
  723|  4.17k|    keyholder.pointer = key;
  724|  4.17k|    valueholder.pointer = value;
  725|  4.17k|    return _uhash_put(hash, keyholder, valueholder,
  726|  4.17k|                      HINT_KEY_POINTER | HINT_VALUE_POINTER,
  ------------------
  |  |  139|  4.17k|#define HINT_KEY_POINTER   (1)
  ------------------
                                    HINT_KEY_POINTER | HINT_VALUE_POINTER,
  ------------------
  |  |  140|  4.17k|#define HINT_VALUE_POINTER (2)
  ------------------
  727|  4.17k|                      status).pointer;
  728|  4.17k|}
uhash_puti_78:
  747|    992|           UErrorCode *status) {
  748|    992|    UHashTok keyholder, valueholder;
  749|    992|    keyholder.pointer = key;
  750|    992|    valueholder.integer = value;
  751|    992|    return _uhash_put(hash, keyholder, valueholder,
  752|    992|                      HINT_KEY_POINTER,
  ------------------
  |  |  139|    992|#define HINT_KEY_POINTER   (1)
  ------------------
  753|    992|                      status).integer;
  754|    992|}
uhash_find_78:
  866|  3.89k|uhash_find(const UHashtable *hash, const void* key) {
  867|  3.89k|    UHashTok keyholder;
  868|  3.89k|    const UHashElement *e;
  869|  3.89k|    keyholder.pointer = (void*) key;
  870|  3.89k|    e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder));
  871|  3.89k|    return IS_EMPTY_OR_DELETED(e->hashcode) ? nullptr : e;
  ------------------
  |  |  120|  3.89k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  |  |  ------------------
  |  |  |  Branch (120:32): [True: 516, False: 3.37k]
  |  |  ------------------
  ------------------
  872|  3.89k|}
uhash_hashUChars_78:
  932|  2.10k|uhash_hashUChars(const UHashTok key) {
  933|  2.10k|    const char16_t *s = (const char16_t *)key.pointer;
  934|  2.10k|    return s == nullptr ? 0 : ustr_hashUCharsN(s, u_strlen(s));
  ------------------
  |  | 1880|  2.10k|#define ustr_hashUCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashUCharsN)
  |  |  ------------------
  |  |  |  |  123|  2.10k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.10k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.10k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return s == nullptr ? 0 : ustr_hashUCharsN(s, u_strlen(s));
  ------------------
  |  |  393|  2.10k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|  2.10k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.10k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.10k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (934:12): [True: 0, False: 2.10k]
  ------------------
  935|  2.10k|}
uhash_hashChars_78:
  938|   238k|uhash_hashChars(const UHashTok key) {
  939|   238k|    const char *s = (const char *)key.pointer;
  940|   238k|    return s == nullptr ? 0 : static_cast<int32_t>(ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s))));
  ------------------
  |  | 1878|   184k|#define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN)
  |  |  ------------------
  |  |  |  |  123|   184k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   184k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   184k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return s == nullptr ? 0 : static_cast<int32_t>(ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s))));
  ------------------
  |  |   37|   184k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   184k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (940:12): [True: 54.3k, False: 184k]
  ------------------
  941|   238k|}
uhash_compareUChars_78:
 1012|    476|uhash_compareUChars(const UHashTok key1, const UHashTok key2) {
 1013|    476|    const char16_t *p1 = (const char16_t*) key1.pointer;
 1014|    476|    const char16_t *p2 = (const char16_t*) key2.pointer;
 1015|    476|    if (p1 == p2) {
  ------------------
  |  Branch (1015:9): [True: 476, False: 0]
  ------------------
 1016|    476|        return true;
 1017|    476|    }
 1018|      0|    if (p1 == nullptr || p2 == nullptr) {
  ------------------
  |  Branch (1018:9): [True: 0, False: 0]
  |  Branch (1018:26): [True: 0, False: 0]
  ------------------
 1019|      0|        return false;
 1020|      0|    }
 1021|      0|    while (*p1 != 0 && *p1 == *p2) {
  ------------------
  |  Branch (1021:12): [True: 0, False: 0]
  |  Branch (1021:24): [True: 0, False: 0]
  ------------------
 1022|      0|        ++p1;
 1023|      0|        ++p2;
 1024|      0|    }
 1025|      0|    return *p1 == *p2;
 1026|      0|}
uhash_compareChars_78:
 1029|   219k|uhash_compareChars(const UHashTok key1, const UHashTok key2) {
 1030|   219k|    const char *p1 = (const char*) key1.pointer;
 1031|   219k|    const char *p2 = (const char*) key2.pointer;
 1032|   219k|    if (p1 == p2) {
  ------------------
  |  Branch (1032:9): [True: 51.8k, False: 167k]
  ------------------
 1033|  51.8k|        return true;
 1034|  51.8k|    }
 1035|   167k|    if (p1 == nullptr || p2 == nullptr) {
  ------------------
  |  Branch (1035:9): [True: 0, False: 167k]
  |  Branch (1035:26): [True: 0, False: 167k]
  ------------------
 1036|      0|        return false;
 1037|      0|    }
 1038|  1.64M|    while (*p1 != 0 && *p1 == *p2) {
  ------------------
  |  Branch (1038:12): [True: 1.48M, False: 167k]
  |  Branch (1038:24): [True: 1.48M, False: 0]
  ------------------
 1039|  1.48M|        ++p1;
 1040|  1.48M|        ++p2;
 1041|  1.48M|    }
 1042|   167k|    return *p1 == *p2;
 1043|   167k|}
uhash.cpp:_ZL13_uhash_createPFi8UElementEPFaS_S_ES3_iP10UErrorCode:
  287|     10|              UErrorCode *status) {
  288|     10|    UHashtable *result;
  289|       |
  290|     10|    if (U_FAILURE(*status)) return nullptr;
  ------------------
  |  Branch (290:9): [True: 0, False: 10]
  ------------------
  291|       |
  292|     10|    result = static_cast<UHashtable*>(uprv_malloc(sizeof(UHashtable)));
  ------------------
  |  | 1524|     10|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|     10|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     10|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     10|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  293|     10|    if (result == nullptr) {
  ------------------
  |  Branch (293:9): [True: 0, False: 10]
  ------------------
  294|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  295|      0|        return nullptr;
  296|      0|    }
  297|       |
  298|     10|    _uhash_init(result, keyHash, keyComp, valueComp, primeIndex, status);
  299|     10|    result->allocated       = true;
  300|       |
  301|     10|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (301:9): [True: 0, False: 10]
  ------------------
  302|      0|        uprv_free(result);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  303|      0|        return nullptr;
  304|      0|    }
  305|       |
  306|     10|    return result;
  307|     10|}
uhash.cpp:_ZL11_uhash_initP10UHashtablePFi8UElementEPFaS1_S1_ES5_iP10UErrorCode:
  260|     11|{
  261|     11|    if (U_FAILURE(*status)) return nullptr;
  ------------------
  |  Branch (261:9): [True: 0, False: 11]
  ------------------
  262|     11|    U_ASSERT(keyHash != nullptr);
  ------------------
  |  |   35|     11|#   define U_ASSERT(exp) (void)0
  ------------------
  263|     11|    U_ASSERT(keyComp != nullptr);
  ------------------
  |  |   35|     11|#   define U_ASSERT(exp) (void)0
  ------------------
  264|       |
  265|     11|    result->keyHasher       = keyHash;
  266|     11|    result->keyComparator   = keyComp;
  267|     11|    result->valueComparator = valueComp;
  268|     11|    result->keyDeleter      = nullptr;
  269|     11|    result->valueDeleter    = nullptr;
  270|     11|    result->allocated       = false;
  271|     11|    _uhash_internalSetResizePolicy(result, U_GROW);
  272|       |
  273|     11|    _uhash_allocate(result, primeIndex, status);
  274|       |
  275|     11|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (275:9): [True: 0, False: 11]
  ------------------
  276|      0|        return nullptr;
  277|      0|    }
  278|       |
  279|     11|    return result;
  280|     11|}
uhash.cpp:_ZL15_uhash_allocateP10UHashtableiP10UErrorCode:
  217|     35|                UErrorCode *status) {
  218|       |
  219|     35|    UHashElement *p, *limit;
  220|     35|    UHashTok emptytok;
  221|       |
  222|     35|    if (U_FAILURE(*status)) return;
  ------------------
  |  Branch (222:9): [True: 0, False: 35]
  ------------------
  223|       |
  224|     35|    U_ASSERT(primeIndex >= 0 && primeIndex < PRIMES_LENGTH);
  ------------------
  |  |   35|     35|#   define U_ASSERT(exp) (void)0
  ------------------
  225|       |
  226|     35|    hash->primeIndex = static_cast<int8_t>(primeIndex);
  227|     35|    hash->length = PRIMES[primeIndex];
  228|       |
  229|     35|    p = hash->elements = static_cast<UHashElement*>(
  230|     35|        uprv_malloc(sizeof(UHashElement) * hash->length));
  ------------------
  |  | 1524|     35|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|     35|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     35|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     35|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|       |
  232|     35|    if (hash->elements == nullptr) {
  ------------------
  |  Branch (232:9): [True: 0, False: 35]
  ------------------
  233|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  234|      0|        return;
  235|      0|    }
  236|       |
  237|     35|    emptytok.pointer = nullptr; /* Only one of these two is needed */
  238|     35|    emptytok.integer = 0;    /* but we don't know which one. */
  239|       |
  240|     35|    limit = p + hash->length;
  241|  30.9k|    while (p < limit) {
  ------------------
  |  Branch (241:12): [True: 30.8k, False: 35]
  ------------------
  242|  30.8k|        p->key = emptytok;
  243|  30.8k|        p->value = emptytok;
  244|  30.8k|        p->hashcode = HASH_EMPTY;
  ------------------
  |  |  118|  30.8k|#define HASH_EMPTY      ((int32_t) HASH_DELETED + 1)
  |  |  ------------------
  |  |  |  |  117|  30.8k|#define HASH_DELETED    ((int32_t) 0x80000000)
  |  |  ------------------
  ------------------
  245|  30.8k|        ++p;
  246|  30.8k|    }
  247|       |
  248|     35|    hash->count = 0;
  249|     35|    hash->lowWaterMark = static_cast<int32_t>(hash->length * hash->lowWaterRatio);
  250|     35|    hash->highWaterMark = static_cast<int32_t>(hash->length * hash->highWaterRatio);
  251|     35|}
uhash.cpp:_ZL30_uhash_internalSetResizePolicyP10UHashtable17UHashResizePolicy:
  197|     11|_uhash_internalSetResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) {
  198|     11|    U_ASSERT(hash != nullptr);
  ------------------
  |  |   35|     11|#   define U_ASSERT(exp) (void)0
  ------------------
  199|     11|    U_ASSERT(((int32_t)policy) >= 0);
  ------------------
  |  |   35|     11|#   define U_ASSERT(exp) (void)0
  ------------------
  200|     11|    U_ASSERT(((int32_t)policy) < 3);
  ------------------
  |  |   35|     11|#   define U_ASSERT(exp) (void)0
  ------------------
  201|     11|    hash->lowWaterRatio  = RESIZE_POLICY_RATIO_TABLE[policy * 2];
  202|     11|    hash->highWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2 + 1];
  203|     11|}
uhash.cpp:_ZL13_uhash_rehashP10UHashtableP10UErrorCode:
  399|     24|_uhash_rehash(UHashtable *hash, UErrorCode *status) {
  400|       |
  401|     24|    UHashElement *old = hash->elements;
  402|     24|    int32_t oldLength = hash->length;
  403|     24|    int32_t newPrimeIndex = hash->primeIndex;
  404|     24|    int32_t i;
  405|       |
  406|     24|    if (hash->count > hash->highWaterMark) {
  ------------------
  |  Branch (406:9): [True: 24, False: 0]
  ------------------
  407|     24|        if (++newPrimeIndex >= PRIMES_LENGTH) {
  ------------------
  |  |   90|     24|#define PRIMES_LENGTH UPRV_LENGTHOF(PRIMES)
  |  |  ------------------
  |  |  |  |   99|     24|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  |  |  ------------------
  ------------------
  |  Branch (407:13): [True: 0, False: 24]
  ------------------
  408|      0|            return;
  409|      0|        }
  410|     24|    } else if (hash->count < hash->lowWaterMark) {
  ------------------
  |  Branch (410:16): [True: 0, False: 0]
  ------------------
  411|      0|        if (--newPrimeIndex < 0) {
  ------------------
  |  Branch (411:13): [True: 0, False: 0]
  ------------------
  412|      0|            return;
  413|      0|        }
  414|      0|    } else {
  415|      0|        return;
  416|      0|    }
  417|       |
  418|     24|    _uhash_allocate(hash, newPrimeIndex, status);
  419|       |
  420|     24|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (420:9): [True: 0, False: 24]
  ------------------
  421|      0|        hash->elements = old;
  422|      0|        hash->length = oldLength;
  423|      0|        return;
  424|      0|    }
  425|       |
  426|  14.2k|    for (i = oldLength - 1; i >= 0; --i) {
  ------------------
  |  Branch (426:29): [True: 14.2k, False: 24]
  ------------------
  427|  14.2k|        if (!IS_EMPTY_OR_DELETED(old[i].hashcode)) {
  ------------------
  |  |  120|  14.2k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  ------------------
  |  Branch (427:13): [True: 7.13k, False: 7.11k]
  ------------------
  428|  7.13k|            UHashElement *e = _uhash_find(hash, old[i].key, old[i].hashcode);
  429|  7.13k|            U_ASSERT(e != nullptr);
  ------------------
  |  |   35|  7.13k|#   define U_ASSERT(exp) (void)0
  ------------------
  430|  7.13k|            U_ASSERT(e->hashcode == HASH_EMPTY);
  ------------------
  |  |   35|  7.13k|#   define U_ASSERT(exp) (void)0
  ------------------
  431|  7.13k|            e->key = old[i].key;
  432|  7.13k|            e->value = old[i].value;
  433|  7.13k|            e->hashcode = old[i].hashcode;
  434|  7.13k|            ++hash->count;
  435|  7.13k|        }
  436|  14.2k|    }
  437|       |
  438|     24|    uprv_free(old);
  ------------------
  |  | 1503|     24|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|     24|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     24|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     24|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  439|     24|}
uhash.cpp:_ZL11_uhash_findPK10UHashtable8UElementi:
  339|   135k|            int32_t hashcode) {
  340|       |
  341|   135k|    int32_t firstDeleted = -1;  /* assume invalid index */
  342|   135k|    int32_t theIndex, startIndex;
  343|   135k|    int32_t jump = 0; /* lazy evaluate */
  344|   135k|    int32_t tableHash;
  345|   135k|    UHashElement *elements = hash->elements;
  346|       |
  347|   135k|    hashcode &= 0x7FFFFFFF; /* must be positive */
  348|   135k|    startIndex = theIndex = (hashcode ^ 0x4000000) % hash->length;
  349|       |
  350|   166k|    do {
  351|   166k|        tableHash = elements[theIndex].hashcode;
  352|   166k|        if (tableHash == hashcode) {          /* quick check */
  ------------------
  |  Branch (352:13): [True: 113k, False: 52.4k]
  ------------------
  353|   113k|            if ((*hash->keyComparator)(key, elements[theIndex].key)) {
  ------------------
  |  Branch (353:17): [True: 113k, False: 0]
  ------------------
  354|   113k|                return &(elements[theIndex]);
  355|   113k|            }
  356|   113k|        } else if (!IS_EMPTY_OR_DELETED(tableHash)) {
  ------------------
  |  |  120|  52.4k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  ------------------
  |  Branch (356:20): [True: 30.7k, False: 21.7k]
  ------------------
  357|       |            /* We have hit a slot which contains a key-value pair,
  358|       |             * but for which the hash code does not match.  Keep
  359|       |             * looking.
  360|       |             */
  361|  30.7k|        } else if (tableHash == HASH_EMPTY) { /* empty, end o' the line */
  ------------------
  |  |  118|  21.7k|#define HASH_EMPTY      ((int32_t) HASH_DELETED + 1)
  |  |  ------------------
  |  |  |  |  117|  21.7k|#define HASH_DELETED    ((int32_t) 0x80000000)
  |  |  ------------------
  ------------------
  |  Branch (361:20): [True: 21.7k, False: 0]
  ------------------
  362|  21.7k|            break;
  363|  21.7k|        } else if (firstDeleted < 0) { /* remember first deleted */
  ------------------
  |  Branch (363:20): [True: 0, False: 0]
  ------------------
  364|      0|            firstDeleted = theIndex;
  365|      0|        }
  366|  30.7k|        if (jump == 0) { /* lazy compute jump */
  ------------------
  |  Branch (366:13): [True: 22.1k, False: 8.58k]
  ------------------
  367|       |            /* The jump value must be relatively prime to the table
  368|       |             * length.  As long as the length is prime, then any value
  369|       |             * 1..length-1 will be relatively prime to it.
  370|       |             */
  371|  22.1k|            jump = (hashcode % (hash->length - 1)) + 1;
  372|  22.1k|        }
  373|  30.7k|        theIndex = (theIndex + jump) % hash->length;
  374|  30.7k|    } while (theIndex != startIndex);
  ------------------
  |  Branch (374:14): [True: 30.7k, False: 0]
  ------------------
  375|       |
  376|  21.7k|    if (firstDeleted >= 0) {
  ------------------
  |  Branch (376:9): [True: 0, False: 21.7k]
  ------------------
  377|      0|        theIndex = firstDeleted; /* reset if had deleted slot */
  378|  21.7k|    } else if (tableHash != HASH_EMPTY) {
  ------------------
  |  |  118|  21.7k|#define HASH_EMPTY      ((int32_t) HASH_DELETED + 1)
  |  |  ------------------
  |  |  |  |  117|  21.7k|#define HASH_DELETED    ((int32_t) 0x80000000)
  |  |  ------------------
  ------------------
  |  Branch (378:16): [True: 0, False: 21.7k]
  ------------------
  379|       |        /* We get to this point if the hashtable is full (no empty or
  380|       |         * deleted slots), and we've failed to find a match.  THIS
  381|       |         * WILL NEVER HAPPEN as long as uhash_put() makes sure that
  382|       |         * count is always < length.
  383|       |         */
  384|      0|        UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  385|      0|    }
  386|  21.7k|    return &(elements[theIndex]);
  387|  21.7k|}
uhash.cpp:_ZL10_uhash_putP10UHashtable8UElementS1_aP10UErrorCode:
  471|  5.16k|           UErrorCode *status) {
  472|       |
  473|       |    /* Put finds the position in the table for the new value.  If the
  474|       |     * key is already in the table, it is deleted, if there is a
  475|       |     * non-nullptr keyDeleter.  Then the key, the hash and the value are
  476|       |     * all put at the position in their respective arrays.
  477|       |     */
  478|  5.16k|    int32_t hashcode;
  479|  5.16k|    UHashElement* e;
  480|  5.16k|    UHashTok emptytok;
  481|       |
  482|  5.16k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (482:9): [True: 0, False: 5.16k]
  ------------------
  483|      0|        goto err;
  484|      0|    }
  485|  5.16k|    U_ASSERT(hash != nullptr);
  ------------------
  |  |   35|  5.16k|#   define U_ASSERT(exp) (void)0
  ------------------
  486|  5.16k|    if ((hint & HINT_VALUE_POINTER) ?
  ------------------
  |  |  140|  5.16k|#define HINT_VALUE_POINTER (2)
  ------------------
  |  Branch (486:9): [True: 4.17k, False: 992]
  |  Branch (486:9): [True: 0, False: 5.16k]
  ------------------
  487|  4.17k|            value.pointer == nullptr :
  488|  5.16k|            value.integer == 0 && (hint & HINT_ALLOW_ZERO) == 0) {
  ------------------
  |  |  141|      0|#define HINT_ALLOW_ZERO    (4)
  ------------------
  |  Branch (488:13): [True: 0, False: 992]
  |  Branch (488:35): [True: 0, False: 0]
  ------------------
  489|       |        /* Disallow storage of nullptr values, since nullptr is returned by
  490|       |         * get() to indicate an absent key.  Storing nullptr == removing.
  491|       |         */
  492|      0|        return _uhash_remove(hash, key);
  493|      0|    }
  494|  5.16k|    if (hash->count > hash->highWaterMark) {
  ------------------
  |  Branch (494:9): [True: 24, False: 5.14k]
  ------------------
  495|     24|        _uhash_rehash(hash, status);
  496|     24|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (496:13): [True: 0, False: 24]
  ------------------
  497|      0|            goto err;
  498|      0|        }
  499|     24|    }
  500|       |
  501|  5.16k|    hashcode = (*hash->keyHasher)(key);
  502|  5.16k|    e = _uhash_find(hash, key, hashcode);
  503|  5.16k|    U_ASSERT(e != nullptr);
  ------------------
  |  |   35|  5.16k|#   define U_ASSERT(exp) (void)0
  ------------------
  504|       |
  505|  5.16k|    if (IS_EMPTY_OR_DELETED(e->hashcode)) {
  ------------------
  |  |  120|  5.16k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  |  |  ------------------
  |  |  |  Branch (120:32): [True: 5.16k, False: 0]
  |  |  ------------------
  ------------------
  506|       |        /* Important: We must never actually fill the table up.  If we
  507|       |         * do so, then _uhash_find() will return nullptr, and we'll have
  508|       |         * to check for nullptr after every call to _uhash_find().  To
  509|       |         * avoid this we make sure there is always at least one empty
  510|       |         * or deleted slot in the table.  This only is a problem if we
  511|       |         * are out of memory and rehash isn't working.
  512|       |         */
  513|  5.16k|        ++hash->count;
  514|  5.16k|        if (hash->count == hash->length) {
  ------------------
  |  Branch (514:13): [True: 0, False: 5.16k]
  ------------------
  515|       |            /* Don't allow count to reach length */
  516|      0|            --hash->count;
  517|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
  518|      0|            goto err;
  519|      0|        }
  520|  5.16k|    }
  521|       |
  522|       |    /* We must in all cases handle storage properly.  If there was an
  523|       |     * old key, then it must be deleted (if the deleter != nullptr).
  524|       |     * Make hashcodes stored in table positive.
  525|       |     */
  526|  5.16k|    return _uhash_setElement(hash, e, hashcode & 0x7FFFFFFF, key, value, hint);
  527|       |
  528|      0| err:
  529|       |    /* If the deleters are non-nullptr, this method adopts its key and/or
  530|       |     * value arguments, and we must be sure to delete the key and/or
  531|       |     * value in all cases, even upon failure.
  532|       |     */
  533|      0|    HASH_DELETE_KEY_VALUE(hash, key.pointer, value.pointer);
  ------------------
  |  |  124|      0|#define HASH_DELETE_KEY_VALUE(hash, keypointer, valuepointer) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  125|      0|    if (hash->keyDeleter != nullptr && keypointer != nullptr) { \
  |  |  ------------------
  |  |  |  Branch (125:9): [True: 0, False: 0]
  |  |  |  Branch (125:40): [True: 0, False: 0]
  |  |  ------------------
  |  |  126|      0|        (*hash->keyDeleter)(keypointer); \
  |  |  127|      0|    } \
  |  |  128|      0|    if (hash->valueDeleter != nullptr && valuepointer != nullptr) { \
  |  |  ------------------
  |  |  |  Branch (128:9): [True: 0, False: 0]
  |  |  |  Branch (128:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  129|      0|        (*hash->valueDeleter)(valuepointer); \
  |  |  130|      0|    } \
  |  |  131|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  534|      0|    emptytok.pointer = nullptr; emptytok.integer = 0;
  535|      0|    return emptytok;
  536|  5.16k|}
uhash.cpp:_ZL17_uhash_setElementP10UHashtableP12UHashElementi8UElementS3_a:
  150|  5.16k|                  UHashTok key, UHashTok value, int8_t hint) {
  151|       |
  152|  5.16k|    UHashTok oldValue = e->value;
  153|  5.16k|    if (hash->keyDeleter != nullptr && e->key.pointer != nullptr &&
  ------------------
  |  Branch (153:9): [True: 516, False: 4.65k]
  |  Branch (153:40): [True: 0, False: 516]
  ------------------
  154|  5.16k|        e->key.pointer != key.pointer) { /* Avoid double deletion */
  ------------------
  |  Branch (154:9): [True: 0, False: 0]
  ------------------
  155|      0|        (*hash->keyDeleter)(e->key.pointer);
  156|      0|    }
  157|  5.16k|    if (hash->valueDeleter != nullptr) {
  ------------------
  |  Branch (157:9): [True: 1, False: 5.16k]
  ------------------
  158|      1|        if (oldValue.pointer != nullptr &&
  ------------------
  |  Branch (158:13): [True: 0, False: 1]
  ------------------
  159|      1|            oldValue.pointer != value.pointer) { /* Avoid double deletion */
  ------------------
  |  Branch (159:13): [True: 0, False: 0]
  ------------------
  160|      0|            (*hash->valueDeleter)(oldValue.pointer);
  161|      0|        }
  162|      1|        oldValue.pointer = nullptr;
  163|      1|    }
  164|       |    /* Compilers should copy the UHashTok union correctly, but even if
  165|       |     * they do, memory heap tools (e.g. BoundsChecker) can get
  166|       |     * confused when a pointer is cloaked in a union and then copied.
  167|       |     * TO ALLEVIATE THIS, we use hints (based on what API the user is
  168|       |     * calling) to copy pointers when we know the user thinks
  169|       |     * something is a pointer. */
  170|  5.16k|    if (hint & HINT_KEY_POINTER) {
  ------------------
  |  |  139|  5.16k|#define HINT_KEY_POINTER   (1)
  ------------------
  |  Branch (170:9): [True: 5.16k, False: 0]
  ------------------
  171|  5.16k|        e->key.pointer = key.pointer;
  172|  5.16k|    } else {
  173|      0|        e->key = key;
  174|      0|    }
  175|  5.16k|    if (hint & HINT_VALUE_POINTER) {
  ------------------
  |  |  140|  5.16k|#define HINT_VALUE_POINTER (2)
  ------------------
  |  Branch (175:9): [True: 4.17k, False: 992]
  ------------------
  176|  4.17k|        e->value.pointer = value.pointer;
  177|  4.17k|    } else {
  178|    992|        e->value = value;
  179|    992|    }
  180|  5.16k|    e->hashcode = hashcode;
  181|  5.16k|    return oldValue;
  182|  5.16k|}

u_charsToUChars_78:
  185|  1.14k|u_charsToUChars(const char *cs, char16_t *us, int32_t length) {
  186|  1.14k|    char16_t u;
  187|  1.14k|    uint8_t c;
  188|       |
  189|       |    /*
  190|       |     * Allow the entire ASCII repertoire to be mapped _to_ Unicode.
  191|       |     * For EBCDIC systems, this works for characters with codes from
  192|       |     * codepages 37 and 1047 or compatible.
  193|       |     */
  194|  5.61k|    while(length>0) {
  ------------------
  |  Branch (194:11): [True: 4.47k, False: 1.14k]
  ------------------
  195|  4.47k|        c=(uint8_t)(*cs++);
  196|  4.47k|        u=(char16_t)CHAR_TO_UCHAR(c);
  ------------------
  |  |  174|  4.47k|#define CHAR_TO_UCHAR(c) c
  ------------------
  197|  4.47k|        U_ASSERT((u!=0 || c==0)); /* only invariant chars converted? */
  ------------------
  |  |   35|  4.47k|#   define U_ASSERT(exp) (void)0
  ------------------
  198|  4.47k|        *us++=u;
  199|  4.47k|        --length;
  200|  4.47k|    }
  201|  1.14k|}
u_UCharsToChars_78:
  204|  49.0k|u_UCharsToChars(const char16_t *us, char *cs, int32_t length) {
  205|  49.0k|    char16_t u;
  206|       |
  207|  6.11M|    while(length>0) {
  ------------------
  |  Branch (207:11): [True: 6.06M, False: 49.0k]
  ------------------
  208|  6.06M|        u=*us++;
  209|  6.06M|        if(!UCHAR_IS_INVARIANT(u)) {
  ------------------
  |  |  168|  6.06M|#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0)
  |  |  ------------------
  |  |  |  Branch (168:32): [True: 6.06M, False: 0]
  |  |  |  Branch (168:47): [True: 6.06M, False: 0]
  |  |  ------------------
  ------------------
  210|      0|            U_ASSERT(false); /* Variant characters were used. These are not portable in ICU. */
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  211|      0|            u=0;
  212|      0|        }
  213|  6.06M|        *cs++=(char)UCHAR_TO_CHAR(u);
  ------------------
  |  |  175|  6.06M|#define UCHAR_TO_CHAR(c) c
  ------------------
  214|  6.06M|        --length;
  215|  6.06M|    }
  216|  49.0k|}
uprv_isInvariantUString_78:
  263|  7.41k|uprv_isInvariantUString(const char16_t *s, int32_t length) {
  264|  7.41k|    char16_t c;
  265|       |
  266|  6.01M|    for(;;) {
  267|  6.01M|        if(length<0) {
  ------------------
  |  Branch (267:12): [True: 0, False: 6.01M]
  ------------------
  268|       |            /* NUL-terminated */
  269|      0|            c=*s++;
  270|      0|            if(c==0) {
  ------------------
  |  Branch (270:16): [True: 0, False: 0]
  ------------------
  271|      0|                break;
  272|      0|            }
  273|  6.01M|        } else {
  274|       |            /* count length */
  275|  6.01M|            if(length==0) {
  ------------------
  |  Branch (275:16): [True: 7.39k, False: 6.00M]
  ------------------
  276|  7.39k|                break;
  277|  7.39k|            }
  278|  6.00M|            --length;
  279|  6.00M|            c=*s++;
  280|  6.00M|        }
  281|       |
  282|       |        /*
  283|       |         * no assertions here because these functions are legitimately called
  284|       |         * for strings with variant characters
  285|       |         */
  286|  6.00M|        if(!UCHAR_IS_INVARIANT(c)) {
  ------------------
  |  |  168|  6.00M|#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0)
  |  |  ------------------
  |  |  |  Branch (168:32): [True: 6.00M, False: 18]
  |  |  |  Branch (168:47): [True: 6.00M, False: 2]
  |  |  ------------------
  ------------------
  287|     20|            return false; /* found a variant char */
  288|     20|        }
  289|  6.00M|    }
  290|  7.39k|    return true;
  291|  7.41k|}

locale_getKeywordsStart_78:
  526|   103k|locale_getKeywordsStart(std::string_view localeID) {
  527|   103k|    if (size_t pos = localeID.find('@'); pos != std::string_view::npos) {
  ------------------
  |  Branch (527:42): [True: 0, False: 103k]
  ------------------
  528|      0|        return localeID.data() + pos;
  529|      0|    }
  530|       |#if (U_CHARSET_FAMILY == U_EBCDIC_FAMILY)
  531|       |    else {
  532|       |        /* We do this because the @ sign is variant, and the @ sign used on one
  533|       |        EBCDIC machine won't be compiled the same way on other EBCDIC based
  534|       |        machines. */
  535|       |        static const uint8_t ebcdicSigns[] = { 0x7C, 0x44, 0x66, 0x80, 0xAC, 0xAE, 0xAF, 0xB5, 0xEC, 0xEF, 0x00 };
  536|       |        const uint8_t *charToFind = ebcdicSigns;
  537|       |        while(*charToFind) {
  538|       |            if (size_t pos = localeID.find(*charToFind); pos != std::string_view::npos) {
  539|       |                return localeID.data() + pos;
  540|       |            }
  541|       |            charToFind++;
  542|       |        }
  543|       |    }
  544|       |#endif
  545|   103k|    return nullptr;
  546|   103k|}
uloc_getKeywordValue_78:
  733|  9.33k|{
  734|  9.33k|    if (U_FAILURE(*status)) { return 0; }
  ------------------
  |  Branch (734:9): [True: 0, False: 9.33k]
  ------------------
  735|  9.33k|    if (keywordName == nullptr || *keywordName == '\0') {
  ------------------
  |  Branch (735:9): [True: 0, False: 9.33k]
  |  Branch (735:35): [True: 0, False: 9.33k]
  ------------------
  736|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
  737|      0|        return 0;
  738|      0|    }
  739|  9.33k|    return ByteSinkUtil::viaByteSinkToTerminatedChars(
  740|  9.33k|        buffer, bufferCapacity,
  741|  9.33k|        [&](ByteSink& sink, UErrorCode& status) {
  742|  9.33k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  743|  9.33k|        },
  744|  9.33k|        *status);
  745|  9.33k|}
_Z26ulocimp_getKeywordValue_78PKcNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEER10UErrorCode:
  751|  18.6k|{
  752|  18.6k|    return ByteSinkUtil::viaByteSinkToCharString(
  753|  18.6k|        [&](ByteSink& sink, UErrorCode& status) {
  754|  18.6k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  755|  18.6k|        },
  756|  18.6k|        status);
  757|  18.6k|}
_Z26ulocimp_getKeywordValue_78PKcNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
  764|  28.0k|{
  765|  28.0k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (765:9): [True: 0, False: 28.0k]
  ------------------
  766|       |
  767|  28.0k|    if (localeID == nullptr || keywordName.empty()) {
  ------------------
  |  Branch (767:9): [True: 0, False: 28.0k]
  |  Branch (767:32): [True: 0, False: 28.0k]
  ------------------
  768|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  769|      0|        return;
  770|      0|    }
  771|       |
  772|  28.0k|    const char* startSearchHere = nullptr;
  773|  28.0k|    const char* nextSeparator = nullptr;
  774|       |
  775|  28.0k|    CharString tempBuffer;
  776|  28.0k|    const char* tmpLocaleID;
  777|       |
  778|  28.0k|    CharString canonKeywordName = locale_canonKeywordName(keywordName, status);
  779|  28.0k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (779:9): [True: 0, False: 28.0k]
  ------------------
  780|      0|      return;
  781|      0|    }
  782|       |
  783|  28.0k|    if (localeID != nullptr && _hasBCP47Extension(localeID)) {
  ------------------
  |  Branch (783:9): [True: 28.0k, False: 0]
  |  Branch (783:32): [True: 0, False: 28.0k]
  ------------------
  784|      0|        tempBuffer = ulocimp_forLanguageTag(localeID, -1, nullptr, status);
  ------------------
  |  | 1198|      0|#define ulocimp_forLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_forLanguageTag)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  785|      0|        tmpLocaleID = U_SUCCESS(status) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeID;
  ------------------
  |  Branch (785:23): [True: 0, False: 0]
  |  Branch (785:44): [True: 0, False: 0]
  ------------------
  786|  28.0k|    } else {
  787|  28.0k|        tmpLocaleID=localeID;
  788|  28.0k|    }
  789|       |
  790|  28.0k|    startSearchHere = locale_getKeywordsStart(tmpLocaleID);
  ------------------
  |  |  138|  28.0k|#define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart)
  |  |  ------------------
  |  |  |  |  123|  28.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  28.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  28.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  791|  28.0k|    if(startSearchHere == nullptr) {
  ------------------
  |  Branch (791:8): [True: 28.0k, False: 0]
  ------------------
  792|       |        /* no keywords, return at once */
  793|  28.0k|        return;
  794|  28.0k|    }
  795|       |
  796|       |    /* find the first keyword */
  797|      0|    while(startSearchHere) {
  ------------------
  |  Branch (797:11): [True: 0, False: 0]
  ------------------
  798|      0|        const char* keyValueTail;
  799|       |
  800|      0|        startSearchHere++; /* skip @ or ; */
  801|      0|        nextSeparator = uprv_strchr(startSearchHere, '=');
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  802|      0|        if(!nextSeparator) {
  ------------------
  |  Branch (802:12): [True: 0, False: 0]
  ------------------
  803|      0|            status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */
  804|      0|            return;
  805|      0|        }
  806|       |        /* strip leading & trailing spaces (TC decided to tolerate these) */
  807|      0|        while(*startSearchHere == ' ') {
  ------------------
  |  Branch (807:15): [True: 0, False: 0]
  ------------------
  808|      0|            startSearchHere++;
  809|      0|        }
  810|      0|        keyValueTail = nextSeparator;
  811|      0|        while (keyValueTail > startSearchHere && *(keyValueTail-1) == ' ') {
  ------------------
  |  Branch (811:16): [True: 0, False: 0]
  |  Branch (811:50): [True: 0, False: 0]
  ------------------
  812|      0|            keyValueTail--;
  813|      0|        }
  814|       |        /* now keyValueTail points to first char after the keyName */
  815|       |        /* copy & normalize keyName from locale */
  816|      0|        if (startSearchHere == keyValueTail) {
  ------------------
  |  Branch (816:13): [True: 0, False: 0]
  ------------------
  817|      0|            status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */
  818|      0|            return;
  819|      0|        }
  820|      0|        CharString localeKeywordName;
  821|      0|        while (startSearchHere < keyValueTail) {
  ------------------
  |  Branch (821:16): [True: 0, False: 0]
  ------------------
  822|      0|          if (!UPRV_ISALPHANUM(*startSearchHere)) {
  ------------------
  |  Branch (822:15): [True: 0, False: 0]
  ------------------
  823|      0|            status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */
  824|      0|            return;
  825|      0|          }
  826|      0|          localeKeywordName.append(uprv_tolower(*startSearchHere++), status);
  ------------------
  |  |   68|      0|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|      0|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  827|      0|        }
  828|      0|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (828:13): [True: 0, False: 0]
  ------------------
  829|      0|            return;
  830|      0|        }
  831|       |
  832|      0|        startSearchHere = uprv_strchr(nextSeparator, ';');
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  833|       |
  834|      0|        if (canonKeywordName == localeKeywordName) {
  ------------------
  |  Branch (834:13): [True: 0, False: 0]
  ------------------
  835|       |             /* current entry matches the keyword. */
  836|      0|           nextSeparator++; /* skip '=' */
  837|       |            /* First strip leading & trailing spaces (TC decided to tolerate these) */
  838|      0|            while(*nextSeparator == ' ') {
  ------------------
  |  Branch (838:19): [True: 0, False: 0]
  ------------------
  839|      0|              nextSeparator++;
  840|      0|            }
  841|      0|            keyValueTail = (startSearchHere)? startSearchHere: nextSeparator + uprv_strlen(nextSeparator);
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (841:28): [True: 0, False: 0]
  ------------------
  842|      0|            while(keyValueTail > nextSeparator && *(keyValueTail-1) == ' ') {
  ------------------
  |  Branch (842:19): [True: 0, False: 0]
  |  Branch (842:51): [True: 0, False: 0]
  ------------------
  843|      0|              keyValueTail--;
  844|      0|            }
  845|       |            /* Now copy the value, but check well-formedness */
  846|      0|            if (nextSeparator == keyValueTail) {
  ------------------
  |  Branch (846:17): [True: 0, False: 0]
  ------------------
  847|      0|              status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value name in passed-in locale */
  848|      0|              return;
  849|      0|            }
  850|      0|            while (nextSeparator < keyValueTail) {
  ------------------
  |  Branch (850:20): [True: 0, False: 0]
  ------------------
  851|      0|              if (!UPRV_ISALPHANUM(*nextSeparator) && !UPRV_OK_VALUE_PUNCTUATION(*nextSeparator)) {
  ------------------
  |  Branch (851:19): [True: 0, False: 0]
  |  Branch (851:55): [True: 0, False: 0]
  ------------------
  852|      0|                status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */
  853|      0|                return;
  854|      0|              }
  855|       |              /* Should we lowercase value to return here? Tests expect as-is. */
  856|      0|              sink.Append(nextSeparator++, 1);
  857|      0|            }
  858|      0|            return;
  859|      0|        }
  860|      0|    }
  861|      0|}
_Z20ulocimp_getRegion_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 1475|  9.33k|ulocimp_getRegion(std::string_view localeID, UErrorCode& status) {
 1476|  9.33k|    return ByteSinkUtil::viaByteSinkToCharString(
 1477|  9.33k|        [&](ByteSink& sink, UErrorCode& status) {
 1478|  9.33k|            ulocimp_getSubtags(
 1479|  9.33k|                    localeID,
 1480|  9.33k|                    nullptr,
 1481|  9.33k|                    nullptr,
 1482|  9.33k|                    &sink,
 1483|  9.33k|                    nullptr,
 1484|  9.33k|                    nullptr,
 1485|  9.33k|                    status);
 1486|  9.33k|        },
 1487|  9.33k|        status);
 1488|  9.33k|}
_Z21ulocimp_getSubtags_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEEPN6icu_7810CharStringES6_S6_S6_PPKcR10UErrorCode:
 1514|   111k|        UErrorCode& status) {
 1515|   111k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1515:9): [True: 0, False: 111k]
  ------------------
 1516|       |
 1517|   111k|    std::optional<CharStringByteSink> languageSink;
 1518|   111k|    std::optional<CharStringByteSink> scriptSink;
 1519|   111k|    std::optional<CharStringByteSink> regionSink;
 1520|   111k|    std::optional<CharStringByteSink> variantSink;
 1521|       |
 1522|   111k|    if (language != nullptr) { languageSink.emplace(language); }
  ------------------
  |  Branch (1522:9): [True: 111k, False: 0]
  ------------------
 1523|   111k|    if (script != nullptr) { scriptSink.emplace(script); }
  ------------------
  |  Branch (1523:9): [True: 111k, False: 0]
  ------------------
 1524|   111k|    if (region != nullptr) { regionSink.emplace(region); }
  ------------------
  |  Branch (1524:9): [True: 99.8k, False: 11.9k]
  ------------------
 1525|   111k|    if (variant != nullptr) { variantSink.emplace(variant); }
  ------------------
  |  Branch (1525:9): [True: 74.8k, False: 36.8k]
  ------------------
 1526|       |
 1527|   111k|    ulocimp_getSubtags(
  ------------------
  |  | 1209|   111k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|   111k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   111k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   111k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1528|   111k|            localeID,
 1529|   111k|            languageSink.has_value() ? &*languageSink : nullptr,
  ------------------
  |  Branch (1529:13): [True: 111k, False: 0]
  ------------------
 1530|   111k|            scriptSink.has_value() ? &*scriptSink : nullptr,
  ------------------
  |  Branch (1530:13): [True: 111k, False: 0]
  ------------------
 1531|   111k|            regionSink.has_value() ? &*regionSink : nullptr,
  ------------------
  |  Branch (1531:13): [True: 99.8k, False: 11.9k]
  ------------------
 1532|   111k|            variantSink.has_value() ? &*variantSink : nullptr,
  ------------------
  |  Branch (1532:13): [True: 74.8k, False: 36.8k]
  ------------------
 1533|   111k|            pEnd,
 1534|   111k|            status);
 1535|   111k|}
_Z21ulocimp_getSubtags_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEEPN6icu_788ByteSinkES6_S6_S6_PPKcR10UErrorCode:
 1545|   146k|        UErrorCode& status) {
 1546|   146k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1546:9): [True: 0, False: 146k]
  ------------------
 1547|       |
 1548|   146k|    if (pEnd != nullptr) {
  ------------------
  |  Branch (1548:9): [True: 74.8k, False: 71.2k]
  ------------------
 1549|  74.8k|        *pEnd = localeID.data();
 1550|  74.8k|    } else if (language == nullptr &&
  ------------------
  |  Branch (1550:16): [True: 34.4k, False: 36.8k]
  ------------------
 1551|  71.2k|               script == nullptr &&
  ------------------
  |  Branch (1551:16): [True: 34.4k, False: 0]
  ------------------
 1552|  71.2k|               region == nullptr &&
  ------------------
  |  Branch (1552:16): [True: 25.0k, False: 9.33k]
  ------------------
 1553|  71.2k|               variant == nullptr) {
  ------------------
  |  Branch (1553:16): [True: 0, False: 25.0k]
  ------------------
 1554|      0|        return;
 1555|      0|    }
 1556|       |
 1557|   146k|    if (localeID.empty()) { return; }
  ------------------
  |  Branch (1557:9): [True: 0, False: 146k]
  ------------------
 1558|       |
 1559|   146k|    bool hasRegion = false;
 1560|       |
 1561|   146k|    {
 1562|   146k|        size_t len = _getLanguage(localeID, language, status);
 1563|   146k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1563:13): [True: 0, False: 146k]
  ------------------
 1564|   146k|        if (len > 0) {
  ------------------
  |  Branch (1564:13): [True: 146k, False: 0]
  ------------------
 1565|   146k|            localeID.remove_prefix(len);
 1566|   146k|        }
 1567|   146k|    }
 1568|       |
 1569|   146k|    if (pEnd != nullptr) {
  ------------------
  |  Branch (1569:9): [True: 74.8k, False: 71.2k]
  ------------------
 1570|  74.8k|        *pEnd = localeID.data();
 1571|  74.8k|    } else if (script == nullptr &&
  ------------------
  |  Branch (1571:16): [True: 34.4k, False: 36.8k]
  ------------------
 1572|  71.2k|               region == nullptr &&
  ------------------
  |  Branch (1572:16): [True: 25.0k, False: 9.33k]
  ------------------
 1573|  71.2k|               variant == nullptr) {
  ------------------
  |  Branch (1573:16): [True: 0, False: 25.0k]
  ------------------
 1574|      0|        return;
 1575|      0|    }
 1576|       |
 1577|   146k|    if (localeID.empty()) { return; }
  ------------------
  |  Branch (1577:9): [True: 17.4k, False: 128k]
  ------------------
 1578|       |
 1579|   128k|    if (_isIDSeparator(localeID.front())) {
  ------------------
  |  Branch (1579:9): [True: 128k, False: 0]
  ------------------
 1580|   128k|        std::string_view sub = localeID;
 1581|   128k|        sub.remove_prefix(1);
 1582|   128k|        size_t len = _getScript(sub, script);
 1583|   128k|        if (len > 0) {
  ------------------
  |  Branch (1583:13): [True: 37.1k, False: 91.5k]
  ------------------
 1584|  37.1k|            localeID.remove_prefix(len + 1);
 1585|  37.1k|            if (pEnd != nullptr) { *pEnd = localeID.data(); }
  ------------------
  |  Branch (1585:17): [True: 9.57k, False: 27.5k]
  ------------------
 1586|  37.1k|        }
 1587|   128k|    }
 1588|       |
 1589|   128k|    if ((region == nullptr && variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
  ------------------
  |  Branch (1589:10): [True: 37.0k, False: 91.6k]
  |  Branch (1589:31): [True: 11.9k, False: 25.0k]
  |  Branch (1589:53): [True: 11.9k, False: 0]
  |  Branch (1589:73): [True: 27.0k, False: 89.6k]
  ------------------
 1590|       |
 1591|  89.6k|    if (_isIDSeparator(localeID.front())) {
  ------------------
  |  Branch (1591:9): [True: 89.6k, False: 0]
  ------------------
 1592|  89.6k|        std::string_view sub = localeID;
 1593|  89.6k|        sub.remove_prefix(1);
 1594|  89.6k|        size_t len = _getRegion(sub, region);
 1595|  89.6k|        if (len > 0) {
  ------------------
  |  Branch (1595:13): [True: 89.6k, False: 0]
  ------------------
 1596|  89.6k|            hasRegion = true;
 1597|  89.6k|            localeID.remove_prefix(len + 1);
 1598|  89.6k|            if (pEnd != nullptr) { *pEnd = localeID.data(); }
  ------------------
  |  Branch (1598:17): [True: 56.7k, False: 32.9k]
  ------------------
 1599|  89.6k|        }
 1600|  89.6k|    }
 1601|       |
 1602|  89.6k|    if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
  ------------------
  |  Branch (1602:10): [True: 19.6k, False: 70.0k]
  |  Branch (1602:32): [True: 19.6k, False: 0]
  |  Branch (1602:52): [True: 69.4k, False: 590]
  ------------------
 1603|       |
 1604|    590|    bool hasVariant = false;
 1605|       |
 1606|    590|    if (_isIDSeparator(localeID.front()) && !_isBCP47Extension(localeID)) {
  ------------------
  |  Branch (1606:9): [True: 590, False: 0]
  |  Branch (1606:45): [True: 590, False: 0]
  ------------------
 1607|    590|        std::string_view sub = localeID;
 1608|       |        /* If there was no country ID, skip a possible extra IDSeparator */
 1609|    590|        size_t skip = !hasRegion && localeID.size() > 1 && _isIDSeparator(localeID[1]) ? 2 : 1;
  ------------------
  |  Branch (1609:23): [True: 0, False: 590]
  |  Branch (1609:37): [True: 0, False: 0]
  |  Branch (1609:60): [True: 0, False: 0]
  ------------------
 1610|    590|        sub.remove_prefix(skip);
 1611|    590|        size_t len = _getVariant(sub, localeID[0], variant, false, status);
 1612|    590|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1612:13): [True: 0, False: 590]
  ------------------
 1613|    590|        if (len > 0) {
  ------------------
  |  Branch (1613:13): [True: 590, False: 0]
  ------------------
 1614|    590|            hasVariant = true;
 1615|    590|            localeID.remove_prefix(skip + len);
 1616|    590|            if (pEnd != nullptr) { *pEnd = localeID.data(); }
  ------------------
  |  Branch (1616:17): [True: 428, False: 162]
  ------------------
 1617|    590|        }
 1618|    590|    }
 1619|       |
 1620|    590|    if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
  ------------------
  |  Branch (1620:10): [True: 0, False: 590]
  |  Branch (1620:32): [True: 0, False: 0]
  |  Branch (1620:52): [True: 590, False: 0]
  ------------------
 1621|       |
 1622|      0|    if (_isBCP47Extension(localeID)) {
  ------------------
  |  Branch (1622:9): [True: 0, False: 0]
  ------------------
 1623|      0|        localeID.remove_prefix(2);
 1624|      0|        constexpr char vaposix[] = "-va-posix";
 1625|      0|        constexpr size_t length = sizeof vaposix - 1;
 1626|      0|        for (size_t next;; localeID.remove_prefix(next)) {
 1627|      0|            next = localeID.find('-', 1);
 1628|      0|            if (next == std::string_view::npos) { break; }
  ------------------
  |  Branch (1628:17): [True: 0, False: 0]
  ------------------
 1629|      0|            next = localeID.find('-', next + 1);
 1630|      0|            bool finished = next == std::string_view::npos;
 1631|      0|            std::string_view sub = localeID;
 1632|      0|            if (!finished) { sub.remove_suffix(sub.length() - next); }
  ------------------
  |  Branch (1632:17): [True: 0, False: 0]
  ------------------
 1633|       |
 1634|      0|            if (sub.length() == length && uprv_strnicmp(sub.data(), vaposix, length) == 0) {
  ------------------
  |  | 1544|      0|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1634:17): [True: 0, False: 0]
  |  Branch (1634:43): [True: 0, False: 0]
  ------------------
 1635|      0|                if (variant != nullptr) {
  ------------------
  |  Branch (1635:21): [True: 0, False: 0]
  ------------------
 1636|      0|                    if (hasVariant) { variant->Append("_", 1); }
  ------------------
  |  Branch (1636:25): [True: 0, False: 0]
  ------------------
 1637|      0|                    constexpr char posix[] = "POSIX";
 1638|      0|                    variant->Append(posix, sizeof posix - 1);
 1639|      0|                }
 1640|      0|                if (pEnd != nullptr) { *pEnd = localeID.data() + length; }
  ------------------
  |  Branch (1640:21): [True: 0, False: 0]
  ------------------
 1641|      0|            }
 1642|       |
 1643|      0|            if (finished) { break; }
  ------------------
  |  Branch (1643:17): [True: 0, False: 0]
  ------------------
 1644|      0|        }
 1645|      0|    }
 1646|      0|}
_Z20ulocimp_getParent_78PKcR10UErrorCode:
 2001|    497|{
 2002|    497|    return ByteSinkUtil::viaByteSinkToCharString(
 2003|    497|        [&](ByteSink& sink, UErrorCode& status) {
 2004|    497|            ulocimp_getParent(localeID, sink, status);
 2005|    497|        },
 2006|    497|        err);
 2007|    497|}
_Z20ulocimp_getParent_78PKcRN6icu_788ByteSinkER10UErrorCode:
 2013|    497|{
 2014|    497|    if (U_FAILURE(err)) { return; }
  ------------------
  |  Branch (2014:9): [True: 0, False: 497]
  ------------------
 2015|       |
 2016|    497|    const char *lastUnderscore;
 2017|    497|    int32_t i;
 2018|       |
 2019|    497|    if (localeID == nullptr)
  ------------------
  |  Branch (2019:9): [True: 0, False: 497]
  ------------------
 2020|      0|        localeID = uloc_getDefault();
  ------------------
  |  | 1118|      0|#define uloc_getDefault U_ICU_ENTRY_POINT_RENAME(uloc_getDefault)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2021|       |
 2022|    497|    lastUnderscore=uprv_strrchr(localeID, '_');
  ------------------
  |  |   42|    497|#define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
  |  |  ------------------
  |  |  |  |  393|    497|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2023|    497|    if(lastUnderscore!=nullptr) {
  ------------------
  |  Branch (2023:8): [True: 420, False: 77]
  ------------------
 2024|    420|        i = static_cast<int32_t>(lastUnderscore - localeID);
 2025|    420|    } else {
 2026|     77|        i=0;
 2027|     77|    }
 2028|       |
 2029|    497|    if (i > 0) {
  ------------------
  |  Branch (2029:9): [True: 420, False: 77]
  ------------------
 2030|    420|        if (uprv_strnicmp(localeID, "und_", 4) == 0) {
  ------------------
  |  | 1544|    420|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|    420|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    420|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    420|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2030:13): [True: 0, False: 420]
  ------------------
 2031|      0|            localeID += 3;
 2032|      0|            i -= 3;
 2033|      0|        }
 2034|    420|        sink.Append(localeID, i);
 2035|    420|    }
 2036|    497|}
_Z18ulocimp_getName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 2159|  6.44k|{
 2160|  6.44k|    return ByteSinkUtil::viaByteSinkToCharString(
 2161|  6.44k|        [&](ByteSink& sink, UErrorCode& status) {
 2162|  6.44k|            ulocimp_getName(localeID, sink, status);
 2163|  6.44k|        },
 2164|  6.44k|        err);
 2165|  6.44k|}
_Z18ulocimp_getName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
 2171|  6.96k|{
 2172|  6.96k|    _canonicalize(localeID, sink, 0, err);
 2173|  6.96k|}
_Z22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 2195|  67.0k|{
 2196|  67.0k|    return ByteSinkUtil::viaByteSinkToCharString(
 2197|  67.0k|        [&](ByteSink& sink, UErrorCode& status) {
 2198|  67.0k|            ulocimp_getBaseName(localeID, sink, status);
 2199|  67.0k|        },
 2200|  67.0k|        err);
 2201|  67.0k|}
_Z22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
 2207|  67.0k|{
 2208|  67.0k|    _canonicalize(localeID, sink, _ULOC_STRIP_KEYWORDS, err);
  ------------------
  |  | 1785|  67.0k|#define _ULOC_STRIP_KEYWORDS 0x2
  ------------------
 2209|  67.0k|}
_Z23ulocimp_canonicalize_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 2231|      1|{
 2232|      1|    return ByteSinkUtil::viaByteSinkToCharString(
 2233|      1|        [&](ByteSink& sink, UErrorCode& status) {
 2234|      1|            ulocimp_canonicalize(localeID, sink, status);
 2235|      1|        },
 2236|      1|        err);
 2237|      1|}
_Z23ulocimp_canonicalize_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
 2243|    886|{
 2244|    886|    _canonicalize(localeID, sink, _ULOC_CANONICALIZE, err);
  ------------------
  |  | 1786|    886|#define _ULOC_CANONICALIZE   0x1
  ------------------
 2245|    886|}
uloc_getDefault_78:
 2336|   128k|{
 2337|   128k|    return locale_get_default();
  ------------------
  |  |  139|   128k|#define locale_get_default U_ICU_ENTRY_POINT_RENAME(locale_get_default)
  |  |  ------------------
  |  |  |  |  123|   128k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   128k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   128k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2338|   128k|}
uloc.cpp:_ZN12_GLOBAL__N_123locale_canonKeywordNameENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEER10UErrorCode:
  556|  28.0k|{
  557|  28.0k|  if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (557:7): [True: 0, False: 28.0k]
  ------------------
  558|  28.0k|  CharString result;
  559|       |
  560|   158k|  for (char c : keywordName) {
  ------------------
  |  Branch (560:15): [True: 158k, False: 28.0k]
  ------------------
  561|   158k|    if (!UPRV_ISALPHANUM(c)) {
  ------------------
  |  Branch (561:9): [True: 0, False: 158k]
  ------------------
  562|      0|      status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */
  563|      0|      return {};
  564|      0|    }
  565|   158k|    result.append(uprv_tolower(c), status);
  ------------------
  |  |   68|   158k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|   158k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|   158k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|   158k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|   158k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  566|   158k|  }
  567|  28.0k|  if (result.isEmpty()) {
  ------------------
  |  Branch (567:7): [True: 0, False: 28.0k]
  ------------------
  568|      0|    status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name */
  569|      0|    return {};
  570|      0|  }
  571|       |
  572|  28.0k|  return result;
  573|  28.0k|}
uloc.cpp:_ZN12_GLOBAL__N_118_hasBCP47ExtensionENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
  510|   102k|inline bool _hasBCP47Extension(std::string_view id) {
  511|   102k|    return id.find('@') == std::string_view::npos && getShortestSubtagLength(id) == 1;
  ------------------
  |  Branch (511:12): [True: 102k, False: 0]
  |  Branch (511:54): [True: 0, False: 102k]
  ------------------
  512|   102k|}
uloc.cpp:_ZN12_GLOBAL__N_123getShortestSubtagLengthENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
  485|   102k|int32_t getShortestSubtagLength(std::string_view localeID) {
  486|   102k|    int32_t localeIDLength = static_cast<int32_t>(localeID.length());
  487|   102k|    int32_t length = localeIDLength;
  488|   102k|    int32_t tmpLength = 0;
  489|   102k|    int32_t i;
  490|   102k|    bool reset = true;
  491|       |
  492|   638k|    for (i = 0; i < localeIDLength; i++) {
  ------------------
  |  Branch (492:17): [True: 535k, False: 102k]
  ------------------
  493|   535k|        if (localeID[i] != '_' && localeID[i] != '-') {
  ------------------
  |  Branch (493:13): [True: 445k, False: 90.1k]
  |  Branch (493:35): [True: 445k, False: 0]
  ------------------
  494|   445k|            if (reset) {
  ------------------
  |  Branch (494:17): [True: 193k, False: 252k]
  ------------------
  495|   193k|                tmpLength = 0;
  496|   193k|                reset = false;
  497|   193k|            }
  498|   445k|            tmpLength++;
  499|   445k|        } else {
  500|  90.1k|            if (tmpLength != 0 && tmpLength < length) {
  ------------------
  |  Branch (500:17): [True: 90.1k, False: 0]
  |  Branch (500:35): [True: 80.7k, False: 9.42k]
  ------------------
  501|  80.7k|                length = tmpLength;
  502|  80.7k|            }
  503|  90.1k|            reset = true;
  504|  90.1k|        }
  505|   535k|    }
  506|       |
  507|   102k|    return length;
  508|   102k|}
uloc.cpp:_ZN12_GLOBAL__N_115UPRV_ISALPHANUMEc:
  516|   158k|inline bool UPRV_ISALPHANUM(char c) { return uprv_isASCIILetter(c) || UPRV_ISDIGIT(c); }
  ------------------
  |  | 1514|   158k|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|   158k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   158k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   158k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (516:46): [True: 158k, False: 0]
  |  Branch (516:71): [True: 0, False: 0]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_110_findIndexEPKPKcS1_:
 1178|  24.9k|{
 1179|  24.9k|    const char* const* anchor = list;
 1180|  24.9k|    int32_t pass = 0;
 1181|       |
 1182|       |    /* Make two passes through two nullptr-terminated arrays at 'list' */
 1183|  26.0k|    while (pass++ < 2) {
  ------------------
  |  Branch (1183:12): [True: 25.5k, False: 523]
  ------------------
 1184|  7.25M|        while (*list) {
  ------------------
  |  Branch (1184:16): [True: 7.25M, False: 1.04k]
  ------------------
 1185|  7.25M|            if (uprv_strcmp(key, *list) == 0) {
  ------------------
  |  |   38|  7.25M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  7.25M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1185:17): [True: 24.4k, False: 7.23M]
  ------------------
 1186|  24.4k|                return static_cast<int16_t>(list - anchor);
 1187|  24.4k|            }
 1188|  7.23M|            list++;
 1189|  7.23M|        }
 1190|  1.04k|        ++list;     /* skip final nullptr *CWB*/
 1191|  1.04k|    }
 1192|    523|    return std::nullopt;
 1193|  24.9k|}
uloc.cpp:_ZN12_GLOBAL__N_112_getLanguageENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEPN6icu_788ByteSinkER10UErrorCode:
 1219|   146k|size_t _getLanguage(std::string_view localeID, ByteSink* sink, UErrorCode& status) {
 1220|   146k|    size_t skip = 0;
 1221|   146k|    if (localeID.size() == 4 && uprv_strnicmp(localeID.data(), "root", 4) == 0) {
  ------------------
  |  | 1544|      0|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1221:9): [True: 0, False: 146k]
  |  Branch (1221:33): [True: 0, False: 0]
  ------------------
 1222|      0|        skip = 4;
 1223|      0|        localeID.remove_prefix(skip);
 1224|   146k|    } else if (localeID.size() >= 3 && uprv_strnicmp(localeID.data(), "und", 3) == 0 &&
  ------------------
  |  | 1544|   135k|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|   135k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   135k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   135k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1224:16): [True: 135k, False: 10.6k]
  |  Branch (1224:40): [True: 0, False: 135k]
  ------------------
 1225|   146k|               (localeID.size() == 3 ||
  ------------------
  |  Branch (1225:17): [True: 0, False: 0]
  ------------------
 1226|      0|                localeID[3] == '-' ||
  ------------------
  |  Branch (1226:17): [True: 0, False: 0]
  ------------------
 1227|      0|                localeID[3] == '_' ||
  ------------------
  |  Branch (1227:17): [True: 0, False: 0]
  ------------------
 1228|      0|                localeID[3] == '@')) {
  ------------------
  |  Branch (1228:17): [True: 0, False: 0]
  ------------------
 1229|      0|        skip = 3;
 1230|      0|        localeID.remove_prefix(skip);
 1231|      0|    }
 1232|       |
 1233|   146k|    constexpr int32_t MAXLEN = ULOC_LANG_CAPACITY - 1;  // Minus NUL.
  ------------------
  |  |  251|   146k|#define ULOC_LANG_CAPACITY 12
  ------------------
 1234|       |
 1235|       |    /* if it starts with i- or x- then copy that prefix */
 1236|   146k|    size_t len = _isIDPrefix(localeID) ? 2 : 0;
  ------------------
  |  Branch (1236:18): [True: 0, False: 146k]
  ------------------
 1237|   480k|    while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) {
  ------------------
  |  Branch (1237:12): [True: 463k, False: 17.4k]
  |  Branch (1237:37): [True: 463k, False: 0]
  |  Branch (1237:70): [True: 334k, False: 128k]
  ------------------
 1238|   334k|        if (len == MAXLEN) {
  ------------------
  |  Branch (1238:13): [True: 0, False: 334k]
  ------------------
 1239|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
 1240|      0|            return 0;
 1241|      0|        }
 1242|   334k|        len++;
 1243|   334k|    }
 1244|       |
 1245|   146k|    if (sink == nullptr || len == 0) { return skip + len; }
  ------------------
  |  Branch (1245:9): [True: 34.4k, False: 111k]
  |  Branch (1245:28): [True: 0, False: 111k]
  ------------------
 1246|       |
 1247|   111k|    int32_t minCapacity = uprv_max(static_cast<int32_t>(len), 4);  // Minimum 3 letters plus NUL.
  ------------------
  |  | 1526|   111k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|   111k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   111k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   111k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1248|   111k|    char scratch[MAXLEN];
 1249|   111k|    int32_t capacity = 0;
 1250|   111k|    char* buffer = sink->GetAppendBuffer(
 1251|   111k|            minCapacity, minCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity);
  ------------------
  |  |   99|   111k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1252|       |
 1253|   368k|    for (size_t i = 0; i < len; ++i) {
  ------------------
  |  Branch (1253:24): [True: 257k, False: 111k]
  ------------------
 1254|   257k|        buffer[i] = uprv_tolower(localeID[i]);
  ------------------
  |  |   68|   257k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|   257k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|   257k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|   257k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|   257k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1255|   257k|    }
 1256|   111k|    if (localeID.size() >= 2 && _isIDSeparator(localeID[1])) {
  ------------------
  |  Branch (1256:9): [True: 111k, False: 0]
  |  Branch (1256:33): [True: 0, False: 111k]
  ------------------
 1257|      0|        buffer[1] = '-';
 1258|      0|    }
 1259|       |
 1260|   111k|    if (len == 3) {
  ------------------
  |  Branch (1260:9): [True: 24.4k, False: 87.2k]
  ------------------
 1261|       |        /* convert 3 character code to 2 character code if possible *CWB*/
 1262|  24.4k|        U_ASSERT(capacity >= 4);
  ------------------
  |  |   35|  24.4k|#   define U_ASSERT(exp) (void)0
  ------------------
 1263|  24.4k|        buffer[3] = '\0';
 1264|  24.4k|        std::optional<int16_t> offset = _findIndex(LANGUAGES_3, buffer);
 1265|  24.4k|        if (offset.has_value()) {
  ------------------
  |  Branch (1265:13): [True: 24.4k, False: 0]
  ------------------
 1266|  24.4k|            const char* const alias = LANGUAGES[*offset];
 1267|  24.4k|            sink->Append(alias, static_cast<int32_t>(uprv_strlen(alias)));
  ------------------
  |  |   37|  24.4k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  24.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1268|  24.4k|            return skip + len;
 1269|  24.4k|        }
 1270|  24.4k|    }
 1271|       |
 1272|  87.2k|    sink->Append(buffer, static_cast<int32_t>(len));
 1273|  87.2k|    return skip + len;
 1274|   111k|}
uloc.cpp:_ZN12_GLOBAL__N_111_isIDPrefixENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
 1152|   146k|inline bool _isIDPrefix(std::string_view s) {
 1153|   146k|    return s.size() >= 2 && _isPrefixLetter(s[0]) && _isIDSeparator(s[1]);
  ------------------
  |  Branch (1153:12): [True: 146k, False: 0]
  |  Branch (1153:29): [True: 2.69k, False: 143k]
  |  Branch (1153:54): [True: 0, False: 2.69k]
  ------------------
 1154|   146k|}
uloc.cpp:_ZN12_GLOBAL__N_115_isPrefixLetterEc:
 1148|   146k|inline bool _isPrefixLetter(char a) { return a == 'x' || a == 'X' || a == 'i' || a == 'I'; }
  ------------------
  |  Branch (1148:46): [True: 694, False: 145k]
  |  Branch (1148:58): [True: 0, False: 145k]
  |  Branch (1148:70): [True: 2.00k, False: 143k]
  |  Branch (1148:82): [True: 0, False: 143k]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_113_isTerminatorEc:
 1159|   985k|inline bool _isTerminator(char a) { return a == '.' || a == '@'; }
  ------------------
  |  Branch (1159:44): [True: 0, False: 985k]
  |  Branch (1159:56): [True: 0, False: 985k]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_110_getScriptENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEPN6icu_788ByteSinkE:
 1276|   128k|size_t _getScript(std::string_view localeID, ByteSink* sink) {
 1277|   128k|    constexpr int32_t LENGTH = 4;
 1278|       |
 1279|   128k|    size_t len = 0;
 1280|   458k|    while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len]) &&
  ------------------
  |  Branch (1280:12): [True: 341k, False: 117k]
  |  Branch (1280:37): [True: 341k, False: 0]
  |  Branch (1280:70): [True: 330k, False: 10.8k]
  ------------------
 1281|   458k|            uprv_isASCIILetter(localeID[len])) {
  ------------------
  |  | 1514|   330k|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|   330k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   330k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   330k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1281:13): [True: 330k, False: 651]
  ------------------
 1282|   330k|        if (len == LENGTH) { return 0; }
  ------------------
  |  Branch (1282:13): [True: 0, False: 330k]
  ------------------
 1283|   330k|        len++;
 1284|   330k|    }
 1285|   128k|    if (len != LENGTH) { return 0; }
  ------------------
  |  Branch (1285:9): [True: 91.5k, False: 37.1k]
  ------------------
 1286|       |
 1287|  37.1k|    if (sink == nullptr) { return len; }
  ------------------
  |  Branch (1287:9): [True: 14.2k, False: 22.8k]
  ------------------
 1288|       |
 1289|  22.8k|    char scratch[LENGTH];
 1290|  22.8k|    int32_t capacity = 0;
 1291|  22.8k|    char* buffer = sink->GetAppendBuffer(
 1292|  22.8k|            LENGTH, LENGTH, scratch, UPRV_LENGTHOF(scratch), &capacity);
  ------------------
  |  |   99|  22.8k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1293|       |
 1294|  22.8k|    buffer[0] = uprv_toupper(localeID[0]);
  ------------------
  |  | 1547|  22.8k|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|  22.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  22.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  22.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1295|  91.5k|    for (int32_t i = 1; i < LENGTH; ++i) {
  ------------------
  |  Branch (1295:25): [True: 68.6k, False: 22.8k]
  ------------------
 1296|  68.6k|        buffer[i] = uprv_tolower(localeID[i]);
  ------------------
  |  |   68|  68.6k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  68.6k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  68.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  68.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  68.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1297|  68.6k|    }
 1298|       |
 1299|  22.8k|    sink->Append(buffer, LENGTH);
 1300|  22.8k|    return len;
 1301|  37.1k|}
uloc.cpp:_ZN12_GLOBAL__N_110_getRegionENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEPN6icu_788ByteSinkE:
 1303|  89.6k|size_t _getRegion(std::string_view localeID, ByteSink* sink) {
 1304|  89.6k|    constexpr int32_t MINLEN = 2;
 1305|  89.6k|    constexpr int32_t MAXLEN = ULOC_COUNTRY_CAPACITY - 1;  // Minus NUL.
  ------------------
  |  |  258|  89.6k|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
 1306|       |
 1307|  89.6k|    size_t len = 0;
 1308|   269k|    while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) {
  ------------------
  |  Branch (1308:12): [True: 180k, False: 89.0k]
  |  Branch (1308:37): [True: 180k, False: 0]
  |  Branch (1308:70): [True: 179k, False: 640]
  ------------------
 1309|   179k|        if (len == MAXLEN) { return 0; }
  ------------------
  |  Branch (1309:13): [True: 0, False: 179k]
  ------------------
 1310|   179k|        len++;
 1311|   179k|    }
 1312|  89.6k|    if (len < MINLEN) { return 0; }
  ------------------
  |  Branch (1312:9): [True: 0, False: 89.6k]
  ------------------
 1313|       |
 1314|  89.6k|    if (sink == nullptr) { return len; }
  ------------------
  |  Branch (1314:9): [True: 13.2k, False: 76.3k]
  ------------------
 1315|       |
 1316|  76.3k|    char scratch[ULOC_COUNTRY_CAPACITY];
 1317|  76.3k|    int32_t capacity = 0;
 1318|  76.3k|    char* buffer = sink->GetAppendBuffer(
 1319|  76.3k|            ULOC_COUNTRY_CAPACITY,
  ------------------
  |  |  258|  76.3k|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
 1320|  76.3k|            ULOC_COUNTRY_CAPACITY,
  ------------------
  |  |  258|  76.3k|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
 1321|  76.3k|            scratch,
 1322|  76.3k|            UPRV_LENGTHOF(scratch),
  ------------------
  |  |   99|  76.3k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1323|  76.3k|            &capacity);
 1324|       |
 1325|   229k|    for (size_t i = 0; i < len; ++i) {
  ------------------
  |  Branch (1325:24): [True: 153k, False: 76.3k]
  ------------------
 1326|   153k|        buffer[i] = uprv_toupper(localeID[i]);
  ------------------
  |  | 1547|   153k|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|   153k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   153k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   153k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1327|   153k|    }
 1328|       |
 1329|  76.3k|    if (len == 3) {
  ------------------
  |  Branch (1329:9): [True: 523, False: 75.8k]
  ------------------
 1330|       |        /* convert 3 character code to 2 character code if possible *CWB*/
 1331|    523|        U_ASSERT(capacity >= 4);
  ------------------
  |  |   35|    523|#   define U_ASSERT(exp) (void)0
  ------------------
 1332|    523|        buffer[3] = '\0';
 1333|    523|        std::optional<int16_t> offset = _findIndex(COUNTRIES_3, buffer);
 1334|    523|        if (offset.has_value()) {
  ------------------
  |  Branch (1334:13): [True: 0, False: 523]
  ------------------
 1335|      0|            const char* const alias = COUNTRIES[*offset];
 1336|      0|            sink->Append(alias, static_cast<int32_t>(uprv_strlen(alias)));
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1337|      0|            return len;
 1338|      0|        }
 1339|    523|    }
 1340|       |
 1341|  76.3k|    sink->Append(buffer, static_cast<int32_t>(len));
 1342|  76.3k|    return len;
 1343|  76.3k|}
uloc.cpp:_ZN12_GLOBAL__N_117_isBCP47ExtensionENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
 1161|    590|inline bool _isBCP47Extension(std::string_view p) {
 1162|    590|    return p.size() >= 3 &&
  ------------------
  |  Branch (1162:12): [True: 590, False: 0]
  ------------------
 1163|    590|           p[0] == '-' &&
  ------------------
  |  Branch (1163:12): [True: 0, False: 590]
  ------------------
 1164|    590|           (p[1] == 't' || p[1] == 'T' ||
  ------------------
  |  Branch (1164:13): [True: 0, False: 0]
  |  Branch (1164:28): [True: 0, False: 0]
  ------------------
 1165|      0|            p[1] == 'u' || p[1] == 'U' ||
  ------------------
  |  Branch (1165:13): [True: 0, False: 0]
  |  Branch (1165:28): [True: 0, False: 0]
  ------------------
 1166|      0|            p[1] == 'x' || p[1] == 'X') &&
  ------------------
  |  Branch (1166:13): [True: 0, False: 0]
  |  Branch (1166:28): [True: 0, False: 0]
  ------------------
 1167|    590|           p[2] == '-';
  ------------------
  |  Branch (1167:12): [True: 0, False: 0]
  ------------------
 1168|    590|}
uloc.cpp:_ZN12_GLOBAL__N_111_getVariantENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEcPN6icu_788ByteSinkEbR10UErrorCode:
 1354|    590|            UErrorCode& status) {
 1355|    590|    if (U_FAILURE(status) || localeID.empty()) return 0;
  ------------------
  |  Branch (1355:9): [True: 0, False: 590]
  |  Branch (1355:30): [True: 0, False: 590]
  ------------------
 1356|       |
 1357|       |    // Reasonable upper limit for variants
 1358|       |    // There are no strict limitation of the syntax of variant in the legacy
 1359|       |    // locale format. If the locale is constructed from unicode_locale_id
 1360|       |    // as defined in UTS35, then we know each unicode_variant_subtag
 1361|       |    // could have max length of 8 ((alphanum{5,8} | digit alphanum{3})
 1362|       |    // 179 would allow 20 unicode_variant_subtag with sep in the
 1363|       |    // unicode_locale_id
 1364|       |    // 8*20 + 1*(20-1) = 179
 1365|    590|    constexpr int32_t MAX_VARIANTS_LENGTH = 179;
 1366|       |
 1367|       |    /* get one or more variant tags and separate them with '_' */
 1368|    590|    size_t index = 0;
 1369|    590|    if (_isIDSeparator(prev)) {
  ------------------
  |  Branch (1369:9): [True: 590, False: 0]
  ------------------
 1370|       |        /* get a variant string after a '-' or '_' */
 1371|    590|        for (std::string_view sub = localeID;;) {
 1372|    590|            size_t next = sub.find_first_of(".@_-");
 1373|       |            // For historical reasons, a trailing separator is included in the variant.
 1374|    590|            bool finished = next == std::string_view::npos || next + 1 == sub.length();
  ------------------
  |  Branch (1374:29): [True: 590, False: 0]
  |  Branch (1374:63): [True: 0, False: 0]
  ------------------
 1375|    590|            size_t limit = finished ? sub.length() : next;
  ------------------
  |  Branch (1375:28): [True: 590, False: 0]
  ------------------
 1376|    590|            index += limit;
 1377|    590|            if (index > MAX_VARIANTS_LENGTH) {
  ------------------
  |  Branch (1377:17): [True: 0, False: 590]
  ------------------
 1378|      0|                status = U_ILLEGAL_ARGUMENT_ERROR;
 1379|      0|                return 0;
 1380|      0|            }
 1381|       |
 1382|    590|            if (sink != nullptr) {
  ------------------
  |  Branch (1382:17): [True: 590, False: 0]
  ------------------
 1383|    590|                if (needSeparator) {
  ------------------
  |  Branch (1383:21): [True: 0, False: 590]
  ------------------
 1384|      0|                    sink->Append("_", 1);
 1385|    590|                } else {
 1386|    590|                    needSeparator = true;
 1387|    590|                }
 1388|       |
 1389|    590|                int32_t length = static_cast<int32_t>(limit);
 1390|    590|                int32_t minCapacity = uprv_min(length, MAX_VARIANTS_LENGTH);
  ------------------
  |  | 1529|    590|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|    590|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    590|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    590|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1391|    590|                char scratch[MAX_VARIANTS_LENGTH];
 1392|    590|                int32_t capacity = 0;
 1393|    590|                char* buffer = sink->GetAppendBuffer(
 1394|    590|                        minCapacity, minCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity);
  ------------------
  |  |   99|    590|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1395|       |
 1396|  3.54k|                for (size_t i = 0; i < limit; ++i) {
  ------------------
  |  Branch (1396:36): [True: 2.95k, False: 590]
  ------------------
 1397|  2.95k|                    buffer[i] = uprv_toupper(sub[i]);
  ------------------
  |  | 1547|  2.95k|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|  2.95k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.95k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.95k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1398|  2.95k|                }
 1399|    590|                sink->Append(buffer, length);
 1400|    590|            }
 1401|       |
 1402|    590|            if (finished) { return index; }
  ------------------
  |  Branch (1402:17): [True: 590, False: 0]
  ------------------
 1403|      0|            sub.remove_prefix(next);
 1404|      0|            if (_isTerminator(sub.front()) || _isBCP47Extension(sub)) { return index; }
  ------------------
  |  Branch (1404:17): [True: 0, False: 0]
  |  Branch (1404:47): [True: 0, False: 0]
  ------------------
 1405|      0|            sub.remove_prefix(1);
 1406|      0|            index++;
 1407|      0|        }
 1408|    590|    }
 1409|       |
 1410|      0|    size_t skip = 0;
 1411|       |    /* if there is no variant tag after a '-' or '_' then look for '@' */
 1412|      0|    if (prev == '@') {
  ------------------
  |  Branch (1412:9): [True: 0, False: 0]
  ------------------
 1413|       |        /* keep localeID */
 1414|      0|    } else if (const char* p = locale_getKeywordsStart(localeID); p != nullptr) {
  ------------------
  |  |  138|      0|#define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1414:67): [True: 0, False: 0]
  ------------------
 1415|      0|        skip = 1 + p - localeID.data(); /* point after the '@' */
 1416|      0|        localeID.remove_prefix(skip);
 1417|      0|    } else {
 1418|      0|        return 0;
 1419|      0|    }
 1420|      0|    for (; index < localeID.size() && !_isTerminator(localeID[index]); index++) {
  ------------------
  |  Branch (1420:12): [True: 0, False: 0]
  |  Branch (1420:39): [True: 0, False: 0]
  ------------------
 1421|      0|        if (index >= MAX_VARIANTS_LENGTH) { // same as length > MAX_VARIANTS_LENGTH
  ------------------
  |  Branch (1421:13): [True: 0, False: 0]
  ------------------
 1422|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
 1423|      0|            return 0;
 1424|      0|        }
 1425|      0|        if (needSeparator) {
  ------------------
  |  Branch (1425:13): [True: 0, False: 0]
  ------------------
 1426|      0|            if (sink != nullptr) {
  ------------------
  |  Branch (1426:17): [True: 0, False: 0]
  ------------------
 1427|      0|                sink->Append("_", 1);
 1428|      0|            }
 1429|      0|            needSeparator = false;
 1430|      0|        }
 1431|      0|        if (sink != nullptr) {
  ------------------
  |  Branch (1431:13): [True: 0, False: 0]
  ------------------
 1432|      0|            char c = uprv_toupper(localeID[index]);
  ------------------
  |  | 1547|      0|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1433|      0|            if (c == '-' || c == ',') c = '_';
  ------------------
  |  Branch (1433:17): [True: 0, False: 0]
  |  Branch (1433:29): [True: 0, False: 0]
  ------------------
 1434|      0|            sink->Append(&c, 1);
 1435|      0|        }
 1436|      0|    }
 1437|      0|    return skip + index;
 1438|      0|}
uloc.cpp:_ZN12_GLOBAL__N_113_canonicalizeENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEERN6icu_788ByteSinkEjR10UErrorCode:
 1806|  74.8k|              UErrorCode& err) {
 1807|  74.8k|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (1807:9): [True: 0, False: 74.8k]
  ------------------
 1808|      0|        return;
 1809|      0|    }
 1810|       |
 1811|  74.8k|    int32_t j, fieldCount=0;
 1812|  74.8k|    CharString tempBuffer;  // if localeID has a BCP47 extension, tmpLocaleID points to this
 1813|  74.8k|    CharString localeIDWithHyphens;  // if localeID has a BPC47 extension and have _, tmpLocaleID points to this
 1814|  74.8k|    std::string_view origLocaleID;
 1815|  74.8k|    std::string_view tmpLocaleID;
 1816|  74.8k|    size_t keywordAssign = std::string_view::npos;
 1817|  74.8k|    size_t separatorIndicator = std::string_view::npos;
 1818|       |
 1819|  74.8k|    if (_hasBCP47Extension(localeID)) {
  ------------------
  |  Branch (1819:9): [True: 0, False: 74.8k]
  ------------------
 1820|      0|        std::string_view localeIDPtr = localeID;
 1821|       |
 1822|       |        // convert all underbars to hyphens, unless the "BCP47 extension" comes at the beginning of the string
 1823|      0|        if (localeID.size() >= 2 && localeID.find('_') != std::string_view::npos && localeID[1] != '-' && localeID[1] != '_') {
  ------------------
  |  Branch (1823:13): [True: 0, False: 0]
  |  Branch (1823:37): [True: 0, False: 0]
  |  Branch (1823:85): [True: 0, False: 0]
  |  Branch (1823:107): [True: 0, False: 0]
  ------------------
 1824|      0|            localeIDWithHyphens.append(localeID, err);
 1825|      0|            if (U_SUCCESS(err)) {
  ------------------
  |  Branch (1825:17): [True: 0, False: 0]
  ------------------
 1826|      0|                for (char* p = localeIDWithHyphens.data(); *p != '\0'; ++p) {
  ------------------
  |  Branch (1826:60): [True: 0, False: 0]
  ------------------
 1827|      0|                    if (*p == '_') {
  ------------------
  |  Branch (1827:25): [True: 0, False: 0]
  ------------------
 1828|      0|                        *p = '-';
 1829|      0|                    }
 1830|      0|                }
 1831|      0|                localeIDPtr = localeIDWithHyphens.toStringPiece();
 1832|      0|            }
 1833|      0|        }
 1834|       |
 1835|      0|        tempBuffer = ulocimp_forLanguageTag(localeIDPtr.data(), static_cast<int32_t>(localeIDPtr.size()), nullptr, err);
  ------------------
  |  | 1198|      0|#define ulocimp_forLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_forLanguageTag)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1836|      0|        tmpLocaleID = U_SUCCESS(err) && !tempBuffer.isEmpty() ? static_cast<std::string_view>(tempBuffer.toStringPiece()) : localeIDPtr;
  ------------------
  |  Branch (1836:23): [True: 0, False: 0]
  |  Branch (1836:41): [True: 0, False: 0]
  ------------------
 1837|  74.8k|    } else {
 1838|  74.8k|        tmpLocaleID=localeID;
 1839|  74.8k|    }
 1840|       |
 1841|  74.8k|    origLocaleID=tmpLocaleID;
 1842|       |
 1843|       |    /* get all pieces, one after another, and separate with '_' */
 1844|  74.8k|    CharString tag;
 1845|  74.8k|    CharString script;
 1846|  74.8k|    CharString country;
 1847|  74.8k|    CharString variant;
 1848|  74.8k|    const char* end = nullptr;
 1849|  74.8k|    ulocimp_getSubtags(
  ------------------
  |  | 1209|  74.8k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  74.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  74.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  74.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1850|  74.8k|            tmpLocaleID,
 1851|  74.8k|            &tag,
 1852|  74.8k|            &script,
 1853|  74.8k|            &country,
 1854|  74.8k|            &variant,
 1855|  74.8k|            &end,
 1856|  74.8k|            err);
 1857|  74.8k|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (1857:9): [True: 0, False: 74.8k]
  ------------------
 1858|      0|        return;
 1859|      0|    }
 1860|  74.8k|    U_ASSERT(end != nullptr);
  ------------------
  |  |   35|  74.8k|#   define U_ASSERT(exp) (void)0
  ------------------
 1861|  74.8k|    if (end > tmpLocaleID.data()) {
  ------------------
  |  Branch (1861:9): [True: 74.8k, False: 0]
  ------------------
 1862|  74.8k|        tmpLocaleID.remove_prefix(end - tmpLocaleID.data());
 1863|  74.8k|    }
 1864|       |
 1865|  74.8k|    if (tag.length() == I_DEFAULT_LENGTH && origLocaleID.length() >= I_DEFAULT_LENGTH &&
  ------------------
  |  Branch (1865:9): [True: 0, False: 74.8k]
  |  Branch (1865:45): [True: 0, False: 0]
  ------------------
 1866|  74.8k|            uprv_strncmp(origLocaleID.data(), i_default, I_DEFAULT_LENGTH) == 0) {
  ------------------
  |  |   44|      0|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1866:13): [True: 0, False: 0]
  ------------------
 1867|      0|        tag.clear();
 1868|      0|        tag.append(uloc_getDefault(), err);
  ------------------
  |  | 1118|      0|#define uloc_getDefault U_ICU_ENTRY_POINT_RENAME(uloc_getDefault)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1869|  74.8k|    } else {
 1870|  74.8k|        if (!script.isEmpty()) {
  ------------------
  |  Branch (1870:13): [True: 9.57k, False: 65.2k]
  ------------------
 1871|  9.57k|            ++fieldCount;
 1872|  9.57k|            tag.append('_', err);
 1873|  9.57k|            tag.append(script, err);
 1874|  9.57k|        }
 1875|  74.8k|        if (!country.isEmpty()) {
  ------------------
  |  Branch (1875:13): [True: 56.7k, False: 18.1k]
  ------------------
 1876|  56.7k|            ++fieldCount;
 1877|  56.7k|            tag.append('_', err);
 1878|  56.7k|            tag.append(country, err);
 1879|  56.7k|        }
 1880|  74.8k|        if (!variant.isEmpty()) {
  ------------------
  |  Branch (1880:13): [True: 428, False: 74.4k]
  ------------------
 1881|    428|            ++fieldCount;
 1882|    428|            if (country.isEmpty()) {
  ------------------
  |  Branch (1882:17): [True: 0, False: 428]
  ------------------
 1883|      0|                tag.append('_', err);
 1884|      0|            }
 1885|    428|            tag.append('_', err);
 1886|    428|            tag.append(variant, err);
 1887|    428|        }
 1888|  74.8k|    }
 1889|       |
 1890|       |    /* Copy POSIX-style charset specifier, if any [mr.utf8] */
 1891|  74.8k|    if (!OPTION_SET(options, _ULOC_CANONICALIZE) && !tmpLocaleID.empty() && tmpLocaleID.front() == '.') {
  ------------------
  |  | 1786|  74.8k|#define _ULOC_CANONICALIZE   0x1
  ------------------
  |  Branch (1891:9): [True: 73.9k, False: 886]
  |  Branch (1891:53): [True: 0, False: 73.9k]
  |  Branch (1891:77): [True: 0, False: 0]
  ------------------
 1892|      0|        tag.append('.', err);
 1893|      0|        tmpLocaleID.remove_prefix(1);
 1894|      0|        size_t length;
 1895|      0|        if (size_t atPos = tmpLocaleID.find('@'); atPos != std::string_view::npos) {
  ------------------
  |  Branch (1895:51): [True: 0, False: 0]
  ------------------
 1896|      0|            length = atPos;
 1897|      0|        } else {
 1898|      0|            length = tmpLocaleID.length();
 1899|      0|        }
 1900|       |        // The longest charset name we found in IANA charset registry
 1901|       |        // https://www.iana.org/assignments/character-sets/ is
 1902|       |        // "Extended_UNIX_Code_Packed_Format_for_Japanese" in length 45.
 1903|       |        // we therefore restrict the length here to be 64 which is a power of 2
 1904|       |        // number that is longer than 45.
 1905|      0|        constexpr size_t kMaxCharsetLength = 64;
 1906|      0|        if (length > kMaxCharsetLength) {
  ------------------
  |  Branch (1906:13): [True: 0, False: 0]
  ------------------
 1907|      0|           err = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */
 1908|      0|           return;
 1909|      0|        }
 1910|      0|        if (length > 0) {
  ------------------
  |  Branch (1910:13): [True: 0, False: 0]
  ------------------
 1911|      0|            tag.append(tmpLocaleID.data(), static_cast<int32_t>(length), err);
 1912|      0|            tmpLocaleID.remove_prefix(length);
 1913|      0|        }
 1914|      0|    }
 1915|       |
 1916|       |    /* Scan ahead to next '@' and determine if it is followed by '=' and/or ';'
 1917|       |       After this, tmpLocaleID either starts at '@' or is empty. */
 1918|  74.8k|    if (const char* start = locale_getKeywordsStart(tmpLocaleID); start != nullptr) {
  ------------------
  |  |  138|  74.8k|#define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart)
  |  |  ------------------
  |  |  |  |  123|  74.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  74.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  74.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1918:67): [True: 0, False: 74.8k]
  ------------------
 1919|      0|        if (start > tmpLocaleID.data()) {
  ------------------
  |  Branch (1919:13): [True: 0, False: 0]
  ------------------
 1920|      0|            tmpLocaleID.remove_prefix(start - tmpLocaleID.data());
 1921|      0|        }
 1922|      0|        keywordAssign = tmpLocaleID.find('=');
 1923|      0|        separatorIndicator = tmpLocaleID.find(';');
 1924|  74.8k|    } else {
 1925|  74.8k|        tmpLocaleID = {};
 1926|  74.8k|    }
 1927|       |
 1928|       |    /* Copy POSIX-style variant, if any [mr@FOO] */
 1929|  74.8k|    if (!OPTION_SET(options, _ULOC_CANONICALIZE) &&
  ------------------
  |  | 1786|  74.8k|#define _ULOC_CANONICALIZE   0x1
  ------------------
  |  Branch (1929:9): [True: 73.9k, False: 886]
  ------------------
 1930|  74.8k|        !tmpLocaleID.empty() && keywordAssign == std::string_view::npos) {
  ------------------
  |  Branch (1930:9): [True: 0, False: 73.9k]
  |  Branch (1930:33): [True: 0, False: 0]
  ------------------
 1931|      0|        tag.append(tmpLocaleID, err);
 1932|      0|        tmpLocaleID = {};
 1933|      0|    }
 1934|       |
 1935|  74.8k|    if (OPTION_SET(options, _ULOC_CANONICALIZE)) {
  ------------------
  |  | 1786|  74.8k|#define _ULOC_CANONICALIZE   0x1
  ------------------
  |  Branch (1935:9): [True: 886, False: 73.9k]
  ------------------
 1936|       |        /* Handle @FOO variant if @ is present and not followed by = */
 1937|    886|        if (!tmpLocaleID.empty() && keywordAssign == std::string_view::npos) {
  ------------------
  |  Branch (1937:13): [True: 0, False: 886]
  |  Branch (1937:37): [True: 0, False: 0]
  ------------------
 1938|       |            /* Add missing '_' if needed */
 1939|      0|            if (fieldCount < 2 || (fieldCount < 3 && !script.isEmpty())) {
  ------------------
  |  Branch (1939:17): [True: 0, False: 0]
  |  Branch (1939:36): [True: 0, False: 0]
  |  Branch (1939:54): [True: 0, False: 0]
  ------------------
 1940|      0|                do {
 1941|      0|                    tag.append('_', err);
 1942|      0|                    ++fieldCount;
 1943|      0|                } while(fieldCount<2);
  ------------------
  |  Branch (1943:25): [True: 0, False: 0]
  ------------------
 1944|      0|            }
 1945|       |
 1946|      0|            CharStringByteSink s(&tag);
 1947|      0|            std::string_view sub = tmpLocaleID;
 1948|      0|            sub.remove_prefix(1);
 1949|      0|            _getVariant(sub, '@', &s, !variant.isEmpty(), err);
 1950|      0|            if (U_FAILURE(err)) { return; }
  ------------------
  |  Branch (1950:17): [True: 0, False: 0]
  ------------------
 1951|      0|        }
 1952|       |
 1953|       |        /* Look up the ID in the canonicalization map */
 1954|  9.74k|        for (j=0; j<UPRV_LENGTHOF(CANONICALIZE_MAP); j++) {
  ------------------
  |  |   99|  9.74k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1954:19): [True: 8.86k, False: 886]
  ------------------
 1955|  8.86k|            StringPiece id(CANONICALIZE_MAP[j].id);
 1956|  8.86k|            if (tag == id) {
  ------------------
  |  Branch (1956:17): [True: 0, False: 8.86k]
  ------------------
 1957|      0|                if (id.empty() && !tmpLocaleID.empty()) {
  ------------------
  |  Branch (1957:21): [True: 0, False: 0]
  |  Branch (1957:35): [True: 0, False: 0]
  ------------------
 1958|      0|                    break; /* Don't remap "" if keywords present */
 1959|      0|                }
 1960|      0|                tag.clear();
 1961|      0|                tag.append(CANONICALIZE_MAP[j].canonicalID, err);
 1962|      0|                break;
 1963|      0|            }
 1964|  8.86k|        }
 1965|    886|    }
 1966|       |
 1967|  74.8k|    sink.Append(tag.data(), tag.length());
 1968|       |
 1969|  74.8k|    if (!OPTION_SET(options, _ULOC_STRIP_KEYWORDS)) {
  ------------------
  |  | 1785|  74.8k|#define _ULOC_STRIP_KEYWORDS 0x2
  ------------------
  |  Branch (1969:9): [True: 7.84k, False: 67.0k]
  ------------------
 1970|  7.84k|        if (!tmpLocaleID.empty() && keywordAssign != std::string_view::npos &&
  ------------------
  |  Branch (1970:13): [True: 0, False: 7.84k]
  |  Branch (1970:37): [True: 0, False: 0]
  ------------------
 1971|  7.84k|            (separatorIndicator == std::string_view::npos || separatorIndicator > keywordAssign)) {
  ------------------
  |  Branch (1971:14): [True: 0, False: 0]
  |  Branch (1971:62): [True: 0, False: 0]
  ------------------
 1972|      0|            sink.Append("@", 1);
 1973|      0|            ++fieldCount;
 1974|      0|            tmpLocaleID.remove_prefix(1);
 1975|      0|            ulocimp_getKeywords(tmpLocaleID, '@', sink, true, err);
  ------------------
  |  | 1201|      0|#define ulocimp_getKeywords U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywords)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1976|      0|        }
 1977|  7.84k|    }
 1978|  74.8k|}
uloc.cpp:_ZN12_GLOBAL__N_110OPTION_SETEjj:
 1790|   299k|inline bool OPTION_SET(uint32_t options, uint32_t mask) { return (options & mask) != 0; }
uloc.cpp:_ZZ23uloc_getKeywordValue_78ENK3$_0clERN6icu_788ByteSinkER10UErrorCode:
  741|  9.33k|        [&](ByteSink& sink, UErrorCode& status) {
  742|  9.33k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  ------------------
  |  | 1200|  9.33k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  743|  9.33k|        },
uloc.cpp:_ZZ26ulocimp_getKeywordValue_78PKcNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES7_:
  753|  18.6k|        [&](ByteSink& sink, UErrorCode& status) {
  754|  18.6k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  ------------------
  |  | 1200|  18.6k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  18.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  18.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  18.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  755|  18.6k|        },
uloc.cpp:_ZZ20ulocimp_getRegion_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 1477|  9.33k|        [&](ByteSink& sink, UErrorCode& status) {
 1478|  9.33k|            ulocimp_getSubtags(
  ------------------
  |  | 1209|  9.33k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1479|  9.33k|                    localeID,
 1480|  9.33k|                    nullptr,
 1481|  9.33k|                    nullptr,
 1482|  9.33k|                    &sink,
 1483|  9.33k|                    nullptr,
 1484|  9.33k|                    nullptr,
 1485|  9.33k|                    status);
 1486|  9.33k|        },
uloc.cpp:_ZZ20ulocimp_getParent_78PKcR10UErrorCodeENK3$_0clERN6icu_788ByteSinkES2_:
 2003|    497|        [&](ByteSink& sink, UErrorCode& status) {
 2004|    497|            ulocimp_getParent(localeID, sink, status);
  ------------------
  |  | 1205|    497|#define ulocimp_getParent U_ICU_ENTRY_POINT_RENAME(ulocimp_getParent)
  |  |  ------------------
  |  |  |  |  123|    497|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    497|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    497|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2005|    497|        },
uloc.cpp:_ZZ18ulocimp_getName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 2161|  6.44k|        [&](ByteSink& sink, UErrorCode& status) {
 2162|  6.44k|            ulocimp_getName(localeID, sink, status);
  ------------------
  |  | 1204|  6.44k|#define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2163|  6.44k|        },
uloc.cpp:_ZZ22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 2197|  67.0k|        [&](ByteSink& sink, UErrorCode& status) {
 2198|  67.0k|            ulocimp_getBaseName(localeID, sink, status);
  ------------------
  |  | 1199|  67.0k|#define ulocimp_getBaseName U_ICU_ENTRY_POINT_RENAME(ulocimp_getBaseName)
  |  |  ------------------
  |  |  |  |  123|  67.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  67.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  67.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2199|  67.0k|        },
uloc.cpp:_ZZ23ulocimp_canonicalize_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 2233|      1|        [&](ByteSink& sink, UErrorCode& status) {
 2234|      1|            ulocimp_canonicalize(localeID, sink, status);
  ------------------
  |  | 1197|      1|#define ulocimp_canonicalize U_ICU_ENTRY_POINT_RENAME(ulocimp_canonicalize)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2235|      1|        },

uloc.cpp:_ZN12_GLOBAL__N_114_isIDSeparatorEc:
   49|  1.31M|inline bool _isIDSeparator(char a) { return a == '_' || a == '-'; }
  ------------------
  |  Branch (49:45): [True: 359k, False: 959k]
  |  Branch (49:57): [True: 0, False: 959k]
  ------------------

uprv_max_78:
   17|   128k|{
   18|   128k|    return (x > y ? x : y);
  ------------------
  |  Branch (18:13): [True: 13.5k, False: 115k]
  ------------------
   19|   128k|}
uprv_min_78:
   23|  8.49k|{
   24|  8.49k|    return (x > y ? y : x);
  ------------------
  |  Branch (24:13): [True: 5.18k, False: 3.30k]
  ------------------
   25|  8.49k|}

_ZN6icu_786UMutex8getMutexEv:
   80|      4|std::mutex *UMutex::getMutex() {
   81|      4|    std::mutex *retPtr = fMutex.load(std::memory_order_acquire);
   82|      4|    if (retPtr == nullptr) {
  ------------------
  |  Branch (82:9): [True: 4, False: 0]
  ------------------
   83|      4|        std::call_once(*pInitFlag, umtx_init);
   84|      4|        std::lock_guard<std::mutex> guard(*initMutex);
   85|      4|        retPtr = fMutex.load(std::memory_order_acquire);
   86|      4|        if (retPtr == nullptr) {
  ------------------
  |  Branch (86:13): [True: 4, False: 0]
  ------------------
   87|      4|            fMutex = new(fStorage) std::mutex();
   88|      4|            retPtr = fMutex;
   89|      4|            fListLink = gListHead;
   90|      4|            gListHead = this;
   91|      4|        }
   92|      4|    }
   93|      4|    U_ASSERT(retPtr != nullptr);
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
   94|      4|    return retPtr;
   95|      4|}
umtx_lock_78:
  112|   701k|umtx_lock(UMutex *mutex) {
  113|   701k|    if (mutex == nullptr) {
  ------------------
  |  Branch (113:9): [True: 13.2k, False: 688k]
  ------------------
  114|  13.2k|        mutex = &globalMutex;
  115|  13.2k|    }
  116|   701k|    mutex->lock();
  117|   701k|}
umtx_unlock_78:
  122|   701k|{
  123|   701k|    if (mutex == nullptr) {
  ------------------
  |  Branch (123:9): [True: 13.2k, False: 688k]
  ------------------
  124|  13.2k|        mutex = &globalMutex;
  125|  13.2k|    }
  126|   701k|    mutex->unlock();
  127|   701k|}
_ZN6icu_7820umtx_initImplPreInitERNS_9UInitOnceE:
  145|      9|umtx_initImplPreInit(UInitOnce &uio) {
  146|      9|    std::call_once(*pInitFlag, umtx_init);
  147|      9|    std::unique_lock<std::mutex> lock(*initMutex);
  148|      9|    if (umtx_loadAcquire(uio.fState) == 0) {
  ------------------
  |  Branch (148:9): [True: 9, False: 0]
  ------------------
  149|      9|        umtx_storeRelease(uio.fState, 1);
  150|      9|        return true;      // Caller will next call the init function.
  151|      9|    } else {
  152|      0|        while (umtx_loadAcquire(uio.fState) == 1) {
  ------------------
  |  Branch (152:16): [True: 0, False: 0]
  ------------------
  153|       |            // Another thread is currently running the initialization.
  154|       |            // Wait until it completes.
  155|      0|            initCondition->wait(lock);
  156|      0|        }
  157|      0|        U_ASSERT(uio.fState == 2);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  158|      0|        return false;
  159|      0|    }
  160|      9|}
_ZN6icu_7821umtx_initImplPostInitERNS_9UInitOnceE:
  170|      9|umtx_initImplPostInit(UInitOnce &uio) {
  171|      9|    {
  172|      9|        std::unique_lock<std::mutex> lock(*initMutex);
  173|      9|        umtx_storeRelease(uio.fState, 2);
  174|      9|    }
  175|      9|    initCondition->notify_all();
  176|      9|}
umutex.cpp:_ZN6icu_78L9umtx_initEv:
   72|      1|static void U_CALLCONV umtx_init() {
   73|      1|    initMutex = STATIC_NEW(std::mutex);
  ------------------
  |  |  144|      1|#define STATIC_NEW(type) [] () { \
  |  |  145|      1|    alignas(type) static char storage[sizeof(type)]; \
  |  |  146|      1|    return new(storage) type();} ()
  ------------------
   74|      1|    initCondition = STATIC_NEW(std::condition_variable);
  ------------------
  |  |  144|      1|#define STATIC_NEW(type) [] () { \
  |  |  145|      1|    alignas(type) static char storage[sizeof(type)]; \
  |  |  146|      1|    return new(storage) type();} ()
  ------------------
   75|      1|    ucln_common_registerCleanup(UCLN_COMMON_MUTEX, umtx_cleanup);
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   76|      1|}

_ZN6icu_7817umtx_storeReleaseERNSt3__16atomicIiEEi:
   79|     19|inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) {
   80|     19|    var.store(val, std::memory_order_release);
   81|     19|}
_ZN6icu_7816umtx_loadAcquireERNSt3__16atomicIiEE:
   75|   134k|inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) {
   76|   134k|    return var.load(std::memory_order_acquire);
   77|   134k|}
_ZN6icu_7815umtx_atomic_incEPNSt3__16atomicIiEE:
   83|  30.7k|inline int32_t umtx_atomic_inc(u_atomic_int32_t *var) {
   84|  30.7k|    return var->fetch_add(1) + 1;
   85|  30.7k|}
_ZN6icu_786UMutex4lockEv:
  229|   701k|    void lock() {
  230|   701k|        std::mutex *m = fMutex.load(std::memory_order_acquire);
  231|   701k|        if (m == nullptr) { m = getMutex(); }
  ------------------
  |  Branch (231:13): [True: 4, False: 701k]
  ------------------
  232|   701k|        m->lock();
  233|   701k|    }
_ZN6icu_786UMutex6unlockEv:
  234|   701k|    void unlock() { fMutex.load(std::memory_order_relaxed)->unlock(); }
_ZN6icu_7815umtx_atomic_decEPNSt3__16atomicIiEE:
   87|  23.3k|inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) {
   88|  23.3k|    return var->fetch_sub(1) - 1;
   89|  23.3k|}
_ZN6icu_7813umtx_initOnceERNS_9UInitOnceEPFvvE:
  123|  7.09k|inline void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)()) {
  124|  7.09k|    if (umtx_loadAcquire(uio.fState) == 2) {
  ------------------
  |  Branch (124:9): [True: 7.09k, False: 2]
  ------------------
  125|  7.09k|        return;
  126|  7.09k|    }
  127|      2|    if (umtx_initImplPreInit(uio)) {
  ------------------
  |  Branch (127:9): [True: 2, False: 0]
  ------------------
  128|      2|        (*fp)();
  129|      2|        umtx_initImplPostInit(uio);
  130|      2|    }
  131|      2|}
_ZN6icu_7813umtx_initOnceERNS_9UInitOnceEPFvR10UErrorCodeES3_:
  135|  95.2k|inline void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(UErrorCode &), UErrorCode &errCode) {
  136|  95.2k|    if (U_FAILURE(errCode)) {
  ------------------
  |  Branch (136:9): [True: 1, False: 95.2k]
  ------------------
  137|      1|        return;
  138|      1|    }
  139|  95.2k|    if (umtx_loadAcquire(uio.fState) != 2 && umtx_initImplPreInit(uio)) {
  ------------------
  |  Branch (139:9): [True: 7, False: 95.2k]
  |  Branch (139:46): [True: 7, False: 0]
  ------------------
  140|       |        // We run the initialization.
  141|      7|        (*fp)(errCode);
  142|      7|        uio.fErrCode = errCode;
  143|      7|        umtx_initImplPostInit(uio);
  144|  95.2k|    } else {
  145|       |        // Someone else already ran the initialization.
  146|  95.2k|        if (U_FAILURE(uio.fErrCode)) {
  ------------------
  |  Branch (146:13): [True: 0, False: 95.2k]
  ------------------
  147|      0|            errCode = uio.fErrCode;
  148|      0|        }
  149|  95.2k|    }
  150|  95.2k|}

_ZN6icu_788ByteSinkC2Ev:
   59|   535k|  ByteSink() { }
_ZNK6icu_7820CheckedArrayByteSink10OverflowedEv:
  240|  10.7k|  UBool Overflowed() const { return overflowed_; }
_ZNK6icu_7820CheckedArrayByteSink21NumberOfBytesAppendedEv:
  248|  35.8k|  int32_t NumberOfBytesAppended() const { return appended_; }

_ZN6icu_7814ConstChar16PtrC2EPKDs:
  229|   291k|ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p_(p) {}
_ZN6icu_7814ConstChar16PtrD2Ev:
  237|   291k|ConstChar16Ptr::~ConstChar16Ptr() {
  238|   291k|    U_ALIASING_BARRIER(p_);
  ------------------
  |  |   35|   291k|#   define U_ALIASING_BARRIER(ptr) asm volatile("" : : "rm"(ptr) : "memory")
  ------------------
  239|   291k|}
_ZNK6icu_7814ConstChar16PtrcvPKDsEv:
  205|   300k|    inline operator const char16_t *() const { return get(); }
_ZNK6icu_7814ConstChar16Ptr3getEv:
  241|   300k|const char16_t *ConstChar16Ptr::get() const { return p_; }
_ZN6icu_788internal15toU16StringViewENSt3__117basic_string_viewIDsNS1_11char_traitsIDsEEEE:
  400|  12.0k|inline std::u16string_view toU16StringView(std::u16string_view sv) { return sv; }
_ZN6icu_788internal23toU16StringViewNullableIPKDsvvEENSt3__117basic_string_viewIDsNS4_11char_traitsIDsEEEERKT_:
  441|  11.7k|inline std::u16string_view toU16StringViewNullable(const T& text) {
  442|  11.7k|    if (text == nullptr) return {};  // For backward compatibility.
  ------------------
  |  Branch (442:9): [True: 0, False: 11.7k]
  ------------------
  443|  11.7k|    return toU16StringView(text);
  444|  11.7k|}
_ZN6icu_788internal23toU16StringViewNullableIA9_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|     79|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|     79|    return toU16StringView(text);
  432|     79|}
_ZN6icu_788internal23toU16StringViewNullableIA4_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      3|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      3|    return toU16StringView(text);
  432|      3|}
_ZN6icu_788internal23toU16StringViewNullableIA2_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|     90|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|     90|    return toU16StringView(text);
  432|     90|}
_ZN6icu_788internal23toU16StringViewNullableIA10_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      3|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      3|    return toU16StringView(text);
  432|      3|}
_ZN6icu_788internal23toU16StringViewNullableIA16_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      3|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      3|    return toU16StringView(text);
  432|      3|}
_ZN6icu_788internal23toU16StringViewNullableIA14_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      3|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      3|    return toU16StringView(text);
  432|      3|}
_ZN6icu_788internal23toU16StringViewNullableIA13_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      3|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      3|    return toU16StringView(text);
  432|      3|}
_ZN6icu_788internal23toU16StringViewNullableIA11_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      4|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      4|    return toU16StringView(text);
  432|      4|}
_ZN6icu_788internal23toU16StringViewNullableIA12_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      2|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      2|    return toU16StringView(text);
  432|      2|}
_ZN6icu_788internal23toU16StringViewNullableIA8_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA18_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      4|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      4|    return toU16StringView(text);
  432|      4|}
_ZN6icu_788internal23toU16StringViewNullableIA20_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      5|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      5|    return toU16StringView(text);
  432|      5|}
_ZN6icu_788internal23toU16StringViewNullableIA28_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      2|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      2|    return toU16StringView(text);
  432|      2|}
_ZN6icu_788internal23toU16StringViewNullableIA24_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      3|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      3|    return toU16StringView(text);
  432|      3|}
_ZN6icu_788internal23toU16StringViewNullableIA22_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      2|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      2|    return toU16StringView(text);
  432|      2|}
_ZN6icu_788internal23toU16StringViewNullableIA19_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      2|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      2|    return toU16StringView(text);
  432|      2|}
_ZN6icu_788internal23toU16StringViewNullableIA17_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      6|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      6|    return toU16StringView(text);
  432|      6|}
_ZN6icu_788internal23toU16StringViewNullableIA23_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      2|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      2|    return toU16StringView(text);
  432|      2|}
_ZN6icu_788internal23toU16StringViewNullableIA27_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA25_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      2|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      2|    return toU16StringView(text);
  432|      2|}
_ZN6icu_788internal23toU16StringViewNullableIA26_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA6_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      4|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      4|    return toU16StringView(text);
  432|      4|}
_ZN6icu_788internal23toU16StringViewNullableIA21_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA15_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA5_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA3_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      9|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      9|    return toU16StringView(text);
  432|      9|}

_ZN6icu_789ErrorCodeC2Ev:
   90|    886|    ErrorCode() : errorCode(U_ZERO_ERROR) {}
_ZN6icu_789ErrorCodecvR10UErrorCodeEv:
   94|    886|    operator UErrorCode & () { return errorCode; }
_ZNK6icu_789ErrorCode9isFailureEv:
  100|    886|    UBool isFailure() const { return U_FAILURE(errorCode); }

_ZN6icu_7812LocalPointerIKNS_6number4impl14CompactHandlerEED2Ev:
  245|  9.45k|    ~LocalPointer() {
  246|  9.45k|        delete LocalPointerBase<T>::ptr;
  247|  9.45k|    }
_ZN6icu_7816LocalPointerBaseIKNS_6number4impl14CompactHandlerEED2Ev:
   88|  9.45k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerIKNS_6number4impl19LongNameMultiplexerEED2Ev:
  245|  9.45k|    ~LocalPointer() {
  246|  9.45k|        delete LocalPointerBase<T>::ptr;
  247|  9.45k|    }
_ZN6icu_7816LocalPointerBaseIKNS_6number4impl19LongNameMultiplexerEED2Ev:
   88|  9.45k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_6number4impl24MixedUnitLongNameHandlerEED2Ev:
  245|  9.45k|    ~LocalPointer() {
  246|  9.45k|        delete LocalPointerBase<T>::ptr;
  247|  9.45k|    }
_ZN6icu_7816LocalPointerBaseINS_6number4impl24MixedUnitLongNameHandlerEED2Ev:
   88|  9.45k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_6number4impl15LongNameHandlerEED2Ev:
  245|  9.45k|    ~LocalPointer() {
  246|  9.45k|        delete LocalPointerBase<T>::ptr;
  247|  9.45k|    }
_ZN6icu_7816LocalPointerBaseINS_6number4impl15LongNameHandlerEED2Ev:
   88|  9.45k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_6number4impl24ImmutablePatternModifierEED2Ev:
  245|  9.45k|    ~LocalPointer() {
  246|  9.45k|        delete LocalPointerBase<T>::ptr;
  247|  9.45k|    }
_ZN6icu_7816LocalPointerBaseINS_6number4impl24ImmutablePatternModifierEED2Ev:
   88|  9.45k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_6number4impl22MutablePatternModifierEED2Ev:
  245|  9.45k|    ~LocalPointer() {
  246|  9.45k|        delete LocalPointerBase<T>::ptr;
  247|  9.45k|    }
_ZN6icu_7816LocalPointerBaseINS_6number4impl22MutablePatternModifierEED2Ev:
   88|  9.45k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerIKNS_6number4impl17ScientificHandlerEED2Ev:
  245|  9.45k|    ~LocalPointer() {
  246|  9.45k|        delete LocalPointerBase<T>::ptr;
  247|  9.45k|    }
_ZN6icu_7816LocalPointerBaseIKNS_6number4impl17ScientificHandlerEED2Ev:
   88|  9.45k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerIKNS_6number4impl17ParsedPatternInfoEED2Ev:
  245|  9.45k|    ~LocalPointer() {
  246|  9.45k|        delete LocalPointerBase<T>::ptr;
  247|  9.45k|    }
_ZN6icu_7816LocalPointerBaseIKNS_6number4impl17ParsedPatternInfoEED2Ev:
   88|  9.45k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerIKNS_11PluralRulesEED2Ev:
  245|  9.45k|    ~LocalPointer() {
  246|  9.45k|        delete LocalPointerBase<T>::ptr;
  247|  9.45k|    }
_ZN6icu_7816LocalPointerBaseIKNS_11PluralRulesEED2Ev:
   88|  9.45k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerIKNS_20DecimalFormatSymbolsEED2Ev:
  245|  9.45k|    ~LocalPointer() {
  246|  9.45k|        delete LocalPointerBase<T>::ptr;
  247|  9.45k|    }
_ZN6icu_7816LocalPointerBaseIKNS_20DecimalFormatSymbolsEED2Ev:
   88|  9.45k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerIKNS_6number4impl21UnitConversionHandlerEED2Ev:
  245|  9.45k|    ~LocalPointer() {
  246|  9.45k|        delete LocalPointerBase<T>::ptr;
  247|  9.45k|    }
_ZN6icu_7816LocalPointerBaseIKNS_6number4impl21UnitConversionHandlerEED2Ev:
   88|  9.45k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerIKNS_6number4impl17UsagePrefsHandlerEED2Ev:
  245|  9.45k|    ~LocalPointer() {
  246|  9.45k|        delete LocalPointerBase<T>::ptr;
  247|  9.45k|    }
_ZN6icu_7816LocalPointerBaseIKNS_6number4impl17UsagePrefsHandlerEED2Ev:
   88|  9.45k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_11PluralRulesEED2Ev:
  245|  4.40k|    ~LocalPointer() {
  246|  4.40k|        delete LocalPointerBase<T>::ptr;
  247|  4.40k|    }
_ZN6icu_7816LocalPointerBaseINS_11PluralRulesEED2Ev:
   88|  4.40k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_11PluralRulesEEC2EPS1_:
   82|  4.40k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZNK6icu_7816LocalPointerBaseINS_11PluralRulesEE8getAliasEv:
  122|  1.03k|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerIKNS_6number4impl17UsagePrefsHandlerEEC2EPS4_:
  200|  9.45k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_6number4impl17UsagePrefsHandlerEEC2EPS4_:
   82|  9.45k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerIKNS_6number4impl21UnitConversionHandlerEEC2EPS4_:
  200|  9.45k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_6number4impl21UnitConversionHandlerEEC2EPS4_:
   82|  9.45k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerIKNS_20DecimalFormatSymbolsEEC2EPS2_:
  200|  9.45k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_20DecimalFormatSymbolsEEC2EPS2_:
   82|  9.45k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerIKNS_11PluralRulesEEC2EPS2_:
  200|  9.45k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_11PluralRulesEEC2EPS2_:
   82|  9.45k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerIKNS_6number4impl17ParsedPatternInfoEEC2EPS4_:
  200|  9.45k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_6number4impl17ParsedPatternInfoEEC2EPS4_:
   82|  9.45k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerIKNS_6number4impl17ScientificHandlerEEC2EPS4_:
  200|  9.45k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_6number4impl17ScientificHandlerEEC2EPS4_:
   82|  9.45k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_6number4impl22MutablePatternModifierEEC2EPS3_:
  200|  9.45k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_6number4impl22MutablePatternModifierEEC2EPS3_:
   82|  9.45k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_6number4impl24ImmutablePatternModifierEEC2EPS3_:
  200|  9.45k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_6number4impl24ImmutablePatternModifierEEC2EPS3_:
   82|  9.45k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_6number4impl15LongNameHandlerEEC2EPS3_:
  200|  9.45k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_6number4impl15LongNameHandlerEEC2EPS3_:
   82|  9.45k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_6number4impl24MixedUnitLongNameHandlerEEC2EPS3_:
  200|  9.45k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_6number4impl24MixedUnitLongNameHandlerEEC2EPS3_:
   82|  9.45k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerIKNS_6number4impl19LongNameMultiplexerEEC2EPS4_:
  200|  9.45k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_6number4impl19LongNameMultiplexerEEC2EPS4_:
   82|  9.45k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerIKNS_6number4impl14CompactHandlerEEC2EPS4_:
  200|  9.45k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_6number4impl14CompactHandlerEEC2EPS4_:
   82|  9.45k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerIKNS_15NumberingSystemEEC2EPS2_:
  200|  9.33k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_15NumberingSystemEEC2EPS2_:
   82|  9.33k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerIKNS_15NumberingSystemEED2Ev:
  245|  9.33k|    ~LocalPointer() {
  246|  9.33k|        delete LocalPointerBase<T>::ptr;
  247|  9.33k|    }
_ZN6icu_7816LocalPointerBaseIKNS_15NumberingSystemEED2Ev:
   88|  9.33k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerIKNS_15NumberingSystemEE12adoptInsteadEPS2_:
  300|  9.33k|    void adoptInstead(T *p) {
  301|  9.33k|        delete LocalPointerBase<T>::ptr;
  302|  9.33k|        LocalPointerBase<T>::ptr=p;
  303|  9.33k|    }
_ZN6icu_7812LocalPointerINS_20DecimalFormatSymbolsEEC2EPS1_R10UErrorCode:
  214|  9.33k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  9.33k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 9.33k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  9.33k|    }
_ZN6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEEC2EPS1_:
   82|  9.33k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_20DecimalFormatSymbolsEED2Ev:
  245|  9.33k|    ~LocalPointer() {
  246|  9.33k|        delete LocalPointerBase<T>::ptr;
  247|  9.33k|    }
_ZN6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEED2Ev:
   88|  9.33k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEE8getAliasEv:
  122|  9.33k|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerIKNS_20DecimalFormatSymbolsEE12adoptInsteadEPS2_:
  300|  9.33k|    void adoptInstead(T *p) {
  301|  9.33k|        delete LocalPointerBase<T>::ptr;
  302|  9.33k|        LocalPointerBase<T>::ptr=p;
  303|  9.33k|    }
_ZN6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEE6orphanEv:
  141|  9.33k|    T *orphan() {
  142|  9.33k|        T *p=ptr;
  143|  9.33k|        ptr=nullptr;
  144|  9.33k|        return p;
  145|  9.33k|    }
_ZN6icu_7812LocalPointerIKNS_6number4impl17ParsedPatternInfoEE12adoptInsteadEPS4_:
  300|  9.33k|    void adoptInstead(T *p) {
  301|  9.33k|        delete LocalPointerBase<T>::ptr;
  302|  9.33k|        LocalPointerBase<T>::ptr=p;
  303|  9.33k|    }
_ZNK6icu_7816LocalPointerBaseIKNS_6number4impl17ParsedPatternInfoEEdeEv:
  128|  9.33k|    T &operator*() const { return *ptr; }
_ZN6icu_7812LocalPointerIKNS_6number4impl17ScientificHandlerEE12adoptInsteadEPS4_:
  300|    192|    void adoptInstead(T *p) {
  301|    192|        delete LocalPointerBase<T>::ptr;
  302|    192|        LocalPointerBase<T>::ptr=p;
  303|    192|    }
_ZNK6icu_7816LocalPointerBaseIKNS_6number4impl17ScientificHandlerEE8getAliasEv:
  122|    192|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerINS_6number4impl22MutablePatternModifierEE12adoptInsteadEPS3_:
  300|  9.33k|    void adoptInstead(T *p) {
  301|  9.33k|        delete LocalPointerBase<T>::ptr;
  302|  9.33k|        LocalPointerBase<T>::ptr=p;
  303|  9.33k|    }
_ZNK6icu_7816LocalPointerBaseIKNS_6number4impl17ParsedPatternInfoEE8getAliasEv:
  122|  9.33k|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerINS_6number4impl15LongNameHandlerEE29adoptInsteadAndCheckErrorCodeEPS3_R10UErrorCode:
  319|  1.52k|    void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) {
  320|  1.52k|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (320:12): [True: 1.52k, False: 0]
  ------------------
  321|  1.52k|            delete LocalPointerBase<T>::ptr;
  322|  1.52k|            LocalPointerBase<T>::ptr=p;
  323|  1.52k|            if(p==nullptr) {
  ------------------
  |  Branch (323:16): [True: 0, False: 1.52k]
  ------------------
  324|      0|                errorCode=U_MEMORY_ALLOCATION_ERROR;
  325|      0|            }
  326|  1.52k|        } else {
  327|      0|            delete p;
  328|      0|        }
  329|  1.52k|    }
_ZNK6icu_7816LocalPointerBaseINS_6number4impl15LongNameHandlerEE8getAliasEv:
  122|  3.04k|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerIKNS_6number4impl14CompactHandlerEE12adoptInsteadEPS4_:
  300|  3.37k|    void adoptInstead(T *p) {
  301|  3.37k|        delete LocalPointerBase<T>::ptr;
  302|  3.37k|        LocalPointerBase<T>::ptr=p;
  303|  3.37k|    }
_ZNK6icu_7816LocalPointerBaseIKNS_6number4impl14CompactHandlerEE8getAliasEv:
  122|  3.37k|    T *getAlias() const { return ptr; }
_ZNK6icu_7816LocalPointerBaseIKNS_11PluralRulesEE6isNullEv:
   94|  4.90k|    UBool isNull() const { return ptr==nullptr; }
_ZN6icu_7812LocalPointerIKNS_11PluralRulesEE12adoptInsteadEPS2_:
  300|  3.37k|    void adoptInstead(T *p) {
  301|  3.37k|        delete LocalPointerBase<T>::ptr;
  302|  3.37k|        LocalPointerBase<T>::ptr=p;
  303|  3.37k|    }
_ZNK6icu_7816LocalPointerBaseIKNS_11PluralRulesEE8getAliasEv:
  122|  4.90k|    T *getAlias() const { return ptr; }
_ZN6icu_788internal16LocalOpenPointerI15UResourceBundleXadL_Z13ures_close_78EEEC2EPS2_:
  567|   141k|    explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase<Type>(p) {}
_ZN6icu_7816LocalPointerBaseI15UResourceBundleEC2EPS1_:
   82|   141k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZNK6icu_7816LocalPointerBaseI15UResourceBundleE8getAliasEv:
  122|   274k|    T *getAlias() const { return ptr; }
_ZN6icu_788internal16LocalOpenPointerI15UResourceBundleXadL_Z13ures_close_78EEED2Ev:
  575|   141k|    ~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } }
  ------------------
  |  Branch (575:31): [True: 136k, False: 4.28k]
  ------------------
_ZN6icu_7816LocalPointerBaseI15UResourceBundleED2Ev:
   88|   141k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_6number4impl6DecNumEEC2EPS3_R10UErrorCode:
  214|  1.55k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  1.55k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 1.55k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  1.55k|    }
_ZN6icu_7816LocalPointerBaseINS_6number4impl6DecNumEEC2EPS3_:
   82|  1.55k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseINS_6number4impl6DecNumEED2Ev:
   88|  1.55k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_6number4impl6DecNumEED2Ev:
  245|  1.55k|    ~LocalPointer() {
  246|  1.55k|        delete LocalPointerBase<T>::ptr;
  247|  1.55k|    }
_ZNK6icu_7816LocalPointerBaseINS_6number4impl6DecNumEEptEv:
  134|  2.91k|    T *operator->() const { return ptr; }
_ZN6icu_7816LocalPointerBaseINS_6number4impl6DecNumEE6orphanEv:
  141|  1.33k|    T *orphan() {
  142|  1.33k|        T *p=ptr;
  143|  1.33k|        ptr=nullptr;
  144|  1.33k|        return p;
  145|  1.33k|    }
_ZN6icu_7812LocalPointerINS_15NumberingSystemEEC2EPS1_R10UErrorCode:
  214|  18.6k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  18.6k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 18.6k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  18.6k|    }
_ZN6icu_7816LocalPointerBaseINS_15NumberingSystemEEC2EPS1_:
   82|  28.0k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_15NumberingSystemEED2Ev:
  245|  28.0k|    ~LocalPointer() {
  246|  28.0k|        delete LocalPointerBase<T>::ptr;
  247|  28.0k|    }
_ZN6icu_7816LocalPointerBaseINS_15NumberingSystemEED2Ev:
   88|  28.0k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_15NumberingSystemEEptEv:
  134|  46.6k|    T *operator->() const { return ptr; }
_ZN6icu_7816LocalPointerBaseINS_15NumberingSystemEE6orphanEv:
  141|  18.6k|    T *orphan() {
  142|  18.6k|        T *p=ptr;
  143|  18.6k|        ptr=nullptr;
  144|  18.6k|        return p;
  145|  18.6k|    }
_ZN6icu_7812LocalPointerINS_11PluralRulesEEC2EPS1_R10UErrorCode:
  214|  4.40k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  4.40k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 4.40k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  4.40k|    }
_ZNK6icu_7816LocalPointerBaseINS_11PluralRulesEEptEv:
  134|  4.40k|    T *operator->() const { return ptr; }
_ZN6icu_7816LocalPointerBaseINS_11PluralRulesEE6orphanEv:
  141|  4.40k|    T *orphan() {
  142|  4.40k|        T *p=ptr;
  143|  4.40k|        ptr=nullptr;
  144|  4.40k|        return p;
  145|  4.40k|    }
_ZN6icu_7812LocalPointerINS_20StandardPluralRangesEED2Ev:
  245|  3.89k|    ~LocalPointer() {
  246|  3.89k|        delete LocalPointerBase<T>::ptr;
  247|  3.89k|    }
_ZN6icu_7816LocalPointerBaseINS_20StandardPluralRangesEED2Ev:
   88|  3.89k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_20StandardPluralRangesEE6orphanEv:
  141|  3.89k|    T *orphan() {
  142|  3.89k|        T *p=ptr;
  143|  3.89k|        ptr=nullptr;
  144|  3.89k|        return p;
  145|  3.89k|    }
_ZN6icu_7812LocalPointerINS_17SharedPluralRulesEEC2EPS1_R10UErrorCode:
  214|    516|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|    516|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 516]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|    516|    }
_ZN6icu_7816LocalPointerBaseINS_17SharedPluralRulesEEC2EPS1_:
   82|    516|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_17SharedPluralRulesEED2Ev:
  245|    516|    ~LocalPointer() {
  246|    516|        delete LocalPointerBase<T>::ptr;
  247|    516|    }
_ZN6icu_7816LocalPointerBaseINS_17SharedPluralRulesEED2Ev:
   88|    516|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_17SharedPluralRulesEEptEv:
  134|    516|    T *operator->() const { return ptr; }
_ZN6icu_7816LocalPointerBaseINS_17SharedPluralRulesEE6orphanEv:
  141|    516|    T *orphan() {
  142|    516|        T *p=ptr;
  143|    516|        ptr=nullptr;
  144|    516|        return p;
  145|    516|    }
_ZN6icu_7812LocalPointerINS_9UVector32EEC2EPS1_R10UErrorCode:
  214|  15.6k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  15.6k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 15.6k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  15.6k|    }
_ZN6icu_7816LocalPointerBaseINS_9UVector32EEC2EPS1_:
   82|  15.6k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_9UVector32EED2Ev:
  245|  15.6k|    ~LocalPointer() {
  246|  15.6k|        delete LocalPointerBase<T>::ptr;
  247|  15.6k|    }
_ZN6icu_7816LocalPointerBaseINS_9UVector32EED2Ev:
   88|  15.6k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_9UVector32EE6orphanEv:
  141|  15.6k|    T *orphan() {
  142|  15.6k|        T *p=ptr;
  143|  15.6k|        ptr=nullptr;
  144|  15.6k|        return p;
  145|  15.6k|    }
_ZN6icu_7812LocalPointerINS_15NumberingSystemEEC2EPS1_:
  200|  9.33k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7812LocalPointerINS_20StandardPluralRangesEEC2EPS1_R10UErrorCode:
  214|  3.89k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  3.89k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 3.89k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  3.89k|    }
_ZN6icu_7816LocalPointerBaseINS_20StandardPluralRangesEEC2EPS1_:
   82|  3.89k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseIPKcEC2EPS2_:
   82|      5|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseIiEC2EPi:
   82|      5|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseIiED2Ev:
   88|      5|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseIPKcED2Ev:
   88|      5|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_788internal16LocalOpenPointerI10UHashtableXadL_Z14uhash_close_78EEEC2EPS2_:
  567|      1|    explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase<Type>(p) {}
_ZN6icu_7816LocalPointerBaseI10UHashtableEC2EPS1_:
   82|      1|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZNK6icu_7816LocalPointerBaseI10UHashtableE8getAliasEv:
  122|    178|    T *getAlias() const { return ptr; }
_ZN6icu_7816LocalPointerBaseI10UHashtableE6orphanEv:
  141|      1|    T *orphan() {
  142|      1|        T *p=ptr;
  143|      1|        ptr=nullptr;
  144|      1|        return p;
  145|      1|    }
_ZN6icu_788internal16LocalOpenPointerI10UHashtableXadL_Z14uhash_close_78EEED2Ev:
  575|      1|    ~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } }
  ------------------
  |  Branch (575:31): [True: 0, False: 1]
  ------------------
_ZN6icu_7816LocalPointerBaseI10UHashtableED2Ev:
   88|      1|    ~LocalPointerBase() { /* delete ptr; */ }

_ZNK6icu_786Locale10getCountryEv:
 1204|    717|{
 1205|    717|    return country;
 1206|    717|}
_ZNK6icu_786Locale11getLanguageEv:
 1210|  1.23k|{
 1211|  1.23k|    return language;
 1212|  1.23k|}
_ZNK6icu_786Locale9getScriptEv:
 1216|    717|{
 1217|    717|    return script;
 1218|    717|}
_ZNK6icu_786Locale10getVariantEv:
 1222|    717|{
 1223|    717|    return fIsBogus ? "" : &baseName[variantBegin];
  ------------------
  |  Branch (1223:12): [True: 0, False: 717]
  ------------------
 1224|    717|}
_ZNK6icu_786Locale7getNameEv:
 1228|   194k|{
 1229|   194k|    return fullName;
 1230|   194k|}

_ZN6icu_7811ReplaceableC2Ev:
  243|   242M|inline Replaceable::Replaceable() {}

_ZN6icu_7815SimpleFormatterC2ERKNS_13UnicodeStringEiiR10UErrorCode:
   96|  12.1k|                    UErrorCode &errorCode) {
   97|  12.1k|        applyPatternMinMaxArguments(pattern, min, max, errorCode);
   98|  12.1k|    }
_ZN6icu_7815SimpleFormatter16getArgumentLimitEPKDsi:
  314|  12.1k|                                              int32_t compiledPatternLength) {
  315|  12.1k|        return compiledPatternLength == 0 ? 0 : compiledPattern[0];
  ------------------
  |  Branch (315:16): [True: 0, False: 12.1k]
  ------------------
  316|  12.1k|    }

_ZN6icu_7811StringPieceC2EPKci:
  151|  7.80k|  StringPiece(const char* offset, int32_t len) : ptr_(offset), length_(len) { }
_ZNK6icu_7811StringPiece4dataEv:
  200|  1.12M|  const char* data() const { return ptr_; }
_ZN6icu_7811StringPiece13remove_prefixEi:
  267|  14.1k|  void remove_prefix(int32_t n) {
  268|  14.1k|    if (n >= 0) {
  ------------------
  |  Branch (268:9): [True: 14.1k, False: 0]
  ------------------
  269|  14.1k|      if (n > length_) {
  ------------------
  |  Branch (269:11): [True: 0, False: 14.1k]
  ------------------
  270|      0|        n = length_;
  271|      0|      }
  272|  14.1k|      ptr_ += n;
  273|  14.1k|      length_ -= n;
  274|  14.1k|    }
  275|  14.1k|  }
_ZNK6icu_7811StringPiece4sizeEv:
  206|  6.12k|  int32_t size() const { return length_; }
_ZN6icu_7811StringPieceC2Ev:
   71|  1.06k|  StringPiece() : ptr_(nullptr), length_(0) { }
_ZNK6icu_7811StringPiececvNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEEEv:
  185|  1.40k|  inline operator std::string_view() const {
  186|  1.40k|    return {data(), static_cast<std::string_view::size_type>(size())};
  187|  1.40k|  }
_ZNK6icu_7811StringPiece6lengthEv:
  212|  1.19M|  int32_t length() const { return length_; }

_ZN6icu_7810UCharsTrieC2ENS_14ConstChar16PtrE:
   70|  4.72k|            : ownedArray_(nullptr), uchars_(trieUChars),
   71|  4.72k|              pos_(uchars_), remainingMatchLength_(-1) {}
_ZN6icu_7810UCharsTrie5resetEv:
   94|  5.72k|    UCharsTrie &reset() {
   95|  5.72k|        pos_=uchars_;
   96|  5.72k|        remainingMatchLength_=-1;
   97|  5.72k|        return *this;
   98|  5.72k|    }
_ZNK6icu_7810UCharsTrie8getValueEv:
  258|  4.22k|    inline int32_t getValue() const {
  259|  4.22k|        const char16_t *pos=pos_;
  260|  4.22k|        int32_t leadUnit=*pos++;
  261|       |        // U_ASSERT(leadUnit>=kMinValueLead);
  262|  4.22k|        return leadUnit&kValueIsFinal ?
  ------------------
  |  Branch (262:16): [True: 1.73k, False: 2.48k]
  ------------------
  263|  2.48k|            readValue(pos, leadUnit&0x7fff) : readNodeValue(pos, leadUnit);
  264|  4.22k|    }
_ZN6icu_7810UCharsTrie4stopEv:
  414|  1.47k|    inline void stop() {
  415|  1.47k|        pos_=nullptr;
  416|  1.47k|    }
_ZN6icu_7810UCharsTrie9readValueEPKDsi:
  420|  1.73k|    static inline int32_t readValue(const char16_t *pos, int32_t leadUnit) {
  421|  1.73k|        int32_t value;
  422|  1.73k|        if(leadUnit<kMinTwoUnitValueLead) {
  ------------------
  |  Branch (422:12): [True: 1.73k, False: 0]
  ------------------
  423|  1.73k|            value=leadUnit;
  424|  1.73k|        } else if(leadUnit<kThreeUnitValueLead) {
  ------------------
  |  Branch (424:19): [True: 0, False: 0]
  ------------------
  425|      0|            value=((leadUnit-kMinTwoUnitValueLead)<<16)|*pos;
  426|      0|        } else {
  427|      0|            value=(pos[0]<<16)|pos[1];
  428|      0|        }
  429|  1.73k|        return value;
  430|  1.73k|    }
_ZN6icu_7810UCharsTrie9skipValueEPKDsi:
  431|  9.56k|    static inline const char16_t *skipValue(const char16_t *pos, int32_t leadUnit) {
  432|  9.56k|        if(leadUnit>=kMinTwoUnitValueLead) {
  ------------------
  |  Branch (432:12): [True: 0, False: 9.56k]
  ------------------
  433|      0|            if(leadUnit<kThreeUnitValueLead) {
  ------------------
  |  Branch (433:16): [True: 0, False: 0]
  ------------------
  434|      0|                ++pos;
  435|      0|            } else {
  436|      0|                pos+=2;
  437|      0|            }
  438|      0|        }
  439|  9.56k|        return pos;
  440|  9.56k|    }
_ZN6icu_7810UCharsTrie9skipValueEPKDs:
  441|  9.56k|    static inline const char16_t *skipValue(const char16_t *pos) {
  442|  9.56k|        int32_t leadUnit=*pos++;
  443|  9.56k|        return skipValue(pos, leadUnit&0x7fff);
  444|  9.56k|    }
_ZN6icu_7810UCharsTrie13readNodeValueEPKDsi:
  446|  2.48k|    static inline int32_t readNodeValue(const char16_t *pos, int32_t leadUnit) {
  447|       |        // U_ASSERT(kMinValueLead<=leadUnit && leadUnit<kValueIsFinal);
  448|  2.48k|        int32_t value;
  449|  2.48k|        if(leadUnit<kMinTwoUnitNodeValueLead) {
  ------------------
  |  Branch (449:12): [True: 2.48k, False: 0]
  ------------------
  450|  2.48k|            value=(leadUnit>>6)-1;
  451|  2.48k|        } else if(leadUnit<kThreeUnitNodeValueLead) {
  ------------------
  |  Branch (451:19): [True: 0, False: 0]
  ------------------
  452|      0|            value=(((leadUnit&0x7fc0)-kMinTwoUnitNodeValueLead)<<10)|*pos;
  453|      0|        } else {
  454|      0|            value=(pos[0]<<16)|pos[1];
  455|      0|        }
  456|  2.48k|        return value;
  457|  2.48k|    }
_ZN6icu_7810UCharsTrie13skipNodeValueEPKDsi:
  458|    107|    static inline const char16_t *skipNodeValue(const char16_t *pos, int32_t leadUnit) {
  459|       |        // U_ASSERT(kMinValueLead<=leadUnit && leadUnit<kValueIsFinal);
  460|    107|        if(leadUnit>=kMinTwoUnitNodeValueLead) {
  ------------------
  |  Branch (460:12): [True: 0, False: 107]
  ------------------
  461|      0|            if(leadUnit<kThreeUnitNodeValueLead) {
  ------------------
  |  Branch (461:16): [True: 0, False: 0]
  ------------------
  462|      0|                ++pos;
  463|      0|            } else {
  464|      0|                pos+=2;
  465|      0|            }
  466|      0|        }
  467|    107|        return pos;
  468|    107|    }
_ZN6icu_7810UCharsTrie11jumpByDeltaEPKDs:
  470|  6.26k|    static inline const char16_t *jumpByDelta(const char16_t *pos) {
  471|  6.26k|        int32_t delta=*pos++;
  472|  6.26k|        if(delta>=kMinTwoUnitDeltaLead) {
  ------------------
  |  Branch (472:12): [True: 0, False: 6.26k]
  ------------------
  473|      0|            if(delta==kThreeUnitDeltaLead) {
  ------------------
  |  Branch (473:16): [True: 0, False: 0]
  ------------------
  474|      0|                delta=(pos[0]<<16)|pos[1];
  475|      0|                pos+=2;
  476|      0|            } else {
  477|      0|                delta=((delta-kMinTwoUnitDeltaLead)<<16)|*pos++;
  478|      0|            }
  479|      0|        }
  480|  6.26k|        return pos+delta;
  481|  6.26k|    }
_ZN6icu_7810UCharsTrie9skipDeltaEPKDs:
  483|  5.18k|    static const char16_t *skipDelta(const char16_t *pos) {
  484|  5.18k|        int32_t delta=*pos++;
  485|  5.18k|        if(delta>=kMinTwoUnitDeltaLead) {
  ------------------
  |  Branch (485:12): [True: 0, False: 5.18k]
  ------------------
  486|      0|            if(delta==kThreeUnitDeltaLead) {
  ------------------
  |  Branch (486:16): [True: 0, False: 0]
  ------------------
  487|      0|                pos+=2;
  488|      0|            } else {
  489|      0|                ++pos;
  490|      0|            }
  491|      0|        }
  492|  5.18k|        return pos;
  493|  5.18k|    }
_ZN6icu_7810UCharsTrie11valueResultEi:
  495|  8.50k|    static inline UStringTrieResult valueResult(int32_t node) {
  496|  8.50k|        return static_cast<UStringTrieResult>(USTRINGTRIE_INTERMEDIATE_VALUE - (node >> 15));
  497|  8.50k|    }

_ZNK6icu_7817UCharsTrieBuilder31getMaxBranchLinearSubNodeLengthEv:
  153|     37|    virtual int32_t getMaxBranchLinearSubNodeLength() const override { return UCharsTrie::kMaxBranchLinearSubNodeLength; }
_ZNK6icu_7817UCharsTrieBuilder17getMinLinearMatchEv:
  154|     99|    virtual int32_t getMinLinearMatch() const override { return UCharsTrie::kMinLinearMatch; }
_ZNK6icu_7817UCharsTrieBuilder23getMaxLinearMatchLengthEv:
  155|     72|    virtual int32_t getMaxLinearMatchLength() const override { return UCharsTrie::kMaxLinearMatchLength; }

_ZNK6icu_7813UnicodeString8doEqualsERKS0_i:
 3773|     63|  inline UBool doEquals(const UnicodeString &text, int32_t len) const {
 3774|     63|    return doEquals(text.getArrayStart(), len);
 3775|     63|  }
_ZNK6icu_7813UnicodeString10pinIndicesERiS1_:
 4150|   382k|{
 4151|       |  // pin indices
 4152|   382k|  int32_t len = length();
 4153|   382k|  if(start < 0) {
  ------------------
  |  Branch (4153:6): [True: 0, False: 382k]
  ------------------
 4154|      0|    start = 0;
 4155|   382k|  } else if(start > len) {
  ------------------
  |  Branch (4155:13): [True: 0, False: 382k]
  ------------------
 4156|      0|    start = len;
 4157|      0|  }
 4158|   382k|  if(_length < 0) {
  ------------------
  |  Branch (4158:6): [True: 0, False: 382k]
  ------------------
 4159|      0|    _length = 0;
 4160|   382k|  } else if(_length > (len - start)) {
  ------------------
  |  Branch (4160:13): [True: 102k, False: 280k]
  ------------------
 4161|   102k|    _length = (len - start);
 4162|   102k|  }
 4163|   382k|}
_ZN6icu_7813UnicodeString13getArrayStartEv:
 4166|  1.01M|UnicodeString::getArrayStart() {
 4167|  1.01M|  return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ?
  ------------------
  |  Branch (4167:10): [True: 982k, False: 33.4k]
  ------------------
 4168|   982k|    fUnion.fStackFields.fBuffer : fUnion.fFields.fArray;
 4169|  1.01M|}
_ZNK6icu_7813UnicodeString13getArrayStartEv:
 4172|   265M|UnicodeString::getArrayStart() const {
 4173|   265M|  return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ?
  ------------------
  |  Branch (4173:10): [True: 242M, False: 23.3M]
  ------------------
 4174|   242M|    fUnion.fStackFields.fBuffer : fUnion.fFields.fArray;
 4175|   265M|}
_ZNK6icu_7813UnicodeString14hasShortLengthEv:
 4202|   751M|UnicodeString::hasShortLength() const {
 4203|   751M|  return fUnion.fFields.fLengthAndFlags>=0;
 4204|   751M|}
_ZNK6icu_7813UnicodeString14getShortLengthEv:
 4207|   970M|UnicodeString::getShortLength() const {
 4208|       |  // fLengthAndFlags must be non-negative -> short length >= 0
 4209|       |  // and arithmetic or logical shift does not matter.
 4210|   970M|  return fUnion.fFields.fLengthAndFlags>>kLengthShift;
 4211|   970M|}
_ZNK6icu_7813UnicodeString6lengthEv:
 4214|   751M|UnicodeString::length() const {
 4215|   751M|  return hasShortLength() ? getShortLength() : fUnion.fFields.fLength;
  ------------------
  |  Branch (4215:10): [True: 728M, False: 22.6M]
  ------------------
 4216|   751M|}
_ZNK6icu_7813UnicodeString11getCapacityEv:
 4219|   729k|UnicodeString::getCapacity() const {
 4220|   729k|  return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ?
  ------------------
  |  Branch (4220:10): [True: 706k, False: 23.1k]
  ------------------
 4221|   706k|    US_STACKBUF_SIZE : fUnion.fFields.fCapacity;
 4222|   729k|}
_ZNK6icu_7813UnicodeString7isBogusEv:
 4230|   241M|{ return fUnion.fFields.fLengthAndFlags & kIsBogus; }
_ZNK6icu_7813UnicodeString10isWritableEv:
 4234|  1.16M|{ return !(fUnion.fFields.fLengthAndFlags & (kOpenGetBuffer | kIsBogus)); }
_ZNK6icu_7813UnicodeString16isBufferWritableEv:
 4238|   681k|{
 4239|   681k|  return
 4240|   681k|      !(fUnion.fFields.fLengthAndFlags&(kOpenGetBuffer|kIsBogus|kBufferIsReadonly)) &&
  ------------------
  |  Branch (4240:7): [True: 675k, False: 6.44k]
  ------------------
 4241|   681k|      (!(fUnion.fFields.fLengthAndFlags&kRefCounted) || refCount()==1);
  ------------------
  |  Branch (4241:8): [True: 654k, False: 20.8k]
  |  Branch (4241:57): [True: 20.8k, False: 0]
  ------------------
 4242|   681k|}
_ZNK6icu_7813UnicodeString9getBufferEv:
 4245|  39.1k|UnicodeString::getBuffer() const {
 4246|  39.1k|  if(fUnion.fFields.fLengthAndFlags&(kIsBogus|kOpenGetBuffer)) {
  ------------------
  |  Branch (4246:6): [True: 0, False: 39.1k]
  ------------------
 4247|      0|    return nullptr;
 4248|  39.1k|  } else if(fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) {
  ------------------
  |  Branch (4248:13): [True: 33.7k, False: 5.44k]
  ------------------
 4249|  33.7k|    return fUnion.fStackFields.fBuffer;
 4250|  33.7k|  } else {
 4251|  5.44k|    return fUnion.fFields.fArray;
 4252|  5.44k|  }
 4253|  39.1k|}
_ZNK6icu_7813UnicodeString9doCompareEiiRKS0_ii:
 4264|    573|{
 4265|    573|  if(srcText.isBogus()) {
  ------------------
  |  Branch (4265:6): [True: 0, False: 573]
  ------------------
 4266|      0|    return static_cast<int8_t>(!isBogus()); // 0 if both are bogus, 1 otherwise
 4267|    573|  } else {
 4268|    573|    srcText.pinIndices(srcStart, srcLength);
 4269|    573|    return doCompare(start, thisLength, srcText.getArrayStart(), srcStart, srcLength);
 4270|    573|  }
 4271|    573|}
_ZNK6icu_7813UnicodeStringeqERKS0_:
 4290|    159|{
 4291|    159|  if(isBogus()) {
  ------------------
  |  Branch (4291:6): [True: 0, False: 159]
  ------------------
 4292|      0|    return text.isBogus();
 4293|    159|  } else {
 4294|    159|    int32_t len = length(), textLength = text.length();
 4295|    159|    return !text.isBogus() && len == textLength && doEquals(text, len);
  ------------------
  |  Branch (4295:12): [True: 159, False: 0]
  |  Branch (4295:31): [True: 63, False: 96]
  |  Branch (4295:52): [True: 19, False: 44]
  ------------------
 4296|    159|  }
 4297|    159|}
_ZNK6icu_7813UnicodeString7compareERKS0_:
 4321|    573|{ return doCompare(0, length(), text, 0, text.length()); }
_ZNK6icu_7813UnicodeString7compareENS_14ConstChar16PtrEi:
 4332|  57.0k|{ return doCompare(0, length(), srcChars, 0, srcLength); }
_ZNK6icu_7813UnicodeString8doCharAtEi:
 4846|   242M|{
 4847|   242M|  if (static_cast<uint32_t>(offset) < static_cast<uint32_t>(length())) {
  ------------------
  |  Branch (4847:7): [True: 242M, False: 0]
  ------------------
 4848|   242M|    return getArrayStart()[offset];
 4849|   242M|  } else {
 4850|      0|    return kInvalidUChar;
 4851|      0|  }
 4852|   242M|}
_ZNK6icu_7813UnicodeString6charAtEi:
 4856|   242M|{ return doCharAt(offset); }
_ZNK6icu_7813UnicodeStringixEi:
 4860|  3.02k|{ return doCharAt(offset); }
_ZNK6icu_7813UnicodeString7isEmptyEv:
 4863|   241M|UnicodeString::isEmpty() const {
 4864|       |  // Arithmetic or logical right shift does not matter: only testing for 0.
 4865|   241M|  return (fUnion.fFields.fLengthAndFlags>>kLengthShift) == 0;
 4866|   241M|}
_ZN6icu_7813UnicodeString13setZeroLengthEv:
 4872|  44.1k|UnicodeString::setZeroLength() {
 4873|  44.1k|  fUnion.fFields.fLengthAndFlags &= kAllStorageFlags;
 4874|  44.1k|}
_ZN6icu_7813UnicodeString14setShortLengthEi:
 4877|  1.08M|UnicodeString::setShortLength(int32_t len) {
 4878|       |  // requires 0 <= len <= kMaxShortLength
 4879|  1.08M|  fUnion.fFields.fLengthAndFlags =
 4880|  1.08M|    static_cast<int16_t>((fUnion.fFields.fLengthAndFlags & kAllStorageFlags) | (len << kLengthShift));
 4881|  1.08M|}
_ZN6icu_7813UnicodeString9setLengthEi:
 4884|  1.08M|UnicodeString::setLength(int32_t len) {
 4885|  1.08M|  if(len <= kMaxShortLength) {
  ------------------
  |  Branch (4885:6): [True: 1.08M, False: 1.43k]
  ------------------
 4886|  1.08M|    setShortLength(len);
 4887|  1.08M|  } else {
 4888|  1.43k|    fUnion.fFields.fLengthAndFlags |= kLengthIsLarge;
 4889|  1.43k|    fUnion.fFields.fLength = len;
 4890|  1.43k|  }
 4891|  1.08M|}
_ZN6icu_7813UnicodeString10setToEmptyEv:
 4894|  2.19k|UnicodeString::setToEmpty() {
 4895|  2.19k|  fUnion.fFields.fLengthAndFlags = kShortString;
 4896|  2.19k|}
_ZN6icu_7813UnicodeString8setArrayEPDsii:
 4899|   207k|UnicodeString::setArray(char16_t *array, int32_t len, int32_t capacity) {
 4900|   207k|  setLength(len);
 4901|   207k|  fUnion.fFields.fArray = array;
 4902|   207k|  fUnion.fFields.fCapacity = capacity;
 4903|   207k|}
_ZN6icu_7813UnicodeStringaSEDs:
 4907|   242k|{ return doReplace(0, length(), &ch, 0, 1); }
_ZN6icu_7813UnicodeString5setToERKS0_ii:
 4917|  61.9k|{
 4918|  61.9k|  unBogus();
 4919|  61.9k|  return doReplace(0, length(), srcText, srcStart, srcLength);
 4920|  61.9k|}
_ZN6icu_7813UnicodeString5setToERKS0_:
 4933|  18.6k|{
 4934|  18.6k|  return copyFrom(srcText);
 4935|  18.6k|}
_ZN6icu_7813UnicodeString5setToEPKDsi:
 4940|  12.8k|{
 4941|  12.8k|  unBogus();
 4942|  12.8k|  return doReplace(0, length(), srcChars, 0, srcLength);
 4943|  12.8k|}
_ZN6icu_7813UnicodeString5setToEDs:
 4947|  12.1k|{
 4948|  12.1k|  unBogus();
 4949|  12.1k|  return doReplace(0, length(), &srcChar, 0, 1);
 4950|  12.1k|}
_ZN6icu_7813UnicodeString5setToEi:
 4954|  93.3k|{
 4955|  93.3k|  unBogus();
 4956|  93.3k|  return replace(0, length(), srcChar);
 4957|  93.3k|}
_ZN6icu_7813UnicodeString6appendERKS0_:
 4967|  48.6k|{ return doAppend(srcText, 0, srcText.length()); }
_ZN6icu_7813UnicodeString6appendENS_14ConstChar16PtrEi:
 4978|    242|{ return doAppend(srcChars, 0, srcLength); }
_ZN6icu_7813UnicodeString6appendEDs:
 4982|  87.0k|{ return doAppend(&srcChar, 0, 1); }
_ZN6icu_7813UnicodeString6insertEii:
 5030|  17.8k|{ return replace(start, 0, srcChar); }
_ZN6icu_7813UnicodeString6removeEv:
 5035|  37.3k|{
 5036|       |  // remove() of a bogus string makes the string empty and non-bogus
 5037|  37.3k|  if(isBogus()) {
  ------------------
  |  Branch (5037:6): [True: 0, False: 37.3k]
  ------------------
 5038|      0|    setToEmpty();
 5039|  37.3k|  } else {
 5040|  37.3k|    setZeroLength();
 5041|  37.3k|  }
 5042|  37.3k|  return *this;
 5043|  37.3k|}
_ZN6icu_7813UnicodeStringC2Ev:
 4182|   508k|UnicodeString::UnicodeString() {
 4183|   508k|  fUnion.fStackFields.fLengthAndFlags=kShortString;
 4184|   508k|}
_ZN6icu_7813UnicodeStringC2IPKDsvEERKT_:
 3274|  11.7k|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|  11.7k|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|  11.7k|    doAppend(internal::toU16StringViewNullable(text));
 3277|  11.7k|  }
_ZN6icu_7813UnicodeStringC2IA9_DsvEERKT_:
 3274|     79|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|     79|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|     79|    doAppend(internal::toU16StringViewNullable(text));
 3277|     79|  }
_ZN6icu_7813UnicodeStringC2IA4_DsvEERKT_:
 3274|      3|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      3|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      3|    doAppend(internal::toU16StringViewNullable(text));
 3277|      3|  }
_ZN6icu_7813UnicodeStringC2IA2_DsvEERKT_:
 3274|     90|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|     90|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|     90|    doAppend(internal::toU16StringViewNullable(text));
 3277|     90|  }
_ZN6icu_7813UnicodeStringC2IA10_DsvEERKT_:
 3274|      3|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      3|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      3|    doAppend(internal::toU16StringViewNullable(text));
 3277|      3|  }
_ZN6icu_7813UnicodeStringC2IA16_DsvEERKT_:
 3274|      3|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      3|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      3|    doAppend(internal::toU16StringViewNullable(text));
 3277|      3|  }
_ZN6icu_7813UnicodeStringC2IA14_DsvEERKT_:
 3274|      3|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      3|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      3|    doAppend(internal::toU16StringViewNullable(text));
 3277|      3|  }
_ZN6icu_7813UnicodeStringC2IA13_DsvEERKT_:
 3274|      3|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      3|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      3|    doAppend(internal::toU16StringViewNullable(text));
 3277|      3|  }
_ZN6icu_7813UnicodeStringC2IA11_DsvEERKT_:
 3274|      4|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      4|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      4|    doAppend(internal::toU16StringViewNullable(text));
 3277|      4|  }
_ZN6icu_7813UnicodeStringC2IA12_DsvEERKT_:
 3274|      2|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      2|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      2|    doAppend(internal::toU16StringViewNullable(text));
 3277|      2|  }
_ZN6icu_7813UnicodeStringC2IA8_DsvEERKT_:
 3274|      1|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      1|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      1|    doAppend(internal::toU16StringViewNullable(text));
 3277|      1|  }
_ZN6icu_7813UnicodeStringC2IA18_DsvEERKT_:
 3274|      4|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      4|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      4|    doAppend(internal::toU16StringViewNullable(text));
 3277|      4|  }
_ZN6icu_7813UnicodeStringC2IA20_DsvEERKT_:
 3274|      5|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      5|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      5|    doAppend(internal::toU16StringViewNullable(text));
 3277|      5|  }
_ZN6icu_7813UnicodeStringC2IA28_DsvEERKT_:
 3274|      2|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      2|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      2|    doAppend(internal::toU16StringViewNullable(text));
 3277|      2|  }
_ZN6icu_7813UnicodeStringC2IA24_DsvEERKT_:
 3274|      3|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      3|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      3|    doAppend(internal::toU16StringViewNullable(text));
 3277|      3|  }
_ZN6icu_7813UnicodeStringC2IA22_DsvEERKT_:
 3274|      2|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      2|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      2|    doAppend(internal::toU16StringViewNullable(text));
 3277|      2|  }
_ZN6icu_7813UnicodeStringC2IA19_DsvEERKT_:
 3274|      2|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      2|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      2|    doAppend(internal::toU16StringViewNullable(text));
 3277|      2|  }
_ZN6icu_7813UnicodeStringC2IA17_DsvEERKT_:
 3274|      6|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      6|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      6|    doAppend(internal::toU16StringViewNullable(text));
 3277|      6|  }
_ZN6icu_7813UnicodeStringC2IA23_DsvEERKT_:
 3274|      2|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      2|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      2|    doAppend(internal::toU16StringViewNullable(text));
 3277|      2|  }
_ZN6icu_7813UnicodeStringC2IA27_DsvEERKT_:
 3274|      1|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      1|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      1|    doAppend(internal::toU16StringViewNullable(text));
 3277|      1|  }
_ZN6icu_7813UnicodeStringC2IA25_DsvEERKT_:
 3274|      2|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      2|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      2|    doAppend(internal::toU16StringViewNullable(text));
 3277|      2|  }
_ZN6icu_7813UnicodeStringC2IA26_DsvEERKT_:
 3274|      1|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      1|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      1|    doAppend(internal::toU16StringViewNullable(text));
 3277|      1|  }
_ZN6icu_7813UnicodeStringC2IA6_DsvEERKT_:
 3274|      4|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      4|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      4|    doAppend(internal::toU16StringViewNullable(text));
 3277|      4|  }
_ZN6icu_7813UnicodeStringC2IA21_DsvEERKT_:
 3274|      1|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      1|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      1|    doAppend(internal::toU16StringViewNullable(text));
 3277|      1|  }
_ZN6icu_7813UnicodeStringC2IA15_DsvEERKT_:
 3274|      1|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      1|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      1|    doAppend(internal::toU16StringViewNullable(text));
 3277|      1|  }
_ZN6icu_7813UnicodeStringC2IA5_DsvEERKT_:
 3274|      1|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      1|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      1|    doAppend(internal::toU16StringViewNullable(text));
 3277|      1|  }
_ZN6icu_7813UnicodeStringC2IA3_DsvEERKT_:
 3274|      9|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      9|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      9|    doAppend(internal::toU16StringViewNullable(text));
 3277|      9|  }

_ZN6icu_7821ures_getUnicodeStringEPK15UResourceBundleP10UErrorCode:
  813|  1.52k|ures_getUnicodeString(const UResourceBundle *resB, UErrorCode* status) {
  814|  1.52k|    UnicodeString result;
  815|  1.52k|    int32_t len = 0;
  816|  1.52k|    const char16_t *r = ConstChar16Ptr(ures_getString(resB, &len, status));
  ------------------
  |  | 1675|  1.52k|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|  1.52k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.52k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.52k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  817|  1.52k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (817:8): [True: 456, False: 1.06k]
  ------------------
  818|    456|        result.setTo(true, r, len);
  819|  1.06k|    } else {
  820|  1.06k|        result.setToBogus();
  821|  1.06k|    }
  822|  1.52k|    return result;
  823|  1.52k|}
_ZN6icu_7825ures_getNextUnicodeStringEP15UResourceBundlePPKcP10UErrorCode:
  838|  1.14k|ures_getNextUnicodeString(UResourceBundle *resB, const char ** key, UErrorCode* status) {
  839|  1.14k|    UnicodeString result;
  840|  1.14k|    int32_t len = 0;
  841|  1.14k|    const char16_t* r = ConstChar16Ptr(ures_getNextString(resB, &len, key, status));
  ------------------
  |  | 1673|  1.14k|#define ures_getNextString U_ICU_ENTRY_POINT_RENAME(ures_getNextString)
  |  |  ------------------
  |  |  |  |  123|  1.14k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.14k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.14k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  842|  1.14k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (842:8): [True: 1.14k, False: 0]
  ------------------
  843|  1.14k|        result.setTo(true, r, len);
  844|  1.14k|    } else {
  845|      0|        result.setToBogus();
  846|      0|    }
  847|  1.14k|    return result;
  848|  1.14k|}
_ZN6icu_7828ures_getUnicodeStringByIndexEPK15UResourceBundleiP10UErrorCode:
  860|    208|ures_getUnicodeStringByIndex(const UResourceBundle *resB, int32_t indexS, UErrorCode* status) {
  861|    208|    UnicodeString result;
  862|    208|    int32_t len = 0;
  863|    208|    const char16_t* r = ConstChar16Ptr(ures_getStringByIndex(resB, indexS, &len, status));
  ------------------
  |  | 1676|    208|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  123|    208|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    208|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    208|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  864|    208|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (864:8): [True: 208, False: 0]
  ------------------
  865|    208|        result.setTo(true, r, len);
  866|    208|    } else {
  867|      0|        result.setToBogus();
  868|      0|    }
  869|    208|    return result;
  870|    208|}
_ZN6icu_7826ures_getUnicodeStringByKeyEPK15UResourceBundlePKcP10UErrorCode:
  883|  9.33k|ures_getUnicodeStringByKey(const UResourceBundle *resB, const char* key, UErrorCode* status) {
  884|  9.33k|    UnicodeString result;
  885|  9.33k|    int32_t len = 0;
  886|  9.33k|    const char16_t* r = ConstChar16Ptr(ures_getStringByKey(resB, key, &len, status));
  ------------------
  |  | 1677|  9.33k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  887|  9.33k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (887:8): [True: 9.33k, False: 0]
  ------------------
  888|  9.33k|        result.setTo(true, r, len);
  889|  9.33k|    } else {
  890|      0|        result.setToBogus();
  891|      0|    }
  892|  9.33k|    return result;
  893|  9.33k|}

number_fluent.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  46.9k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_fluent.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  9.45k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
number_formatimpl.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  97.0k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_formatimpl.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  10.8k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
number_grouping.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  9.30k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_integerwidth.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  9.33k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_longnames.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  43.4k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_longnames.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  12.1k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
number_patternstring.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   147k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_rounding.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  17.9k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_scientific.cpp:_ZL9U_FAILURE10UErrorCode:
  737|    192|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_skeletons.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  26.7k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_skeletons.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  4.72k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
number_utils.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  38.8k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
numsys.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  56.0k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
plurrule.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   270k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
plurrule.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  7.89k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
standardplural.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   103k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
currunit.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  9.33k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
dcfmtsym.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   216k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
dcfmtsym.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  31.6k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
formatted_string_builder.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  3.07G|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_affixutils.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   158k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_compact.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   241k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_decimalquantity.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  18.7k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
pluralranges.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  9.93k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
bytesinkutil.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   211k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
charstr.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  2.05M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
locavailable.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  2.66k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
locbased.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  18.6k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
locid.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  27.6k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
locid.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  3.48k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
loclikely.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  9.33k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
loclikely.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  28.0k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
simpleformatter.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  12.1k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uarrsort.cpp:_ZL9U_FAILURE10UErrorCode:
  737|    718|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ucharstriebuilder.cpp:_ZL9U_FAILURE10UErrorCode:
  737|    146|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ucharstriebuilder.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|     73|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
ucurr.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  47.3k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ucurr.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  50.9k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uhash.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  5.29k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uloc.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   769k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
unifiedcache.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  11.1k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
unifiedcache.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|    516|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uresbund.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  1.57M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uresbund.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   203k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uresdata.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   362k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ustring.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  20.0k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uvector.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  1.43k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uvector.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|    717|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uvectr32.cpp:_ZL9U_FAILURE10UErrorCode:
  737|    804|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
udata.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  14.1k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
udata.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  4.71k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
udatamem.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  1.58k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ucmndata.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      2|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }

_ZN6icu_7815ucache_hashKeysE8UElement:
   49|  4.40k|ucache_hashKeys(const UHashTok key) {
   50|  4.40k|    const CacheKeyBase* ckey = static_cast<const CacheKeyBase*>(key.pointer);
   51|  4.40k|    return ckey->hashCode();
   52|  4.40k|}
_ZN6icu_7818ucache_compareKeysE8UElementS0_:
   55|  3.37k|ucache_compareKeys(const UHashTok key1, const UHashTok key2) {
   56|  3.37k|    const CacheKeyBase* p1 = static_cast<const CacheKeyBase*>(key1.pointer);
   57|  3.37k|    const CacheKeyBase* p2 = static_cast<const CacheKeyBase*>(key2.pointer);
   58|  3.37k|    return *p1 == *p2;
   59|  3.37k|}
_ZN6icu_7812CacheKeyBaseD2Ev:
   67|  3.37k|CacheKeyBase::~CacheKeyBase() {
   68|  3.37k|}
_ZN6icu_7812UnifiedCache11getInstanceER10UErrorCode:
   88|  3.37k|UnifiedCache *UnifiedCache::getInstance(UErrorCode &status) {
   89|  3.37k|    umtx_initOnce(gCacheInitOnce, &cacheInit, status);
   90|  3.37k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (90:9): [True: 0, False: 3.37k]
  ------------------
   91|      0|        return nullptr;
   92|      0|    }
   93|  3.37k|    U_ASSERT(gCache != nullptr);
  ------------------
  |  |   35|  3.37k|#   define U_ASSERT(exp) (void)0
  ------------------
   94|  3.37k|    return gCache;
   95|  3.37k|}
_ZN6icu_7812UnifiedCacheC2ER10UErrorCode:
   98|      1|        fHashtable(nullptr),
   99|      1|        fEvictPos(UHASH_FIRST),
  ------------------
  |  |  610|      1|#define UHASH_FIRST (-1)
  ------------------
  100|      1|        fNumValuesTotal(0),
  101|      1|        fNumValuesInUse(0),
  102|      1|        fMaxUnused(DEFAULT_MAX_UNUSED),
  103|      1|        fMaxPercentageOfInUse(DEFAULT_PERCENTAGE_OF_IN_USE),
  104|      1|        fAutoEvictedCount(0),
  105|      1|        fNoValue(nullptr) {
  106|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (106:9): [True: 0, False: 1]
  ------------------
  107|      0|        return;
  108|      0|    }
  109|      1|    fNoValue = new SharedObject();
  110|      1|    if (fNoValue == nullptr) {
  ------------------
  |  Branch (110:9): [True: 0, False: 1]
  ------------------
  111|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  112|      0|        return;
  113|      0|    }
  114|      1|    fNoValue->softRefCount = 1;  // Add fake references to prevent fNoValue from being deleted
  115|      1|    fNoValue->hardRefCount = 1;  // when other references to it are removed.
  116|      1|    fNoValue->cachePtr = this;
  117|       |
  118|      1|    fHashtable = uhash_open(
  ------------------
  |  | 1030|      1|#define uhash_open U_ICU_ENTRY_POINT_RENAME(uhash_open)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  119|      1|            &ucache_hashKeys,
  120|      1|            &ucache_compareKeys,
  121|      1|            nullptr,
  122|      1|            &status);
  123|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (123:9): [True: 0, False: 1]
  ------------------
  124|      0|        return;
  125|      0|    }
  126|      1|    uhash_setKeyDeleter(fHashtable, &ucache_deleteKey);
  ------------------
  |  | 1040|      1|#define uhash_setKeyDeleter U_ICU_ENTRY_POINT_RENAME(uhash_setKeyDeleter)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  127|      1|}
_ZNK6icu_7812UnifiedCache24handleUnreferencedObjectEv:
  167|  3.37k|void UnifiedCache::handleUnreferencedObject() const {
  168|  3.37k|    std::lock_guard<std::mutex> lock(*gCacheMutex);
  169|  3.37k|    --fNumValuesInUse;
  170|  3.37k|    _runEvictionSlice();
  171|  3.37k|}
_ZNK6icu_7812UnifiedCache27_computeCountOfItemsToEvictEv:
  266|  3.89k|int32_t UnifiedCache::_computeCountOfItemsToEvict() const {
  267|  3.89k|    int32_t totalItems = uhash_count(fHashtable);
  ------------------
  |  | 1001|  3.89k|#define uhash_count U_ICU_ENTRY_POINT_RENAME(uhash_count)
  |  |  ------------------
  |  |  |  |  123|  3.89k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.89k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.89k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  268|  3.89k|    int32_t evictableItems = totalItems - fNumValuesInUse;
  269|       |
  270|  3.89k|    int32_t unusedLimitByPercentage = fNumValuesInUse * fMaxPercentageOfInUse / 100;
  271|  3.89k|    int32_t unusedLimit = std::max(unusedLimitByPercentage, fMaxUnused);
  272|  3.89k|    int32_t countOfItemsToEvict = std::max<int32_t>(0, evictableItems - unusedLimit);
  273|  3.89k|    return countOfItemsToEvict;
  274|  3.89k|}
_ZNK6icu_7812UnifiedCache17_runEvictionSliceEv:
  276|  3.89k|void UnifiedCache::_runEvictionSlice() const {
  277|  3.89k|    int32_t maxItemsToEvict = _computeCountOfItemsToEvict();
  278|  3.89k|    if (maxItemsToEvict <= 0) {
  ------------------
  |  Branch (278:9): [True: 3.89k, False: 0]
  ------------------
  279|  3.89k|        return;
  280|  3.89k|    }
  281|      0|    for (int32_t i = 0; i < MAX_EVICT_ITERATIONS; ++i) {
  ------------------
  |  Branch (281:25): [True: 0, False: 0]
  ------------------
  282|      0|        const UHashElement *element = _nextElement();
  283|      0|        if (element == nullptr) {
  ------------------
  |  Branch (283:13): [True: 0, False: 0]
  ------------------
  284|      0|            break;
  285|      0|        }
  286|      0|        if (_isEvictable(element)) {
  ------------------
  |  Branch (286:13): [True: 0, False: 0]
  ------------------
  287|      0|            const SharedObject *sharedObject =
  288|      0|                    static_cast<const SharedObject*>(element->value.pointer);
  289|      0|            uhash_removeElement(fHashtable, element);
  ------------------
  |  | 1037|      0|#define uhash_removeElement U_ICU_ENTRY_POINT_RENAME(uhash_removeElement)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  290|      0|            removeSoftRef(sharedObject);   // Deletes sharedObject when SoftRefCount goes to zero.
  291|      0|            ++fAutoEvictedCount;
  292|      0|            if (--maxItemsToEvict == 0) {
  ------------------
  |  Branch (292:17): [True: 0, False: 0]
  ------------------
  293|      0|                break;
  294|      0|            }
  295|      0|        }
  296|      0|    }
  297|      0|}
_ZNK6icu_7812UnifiedCache7_putNewERKNS_12CacheKeyBaseEPKNS_12SharedObjectE10UErrorCodeRS7_:
  303|    516|        UErrorCode &status) const {
  304|    516|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (304:9): [True: 0, False: 516]
  ------------------
  305|      0|        return;
  306|      0|    }
  307|    516|    CacheKeyBase *keyToAdopt = key.clone();
  308|    516|    if (keyToAdopt == nullptr) {
  ------------------
  |  Branch (308:9): [True: 0, False: 516]
  ------------------
  309|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  310|      0|        return;
  311|      0|    }
  312|    516|    keyToAdopt->fCreationStatus = creationStatus;
  313|    516|    if (value->softRefCount == 0) {
  ------------------
  |  Branch (313:9): [True: 0, False: 516]
  ------------------
  314|      0|        _registerPrimary(keyToAdopt, value);
  315|      0|    }
  316|    516|    void *oldValue = uhash_put(fHashtable, keyToAdopt, (void *) value, &status);
  ------------------
  |  | 1032|    516|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|    516|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    516|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    516|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  317|    516|    U_ASSERT(oldValue == nullptr);
  ------------------
  |  |   35|    516|#   define U_ASSERT(exp) (void)0
  ------------------
  318|    516|    (void)oldValue;
  319|    516|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (319:9): [True: 516, False: 0]
  ------------------
  320|    516|        value->softRefCount++;
  321|    516|    }
  322|    516|}
_ZNK6icu_7812UnifiedCache18_putIfAbsentAndGetERKNS_12CacheKeyBaseERPKNS_12SharedObjectER10UErrorCode:
  327|    516|        UErrorCode &status) const {
  328|    516|    std::lock_guard<std::mutex> lock(*gCacheMutex);
  329|    516|    const UHashElement *element = uhash_find(fHashtable, &key);
  ------------------
  |  | 1006|    516|#define uhash_find U_ICU_ENTRY_POINT_RENAME(uhash_find)
  |  |  ------------------
  |  |  |  |  123|    516|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    516|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    516|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|    516|    if (element != nullptr && !_inProgress(element)) {
  ------------------
  |  Branch (330:9): [True: 516, False: 0]
  |  Branch (330:31): [True: 0, False: 516]
  ------------------
  331|      0|        _fetch(element, value, status);
  332|      0|        return;
  333|      0|    }
  334|    516|    if (element == nullptr) {
  ------------------
  |  Branch (334:9): [True: 0, False: 516]
  ------------------
  335|      0|        UErrorCode putError = U_ZERO_ERROR;
  336|       |        // best-effort basis only.
  337|      0|        _putNew(key, value, status, putError);
  338|    516|    } else {
  339|    516|        _put(element, value, status);
  340|    516|    }
  341|       |    // Run an eviction slice. This will run even if we added a primary entry
  342|       |    // which doesn't increase the unused count, but that is still o.k
  343|    516|    _runEvictionSlice();
  344|    516|}
_ZNK6icu_7812UnifiedCache5_pollERKNS_12CacheKeyBaseERPKNS_12SharedObjectER10UErrorCode:
  350|  3.37k|        UErrorCode &status) const {
  351|  3.37k|    U_ASSERT(value == nullptr);
  ------------------
  |  |   35|  3.37k|#   define U_ASSERT(exp) (void)0
  ------------------
  352|  3.37k|    U_ASSERT(status == U_ZERO_ERROR);
  ------------------
  |  |   35|  3.37k|#   define U_ASSERT(exp) (void)0
  ------------------
  353|  3.37k|    std::unique_lock<std::mutex> lock(*gCacheMutex);
  354|  3.37k|    const UHashElement *element = uhash_find(fHashtable, &key);
  ------------------
  |  | 1006|  3.37k|#define uhash_find U_ICU_ENTRY_POINT_RENAME(uhash_find)
  |  |  ------------------
  |  |  |  |  123|  3.37k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.37k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.37k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  355|       |
  356|       |    // If the hash table contains an inProgress placeholder entry for this key,
  357|       |    // this means that another thread is currently constructing the value object.
  358|       |    // Loop, waiting for that construction to complete.
  359|  3.37k|     while (element != nullptr && _inProgress(element)) {
  ------------------
  |  Branch (359:13): [True: 2.86k, False: 516]
  |  Branch (359:35): [True: 0, False: 2.86k]
  ------------------
  360|      0|         gInProgressValueAddedCond->wait(lock);
  361|      0|         element = uhash_find(fHashtable, &key);
  ------------------
  |  | 1006|      0|#define uhash_find U_ICU_ENTRY_POINT_RENAME(uhash_find)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  362|      0|    }
  363|       |
  364|       |    // If the hash table contains an entry for the key,
  365|       |    // fetch out the contents and return them.
  366|  3.37k|    if (element != nullptr) {
  ------------------
  |  Branch (366:9): [True: 2.86k, False: 516]
  ------------------
  367|  2.86k|         _fetch(element, value, status);
  368|  2.86k|        return true;
  369|  2.86k|    }
  370|       |
  371|       |    // The hash table contained nothing for this key.
  372|       |    // Insert an inProgress place holder value.
  373|       |    // Our caller will create the final value and update the hash table.
  374|    516|    _putNew(key, fNoValue, U_ZERO_ERROR, status);
  375|    516|    return false;
  376|  3.37k|}
_ZNK6icu_7812UnifiedCache4_getERKNS_12CacheKeyBaseERPKNS_12SharedObjectEPKvR10UErrorCode:
  382|  3.37k|        UErrorCode &status) const {
  383|  3.37k|    U_ASSERT(value == nullptr);
  ------------------
  |  |   35|  3.37k|#   define U_ASSERT(exp) (void)0
  ------------------
  384|  3.37k|    U_ASSERT(status == U_ZERO_ERROR);
  ------------------
  |  |   35|  3.37k|#   define U_ASSERT(exp) (void)0
  ------------------
  385|  3.37k|    if (_poll(key, value, status)) {
  ------------------
  |  Branch (385:9): [True: 2.86k, False: 516]
  ------------------
  386|  2.86k|        if (value == fNoValue) {
  ------------------
  |  Branch (386:13): [True: 0, False: 2.86k]
  ------------------
  387|      0|            SharedObject::clearPtr(value);
  388|      0|        }
  389|  2.86k|        return;
  390|  2.86k|    }
  391|    516|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (391:9): [True: 0, False: 516]
  ------------------
  392|      0|        return;
  393|      0|    }
  394|    516|    value = key.createObject(creationContext, status);
  395|    516|    U_ASSERT(value == nullptr || value->hasHardReferences());
  ------------------
  |  |   35|    516|#   define U_ASSERT(exp) (void)0
  ------------------
  396|    516|    U_ASSERT(value != nullptr || status != U_ZERO_ERROR);
  ------------------
  |  |   35|    516|#   define U_ASSERT(exp) (void)0
  ------------------
  397|    516|    if (value == nullptr) {
  ------------------
  |  Branch (397:9): [True: 0, False: 516]
  ------------------
  398|      0|        SharedObject::copyPtr(fNoValue, value);
  399|      0|    }
  400|    516|    _putIfAbsentAndGet(key, value, status);
  401|    516|    if (value == fNoValue) {
  ------------------
  |  Branch (401:9): [True: 0, False: 516]
  ------------------
  402|      0|        SharedObject::clearPtr(value);
  403|      0|    }
  404|    516|}
_ZNK6icu_7812UnifiedCache16_registerPrimaryEPKNS_12CacheKeyBaseEPKNS_12SharedObjectE:
  407|    516|            const CacheKeyBase *theKey, const SharedObject *value) const {
  408|    516|    theKey->fIsPrimary = true;
  409|    516|    value->cachePtr = this;
  410|    516|    ++fNumValuesTotal;
  411|    516|    ++fNumValuesInUse;
  412|    516|}
_ZNK6icu_7812UnifiedCache4_putEPK12UHashElementPKNS_12SharedObjectE10UErrorCode:
  417|    516|        const UErrorCode status) const {
  418|    516|    U_ASSERT(_inProgress(element));
  ------------------
  |  |   35|    516|#   define U_ASSERT(exp) (void)0
  ------------------
  419|    516|    const CacheKeyBase* theKey = static_cast<const CacheKeyBase*>(element->key.pointer);
  420|    516|    const SharedObject* oldValue = static_cast<const SharedObject*>(element->value.pointer);
  421|    516|    theKey->fCreationStatus = status;
  422|    516|    if (value->softRefCount == 0) {
  ------------------
  |  Branch (422:9): [True: 516, False: 0]
  ------------------
  423|    516|        _registerPrimary(theKey, value);
  424|    516|    }
  425|    516|    value->softRefCount++;
  426|    516|    UHashElement *ptr = const_cast<UHashElement *>(element);
  427|    516|    ptr->value.pointer = (void *) value;
  428|    516|    U_ASSERT(oldValue == fNoValue);
  ------------------
  |  |   35|    516|#   define U_ASSERT(exp) (void)0
  ------------------
  429|    516|    removeSoftRef(oldValue);
  430|       |
  431|       |    // Tell waiting threads that we replace in-progress status with
  432|       |    // an error.
  433|    516|    gInProgressValueAddedCond->notify_all();
  434|    516|}
_ZNK6icu_7812UnifiedCache6_fetchEPK12UHashElementRPKNS_12SharedObjectER10UErrorCode:
  439|  6.23k|        UErrorCode &status) const {
  440|  6.23k|    const CacheKeyBase* theKey = static_cast<const CacheKeyBase*>(element->key.pointer);
  441|  6.23k|    status = theKey->fCreationStatus;
  442|       |
  443|       |    // Since we have the cache lock, calling regular SharedObject add/removeRef
  444|       |    // could cause us to deadlock on ourselves since they may need to lock
  445|       |    // the cache mutex.
  446|  6.23k|    removeHardRef(value);
  447|  6.23k|    value = static_cast<const SharedObject *>(element->value.pointer);
  448|  6.23k|    addHardRef(value);
  449|  6.23k|}
_ZNK6icu_7812UnifiedCache11_inProgressEPK12UHashElement:
  452|  3.37k|UBool UnifiedCache::_inProgress(const UHashElement* element) const {
  453|  3.37k|    UErrorCode status = U_ZERO_ERROR;
  454|  3.37k|    const SharedObject * value = nullptr;
  455|  3.37k|    _fetch(element, value, status);
  456|  3.37k|    UBool result = _inProgress(value, status);
  457|  3.37k|    removeHardRef(value);
  458|  3.37k|    return result;
  459|  3.37k|}
_ZNK6icu_7812UnifiedCache11_inProgressEPKNS_12SharedObjectE10UErrorCode:
  462|  3.37k|        const SharedObject* theValue, UErrorCode creationStatus) const {
  463|  3.37k|    return (theValue == fNoValue && creationStatus == U_ZERO_ERROR);
  ------------------
  |  Branch (463:13): [True: 516, False: 2.86k]
  |  Branch (463:37): [True: 516, False: 0]
  ------------------
  464|  3.37k|}
_ZNK6icu_7812UnifiedCache13removeSoftRefEPKNS_12SharedObjectE:
  481|    516|void UnifiedCache::removeSoftRef(const SharedObject *value) const {
  482|    516|    U_ASSERT(value->cachePtr == this);
  ------------------
  |  |   35|    516|#   define U_ASSERT(exp) (void)0
  ------------------
  483|    516|    U_ASSERT(value->softRefCount > 0);
  ------------------
  |  |   35|    516|#   define U_ASSERT(exp) (void)0
  ------------------
  484|    516|    if (--value->softRefCount == 0) {
  ------------------
  |  Branch (484:9): [True: 0, False: 516]
  ------------------
  485|      0|        --fNumValuesTotal;
  486|      0|        if (value->noHardReferences()) {
  ------------------
  |  Branch (486:13): [True: 0, False: 0]
  ------------------
  487|      0|            delete value;
  488|      0|        } else {
  489|       |            // This path only happens from flush(all). Which only happens from the
  490|       |            // UnifiedCache destructor.  Nulling out value.cacheptr changes the behavior
  491|       |            // of value.removeRef(), causing the deletion to be done there.
  492|      0|            value->cachePtr = nullptr;
  493|      0|        }
  494|      0|    }
  495|    516|}
_ZNK6icu_7812UnifiedCache13removeHardRefEPKNS_12SharedObjectE:
  497|  9.61k|int32_t UnifiedCache::removeHardRef(const SharedObject *value) const {
  498|  9.61k|    int refCount = 0;
  499|  9.61k|    if (value) {
  ------------------
  |  Branch (499:9): [True: 3.37k, False: 6.23k]
  ------------------
  500|  3.37k|        refCount = umtx_atomic_dec(&value->hardRefCount);
  501|  3.37k|        U_ASSERT(refCount >= 0);
  ------------------
  |  |   35|  3.37k|#   define U_ASSERT(exp) (void)0
  ------------------
  502|  3.37k|        if (refCount == 0) {
  ------------------
  |  Branch (502:13): [True: 2.86k, False: 516]
  ------------------
  503|  2.86k|            --fNumValuesInUse;
  504|  2.86k|        }
  505|  3.37k|    }
  506|  9.61k|    return refCount;
  507|  9.61k|}
_ZNK6icu_7812UnifiedCache10addHardRefEPKNS_12SharedObjectE:
  509|  6.23k|int32_t UnifiedCache::addHardRef(const SharedObject *value) const {
  510|  6.23k|    int refCount = 0;
  511|  6.23k|    if (value) {
  ------------------
  |  Branch (511:9): [True: 6.23k, False: 0]
  ------------------
  512|  6.23k|        refCount = umtx_atomic_inc(&value->hardRefCount);
  513|  6.23k|        U_ASSERT(refCount >= 1);
  ------------------
  |  |   35|  6.23k|#   define U_ASSERT(exp) (void)0
  ------------------
  514|  6.23k|        if (refCount == 1) {
  ------------------
  |  Branch (514:13): [True: 5.72k, False: 516]
  ------------------
  515|  5.72k|            fNumValuesInUse++;
  516|  5.72k|        }
  517|  6.23k|    }
  518|  6.23k|    return refCount;
  519|  6.23k|}
unifiedcache.cpp:_ZN6icu_78L9cacheInitER10UErrorCode:
   70|      1|static void U_CALLCONV cacheInit(UErrorCode &status) {
   71|      1|    U_ASSERT(gCache == nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
   72|      1|    ucln_common_registerCleanup(
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   73|      1|            UCLN_COMMON_UNIFIED_CACHE, unifiedcache_cleanup);
   74|       |
   75|      1|    gCacheMutex = STATIC_NEW(std::mutex);
  ------------------
  |  |  144|      1|#define STATIC_NEW(type) [] () { \
  |  |  145|      1|    alignas(type) static char storage[sizeof(type)]; \
  |  |  146|      1|    return new(storage) type();} ()
  ------------------
   76|      1|    gInProgressValueAddedCond = STATIC_NEW(std::condition_variable);
  ------------------
  |  |  144|      1|#define STATIC_NEW(type) [] () { \
  |  |  145|      1|    alignas(type) static char storage[sizeof(type)]; \
  |  |  146|      1|    return new(storage) type();} ()
  ------------------
   77|      1|    gCache = new UnifiedCache(status);
   78|      1|    if (gCache == nullptr) {
  ------------------
  |  Branch (78:9): [True: 0, False: 1]
  ------------------
   79|      0|        status = U_MEMORY_ALLOCATION_ERROR;
   80|      0|    }
   81|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (81:9): [True: 0, False: 1]
  ------------------
   82|      0|        delete gCache;
   83|      0|        gCache = nullptr;
   84|      0|        return;
   85|      0|    }
   86|      1|}

_ZN6icu_7812CacheKeyBaseC2Ev:
   37|  3.37k|   CacheKeyBase() : fCreationStatus(U_ZERO_ERROR), fIsPrimary(false) {}
_ZN6icu_7812CacheKeyBaseC2ERKS0_:
   43|    516|           : UObject(other), fCreationStatus(other.fCreationStatus), fIsPrimary(false) { }
_ZN6icu_78eqERKNS_12CacheKeyBaseES2_:
   79|  3.37k|                                 const CacheKeyBase& rhs) {
   80|  3.37k|       return lhs.equals(rhs);
   81|  3.37k|   }
_ZN6icu_7812UnifiedCache11getByLocaleINS_17SharedPluralRulesEEEvRKNS_6LocaleERPKT_R10UErrorCode:
  269|  3.37k|           const Locale &loc, const T *&ptr, UErrorCode &status) {
  270|  3.37k|       const UnifiedCache *cache = getInstance(status);
  271|  3.37k|       if (U_FAILURE(status)) {
  ------------------
  |  Branch (271:12): [True: 0, False: 3.37k]
  ------------------
  272|      0|           return;
  273|      0|       }
  274|  3.37k|       cache->get(LocaleCacheKey<T>(loc), ptr, status);
  275|  3.37k|   }
_ZNK6icu_7812UnifiedCache3getINS_17SharedPluralRulesEEEvRKNS_8CacheKeyIT_EERPKS4_R10UErrorCode:
  205|  3.37k|           UErrorCode &status) const {
  206|  3.37k|       get(key, nullptr, ptr, status);
  207|  3.37k|   }
_ZNK6icu_7812UnifiedCache3getINS_17SharedPluralRulesEEEvRKNS_8CacheKeyIT_EEPKvRPKS4_R10UErrorCode:
  228|  3.37k|           UErrorCode &status) const {
  229|  3.37k|       if (U_FAILURE(status)) {
  ------------------
  |  Branch (229:12): [True: 0, False: 3.37k]
  ------------------
  230|      0|           return;
  231|      0|       }
  232|  3.37k|       UErrorCode creationStatus = U_ZERO_ERROR;
  233|  3.37k|       const SharedObject *value = nullptr;
  234|  3.37k|       _get(key, value, creationContext, creationStatus);
  235|  3.37k|       const T *tvalue = (const T *) value;
  236|  3.37k|       if (U_SUCCESS(creationStatus)) {
  ------------------
  |  Branch (236:12): [True: 3.37k, False: 0]
  ------------------
  237|  3.37k|           SharedObject::copyPtr(tvalue, ptr);
  238|  3.37k|       }
  239|  3.37k|       SharedObject::clearPtr(tvalue);
  240|       |       // Take care not to overwrite a warning status passed in with
  241|       |       // another warning or U_ZERO_ERROR.
  242|  3.37k|       if (status == U_ZERO_ERROR || U_FAILURE(creationStatus)) {
  ------------------
  |  Branch (242:12): [True: 0, False: 3.37k]
  |  Branch (242:38): [True: 0, False: 3.37k]
  ------------------
  243|      0|           status = creationStatus;
  244|      0|       }
  245|  3.37k|   }
_ZN6icu_7814LocaleCacheKeyINS_17SharedPluralRulesEEC2ERKNS_6LocaleE:
  151|  3.37k|   LocaleCacheKey(const Locale &loc) : fLoc(loc) {}
_ZNK6icu_788CacheKeyINS_17SharedPluralRulesEE8hashCodeEv:
  110|  4.40k|   virtual int32_t hashCode() const override {
  111|  4.40k|       const char *s = typeid(T).name();
  112|  4.40k|       return ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s)));
  ------------------
  |  | 1878|  4.40k|#define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN)
  |  |  ------------------
  |  |  |  |  123|  4.40k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.40k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.40k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                     return ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s)));
  ------------------
  |  |   37|  4.40k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  4.40k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  113|  4.40k|   }
_ZNK6icu_788CacheKeyINS_17SharedPluralRulesEE6equalsERKNS_12CacheKeyBaseE:
  129|  3.37k|   virtual bool equals(const CacheKeyBase &other) const override {
  130|  3.37k|       return this == &other || typeid(*this) == typeid(other);
  ------------------
  |  Branch (130:15): [True: 0, False: 3.37k]
  |  Branch (130:33): [True: 3.37k, False: 0]
  ------------------
  131|  3.37k|   }
_ZNK6icu_7814LocaleCacheKeyINS_17SharedPluralRulesEE8hashCodeEv:
  155|  4.40k|   virtual int32_t hashCode() const override {
  156|  4.40k|       return (int32_t)(37u * (uint32_t)CacheKey<T>::hashCode() + (uint32_t)fLoc.hashCode());
  157|  4.40k|   }
_ZNK6icu_7814LocaleCacheKeyINS_17SharedPluralRulesEE5cloneEv:
  161|    516|   virtual CacheKeyBase *clone() const override {
  162|    516|       return new LocaleCacheKey<T>(*this);
  163|    516|   }
_ZN6icu_7814LocaleCacheKeyINS_17SharedPluralRulesEEC2ERKS2_:
  153|    516|           : CacheKey<T>(other), fLoc(other.fLoc) { }
_ZNK6icu_7814LocaleCacheKeyINS_17SharedPluralRulesEE6equalsERKNS_12CacheKeyBaseE:
  142|  3.37k|   virtual bool equals(const CacheKeyBase &other) const override {
  143|  3.37k|       if (!CacheKey<T>::equals(other)) {
  ------------------
  |  Branch (143:12): [True: 0, False: 3.37k]
  ------------------
  144|      0|           return false;
  145|      0|       }
  146|       |       // We know this and other are of same class because equals() on
  147|       |       // CacheKey returned true.
  148|  3.37k|       return operator==(static_cast<const LocaleCacheKey<T> &>(other));
  149|  3.37k|   }
_ZNK6icu_7814LocaleCacheKeyINS_17SharedPluralRulesEEeqERKS2_:
  158|  3.37k|   inline bool operator == (const LocaleCacheKey<T> &other) const {
  159|  3.37k|       return fLoc == other.fLoc;
  160|  3.37k|   }
_ZN6icu_7814LocaleCacheKeyINS_17SharedPluralRulesEED2Ev:
  154|  3.37k|   virtual ~LocaleCacheKey() { }

_ZN6icu_7817UniqueCharStringsC2ER10UErrorCode:
   27|      1|    UniqueCharStrings(UErrorCode &errorCode) : strings(nullptr) {
   28|       |        // Note: We hash on string contents but store stable char16_t * pointers.
   29|       |        // If the strings are stored in resource bundles which should be built with
   30|       |        // duplicate elimination, then we should be able to hash on just the pointer values.
   31|      1|        uhash_init(&map, uhash_hashUChars, uhash_compareUChars, uhash_compareLong, &errorCode);
  ------------------
  |  | 1022|      1|#define uhash_init U_ICU_ENTRY_POINT_RENAME(uhash_init)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      uhash_init(&map, uhash_hashUChars, uhash_compareUChars, uhash_compareLong, &errorCode);
  ------------------
  |  | 1016|      1|#define uhash_hashUChars U_ICU_ENTRY_POINT_RENAME(uhash_hashUChars)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      uhash_init(&map, uhash_hashUChars, uhash_compareUChars, uhash_compareLong, &errorCode);
  ------------------
  |  |  998|      1|#define uhash_compareUChars U_ICU_ENTRY_POINT_RENAME(uhash_compareUChars)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      uhash_init(&map, uhash_hashUChars, uhash_compareUChars, uhash_compareLong, &errorCode);
  ------------------
  |  |  996|      1|#define uhash_compareLong U_ICU_ENTRY_POINT_RENAME(uhash_compareLong)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   32|      1|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (32:13): [True: 0, False: 1]
  ------------------
   33|      1|        strings = new CharString();
   34|      1|        if (strings == nullptr) {
  ------------------
  |  Branch (34:13): [True: 0, False: 1]
  ------------------
   35|      0|            errorCode = U_MEMORY_ALLOCATION_ERROR;
   36|      0|        }
   37|      1|    }
_ZN6icu_7817UniqueCharStrings3addEPKDsR10UErrorCode:
   58|  1.29k|    int32_t add(const char16_t*p, UErrorCode &errorCode) {
   59|  1.29k|        if (U_FAILURE(errorCode)) { return -1; }
  ------------------
  |  Branch (59:13): [True: 0, False: 1.29k]
  ------------------
   60|  1.29k|        if (isFrozen) {
  ------------------
  |  Branch (60:13): [True: 0, False: 1.29k]
  ------------------
   61|      0|            errorCode = U_NO_WRITE_PERMISSION;
   62|      0|            return -1;
   63|      0|        }
   64|       |        // The string points into the resource bundle.
   65|  1.29k|        int32_t oldIndex = uhash_geti(&map, p);
  ------------------
  |  | 1008|  1.29k|#define uhash_geti U_ICU_ENTRY_POINT_RENAME(uhash_geti)
  |  |  ------------------
  |  |  |  |  123|  1.29k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.29k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.29k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   66|  1.29k|        if (oldIndex != 0) {  // found duplicate
  ------------------
  |  Branch (66:13): [True: 476, False: 814]
  ------------------
   67|    476|            return oldIndex;
   68|    476|        }
   69|       |        // Explicit NUL terminator for the previous string.
   70|       |        // The strings object is also terminated with one implicit NUL.
   71|    814|        strings->append(0, errorCode);
   72|    814|        int32_t newIndex = strings->length();
   73|    814|        strings->appendInvariantChars(p, u_strlen(p), errorCode);
  ------------------
  |  |  393|    814|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|    814|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    814|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    814|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   74|    814|        uhash_puti(&map, const_cast<char16_t *>(p), newIndex, &errorCode);
  ------------------
  |  | 1033|    814|#define uhash_puti U_ICU_ENTRY_POINT_RENAME(uhash_puti)
  |  |  ------------------
  |  |  |  |  123|    814|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    814|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    814|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|    814|        return newIndex;
   76|  1.29k|    }
_ZN6icu_7817UniqueCharStrings6freezeEv:
  100|      1|    void freeze() { isFrozen = true; }
_ZNK6icu_7817UniqueCharStrings3getEi:
  106|  1.29k|    const char *get(int32_t i) const {
  107|  1.29k|        U_ASSERT(isFrozen);
  ------------------
  |  |   35|  1.29k|#   define U_ASSERT(exp) (void)0
  ------------------
  108|  1.29k|        return isFrozen && i > 0 ? strings->data() + i : nullptr;
  ------------------
  |  Branch (108:16): [True: 1.29k, False: 0]
  |  Branch (108:28): [True: 1.29k, False: 0]
  ------------------
  109|  1.29k|    }
_ZN6icu_7817UniqueCharStrings17orphanCharStringsEv:
   44|      1|    CharString *orphanCharStrings() {
   45|      1|        CharString *result = strings;
   46|      1|        strings = nullptr;
   47|      1|        return result;
   48|      1|    }
_ZN6icu_7817UniqueCharStringsD2Ev:
   38|      1|    ~UniqueCharStrings() {
   39|      1|        uhash_close(&map);
  ------------------
  |  |  991|      1|#define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   40|      1|        delete strings;
   41|      1|    }

_ZN6icu_7811ReplaceableD2Ev:
  106|   242M|Replaceable::~Replaceable() {}
_ZN6icu_7813UnicodeString6addRefEv:
  146|  11.1k|UnicodeString::addRef() {
  147|  11.1k|  umtx_atomic_inc(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1);
  148|  11.1k|}
_ZN6icu_7813UnicodeString9removeRefEv:
  151|  12.9k|UnicodeString::removeRef() {
  152|  12.9k|  return umtx_atomic_dec(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1);
  153|  12.9k|}
_ZNK6icu_7813UnicodeString8refCountEv:
  156|  21.8k|UnicodeString::refCount() const {
  157|  21.8k|  return umtx_loadAcquire(*(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1));
  158|  21.8k|}
_ZN6icu_7813UnicodeString12releaseArrayEv:
  161|   484M|UnicodeString::releaseArray() {
  162|   484M|  if((fUnion.fFields.fLengthAndFlags & kRefCounted) && removeRef() == 0) {
  ------------------
  |  Branch (162:6): [True: 12.9k, False: 484M]
  |  Branch (162:56): [True: 1.80k, False: 11.1k]
  ------------------
  163|  1.80k|    uprv_free(reinterpret_cast<int32_t*>(fUnion.fFields.fArray) - 1);
  ------------------
  |  | 1503|  1.80k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  1.80k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.80k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.80k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  164|  1.80k|  }
  165|   484M|}
_ZN6icu_7813UnicodeStringC2EaNS_14ConstChar16PtrEi:
  241|   187k|                             int32_t textLength) {
  242|   187k|  fUnion.fFields.fLengthAndFlags = kReadonlyAlias;
  243|   187k|  const char16_t *text = textPtr;
  244|   187k|  if(text == nullptr) {
  ------------------
  |  Branch (244:6): [True: 0, False: 187k]
  ------------------
  245|       |    // treat as an empty string, do not alias
  246|      0|    setToEmpty();
  247|   187k|  } else if(textLength < -1 ||
  ------------------
  |  Branch (247:13): [True: 0, False: 187k]
  ------------------
  248|   187k|            (textLength == -1 && !isTerminated) ||
  ------------------
  |  Branch (248:14): [True: 9.33k, False: 177k]
  |  Branch (248:34): [True: 0, False: 9.33k]
  ------------------
  249|   187k|            (textLength >= 0 && isTerminated && text[textLength] != 0)
  ------------------
  |  Branch (249:14): [True: 177k, False: 9.33k]
  |  Branch (249:33): [True: 168k, False: 9.25k]
  |  Branch (249:49): [True: 0, False: 168k]
  ------------------
  250|   187k|  ) {
  251|      0|    setToBogus();
  252|   187k|  } else {
  253|   187k|    if(textLength == -1) {
  ------------------
  |  Branch (253:8): [True: 9.33k, False: 177k]
  ------------------
  254|       |      // text is terminated, or else it would have failed the above test
  255|  9.33k|      textLength = u_strlen(text);
  ------------------
  |  |  393|  9.33k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|  9.33k|    }
  257|   187k|    setArray(const_cast<char16_t *>(text), textLength,
  258|   187k|             isTerminated ? textLength + 1 : textLength);
  ------------------
  |  Branch (258:14): [True: 177k, False: 9.25k]
  ------------------
  259|   187k|  }
  260|   187k|}
_ZN6icu_7813UnicodeStringC2EPKciNS0_10EInvariantE:
  284|  1.14k|UnicodeString::UnicodeString(const char *src, int32_t length, EInvariant) {
  285|  1.14k|  fUnion.fFields.fLengthAndFlags = kShortString;
  286|  1.14k|  if(src==nullptr) {
  ------------------
  |  Branch (286:6): [True: 0, False: 1.14k]
  ------------------
  287|       |    // treat as an empty string
  288|  1.14k|  } else {
  289|  1.14k|    if(length<0) {
  ------------------
  |  Branch (289:8): [True: 1.14k, False: 0]
  ------------------
  290|  1.14k|      length = static_cast<int32_t>(uprv_strlen(src));
  ------------------
  |  |   37|  1.14k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.14k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  291|  1.14k|    }
  292|  1.14k|    if(cloneArrayIfNeeded(length, length, false)) {
  ------------------
  |  Branch (292:8): [True: 1.14k, False: 0]
  ------------------
  293|  1.14k|      u_charsToUChars(src, getArrayStart(), length);
  ------------------
  |  |  226|  1.14k|#define u_charsToUChars U_ICU_ENTRY_POINT_RENAME(u_charsToUChars)
  |  |  ------------------
  |  |  |  |  123|  1.14k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.14k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.14k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  294|  1.14k|      setLength(length);
  295|  1.14k|    } else {
  296|      0|      setToBogus();
  297|      0|    }
  298|  1.14k|  }
  299|  1.14k|}
_ZN6icu_7813UnicodeStringC2ERKS0_:
  345|   241M|UnicodeString::UnicodeString(const UnicodeString& that) {
  346|   241M|  fUnion.fFields.fLengthAndFlags = kShortString;
  347|   241M|  copyFrom(that);
  348|   241M|}
_ZN6icu_7813UnicodeStringC2EOS0_:
  350|     77|UnicodeString::UnicodeString(UnicodeString &&src) noexcept {
  351|     77|  copyFieldsFrom(src, true);
  352|     77|}
_ZN6icu_7813UnicodeStringC2ERKS0_ii:
  362|  61.9k|                             int32_t srcLength) {
  363|  61.9k|  fUnion.fFields.fLengthAndFlags = kShortString;
  364|  61.9k|  setTo(that, srcStart, srcLength);
  365|  61.9k|}
_ZN6icu_7813UnicodeString8allocateEi:
  409|   202k|UnicodeString::allocate(int32_t capacity) {
  410|   202k|  if(capacity <= US_STACKBUF_SIZE) {
  ------------------
  |  Branch (410:6): [True: 199k, False: 3.25k]
  ------------------
  411|   199k|    fUnion.fFields.fLengthAndFlags = kShortString;
  412|   199k|    return true;
  413|   199k|  }
  414|  3.25k|  if(capacity <= kMaxCapacity) {
  ------------------
  |  Branch (414:6): [True: 3.25k, False: 0]
  ------------------
  415|  3.25k|    ++capacity;  // for the NUL
  416|       |    // Switch to size_t which is unsigned so that we can allocate up to 4GB.
  417|       |    // Reference counter + UChars.
  418|  3.25k|    size_t numBytes = sizeof(int32_t) + static_cast<size_t>(capacity) * U_SIZEOF_UCHAR;
  ------------------
  |  |  352|  3.25k|#define U_SIZEOF_UCHAR 2
  ------------------
  419|       |    // Round up to a multiple of 16.
  420|  3.25k|    numBytes = (numBytes + 15) & ~15;
  421|  3.25k|    int32_t* array = static_cast<int32_t*>(uprv_malloc(numBytes));
  ------------------
  |  | 1524|  3.25k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  3.25k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.25k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.25k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  422|  3.25k|    if(array != nullptr) {
  ------------------
  |  Branch (422:8): [True: 3.25k, False: 0]
  ------------------
  423|       |      // set initial refCount and point behind the refCount
  424|  3.25k|      *array++ = 1;
  425|  3.25k|      numBytes -= sizeof(int32_t);
  426|       |
  427|       |      // have fArray point to the first char16_t
  428|  3.25k|      fUnion.fFields.fArray = reinterpret_cast<char16_t*>(array);
  429|  3.25k|      fUnion.fFields.fCapacity = static_cast<int32_t>(numBytes / U_SIZEOF_UCHAR);
  ------------------
  |  |  352|  3.25k|#define U_SIZEOF_UCHAR 2
  ------------------
  430|  3.25k|      fUnion.fFields.fLengthAndFlags = kLongString;
  431|  3.25k|      return true;
  432|  3.25k|    }
  433|  3.25k|  }
  434|      0|  fUnion.fFields.fLengthAndFlags = kIsBogus;
  435|      0|  fUnion.fFields.fArray = nullptr;
  436|      0|  fUnion.fFields.fCapacity = 0;
  437|      0|  return false;
  438|  3.25k|}
_ZN6icu_7813UnicodeStringD2Ev:
  462|   242M|{
  463|       |#ifdef UNISTR_COUNT_FINAL_STRING_LENGTHS
  464|       |  // Count lengths of strings at the end of their lifetime.
  465|       |  // Useful for discussion of a desirable stack buffer size.
  466|       |  // Count the contents length, not the optional NUL terminator nor further capacity.
  467|       |  // Ignore open-buffer strings and strings which alias external storage.
  468|       |  if((fUnion.fFields.fLengthAndFlags&(kOpenGetBuffer|kReadonlyAlias|kWritableAlias)) == 0) {
  469|       |    if(hasShortLength()) {
  470|       |      umtx_atomic_inc(finalLengthCounts + getShortLength());
  471|       |    } else {
  472|       |      umtx_atomic_inc(&beyondCount);
  473|       |    }
  474|       |  }
  475|       |#endif
  476|       |
  477|   242M|  releaseArray();
  478|   242M|}
_ZN6icu_7813UnicodeStringaSERKS0_:
  527|   206k|UnicodeString::operator=(const UnicodeString &src) {
  528|   206k|  return copyFrom(src);
  529|   206k|}
_ZN6icu_7813UnicodeString12fastCopyFromERKS0_:
  532|     71|UnicodeString::fastCopyFrom(const UnicodeString &src) {
  533|     71|  return copyFrom(src, true);
  534|     71|}
_ZN6icu_7813UnicodeString8copyFromERKS0_a:
  537|   241M|UnicodeString::copyFrom(const UnicodeString &src, UBool fastCopy) {
  538|       |  // if assigning to ourselves, do nothing
  539|   241M|  if(this == &src) {
  ------------------
  |  Branch (539:6): [True: 0, False: 241M]
  ------------------
  540|      0|    return *this;
  541|      0|  }
  542|       |
  543|       |  // is the right side bogus?
  544|   241M|  if(src.isBogus()) {
  ------------------
  |  Branch (544:6): [True: 9.41k, False: 241M]
  ------------------
  545|  9.41k|    setToBogus();
  546|  9.41k|    return *this;
  547|  9.41k|  }
  548|       |
  549|       |  // delete the current contents
  550|   241M|  releaseArray();
  551|       |
  552|   241M|  if(src.isEmpty()) {
  ------------------
  |  Branch (552:6): [True: 2.19k, False: 241M]
  ------------------
  553|       |    // empty string - use the stack buffer
  554|  2.19k|    setToEmpty();
  555|  2.19k|    return *this;
  556|  2.19k|  }
  557|       |
  558|       |  // fLength>0 and not an "open" src.getBuffer(minCapacity)
  559|   241M|  fUnion.fFields.fLengthAndFlags = src.fUnion.fFields.fLengthAndFlags;
  560|   241M|  switch(src.fUnion.fFields.fLengthAndFlags & kAllStorageFlags) {
  561|   241M|  case kShortString:
  ------------------
  |  Branch (561:3): [True: 241M, False: 205k]
  ------------------
  562|       |    // short string using the stack buffer, do the same
  563|   241M|    uprv_memcpy(fUnion.fStackFields.fBuffer, src.fUnion.fStackFields.fBuffer,
  ------------------
  |  |   42|   241M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   241M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   241M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   241M|    _Pragma("clang diagnostic push") \
  |  |   45|   241M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   241M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   241M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   241M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   241M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   241M|    _Pragma("clang diagnostic pop") \
  |  |   49|   241M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   241M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   241M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   241M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  564|   241M|                getShortLength() * U_SIZEOF_UCHAR);
  565|   241M|    break;
  566|  11.1k|  case kLongString:
  ------------------
  |  Branch (566:3): [True: 11.1k, False: 241M]
  ------------------
  567|       |    // src uses a refCounted string buffer, use that buffer with refCount
  568|       |    // src is const, use a cast - we don't actually change it
  569|  11.1k|    const_cast<UnicodeString &>(src).addRef();
  570|       |    // copy all fields, share the reference-counted buffer
  571|  11.1k|    fUnion.fFields.fArray = src.fUnion.fFields.fArray;
  572|  11.1k|    fUnion.fFields.fCapacity = src.fUnion.fFields.fCapacity;
  573|  11.1k|    if(!hasShortLength()) {
  ------------------
  |  Branch (573:8): [True: 0, False: 11.1k]
  ------------------
  574|      0|      fUnion.fFields.fLength = src.fUnion.fFields.fLength;
  575|      0|    }
  576|  11.1k|    break;
  577|   194k|  case kReadonlyAlias:
  ------------------
  |  Branch (577:3): [True: 194k, False: 241M]
  ------------------
  578|   194k|    if(fastCopy) {
  ------------------
  |  Branch (578:8): [True: 71, False: 194k]
  ------------------
  579|       |      // src is a readonly alias, do the same
  580|       |      // -> maintain the readonly alias as such
  581|     71|      fUnion.fFields.fArray = src.fUnion.fFields.fArray;
  582|     71|      fUnion.fFields.fCapacity = src.fUnion.fFields.fCapacity;
  583|     71|      if(!hasShortLength()) {
  ------------------
  |  Branch (583:10): [True: 0, False: 71]
  ------------------
  584|      0|        fUnion.fFields.fLength = src.fUnion.fFields.fLength;
  585|      0|      }
  586|     71|      break;
  587|     71|    }
  588|       |    // else if(!fastCopy) fall through to case kWritableAlias
  589|       |    // -> allocate a new buffer and copy the contents
  590|   194k|    U_FALLTHROUGH;
  ------------------
  |  |  511|   194k|#       define U_FALLTHROUGH [[clang::fallthrough]]
  ------------------
  591|   194k|  case kWritableAlias: {
  ------------------
  |  Branch (591:3): [True: 0, False: 241M]
  ------------------
  592|       |    // src is a writable alias; we make a copy of that instead
  593|   194k|    int32_t srcLength = src.length();
  594|   194k|    if(allocate(srcLength)) {
  ------------------
  |  Branch (594:8): [True: 194k, False: 0]
  ------------------
  595|   194k|      u_memcpy(getArrayStart(), src.getArrayStart(), srcLength);
  ------------------
  |  |  334|   194k|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|   194k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   194k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   194k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  596|   194k|      setLength(srcLength);
  597|   194k|      break;
  598|   194k|    }
  599|       |    // if there is not enough memory, then fall through to setting to bogus
  600|      0|    U_FALLTHROUGH;
  ------------------
  |  |  511|      0|#       define U_FALLTHROUGH [[clang::fallthrough]]
  ------------------
  601|      0|  }
  602|      0|  default:
  ------------------
  |  Branch (602:3): [True: 0, False: 241M]
  ------------------
  603|       |    // if src is bogus, set ourselves to bogus
  604|       |    // do not call setToBogus() here because fArray and flags are not consistent here
  605|      0|    fUnion.fFields.fLengthAndFlags = kIsBogus;
  606|      0|    fUnion.fFields.fArray = nullptr;
  607|      0|    fUnion.fFields.fCapacity = 0;
  608|      0|    break;
  609|   241M|  }
  610|       |
  611|   241M|  return *this;
  612|   241M|}
_ZN6icu_7813UnicodeStringaSEOS0_:
  614|  98.7k|UnicodeString &UnicodeString::operator=(UnicodeString &&src) noexcept {
  615|       |  // No explicit check for self move assignment, consistent with standard library.
  616|       |  // Self move assignment causes no crash nor leak but might make the object bogus.
  617|  98.7k|  releaseArray();
  618|  98.7k|  copyFieldsFrom(src, true);
  619|  98.7k|  return *this;
  620|  98.7k|}
_ZN6icu_7813UnicodeString14copyFieldsFromERS0_a:
  623|  98.8k|void UnicodeString::copyFieldsFrom(UnicodeString &src, UBool setSrcToBogus) noexcept {
  624|  98.8k|  int16_t lengthAndFlags = fUnion.fFields.fLengthAndFlags = src.fUnion.fFields.fLengthAndFlags;
  625|  98.8k|  if(lengthAndFlags & kUsingStackBuffer) {
  ------------------
  |  Branch (625:6): [True: 74.3k, False: 24.4k]
  ------------------
  626|       |    // Short string using the stack buffer, copy the contents.
  627|       |    // Check for self assignment to prevent "overlap in memcpy" warnings,
  628|       |    // although it should be harmless to copy a buffer to itself exactly.
  629|  74.3k|    if(this != &src) {
  ------------------
  |  Branch (629:8): [True: 74.3k, False: 0]
  ------------------
  630|  74.3k|      uprv_memcpy(fUnion.fStackFields.fBuffer, src.fUnion.fStackFields.fBuffer,
  ------------------
  |  |   42|  74.3k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  74.3k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  74.3k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  74.3k|    _Pragma("clang diagnostic push") \
  |  |   45|  74.3k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  74.3k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  74.3k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  74.3k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  74.3k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  74.3k|    _Pragma("clang diagnostic pop") \
  |  |   49|  74.3k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  74.3k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  74.3k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  74.3k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  631|  74.3k|                  getShortLength() * U_SIZEOF_UCHAR);
  632|  74.3k|    }
  633|  74.3k|  } else {
  634|       |    // In all other cases, copy all fields.
  635|  24.4k|    fUnion.fFields.fArray = src.fUnion.fFields.fArray;
  636|  24.4k|    fUnion.fFields.fCapacity = src.fUnion.fFields.fCapacity;
  637|  24.4k|    if(!hasShortLength()) {
  ------------------
  |  Branch (637:8): [True: 0, False: 24.4k]
  ------------------
  638|      0|      fUnion.fFields.fLength = src.fUnion.fFields.fLength;
  639|      0|    }
  640|  24.4k|    if(setSrcToBogus) {
  ------------------
  |  Branch (640:8): [True: 24.4k, False: 0]
  ------------------
  641|       |      // Set src to bogus without releasing any memory.
  642|  24.4k|      src.fUnion.fFields.fLengthAndFlags = kIsBogus;
  643|  24.4k|      src.fUnion.fFields.fArray = nullptr;
  644|  24.4k|      src.fUnion.fFields.fCapacity = 0;
  645|  24.4k|    }
  646|  24.4k|  }
  647|  98.8k|}
_ZNK6icu_7813UnicodeString8doEqualsEPKDsi:
  698|     63|UnicodeString::doEquals(const char16_t *text, int32_t len) const {
  699|       |  // Requires: this not bogus and have same lengths.
  700|       |  // Byte-wise comparison works for equality regardless of endianness.
  701|     63|  return uprv_memcmp(getArrayStart(), text, len * U_SIZEOF_UCHAR) == 0;
  ------------------
  |  |  101|     63|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|     63|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  702|     63|}
_ZNK6icu_7813UnicodeString9doCompareEiiPKDsii:
  752|  57.5k|{
  753|       |  // compare illegal string values
  754|  57.5k|  if(isBogus()) {
  ------------------
  |  Branch (754:6): [True: 0, False: 57.5k]
  ------------------
  755|      0|    return -1;
  756|      0|  }
  757|       |  
  758|       |  // pin indices to legal values
  759|  57.5k|  pinIndices(start, length);
  760|       |
  761|  57.5k|  if(srcChars == nullptr) {
  ------------------
  |  Branch (761:6): [True: 0, False: 57.5k]
  ------------------
  762|       |    // treat const char16_t *srcChars==nullptr as an empty string
  763|      0|    return length == 0 ? 0 : 1;
  ------------------
  |  Branch (763:12): [True: 0, False: 0]
  ------------------
  764|      0|  }
  765|       |
  766|       |  // get the correct pointer
  767|  57.5k|  const char16_t *chars = getArrayStart();
  768|       |
  769|  57.5k|  chars += start;
  770|  57.5k|  srcChars += srcStart;
  771|       |
  772|  57.5k|  int32_t minLength;
  773|  57.5k|  int8_t lengthResult;
  774|       |
  775|       |  // get the srcLength if necessary
  776|  57.5k|  if(srcLength < 0) {
  ------------------
  |  Branch (776:6): [True: 0, False: 57.5k]
  ------------------
  777|      0|    srcLength = u_strlen(srcChars + srcStart);
  ------------------
  |  |  393|      0|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  778|      0|  }
  779|       |
  780|       |  // are we comparing different lengths?
  781|  57.5k|  if(length != srcLength) {
  ------------------
  |  Branch (781:6): [True: 36.9k, False: 20.6k]
  ------------------
  782|  36.9k|    if(length < srcLength) {
  ------------------
  |  Branch (782:8): [True: 1.44k, False: 35.4k]
  ------------------
  783|  1.44k|      minLength = length;
  784|  1.44k|      lengthResult = -1;
  785|  35.4k|    } else {
  786|  35.4k|      minLength = srcLength;
  787|  35.4k|      lengthResult = 1;
  788|  35.4k|    }
  789|  36.9k|  } else {
  790|  20.6k|    minLength = length;
  791|  20.6k|    lengthResult = 0;
  792|  20.6k|  }
  793|       |
  794|       |  /*
  795|       |   * note that uprv_memcmp() returns an int but we return an int8_t;
  796|       |   * we need to take care not to truncate the result -
  797|       |   * one way to do this is to right-shift the value to
  798|       |   * move the sign bit into the lower 8 bits and making sure that this
  799|       |   * does not become 0 itself
  800|       |   */
  801|       |
  802|  57.5k|  if(minLength > 0 && chars != srcChars) {
  ------------------
  |  Branch (802:6): [True: 57.5k, False: 0]
  |  Branch (802:23): [True: 57.5k, False: 12]
  ------------------
  803|  57.5k|    int32_t result;
  804|       |
  805|       |#   if U_IS_BIG_ENDIAN 
  806|       |      // big-endian: byte comparison works
  807|       |      result = uprv_memcmp(chars, srcChars, minLength * sizeof(char16_t));
  808|       |      if(result != 0) {
  809|       |        return (int8_t)(result >> 15 | 1);
  810|       |      }
  811|       |#   else
  812|       |      // little-endian: compare char16_t units
  813|   107k|      do {
  814|   107k|        result = static_cast<int32_t>(*(chars++)) - static_cast<int32_t>(*(srcChars++));
  815|   107k|        if(result != 0) {
  ------------------
  |  Branch (815:12): [True: 41.3k, False: 66.4k]
  ------------------
  816|  41.3k|          return static_cast<int8_t>(result >> 15 | 1);
  817|  41.3k|        }
  818|   107k|      } while(--minLength > 0);
  ------------------
  |  Branch (818:15): [True: 50.1k, False: 16.2k]
  ------------------
  819|  57.5k|#   endif
  820|  57.5k|  }
  821|  16.2k|  return lengthResult;
  822|  57.5k|}
_ZNK6icu_7813UnicodeString8char32AtEi:
  871|  22.5M|{
  872|  22.5M|  int32_t len = length();
  873|  22.5M|  if (static_cast<uint32_t>(offset) < static_cast<uint32_t>(len)) {
  ------------------
  |  Branch (873:7): [True: 22.5M, False: 0]
  ------------------
  874|  22.5M|    const char16_t *array = getArrayStart();
  875|  22.5M|    UChar32 c;
  876|  22.5M|    U16_GET(array, 0, offset, len, c);
  ------------------
  |  |  201|  22.5M|#define U16_GET(s, start, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  22.5M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  202|  22.5M|    (c)=(s)[i]; \
  |  |  203|  22.5M|    if(U16_IS_SURROGATE(c)) { \
  |  |  ------------------
  |  |  |  |   75|  22.5M|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  22.5M|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:27): [True: 237k, False: 22.3M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  204|   237k|        uint16_t __c2; \
  |  |  205|   237k|        if(U16_IS_SURROGATE_LEAD(c)) { \
  |  |  ------------------
  |  |  |  |   84|   237k|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:34): [True: 230k, False: 6.24k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  206|   230k|            if((i)+1!=(length) && U16_IS_TRAIL(__c2=(s)[(i)+1])) { \
  |  |  ------------------
  |  |  |  |   67|   230k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 5.05k, False: 225k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (206:16): [True: 230k, False: 0]
  |  |  ------------------
  |  |  207|  5.05k|                (c)=U16_GET_SUPPLEMENTARY((c), __c2); \
  |  |  ------------------
  |  |  |  |  113|  5.05k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  |  |  ------------------
  |  |  |  |  |  |   99|  5.05k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  208|  5.05k|            } \
  |  |  209|   230k|        } else { \
  |  |  210|  6.24k|            if((i)>(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \
  |  |  ------------------
  |  |  |  |   59|  6.23k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 0, False: 6.23k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (210:16): [True: 6.23k, False: 6]
  |  |  ------------------
  |  |  211|      0|                (c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \
  |  |  ------------------
  |  |  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  |  |  ------------------
  |  |  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  212|      0|            } \
  |  |  213|  6.24k|        } \
  |  |  214|   237k|    } \
  |  |  215|  22.5M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  22.5M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  877|  22.5M|    return c;
  878|  22.5M|  } else {
  879|      0|    return kInvalidUChar;
  880|      0|  }
  881|  22.5M|}
_ZNK6icu_7813UnicodeString11countChar32Eii:
  907|   102k|UnicodeString::countChar32(int32_t start, int32_t length) const {
  908|   102k|  pinIndices(start, length);
  909|       |  // if(isBogus()) then fArray==0 and start==0 - u_countChar32() checks for nullptr
  910|   102k|  return u_countChar32(getArrayStart()+start, length);
  ------------------
  |  |  228|   102k|#define u_countChar32 U_ICU_ENTRY_POINT_RENAME(u_countChar32)
  |  |  ------------------
  |  |  |  |  123|   102k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   102k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   102k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  911|   102k|}
_ZNK6icu_7813UnicodeString13tempSubStringEii:
  998|  1.29k|UnicodeString::tempSubString(int32_t start, int32_t len) const {
  999|  1.29k|  pinIndices(start, len);
 1000|  1.29k|  const char16_t *array = getBuffer();  // not getArrayStart() to check kIsBogus & kOpenGetBuffer
 1001|  1.29k|  if(array==nullptr) {
  ------------------
  |  Branch (1001:6): [True: 0, False: 1.29k]
  ------------------
 1002|      0|    array=fUnion.fStackFields.fBuffer;  // anything not nullptr because that would make an empty string
 1003|      0|    len=-2;  // bogus result string
 1004|      0|  }
 1005|  1.29k|  return UnicodeString(false, array + start, len);
 1006|  1.29k|}
_ZN6icu_7813UnicodeString10setToBogusEv:
 1283|  56.8k|{
 1284|  56.8k|  releaseArray();
 1285|       |
 1286|  56.8k|  fUnion.fFields.fLengthAndFlags = kIsBogus;
 1287|  56.8k|  fUnion.fFields.fArray = nullptr;
 1288|  56.8k|  fUnion.fFields.fCapacity = 0;
 1289|  56.8k|}
_ZN6icu_7813UnicodeString7unBogusEv:
 1293|   180k|UnicodeString::unBogus() {
 1294|   180k|  if(fUnion.fFields.fLengthAndFlags & kIsBogus) {
  ------------------
  |  Branch (1294:6): [True: 0, False: 180k]
  ------------------
 1295|      0|    setToEmpty();
 1296|      0|  }
 1297|   180k|}
_ZN6icu_7813UnicodeString5setToEaNS_14ConstChar16PtrEi:
 1342|  20.4k|{
 1343|  20.4k|  if(fUnion.fFields.fLengthAndFlags & kOpenGetBuffer) {
  ------------------
  |  Branch (1343:6): [True: 0, False: 20.4k]
  ------------------
 1344|       |    // do not modify a string that has an "open" getBuffer(minCapacity)
 1345|      0|    return *this;
 1346|      0|  }
 1347|       |
 1348|  20.4k|  const char16_t *text = textPtr;
 1349|  20.4k|  if(text == nullptr) {
  ------------------
  |  Branch (1349:6): [True: 0, False: 20.4k]
  ------------------
 1350|       |    // treat as an empty string, do not alias
 1351|      0|    releaseArray();
 1352|      0|    setToEmpty();
 1353|      0|    return *this;
 1354|      0|  }
 1355|       |
 1356|  20.4k|  if( textLength < -1 ||
  ------------------
  |  Branch (1356:7): [True: 0, False: 20.4k]
  ------------------
 1357|  20.4k|      (textLength == -1 && !isTerminated) ||
  ------------------
  |  Branch (1357:8): [True: 0, False: 20.4k]
  |  Branch (1357:28): [True: 0, False: 0]
  ------------------
 1358|  20.4k|      (textLength >= 0 && isTerminated && text[textLength] != 0)
  ------------------
  |  Branch (1358:8): [True: 20.4k, False: 0]
  |  Branch (1358:27): [True: 20.4k, False: 1]
  |  Branch (1358:43): [True: 0, False: 20.4k]
  ------------------
 1359|  20.4k|  ) {
 1360|      0|    setToBogus();
 1361|      0|    return *this;
 1362|      0|  }
 1363|       |
 1364|  20.4k|  releaseArray();
 1365|       |
 1366|  20.4k|  if(textLength == -1) {
  ------------------
  |  Branch (1366:6): [True: 0, False: 20.4k]
  ------------------
 1367|       |    // text is terminated, or else it would have failed the above test
 1368|      0|    textLength = u_strlen(text);
  ------------------
  |  |  393|      0|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1369|      0|  }
 1370|  20.4k|  fUnion.fFields.fLengthAndFlags = kReadonlyAlias;
 1371|  20.4k|  setArray(const_cast<char16_t*>(text), textLength, isTerminated ? textLength + 1 : textLength);
  ------------------
  |  Branch (1371:53): [True: 20.4k, False: 1]
  ------------------
 1372|  20.4k|  return *this;
 1373|  20.4k|}
_ZN6icu_7813UnicodeString9setCharAtEiDs:
 1439|  24.3k|{
 1440|  24.3k|  int32_t len = length();
 1441|  24.3k|  if(cloneArrayIfNeeded() && len > 0) {
  ------------------
  |  Branch (1441:6): [True: 24.3k, False: 0]
  |  Branch (1441:30): [True: 24.3k, False: 0]
  ------------------
 1442|  24.3k|    if(offset < 0) {
  ------------------
  |  Branch (1442:8): [True: 0, False: 24.3k]
  ------------------
 1443|      0|      offset = 0;
 1444|  24.3k|    } else if(offset >= len) {
  ------------------
  |  Branch (1444:15): [True: 0, False: 24.3k]
  ------------------
 1445|      0|      offset = len - 1;
 1446|      0|    }
 1447|       |
 1448|  24.3k|    getArrayStart()[offset] = c;
 1449|  24.3k|  }
 1450|  24.3k|  return *this;
 1451|  24.3k|}
_ZN6icu_7813UnicodeString7replaceEiii:
 1456|   111k|               UChar32 srcChar) {
 1457|   111k|  char16_t buffer[U16_MAX_LENGTH];
 1458|   111k|  int32_t count = 0;
 1459|   111k|  UBool isError = false;
 1460|   111k|  U16_APPEND(buffer, count, U16_MAX_LENGTH, srcChar, isError);
  ------------------
  |  |  393|   111k|#define U16_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   111k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  394|   111k|    if((uint32_t)(c)<=0xffff) { \
  |  |  ------------------
  |  |  |  Branch (394:8): [True: 109k, False: 1.96k]
  |  |  ------------------
  |  |  395|   109k|        (s)[(i)++]=(uint16_t)(c); \
  |  |  396|   109k|    } else if((uint32_t)(c)<=0x10ffff && (i)+1<(capacity)) { \
  |  |  ------------------
  |  |  |  Branch (396:15): [True: 1.96k, False: 0]
  |  |  |  Branch (396:42): [True: 1.96k, False: 0]
  |  |  ------------------
  |  |  397|  1.96k|        (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
  |  |  398|  1.96k|        (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
  |  |  399|  1.96k|    } else /* c>0x10ffff or not enough space */ { \
  |  |  400|      0|        (isError)=true; \
  |  |  401|      0|    } \
  |  |  402|   111k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   111k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1461|       |  // We test isError so that the compiler does not complain that we don't.
 1462|       |  // If isError (srcChar is not a valid code point) then count==0 which means
 1463|       |  // we remove the source segment rather than replacing it with srcChar.
 1464|   111k|  return doReplace(start, _length, buffer, 0, isError ? 0 : count);
  ------------------
  |  Branch (1464:47): [True: 0, False: 111k]
  ------------------
 1465|   111k|}
_ZN6icu_7813UnicodeString6appendEi:
 1468|  92.6k|UnicodeString::append(UChar32 srcChar) {
 1469|  92.6k|  char16_t buffer[U16_MAX_LENGTH];
 1470|  92.6k|  int32_t _length = 0;
 1471|  92.6k|  UBool isError = false;
 1472|  92.6k|  U16_APPEND(buffer, _length, U16_MAX_LENGTH, srcChar, isError);
  ------------------
  |  |  393|  92.6k|#define U16_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  92.6k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  394|  92.6k|    if((uint32_t)(c)<=0xffff) { \
  |  |  ------------------
  |  |  |  Branch (394:8): [True: 92.6k, False: 0]
  |  |  ------------------
  |  |  395|  92.6k|        (s)[(i)++]=(uint16_t)(c); \
  |  |  396|  92.6k|    } else if((uint32_t)(c)<=0x10ffff && (i)+1<(capacity)) { \
  |  |  ------------------
  |  |  |  Branch (396:15): [True: 0, False: 0]
  |  |  |  Branch (396:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  397|      0|        (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
  |  |  398|      0|        (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
  |  |  399|      0|    } else /* c>0x10ffff or not enough space */ { \
  |  |  400|      0|        (isError)=true; \
  |  |  401|      0|    } \
  |  |  402|  92.6k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  92.6k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1473|       |  // We test isError so that the compiler does not complain that we don't.
 1474|       |  // If isError then _length==0 which turns the doAppend() into a no-op anyway.
 1475|  92.6k|  return isError ? *this : doAppend(buffer, 0, _length);
  ------------------
  |  Branch (1475:10): [True: 0, False: 92.6k]
  ------------------
 1476|  92.6k|}
_ZN6icu_7813UnicodeString9doReplaceEiiRKS0_ii:
 1484|  61.9k|{
 1485|       |  // pin the indices to legal values
 1486|  61.9k|  src.pinIndices(srcStart, srcLength);
 1487|       |
 1488|       |  // get the characters from src
 1489|       |  // and replace the range in ourselves with them
 1490|  61.9k|  return doReplace(start, length, src.getArrayStart(), srcStart, srcLength);
 1491|  61.9k|}
_ZN6icu_7813UnicodeString9doReplaceEiiPKDsii:
 1499|   440k|{
 1500|   440k|  if(!isWritable()) {
  ------------------
  |  Branch (1500:6): [True: 0, False: 440k]
  ------------------
 1501|      0|    return *this;
 1502|      0|  }
 1503|       |
 1504|   440k|  int32_t oldLength = this->length();
 1505|       |
 1506|       |  // optimize (read-only alias).remove(0, start) and .remove(start, end)
 1507|   440k|  if((fUnion.fFields.fLengthAndFlags&kBufferIsReadonly) && srcLength == 0) {
  ------------------
  |  Branch (1507:6): [True: 6.44k, False: 434k]
  |  Branch (1507:60): [True: 0, False: 6.44k]
  ------------------
 1508|      0|    if(start == 0) {
  ------------------
  |  Branch (1508:8): [True: 0, False: 0]
  ------------------
 1509|       |      // remove prefix by adjusting the array pointer
 1510|      0|      pinIndex(length);
 1511|      0|      fUnion.fFields.fArray += length;
 1512|      0|      fUnion.fFields.fCapacity -= length;
 1513|      0|      setLength(oldLength - length);
 1514|      0|      return *this;
 1515|      0|    } else {
 1516|      0|      pinIndex(start);
 1517|      0|      if(length >= (oldLength - start)) {
  ------------------
  |  Branch (1517:10): [True: 0, False: 0]
  ------------------
 1518|       |        // remove suffix by reducing the length (like truncate())
 1519|      0|        setLength(start);
 1520|      0|        fUnion.fFields.fCapacity = start;  // not NUL-terminated any more
 1521|      0|        return *this;
 1522|      0|      }
 1523|      0|    }
 1524|      0|  }
 1525|       |
 1526|   440k|  if(start == oldLength) {
  ------------------
  |  Branch (1526:6): [True: 330k, False: 110k]
  ------------------
 1527|   330k|    return doAppend(srcChars, srcStart, srcLength);
 1528|   330k|  }
 1529|       |
 1530|   110k|  if (srcChars == nullptr) {
  ------------------
  |  Branch (1530:7): [True: 0, False: 110k]
  ------------------
 1531|      0|    srcLength = 0;
 1532|   110k|  } else {
 1533|       |    // Perform all remaining operations relative to srcChars + srcStart.
 1534|       |    // From this point forward, do not use srcStart.
 1535|   110k|    srcChars += srcStart;
 1536|   110k|    if (srcLength < 0) {
  ------------------
  |  Branch (1536:9): [True: 0, False: 110k]
  ------------------
 1537|       |      // get the srcLength if necessary
 1538|      0|      srcLength = u_strlen(srcChars);
  ------------------
  |  |  393|      0|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1539|      0|    }
 1540|   110k|  }
 1541|       |
 1542|       |  // pin the indices to legal values
 1543|   110k|  pinIndices(start, length);
 1544|       |
 1545|       |  // Calculate the size of the string after the replace.
 1546|       |  // Avoid int32_t overflow.
 1547|   110k|  int32_t newLength = oldLength - length;
 1548|   110k|  if(srcLength > (INT32_MAX - newLength)) {
  ------------------
  |  Branch (1548:6): [True: 0, False: 110k]
  ------------------
 1549|      0|    setToBogus();
 1550|      0|    return *this;
 1551|      0|  }
 1552|   110k|  newLength += srcLength;
 1553|       |
 1554|       |  // Check for insertion into ourself
 1555|   110k|  const char16_t *oldArray = getArrayStart();
 1556|   110k|  if (isBufferWritable() &&
  ------------------
  |  Branch (1556:7): [True: 103k, False: 6.44k]
  ------------------
 1557|   110k|      oldArray < srcChars + srcLength &&
  ------------------
  |  Branch (1557:7): [True: 94.1k, False: 9.56k]
  ------------------
 1558|   110k|      srcChars < oldArray + oldLength) {
  ------------------
  |  Branch (1558:7): [True: 0, False: 94.1k]
  ------------------
 1559|       |    // Copy into a new UnicodeString and start over
 1560|      0|    UnicodeString copy(srcChars, srcLength);
 1561|      0|    if (copy.isBogus()) {
  ------------------
  |  Branch (1561:9): [True: 0, False: 0]
  ------------------
 1562|      0|      setToBogus();
 1563|      0|      return *this;
 1564|      0|    }
 1565|      0|    return doReplace(start, length, copy.getArrayStart(), 0, srcLength);
 1566|      0|  }
 1567|       |
 1568|       |  // cloneArrayIfNeeded(doCopyArray=false) may change fArray but will not copy the current contents;
 1569|       |  // therefore we need to keep the current fArray
 1570|   110k|  char16_t oldStackBuffer[US_STACKBUF_SIZE];
 1571|   110k|  if((fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) && (newLength > US_STACKBUF_SIZE)) {
  ------------------
  |  Branch (1571:6): [True: 102k, False: 7.20k]
  |  Branch (1571:60): [True: 351, False: 102k]
  ------------------
 1572|       |    // copy the stack buffer contents because it will be overwritten with
 1573|       |    // fUnion.fFields values
 1574|    351|    u_memcpy(oldStackBuffer, oldArray, oldLength);
  ------------------
  |  |  334|    351|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|    351|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    351|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    351|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1575|    351|    oldArray = oldStackBuffer;
 1576|    351|  }
 1577|       |
 1578|       |  // clone our array and allocate a bigger array if needed
 1579|   110k|  int32_t *bufferToDelete = nullptr;
 1580|   110k|  if(!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength),
  ------------------
  |  Branch (1580:6): [True: 0, False: 110k]
  ------------------
 1581|   110k|                         false, &bufferToDelete)
 1582|   110k|  ) {
 1583|      0|    return *this;
 1584|      0|  }
 1585|       |
 1586|       |  // now do the replace
 1587|       |
 1588|   110k|  char16_t *newArray = getArrayStart();
 1589|   110k|  if(newArray != oldArray) {
  ------------------
  |  Branch (1589:6): [True: 6.79k, False: 103k]
  ------------------
 1590|       |    // if fArray changed, then we need to copy everything except what will change
 1591|  6.79k|    us_arrayCopy(oldArray, 0, newArray, 0, start);
 1592|  6.79k|    us_arrayCopy(oldArray, start + length,
 1593|  6.79k|                 newArray, start + srcLength,
 1594|  6.79k|                 oldLength - (start + length));
 1595|   103k|  } else if(length != srcLength) {
  ------------------
  |  Branch (1595:13): [True: 11.9k, False: 91.3k]
  ------------------
 1596|       |    // fArray did not change; copy only the portion that isn't changing, leaving a hole
 1597|  11.9k|    us_arrayCopy(oldArray, start + length,
 1598|  11.9k|                 newArray, start + srcLength,
 1599|  11.9k|                 oldLength - (start + length));
 1600|  11.9k|  }
 1601|       |
 1602|       |  // now fill in the hole with the new string
 1603|   110k|  us_arrayCopy(srcChars, 0, newArray, start, srcLength);
 1604|       |
 1605|   110k|  setLength(newLength);
 1606|       |
 1607|       |  // delayed delete in case srcChars == fArray when we started, and
 1608|       |  // to keep oldArray alive for the above operations
 1609|   110k|  if (bufferToDelete) {
  ------------------
  |  Branch (1609:7): [True: 0, False: 110k]
  ------------------
 1610|      0|    uprv_free(bufferToDelete);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1611|      0|  }
 1612|       |
 1613|   110k|  return *this;
 1614|   110k|}
_ZN6icu_7813UnicodeString8doAppendERKS0_ii:
 1632|  48.6k|UnicodeString::doAppend(const UnicodeString& src, int32_t srcStart, int32_t srcLength) {
 1633|  48.6k|  if(srcLength == 0) {
  ------------------
  |  Branch (1633:6): [True: 0, False: 48.6k]
  ------------------
 1634|      0|    return *this;
 1635|      0|  }
 1636|       |
 1637|       |  // pin the indices to legal values
 1638|  48.6k|  src.pinIndices(srcStart, srcLength);
 1639|  48.6k|  return doAppend(src.getArrayStart(), srcStart, srcLength);
 1640|  48.6k|}
_ZN6icu_7813UnicodeString8doAppendEPKDsii:
 1643|   571k|UnicodeString::doAppend(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) {
 1644|   571k|  if(!isWritable() || srcLength == 0 || srcChars == nullptr) {
  ------------------
  |  Branch (1644:6): [True: 0, False: 571k]
  |  Branch (1644:23): [True: 0, False: 571k]
  |  Branch (1644:41): [True: 0, False: 571k]
  ------------------
 1645|      0|    return *this;
 1646|      0|  }
 1647|       |
 1648|       |  // Perform all remaining operations relative to srcChars + srcStart.
 1649|       |  // From this point forward, do not use srcStart.
 1650|   571k|  srcChars += srcStart;
 1651|       |
 1652|   571k|  if(srcLength < 0) {
  ------------------
  |  Branch (1652:6): [True: 242, False: 571k]
  ------------------
 1653|       |    // get the srcLength if necessary
 1654|    242|    if((srcLength = u_strlen(srcChars)) == 0) {
  ------------------
  |  |  393|    242|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|    242|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    242|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    242|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1654:8): [True: 0, False: 242]
  ------------------
 1655|      0|      return *this;
 1656|      0|    }
 1657|    242|  }
 1658|       |
 1659|   571k|  int32_t oldLength = length();
 1660|   571k|  int32_t newLength;
 1661|       |
 1662|   571k|  if (srcLength <= getCapacity() - oldLength && isBufferWritable()) {
  ------------------
  |  Branch (1662:7): [True: 569k, False: 2.10k]
  |  Branch (1662:49): [True: 569k, False: 0]
  ------------------
 1663|   569k|    newLength = oldLength + srcLength;
 1664|       |    // Faster than a memmove
 1665|   569k|    if (srcLength <= 4) {
  ------------------
  |  Branch (1665:9): [True: 549k, False: 20.2k]
  ------------------
 1666|   549k|      char16_t *arr = getArrayStart();
 1667|   549k|      arr[oldLength] = srcChars[0];
 1668|   549k|      if (srcLength > 1) arr[oldLength+1] = srcChars[1];
  ------------------
  |  Branch (1668:11): [True: 19.8k, False: 529k]
  ------------------
 1669|   549k|      if (srcLength > 2) arr[oldLength+2] = srcChars[2];
  ------------------
  |  Branch (1669:11): [True: 12.4k, False: 536k]
  ------------------
 1670|   549k|      if (srcLength > 3) arr[oldLength+3] = srcChars[3];
  ------------------
  |  Branch (1670:11): [True: 5.01k, False: 544k]
  ------------------
 1671|   549k|      setLength(newLength);
 1672|   549k|      return *this;
 1673|   549k|    }
 1674|   569k|  } else {
 1675|  2.10k|    if (uprv_add32_overflow(oldLength, srcLength, &newLength)) {
  ------------------
  |  | 1394|  2.10k|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|  2.10k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.10k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.10k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1675:9): [True: 0, False: 2.10k]
  ------------------
 1676|      0|      setToBogus();
 1677|      0|      return *this;
 1678|      0|    }
 1679|       |
 1680|       |    // Check for append onto ourself
 1681|  2.10k|    const char16_t* oldArray = getArrayStart();
 1682|  2.10k|    if (isBufferWritable() &&
  ------------------
  |  Branch (1682:9): [True: 2.10k, False: 0]
  ------------------
 1683|  2.10k|        oldArray < srcChars + srcLength &&
  ------------------
  |  Branch (1683:9): [True: 1.28k, False: 811]
  ------------------
 1684|  2.10k|        srcChars < oldArray + oldLength) {
  ------------------
  |  Branch (1684:9): [True: 0, False: 1.28k]
  ------------------
 1685|       |      // Copy into a new UnicodeString and start over
 1686|      0|      UnicodeString copy(srcChars, srcLength);
 1687|      0|      if (copy.isBogus()) {
  ------------------
  |  Branch (1687:11): [True: 0, False: 0]
  ------------------
 1688|      0|        setToBogus();
 1689|      0|        return *this;
 1690|      0|      }
 1691|      0|      return doAppend(copy.getArrayStart(), 0, srcLength);
 1692|      0|    }
 1693|       |
 1694|       |    // optimize append() onto a large-enough, owned string
 1695|  2.10k|    if (!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength))) {
  ------------------
  |  Branch (1695:9): [True: 0, False: 2.10k]
  ------------------
 1696|      0|      return *this;
 1697|      0|    }
 1698|  2.10k|  }
 1699|       |
 1700|  22.3k|  char16_t *newArray = getArrayStart();
 1701|       |  // Do not copy characters when
 1702|       |  //   char16_t *buffer=str.getAppendBuffer(...);
 1703|       |  // is followed by
 1704|       |  //   str.append(buffer, length);
 1705|       |  // or
 1706|       |  //   str.appendString(buffer, length)
 1707|       |  // or similar.
 1708|  22.3k|  if(srcChars != newArray + oldLength) {
  ------------------
  |  Branch (1708:6): [True: 22.3k, False: 0]
  ------------------
 1709|  22.3k|    us_arrayCopy(srcChars, 0, newArray, oldLength, srcLength);
 1710|  22.3k|  }
 1711|  22.3k|  setLength(newLength);
 1712|       |
 1713|  22.3k|  return *this;
 1714|   571k|}
_ZN6icu_7813UnicodeString8doAppendENSt3__117basic_string_viewIDsNS1_11char_traitsIDsEEEE:
 1717|  12.0k|UnicodeString::doAppend(std::u16string_view src) {
 1718|  12.0k|  if (!isWritable() || src.empty()) {
  ------------------
  |  Branch (1718:7): [True: 0, False: 12.0k]
  |  Branch (1718:24): [True: 0, False: 12.0k]
  ------------------
 1719|      0|    return *this;
 1720|      0|  }
 1721|  12.0k|  if (src.length() > INT32_MAX) {
  ------------------
  |  Branch (1721:7): [True: 0, False: 12.0k]
  ------------------
 1722|      0|    setToBogus();
 1723|      0|    return *this;
 1724|      0|  }
 1725|  12.0k|  return doAppend(src.data(), 0, static_cast<int32_t>(src.length()));
 1726|  12.0k|}
_ZN6icu_7813UnicodeString18cloneArrayIfNeededEiiaPPia:
 1917|   137k|                                  UBool forceClone) {
 1918|       |  // default parameters need to be static, therefore
 1919|       |  // the defaults are -1 to have convenience defaults
 1920|   137k|  if(newCapacity == -1) {
  ------------------
  |  Branch (1920:6): [True: 24.3k, False: 113k]
  ------------------
 1921|  24.3k|    newCapacity = getCapacity();
 1922|  24.3k|  }
 1923|       |
 1924|       |  // while a getBuffer(minCapacity) is "open",
 1925|       |  // prevent any modifications of the string by returning false here
 1926|       |  // if the string is bogus, then only an assignment or similar can revive it
 1927|   137k|  if(!isWritable()) {
  ------------------
  |  Branch (1927:6): [True: 0, False: 137k]
  ------------------
 1928|      0|    return false;
 1929|      0|  }
 1930|       |
 1931|       |  /*
 1932|       |   * We need to make a copy of the array if
 1933|       |   * the buffer is read-only, or
 1934|       |   * the buffer is refCounted (shared), and refCount>1, or
 1935|       |   * the buffer is too small.
 1936|       |   * Return false if memory could not be allocated.
 1937|       |   */
 1938|   137k|  if(forceClone ||
  ------------------
  |  Branch (1938:6): [True: 0, False: 137k]
  ------------------
 1939|   137k|     fUnion.fFields.fLengthAndFlags & kBufferIsReadonly ||
  ------------------
  |  Branch (1939:6): [True: 6.44k, False: 131k]
  ------------------
 1940|   137k|     (fUnion.fFields.fLengthAndFlags & kRefCounted && refCount() > 1) ||
  ------------------
  |  Branch (1940:7): [True: 952, False: 130k]
  |  Branch (1940:55): [True: 0, False: 952]
  ------------------
 1941|   137k|     newCapacity > getCapacity()
  ------------------
  |  Branch (1941:6): [True: 2.45k, False: 128k]
  ------------------
 1942|   137k|  ) {
 1943|       |    // check growCapacity for default value and use of the stack buffer
 1944|  8.89k|    if(growCapacity < 0) {
  ------------------
  |  Branch (1944:8): [True: 0, False: 8.89k]
  ------------------
 1945|      0|      growCapacity = newCapacity;
 1946|  8.89k|    } else if(newCapacity <= US_STACKBUF_SIZE && growCapacity > US_STACKBUF_SIZE) {
  ------------------
  |  Branch (1946:15): [True: 6.44k, False: 2.45k]
  |  Branch (1946:50): [True: 6.44k, False: 0]
  ------------------
 1947|  6.44k|      growCapacity = US_STACKBUF_SIZE;
 1948|  6.44k|    } else if(newCapacity > growCapacity) {
  ------------------
  |  Branch (1948:15): [True: 0, False: 2.45k]
  ------------------
 1949|      0|      setToBogus();
 1950|      0|      return false;  // bad inputs
 1951|      0|    }
 1952|  8.89k|    if(growCapacity > kMaxCapacity) {
  ------------------
  |  Branch (1952:8): [True: 0, False: 8.89k]
  ------------------
 1953|      0|      setToBogus();
 1954|      0|      return false;
 1955|      0|    }
 1956|       |
 1957|       |    // save old values
 1958|  8.89k|    char16_t oldStackBuffer[US_STACKBUF_SIZE];
 1959|  8.89k|    char16_t *oldArray;
 1960|  8.89k|    int32_t oldLength = length();
 1961|  8.89k|    int16_t flags = fUnion.fFields.fLengthAndFlags;
 1962|       |
 1963|  8.89k|    if(flags&kUsingStackBuffer) {
  ------------------
  |  Branch (1963:8): [True: 2.25k, False: 6.63k]
  ------------------
 1964|  2.25k|      U_ASSERT(!(flags&kRefCounted)); /* kRefCounted and kUsingStackBuffer are mutally exclusive */
  ------------------
  |  |   35|  2.25k|#   define U_ASSERT(exp) (void)0
  ------------------
 1965|  2.25k|      if(doCopyArray && growCapacity > US_STACKBUF_SIZE) {
  ------------------
  |  Branch (1965:10): [True: 1.90k, False: 351]
  |  Branch (1965:25): [True: 1.90k, False: 0]
  ------------------
 1966|       |        // copy the stack buffer contents because it will be overwritten with
 1967|       |        // fUnion.fFields values
 1968|  1.90k|        us_arrayCopy(fUnion.fStackFields.fBuffer, 0, oldStackBuffer, 0, oldLength);
 1969|  1.90k|        oldArray = oldStackBuffer;
 1970|  1.90k|      } else {
 1971|    351|        oldArray = nullptr; // no need to copy from the stack buffer to itself
 1972|    351|      }
 1973|  6.63k|    } else {
 1974|  6.63k|      oldArray = fUnion.fFields.fArray;
 1975|  6.63k|      U_ASSERT(oldArray!=nullptr); /* when stack buffer is not used, oldArray must have a non-nullptr reference */
  ------------------
  |  |   35|  6.63k|#   define U_ASSERT(exp) (void)0
  ------------------
 1976|  6.63k|    }
 1977|       |
 1978|       |    // allocate a new array
 1979|  8.89k|    if(allocate(growCapacity) ||
  ------------------
  |  Branch (1979:8): [True: 8.89k, False: 0]
  ------------------
 1980|  8.89k|       (newCapacity < growCapacity && allocate(newCapacity))
  ------------------
  |  Branch (1980:9): [True: 0, False: 0]
  |  Branch (1980:39): [True: 0, False: 0]
  ------------------
 1981|  8.89k|    ) {
 1982|  8.89k|      if(doCopyArray) {
  ------------------
  |  Branch (1982:10): [True: 2.10k, False: 6.79k]
  ------------------
 1983|       |        // copy the contents
 1984|       |        // do not copy more than what fits - it may be smaller than before
 1985|  2.10k|        int32_t minLength = oldLength;
 1986|  2.10k|        newCapacity = getCapacity();
 1987|  2.10k|        if(newCapacity < minLength) {
  ------------------
  |  Branch (1987:12): [True: 0, False: 2.10k]
  ------------------
 1988|      0|          minLength = newCapacity;
 1989|      0|        }
 1990|  2.10k|        if(oldArray != nullptr) {
  ------------------
  |  Branch (1990:12): [True: 2.10k, False: 0]
  ------------------
 1991|  2.10k|          us_arrayCopy(oldArray, 0, getArrayStart(), 0, minLength);
 1992|  2.10k|        }
 1993|  2.10k|        setLength(minLength);
 1994|  6.79k|      } else {
 1995|  6.79k|        setZeroLength();
 1996|  6.79k|      }
 1997|       |
 1998|       |      // release the old array
 1999|  8.89k|      if(flags & kRefCounted) {
  ------------------
  |  Branch (1999:10): [True: 192, False: 8.70k]
  ------------------
 2000|       |        // the array is refCounted; decrement and release if 0
 2001|    192|        u_atomic_int32_t* pRefCount = reinterpret_cast<u_atomic_int32_t*>(oldArray) - 1;
 2002|    192|        if(umtx_atomic_dec(pRefCount) == 0) {
  ------------------
  |  Branch (2002:12): [True: 192, False: 0]
  ------------------
 2003|    192|          if (pBufferToDelete == nullptr) {
  ------------------
  |  Branch (2003:15): [True: 192, False: 0]
  ------------------
 2004|       |              // Note: cast to (void *) is needed with MSVC, where u_atomic_int32_t
 2005|       |              // is defined as volatile. (Volatile has useful non-standard behavior
 2006|       |              //   with this compiler.)
 2007|    192|            uprv_free((void *)pRefCount);
  ------------------
  |  | 1503|    192|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    192|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    192|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    192|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2008|    192|          } else {
 2009|       |            // the caller requested to delete it himself
 2010|      0|            *pBufferToDelete = reinterpret_cast<int32_t*>(pRefCount);
 2011|      0|          }
 2012|    192|        }
 2013|    192|      }
 2014|  8.89k|    } else {
 2015|       |      // not enough memory for growCapacity and not even for the smaller newCapacity
 2016|       |      // reset the old values for setToBogus() to release the array
 2017|      0|      if(!(flags&kUsingStackBuffer)) {
  ------------------
  |  Branch (2017:10): [True: 0, False: 0]
  ------------------
 2018|      0|        fUnion.fFields.fArray = oldArray;
 2019|      0|      }
 2020|      0|      fUnion.fFields.fLengthAndFlags = flags;
 2021|      0|      setToBogus();
 2022|      0|      return false;
 2023|      0|    }
 2024|  8.89k|  }
 2025|   137k|  return true;
 2026|   137k|}
unistr.cpp:_ZL12us_arrayCopyPKDsiPDsii:
   87|   162k|{
   88|   162k|  if(count>0) {
  ------------------
  |  Branch (88:6): [True: 147k, False: 14.8k]
  ------------------
   89|   147k|    uprv_memmove(dst+dstStart, src+srcStart, (size_t)count*sizeof(*src));
  ------------------
  |  |   51|   147k|#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   147k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   52|   147k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   53|   147k|    _Pragma("clang diagnostic push") \
  |  |   54|   147k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   55|   147k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   147k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   56|   147k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   147k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   57|   147k|    _Pragma("clang diagnostic pop") \
  |  |   58|   147k|    U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   147k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   59|   147k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   147k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   90|   147k|  }
   91|   162k|}
unistr.cpp:_ZN6icu_7812_GLOBAL__N_115getGrowCapacityEi:
  397|   112k|int32_t getGrowCapacity(int32_t newLength) {
  398|   112k|  int32_t growSize = (newLength >> 2) + kGrowSize;
  399|   112k|  if(growSize <= (kMaxCapacity - newLength)) {
  ------------------
  |  Branch (399:6): [True: 112k, False: 0]
  ------------------
  400|   112k|    return newLength + growSize;
  401|   112k|  } else {
  402|      0|    return kMaxCapacity;
  403|      0|  }
  404|   112k|}

_ZN6icu_787UMemorynwEm:
   61|   145k|void * U_EXPORT2 UMemory::operator new(size_t size) noexcept {
   62|   145k|    return uprv_malloc(size);
  ------------------
  |  | 1524|   145k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|   145k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   145k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   145k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   63|   145k|}
_ZN6icu_787UMemorydlEPv:
   65|   137k|void U_EXPORT2 UMemory::operator delete(void *p) noexcept {
   66|   137k|    if(p!=nullptr) {
  ------------------
  |  Branch (66:8): [True: 137k, False: 0]
  ------------------
   67|   137k|        uprv_free(p);
  ------------------
  |  | 1503|   137k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|   137k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   137k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   137k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   68|   137k|    }
   69|   137k|}
_ZN6icu_787UMemorynaEm:
   71|      2|void * U_EXPORT2 UMemory::operator new[](size_t size) noexcept {
   72|      2|    return uprv_malloc(size);
  ------------------
  |  | 1524|      2|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      2|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      2|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      2|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   73|      2|}
_ZN6icu_787UMemorydaEPv:
   75|      1|void U_EXPORT2 UMemory::operator delete[](void *p) noexcept {
   76|      1|    if(p!=nullptr) {
  ------------------
  |  Branch (76:8): [True: 1, False: 0]
  ------------------
   77|      1|        uprv_free(p);
  ------------------
  |  | 1503|      1|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   78|      1|    }
   79|      1|}
_ZN6icu_787UObjectD2Ev:
   94|   242M|UObject::~UObject() {}

ures_initStackObject_78:
  726|  82.0k|U_CFUNC void ures_initStackObject(UResourceBundle* resB) {
  727|  82.0k|  uprv_memset(resB, 0, sizeof(UResourceBundle));
  ------------------
  |  |  100|  82.0k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  82.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  728|  82.0k|  ures_setIsStackObject(resB, true);
  729|  82.0k|}
_ZN6icu_7820StackUResourceBundleC2Ev:
  733|  52.4k|StackUResourceBundle::StackUResourceBundle() {
  734|  52.4k|    ures_initStackObject(&bundle);
  ------------------
  |  | 1690|  52.4k|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|  52.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  52.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  52.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  735|  52.4k|}
_ZN6icu_7820StackUResourceBundleD2Ev:
  737|  52.4k|StackUResourceBundle::~StackUResourceBundle() {
  738|  52.4k|    ures_close(&bundle);
  ------------------
  |  | 1652|  52.4k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  52.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  52.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  52.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  739|  52.4k|}
ures_close_78:
 1147|   317k|{
 1148|   317k|    ures_closeBundle(resB, true);
 1149|   317k|}
ures_getString_78:
 1524|  31.0k|U_CAPI const char16_t* U_EXPORT2 ures_getString(const UResourceBundle* resB, int32_t* len, UErrorCode* status) {
 1525|  31.0k|    const char16_t *s;
 1526|  31.0k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1526:9): [True: 0, False: 31.0k]
  |  Branch (1526:28): [True: 2.36k, False: 28.7k]
  ------------------
 1527|  2.36k|        return nullptr;
 1528|  2.36k|    }
 1529|  28.7k|    if(resB == nullptr) {
  ------------------
  |  Branch (1529:8): [True: 0, False: 28.7k]
  ------------------
 1530|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1531|      0|        return nullptr;
 1532|      0|    }
 1533|  28.7k|    s = res_getString({resB}, &resB->getResData(), resB->fRes, len);
 1534|  28.7k|    if (s == nullptr) {
  ------------------
  |  Branch (1534:9): [True: 0, False: 28.7k]
  ------------------
 1535|      0|        *status = U_RESOURCE_TYPE_MISMATCH;
 1536|      0|    }
 1537|  28.7k|    return s;
 1538|  28.7k|}
ures_getInt_78:
 1648|  18.6k|U_CAPI int32_t U_EXPORT2 ures_getInt(const UResourceBundle* resB, UErrorCode *status) {
 1649|  18.6k|  if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1649:7): [True: 0, False: 18.6k]
  |  Branch (1649:26): [True: 0, False: 18.6k]
  ------------------
 1650|      0|    return 0xffffffff;
 1651|      0|  }
 1652|  18.6k|  if(resB == nullptr) {
  ------------------
  |  Branch (1652:6): [True: 0, False: 18.6k]
  ------------------
 1653|      0|    *status = U_ILLEGAL_ARGUMENT_ERROR;
 1654|      0|    return 0xffffffff;
 1655|      0|  }
 1656|  18.6k|  if(RES_GET_TYPE(resB->fRes) != URES_INT) {
  ------------------
  |  |   68|  18.6k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (1656:6): [True: 0, False: 18.6k]
  ------------------
 1657|      0|    *status = U_RESOURCE_TYPE_MISMATCH;
 1658|      0|    return 0xffffffff;
 1659|      0|  }
 1660|  18.6k|  return res_getInt({resB}, resB->fRes);
 1661|  18.6k|}
ures_getKey_78:
 1685|  1.29k|U_CAPI const char * U_EXPORT2 ures_getKey(const UResourceBundle *resB) {
 1686|       |  //
 1687|       |  // TODO: Trace ures_getKey? I guess not usually.
 1688|       |  //
 1689|       |  // We usually get the key string to decide whether we want the value, or to
 1690|       |  // make a key-value pair. Tracing the value should suffice.
 1691|       |  //
 1692|       |  // However, I believe we have some data (e.g., in res_index) where the key
 1693|       |  // strings are the data. Tracing the enclosing table should suffice.
 1694|       |  //
 1695|  1.29k|  if(resB == nullptr) {
  ------------------
  |  Branch (1695:6): [True: 0, False: 1.29k]
  ------------------
 1696|      0|    return nullptr;
 1697|      0|  }
 1698|  1.29k|  return(resB->fKey);
 1699|  1.29k|}
ures_getSize_78:
 1701|  13.1k|U_CAPI int32_t U_EXPORT2 ures_getSize(const UResourceBundle *resB) {
 1702|  13.1k|  if(resB == nullptr) {
  ------------------
  |  Branch (1702:6): [True: 0, False: 13.1k]
  ------------------
 1703|      0|    return 0;
 1704|      0|  }
 1705|       |  
 1706|  13.1k|  return resB->fSize;
 1707|  13.1k|}
ures_hasNext_78:
 1728|  1.29k|U_CAPI UBool U_EXPORT2 ures_hasNext(const UResourceBundle *resB) {
 1729|  1.29k|  if(resB == nullptr) {
  ------------------
  |  Branch (1729:6): [True: 0, False: 1.29k]
  ------------------
 1730|      0|    return false;
 1731|      0|  }
 1732|  1.29k|  return resB->fIndex < resB->fSize-1;
 1733|  1.29k|}
ures_getNextString_78:
 1735|  1.14k|U_CAPI const char16_t* U_EXPORT2 ures_getNextString(UResourceBundle *resB, int32_t* len, const char ** key, UErrorCode *status) {
 1736|  1.14k|  Resource r = RES_BOGUS;
  ------------------
  |  |   65|  1.14k|#define RES_BOGUS 0xffffffff
  ------------------
 1737|       |  
 1738|  1.14k|  if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1738:7): [True: 0, False: 1.14k]
  |  Branch (1738:26): [True: 0, False: 1.14k]
  ------------------
 1739|      0|    return nullptr;
 1740|      0|  }
 1741|  1.14k|  if(resB == nullptr) {
  ------------------
  |  Branch (1741:6): [True: 0, False: 1.14k]
  ------------------
 1742|      0|    *status = U_ILLEGAL_ARGUMENT_ERROR;
 1743|      0|    return nullptr;
 1744|      0|  }
 1745|       |  
 1746|  1.14k|  if(resB->fIndex == resB->fSize-1) {
  ------------------
  |  Branch (1746:6): [True: 0, False: 1.14k]
  ------------------
 1747|      0|    *status = U_INDEX_OUTOFBOUNDS_ERROR;
 1748|  1.14k|  } else {
 1749|  1.14k|    resB->fIndex++;
 1750|  1.14k|    switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|  1.14k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1751|      0|    case URES_STRING:
  ------------------
  |  Branch (1751:5): [True: 0, False: 1.14k]
  ------------------
 1752|      0|    case URES_STRING_V2:
  ------------------
  |  Branch (1752:5): [True: 0, False: 1.14k]
  ------------------
 1753|      0|      return res_getString({resB}, &resB->getResData(), resB->fRes, len);
 1754|      0|    case URES_TABLE:
  ------------------
  |  Branch (1754:5): [True: 0, False: 1.14k]
  ------------------
 1755|  1.14k|    case URES_TABLE16:
  ------------------
  |  Branch (1755:5): [True: 1.14k, False: 0]
  ------------------
 1756|  1.14k|    case URES_TABLE32:
  ------------------
  |  Branch (1756:5): [True: 0, False: 1.14k]
  ------------------
 1757|  1.14k|      r = res_getTableItemByIndex(&resB->getResData(), resB->fRes, resB->fIndex, key);
  ------------------
  |  |  206|  1.14k|#define res_getTableItemByIndex U_ICU_ENTRY_POINT_RENAME(res_getTableItemByIndex)
  |  |  ------------------
  |  |  |  |  123|  1.14k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.14k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.14k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1758|  1.14k|      if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|  2.29k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1758:10): [True: 0, False: 1.14k]
  |  Branch (1758:28): [True: 0, False: 0]
  ------------------
 1759|       |        /* TODO: do the fallback */
 1760|      0|      }
 1761|  1.14k|      return ures_getStringWithAlias(resB, r, resB->fIndex, len, status);
 1762|      0|    case URES_ARRAY:
  ------------------
  |  Branch (1762:5): [True: 0, False: 1.14k]
  ------------------
 1763|      0|    case URES_ARRAY16:
  ------------------
  |  Branch (1763:5): [True: 0, False: 1.14k]
  ------------------
 1764|      0|      r = res_getArrayItem(&resB->getResData(), resB->fRes, resB->fIndex);
  ------------------
  |  |  200|      0|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1765|      0|      if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1765:10): [True: 0, False: 0]
  |  Branch (1765:28): [True: 0, False: 0]
  ------------------
 1766|       |        /* TODO: do the fallback */
 1767|      0|      }
 1768|      0|      return ures_getStringWithAlias(resB, r, resB->fIndex, len, status);
 1769|      0|    case URES_ALIAS:
  ------------------
  |  Branch (1769:5): [True: 0, False: 1.14k]
  ------------------
 1770|      0|      return ures_getStringWithAlias(resB, resB->fRes, resB->fIndex, len, status);
 1771|      0|    case URES_INT:
  ------------------
  |  Branch (1771:5): [True: 0, False: 1.14k]
  ------------------
 1772|      0|    case URES_BINARY:
  ------------------
  |  Branch (1772:5): [True: 0, False: 1.14k]
  ------------------
 1773|      0|    case URES_INT_VECTOR:
  ------------------
  |  Branch (1773:5): [True: 0, False: 1.14k]
  ------------------
 1774|      0|        *status = U_RESOURCE_TYPE_MISMATCH;
 1775|      0|        U_FALLTHROUGH;
  ------------------
  |  |  511|      0|#       define U_FALLTHROUGH [[clang::fallthrough]]
  ------------------
 1776|      0|    default:
  ------------------
  |  Branch (1776:5): [True: 0, False: 1.14k]
  ------------------
 1777|      0|      return nullptr;
 1778|  1.14k|    }
 1779|  1.14k|  }
 1780|       |
 1781|      0|  return nullptr;
 1782|  1.14k|}
ures_getNextResource_78:
 1784|  1.29k|U_CAPI UResourceBundle* U_EXPORT2 ures_getNextResource(UResourceBundle *resB, UResourceBundle *fillIn, UErrorCode *status) {
 1785|  1.29k|    const char *key = nullptr;
 1786|  1.29k|    Resource r = RES_BOGUS;
  ------------------
  |  |   65|  1.29k|#define RES_BOGUS 0xffffffff
  ------------------
 1787|       |
 1788|  1.29k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1788:9): [True: 0, False: 1.29k]
  |  Branch (1788:28): [True: 0, False: 1.29k]
  ------------------
 1789|       |            /*return nullptr;*/
 1790|      0|            return fillIn;
 1791|      0|    }
 1792|  1.29k|    if(resB == nullptr) {
  ------------------
  |  Branch (1792:8): [True: 0, False: 1.29k]
  ------------------
 1793|      0|            *status = U_ILLEGAL_ARGUMENT_ERROR;
 1794|       |            /*return nullptr;*/
 1795|      0|            return fillIn;
 1796|      0|    }
 1797|       |
 1798|  1.29k|    if(resB->fIndex == resB->fSize-1) {
  ------------------
  |  Branch (1798:8): [True: 0, False: 1.29k]
  ------------------
 1799|      0|      *status = U_INDEX_OUTOFBOUNDS_ERROR;
 1800|       |      /*return nullptr;*/
 1801|  1.29k|    } else {
 1802|  1.29k|        resB->fIndex++;
 1803|  1.29k|        switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|  1.29k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1804|      0|        case URES_INT:
  ------------------
  |  Branch (1804:9): [True: 0, False: 1.29k]
  ------------------
 1805|      0|        case URES_BINARY:
  ------------------
  |  Branch (1805:9): [True: 0, False: 1.29k]
  ------------------
 1806|      0|        case URES_STRING:
  ------------------
  |  Branch (1806:9): [True: 0, False: 1.29k]
  ------------------
 1807|      0|        case URES_STRING_V2:
  ------------------
  |  Branch (1807:9): [True: 0, False: 1.29k]
  ------------------
 1808|      0|        case URES_INT_VECTOR:
  ------------------
  |  Branch (1808:9): [True: 0, False: 1.29k]
  ------------------
 1809|      0|            return ures_copyResb(fillIn, resB, status);
  ------------------
  |  | 1653|      0|#define ures_copyResb U_ICU_ENTRY_POINT_RENAME(ures_copyResb)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1810|  1.29k|        case URES_TABLE:
  ------------------
  |  Branch (1810:9): [True: 1.29k, False: 0]
  ------------------
 1811|  1.29k|        case URES_TABLE16:
  ------------------
  |  Branch (1811:9): [True: 0, False: 1.29k]
  ------------------
 1812|  1.29k|        case URES_TABLE32:
  ------------------
  |  Branch (1812:9): [True: 0, False: 1.29k]
  ------------------
 1813|  1.29k|            r = res_getTableItemByIndex(&resB->getResData(), resB->fRes, resB->fIndex, &key);
  ------------------
  |  |  206|  1.29k|#define res_getTableItemByIndex U_ICU_ENTRY_POINT_RENAME(res_getTableItemByIndex)
  |  |  ------------------
  |  |  |  |  123|  1.29k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.29k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.29k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1814|  1.29k|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|  2.58k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1814:16): [True: 0, False: 1.29k]
  |  Branch (1814:34): [True: 0, False: 0]
  ------------------
 1815|       |                /* TODO: do the fallback */
 1816|      0|            }
 1817|  1.29k|            return init_resb_result(resB->fData, r, key, resB->fIndex, resB, fillIn, status);
 1818|      0|        case URES_ARRAY:
  ------------------
  |  Branch (1818:9): [True: 0, False: 1.29k]
  ------------------
 1819|      0|        case URES_ARRAY16:
  ------------------
  |  Branch (1819:9): [True: 0, False: 1.29k]
  ------------------
 1820|      0|            r = res_getArrayItem(&resB->getResData(), resB->fRes, resB->fIndex);
  ------------------
  |  |  200|      0|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1821|      0|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1821:16): [True: 0, False: 0]
  |  Branch (1821:34): [True: 0, False: 0]
  ------------------
 1822|       |                /* TODO: do the fallback */
 1823|      0|            }
 1824|      0|            return init_resb_result(resB->fData, r, key, resB->fIndex, resB, fillIn, status);
 1825|      0|        default:
  ------------------
  |  Branch (1825:9): [True: 0, False: 1.29k]
  ------------------
 1826|       |            /*return nullptr;*/
 1827|      0|            return fillIn;
 1828|  1.29k|        }
 1829|  1.29k|    }
 1830|       |    /*return nullptr;*/
 1831|      0|    return fillIn;
 1832|  1.29k|}
ures_getByIndex_78:
 1834|  6.54k|U_CAPI UResourceBundle* U_EXPORT2 ures_getByIndex(const UResourceBundle *resB, int32_t indexR, UResourceBundle *fillIn, UErrorCode *status) {
 1835|  6.54k|    const char* key = nullptr;
 1836|  6.54k|    Resource r = RES_BOGUS;
  ------------------
  |  |   65|  6.54k|#define RES_BOGUS 0xffffffff
  ------------------
 1837|       |
 1838|  6.54k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1838:9): [True: 0, False: 6.54k]
  |  Branch (1838:28): [True: 0, False: 6.54k]
  ------------------
 1839|       |        /*return nullptr;*/
 1840|      0|        return fillIn;
 1841|      0|    }
 1842|  6.54k|    if(resB == nullptr) {
  ------------------
  |  Branch (1842:8): [True: 0, False: 6.54k]
  ------------------
 1843|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1844|       |        /*return nullptr;*/
 1845|      0|        return fillIn;
 1846|      0|    }
 1847|       |
 1848|  6.54k|    if(indexR >= 0 && resB->fSize > indexR) {
  ------------------
  |  Branch (1848:8): [True: 6.54k, False: 0]
  |  Branch (1848:23): [True: 6.54k, False: 0]
  ------------------
 1849|  6.54k|        switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|  6.54k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1850|      0|        case URES_INT:
  ------------------
  |  Branch (1850:9): [True: 0, False: 6.54k]
  ------------------
 1851|      0|        case URES_BINARY:
  ------------------
  |  Branch (1851:9): [True: 0, False: 6.54k]
  ------------------
 1852|      0|        case URES_STRING:
  ------------------
  |  Branch (1852:9): [True: 0, False: 6.54k]
  ------------------
 1853|      0|        case URES_STRING_V2:
  ------------------
  |  Branch (1853:9): [True: 0, False: 6.54k]
  ------------------
 1854|      0|        case URES_INT_VECTOR:
  ------------------
  |  Branch (1854:9): [True: 0, False: 6.54k]
  ------------------
 1855|      0|            return ures_copyResb(fillIn, resB, status);
  ------------------
  |  | 1653|      0|#define ures_copyResb U_ICU_ENTRY_POINT_RENAME(ures_copyResb)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1856|      0|        case URES_TABLE:
  ------------------
  |  Branch (1856:9): [True: 0, False: 6.54k]
  ------------------
 1857|      0|        case URES_TABLE16:
  ------------------
  |  Branch (1857:9): [True: 0, False: 6.54k]
  ------------------
 1858|      0|        case URES_TABLE32:
  ------------------
  |  Branch (1858:9): [True: 0, False: 6.54k]
  ------------------
 1859|      0|            r = res_getTableItemByIndex(&resB->getResData(), resB->fRes, indexR, &key);
  ------------------
  |  |  206|      0|#define res_getTableItemByIndex U_ICU_ENTRY_POINT_RENAME(res_getTableItemByIndex)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1860|      0|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1860:16): [True: 0, False: 0]
  |  Branch (1860:34): [True: 0, False: 0]
  ------------------
 1861|       |                /* TODO: do the fallback */
 1862|      0|            }
 1863|      0|            return init_resb_result(resB->fData, r, key, indexR, resB, fillIn, status);
 1864|  6.54k|        case URES_ARRAY:
  ------------------
  |  Branch (1864:9): [True: 6.54k, False: 0]
  ------------------
 1865|  6.54k|        case URES_ARRAY16:
  ------------------
  |  Branch (1865:9): [True: 0, False: 6.54k]
  ------------------
 1866|  6.54k|            r = res_getArrayItem(&resB->getResData(), resB->fRes, indexR);
  ------------------
  |  |  200|  6.54k|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|  6.54k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.54k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.54k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1867|  6.54k|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|  13.0k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1867:16): [True: 0, False: 6.54k]
  |  Branch (1867:34): [True: 0, False: 0]
  ------------------
 1868|       |                /* TODO: do the fallback */
 1869|      0|            }
 1870|  6.54k|            return init_resb_result(resB->fData, r, key, indexR, resB, fillIn, status);
 1871|      0|        default:
  ------------------
  |  Branch (1871:9): [True: 0, False: 6.54k]
  ------------------
 1872|       |            /*return nullptr;*/
 1873|      0|            return fillIn;
 1874|  6.54k|        }
 1875|  6.54k|    } else {
 1876|      0|        *status = U_MISSING_RESOURCE_ERROR;
 1877|      0|    }
 1878|       |    /*return nullptr;*/
 1879|      0|    return fillIn;
 1880|  6.54k|}
ures_getStringByIndex_78:
 1882|  6.75k|U_CAPI const char16_t* U_EXPORT2 ures_getStringByIndex(const UResourceBundle *resB, int32_t indexS, int32_t* len, UErrorCode *status) {
 1883|  6.75k|    const char* key = nullptr;
 1884|  6.75k|    Resource r = RES_BOGUS;
  ------------------
  |  |   65|  6.75k|#define RES_BOGUS 0xffffffff
  ------------------
 1885|       |
 1886|  6.75k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1886:9): [True: 0, False: 6.75k]
  |  Branch (1886:28): [True: 136, False: 6.62k]
  ------------------
 1887|    136|        return nullptr;
 1888|    136|    }
 1889|  6.62k|    if(resB == nullptr) {
  ------------------
  |  Branch (1889:8): [True: 0, False: 6.62k]
  ------------------
 1890|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1891|      0|        return nullptr;
 1892|      0|    }
 1893|       |
 1894|  6.62k|    if(indexS >= 0 && resB->fSize > indexS) {
  ------------------
  |  Branch (1894:8): [True: 6.62k, False: 0]
  |  Branch (1894:23): [True: 6.62k, False: 0]
  ------------------
 1895|  6.62k|        switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|  6.62k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1896|      0|        case URES_STRING:
  ------------------
  |  Branch (1896:9): [True: 0, False: 6.62k]
  ------------------
 1897|      0|        case URES_STRING_V2:
  ------------------
  |  Branch (1897:9): [True: 0, False: 6.62k]
  ------------------
 1898|      0|            return res_getString({resB}, &resB->getResData(), resB->fRes, len);
 1899|      0|        case URES_TABLE:
  ------------------
  |  Branch (1899:9): [True: 0, False: 6.62k]
  ------------------
 1900|      0|        case URES_TABLE16:
  ------------------
  |  Branch (1900:9): [True: 0, False: 6.62k]
  ------------------
 1901|      0|        case URES_TABLE32:
  ------------------
  |  Branch (1901:9): [True: 0, False: 6.62k]
  ------------------
 1902|      0|            r = res_getTableItemByIndex(&resB->getResData(), resB->fRes, indexS, &key);
  ------------------
  |  |  206|      0|#define res_getTableItemByIndex U_ICU_ENTRY_POINT_RENAME(res_getTableItemByIndex)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1903|      0|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1903:16): [True: 0, False: 0]
  |  Branch (1903:34): [True: 0, False: 0]
  ------------------
 1904|       |                /* TODO: do the fallback */
 1905|      0|            }
 1906|      0|            return ures_getStringWithAlias(resB, r, indexS, len, status);
 1907|    458|        case URES_ARRAY:
  ------------------
  |  Branch (1907:9): [True: 458, False: 6.16k]
  ------------------
 1908|  6.62k|        case URES_ARRAY16:
  ------------------
  |  Branch (1908:9): [True: 6.16k, False: 458]
  ------------------
 1909|  6.62k|            r = res_getArrayItem(&resB->getResData(), resB->fRes, indexS);
  ------------------
  |  |  200|  6.62k|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|  6.62k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.62k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.62k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1910|  6.62k|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|  13.2k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1910:16): [True: 0, False: 6.62k]
  |  Branch (1910:34): [True: 0, False: 0]
  ------------------
 1911|       |                /* TODO: do the fallback */
 1912|      0|            }
 1913|  6.62k|            return ures_getStringWithAlias(resB, r, indexS, len, status);
 1914|      0|        case URES_ALIAS:
  ------------------
  |  Branch (1914:9): [True: 0, False: 6.62k]
  ------------------
 1915|      0|            return ures_getStringWithAlias(resB, resB->fRes, indexS, len, status);
 1916|      0|        case URES_INT:
  ------------------
  |  Branch (1916:9): [True: 0, False: 6.62k]
  ------------------
 1917|      0|        case URES_BINARY:
  ------------------
  |  Branch (1917:9): [True: 0, False: 6.62k]
  ------------------
 1918|      0|        case URES_INT_VECTOR:
  ------------------
  |  Branch (1918:9): [True: 0, False: 6.62k]
  ------------------
 1919|      0|            *status = U_RESOURCE_TYPE_MISMATCH;
 1920|      0|            break;
 1921|      0|        default:
  ------------------
  |  Branch (1921:9): [True: 0, False: 6.62k]
  ------------------
 1922|       |          /* must not occur */
 1923|      0|          *status = U_INTERNAL_PROGRAM_ERROR;
 1924|      0|          break;
 1925|  6.62k|        }
 1926|  6.62k|    } else {
 1927|      0|        *status = U_MISSING_RESOURCE_ERROR;
 1928|      0|    }
 1929|      0|    return nullptr;
 1930|  6.62k|}
ures_getStringByKeyWithFallback_78:
 2033|  29.5k|                                UErrorCode *status) {
 2034|       |
 2035|  29.5k|    UResourceBundle stack;
 2036|  29.5k|    const char16_t* retVal = nullptr;
 2037|  29.5k|    ures_initStackObject(&stack);
  ------------------
  |  | 1690|  29.5k|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|  29.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  29.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  29.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2038|  29.5k|    ures_getByKeyWithFallback(resB, inKey, &stack, status);
  ------------------
  |  | 1662|  29.5k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  29.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  29.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  29.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2039|  29.5k|    int32_t length;
 2040|  29.5k|    retVal = ures_getString(&stack, &length, status);
  ------------------
  |  | 1675|  29.5k|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|  29.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  29.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  29.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2041|  29.5k|    ures_close(&stack);
  ------------------
  |  | 1652|  29.5k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  29.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  29.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  29.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2042|  29.5k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (2042:9): [True: 1.30k, False: 28.2k]
  ------------------
 2043|  1.30k|        return nullptr;
 2044|  1.30k|    }
 2045|  28.2k|    if (length == 3 && retVal[0] == EMPTY_SET && retVal[1] == EMPTY_SET && retVal[2] == EMPTY_SET ) {
  ------------------
  |  |   35|  28.2k|#define EMPTY_SET 0x2205
  ------------------
                  if (length == 3 && retVal[0] == EMPTY_SET && retVal[1] == EMPTY_SET && retVal[2] == EMPTY_SET ) {
  ------------------
  |  |   35|  28.2k|#define EMPTY_SET 0x2205
  ------------------
                  if (length == 3 && retVal[0] == EMPTY_SET && retVal[1] == EMPTY_SET && retVal[2] == EMPTY_SET ) {
  ------------------
  |  |   35|      0|#define EMPTY_SET 0x2205
  ------------------
  |  Branch (2045:9): [True: 0, False: 28.2k]
  |  Branch (2045:24): [True: 0, False: 0]
  |  Branch (2045:50): [True: 0, False: 0]
  |  Branch (2045:76): [True: 0, False: 0]
  ------------------
 2046|      0|        retVal = nullptr;
 2047|      0|        length = 0;
 2048|      0|        *status = U_MISSING_RESOURCE_ERROR;
 2049|      0|    }
 2050|  28.2k|    if (len != nullptr) {
  ------------------
  |  Branch (2050:9): [True: 18.9k, False: 9.33k]
  ------------------
 2051|  18.9k|        *len = length;
 2052|  18.9k|    }
 2053|  28.2k|    return retVal;
 2054|  29.5k|}
ures_getByKeyWithFallback_78:
 2164|  98.5k|                          UErrorCode *status) {
 2165|  98.5k|    Resource res = RES_BOGUS, rootRes = RES_BOGUS;
  ------------------
  |  |   65|  98.5k|#define RES_BOGUS 0xffffffff
  ------------------
                  Resource res = RES_BOGUS, rootRes = RES_BOGUS;
  ------------------
  |  |   65|  98.5k|#define RES_BOGUS 0xffffffff
  ------------------
 2166|  98.5k|    UResourceBundle *helper = nullptr;
 2167|       |
 2168|  98.5k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2168:9): [True: 0, False: 98.5k]
  |  Branch (2168:28): [True: 0, False: 98.5k]
  ------------------
 2169|      0|        return fillIn;
 2170|      0|    }
 2171|  98.5k|    if(resB == nullptr) {
  ------------------
  |  Branch (2171:8): [True: 0, False: 98.5k]
  ------------------
 2172|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2173|      0|        return fillIn;
 2174|      0|    }
 2175|       |
 2176|  98.5k|    int32_t type = RES_GET_TYPE(resB->fRes);
  ------------------
  |  |   68|  98.5k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2177|  98.5k|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|  98.5k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 94.4k, False: 4.07k]
  |  |  |  Branch (84:61): [True: 4.07k, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2178|  98.5k|        const char* origResPath = resB->fResPath;
 2179|  98.5k|        int32_t origResPathLen = resB->fResPathLen;
 2180|  98.5k|        res = getTableItemByKeyPath(&resB->getResData(), resB->fRes, inKey);
 2181|  98.5k|        const char* key = inKey;
 2182|  98.5k|        bool didRootOnce = false;
 2183|  98.5k|        if(res == RES_BOGUS) {
  ------------------
  |  |   65|  98.5k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2183:12): [True: 59.0k, False: 39.4k]
  ------------------
 2184|  59.0k|            UResourceDataEntry *dataEntry = resB->fData;
 2185|  59.0k|            CharString path;
 2186|  59.0k|            char *myPath = nullptr;
 2187|  59.0k|            const char* resPath = resB->fResPath;
 2188|  59.0k|            int32_t len = resB->fResPathLen;
 2189|   148k|            while(res == RES_BOGUS && (dataEntry->fParent != nullptr || !didRootOnce)) { /* Otherwise, we'll look in parents */
  ------------------
  |  |   65|   297k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2189:19): [True: 94.1k, False: 54.7k]
  |  Branch (2189:40): [True: 85.5k, False: 8.56k]
  |  Branch (2189:73): [True: 4.28k, False: 4.28k]
  ------------------
 2190|  89.8k|                if (dataEntry->fParent != nullptr) {
  ------------------
  |  Branch (2190:21): [True: 85.5k, False: 4.28k]
  ------------------
 2191|  85.5k|                    dataEntry = dataEntry->fParent;
 2192|  85.5k|                } else {
 2193|       |                    // We can't just stop when we get to a bundle whose fParent is nullptr.  That'll work most of the time,
 2194|       |                    // but if the bundle that the caller passed to us was "root" (which happens in getAllItemsWithFallback(),
 2195|       |                    // this function will drop right out without doing anything if "root" doesn't contain the exact key path
 2196|       |                    // specified.  In that case, we need one extra time through this loop to make sure we follow any
 2197|       |                    // applicable aliases at the root level.
 2198|  4.28k|                    didRootOnce = true;
 2199|  4.28k|                }
 2200|  89.8k|                rootRes = dataEntry->fData.rootRes;
 2201|       |
 2202|  89.8k|                if(dataEntry->fBogus == U_ZERO_ERROR) {
  ------------------
  |  Branch (2202:20): [True: 89.8k, False: 0]
  ------------------
 2203|  89.8k|                    createPath(origResPath, origResPathLen, resPath, len, inKey, path, status);
 2204|  89.8k|                    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (2204:25): [True: 0, False: 89.8k]
  ------------------
 2205|      0|                        ures_close(helper);
  ------------------
  |  | 1652|      0|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2206|      0|                        return fillIn;
 2207|      0|                    }
 2208|  89.8k|                    myPath = path.data();
 2209|  89.8k|                    key = inKey;
 2210|  92.0k|                    do {
 2211|  92.0k|                        res = res_findResource(&(dataEntry->fData), rootRes, &myPath, &key);
  ------------------
  |  |  198|  92.0k|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|  92.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  92.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  92.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2212|  92.0k|                        if (RES_GET_TYPE(res) == URES_ALIAS && *myPath) {
  ------------------
  |  |   68|  92.0k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (2212:29): [True: 4.09k, False: 87.9k]
  |  Branch (2212:64): [True: 2.13k, False: 1.95k]
  ------------------
 2213|       |                            /* We hit an alias, but we didn't finish following the path. */
 2214|  2.13k|                            helper = init_resb_result(dataEntry, res, nullptr, -1, resB, helper, status);
 2215|       |                            /*helper = init_resb_result(dataEntry, res, inKey, -1, resB, helper, status);*/
 2216|  2.13k|                            if(helper) {
  ------------------
  |  Branch (2216:32): [True: 2.13k, False: 0]
  ------------------
 2217|  2.13k|                              dataEntry = helper->fData;
 2218|  2.13k|                              rootRes = helper->fRes;
 2219|  2.13k|                              resPath = helper->fResPath;
 2220|  2.13k|                              len = helper->fResPathLen;
 2221|       |
 2222|  2.13k|                            } else {
 2223|      0|                              break;
 2224|      0|                            }
 2225|  89.8k|                        } else if (res == RES_BOGUS) {
  ------------------
  |  |   65|  89.8k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2225:36): [True: 35.1k, False: 54.7k]
  ------------------
 2226|  35.1k|                            break;
 2227|  35.1k|                        }
 2228|  92.0k|                    } while(*myPath); /* Continue until the whole path is consumed */
  ------------------
  |  Branch (2228:29): [True: 2.13k, False: 54.7k]
  ------------------
 2229|  89.8k|                }
 2230|  89.8k|            }
 2231|       |            /*dataEntry = getFallbackData(resB, &key, &res, status);*/
 2232|  59.0k|            if(res != RES_BOGUS) {
  ------------------
  |  |   65|  59.0k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2232:16): [True: 54.7k, False: 4.28k]
  ------------------
 2233|       |              /* check if resB->fResPath gives the right name here */
 2234|  54.7k|                if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|  54.7k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  54.7k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                              if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|  54.7k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  54.7k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (2234:20): [True: 0, False: 54.7k]
  |  Branch (2234:75): [True: 39.3k, False: 15.4k]
  ------------------
 2235|  39.3k|                    *status = U_USING_DEFAULT_WARNING;
 2236|  39.3k|                } else {
 2237|  15.4k|                    *status = U_USING_FALLBACK_WARNING;
 2238|  15.4k|                }
 2239|       |
 2240|  54.7k|                fillIn = init_resb_result(dataEntry, res, key, -1, resB, fillIn, status);
 2241|  54.7k|                if (resPath != nullptr) {
  ------------------
  |  Branch (2241:21): [True: 8.71k, False: 46.0k]
  ------------------
 2242|  8.71k|                    createPath(origResPath, origResPathLen, resPath, len, inKey, path, status);
 2243|  46.0k|                } else {
 2244|  46.0k|                    const char* separator = nullptr;
 2245|  46.0k|                    if (fillIn->fResPath != nullptr) {
  ------------------
  |  Branch (2245:25): [True: 46.0k, False: 0]
  ------------------
 2246|  46.0k|                        separator = uprv_strchr(fillIn->fResPath, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|  46.0k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  46.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2247|  46.0k|                    }
 2248|  46.0k|                    if (separator != nullptr && separator[1] != '\0') {
  ------------------
  |  Branch (2248:25): [True: 46.0k, False: 0]
  |  Branch (2248:49): [True: 1.95k, False: 44.0k]
  ------------------
 2249|  1.95k|                        createPath(origResPath, origResPathLen, fillIn->fResPath,
 2250|  1.95k|                                   static_cast<int32_t>(uprv_strlen(fillIn->fResPath)), inKey, path, status);
  ------------------
  |  |   37|  1.95k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.95k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2251|  44.0k|                    } else {
 2252|  44.0k|                        createPath(origResPath, origResPathLen, "", 0, inKey, path, status);
 2253|  44.0k|                    }
 2254|  46.0k|                }
 2255|  54.7k|                ures_freeResPath(fillIn);
 2256|  54.7k|                ures_appendResPath(fillIn, path.data(), path.length(), status);
 2257|  54.7k|                if(fillIn->fResPath[fillIn->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  54.7k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2257:20): [True: 52.5k, False: 2.25k]
  ------------------
 2258|  52.5k|                    ures_appendResPath(fillIn, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|  52.5k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 2259|  52.5k|                }
 2260|  54.7k|            } else {
 2261|  4.28k|                *status = U_MISSING_RESOURCE_ERROR;
 2262|  4.28k|            }
 2263|  59.0k|        } else {
 2264|  39.4k|            fillIn = init_resb_result(resB->fData, res, key, -1, resB, fillIn, status);
 2265|  39.4k|        }
 2266|  98.5k|    } 
 2267|      0|    else {
 2268|      0|        *status = U_RESOURCE_TYPE_MISMATCH;
 2269|      0|    }
 2270|  98.5k|    ures_close(helper);
  ------------------
  |  | 1652|  98.5k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  98.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  98.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  98.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2271|  98.5k|    return fillIn;
 2272|  98.5k|}
ures_getAllChildrenWithFallback_78:
 2429|  1.52k|                                icu::ResourceSink &sink, UErrorCode &errorCode) {
 2430|  1.52k|    GetAllChildrenSink allChildrenSink(sink);
 2431|  1.52k|    ures_getAllItemsWithFallback(bundle, path, allChildrenSink, errorCode);
  ------------------
  |  | 1658|  1.52k|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|  1.52k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.52k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.52k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2432|  1.52k|}
ures_getAllItemsWithFallback_78:
 2471|  25.1k|                             icu::ResourceSink &sink, UErrorCode &errorCode) {
 2472|  25.1k|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2472:9): [True: 0, False: 25.1k]
  ------------------
 2473|  25.1k|    if (path == nullptr) {
  ------------------
  |  Branch (2473:9): [True: 0, False: 25.1k]
  ------------------
 2474|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
 2475|      0|        return;
 2476|      0|    }
 2477|  25.1k|    StackUResourceBundle stackBundle;
 2478|  25.1k|    const UResourceBundle *rb;
 2479|  25.1k|    if (*path == 0) {
  ------------------
  |  Branch (2479:9): [True: 1, False: 25.1k]
  ------------------
 2480|       |        // empty path
 2481|      1|        rb = bundle;
 2482|  25.1k|    } else {
 2483|  25.1k|        rb = ures_getByKeyWithFallback(bundle, path, stackBundle.getAlias(), &errorCode);
  ------------------
  |  | 1662|  25.1k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  25.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  25.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  25.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2484|  25.1k|        if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (2484:13): [True: 32, False: 25.0k]
  ------------------
 2485|     32|            return;
 2486|     32|        }
 2487|  25.1k|    }
 2488|       |    // Get all table items with fallback.
 2489|  25.0k|    ResourceDataValue value;
 2490|  25.0k|    getAllItemsWithFallback(rb, value, sink, errorCode);
 2491|  25.0k|}
ures_getByKey_78:
 2493|  67.5k|U_CAPI UResourceBundle* U_EXPORT2 ures_getByKey(const UResourceBundle *resB, const char* inKey, UResourceBundle *fillIn, UErrorCode *status) {
 2494|  67.5k|    Resource res = RES_BOGUS;
  ------------------
  |  |   65|  67.5k|#define RES_BOGUS 0xffffffff
  ------------------
 2495|  67.5k|    UResourceDataEntry *dataEntry = nullptr;
 2496|  67.5k|    const char *key = inKey;
 2497|       |
 2498|  67.5k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2498:9): [True: 0, False: 67.5k]
  |  Branch (2498:28): [True: 0, False: 67.5k]
  ------------------
 2499|      0|        return fillIn;
 2500|      0|    }
 2501|  67.5k|    if(resB == nullptr) {
  ------------------
  |  Branch (2501:8): [True: 0, False: 67.5k]
  ------------------
 2502|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2503|      0|        return fillIn;
 2504|      0|    }
 2505|       |
 2506|  67.5k|    int32_t type = RES_GET_TYPE(resB->fRes);
  ------------------
  |  |   68|  67.5k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2507|  67.5k|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|  67.5k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 66.4k, False: 1.07k]
  |  |  |  Branch (84:61): [True: 1.07k, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2508|  67.5k|        int32_t t;
 2509|  67.5k|        res = res_getTableItemByKey(&resB->getResData(), resB->fRes, &t, &key);
  ------------------
  |  |  207|  67.5k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  67.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  67.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  67.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2510|  67.5k|        if(res == RES_BOGUS) {
  ------------------
  |  |   65|  67.5k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2510:12): [True: 6.52k, False: 61.0k]
  ------------------
 2511|  6.52k|            key = inKey;
 2512|  6.52k|            if(resB->fHasFallback) {
  ------------------
  |  Branch (2512:16): [True: 6.45k, False: 68]
  ------------------
 2513|  6.45k|                dataEntry = getFallbackData(resB, &key, &res, status);
 2514|  6.45k|                if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (2514:20): [True: 6.45k, False: 0]
  ------------------
 2515|       |                    /* check if resB->fResPath gives the right name here */
 2516|  6.45k|                    return init_resb_result(dataEntry, res, key, -1, resB, fillIn, status);
 2517|  6.45k|                } else {
 2518|      0|                    *status = U_MISSING_RESOURCE_ERROR;
 2519|      0|                }
 2520|  6.45k|            } else {
 2521|     68|                *status = U_MISSING_RESOURCE_ERROR;
 2522|     68|            }
 2523|  61.0k|        } else {
 2524|  61.0k|            return init_resb_result(resB->fData, res, key, -1, resB, fillIn, status);
 2525|  61.0k|        }
 2526|  67.5k|    } 
 2527|       |#if 0
 2528|       |    /* this is a kind of TODO item. If we have an array with an index table, we could do this. */
 2529|       |    /* not currently */
 2530|       |    else if(RES_GET_TYPE(resB->fRes) == URES_ARRAY && resB->fHasFallback == true) {
 2531|       |        /* here should go a first attempt to locate the key using index table */
 2532|       |        dataEntry = getFallbackData(resB, &key, &res, status);
 2533|       |        if(U_SUCCESS(*status)) {
 2534|       |            return init_resb_result(dataEntry, res, key, resB, fillIn, status);
 2535|       |        } else {
 2536|       |            *status = U_MISSING_RESOURCE_ERROR;
 2537|       |        }
 2538|       |    }
 2539|       |#endif    
 2540|      0|    else {
 2541|      0|        *status = U_RESOURCE_TYPE_MISMATCH;
 2542|      0|    }
 2543|     68|    return fillIn;
 2544|  67.5k|}
ures_getStringByKey_78:
 2546|  24.4k|U_CAPI const char16_t* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, const char* inKey, int32_t* len, UErrorCode *status) {
 2547|  24.4k|    Resource res = RES_BOGUS;
  ------------------
  |  |   65|  24.4k|#define RES_BOGUS 0xffffffff
  ------------------
 2548|  24.4k|    UResourceDataEntry *dataEntry = nullptr;
 2549|  24.4k|    const char* key = inKey;
 2550|       |
 2551|  24.4k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2551:9): [True: 0, False: 24.4k]
  |  Branch (2551:28): [True: 0, False: 24.4k]
  ------------------
 2552|      0|        return nullptr;
 2553|      0|    }
 2554|  24.4k|    if(resB == nullptr) {
  ------------------
  |  Branch (2554:8): [True: 0, False: 24.4k]
  ------------------
 2555|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2556|      0|        return nullptr;
 2557|      0|    }
 2558|       |
 2559|  24.4k|    int32_t type = RES_GET_TYPE(resB->fRes);
  ------------------
  |  |   68|  24.4k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2560|  24.4k|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|  24.4k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 22.2k, False: 2.22k]
  |  |  |  Branch (84:61): [True: 2.22k, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2561|  24.4k|        int32_t t=0;
 2562|       |
 2563|  24.4k|        res = res_getTableItemByKey(&resB->getResData(), resB->fRes, &t, &key);
  ------------------
  |  |  207|  24.4k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  24.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  24.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  24.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2564|       |
 2565|  24.4k|        if(res == RES_BOGUS) {
  ------------------
  |  |   65|  24.4k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2565:12): [True: 6.94k, False: 17.5k]
  ------------------
 2566|  6.94k|            key = inKey;
 2567|  6.94k|            if(resB->fHasFallback) {
  ------------------
  |  Branch (2567:16): [True: 0, False: 6.94k]
  ------------------
 2568|      0|                dataEntry = getFallbackData(resB, &key, &res, status);
 2569|      0|                if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (2569:20): [True: 0, False: 0]
  ------------------
 2570|      0|                    switch (RES_GET_TYPE(res)) {
  ------------------
  |  |   68|      0|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2571|      0|                    case URES_STRING:
  ------------------
  |  Branch (2571:21): [True: 0, False: 0]
  ------------------
 2572|      0|                    case URES_STRING_V2:
  ------------------
  |  Branch (2572:21): [True: 0, False: 0]
  ------------------
 2573|      0|                        return res_getString({resB, key}, &dataEntry->fData, res, len);
 2574|      0|                    case URES_ALIAS:
  ------------------
  |  Branch (2574:21): [True: 0, False: 0]
  ------------------
 2575|      0|                      {
 2576|      0|                        const char16_t* result = nullptr;
 2577|      0|                        UResourceBundle *tempRes = ures_getByKey(resB, inKey, nullptr, status);
  ------------------
  |  | 1661|      0|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2578|      0|                        result = ures_getString(tempRes, len, status);
  ------------------
  |  | 1675|      0|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2579|      0|                        ures_close(tempRes);
  ------------------
  |  | 1652|      0|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2580|      0|                        return result;
 2581|      0|                      }
 2582|      0|                    default:
  ------------------
  |  Branch (2582:21): [True: 0, False: 0]
  ------------------
 2583|      0|                        *status = U_RESOURCE_TYPE_MISMATCH;
 2584|      0|                    }
 2585|      0|                } else {
 2586|      0|                    *status = U_MISSING_RESOURCE_ERROR;
 2587|      0|                }
 2588|  6.94k|            } else {
 2589|  6.94k|                *status = U_MISSING_RESOURCE_ERROR;
 2590|  6.94k|            }
 2591|  17.5k|        } else {
 2592|  17.5k|            switch (RES_GET_TYPE(res)) {
  ------------------
  |  |   68|  17.5k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2593|      0|            case URES_STRING:
  ------------------
  |  Branch (2593:13): [True: 0, False: 17.5k]
  ------------------
 2594|  17.5k|            case URES_STRING_V2:
  ------------------
  |  Branch (2594:13): [True: 17.5k, False: 0]
  ------------------
 2595|  17.5k|                return res_getString({resB, key}, &resB->getResData(), res, len);
 2596|      0|            case URES_ALIAS:
  ------------------
  |  Branch (2596:13): [True: 0, False: 17.5k]
  ------------------
 2597|      0|              {
 2598|      0|                const char16_t* result = nullptr;
 2599|      0|                UResourceBundle *tempRes = ures_getByKey(resB, inKey, nullptr, status);
  ------------------
  |  | 1661|      0|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2600|      0|                result = ures_getString(tempRes, len, status);
  ------------------
  |  | 1675|      0|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2601|      0|                ures_close(tempRes);
  ------------------
  |  | 1652|      0|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2602|      0|                return result;
 2603|      0|              }
 2604|      0|            default:
  ------------------
  |  Branch (2604:13): [True: 0, False: 17.5k]
  ------------------
 2605|      0|                *status = U_RESOURCE_TYPE_MISMATCH;
 2606|  17.5k|            }
 2607|  17.5k|        }
 2608|  24.4k|    } 
 2609|       |#if 0 
 2610|       |    /* this is a kind of TODO item. If we have an array with an index table, we could do this. */
 2611|       |    /* not currently */   
 2612|       |    else if(RES_GET_TYPE(resB->fRes) == URES_ARRAY && resB->fHasFallback == true) {
 2613|       |        /* here should go a first attempt to locate the key using index table */
 2614|       |        dataEntry = getFallbackData(resB, &key, &res, status);
 2615|       |        if(U_SUCCESS(*status)) {
 2616|       |            // TODO: Tracing
 2617|       |            return res_getString(rd, res, len);
 2618|       |        } else {
 2619|       |            *status = U_MISSING_RESOURCE_ERROR;
 2620|       |        }
 2621|       |    } 
 2622|       |#endif    
 2623|      0|    else {
 2624|      0|        *status = U_RESOURCE_TYPE_MISMATCH;
 2625|      0|    }
 2626|  6.94k|    return nullptr;
 2627|  24.4k|}
ures_getLocaleByType_78:
 2671|  18.6k|                     UErrorCode* status) {
 2672|  18.6k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2672:9): [True: 0, False: 18.6k]
  |  Branch (2672:28): [True: 0, False: 18.6k]
  ------------------
 2673|      0|        return nullptr;
 2674|      0|    }
 2675|  18.6k|    if (!resourceBundle) {
  ------------------
  |  Branch (2675:9): [True: 0, False: 18.6k]
  ------------------
 2676|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2677|      0|        return nullptr;
 2678|  18.6k|    } else {
 2679|  18.6k|        switch(type) {
 2680|  9.33k|        case ULOC_ACTUAL_LOCALE:
  ------------------
  |  Branch (2680:9): [True: 9.33k, False: 9.33k]
  ------------------
 2681|  9.33k|            return resourceBundle->fData->fName;
 2682|  9.33k|        case ULOC_VALID_LOCALE:
  ------------------
  |  Branch (2682:9): [True: 9.33k, False: 9.33k]
  ------------------
 2683|  9.33k|            return resourceBundle->fValidLocaleDataEntry->fName;
 2684|      0|        case ULOC_REQUESTED_LOCALE:
  ------------------
  |  Branch (2684:9): [True: 0, False: 18.6k]
  ------------------
 2685|      0|        default:
  ------------------
  |  Branch (2685:9): [True: 0, False: 18.6k]
  ------------------
 2686|      0|            *status = U_ILLEGAL_ARGUMENT_ERROR;
 2687|      0|            return nullptr;
 2688|  18.6k|        }
 2689|  18.6k|    }
 2690|  18.6k|}
ures_open_78:
 2769|  67.0k|ures_open(const char* path, const char* localeID, UErrorCode* status) {
 2770|  67.0k|    return ures_openWithType(nullptr, path, localeID, URES_OPEN_LOCALE_DEFAULT_ROOT, status);
 2771|  67.0k|}
ures_openDirect_78:
 2783|  16.8k|ures_openDirect(const char* path, const char* localeID, UErrorCode* status) {
 2784|  16.8k|    return ures_openWithType(nullptr, path, localeID, URES_OPEN_DIRECT, status);
 2785|  16.8k|}
uresbund.cpp:_ZL21ures_setIsStackObjectP15UResourceBundlea:
  711|   220k|static void ures_setIsStackObject( UResourceBundle* resB, UBool state) {
  712|   220k|    if(state) {
  ------------------
  |  Branch (712:8): [True: 82.0k, False: 138k]
  ------------------
  713|  82.0k|        resB->fMagic1 = 0;
  714|  82.0k|        resB->fMagic2 = 0;
  715|   138k|    } else {
  716|   138k|        resB->fMagic1 = MAGIC1;
  ------------------
  |  |   30|   138k|#define MAGIC1 19700503
  ------------------
  717|   138k|        resB->fMagic2 = MAGIC2;
  ------------------
  |  |   31|   138k|#define MAGIC2 19641227
  ------------------
  718|   138k|    }
  719|   220k|}
uresbund.cpp:_ZL16ures_closeBundleP15UResourceBundlea:
 1123|   317k|{
 1124|   317k|    if(resB != nullptr) {
  ------------------
  |  Branch (1124:8): [True: 220k, False: 96.3k]
  ------------------
 1125|   220k|        if(resB->fData != nullptr) {
  ------------------
  |  Branch (1125:12): [True: 216k, False: 4.01k]
  ------------------
 1126|   216k|            entryClose(resB->fData);
 1127|   216k|        }
 1128|   220k|        if(resB->fVersion != nullptr) {
  ------------------
  |  Branch (1128:12): [True: 0, False: 220k]
  ------------------
 1129|      0|            uprv_free(resB->fVersion);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1130|      0|        }
 1131|   220k|        ures_freeResPath(resB);
 1132|       |
 1133|   220k|        if(ures_isStackObject(resB) == false && freeBundleObj) {
  ------------------
  |  Branch (1133:12): [True: 138k, False: 82.0k]
  |  Branch (1133:49): [True: 138k, False: 0]
  ------------------
 1134|   138k|            uprv_free(resB);
  ------------------
  |  | 1503|   138k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|   138k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   138k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   138k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1135|   138k|        }
 1136|       |#if 0 /*U_DEBUG*/
 1137|       |        else {
 1138|       |            /* poison the data */
 1139|       |            uprv_memset(resB, -1, sizeof(UResourceBundle));
 1140|       |        }
 1141|       |#endif
 1142|   220k|    }
 1143|   317k|}
uresbund.cpp:_ZL10entryCloseP18UResourceDataEntry:
 1061|   267k|static void entryClose(UResourceDataEntry *resB) {
 1062|   267k|  Mutex lock(&resbMutex);
 1063|   267k|  entryCloseInt(resB);
 1064|   267k|}
uresbund.cpp:_ZL13entryCloseIntP18UResourceDataEntry:
 1028|   267k|static void entryCloseInt(UResourceDataEntry *resB) {
 1029|   267k|    UResourceDataEntry *p = resB;
 1030|       |
 1031|   733k|    while(resB != nullptr) {
  ------------------
  |  Branch (1031:11): [True: 465k, False: 267k]
  ------------------
 1032|   465k|        p = resB->fParent;
 1033|   465k|        resB->fCountExisting--;
 1034|       |
 1035|       |        /* Entries are left in the cache. TODO: add ures_flushCache() to force a flush
 1036|       |         of the cache. */
 1037|       |/*
 1038|       |        if(resB->fCountExisting <= 0) {
 1039|       |            uhash_remove(cache, resB);
 1040|       |            if(resB->fBogus == U_ZERO_ERROR) {
 1041|       |                res_unload(&(resB->fData));
 1042|       |            }
 1043|       |            if(resB->fName != nullptr) {
 1044|       |                uprv_free(resB->fName);
 1045|       |            }
 1046|       |            if(resB->fPath != nullptr) {
 1047|       |                uprv_free(resB->fPath);
 1048|       |            }
 1049|       |            uprv_free(resB);
 1050|       |        }
 1051|       |*/
 1052|       |
 1053|   465k|        resB = p;
 1054|   465k|    }
 1055|   267k|}
uresbund.cpp:_ZL18ures_isStackObjectPK15UResourceBundle:
  721|   220k|static UBool ures_isStackObject(const UResourceBundle* resB) {
  722|   220k|  return((resB->fMagic1 == MAGIC1 && resB->fMagic2 == MAGIC2)?false:true);
  ------------------
  |  |   30|   441k|#define MAGIC1 19700503
  ------------------
                return((resB->fMagic1 == MAGIC1 && resB->fMagic2 == MAGIC2)?false:true);
  ------------------
  |  |   31|   138k|#define MAGIC2 19641227
  ------------------
  |  Branch (722:11): [True: 138k, False: 82.0k]
  |  Branch (722:38): [True: 138k, False: 0]
  ------------------
  723|   220k|}
uresbund.cpp:_ZL18ures_appendResPathP15UResourceBundlePKciP10UErrorCode:
 1083|   488k|static void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t lenToAdd, UErrorCode *status) {
 1084|   488k|    int32_t resPathLenOrig = resB->fResPathLen;
 1085|   488k|    if(resB->fResPath == nullptr) {
  ------------------
  |  Branch (1085:8): [True: 209k, False: 279k]
  ------------------
 1086|   209k|        resB->fResPath = resB->fResBuf;
 1087|   209k|        *(resB->fResPath) = 0;
 1088|   209k|        resB->fResPathLen = 0;
 1089|   209k|    } 
 1090|   488k|    resB->fResPathLen += lenToAdd;
 1091|   488k|    if(RES_BUFSIZE <= resB->fResPathLen+1) {
  ------------------
  |  |   59|   488k|#define RES_BUFSIZE 64
  ------------------
  |  Branch (1091:8): [True: 0, False: 488k]
  ------------------
 1092|      0|        if(resB->fResPath == resB->fResBuf) {
  ------------------
  |  Branch (1092:12): [True: 0, False: 0]
  ------------------
 1093|      0|            resB->fResPath = static_cast<char*>(uprv_malloc((resB->fResPathLen + 1) * sizeof(char)));
  ------------------
  |  | 1524|      0|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1094|       |            /* Check that memory was allocated correctly. */
 1095|      0|            if (resB->fResPath == nullptr) {
  ------------------
  |  Branch (1095:17): [True: 0, False: 0]
  ------------------
 1096|      0|                *status = U_MEMORY_ALLOCATION_ERROR;
 1097|      0|                return;
 1098|      0|            }
 1099|      0|            uprv_strcpy(resB->fResPath, resB->fResBuf);
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1100|      0|        } else {
 1101|      0|            char* temp = static_cast<char*>(uprv_realloc(resB->fResPath, (resB->fResPathLen + 1) * sizeof(char)));
  ------------------
  |  | 1536|      0|#define uprv_realloc U_ICU_ENTRY_POINT_RENAME(uprv_realloc)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1102|       |            /* Check that memory was reallocated correctly. */
 1103|      0|            if (temp == nullptr) {
  ------------------
  |  Branch (1103:17): [True: 0, False: 0]
  ------------------
 1104|      0|                *status = U_MEMORY_ALLOCATION_ERROR;
 1105|      0|                return;
 1106|      0|            }
 1107|      0|            resB->fResPath = temp;
 1108|      0|        }
 1109|      0|    }
 1110|   488k|    uprv_strcpy(resB->fResPath + resPathLenOrig, toAdd);
  ------------------
  |  |   36|   488k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|   488k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1111|   488k|}
uresbund.cpp:_ZL13entryIncreaseP18UResourceDataEntry:
  304|   183k|static void entryIncrease(UResourceDataEntry *entry) {
  305|   183k|    Mutex lock(&resbMutex);
  306|   183k|    entry->fCountExisting++;
  307|   265k|    while(entry->fParent != nullptr) {
  ------------------
  |  Branch (307:11): [True: 81.7k, False: 183k]
  ------------------
  308|  81.7k|      entry = entry->fParent;
  309|  81.7k|      entry->fCountExisting++;
  310|  81.7k|    }
  311|   183k|}
uresbund.cpp:_ZL23ures_getStringWithAliasPK15UResourceBundlejiPiP10UErrorCode:
 1709|  7.76k|static const char16_t* ures_getStringWithAlias(const UResourceBundle *resB, Resource r, int32_t sIndex, int32_t *len, UErrorCode *status) {
 1710|  7.76k|  if(RES_GET_TYPE(r) == URES_ALIAS) {
  ------------------
  |  |   68|  7.76k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (1710:6): [True: 0, False: 7.76k]
  ------------------
 1711|      0|    const char16_t* result = nullptr;
 1712|      0|    UResourceBundle *tempRes = ures_getByIndex(resB, sIndex, nullptr, status);
  ------------------
  |  | 1660|      0|#define ures_getByIndex U_ICU_ENTRY_POINT_RENAME(ures_getByIndex)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1713|      0|    result = ures_getString(tempRes, len, status);
  ------------------
  |  | 1675|      0|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1714|      0|    ures_close(tempRes);
  ------------------
  |  | 1652|      0|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1715|      0|    return result;
 1716|  7.76k|  } else {
 1717|  7.76k|    return res_getString({resB, sIndex}, &resB->getResData(), r, len); 
 1718|  7.76k|  }
 1719|  7.76k|}
uresbund.cpp:_ZN12_GLOBAL__N_116init_resb_resultEP18UResourceDataEntryjPKciPK15UResourceBundlePS4_P10UErrorCode:
 1480|   171k|        UResourceBundle *resB, UErrorCode *status) {
 1481|   171k|    return init_resb_result(
 1482|   171k|        dataEntry, r, key, idx,
 1483|   171k|        container->fValidLocaleDataEntry, container->fResPath, 0, resB, status);
 1484|   171k|}
uresbund.cpp:_ZN12_GLOBAL__N_116init_resb_resultEP18UResourceDataEntryjPKciS1_S3_iP15UResourceBundleP10UErrorCode:
 1389|   175k|        UResourceBundle *resB, UErrorCode *status) {
 1390|       |    // TODO: When an error occurs: Should we return nullptr vs. resB?
 1391|   175k|    if(status == nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1391:8): [True: 0, False: 175k]
  |  Branch (1391:29): [True: 0, False: 175k]
  ------------------
 1392|      0|        return resB;
 1393|      0|    }
 1394|   175k|    if (validLocaleDataEntry == nullptr) {
  ------------------
  |  Branch (1394:9): [True: 0, False: 175k]
  ------------------
 1395|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1396|      0|        return nullptr;
 1397|      0|    }
 1398|   175k|    if(RES_GET_TYPE(r) == URES_ALIAS) {
  ------------------
  |  |   68|   175k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (1398:8): [True: 4.28k, False: 171k]
  ------------------
 1399|       |        // This is an alias, need to exchange with real data.
 1400|  4.28k|        if(recursionDepth >= URES_MAX_ALIAS_LEVEL) {
  ------------------
  |  |   33|  4.28k|#define URES_MAX_ALIAS_LEVEL 256
  ------------------
  |  Branch (1400:12): [True: 0, False: 4.28k]
  ------------------
 1401|      0|            *status = U_TOO_MANY_ALIASES_ERROR;
 1402|      0|            return resB;
 1403|      0|        }
 1404|  4.28k|        return getAliasTargetAsResourceBundle(
 1405|  4.28k|            dataEntry->fData, r, key, idx,
 1406|  4.28k|            validLocaleDataEntry, containerResPath, recursionDepth, resB, status);
 1407|  4.28k|    }
 1408|   171k|    if(resB == nullptr) {
  ------------------
  |  Branch (1408:8): [True: 55.0k, False: 116k]
  ------------------
 1409|  55.0k|        resB = static_cast<UResourceBundle*>(uprv_malloc(sizeof(UResourceBundle)));
  ------------------
  |  | 1524|  55.0k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  55.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  55.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  55.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1410|  55.0k|        if (resB == nullptr) {
  ------------------
  |  Branch (1410:13): [True: 0, False: 55.0k]
  ------------------
 1411|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
 1412|      0|            return nullptr;
 1413|      0|        }
 1414|  55.0k|        ures_setIsStackObject(resB, false);
 1415|  55.0k|        resB->fResPath = nullptr;
 1416|  55.0k|        resB->fResPathLen = 0;
 1417|   116k|    } else {
 1418|   116k|        if(resB->fData != nullptr) {
  ------------------
  |  Branch (1418:12): [True: 50.7k, False: 65.8k]
  ------------------
 1419|  50.7k|            entryClose(resB->fData);
 1420|  50.7k|        }
 1421|   116k|        if(resB->fVersion != nullptr) {
  ------------------
  |  Branch (1421:12): [True: 0, False: 116k]
  ------------------
 1422|      0|            uprv_free(resB->fVersion);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1423|      0|        }
 1424|       |        /* 
 1425|       |        weiv: if stack object was passed in, it doesn't really need to be reinited,
 1426|       |        since the purpose of initing is to remove stack junk. However, at this point 
 1427|       |        we would not do anything to an allocated object, so stack object should be
 1428|       |        treated the same
 1429|       |        */
 1430|       |        /*
 1431|       |        if(ures_isStackObject(resB) != false) {
 1432|       |        ures_initStackObject(resB);
 1433|       |        }
 1434|       |        */
 1435|   116k|        if(containerResPath != resB->fResPath) {
  ------------------
  |  Branch (1435:12): [True: 28.0k, False: 88.6k]
  ------------------
 1436|  28.0k|            ures_freeResPath(resB);
 1437|  28.0k|        }
 1438|   116k|    }
 1439|   171k|    resB->fData = dataEntry;
 1440|   171k|    entryIncrease(resB->fData);
 1441|   171k|    resB->fHasFallback = false;
 1442|   171k|    resB->fIsTopLevel = false;
 1443|   171k|    resB->fIndex = -1;
 1444|   171k|    resB->fKey = key; 
 1445|   171k|    resB->fValidLocaleDataEntry = validLocaleDataEntry;
 1446|   171k|    if(containerResPath != resB->fResPath) {
  ------------------
  |  Branch (1446:8): [True: 45.5k, False: 126k]
  ------------------
 1447|  45.5k|        ures_appendResPath(
 1448|  45.5k|            resB, containerResPath, static_cast<int32_t>(uprv_strlen(containerResPath)), status);
  ------------------
  |  |   37|  45.5k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  45.5k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1449|  45.5k|    }
 1450|   171k|    if(key != nullptr) {
  ------------------
  |  Branch (1450:8): [True: 165k, False: 6.54k]
  ------------------
 1451|   165k|        ures_appendResPath(resB, key, static_cast<int32_t>(uprv_strlen(key)), status);
  ------------------
  |  |   37|   165k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   165k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1452|   165k|        if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   165k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1452:12): [True: 153k, False: 11.5k]
  ------------------
 1453|   153k|            ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|   153k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 1454|   153k|        }
 1455|   165k|    } else if(idx >= 0) {
  ------------------
  |  Branch (1455:15): [True: 6.54k, False: 0]
  ------------------
 1456|  6.54k|        char buf[256];
 1457|  6.54k|        int32_t len = T_CString_integerToString(buf, idx, 10);
  ------------------
  |  |   67|  6.54k|#define T_CString_integerToString U_ICU_ENTRY_POINT_RENAME(T_CString_integerToString)
  |  |  ------------------
  |  |  |  |  123|  6.54k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.54k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.54k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1458|  6.54k|        ures_appendResPath(resB, buf, len, status);
 1459|  6.54k|        if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  6.54k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1459:12): [True: 6.54k, False: 0]
  ------------------
 1460|  6.54k|            ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|  6.54k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 1461|  6.54k|        }
 1462|  6.54k|    }
 1463|       |    /* Make sure that Purify doesn't complain about uninitialized memory copies. */
 1464|   171k|    {
 1465|   171k|        int32_t usedLen = ((resB->fResBuf == resB->fResPath) ? resB->fResPathLen : 0);
  ------------------
  |  Branch (1465:28): [True: 171k, False: 0]
  ------------------
 1466|   171k|        uprv_memset(resB->fResBuf + usedLen, 0, sizeof(resB->fResBuf) - usedLen);
  ------------------
  |  |  100|   171k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|   171k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1467|   171k|    }
 1468|       |
 1469|   171k|    resB->fVersion = nullptr;
 1470|   171k|    resB->fRes = r;
 1471|   171k|    resB->fSize = res_countArrayItems(&resB->getResData(), resB->fRes);
  ------------------
  |  |  197|   171k|#define res_countArrayItems U_ICU_ENTRY_POINT_RENAME(res_countArrayItems)
  |  |  ------------------
  |  |  |  |  123|   171k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   171k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   171k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1472|   171k|    ResourceTracer(resB).trace("get");
 1473|   171k|    return resB;
 1474|   171k|}
uresbund.cpp:_ZN12_GLOBAL__N_130getAliasTargetAsResourceBundleERK12ResourceDatajPKciP18UResourceDataEntryS4_iP15UResourceBundleP10UErrorCode:
 1166|  4.28k|        UResourceBundle *resB, UErrorCode *status) {
 1167|       |    // TODO: When an error occurs: Should we return nullptr vs. resB?
 1168|  4.28k|    if (U_FAILURE(*status)) { return resB; }
  ------------------
  |  Branch (1168:9): [True: 0, False: 4.28k]
  ------------------
 1169|  4.28k|    U_ASSERT(RES_GET_TYPE(r) == URES_ALIAS);
  ------------------
  |  |   35|  4.28k|#   define U_ASSERT(exp) (void)0
  ------------------
 1170|  4.28k|    int32_t len = 0;
 1171|  4.28k|    const char16_t *alias = res_getAlias(&resData, r, &len);
  ------------------
  |  |  199|  4.28k|#define res_getAlias U_ICU_ENTRY_POINT_RENAME(res_getAlias)
  |  |  ------------------
  |  |  |  |  123|  4.28k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.28k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.28k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1172|  4.28k|    if(len <= 0) {
  ------------------
  |  Branch (1172:8): [True: 0, False: 4.28k]
  ------------------
 1173|       |        // bad alias
 1174|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1175|      0|        return resB;
 1176|      0|    }
 1177|       |
 1178|       |    // Copy the UTF-16 alias string into an invariant-character string.
 1179|       |    //
 1180|       |    // We do this so that res_findResource() can modify the path,
 1181|       |    // which allows us to remove redundant _res_findResource() variants
 1182|       |    // in uresdata.c.
 1183|       |    // res_findResource() now NUL-terminates each segment so that table keys
 1184|       |    // can always be compared with strcmp() instead of strncmp().
 1185|       |    // Saves code there and simplifies testing and code coverage.
 1186|       |    //
 1187|       |    // markus 2003oct17
 1188|  4.28k|    CharString chAlias;
 1189|  4.28k|    chAlias.appendInvariantChars(alias, len, *status);
 1190|  4.28k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1190:9): [True: 0, False: 4.28k]
  ------------------
 1191|      0|        return nullptr;
 1192|      0|    }
 1193|       |
 1194|       |    // We have an alias, now let's cut it up.
 1195|  4.28k|    const char *path = nullptr, *locale = nullptr, *keyPath = nullptr;
 1196|  4.28k|    if(chAlias[0] == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  4.28k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1196:8): [True: 4.28k, False: 0]
  ------------------
 1197|       |        // There is a path included.
 1198|  4.28k|        char *chAliasData = chAlias.data();
 1199|  4.28k|        char *sep = chAliasData + 1;
 1200|  4.28k|        path = sep;
 1201|  4.28k|        sep = uprv_strchr(sep, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|  4.28k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  4.28k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1202|  4.28k|        if(sep != nullptr) {
  ------------------
  |  Branch (1202:12): [True: 4.28k, False: 0]
  ------------------
 1203|  4.28k|            *sep++ = 0;
 1204|  4.28k|        }
 1205|  4.28k|        if(uprv_strcmp(path, "LOCALE") == 0) {
  ------------------
  |  |   38|  4.28k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  4.28k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1205:12): [True: 4.28k, False: 0]
  ------------------
 1206|       |            // This is an XPath alias, starting with "/LOCALE/".
 1207|       |            // It contains the path to a resource which should be looked up
 1208|       |            // starting in the valid locale.
 1209|       |            // TODO: Can/should we forbid a /LOCALE alias without key path?
 1210|       |            //   It seems weird to alias to the same path, just starting from the valid locale.
 1211|       |            //   That will often yield an infinite loop.
 1212|  4.28k|            keyPath = sep;
 1213|       |            // Read from the valid locale which we already have.
 1214|  4.28k|            path = locale = nullptr;
 1215|  4.28k|        } else {
 1216|      0|            if(uprv_strcmp(path, "ICUDATA") == 0) { /* want ICU data */
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1216:16): [True: 0, False: 0]
  ------------------
 1217|      0|                path = nullptr;
 1218|      0|            }
 1219|      0|            if (sep == nullptr) {
  ------------------
  |  Branch (1219:17): [True: 0, False: 0]
  ------------------
 1220|       |                // TODO: This ends up using the root bundle. Can/should we forbid this?
 1221|      0|                locale = "";
 1222|      0|            } else {
 1223|      0|                locale = sep;
 1224|      0|                sep = uprv_strchr(sep, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1225|      0|                if(sep != nullptr) {
  ------------------
  |  Branch (1225:20): [True: 0, False: 0]
  ------------------
 1226|      0|                    *sep++ = 0;
 1227|      0|                }
 1228|      0|                keyPath = sep;
 1229|      0|            }
 1230|      0|        }
 1231|  4.28k|    } else {
 1232|       |        // No path, start with a locale.
 1233|      0|        char *sep = chAlias.data();
 1234|      0|        locale = sep;
 1235|      0|        sep = uprv_strchr(sep, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1236|      0|        if(sep != nullptr) {
  ------------------
  |  Branch (1236:12): [True: 0, False: 0]
  ------------------
 1237|      0|            *sep++ = 0;
 1238|      0|        }
 1239|      0|        keyPath = sep;
 1240|      0|        path = validLocaleDataEntry->fPath;
 1241|      0|    }
 1242|       |
 1243|       |    // Got almost everything, let's try to open.
 1244|       |    // First, open the bundle with real data.
 1245|  4.28k|    LocalUResourceBundlePointer mainRes;
 1246|  4.28k|    UResourceDataEntry *dataEntry;
 1247|  4.28k|    if (locale == nullptr) {
  ------------------
  |  Branch (1247:9): [True: 4.28k, False: 0]
  ------------------
 1248|       |        // alias = /LOCALE/keyPath
 1249|       |        // Read from the valid locale which we already have.
 1250|  4.28k|        dataEntry = validLocaleDataEntry;
 1251|  4.28k|    } else {
 1252|      0|        UErrorCode intStatus = U_ZERO_ERROR;
 1253|       |        // TODO: Shouldn't we use ures_open() for locale data bundles (!noFallback)?
 1254|      0|        mainRes.adoptInstead(ures_openDirect(path, locale, &intStatus));
  ------------------
  |  | 1693|      0|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1255|      0|        if(U_FAILURE(intStatus)) {
  ------------------
  |  Branch (1255:12): [True: 0, False: 0]
  ------------------
 1256|       |            // We failed to open the resource bundle we're aliasing to.
 1257|      0|            *status = intStatus;
 1258|      0|            return resB;
 1259|      0|        }
 1260|      0|        dataEntry = mainRes->fData;
 1261|      0|    }
 1262|       |
 1263|  4.28k|    const char* temp = nullptr;
 1264|  4.28k|    if(keyPath == nullptr) {
  ------------------
  |  Branch (1264:8): [True: 0, False: 4.28k]
  ------------------
 1265|       |        // No key path. This means that we are going to to use the corresponding resource from
 1266|       |        // another bundle.
 1267|       |        // TODO: Why the special code path?
 1268|       |        //   Why not put together a key path from containerResPath + key or idx,
 1269|       |        //   as a comment below suggests, and go into the regular code branch?
 1270|       |        // First, we are going to get a corresponding container
 1271|       |        // resource to the one we are searching.
 1272|      0|        r = dataEntry->fData.rootRes;
 1273|      0|        if(containerResPath) {
  ------------------
  |  Branch (1273:12): [True: 0, False: 0]
  ------------------
 1274|      0|            chAlias.clear().append(containerResPath, *status);
 1275|      0|            if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1275:17): [True: 0, False: 0]
  ------------------
 1276|      0|                return nullptr;
 1277|      0|            }
 1278|      0|            char *aKey = chAlias.data();
 1279|       |            // TODO: should res_findResource() return a new dataEntry, too?
 1280|      0|            r = res_findResource(&dataEntry->fData, r, &aKey, &temp);
  ------------------
  |  |  198|      0|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1281|      0|        }
 1282|      0|        if(key) {
  ------------------
  |  Branch (1282:12): [True: 0, False: 0]
  ------------------
 1283|       |            // We need to make keyPath from the containerResPath and
 1284|       |            // current key, if there is a key associated.
 1285|      0|            chAlias.clear().append(key, *status);
 1286|      0|            if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1286:17): [True: 0, False: 0]
  ------------------
 1287|      0|                return nullptr;
 1288|      0|            }
 1289|      0|            char *aKey = chAlias.data();
 1290|      0|            r = res_findResource(&dataEntry->fData, r, &aKey, &temp);
  ------------------
  |  |  198|      0|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1291|      0|        } else if(idx != -1) {
  ------------------
  |  Branch (1291:19): [True: 0, False: 0]
  ------------------
 1292|       |            // If there is no key, but there is an index, try to get by the index.
 1293|       |            // Here we have either a table or an array, so get the element.
 1294|      0|            int32_t type = RES_GET_TYPE(r);
  ------------------
  |  |   68|      0|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1295|      0|            if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|      0|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 0, False: 0]
  |  |  |  Branch (84:61): [True: 0, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1296|      0|                const char *aKey;
 1297|      0|                r = res_getTableItemByIndex(&dataEntry->fData, r, idx, &aKey);
  ------------------
  |  |  206|      0|#define res_getTableItemByIndex U_ICU_ENTRY_POINT_RENAME(res_getTableItemByIndex)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1298|      0|            } else { /* array */
 1299|      0|                r = res_getArrayItem(&dataEntry->fData, r, idx);
  ------------------
  |  |  200|      0|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1300|      0|            }
 1301|      0|        }
 1302|      0|        if(r != RES_BOGUS) {
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1302:12): [True: 0, False: 0]
  ------------------
 1303|      0|            resB = init_resb_result(
 1304|      0|                dataEntry, r, temp, -1, validLocaleDataEntry, nullptr, recursionDepth+1,
 1305|      0|                resB, status);
 1306|      0|        } else {
 1307|      0|            *status = U_MISSING_RESOURCE_ERROR;
 1308|      0|        }
 1309|  4.28k|    } else {
 1310|       |        // This one is a bit trickier.
 1311|       |        // We start finding keys, but after we resolve one alias, the path might continue.
 1312|       |        // Consider:
 1313|       |        //     aliastest:alias { "testtypes/anotheralias/Sequence" }
 1314|       |        //     anotheralias:alias { "/ICUDATA/sh/CollationElements" }
 1315|       |        // aliastest resource should finally have the sequence, not collation elements.
 1316|  4.28k|        CharString pathBuf(keyPath, *status);
 1317|  4.28k|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1317:13): [True: 0, False: 4.28k]
  ------------------
 1318|      0|            return nullptr;
 1319|      0|        }
 1320|  4.28k|        char *myPath = pathBuf.data();
 1321|  4.28k|        containerResPath = nullptr;
 1322|       |        // Now we have fallback following here.
 1323|  8.93k|        for(;;) {
 1324|  8.93k|            r = dataEntry->fData.rootRes;
 1325|       |            // TODO: Move  containerResPath = nullptr  to here,
 1326|       |            // consistent with restarting from the rootRes of another bundle?!
 1327|       |
 1328|       |            // This loop handles 'found' resources over several levels.
 1329|  13.2k|            while(*myPath && U_SUCCESS(*status)) {
  ------------------
  |  Branch (1329:19): [True: 8.93k, False: 4.28k]
  |  Branch (1329:30): [True: 8.93k, False: 0]
  ------------------
 1330|  8.93k|                r = res_findResource(&(dataEntry->fData), r, &myPath, &temp);
  ------------------
  |  |  198|  8.93k|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|  8.93k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  8.93k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  8.93k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1331|  8.93k|                if(r == RES_BOGUS) {
  ------------------
  |  |   65|  8.93k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1331:20): [True: 4.64k, False: 4.28k]
  ------------------
 1332|       |                    // No resource found, we don't really want to look anymore on this level.
 1333|  4.64k|                    break;
 1334|  4.64k|                }
 1335|       |                // Found a resource, but it might be an indirection.
 1336|  4.28k|                resB = init_resb_result(
 1337|  4.28k|                    dataEntry, r, temp, -1,
 1338|  4.28k|                    validLocaleDataEntry, containerResPath, recursionDepth+1,
 1339|  4.28k|                    resB, status);
 1340|  4.28k|                if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1340:21): [True: 0, False: 4.28k]
  ------------------
 1341|      0|                    break;
 1342|      0|                }
 1343|  4.28k|                if (temp == nullptr || uprv_strcmp(keyPath, temp) != 0) {
  ------------------
  |  |   38|  4.28k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  4.28k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1343:21): [True: 0, False: 4.28k]
  |  Branch (1343:40): [True: 2.15k, False: 2.13k]
  ------------------
 1344|       |                    // The call to init_resb_result() above will set resB->fKeyPath to be
 1345|       |                    // the same as resB->fKey,
 1346|       |                    // throwing away any additional path elements if we had them --
 1347|       |                    // if the key path wasn't just a single resource ID, clear out
 1348|       |                    // the bundle's key path and re-set it to be equal to keyPath.
 1349|  2.15k|                    ures_freeResPath(resB);
 1350|  2.15k|                    ures_appendResPath(resB, keyPath, static_cast<int32_t>(uprv_strlen(keyPath)), status);
  ------------------
  |  |   37|  2.15k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  2.15k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1351|  2.15k|                    if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  2.15k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1351:24): [True: 2.15k, False: 0]
  ------------------
 1352|  2.15k|                        ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|  2.15k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 1353|  2.15k|                    }
 1354|  2.15k|                    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1354:25): [True: 0, False: 2.15k]
  ------------------
 1355|      0|                        break;
 1356|      0|                    }
 1357|  2.15k|                }
 1358|  4.28k|                r = resB->fRes; /* switch to a new resource, possibly a new tree */
 1359|  4.28k|                dataEntry = resB->fData;
 1360|  4.28k|                containerResPath = resB->fResPath;
 1361|  4.28k|            }
 1362|  8.93k|            if (U_FAILURE(*status) || r != RES_BOGUS) {
  ------------------
  |  |   65|  8.93k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1362:17): [True: 0, False: 8.93k]
  |  Branch (1362:39): [True: 4.28k, False: 4.64k]
  ------------------
 1363|  4.28k|                break;
 1364|  4.28k|            }
 1365|       |            // Fall back to the parent bundle, if there is one.
 1366|  4.64k|            dataEntry = dataEntry->fParent;
 1367|  4.64k|            if (dataEntry == nullptr) {
  ------------------
  |  Branch (1367:17): [True: 0, False: 4.64k]
  ------------------
 1368|      0|                *status = U_MISSING_RESOURCE_ERROR;
 1369|      0|                break;
 1370|      0|            }
 1371|       |            // Copy the same keyPath again.
 1372|  4.64k|            myPath = pathBuf.data();
 1373|  4.64k|            uprv_strcpy(myPath, keyPath);
  ------------------
  |  |   36|  4.64k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  4.64k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1374|  4.64k|        }
 1375|  4.28k|    }
 1376|  4.28k|    if(mainRes.getAlias() == resB) {
  ------------------
  |  Branch (1376:8): [True: 0, False: 4.28k]
  ------------------
 1377|      0|        mainRes.orphan();
 1378|      0|    }
 1379|  4.28k|    ResourceTracer(resB).maybeTrace("getalias");
 1380|  4.28k|    return resB;
 1381|  4.28k|}
uresbund.cpp:_ZL21getTableItemByKeyPathPK12ResourceDatajPKc:
 2059|  98.5k|static Resource getTableItemByKeyPath(const ResourceData *pResData, Resource table, const char *key) {
 2060|  98.5k|  Resource resource = table;  /* The current resource */
 2061|  98.5k|  icu::CharString path;
 2062|  98.5k|  UErrorCode errorCode = U_ZERO_ERROR;
 2063|  98.5k|  path.append(key, errorCode);
 2064|  98.5k|  if (U_FAILURE(errorCode)) { return RES_BOGUS; }
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2064:7): [True: 0, False: 98.5k]
  ------------------
 2065|  98.5k|  char *pathPart = path.data();  /* Path from current resource to desired resource */
 2066|  98.5k|  UResType type = static_cast<UResType>(RES_GET_TYPE(resource)); /* the current resource type */
  ------------------
  |  |   68|  98.5k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2067|   258k|  while (*pathPart && resource != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   65|   443k|#define RES_BOGUS 0xffffffff
  ------------------
                while (*pathPart && resource != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   85|   159k|#define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   84|   319k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:30): [True: 149k, False: 10.0k]
  |  |  |  |  |  Branch (84:61): [True: 10.0k, False: 0]
  |  |  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   83|      0|#define URES_IS_ARRAY(type) ((int32_t)(type)==URES_ARRAY || (int32_t)(type)==URES_ARRAY16)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (83:30): [True: 0, False: 0]
  |  |  |  |  |  Branch (83:61): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2067:10): [True: 185k, False: 72.9k]
  |  Branch (2067:23): [True: 159k, False: 25.6k]
  ------------------
 2068|   159k|    char *nextPathPart = uprv_strchr(pathPart, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|   159k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   159k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2069|   159k|    if (nextPathPart != nullptr) {
  ------------------
  |  Branch (2069:9): [True: 98.8k, False: 60.9k]
  ------------------
 2070|  98.8k|      *nextPathPart = 0;  /* Terminating null for this part of path. */
 2071|  98.8k|      nextPathPart++;
 2072|  98.8k|    } else {
 2073|  60.9k|      nextPathPart = uprv_strchr(pathPart, 0);
  ------------------
  |  |   40|  60.9k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  60.9k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2074|  60.9k|    }
 2075|   159k|    int32_t t;
 2076|   159k|    const char *pathP = pathPart;
 2077|   159k|    resource = res_getTableItemByKey(pResData, resource, &t, &pathP);
  ------------------
  |  |  207|   159k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|   159k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   159k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   159k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2078|   159k|    type = static_cast<UResType>(RES_GET_TYPE(resource));
  ------------------
  |  |   68|   159k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2079|   159k|    pathPart = nextPathPart; 
 2080|   159k|  }
 2081|  98.5k|  if (*pathPart) {
  ------------------
  |  Branch (2081:7): [True: 25.6k, False: 72.9k]
  ------------------
 2082|  25.6k|    return RES_BOGUS;
  ------------------
  |  |   65|  25.6k|#define RES_BOGUS 0xffffffff
  ------------------
 2083|  25.6k|  }
 2084|  72.9k|  return resource;
 2085|  98.5k|}
uresbund.cpp:_ZL10createPathPKciS0_iS0_RN6icu_7810CharStringEP10UErrorCode:
 2093|   144k|                       UErrorCode* status) {
 2094|       |    // This is a utility function used by ures_getByKeyWithFallback() below.  This function builds a path from
 2095|       |    // resPath and inKey, returning the result in `path`.  Originally, this function just cleared `path` and
 2096|       |    // appended resPath and inKey to it, but that caused problems for horizontal inheritance.
 2097|       |    //
 2098|       |    // In normal cases, resPath is the same as origResPath, but if ures_getByKeyWithFallback() has followed an
 2099|       |    // alias, resPath may be different from origResPath.  Not only may the existing path elements be different,
 2100|       |    // but resPath may also have MORE path elements than origResPath did.  If it does, those additional path
 2101|       |    // elements SUPERSEDE the corresponding elements of inKey.  So this code counts the number of elements in
 2102|       |    // resPath and origResPath and, for each path element in resPath that doesn't have a counterpart in origResPath,
 2103|       |    // deletes a path element from the beginning of inKey.  The remainder of inKey is then appended to
 2104|       |    // resPath to form the result.  (We're not using uprv_strchr() here because resPath and origResPath may
 2105|       |    // not be zero-terminated.)
 2106|   144k|    path.clear();
 2107|   144k|    const char* key = inKey;
 2108|   144k|    if (resPathLen > 0) {
  ------------------
  |  Branch (2108:9): [True: 24.8k, False: 119k]
  ------------------
 2109|  24.8k|        path.append(resPath, resPathLen, *status);
 2110|  24.8k|        if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (2110:13): [True: 24.8k, False: 0]
  ------------------
 2111|  24.8k|            const char* resPathLimit = resPath + resPathLen;
 2112|  24.8k|            const char* origResPathLimit = origResPath + origResPathLen;
 2113|  24.8k|            const char* resPathPtr = resPath;
 2114|  24.8k|            const char* origResPathPtr = origResPath;
 2115|       |            
 2116|       |            // Remove from the beginning of resPath the number of segments that are contained in origResPath.
 2117|       |            // If origResPath has MORE segments than resPath, this will leave resPath as the empty string.
 2118|  44.3k|            while (origResPathPtr < origResPathLimit && resPathPtr < resPathLimit) {
  ------------------
  |  Branch (2118:20): [True: 19.4k, False: 24.8k]
  |  Branch (2118:57): [True: 19.4k, False: 0]
  ------------------
 2119|   283k|                while (origResPathPtr < origResPathLimit && *origResPathPtr != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   283k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2119:24): [True: 283k, False: 0]
  |  Branch (2119:61): [True: 264k, False: 19.4k]
  ------------------
 2120|   264k|                    ++origResPathPtr;
 2121|   264k|                }
 2122|  19.4k|                if (origResPathPtr < origResPathLimit && *origResPathPtr == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  19.4k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2122:21): [True: 19.4k, False: 0]
  |  Branch (2122:58): [True: 19.4k, False: 0]
  ------------------
 2123|  19.4k|                    ++origResPathPtr;
 2124|  19.4k|                }
 2125|   283k|                while (resPathPtr < resPathLimit && *resPathPtr != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   283k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2125:24): [True: 283k, False: 0]
  |  Branch (2125:53): [True: 264k, False: 19.4k]
  ------------------
 2126|   264k|                    ++resPathPtr;
 2127|   264k|                }
 2128|  19.4k|                if (resPathPtr < resPathLimit && *resPathPtr == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  19.4k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2128:21): [True: 19.4k, False: 0]
  |  Branch (2128:50): [True: 19.4k, False: 0]
  ------------------
 2129|  19.4k|                    ++resPathPtr;
 2130|  19.4k|                }
 2131|  19.4k|            }
 2132|       |            
 2133|       |            // New remove from the beginning of `key` the number of segments remaining in resPath.
 2134|       |            // If resPath has more segments than `key` does, `key` will end up empty.
 2135|  35.7k|            while (resPathPtr < resPathLimit && *key != '\0') {
  ------------------
  |  Branch (2135:20): [True: 10.9k, False: 24.8k]
  |  Branch (2135:49): [True: 10.9k, False: 0]
  ------------------
 2136|   119k|                while (resPathPtr < resPathLimit && *resPathPtr != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   119k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2136:24): [True: 119k, False: 0]
  |  Branch (2136:53): [True: 108k, False: 10.9k]
  ------------------
 2137|   108k|                    ++resPathPtr;
 2138|   108k|                }
 2139|  10.9k|                if (resPathPtr < resPathLimit && *resPathPtr == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  10.9k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2139:21): [True: 10.9k, False: 0]
  |  Branch (2139:50): [True: 10.9k, False: 0]
  ------------------
 2140|  10.9k|                    ++resPathPtr;
 2141|  10.9k|                }
 2142|   102k|                while (*key != '\0' && *key != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   100k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2142:24): [True: 100k, False: 1.95k]
  |  Branch (2142:40): [True: 91.9k, False: 8.95k]
  ------------------
 2143|  91.9k|                    ++key;
 2144|  91.9k|                }
 2145|  10.9k|                if (*key == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  10.9k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2145:21): [True: 8.95k, False: 1.95k]
  ------------------
 2146|  8.95k|                    ++key;
 2147|  8.95k|                }
 2148|  10.9k|            }
 2149|  24.8k|        }
 2150|       |        // Finally, append what's left of `key` to `path`.  What you end up with here is `resPath`, plus
 2151|       |        // any pieces of `key` that aren't superseded by `resPath`.
 2152|       |        // Or, to put it another way, calculate <#-segments-in-key> - (<#-segments-in-resPath> - <#-segments-in-origResPath>),
 2153|       |        // and append that many segments from the end of `key` to `resPath` to produce the result.
 2154|  24.8k|        path.append(key, *status);
 2155|   119k|    } else {
 2156|   119k|        path.append(inKey, *status);
 2157|   119k|    }
 2158|   144k|}
uresbund.cpp:_ZL16ures_freeResPathP15UResourceBundle:
 1113|   305k|static void ures_freeResPath(UResourceBundle *resB) {
 1114|   305k|    if (resB->fResPath && resB->fResPath != resB->fResBuf) {
  ------------------
  |  Branch (1114:9): [True: 209k, False: 96.4k]
  |  Branch (1114:27): [True: 0, False: 209k]
  ------------------
 1115|      0|        uprv_free(resB->fResPath);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1116|      0|    }
 1117|   305k|    resB->fResPath = nullptr;
 1118|   305k|    resB->fResPathLen = 0;
 1119|   305k|}
uresbund.cpp:_ZN12_GLOBAL__N_118GetAllChildrenSinkC2ERN6icu_7812ResourceSinkE:
 2337|  1.52k|        : dest(dest) {}
uresbund.cpp:_ZN12_GLOBAL__N_118GetAllChildrenSink3putEPKcRN6icu_7813ResourceValueEaR10UErrorCode:
 2340|  2.40k|           UErrorCode &errorCode) override {
 2341|  2.40k|        ResourceTable itemsTable = value.getTable(errorCode);
 2342|  2.40k|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2342:13): [True: 0, False: 2.40k]
  ------------------
 2343|  7.99k|        for (int32_t i = 0; itemsTable.getKeyAndValue(i, key, value); ++i) {
  ------------------
  |  Branch (2343:29): [True: 5.59k, False: 2.40k]
  ------------------
 2344|  5.59k|            if (value.getType() == URES_ALIAS) {
  ------------------
  |  Branch (2344:17): [True: 0, False: 5.59k]
  ------------------
 2345|      0|                ResourceDataValue& rdv = static_cast<ResourceDataValue&>(value);
 2346|      0|                StackUResourceBundle stackTempBundle;
 2347|      0|                UResourceBundle* aliasRB = getAliasTargetAsResourceBundle(rdv.getData(), rdv.getResource(), nullptr, -1,
 2348|      0|                                                                          rdv.getValidLocaleDataEntry(), nullptr, 0,
 2349|      0|                                                                          stackTempBundle.getAlias(), &errorCode);
 2350|      0|                if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (2350:21): [True: 0, False: 0]
  ------------------
 2351|      0|                    ResourceDataValue aliasedValue;
 2352|      0|                    aliasedValue.setData(aliasRB->getResData());
 2353|      0|                    aliasedValue.setValidLocaleDataEntry(aliasRB->fValidLocaleDataEntry);
 2354|      0|                    aliasedValue.setResource(aliasRB->fRes, ResourceTracer(aliasRB));
 2355|       |                    
 2356|      0|                    if (aliasedValue.getType() != URES_TABLE) {
  ------------------
  |  Branch (2356:25): [True: 0, False: 0]
  ------------------
 2357|      0|                        dest.put(key, aliasedValue, isRoot, errorCode);
 2358|      0|                    } else {
 2359|       |                        // if the resource we're aliasing over to is a table, the sink might iterate over its contents.
 2360|       |                        // If it does, it'll get only the things defined in the actual alias target, not the things
 2361|       |                        // the target inherits from its parent resources.  So we walk the parent chain for the *alias target*,
 2362|       |                        // calling dest.put() for each of the parent tables we could be inheriting from.  This means
 2363|       |                        // that dest.put() has to iterate over the children of multiple tables to get all of the inherited
 2364|       |                        // resource values, but it already has to do that to handle normal vertical inheritance.
 2365|      0|                        UResType aliasedValueType = URES_TABLE;
 2366|      0|                        CharString tablePath;
 2367|      0|                        tablePath.append(aliasRB->fResPath, errorCode);
 2368|      0|                        const char* parentKey = key; // dest.put() changes the key
 2369|      0|                        dest.put(parentKey, aliasedValue, isRoot, errorCode);
 2370|      0|                        UResourceDataEntry* entry = aliasRB->fData;
 2371|      0|                        Resource res = aliasRB->fRes;
 2372|      0|                        while (aliasedValueType == URES_TABLE && entry->fParent != nullptr) {
  ------------------
  |  Branch (2372:32): [True: 0, False: 0]
  |  Branch (2372:66): [True: 0, False: 0]
  ------------------
 2373|      0|                            CharString localPath;
 2374|      0|                            localPath.copyFrom(tablePath, errorCode);
 2375|      0|                            char* localPathAsCharPtr = localPath.data();
 2376|      0|                            const char* childKey;
 2377|      0|                            entry = entry->fParent;
 2378|      0|                            res = entry->fData.rootRes;
 2379|      0|                            Resource newRes = res_findResource(&entry->fData, res, &localPathAsCharPtr, &childKey);
  ------------------
  |  |  198|      0|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2380|      0|                            if (newRes != RES_BOGUS) {
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2380:33): [True: 0, False: 0]
  ------------------
 2381|      0|                                aliasedValue.setData(entry->fData);
 2382|       |                                // TODO: do I also need to call aliasedValue.setValueLocaleDataEntry() ?
 2383|      0|                                aliasedValue.setResource(newRes, ResourceTracer(aliasRB)); // probably wrong to use aliasRB here
 2384|      0|                                aliasedValueType = aliasedValue.getType();
 2385|      0|                                if (aliasedValueType == URES_ALIAS) {
  ------------------
  |  Branch (2385:37): [True: 0, False: 0]
  ------------------
 2386|       |                                    // in a few rare cases, when we get to the root resource bundle, the resource in question
 2387|       |                                    // won't be an actual table, but will instead be an alias to a table.  That is, we have
 2388|       |                                    // two aliases in the inheritance path.  (For some locales, such as Zulu, we see this with
 2389|       |                                    // children of the "fields" resource: "day-narrow" aliases to "day-short", which aliases
 2390|       |                                    // to "day".)  When this happens, we need to make sure we follow all the aliases.
 2391|      0|                                    ResourceDataValue& rdv2 = static_cast<ResourceDataValue&>(aliasedValue);
 2392|      0|                                    aliasRB = getAliasTargetAsResourceBundle(rdv2.getData(), rdv2.getResource(), nullptr, -1,
 2393|      0|                                                                             rdv2.getValidLocaleDataEntry(), nullptr, 0,
 2394|      0|                                                                             stackTempBundle.getAlias(), &errorCode);
 2395|      0|                                    tablePath.clear();
 2396|      0|                                    tablePath.append(aliasRB->fResPath, errorCode);
 2397|      0|                                    entry = aliasRB->fData;
 2398|      0|                                    res = aliasRB->fRes;
 2399|      0|                                    aliasedValue.setData(entry->fData);
 2400|       |                                    // TODO: do I also need to call aliasedValue.setValueLocaleDataEntry() ?
 2401|      0|                                    aliasedValue.setResource(res, ResourceTracer(aliasRB)); // probably wrong to use aliasRB here
 2402|      0|                                    aliasedValueType = aliasedValue.getType();
 2403|      0|                                }
 2404|      0|                                if (aliasedValueType == URES_TABLE) {
  ------------------
  |  Branch (2404:37): [True: 0, False: 0]
  ------------------
 2405|      0|                                    dest.put(parentKey, aliasedValue, isRoot, errorCode);
 2406|      0|                                } else {
 2407|       |                                    // once we've followed the alias, the resource we're looking at really should
 2408|       |                                    // be a table
 2409|      0|                                    errorCode = U_INTERNAL_PROGRAM_ERROR;
 2410|      0|                                    return;
 2411|      0|                                }
 2412|      0|                            }
 2413|      0|                        }
 2414|      0|                    }
 2415|      0|                }
 2416|  5.59k|            } else {
 2417|  5.59k|                dest.put(key, value, isRoot, errorCode);
 2418|  5.59k|            }
 2419|  5.59k|            if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2419:17): [True: 0, False: 5.59k]
  ------------------
 2420|  5.59k|        }
 2421|  2.40k|    }
uresbund.cpp:_ZN12_GLOBAL__N_123getAllItemsWithFallbackEPK15UResourceBundleRN6icu_7817ResourceDataValueERNS3_12ResourceSinkER10UErrorCode:
 2278|  37.1k|        ResourceSink &sink, UErrorCode &errorCode) {
 2279|  37.1k|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2279:9): [True: 0, False: 37.1k]
  ------------------
 2280|       |    // We recursively enumerate child-first,
 2281|       |    // only storing parent items in the absence of child items.
 2282|       |    // The sink needs to store a placeholder value for the no-fallback/no-inheritance marker
 2283|       |    // to prevent a parent item from being stored.
 2284|       |    //
 2285|       |    // It would be possible to recursively enumerate parent-first,
 2286|       |    // overriding parent items with child items.
 2287|       |    // When the sink sees the no-fallback/no-inheritance marker,
 2288|       |    // then it would remove the parent's item.
 2289|       |    // We would deserialize parent values even though they are overridden in a child bundle.
 2290|  37.1k|    value.setData(bundle->getResData());
 2291|  37.1k|    value.setValidLocaleDataEntry(bundle->fValidLocaleDataEntry);
 2292|  37.1k|    UResourceDataEntry *parentEntry = bundle->fData->fParent;
 2293|  37.1k|    UBool hasParent = parentEntry != nullptr && U_SUCCESS(parentEntry->fBogus);
  ------------------
  |  Branch (2293:23): [True: 12.1k, False: 24.9k]
  |  Branch (2293:49): [True: 12.1k, False: 0]
  ------------------
 2294|  37.1k|    value.setResource(bundle->fRes, ResourceTracer(bundle));
 2295|  37.1k|    sink.put(bundle->fKey, value, !hasParent, errorCode);
 2296|  37.1k|    if (hasParent) {
  ------------------
  |  Branch (2296:9): [True: 12.1k, False: 24.9k]
  ------------------
 2297|       |        // We might try to query the sink whether
 2298|       |        // any fallback from the parent bundle is still possible.
 2299|       |
 2300|       |        // Turn the parent UResourceDataEntry into a UResourceBundle,
 2301|       |        // much like in ures_openWithType().
 2302|       |        // TODO: See if we can refactor ures_getByKeyWithFallback()
 2303|       |        // and pull out an inner function that takes and returns a UResourceDataEntry
 2304|       |        // so that we need not create UResourceBundle objects.
 2305|  12.1k|        StackUResourceBundle parentBundle;
 2306|  12.1k|        UResourceBundle &parentRef = parentBundle.ref();
 2307|  12.1k|        parentRef.fData = parentEntry;
 2308|  12.1k|        parentRef.fValidLocaleDataEntry = bundle->fValidLocaleDataEntry;
 2309|  12.1k|        parentRef.fHasFallback = !parentRef.getResData().noFallback;
 2310|  12.1k|        parentRef.fIsTopLevel = true;
 2311|  12.1k|        parentRef.fRes = parentRef.getResData().rootRes;
 2312|  12.1k|        parentRef.fSize = res_countArrayItems(&parentRef.getResData(), parentRef.fRes);
  ------------------
  |  |  197|  12.1k|#define res_countArrayItems U_ICU_ENTRY_POINT_RENAME(res_countArrayItems)
  |  |  ------------------
  |  |  |  |  123|  12.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  12.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  12.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2313|  12.1k|        parentRef.fIndex = -1;
 2314|  12.1k|        entryIncrease(parentEntry);
 2315|       |
 2316|       |        // Look up the container item in the parent bundle.
 2317|  12.1k|        StackUResourceBundle containerBundle;
 2318|  12.1k|        const UResourceBundle *rb;
 2319|  12.1k|        UErrorCode pathErrorCode = U_ZERO_ERROR;  // Ignore if parents up to root do not have this path.
 2320|  12.1k|        if (bundle->fResPath == nullptr || *bundle->fResPath == 0) {
  ------------------
  |  Branch (2320:13): [True: 0, False: 12.1k]
  |  Branch (2320:44): [True: 0, False: 12.1k]
  ------------------
 2321|      0|            rb = parentBundle.getAlias();
 2322|  12.1k|        } else {
 2323|  12.1k|            rb = ures_getByKeyWithFallback(parentBundle.getAlias(), bundle->fResPath,
  ------------------
  |  | 1662|  12.1k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  12.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  12.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  12.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2324|  12.1k|                                           containerBundle.getAlias(), &pathErrorCode);
 2325|  12.1k|        }
 2326|  12.1k|        if (U_SUCCESS(pathErrorCode)) {
  ------------------
  |  Branch (2326:13): [True: 12.0k, False: 88]
  ------------------
 2327|  12.0k|            getAllItemsWithFallback(rb, value, sink, errorCode);
 2328|  12.0k|        }
 2329|  12.1k|    }
 2330|  37.1k|}
uresbund.cpp:_ZL15getFallbackDataPK15UResourceBundlePPKcPjP10UErrorCode:
  319|  6.45k|        const char **resTag, Resource *res, UErrorCode *status) {
  320|  6.45k|    UResourceDataEntry *dataEntry = resBundle->fData;
  321|  6.45k|    int32_t indexR = -1;
  322|  6.45k|    int32_t i = 0;
  323|  6.45k|    *res = RES_BOGUS;
  ------------------
  |  |   65|  6.45k|#define RES_BOGUS 0xffffffff
  ------------------
  324|  6.45k|    if(dataEntry == nullptr) {
  ------------------
  |  Branch (324:8): [True: 0, False: 6.45k]
  ------------------
  325|      0|        *status = U_MISSING_RESOURCE_ERROR;
  326|      0|        return nullptr;
  327|      0|    }
  328|  6.45k|    if(dataEntry->fBogus == U_ZERO_ERROR) { /* if this resource is real, */
  ------------------
  |  Branch (328:8): [True: 6.45k, False: 0]
  ------------------
  329|  6.45k|        *res = res_getTableItemByKey(&(dataEntry->fData), dataEntry->fData.rootRes, &indexR, resTag); /* try to get data from there */
  ------------------
  |  |  207|  6.45k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  6.45k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.45k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.45k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|  6.45k|        i++;
  331|  6.45k|    }
  332|  6.45k|    if(resBundle->fHasFallback) {
  ------------------
  |  Branch (332:8): [True: 6.45k, False: 0]
  ------------------
  333|       |        // Otherwise, we'll look in parents.
  334|  14.1k|        while(*res == RES_BOGUS && dataEntry->fParent != nullptr) {
  ------------------
  |  |   65|  28.2k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (334:15): [True: 7.67k, False: 6.45k]
  |  Branch (334:36): [True: 7.67k, False: 0]
  ------------------
  335|  7.67k|            dataEntry = dataEntry->fParent;
  336|  7.67k|            if(dataEntry->fBogus == U_ZERO_ERROR) {
  ------------------
  |  Branch (336:16): [True: 7.67k, False: 0]
  ------------------
  337|  7.67k|                i++;
  338|  7.67k|                *res = res_getTableItemByKey(&(dataEntry->fData), dataEntry->fData.rootRes, &indexR, resTag);
  ------------------
  |  |  207|  7.67k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  7.67k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.67k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.67k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  339|  7.67k|            }
  340|  7.67k|        }
  341|  6.45k|    }
  342|       |
  343|  6.45k|    if(*res == RES_BOGUS) {
  ------------------
  |  |   65|  6.45k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (343:8): [True: 0, False: 6.45k]
  ------------------
  344|       |        // If the resource is not found, we need to give an error.
  345|      0|        *status = U_MISSING_RESOURCE_ERROR;
  346|      0|        return nullptr;
  347|      0|    }
  348|       |    // If the resource is found in parents, we need to adjust the error.
  349|  6.45k|    if(i>1) {
  ------------------
  |  Branch (349:8): [True: 6.45k, False: 0]
  ------------------
  350|  6.45k|        if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|  6.45k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  6.45k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                      if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|  6.45k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  6.45k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (350:12): [True: 0, False: 6.45k]
  |  Branch (350:67): [True: 386, False: 6.06k]
  ------------------
  351|    386|            *status = U_USING_DEFAULT_WARNING;
  352|  6.06k|        } else {
  353|  6.06k|            *status = U_USING_FALLBACK_WARNING;
  354|  6.06k|        }
  355|  6.45k|    }
  356|  6.45k|    return dataEntry;
  357|  6.45k|}
uresbund.cpp:_ZL17ures_openWithTypeP15UResourceBundlePKcS2_12UResOpenTypeP10UErrorCode:
 2712|  83.9k|                  UResOpenType openType, UErrorCode* status) {
 2713|  83.9k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (2713:8): [True: 0, False: 83.9k]
  ------------------
 2714|      0|        return nullptr;
 2715|      0|    }
 2716|       |
 2717|  83.9k|    UResourceDataEntry *entry;
 2718|  83.9k|    if(openType != URES_OPEN_DIRECT) {
  ------------------
  |  Branch (2718:8): [True: 67.0k, False: 16.8k]
  ------------------
 2719|  67.0k|        if (localeID == nullptr) {
  ------------------
  |  Branch (2719:13): [True: 0, False: 67.0k]
  ------------------
 2720|      0|            localeID = uloc_getDefault();
  ------------------
  |  | 1118|      0|#define uloc_getDefault U_ICU_ENTRY_POINT_RENAME(uloc_getDefault)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2721|      0|        }
 2722|       |        /* first "canonicalize" the locale ID */
 2723|  67.0k|        CharString canonLocaleID = ulocimp_getBaseName(localeID, *status);
  ------------------
  |  | 1199|  67.0k|#define ulocimp_getBaseName U_ICU_ENTRY_POINT_RENAME(ulocimp_getBaseName)
  |  |  ------------------
  |  |  |  |  123|  67.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  67.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  67.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2724|  67.0k|        if(U_FAILURE(*status)) {
  ------------------
  |  Branch (2724:12): [True: 0, False: 67.0k]
  ------------------
 2725|      0|            *status = U_ILLEGAL_ARGUMENT_ERROR;
 2726|      0|            return nullptr;
 2727|      0|        }
 2728|  67.0k|        entry = entryOpen(path, canonLocaleID.data(), openType, status);
 2729|  67.0k|    } else {
 2730|  16.8k|        entry = entryOpenDirect(path, localeID, status);
 2731|  16.8k|    }
 2732|  83.9k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (2732:8): [True: 0, False: 83.9k]
  ------------------
 2733|      0|        return nullptr;
 2734|      0|    }
 2735|  83.9k|    if(entry == nullptr) {
  ------------------
  |  Branch (2735:8): [True: 0, False: 83.9k]
  ------------------
 2736|      0|        *status = U_MISSING_RESOURCE_ERROR;
 2737|      0|        return nullptr;
 2738|      0|    }
 2739|       |
 2740|  83.9k|    UBool isStackObject;
 2741|  83.9k|    if(r == nullptr) {
  ------------------
  |  Branch (2741:8): [True: 83.9k, False: 0]
  ------------------
 2742|  83.9k|        r = static_cast<UResourceBundle*>(uprv_malloc(sizeof(UResourceBundle)));
  ------------------
  |  | 1524|  83.9k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  83.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  83.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  83.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2743|  83.9k|        if(r == nullptr) {
  ------------------
  |  Branch (2743:12): [True: 0, False: 83.9k]
  ------------------
 2744|      0|            entryClose(entry);
 2745|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
 2746|      0|            return nullptr;
 2747|      0|        }
 2748|  83.9k|        isStackObject = false;
 2749|  83.9k|    } else {  // fill-in
 2750|      0|        isStackObject = ures_isStackObject(r);
 2751|      0|        ures_closeBundle(r, false);
 2752|      0|    }
 2753|  83.9k|    uprv_memset(r, 0, sizeof(UResourceBundle));
  ------------------
  |  |  100|  83.9k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  83.9k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2754|  83.9k|    ures_setIsStackObject(r, isStackObject);
 2755|       |
 2756|  83.9k|    r->fValidLocaleDataEntry = r->fData = entry;
 2757|  83.9k|    r->fHasFallback = openType != URES_OPEN_DIRECT && !r->getResData().noFallback;
  ------------------
  |  Branch (2757:23): [True: 67.0k, False: 16.8k]
  |  Branch (2757:55): [True: 65.5k, False: 1.52k]
  ------------------
 2758|  83.9k|    r->fIsTopLevel = true;
 2759|  83.9k|    r->fRes = r->getResData().rootRes;
 2760|  83.9k|    r->fSize = res_countArrayItems(&r->getResData(), r->fRes);
  ------------------
  |  |  197|  83.9k|#define res_countArrayItems U_ICU_ENTRY_POINT_RENAME(res_countArrayItems)
  |  |  ------------------
  |  |  |  |  123|  83.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  83.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  83.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2761|  83.9k|    r->fIndex = -1;
 2762|       |
 2763|  83.9k|    ResourceTracer(r).traceOpen();
 2764|       |
 2765|  83.9k|    return r;
 2766|  83.9k|}
uresbund.cpp:_ZL9entryOpenPKcS0_12UResOpenTypeP10UErrorCode:
  812|  67.0k|                                     UResOpenType openType, UErrorCode* status) {
  813|  67.0k|    U_ASSERT(openType != URES_OPEN_DIRECT);
  ------------------
  |  |   35|  67.0k|#   define U_ASSERT(exp) (void)0
  ------------------
  814|  67.0k|    UErrorCode intStatus = U_ZERO_ERROR;
  815|  67.0k|    UResourceDataEntry *r = nullptr;
  816|  67.0k|    UResourceDataEntry *t1 = nullptr;
  817|  67.0k|    UBool isDefault = false;
  818|  67.0k|    UBool isRoot = false;
  819|  67.0k|    UBool hasRealData = false;
  820|  67.0k|    UBool hasChopped = true;
  821|  67.0k|    UBool usingUSRData = U_USE_USRDATA && ( path == nullptr || uprv_strncmp(path,U_ICUDATA_NAME,8) == 0);
  ------------------
  |  |  157|   134k|#define U_USE_USRDATA     0  /**< @internal */
  |  |  ------------------
  |  |  |  Branch (157:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  UBool usingUSRData = U_USE_USRDATA && ( path == nullptr || uprv_strncmp(path,U_ICUDATA_NAME,8) == 0);
  ------------------
  |  |   44|      0|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (821:45): [True: 0, False: 0]
  |  Branch (821:64): [True: 0, False: 0]
  ------------------
  822|       |
  823|  67.0k|    char name[ULOC_FULLNAME_CAPACITY];
  824|  67.0k|    char usrDataPath[96];
  825|       |
  826|  67.0k|    initCache(status);
  827|       |
  828|  67.0k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (828:8): [True: 0, False: 67.0k]
  ------------------
  829|      0|        return nullptr;
  830|      0|    }
  831|       |
  832|  67.0k|    uprv_strncpy(name, localeID, sizeof(name) - 1);
  ------------------
  |  |   43|  67.0k|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|  67.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  833|  67.0k|    name[sizeof(name) - 1] = 0;
  834|       |
  835|  67.0k|    if ( usingUSRData ) {
  ------------------
  |  Branch (835:10): [True: 0, False: 67.0k]
  ------------------
  836|      0|        if ( path == nullptr ) {
  ------------------
  |  Branch (836:14): [True: 0, False: 0]
  ------------------
  837|      0|            uprv_strcpy(usrDataPath, U_USRDATA_NAME);
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  838|      0|        } else {
  839|      0|            uprv_strncpy(usrDataPath, path, sizeof(usrDataPath) - 1);
  ------------------
  |  |   43|      0|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  840|      0|            usrDataPath[0] = 'u';
  841|      0|            usrDataPath[1] = 's';
  842|      0|            usrDataPath[2] = 'r';
  843|      0|            usrDataPath[sizeof(usrDataPath) - 1] = 0;
  844|      0|        }
  845|      0|    }
  846|       | 
  847|       |    // Note: We need to query the default locale *before* locking resbMutex.
  848|  67.0k|    const char *defaultLocale = uloc_getDefault();
  ------------------
  |  | 1118|  67.0k|#define uloc_getDefault U_ICU_ENTRY_POINT_RENAME(uloc_getDefault)
  |  |  ------------------
  |  |  |  |  123|  67.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  67.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  67.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  849|       |
  850|  67.0k|    Mutex lock(&resbMutex);    // Lock resbMutex until the end of this function.
  851|       |
  852|       |    /* We're going to skip all the locales that do not have any data */
  853|  67.0k|    r = findFirstExisting(path, name, defaultLocale, openType, &isRoot, &hasChopped, &isDefault, &intStatus);
  854|       |
  855|       |    // If we failed due to out-of-memory, report the failure and exit early.
  856|  67.0k|    if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (856:9): [True: 0, False: 67.0k]
  ------------------
  857|      0|        *status = intStatus;
  858|      0|        goto finish;
  859|      0|    }
  860|       |
  861|  67.0k|    if(r != nullptr) { /* if there is one real locale, we can look for parents. */
  ------------------
  |  Branch (861:8): [True: 67.0k, False: 0]
  ------------------
  862|  67.0k|        t1 = r;
  863|  67.0k|        hasRealData = true;
  864|  67.0k|        if ( usingUSRData ) {  /* This code inserts user override data into the inheritance chain */
  ------------------
  |  Branch (864:14): [True: 0, False: 67.0k]
  ------------------
  865|      0|            UErrorCode usrStatus = U_ZERO_ERROR;
  866|      0|            UResourceDataEntry *u1 = init_entry(t1->fName, usrDataPath, &usrStatus);
  867|       |            // If we failed due to out-of-memory, report the failure and exit early.
  868|      0|            if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (868:17): [True: 0, False: 0]
  ------------------
  869|      0|                *status = intStatus;
  870|      0|                goto finish;
  871|      0|            }
  872|      0|            if ( u1 != nullptr ) {
  ------------------
  |  Branch (872:18): [True: 0, False: 0]
  ------------------
  873|      0|                if(u1->fBogus == U_ZERO_ERROR) {
  ------------------
  |  Branch (873:20): [True: 0, False: 0]
  ------------------
  874|      0|                    u1->fParent = t1;
  875|      0|                    r = u1;
  876|      0|                } else {
  877|       |                    /* the USR override data wasn't found, set it to be deleted */
  878|      0|                    u1->fCountExisting = 0;
  879|      0|                }
  880|      0|            }
  881|      0|        }
  882|  67.0k|        if ((hasChopped || mayHaveParent(name)) && !isRoot) {
  ------------------
  |  Branch (882:14): [True: 40.4k, False: 26.6k]
  |  Branch (882:28): [True: 190, False: 26.4k]
  |  Branch (882:52): [True: 40.6k, False: 0]
  ------------------
  883|  40.6k|            if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) {
  ------------------
  |  |   99|  40.6k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (883:17): [True: 0, False: 40.6k]
  ------------------
  884|      0|                goto finish;
  885|      0|            }
  886|  40.6k|        }
  887|  67.0k|    }
  888|       |
  889|       |    /* we could have reached this point without having any real data */
  890|       |    /* if that is the case, we need to chain in the default locale   */
  891|  67.0k|    if(r==nullptr && openType == URES_OPEN_LOCALE_DEFAULT_ROOT && !isDefault && !isRoot) {
  ------------------
  |  Branch (891:8): [True: 0, False: 67.0k]
  |  Branch (891:22): [True: 0, False: 0]
  |  Branch (891:67): [True: 0, False: 0]
  |  Branch (891:81): [True: 0, False: 0]
  ------------------
  892|       |        /* insert default locale */
  893|      0|        uprv_strcpy(name, defaultLocale);
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  894|      0|        r = findFirstExisting(path, name, defaultLocale, openType, &isRoot, &hasChopped, &isDefault, &intStatus);
  895|       |        // If we failed due to out-of-memory, report the failure and exit early.
  896|      0|        if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (896:13): [True: 0, False: 0]
  ------------------
  897|      0|            *status = intStatus;
  898|      0|            goto finish;
  899|      0|        }
  900|      0|        intStatus = U_USING_DEFAULT_WARNING;
  901|      0|        if(r != nullptr) { /* the default locale exists */
  ------------------
  |  Branch (901:12): [True: 0, False: 0]
  ------------------
  902|      0|            t1 = r;
  903|      0|            hasRealData = true;
  904|      0|            isDefault = true;
  905|       |            // TODO: Why not if (usingUSRData) { ... } like in the non-default-locale code path?
  906|      0|            if ((hasChopped || mayHaveParent(name)) && !isRoot) {
  ------------------
  |  Branch (906:18): [True: 0, False: 0]
  |  Branch (906:32): [True: 0, False: 0]
  |  Branch (906:56): [True: 0, False: 0]
  ------------------
  907|      0|                if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) {
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (907:21): [True: 0, False: 0]
  ------------------
  908|      0|                    goto finish;
  909|      0|                }
  910|      0|            }
  911|      0|        }
  912|      0|    }
  913|       |
  914|       |    /* we could still have r == nullptr at this point - maybe even default locale is not */
  915|       |    /* present */
  916|  67.0k|    if(r == nullptr) {
  ------------------
  |  Branch (916:8): [True: 0, False: 67.0k]
  ------------------
  917|      0|        uprv_strcpy(name, kRootLocaleName);
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  918|      0|        r = findFirstExisting(path, name, defaultLocale, openType, &isRoot, &hasChopped, &isDefault, &intStatus);
  919|       |        // If we failed due to out-of-memory, report the failure and exit early.
  920|      0|        if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (920:13): [True: 0, False: 0]
  ------------------
  921|      0|            *status = intStatus;
  922|      0|            goto finish;
  923|      0|        }
  924|      0|        if(r != nullptr) {
  ------------------
  |  Branch (924:12): [True: 0, False: 0]
  ------------------
  925|      0|            t1 = r;
  926|      0|            intStatus = U_USING_DEFAULT_WARNING;
  927|      0|            hasRealData = true;
  928|      0|        } else { /* we don't even have the root locale */
  929|      0|            *status = U_MISSING_RESOURCE_ERROR;
  930|      0|            goto finish;
  931|      0|        }
  932|  67.0k|    } else if(!isRoot && uprv_strcmp(t1->fName, kRootLocaleName) != 0 &&
  ------------------
  |  |   38|  67.0k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  67.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (932:15): [True: 67.0k, False: 0]
  |  Branch (932:26): [True: 67.0k, False: 0]
  ------------------
  933|  67.0k|            t1->fParent == nullptr && !r->fData.noFallback) {
  ------------------
  |  Branch (933:13): [True: 2.19k, False: 64.8k]
  |  Branch (933:39): [True: 668, False: 1.52k]
  ------------------
  934|    668|        if (!insertRootBundle(t1, status)) {
  ------------------
  |  Branch (934:13): [True: 0, False: 668]
  ------------------
  935|      0|            goto finish;
  936|      0|        }
  937|    668|        if(!hasRealData) {
  ------------------
  |  Branch (937:12): [True: 0, False: 668]
  ------------------
  938|      0|            r->fBogus = U_USING_DEFAULT_WARNING;
  939|      0|        }
  940|    668|    }
  941|       |
  942|       |    // TODO: Does this ever loop?
  943|   181k|    while(r != nullptr && !isRoot && t1->fParent != nullptr) {
  ------------------
  |  Branch (943:11): [True: 181k, False: 0]
  |  Branch (943:27): [True: 181k, False: 0]
  |  Branch (943:38): [True: 114k, False: 67.0k]
  ------------------
  944|   114k|        t1->fParent->fCountExisting++;
  945|   114k|        t1 = t1->fParent;
  946|   114k|    }
  947|       |
  948|  67.0k|finish:
  949|  67.0k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (949:8): [True: 67.0k, False: 0]
  ------------------
  950|  67.0k|        if(intStatus != U_ZERO_ERROR) {
  ------------------
  |  Branch (950:12): [True: 12.8k, False: 54.1k]
  ------------------
  951|  12.8k|            *status = intStatus;  
  952|  12.8k|        }
  953|  67.0k|        return r;
  954|  67.0k|    } else {
  955|      0|        return nullptr;
  956|      0|    }
  957|  67.0k|}
uresbund.cpp:_ZL9initCacheP10UErrorCode:
  483|  83.9k|static void initCache(UErrorCode *status) {
  484|  83.9k|    umtx_initOnce(gCacheInitOnce, &createCache, *status);
  485|  83.9k|}
uresbund.cpp:_ZL11createCacheR10UErrorCode:
  477|      1|static void U_CALLCONV createCache(UErrorCode &status) {
  478|      1|    U_ASSERT(cache == nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  479|      1|    cache = uhash_open(hashEntry, compareEntries, nullptr, &status);
  ------------------
  |  | 1030|      1|#define uhash_open U_ICU_ENTRY_POINT_RENAME(uhash_open)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  480|      1|    ucln_common_registerCleanup(UCLN_COMMON_URES, ures_cleanup);
  ------------------
  |  |  617|      1|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  481|      1|}
uresbund.cpp:_ZL9hashEntry8UElement:
   58|   116k|static int32_t U_CALLCONV hashEntry(const UHashTok parm) {
   59|   116k|    UResourceDataEntry* b = static_cast<UResourceDataEntry*>(parm.pointer);
   60|   116k|    UHashTok namekey, pathkey;
   61|   116k|    namekey.pointer = b->fName;
   62|   116k|    pathkey.pointer = b->fPath;
   63|   116k|    return uhash_hashChars(namekey)+37u*uhash_hashChars(pathkey);
  ------------------
  |  | 1011|   116k|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  123|   116k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   116k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   116k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return uhash_hashChars(namekey)+37u*uhash_hashChars(pathkey);
  ------------------
  |  | 1011|   116k|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  123|   116k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   116k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   116k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   64|   116k|}
uresbund.cpp:_ZL14compareEntries8UElementS_:
   67|   109k|static UBool U_CALLCONV compareEntries(const UHashTok p1, const UHashTok p2) {
   68|   109k|    UResourceDataEntry* b1 = static_cast<UResourceDataEntry*>(p1.pointer);
   69|   109k|    UResourceDataEntry* b2 = static_cast<UResourceDataEntry*>(p2.pointer);
   70|   109k|    UHashTok name1, name2, path1, path2;
   71|   109k|    name1.pointer = b1->fName;
   72|   109k|    name2.pointer = b2->fName;
   73|   109k|    path1.pointer = b1->fPath;
   74|   109k|    path2.pointer = b2->fPath;
   75|   109k|    return uhash_compareChars(name1, name2) && uhash_compareChars(path1, path2);
  ------------------
  |  |  993|   109k|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|   109k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   109k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   109k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return uhash_compareChars(name1, name2) && uhash_compareChars(path1, path2);
  ------------------
  |  |  993|   109k|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|   109k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   109k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   109k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (75:12): [True: 109k, False: 0]
  |  Branch (75:48): [True: 109k, False: 0]
  ------------------
   76|   109k|}
uresbund.cpp:_ZL17findFirstExistingPKcPcS0_12UResOpenTypePaS3_S3_P10UErrorCode:
  665|  67.0k|                  UBool *isRoot, UBool *foundParent, UBool *isDefault, UErrorCode* status) {
  666|  67.0k|    UResourceDataEntry *r = nullptr;
  667|  67.0k|    UBool hasRealData = false;
  668|  67.0k|    *foundParent = true; /* we're starting with a fresh name */
  669|  67.0k|    char origName[ULOC_FULLNAME_CAPACITY];
  670|       |
  671|  67.0k|    uprv_strcpy(origName, name);
  ------------------
  |  |   36|  67.0k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  67.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  672|   159k|    while(*foundParent && !hasRealData) {
  ------------------
  |  Branch (672:11): [True: 132k, False: 26.6k]
  |  Branch (672:27): [True: 92.1k, False: 40.4k]
  ------------------
  673|  92.1k|        r = init_entry(name, path, status);
  674|       |        /* Null pointer test */
  675|  92.1k|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (675:13): [True: 0, False: 92.1k]
  ------------------
  676|      0|            return nullptr;
  677|      0|        }
  678|  92.1k|        *isDefault = static_cast<UBool>(uprv_strncmp(name, defaultLocale, uprv_strlen(name)) == 0);
  ------------------
  |  |   44|  92.1k|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|  92.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  679|  92.1k|        hasRealData = static_cast<UBool>(r->fBogus == U_ZERO_ERROR);
  680|  92.1k|        if(!hasRealData) {
  ------------------
  |  Branch (680:12): [True: 25.0k, False: 67.0k]
  ------------------
  681|       |            /* this entry is not real. We will discard it. */
  682|       |            /* However, the parent line for this entry is  */
  683|       |            /* not to be used - as there might be parent   */
  684|       |            /* lines in cache from previous openings that  */
  685|       |            /* are not updated yet. */
  686|  25.0k|            r->fCountExisting--;
  687|       |            /*entryCloseInt(r);*/
  688|  25.0k|            r = nullptr;
  689|  25.0k|            *status = U_USING_FALLBACK_WARNING;
  690|  67.0k|        } else {
  691|  67.0k|            uprv_strcpy(name, r->fName); /* this is needed for supporting aliases */
  ------------------
  |  |   36|  67.0k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  67.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  692|  67.0k|        }
  693|       |
  694|  92.1k|        *isRoot = static_cast<UBool>(uprv_strcmp(name, kRootLocaleName) == 0);
  ------------------
  |  |   38|  92.1k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  92.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  695|       |
  696|       |        /*Fallback data stuff*/
  697|  92.1k|        if (!hasRealData) {
  ------------------
  |  Branch (697:13): [True: 25.0k, False: 67.0k]
  ------------------
  698|  25.0k|            *foundParent = getParentLocaleID(name, origName, openType);
  699|  67.0k|        } else {
  700|       |            // we've already found a real resource file; what we return to the caller is the parent
  701|       |            // locale ID for inheritance, which should come from chopLocale(), not getParentLocaleID()
  702|  67.0k|            *foundParent = chopLocale(name);
  703|  67.0k|        }
  704|  92.1k|        if (*foundParent && *name == '\0') {
  ------------------
  |  Branch (704:13): [True: 65.5k, False: 26.6k]
  |  Branch (704:29): [True: 0, False: 65.5k]
  ------------------
  705|      0|            uprv_strcpy(name, "und");
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  706|      0|        }
  707|  92.1k|    }
  708|  67.0k|    return r;
  709|  67.0k|}
uresbund.cpp:_ZL17getParentLocaleIDPcPKc12UResOpenType:
  211|  25.0k|static bool getParentLocaleID(char *name, const char *origName, UResOpenType openType) {
  212|       |    // early out if the locale ID has a variant code or ends with _
  213|  25.0k|    size_t nameLen = uprv_strlen(name);
  ------------------
  |  |   37|  25.0k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  25.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  214|  25.0k|    if (!nameLen || name[nameLen - 1] == '_' || hasVariant(name)) {
  ------------------
  |  Branch (214:9): [True: 0, False: 25.0k]
  |  Branch (214:21): [True: 0, False: 25.0k]
  |  Branch (214:49): [True: 162, False: 24.9k]
  ------------------
  215|    162|        return chopLocale(name);
  216|    162|    }
  217|       |    
  218|  24.9k|    UErrorCode err = U_ZERO_ERROR;
  219|  24.9k|    CharString language;
  220|  24.9k|    CharString script;
  221|  24.9k|    CharString region;
  222|  24.9k|    ulocimp_getSubtags(name, &language, &script, &region, nullptr, nullptr, err);
  ------------------
  |  | 1209|  24.9k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  24.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  24.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  24.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|       |
  224|  24.9k|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (224:9): [True: 0, False: 24.9k]
  ------------------
  225|       |        // hopefully this never happens...
  226|      0|        return chopLocale(name);
  227|      0|    }
  228|       |    
  229|       |    // if the open type is URES_OPEN_LOCALE_DEFAULT_ROOT, first look the locale ID up in the parent locale table;
  230|       |    // if that table specifies a parent for it, return that  (we don't do this for the other open types-- if we're not
  231|       |    // falling back through the system default locale, we also want to do straight truncation fallback instead
  232|       |    // of looking things up in the parent locale table-- see https://www.unicode.org/reports/tr35/tr35.html#Parent_Locales:
  233|       |    // "Collation data, however, is an exception...")
  234|  24.9k|    if (openType == URES_OPEN_LOCALE_DEFAULT_ROOT) {
  ------------------
  |  Branch (234:9): [True: 24.9k, False: 0]
  ------------------
  235|  24.9k|        const char* parentID = performFallbackLookup(name, parentLocaleChars, parentLocaleChars, parentLocaleTable, UPRV_LENGTHOF(parentLocaleTable));
  ------------------
  |  |   99|  24.9k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  236|  24.9k|        if (parentID != nullptr) {
  ------------------
  |  Branch (236:13): [True: 0, False: 24.9k]
  ------------------
  237|      0|            uprv_strcpy(name, parentID);
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  238|      0|            return true;
  239|      0|        }
  240|  24.9k|    }
  241|       |
  242|  24.9k|    CharString workingLocale;
  243|       |
  244|       |    // if it's not in the parent locale table, figure out the fallback script algorithmically
  245|       |    // (see CLDR-15265 for an explanation of the algorithm)
  246|  24.9k|    if (!script.isEmpty() && !region.isEmpty()) {
  ------------------
  |  Branch (246:9): [True: 12.9k, False: 11.9k]
  |  Branch (246:30): [True: 1.19k, False: 11.8k]
  ------------------
  247|       |        // if "name" has both script and region, is the script the default script?
  248|       |        // - if so, remove it and keep the region
  249|       |        // - if not, remove the region and keep the script
  250|  1.19k|        if (getDefaultScript(language, region) == script) {
  ------------------
  |  Branch (250:13): [True: 448, False: 746]
  ------------------
  251|    448|            workingLocale.append(language, err).append("_", err).append(region, err);
  252|    746|        } else {
  253|    746|            workingLocale.append(language, err).append("_", err).append(script, err);
  254|    746|        }
  255|  23.7k|    } else if (!region.isEmpty()) {
  ------------------
  |  Branch (255:16): [True: 11.9k, False: 11.8k]
  ------------------
  256|       |        // if "name" has region but not script, did the original locale ID specify a script?
  257|       |        // - if yes, replace the region with the script from the original locale ID
  258|       |        // - if no, replace the region with the default script for that language and region
  259|  11.9k|        UErrorCode err = U_ZERO_ERROR;
  260|  11.9k|        CharString origNameLanguage;
  261|  11.9k|        CharString origNameScript;
  262|  11.9k|        ulocimp_getSubtags(origName, &origNameLanguage, &origNameScript, nullptr, nullptr, nullptr, err);
  ------------------
  |  | 1209|  11.9k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  11.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  11.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  11.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  263|  11.9k|        if (!origNameScript.isEmpty()) {
  ------------------
  |  Branch (263:13): [True: 308, False: 11.6k]
  ------------------
  264|    308|            workingLocale.append(language, err).append("_", err).append(origNameScript, err);
  265|  11.6k|        } else {
  266|  11.6k|            workingLocale.append(language, err).append("_", err).append(getDefaultScript(language, region), err);
  267|  11.6k|        }
  268|  11.9k|    } else if (!script.isEmpty()) {
  ------------------
  |  Branch (268:16): [True: 11.8k, False: 0]
  ------------------
  269|       |        // if "name" has script but not region (and our open type if URES_OPEN_LOCALE_DEFAULT_ROOT), is the script
  270|       |        // the default script for the language?
  271|       |        // - if so, remove it from the locale ID
  272|       |        // - if not, return false to continue up the chain
  273|       |        // (we don't do this for other open types for the same reason we don't look things up in the parent
  274|       |        // locale table for other open types-- see the reference to UTS #35 above)
  275|  11.8k|        if (openType != URES_OPEN_LOCALE_DEFAULT_ROOT || getDefaultScript(language, CharString()) == script) {
  ------------------
  |  Branch (275:13): [True: 0, False: 11.8k]
  |  Branch (275:13): [True: 11.8k, False: 0]
  |  Branch (275:58): [True: 11.8k, False: 0]
  ------------------
  276|  11.8k|            workingLocale.append(language, err);
  277|  11.8k|        } else {
  278|      0|            return false;
  279|      0|        }
  280|  11.8k|    } else {
  281|       |        // if "name" just contains a language code, return false so the calling code falls back to "root"
  282|      0|        return false;
  283|      0|    }
  284|  24.9k|    if (U_SUCCESS(err) && !workingLocale.isEmpty()) {
  ------------------
  |  Branch (284:9): [True: 24.9k, False: 0]
  |  Branch (284:27): [True: 24.9k, False: 0]
  ------------------
  285|  24.9k|        uprv_strcpy(name, workingLocale.data());
  ------------------
  |  |   36|  24.9k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  24.9k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  286|  24.9k|        return true;
  287|  24.9k|    } else {
  288|      0|        return false;
  289|      0|    }
  290|  24.9k|}
uresbund.cpp:_ZL10hasVariantPKc:
   94|  25.0k|static UBool hasVariant(const char* localeID) {
   95|  25.0k|    UErrorCode err = U_ZERO_ERROR;
   96|  25.0k|    CheckedArrayByteSink sink(nullptr, 0);
   97|  25.0k|    ulocimp_getSubtags(
  ------------------
  |  | 1209|  25.0k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  25.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  25.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  25.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|  25.0k|            localeID,
   99|  25.0k|            nullptr,
  100|  25.0k|            nullptr,
  101|  25.0k|            nullptr,
  102|  25.0k|            &sink,
  103|  25.0k|            nullptr,
  104|  25.0k|            err);
  105|  25.0k|    return sink.NumberOfBytesAppended() != 0;
  106|  25.0k|}
uresbund.cpp:_ZL21performFallbackLookupPKcS0_S0_PKii:
  118|  62.2k|                                         int32_t lookupTableLength) {
  119|  62.2k|    const int32_t* bottom = lookupTable;
  120|  62.2k|    const int32_t* top = lookupTable + lookupTableLength;
  121|       |
  122|   613k|    while (bottom < top) {
  ------------------
  |  Branch (122:12): [True: 559k, False: 53.6k]
  ------------------
  123|       |        // Effectively, divide by 2 and round down to an even index
  124|   559k|        const int32_t* middle = bottom + (((top - bottom) / 4) * 2);
  125|   559k|        const char* entryKey = &(keyStrs[*middle]);
  126|   559k|        int32_t strcmpResult = uprv_strcmp(key, entryKey);
  ------------------
  |  |   38|   559k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   559k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  127|   559k|        if (strcmpResult == 0) {
  ------------------
  |  Branch (127:13): [True: 8.60k, False: 551k]
  ------------------
  128|  8.60k|            return &(valueStrs[middle[1]]);
  129|   551k|        } else if (strcmpResult < 0) {
  ------------------
  |  Branch (129:20): [True: 292k, False: 258k]
  ------------------
  130|   292k|            top = middle;
  131|   292k|        } else {
  132|   258k|            bottom = middle + 2;
  133|   258k|        }
  134|   559k|    }
  135|  53.6k|    return nullptr;
  136|  62.2k|}
uresbund.cpp:_ZL16getDefaultScriptRKN6icu_7810CharStringES2_:
  138|  24.6k|static CharString getDefaultScript(const CharString& language, const CharString& region) {
  139|  24.6k|    const char* defaultScript = nullptr;
  140|  24.6k|    UErrorCode err = U_ZERO_ERROR;
  141|       |    
  142|       |    // the default script will be "Latn" if we don't find the locale ID in the tables
  143|  24.6k|    CharString result("Latn", err);
  144|       |    
  145|       |    // if we were passed both language and region, make them into a locale ID and look that up in the default
  146|       |    // script table
  147|  24.6k|    if (!region.isEmpty()) {
  ------------------
  |  Branch (147:9): [True: 12.8k, False: 11.8k]
  ------------------
  148|  12.8k|        CharString localeID;
  149|  12.8k|        localeID.append(language, err).append("_", err).append(region, err);
  150|  12.8k|        if (U_FAILURE(err)) {
  ------------------
  |  Branch (150:13): [True: 0, False: 12.8k]
  ------------------
  151|      0|            return result;
  152|      0|        }
  153|  12.8k|        defaultScript = performFallbackLookup(localeID.data(), dsLocaleIDChars, scriptCodeChars, defaultScriptTable, UPRV_LENGTHOF(defaultScriptTable));
  ------------------
  |  |   99|  12.8k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  154|  12.8k|    }
  155|       |    
  156|       |    // if we didn't find anything, look up just the language in the default script table
  157|  24.6k|    if (defaultScript == nullptr) {
  ------------------
  |  Branch (157:9): [True: 24.4k, False: 152]
  ------------------
  158|  24.4k|        defaultScript = performFallbackLookup(language.data(), dsLocaleIDChars, scriptCodeChars, defaultScriptTable, UPRV_LENGTHOF(defaultScriptTable));
  ------------------
  |  |   99|  24.4k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  159|  24.4k|    }
  160|       |    
  161|       |    // if either lookup above succeeded, copy the result from "defaultScript" into "result"; otherwise, return "Latn"
  162|  24.6k|    if (defaultScript != nullptr) {
  ------------------
  |  Branch (162:9): [True: 8.60k, False: 16.0k]
  ------------------
  163|  8.60k|        result.clear();
  164|  8.60k|        result.append(defaultScript, err);
  165|  8.60k|    }
  166|  24.6k|    return result;
  167|  24.6k|}
uresbund.cpp:_ZL10chopLocalePc:
   83|  68.0k|static UBool chopLocale(char *name) {
   84|  68.0k|    char *i = uprv_strrchr(name, '_');
  ------------------
  |  |   42|  68.0k|#define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  68.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   85|       |
   86|  68.0k|    if(i != nullptr) {
  ------------------
  |  Branch (86:8): [True: 40.9k, False: 27.0k]
  ------------------
   87|  40.9k|        *i = '\0';
   88|  40.9k|        return true;
   89|  40.9k|    }
   90|       |
   91|  27.0k|    return false;
   92|  68.0k|}
uresbund.cpp:_ZL10init_entryPKcS0_P10UErrorCode:
  514|   112k|static UResourceDataEntry *init_entry(const char *localeID, const char *path, UErrorCode *status) {
  515|   112k|    UResourceDataEntry *r = nullptr;
  516|   112k|    UResourceDataEntry find;
  517|       |    /*int32_t hashValue;*/
  518|   112k|    const char *name;
  519|   112k|    char aliasName[100] = { 0 };
  520|   112k|    int32_t aliasLen = 0;
  521|       |    /*UBool isAlias = false;*/
  522|       |    /*UHashTok hashkey; */
  523|       |
  524|   112k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (524:8): [True: 0, False: 112k]
  ------------------
  525|      0|        return nullptr;
  526|      0|    }
  527|       |
  528|       |    /* here we try to deduce the right locale name */
  529|   112k|    if(localeID == nullptr) { /* if localeID is nullptr, we're trying to open default locale */
  ------------------
  |  Branch (529:8): [True: 0, False: 112k]
  ------------------
  530|      0|        name = uloc_getDefault();
  ------------------
  |  | 1118|      0|#define uloc_getDefault U_ICU_ENTRY_POINT_RENAME(uloc_getDefault)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  531|   112k|    } else if(*localeID == 0) { /* if localeID is "" then we try to open root locale */
  ------------------
  |  Branch (531:15): [True: 0, False: 112k]
  ------------------
  532|      0|        name = kRootLocaleName;
  ------------------
  |  |   18|      0|#define kRootLocaleName         "root"
  ------------------
  533|   112k|    } else { /* otherwise, we'll open what we're given */
  534|   112k|        name = localeID;
  535|   112k|    }
  536|       |
  537|   112k|    find.fName = const_cast<char*>(name);
  538|   112k|    find.fPath = const_cast<char*>(path);
  539|       |
  540|       |    /* calculate the hash value of the entry */
  541|       |    /*hashkey.pointer = (void *)&find;*/
  542|       |    /*hashValue = hashEntry(hashkey);*/
  543|       |
  544|       |    /* check to see if we already have this entry */
  545|   112k|    r = static_cast<UResourceDataEntry*>(uhash_get(cache, &find));
  ------------------
  |  | 1007|   112k|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|   112k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   112k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   112k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  546|   112k|    if(r == nullptr) {
  ------------------
  |  Branch (546:8): [True: 2.36k, False: 109k]
  ------------------
  547|       |        /* if the entry is not yet in the hash table, we'll try to construct a new one */
  548|  2.36k|        r = static_cast<UResourceDataEntry*>(uprv_malloc(sizeof(UResourceDataEntry)));
  ------------------
  |  | 1524|  2.36k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  2.36k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.36k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.36k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  549|  2.36k|        if(r == nullptr) {
  ------------------
  |  Branch (549:12): [True: 0, False: 2.36k]
  ------------------
  550|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
  551|      0|            return nullptr;
  552|      0|        }
  553|       |
  554|  2.36k|        uprv_memset(r, 0, sizeof(UResourceDataEntry));
  ------------------
  |  |  100|  2.36k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  2.36k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  555|       |        /*r->fHashKey = hashValue;*/
  556|       |
  557|  2.36k|        setEntryName(r, name, status);
  558|  2.36k|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (558:13): [True: 0, False: 2.36k]
  ------------------
  559|      0|            uprv_free(r);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  560|      0|            return nullptr;
  561|      0|        }
  562|       |
  563|  2.36k|        if(path != nullptr) {
  ------------------
  |  Branch (563:12): [True: 1.54k, False: 823]
  ------------------
  564|  1.54k|            r->fPath = uprv_strdup(path);
  ------------------
  |  | 1541|  1.54k|#define uprv_strdup U_ICU_ENTRY_POINT_RENAME(uprv_strdup)
  |  |  ------------------
  |  |  |  |  123|  1.54k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.54k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.54k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  565|  1.54k|            if(r->fPath == nullptr) {
  ------------------
  |  Branch (565:16): [True: 0, False: 1.54k]
  ------------------
  566|      0|                *status = U_MEMORY_ALLOCATION_ERROR;
  567|      0|                uprv_free(r);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  568|      0|                return nullptr;
  569|      0|            }
  570|  1.54k|        }
  571|       |
  572|       |        /* this is the actual loading */
  573|  2.36k|        res_load(&(r->fData), r->fPath, r->fName, status);
  ------------------
  |  |  208|  2.36k|#define res_load U_ICU_ENTRY_POINT_RENAME(res_load)
  |  |  ------------------
  |  |  |  |  123|  2.36k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.36k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.36k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  574|       |
  575|  2.36k|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (575:13): [True: 784, False: 1.58k]
  ------------------
  576|       |            /* if we failed to load due to an out-of-memory error, exit early. */
  577|    784|            if (*status == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (577:17): [True: 0, False: 784]
  ------------------
  578|      0|                uprv_free(r);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  579|      0|                return nullptr;
  580|      0|            }
  581|       |            /* we have no such entry in dll, so it will always use fallback */
  582|    784|            *status = U_USING_FALLBACK_WARNING;
  583|    784|            r->fBogus = U_USING_FALLBACK_WARNING;
  584|  1.58k|        } else { /* if we have a regular entry */
  585|  1.58k|            Resource aliasres;
  586|  1.58k|            if (r->fData.usesPoolBundle) {
  ------------------
  |  Branch (586:17): [True: 1.57k, False: 10]
  ------------------
  587|  1.57k|                r->fPool = getPoolEntry(r->fPath, status);
  588|  1.57k|                if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (588:21): [True: 1.57k, False: 0]
  ------------------
  589|  1.57k|                    const int32_t *poolIndexes = r->fPool->fData.pRoot + 1;
  590|  1.57k|                    if(r->fData.pRoot[1 + URES_INDEX_POOL_CHECKSUM] == poolIndexes[URES_INDEX_POOL_CHECKSUM]) {
  ------------------
  |  Branch (590:24): [True: 1.57k, False: 0]
  ------------------
  591|  1.57k|                        r->fData.poolBundleKeys = reinterpret_cast<const char*>(poolIndexes + (poolIndexes[URES_INDEX_LENGTH] & 0xff));
  592|  1.57k|                        r->fData.poolBundleStrings = r->fPool->fData.p16BitUnits;
  593|  1.57k|                    } else {
  594|      0|                        r->fBogus = *status = U_INVALID_FORMAT_ERROR;
  595|      0|                    }
  596|  1.57k|                } else {
  597|      0|                    r->fBogus = *status;
  598|      0|                }
  599|  1.57k|            }
  600|  1.58k|            if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (600:17): [True: 1.58k, False: 0]
  ------------------
  601|       |                /* handle the alias by trying to get out the %%Alias tag.*/
  602|       |                /* We'll try to get alias string from the bundle */
  603|  1.58k|                aliasres = res_getResource(&(r->fData), "%%ALIAS");
  ------------------
  |  |  204|  1.58k|#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
  |  |  ------------------
  |  |  |  |  123|  1.58k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.58k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.58k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  604|  1.58k|                if (aliasres != RES_BOGUS) {
  ------------------
  |  |   65|  1.58k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (604:21): [True: 2, False: 1.58k]
  ------------------
  605|       |                    // No tracing: called during initial data loading
  606|      2|                    const char16_t *alias = res_getStringNoTrace(&(r->fData), aliasres, &aliasLen);
  ------------------
  |  |  205|      2|#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
  |  |  ------------------
  |  |  |  |  123|      2|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      2|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      2|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  607|      2|                    if(alias != nullptr && aliasLen > 0) { /* if there is actual alias - unload and load new data */
  ------------------
  |  Branch (607:24): [True: 2, False: 0]
  |  Branch (607:44): [True: 2, False: 0]
  ------------------
  608|      2|                        u_UCharsToChars(alias, aliasName, aliasLen+1);
  ------------------
  |  |  211|      2|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|      2|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      2|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      2|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  609|      2|                        r->fAlias = init_entry(aliasName, path, status);
  610|      2|                    }
  611|      2|                }
  612|  1.58k|            }
  613|  1.58k|        }
  614|       |
  615|  2.36k|        {
  616|  2.36k|            UResourceDataEntry *oldR = nullptr;
  617|  2.36k|            if ((oldR = static_cast<UResourceDataEntry*>(uhash_get(cache, r))) == nullptr) { /* if the data is not cached */
  ------------------
  |  | 1007|  2.36k|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|  2.36k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.36k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.36k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (617:17): [True: 2.36k, False: 0]
  ------------------
  618|       |                /* just insert it in the cache */
  619|  2.36k|                UErrorCode cacheStatus = U_ZERO_ERROR;
  620|  2.36k|                uhash_put(cache, (void *)r, r, &cacheStatus);
  ------------------
  |  | 1032|  2.36k|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|  2.36k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.36k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.36k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  621|  2.36k|                if (U_FAILURE(cacheStatus)) {
  ------------------
  |  Branch (621:21): [True: 0, False: 2.36k]
  ------------------
  622|      0|                    *status = cacheStatus;
  623|      0|                    free_entry(r);
  624|      0|                    r = nullptr;
  625|      0|                }
  626|  2.36k|            } else {
  627|       |                /* somebody have already inserted it while we were working, discard newly opened data */
  628|       |                /* Also, we could get here IF we opened an alias */
  629|      0|                free_entry(r);
  630|      0|                r = oldR;
  631|      0|            }
  632|  2.36k|        }
  633|       |
  634|  2.36k|    }
  635|   112k|    if(r != nullptr) {
  ------------------
  |  Branch (635:8): [True: 112k, False: 0]
  ------------------
  636|       |        /* return the real bundle */
  637|   112k|        while(r->fAlias != nullptr) {
  ------------------
  |  Branch (637:15): [True: 140, False: 112k]
  ------------------
  638|    140|            r = r->fAlias;
  639|    140|        }
  640|   112k|        r->fCountExisting++; /* we increase its reference count */
  641|       |        /* if the resource has a warning */
  642|       |        /* we don't want to overwrite a status with no error */
  643|   112k|        if(r->fBogus != U_ZERO_ERROR && U_SUCCESS(*status)) {
  ------------------
  |  Branch (643:12): [True: 25.0k, False: 87.0k]
  |  Branch (643:41): [True: 25.0k, False: 0]
  ------------------
  644|  25.0k|             *status = r->fBogus; /* set the returning status */
  645|  25.0k|        }
  646|   112k|    }
  647|   112k|    return r;
  648|   112k|}
uresbund.cpp:_ZL12setEntryNameP18UResourceDataEntryPKcP10UErrorCode:
  489|  2.36k|static void setEntryName(UResourceDataEntry *res, const char *name, UErrorCode *status) {
  490|  2.36k|    int32_t len = static_cast<int32_t>(uprv_strlen(name));
  ------------------
  |  |   37|  2.36k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  2.36k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  491|  2.36k|    if(res->fName != nullptr && res->fName != res->fNameBuffer) {
  ------------------
  |  Branch (491:8): [True: 0, False: 2.36k]
  |  Branch (491:33): [True: 0, False: 0]
  ------------------
  492|      0|        uprv_free(res->fName);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  493|      0|    }
  494|  2.36k|    if (len < static_cast<int32_t>(sizeof(res->fNameBuffer))) {
  ------------------
  |  Branch (494:9): [True: 371, False: 1.99k]
  ------------------
  495|    371|        res->fName = res->fNameBuffer;
  496|    371|    }
  497|  1.99k|    else {
  498|  1.99k|        res->fName = static_cast<char*>(uprv_malloc(len + 1));
  ------------------
  |  | 1524|  1.99k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.99k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.99k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.99k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  499|  1.99k|    }
  500|  2.36k|    if(res->fName == nullptr) {
  ------------------
  |  Branch (500:8): [True: 0, False: 2.36k]
  ------------------
  501|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  502|  2.36k|    } else {
  503|  2.36k|        uprv_strcpy(res->fName, name);
  ------------------
  |  |   36|  2.36k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  2.36k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  504|  2.36k|    }
  505|  2.36k|}
uresbund.cpp:_ZL12getPoolEntryPKcP10UErrorCode:
  651|  1.57k|getPoolEntry(const char *path, UErrorCode *status) {
  652|  1.57k|    UResourceDataEntry *poolBundle = init_entry(kPoolBundleName, path, status);
  ------------------
  |  |   19|  1.57k|#define kPoolBundleName         "pool"
  ------------------
  653|  1.57k|    if( U_SUCCESS(*status) &&
  ------------------
  |  Branch (653:9): [True: 1.57k, False: 0]
  ------------------
  654|  1.57k|        (poolBundle == nullptr || poolBundle->fBogus != U_ZERO_ERROR || !poolBundle->fData.isPoolBundle)
  ------------------
  |  Branch (654:10): [True: 0, False: 1.57k]
  |  Branch (654:35): [True: 0, False: 1.57k]
  |  Branch (654:73): [True: 0, False: 1.57k]
  ------------------
  655|  1.57k|    ) {
  656|      0|        *status = U_INVALID_FORMAT_ERROR;
  657|      0|    }
  658|  1.57k|    return poolBundle;
  659|  1.57k|}
uresbund.cpp:_ZL13mayHaveParentPc:
  297|  27.0k|static UBool mayHaveParent(char *name) {
  298|  27.0k|    return (name[0] != 0 && uprv_strstr("nb nn",name) != nullptr);
  ------------------
  |  |   41|  27.0k|#define uprv_strstr(s, c) U_STANDARD_CPP_NAMESPACE strstr(s, c)
  |  |  ------------------
  |  |  |  |  393|  27.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (298:13): [True: 27.0k, False: 0]
  |  Branch (298:29): [True: 194, False: 26.8k]
  ------------------
  299|  27.0k|}
uresbund.cpp:_ZL21loadParentsExceptRootRP18UResourceDataEntryPciaS2_P10UErrorCode:
  746|  40.6k|                      UBool usingUSRData, char usrDataPath[], UErrorCode *status) {
  747|  40.6k|    if (U_FAILURE(*status)) { return false; }
  ------------------
  |  Branch (747:9): [True: 0, False: 40.6k]
  ------------------
  748|  40.6k|    UBool checkParent = true;
  749|  41.5k|    while (checkParent && t1->fParent == nullptr && !t1->fData.noFallback &&
  ------------------
  |  Branch (749:12): [True: 41.0k, False: 487]
  |  Branch (749:27): [True: 947, False: 40.0k]
  |  Branch (749:53): [True: 947, False: 0]
  ------------------
  750|  41.5k|            res_getResource(&t1->fData,"%%ParentIsRoot") == RES_BOGUS) {
  ------------------
  |  |  204|    947|#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
  |  |  ------------------
  |  |  |  |  123|    947|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    947|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    947|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                          res_getResource(&t1->fData,"%%ParentIsRoot") == RES_BOGUS) {
  ------------------
  |  |   65|    947|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (750:13): [True: 947, False: 0]
  ------------------
  751|    947|        Resource parentRes = res_getResource(&t1->fData, "%%Parent");
  ------------------
  |  |  204|    947|#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
  |  |  ------------------
  |  |  |  |  123|    947|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    947|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    947|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  752|    947|        if (parentRes != RES_BOGUS) {  // An explicit parent was found.
  ------------------
  |  |   65|    947|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (752:13): [True: 332, False: 615]
  ------------------
  753|    332|            int32_t parentLocaleLen = 0;
  754|       |            // No tracing: called during initial data loading
  755|    332|            const char16_t *parentLocaleName = res_getStringNoTrace(&(t1->fData), parentRes, &parentLocaleLen);
  ------------------
  |  |  205|    332|#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
  |  |  ------------------
  |  |  |  |  123|    332|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    332|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    332|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  756|    332|            if(parentLocaleName != nullptr && 0 < parentLocaleLen && parentLocaleLen < nameCapacity) {
  ------------------
  |  Branch (756:16): [True: 332, False: 0]
  |  Branch (756:47): [True: 332, False: 0]
  |  Branch (756:70): [True: 332, False: 0]
  ------------------
  757|    332|                u_UCharsToChars(parentLocaleName, name, parentLocaleLen + 1);
  ------------------
  |  |  211|    332|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|    332|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    332|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    332|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  758|    332|                if (uprv_strcmp(name, kRootLocaleName) == 0) {
  ------------------
  |  |   38|    332|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|    332|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (758:21): [True: 47, False: 285]
  ------------------
  759|     47|                    return true;
  760|     47|                }
  761|    332|            }
  762|    332|        }
  763|       |        // Insert regular parents.
  764|    900|        UErrorCode parentStatus = U_ZERO_ERROR;
  765|    900|        UResourceDataEntry *t2 = init_entry(name, t1->fPath, &parentStatus);
  766|    900|        if (U_FAILURE(parentStatus)) {
  ------------------
  |  Branch (766:13): [True: 0, False: 900]
  ------------------
  767|      0|            *status = parentStatus;
  768|      0|            return false;
  769|      0|        }
  770|    900|        UResourceDataEntry *u2 = nullptr;
  771|    900|        UErrorCode usrStatus = U_ZERO_ERROR;
  772|    900|        if (usingUSRData) {  // This code inserts user override data into the inheritance chain.
  ------------------
  |  Branch (772:13): [True: 0, False: 900]
  ------------------
  773|      0|            u2 = init_entry(name, usrDataPath, &usrStatus);
  774|       |            // If we failed due to out-of-memory, report that to the caller and exit early.
  775|      0|            if (usrStatus == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (775:17): [True: 0, False: 0]
  ------------------
  776|      0|                *status = usrStatus;
  777|      0|                return false;
  778|      0|            }
  779|      0|        }
  780|       |
  781|    900|        if (usingUSRData && U_SUCCESS(usrStatus) && u2->fBogus == U_ZERO_ERROR) {
  ------------------
  |  Branch (781:13): [True: 0, False: 900]
  |  Branch (781:29): [True: 0, False: 0]
  |  Branch (781:53): [True: 0, False: 0]
  ------------------
  782|      0|            t1->fParent = u2;
  783|      0|            u2->fParent = t2;
  784|    900|        } else {
  785|    900|            t1->fParent = t2;
  786|    900|            if (usingUSRData) {
  ------------------
  |  Branch (786:17): [True: 0, False: 900]
  ------------------
  787|       |                // The USR override data wasn't found, set it to be deleted.
  788|      0|                u2->fCountExisting = 0;
  789|      0|            }
  790|    900|        }
  791|    900|        t1 = t2;
  792|    900|        checkParent = chopLocale(name) || mayHaveParent(name);
  ------------------
  |  Branch (792:23): [True: 409, False: 491]
  |  Branch (792:43): [True: 4, False: 487]
  ------------------
  793|    900|    }
  794|  40.5k|    return true;
  795|  40.6k|}
uresbund.cpp:_ZL16insertRootBundleRP18UResourceDataEntryP10UErrorCode:
  798|    668|insertRootBundle(UResourceDataEntry *&t1, UErrorCode *status) {
  799|    668|    if (U_FAILURE(*status)) { return false; }
  ------------------
  |  Branch (799:9): [True: 0, False: 668]
  ------------------
  800|    668|    UErrorCode parentStatus = U_ZERO_ERROR;
  801|    668|    UResourceDataEntry *t2 = init_entry(kRootLocaleName, t1->fPath, &parentStatus);
  ------------------
  |  |   18|    668|#define kRootLocaleName         "root"
  ------------------
  802|    668|    if (U_FAILURE(parentStatus)) {
  ------------------
  |  Branch (802:9): [True: 0, False: 668]
  ------------------
  803|      0|        *status = parentStatus;
  804|      0|        return false;
  805|      0|    }
  806|    668|    t1->fParent = t2;
  807|    668|    t1 = t2;
  808|    668|    return true;
  809|    668|}
uresbund.cpp:_ZL15entryOpenDirectPKcS0_P10UErrorCode:
  966|  16.8k|entryOpenDirect(const char* path, const char* localeID, UErrorCode* status) {
  967|  16.8k|    initCache(status);
  968|  16.8k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (968:8): [True: 0, False: 16.8k]
  ------------------
  969|      0|        return nullptr;
  970|      0|    }
  971|       |
  972|       |    // Note: We need to query the default locale *before* locking resbMutex.
  973|       |    // If the localeID is nullptr, then we want to use the default locale.
  974|  16.8k|    if (localeID == nullptr) {
  ------------------
  |  Branch (974:9): [True: 0, False: 16.8k]
  ------------------
  975|      0|        localeID = uloc_getDefault();
  ------------------
  |  | 1118|      0|#define uloc_getDefault U_ICU_ENTRY_POINT_RENAME(uloc_getDefault)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  976|  16.8k|    } else if (*localeID == 0) {
  ------------------
  |  Branch (976:16): [True: 0, False: 16.8k]
  ------------------
  977|       |        // If the localeID is "", then we want to use the root locale.
  978|      0|        localeID = kRootLocaleName;
  ------------------
  |  |   18|      0|#define kRootLocaleName         "root"
  ------------------
  979|      0|    }
  980|       |
  981|  16.8k|    Mutex lock(&resbMutex);
  982|       |
  983|       |    // findFirstExisting() without fallbacks.
  984|  16.8k|    UResourceDataEntry *r = init_entry(localeID, path, status);
  985|  16.8k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (985:8): [True: 16.8k, False: 0]
  ------------------
  986|  16.8k|        if(r->fBogus != U_ZERO_ERROR) {
  ------------------
  |  Branch (986:12): [True: 0, False: 16.8k]
  ------------------
  987|      0|            r->fCountExisting--;
  988|      0|            r = nullptr;
  989|      0|        }
  990|  16.8k|    } else {
  991|      0|        r = nullptr;
  992|      0|    }
  993|       |
  994|       |    // Some code depends on the ures_openDirect() bundle to have a parent bundle chain,
  995|       |    // unless it is marked with "nofallback".
  996|  16.8k|    UResourceDataEntry *t1 = r;
  997|  16.8k|    if(r != nullptr && uprv_strcmp(localeID, kRootLocaleName) != 0 &&  // not root
  ------------------
  |  |   38|  16.8k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  16.8k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (997:8): [True: 16.8k, False: 0]
  |  Branch (997:24): [True: 16.8k, False: 0]
  ------------------
  998|  16.8k|            r->fParent == nullptr && !r->fData.noFallback &&
  ------------------
  |  Branch (998:13): [True: 16.8k, False: 0]
  |  Branch (998:38): [True: 0, False: 16.8k]
  ------------------
  999|  16.8k|            uprv_strlen(localeID) < ULOC_FULLNAME_CAPACITY) {
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                          uprv_strlen(localeID) < ULOC_FULLNAME_CAPACITY) {
  ------------------
  |  |  264|      0|#define ULOC_FULLNAME_CAPACITY 157
  ------------------
  |  Branch (999:13): [True: 0, False: 0]
  ------------------
 1000|      0|        char name[ULOC_FULLNAME_CAPACITY];
 1001|      0|        uprv_strcpy(name, localeID);
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1002|      0|        if(!chopLocale(name) || uprv_strcmp(name, kRootLocaleName) == 0 ||
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1002:12): [True: 0, False: 0]
  |  Branch (1002:33): [True: 0, False: 0]
  ------------------
 1003|      0|                loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), false, nullptr, status)) {
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1003:17): [True: 0, False: 0]
  ------------------
 1004|      0|            if(uprv_strcmp(t1->fName, kRootLocaleName) != 0 && t1->fParent == nullptr) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1004:16): [True: 0, False: 0]
  |  Branch (1004:64): [True: 0, False: 0]
  ------------------
 1005|      0|                insertRootBundle(t1, status);
 1006|      0|            }
 1007|      0|        }
 1008|      0|        if(U_FAILURE(*status)) {
  ------------------
  |  Branch (1008:12): [True: 0, False: 0]
  ------------------
 1009|      0|            r = nullptr;
 1010|      0|        }
 1011|      0|    }
 1012|       |
 1013|  16.8k|    if(r != nullptr) {
  ------------------
  |  Branch (1013:8): [True: 16.8k, False: 0]
  ------------------
 1014|       |        // TODO: Does this ever loop?
 1015|  16.8k|        while(t1->fParent != nullptr) {
  ------------------
  |  Branch (1015:15): [True: 0, False: 16.8k]
  ------------------
 1016|      0|            t1->fParent->fCountExisting++;
 1017|      0|            t1 = t1->fParent;
 1018|      0|        }
 1019|  16.8k|    }
 1020|  16.8k|    return r;
 1021|  16.8k|}

res_load_78:
  260|  2.36k|         const char *path, const char *name, UErrorCode *errorCode) {
  261|  2.36k|    UVersionInfo formatVersion;
  262|       |
  263|  2.36k|    uprv_memset(pResData, 0, sizeof(ResourceData));
  ------------------
  |  |  100|  2.36k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  2.36k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  264|       |
  265|       |    /* load the ResourceBundle file */
  266|  2.36k|    pResData->data=udata_openChoice(path, "res", name, isAcceptable, formatVersion, errorCode);
  ------------------
  |  |  894|  2.36k|#define udata_openChoice U_ICU_ENTRY_POINT_RENAME(udata_openChoice)
  |  |  ------------------
  |  |  |  |  123|  2.36k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.36k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.36k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|  2.36k|    if(U_FAILURE(*errorCode)) {
  ------------------
  |  Branch (267:8): [True: 784, False: 1.58k]
  ------------------
  268|    784|        return;
  269|    784|    }
  270|       |
  271|       |    /* get its memory and initialize *pResData */
  272|  1.58k|    res_init(pResData, formatVersion, udata_getMemory(pResData->data), -1, errorCode);
  ------------------
  |  |  891|  1.58k|#define udata_getMemory U_ICU_ENTRY_POINT_RENAME(udata_getMemory)
  |  |  ------------------
  |  |  |  |  123|  1.58k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.58k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.58k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  273|  1.58k|}
res_getPublicType_78:
  306|  5.59k|res_getPublicType(Resource res) {
  307|  5.59k|    return (UResType)gPublicTypes[RES_GET_TYPE(res)];
  ------------------
  |  |   68|  5.59k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  308|  5.59k|}
res_getStringNoTrace_78:
  311|   291k|res_getStringNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength) {
  312|   291k|    const char16_t *p;
  313|   291k|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|   291k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  314|   291k|    int32_t length;
  315|   291k|    if(RES_GET_TYPE(res)==URES_STRING_V2) {
  ------------------
  |  |   68|   291k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (315:8): [True: 291k, False: 0]
  ------------------
  316|   291k|        int32_t first;
  317|   291k|        if((int32_t)offset<pResData->poolStringIndexLimit) {
  ------------------
  |  Branch (317:12): [True: 125k, False: 165k]
  ------------------
  318|   125k|            p=(const char16_t *)pResData->poolBundleStrings+offset;
  319|   165k|        } else {
  320|   165k|            p=(const char16_t *)pResData->p16BitUnits+(offset-pResData->poolStringIndexLimit);
  321|   165k|        }
  322|   291k|        first=*p;
  323|   291k|        if(!U16_IS_TRAIL(first)) {
  ------------------
  |  |   67|   291k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  ------------------
  |  Branch (323:12): [True: 290k, False: 1.02k]
  ------------------
  324|   290k|            length=u_strlen(p);
  ------------------
  |  |  393|   290k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|   290k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   290k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   290k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  325|   290k|        } else if(first<0xdfef) {
  ------------------
  |  Branch (325:19): [True: 1.02k, False: 0]
  ------------------
  326|  1.02k|            length=first&0x3ff;
  327|  1.02k|            ++p;
  328|  1.02k|        } else if(first<0xdfff) {
  ------------------
  |  Branch (328:19): [True: 0, False: 0]
  ------------------
  329|      0|            length=((first-0xdfef)<<16)|p[1];
  330|      0|            p+=2;
  331|      0|        } else {
  332|      0|            length=((int32_t)p[1]<<16)|p[2];
  333|      0|            p+=3;
  334|      0|        }
  335|   291k|    } else if(res==offset) /* RES_GET_TYPE(res)==URES_STRING */ {
  ------------------
  |  Branch (335:15): [True: 0, False: 0]
  ------------------
  336|      0|        const int32_t *p32= res==0 ? &gEmptyString.length : pResData->pRoot+res;
  ------------------
  |  Branch (336:29): [True: 0, False: 0]
  ------------------
  337|      0|        length=*p32++;
  338|      0|        p=(const char16_t *)p32;
  339|      0|    } else {
  340|      0|        p=nullptr;
  341|      0|        length=0;
  342|      0|    }
  343|   291k|    if(pLength) {
  ------------------
  |  Branch (343:8): [True: 290k, False: 1.29k]
  ------------------
  344|   290k|        *pLength=length;
  345|   290k|    }
  346|   291k|    return p;
  347|   291k|}
res_getAlias_78:
  420|  4.28k|res_getAlias(const ResourceData *pResData, Resource res, int32_t *pLength) {
  421|  4.28k|    const char16_t *p;
  422|  4.28k|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|  4.28k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  423|  4.28k|    int32_t length;
  424|  4.28k|    if(RES_GET_TYPE(res)==URES_ALIAS) {
  ------------------
  |  |   68|  4.28k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (424:8): [True: 4.28k, False: 0]
  ------------------
  425|  4.28k|        const int32_t *p32= offset==0 ? &gEmptyString.length : pResData->pRoot+offset;
  ------------------
  |  Branch (425:29): [True: 0, False: 4.28k]
  ------------------
  426|  4.28k|        length=*p32++;
  427|  4.28k|        p=(const char16_t *)p32;
  428|  4.28k|    } else {
  429|      0|        p=nullptr;
  430|      0|        length=0;
  431|      0|    }
  432|  4.28k|    if(pLength) {
  ------------------
  |  Branch (432:8): [True: 4.28k, False: 0]
  ------------------
  433|  4.28k|        *pLength=length;
  434|  4.28k|    }
  435|  4.28k|    return p;
  436|  4.28k|}
res_countArrayItems_78:
  477|   267k|res_countArrayItems(const ResourceData *pResData, Resource res) {
  478|   267k|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|   267k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  479|   267k|    switch(RES_GET_TYPE(res)) {
  ------------------
  |  |   68|   267k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  480|      0|    case URES_STRING:
  ------------------
  |  Branch (480:5): [True: 0, False: 267k]
  ------------------
  481|  28.7k|    case URES_STRING_V2:
  ------------------
  |  Branch (481:5): [True: 28.7k, False: 239k]
  ------------------
  482|  28.7k|    case URES_BINARY:
  ------------------
  |  Branch (482:5): [True: 0, False: 267k]
  ------------------
  483|  28.7k|    case URES_ALIAS:
  ------------------
  |  Branch (483:5): [True: 0, False: 267k]
  ------------------
  484|  47.3k|    case URES_INT:
  ------------------
  |  Branch (484:5): [True: 18.6k, False: 249k]
  ------------------
  485|  47.3k|    case URES_INT_VECTOR:
  ------------------
  |  Branch (485:5): [True: 0, False: 267k]
  ------------------
  486|  47.3k|        return 1;
  487|  7.64k|    case URES_ARRAY:
  ------------------
  |  Branch (487:5): [True: 7.64k, False: 260k]
  ------------------
  488|  7.64k|    case URES_TABLE32:
  ------------------
  |  Branch (488:5): [True: 0, False: 267k]
  ------------------
  489|  7.64k|        return offset==0 ? 0 : *(pResData->pRoot+offset);
  ------------------
  |  Branch (489:16): [True: 0, False: 7.64k]
  ------------------
  490|   171k|    case URES_TABLE:
  ------------------
  |  Branch (490:5): [True: 171k, False: 95.9k]
  ------------------
  491|   171k|        return offset==0 ? 0 : *((const uint16_t *)(pResData->pRoot+offset));
  ------------------
  |  Branch (491:16): [True: 18.9k, False: 152k]
  ------------------
  492|  11.8k|    case URES_ARRAY16:
  ------------------
  |  Branch (492:5): [True: 11.8k, False: 255k]
  ------------------
  493|  40.8k|    case URES_TABLE16:
  ------------------
  |  Branch (493:5): [True: 29.0k, False: 238k]
  ------------------
  494|  40.8k|        return pResData->p16BitUnits[offset];
  495|      0|    default:
  ------------------
  |  Branch (495:5): [True: 0, False: 267k]
  ------------------
  496|      0|        return 0;
  497|   267k|    }
  498|   267k|}
_ZN6icu_7817ResourceDataValueD2Ev:
  502|  25.0k|ResourceDataValue::~ResourceDataValue() {}
_ZNK6icu_7817ResourceDataValue7getTypeEv:
  504|  5.59k|UResType ResourceDataValue::getType() const {
  505|  5.59k|    return res_getPublicType(res);
  ------------------
  |  |  203|  5.59k|#define res_getPublicType U_ICU_ENTRY_POINT_RENAME(res_getPublicType)
  |  |  ------------------
  |  |  |  |  123|  5.59k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.59k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.59k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  506|  5.59k|}
_ZNK6icu_7817ResourceDataValue9getStringERiR10UErrorCode:
  508|   237k|const char16_t *ResourceDataValue::getString(int32_t &length, UErrorCode &errorCode) const {
  509|   237k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (509:8): [True: 0, False: 237k]
  ------------------
  510|      0|        return nullptr;
  511|      0|    }
  512|   237k|    const char16_t *s = res_getString(fTraceInfo, &getData(), res, &length);
  513|   237k|    if(s == nullptr) {
  ------------------
  |  Branch (513:8): [True: 0, False: 237k]
  ------------------
  514|      0|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  515|      0|    }
  516|   237k|    return s;
  517|   237k|}
_ZNK6icu_7817ResourceDataValue8getArrayER10UErrorCode:
  572|  2.09k|ResourceArray ResourceDataValue::getArray(UErrorCode &errorCode) const {
  573|  2.09k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (573:8): [True: 0, False: 2.09k]
  ------------------
  574|      0|        return {};
  575|      0|    }
  576|  2.09k|    const uint16_t *items16 = nullptr;
  577|  2.09k|    const Resource *items32 = nullptr;
  578|  2.09k|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|  2.09k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  579|  2.09k|    int32_t length = 0;
  580|  2.09k|    switch(RES_GET_TYPE(res)) {
  ------------------
  |  |   68|  2.09k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  581|    284|    case URES_ARRAY:
  ------------------
  |  Branch (581:5): [True: 284, False: 1.81k]
  ------------------
  582|    284|        if (offset!=0) {  // empty if offset==0
  ------------------
  |  Branch (582:13): [True: 284, False: 0]
  ------------------
  583|    284|            items32 = reinterpret_cast<const Resource*>(getData().pRoot) + offset;
  584|    284|            length = *items32++;
  585|    284|        }
  586|    284|        break;
  587|  1.81k|    case URES_ARRAY16:
  ------------------
  |  Branch (587:5): [True: 1.81k, False: 284]
  ------------------
  588|  1.81k|        items16 = getData().p16BitUnits+offset;
  589|  1.81k|        length = *items16++;
  590|  1.81k|        break;
  591|      0|    default:
  ------------------
  |  Branch (591:5): [True: 0, False: 2.09k]
  ------------------
  592|      0|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  593|      0|        return {};
  594|  2.09k|    }
  595|  2.09k|    return ResourceArray(items16, items32, length, fTraceInfo);
  596|  2.09k|}
_ZNK6icu_7817ResourceDataValue8getTableER10UErrorCode:
  598|   121k|ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const {
  599|   121k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (599:8): [True: 0, False: 121k]
  ------------------
  600|      0|        return {};
  601|      0|    }
  602|   121k|    const uint16_t *keys16 = nullptr;
  603|   121k|    const int32_t *keys32 = nullptr;
  604|   121k|    const uint16_t *items16 = nullptr;
  605|   121k|    const Resource *items32 = nullptr;
  606|   121k|    uint32_t offset = RES_GET_OFFSET(res);
  ------------------
  |  |   69|   121k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  607|   121k|    int32_t length = 0;
  608|   121k|    switch(RES_GET_TYPE(res)) {
  ------------------
  |  |   68|   121k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  609|  15.0k|    case URES_TABLE:
  ------------------
  |  Branch (609:5): [True: 15.0k, False: 106k]
  ------------------
  610|  15.0k|        if (offset != 0) {  // empty if offset==0
  ------------------
  |  Branch (610:13): [True: 15.0k, False: 0]
  ------------------
  611|  15.0k|            keys16 = reinterpret_cast<const uint16_t*>(getData().pRoot + offset);
  612|  15.0k|            length = *keys16++;
  613|  15.0k|            items32 = reinterpret_cast<const Resource*>(keys16 + length + (~length & 1));
  614|  15.0k|        }
  615|  15.0k|        break;
  616|   106k|    case URES_TABLE16:
  ------------------
  |  Branch (616:5): [True: 106k, False: 15.0k]
  ------------------
  617|   106k|        keys16 = getData().p16BitUnits+offset;
  618|   106k|        length = *keys16++;
  619|   106k|        items16 = keys16 + length;
  620|   106k|        break;
  621|      0|    case URES_TABLE32:
  ------------------
  |  Branch (621:5): [True: 0, False: 121k]
  ------------------
  622|      0|        if (offset != 0) {  // empty if offset==0
  ------------------
  |  Branch (622:13): [True: 0, False: 0]
  ------------------
  623|      0|            keys32 = getData().pRoot+offset;
  624|      0|            length = *keys32++;
  625|      0|            items32 = reinterpret_cast<const Resource*>(keys32) + length;
  626|      0|        }
  627|      0|        break;
  628|      0|    default:
  ------------------
  |  Branch (628:5): [True: 0, False: 121k]
  ------------------
  629|      0|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  630|      0|        return {};
  631|   121k|    }
  632|   121k|    return ResourceTable(keys16, keys32, items16, items32, length, fTraceInfo);
  633|   121k|}
res_getTableItemByKey_78:
  713|   501k|                      int32_t *indexR, const char **key) {
  714|   501k|    uint32_t offset=RES_GET_OFFSET(table);
  ------------------
  |  |   69|   501k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  715|   501k|    int32_t length;
  716|   501k|    int32_t idx;
  717|   501k|    if(key == nullptr || *key == nullptr) {
  ------------------
  |  Branch (717:8): [True: 0, False: 501k]
  |  Branch (717:26): [True: 0, False: 501k]
  ------------------
  718|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  719|      0|    }
  720|   501k|    switch(RES_GET_TYPE(table)) {
  ------------------
  |  |   68|   501k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  721|   472k|    case URES_TABLE: {
  ------------------
  |  Branch (721:5): [True: 472k, False: 28.6k]
  ------------------
  722|   472k|        if (offset!=0) { /* empty if offset==0 */
  ------------------
  |  Branch (722:13): [True: 438k, False: 34.0k]
  ------------------
  723|   438k|            const uint16_t *p= (const uint16_t *)(pResData->pRoot+offset);
  724|   438k|            length=*p++;
  725|   438k|            *indexR=idx=_res_findTableItem(pResData, p, length, *key, key);
  726|   438k|            if(idx>=0) {
  ------------------
  |  Branch (726:16): [True: 374k, False: 64.7k]
  ------------------
  727|   374k|                const Resource *p32=(const Resource *)(p+length+(~length&1));
  728|   374k|                return p32[idx];
  729|   374k|            }
  730|   438k|        }
  731|  98.7k|        break;
  732|   472k|    }
  733|  98.7k|    case URES_TABLE16: {
  ------------------
  |  Branch (733:5): [True: 28.6k, False: 472k]
  ------------------
  734|  28.6k|        const uint16_t *p=pResData->p16BitUnits+offset;
  735|  28.6k|        length=*p++;
  736|  28.6k|        *indexR=idx=_res_findTableItem(pResData, p, length, *key, key);
  737|  28.6k|        if(idx>=0) {
  ------------------
  |  Branch (737:12): [True: 4.31k, False: 24.3k]
  ------------------
  738|  4.31k|            return makeResourceFrom16(pResData, p[length+idx]);
  739|  4.31k|        }
  740|  24.3k|        break;
  741|  28.6k|    }
  742|  24.3k|    case URES_TABLE32: {
  ------------------
  |  Branch (742:5): [True: 0, False: 501k]
  ------------------
  743|      0|        if (offset!=0) { /* empty if offset==0 */
  ------------------
  |  Branch (743:13): [True: 0, False: 0]
  ------------------
  744|      0|            const int32_t *p= pResData->pRoot+offset;
  745|      0|            length=*p++;
  746|      0|            *indexR=idx=_res_findTable32Item(pResData, p, length, *key, key);
  747|      0|            if(idx>=0) {
  ------------------
  |  Branch (747:16): [True: 0, False: 0]
  ------------------
  748|      0|                return (Resource)p[length+idx];
  749|      0|            }
  750|      0|        }
  751|      0|        break;
  752|      0|    }
  753|      0|    default:
  ------------------
  |  Branch (753:5): [True: 0, False: 501k]
  ------------------
  754|      0|        break;
  755|   501k|    }
  756|   123k|    return RES_BOGUS;
  ------------------
  |  |   65|   123k|#define RES_BOGUS 0xffffffff
  ------------------
  757|   501k|}
res_getTableItemByIndex_78:
  761|  2.43k|                        int32_t indexR, const char **key) {
  762|  2.43k|    uint32_t offset=RES_GET_OFFSET(table);
  ------------------
  |  |   69|  2.43k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  763|  2.43k|    int32_t length;
  764|  2.43k|    if (indexR < 0) {
  ------------------
  |  Branch (764:9): [True: 0, False: 2.43k]
  ------------------
  765|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  766|      0|    }
  767|  2.43k|    switch(RES_GET_TYPE(table)) {
  ------------------
  |  |   68|  2.43k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  768|  1.29k|    case URES_TABLE: {
  ------------------
  |  Branch (768:5): [True: 1.29k, False: 1.14k]
  ------------------
  769|  1.29k|        if (offset != 0) { /* empty if offset==0 */
  ------------------
  |  Branch (769:13): [True: 1.29k, False: 0]
  ------------------
  770|  1.29k|            const uint16_t *p= (const uint16_t *)(pResData->pRoot+offset);
  771|  1.29k|            length=*p++;
  772|  1.29k|            if(indexR<length) {
  ------------------
  |  Branch (772:16): [True: 1.29k, False: 0]
  ------------------
  773|  1.29k|                const Resource *p32=(const Resource *)(p+length+(~length&1));
  774|  1.29k|                if(key!=nullptr) {
  ------------------
  |  Branch (774:20): [True: 1.29k, False: 0]
  ------------------
  775|  1.29k|                    *key=RES_GET_KEY16(pResData, p[indexR]);
  ------------------
  |  |   44|  1.29k|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 1.29k, False: 0]
  |  |  ------------------
  |  |   45|  1.29k|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|  1.29k|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
  776|  1.29k|                }
  777|  1.29k|                return p32[indexR];
  778|  1.29k|            }
  779|  1.29k|        }
  780|      0|        break;
  781|  1.29k|    }
  782|  1.14k|    case URES_TABLE16: {
  ------------------
  |  Branch (782:5): [True: 1.14k, False: 1.29k]
  ------------------
  783|  1.14k|        const uint16_t *p=pResData->p16BitUnits+offset;
  784|  1.14k|        length=*p++;
  785|  1.14k|        if(indexR<length) {
  ------------------
  |  Branch (785:12): [True: 1.14k, False: 0]
  ------------------
  786|  1.14k|            if(key!=nullptr) {
  ------------------
  |  Branch (786:16): [True: 1.14k, False: 0]
  ------------------
  787|  1.14k|                *key=RES_GET_KEY16(pResData, p[indexR]);
  ------------------
  |  |   44|  1.14k|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 1.14k, False: 0]
  |  |  ------------------
  |  |   45|  1.14k|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|  1.14k|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
  788|  1.14k|            }
  789|  1.14k|            return makeResourceFrom16(pResData, p[length+indexR]);
  790|  1.14k|        }
  791|      0|        break;
  792|  1.14k|    }
  793|      0|    case URES_TABLE32: {
  ------------------
  |  Branch (793:5): [True: 0, False: 2.43k]
  ------------------
  794|      0|        if (offset != 0) { /* empty if offset==0 */
  ------------------
  |  Branch (794:13): [True: 0, False: 0]
  ------------------
  795|      0|            const int32_t *p= pResData->pRoot+offset;
  796|      0|            length=*p++;
  797|      0|            if(indexR<length) {
  ------------------
  |  Branch (797:16): [True: 0, False: 0]
  ------------------
  798|      0|                if(key!=nullptr) {
  ------------------
  |  Branch (798:20): [True: 0, False: 0]
  ------------------
  799|      0|                    *key=RES_GET_KEY32(pResData, p[indexR]);
  ------------------
  |  |   49|      0|    ((keyOffset)>=0 ? \
  |  |  ------------------
  |  |  |  Branch (49:6): [True: 0, False: 0]
  |  |  ------------------
  |  |   50|      0|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   51|      0|        (pResData)->poolBundleKeys+((keyOffset)&0x7fffffff))
  ------------------
  800|      0|                }
  801|      0|                return (Resource)p[length+indexR];
  802|      0|            }
  803|      0|        }
  804|      0|        break;
  805|      0|    }
  806|      0|    default:
  ------------------
  |  Branch (806:5): [True: 0, False: 2.43k]
  ------------------
  807|      0|        break;
  808|  2.43k|    }
  809|      0|    return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  810|  2.43k|}
res_getResource_78:
  813|  3.47k|res_getResource(const ResourceData *pResData, const char *key) {
  814|  3.47k|    const char *realKey=key;
  815|  3.47k|    int32_t idx;
  816|  3.47k|    return res_getTableItemByKey(pResData, pResData->rootRes, &idx, &realKey);
  ------------------
  |  |  207|  3.47k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  3.47k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.47k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.47k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  817|  3.47k|}
_ZNK6icu_7813ResourceTable14getKeyAndValueEiRPKcRNS_13ResourceValueE:
  821|   528k|                                         const char *&key, icu::ResourceValue &value) const {
  822|   528k|    if(0 <= i && i < length) {
  ------------------
  |  Branch (822:8): [True: 528k, False: 0]
  |  Branch (822:18): [True: 407k, False: 121k]
  ------------------
  823|   407k|        icu::ResourceDataValue &rdValue = static_cast<icu::ResourceDataValue &>(value);
  824|   407k|        if (keys16 != nullptr) {
  ------------------
  |  Branch (824:13): [True: 407k, False: 0]
  ------------------
  825|   407k|            key = RES_GET_KEY16(&rdValue.getData(), keys16[i]);
  ------------------
  |  |   44|   407k|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 941, False: 406k]
  |  |  ------------------
  |  |   45|   407k|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|   407k|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
  826|   407k|        } else {
  827|      0|            key = RES_GET_KEY32(&rdValue.getData(), keys32[i]);
  ------------------
  |  |   49|      0|    ((keyOffset)>=0 ? \
  |  |  ------------------
  |  |  |  Branch (49:6): [True: 0, False: 0]
  |  |  ------------------
  |  |   50|      0|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   51|      0|        (pResData)->poolBundleKeys+((keyOffset)&0x7fffffff))
  ------------------
  828|      0|        }
  829|   407k|        Resource res;
  830|   407k|        if (items16 != nullptr) {
  ------------------
  |  Branch (830:13): [True: 323k, False: 84.3k]
  ------------------
  831|   323k|            res = makeResourceFrom16(&rdValue.getData(), items16[i]);
  832|   323k|        } else {
  833|  84.3k|            res = items32[i];
  834|  84.3k|        }
  835|       |        // Note: the ResourceTracer keeps a reference to the field of this
  836|       |        // ResourceTable. This is OK because the ResourceTable should remain
  837|       |        // alive for the duration that fields are being read from it
  838|       |        // (including nested fields).
  839|   407k|        rdValue.setResource(res, ResourceTracer(fTraceInfo, key));
  840|   407k|        return true;
  841|   407k|    }
  842|   121k|    return false;
  843|   528k|}
res_getArrayItem_78:
  869|  13.1k|res_getArrayItem(const ResourceData *pResData, Resource array, int32_t indexR) {
  870|  13.1k|    uint32_t offset=RES_GET_OFFSET(array);
  ------------------
  |  |   69|  13.1k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  871|  13.1k|    if (indexR < 0) {
  ------------------
  |  Branch (871:9): [True: 0, False: 13.1k]
  ------------------
  872|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  873|      0|    }
  874|  13.1k|    switch(RES_GET_TYPE(array)) {
  ------------------
  |  |   68|  13.1k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  875|  7.00k|    case URES_ARRAY: {
  ------------------
  |  Branch (875:5): [True: 7.00k, False: 6.16k]
  ------------------
  876|  7.00k|        if (offset!=0) { /* empty if offset==0 */
  ------------------
  |  Branch (876:13): [True: 7.00k, False: 0]
  ------------------
  877|  7.00k|            const int32_t *p= pResData->pRoot+offset;
  878|  7.00k|            if(indexR<*p) {
  ------------------
  |  Branch (878:16): [True: 7.00k, False: 0]
  ------------------
  879|  7.00k|                return (Resource)p[1+indexR];
  880|  7.00k|            }
  881|  7.00k|        }
  882|      0|        break;
  883|  7.00k|    }
  884|  6.16k|    case URES_ARRAY16: {
  ------------------
  |  Branch (884:5): [True: 6.16k, False: 7.00k]
  ------------------
  885|  6.16k|        const uint16_t *p=pResData->p16BitUnits+offset;
  886|  6.16k|        if(indexR<*p) {
  ------------------
  |  Branch (886:12): [True: 6.16k, False: 0]
  ------------------
  887|  6.16k|            return makeResourceFrom16(pResData, p[1+indexR]);
  888|  6.16k|        }
  889|      0|        break;
  890|  6.16k|    }
  891|      0|    default:
  ------------------
  |  Branch (891:5): [True: 0, False: 13.1k]
  ------------------
  892|      0|        break;
  893|  13.1k|    }
  894|      0|    return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  895|  13.1k|}
_ZNK6icu_7813ResourceArray19internalGetResourceEPK12ResourceDatai:
  897|  7.24k|uint32_t icu::ResourceArray::internalGetResource(const ResourceData *pResData, int32_t i) const {
  898|  7.24k|    if (items16 != nullptr) {
  ------------------
  |  Branch (898:9): [True: 5.43k, False: 1.81k]
  ------------------
  899|  5.43k|        return makeResourceFrom16(pResData, items16[i]);
  900|  5.43k|    } else {
  901|  1.81k|        return items32[i];
  902|  1.81k|    }
  903|  7.24k|}
_ZNK6icu_7813ResourceArray8getValueEiRNS_13ResourceValueE:
  905|  7.53k|UBool icu::ResourceArray::getValue(int32_t i, icu::ResourceValue &value) const {
  906|  7.53k|    if(0 <= i && i < length) {
  ------------------
  |  Branch (906:8): [True: 7.53k, False: 0]
  |  Branch (906:18): [True: 7.24k, False: 284]
  ------------------
  907|  7.24k|        icu::ResourceDataValue &rdValue = static_cast<icu::ResourceDataValue &>(value);
  908|       |        // Note: the ResourceTracer keeps a reference to the field of this
  909|       |        // ResourceArray. This is OK because the ResourceArray should remain
  910|       |        // alive for the duration that fields are being read from it
  911|       |        // (including nested fields).
  912|  7.24k|        rdValue.setResource(
  913|  7.24k|            internalGetResource(&rdValue.getData(), i),
  914|  7.24k|            ResourceTracer(fTraceInfo, i));
  915|  7.24k|        return true;
  916|  7.24k|    }
  917|    284|    return false;
  918|  7.53k|}
res_findResource_78:
  921|   100k|res_findResource(const ResourceData *pResData, Resource r, char** path, const char** key) {
  922|   100k|  char *pathP = *path, *nextSepP = *path;
  923|   100k|  char *closeIndex = nullptr;
  924|   100k|  Resource t1 = r;
  925|   100k|  Resource t2;
  926|   100k|  int32_t indexR = 0;
  927|   100k|  UResType type = (UResType)RES_GET_TYPE(t1);
  ------------------
  |  |   68|   100k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  928|       |
  929|       |  /* if you come in with an empty path, you'll be getting back the same resource */
  930|   100k|  if(!uprv_strlen(pathP)) {
  ------------------
  |  |   37|   100k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   100k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (930:6): [True: 0, False: 100k]
  ------------------
  931|      0|      return r;
  932|      0|  }
  933|       |
  934|       |  /* one needs to have an aggregate resource in order to search in it */
  935|   100k|  if(!URES_IS_CONTAINER(type)) {
  ------------------
  |  |   85|   100k|#define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   84|   201k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:30): [True: 100k, False: 582]
  |  |  |  |  |  Branch (84:61): [True: 582, False: 0]
  |  |  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   83|      0|#define URES_IS_ARRAY(type) ((int32_t)(type)==URES_ARRAY || (int32_t)(type)==URES_ARRAY16)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (83:30): [True: 0, False: 0]
  |  |  |  |  |  Branch (83:61): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  936|      0|      return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  937|      0|  }
  938|       |  
  939|   332k|  while(nextSepP && *pathP && t1 != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   65|   578k|#define RES_BOGUS 0xffffffff
  ------------------
                while(nextSepP && *pathP && t1 != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   85|   234k|#define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   84|   468k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:30): [True: 218k, False: 15.8k]
  |  |  |  |  |  Branch (84:61): [True: 13.6k, False: 2.13k]
  |  |  |  |  |  Branch (84:94): [True: 0, False: 2.13k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   83|  2.13k|#define URES_IS_ARRAY(type) ((int32_t)(type)==URES_ARRAY || (int32_t)(type)==URES_ARRAY16)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (83:30): [True: 0, False: 2.13k]
  |  |  |  |  |  Branch (83:61): [True: 0, False: 2.13k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (939:9): [True: 245k, False: 87.4k]
  |  Branch (939:21): [True: 245k, False: 294]
  |  Branch (939:31): [True: 234k, False: 11.0k]
  ------------------
  940|       |    /* Iteration stops if: the path has been consumed, we found a non-existing
  941|       |     * resource (t1 == RES_BOGUS) or we found a scalar resource (including alias)
  942|       |     */
  943|   232k|    nextSepP = uprv_strchr(pathP, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|   232k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   232k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  944|       |    /* if there are more separators, terminate string 
  945|       |     * and set path to the remaining part of the string
  946|       |     */
  947|   232k|    if(nextSepP != nullptr) {
  ------------------
  |  Branch (947:8): [True: 144k, False: 87.4k]
  ------------------
  948|   144k|      if(nextSepP == pathP) {
  ------------------
  |  Branch (948:10): [True: 0, False: 144k]
  ------------------
  949|       |        // Empty key string.
  950|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  951|      0|      }
  952|   144k|      *nextSepP = 0; /* overwrite the separator with a NUL to terminate the key */
  953|   144k|      *path = nextSepP+1;
  954|   144k|    } else {
  955|  87.4k|      *path = uprv_strchr(pathP, 0);
  ------------------
  |  |   40|  87.4k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  87.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  956|  87.4k|    }
  957|       |
  958|       |    /* if the resource is a table */
  959|       |    /* try the key based access */
  960|   232k|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|   232k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 218k, False: 13.6k]
  |  |  |  Branch (84:61): [True: 13.6k, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  961|   232k|      *key = pathP;
  962|   232k|      t2 = res_getTableItemByKey(pResData, t1, &indexR, key);
  ------------------
  |  |  207|   232k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|   232k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   232k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   232k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  963|   232k|    } else if(URES_IS_ARRAY(type)) {
  ------------------
  |  |   83|      0|#define URES_IS_ARRAY(type) ((int32_t)(type)==URES_ARRAY || (int32_t)(type)==URES_ARRAY16)
  |  |  ------------------
  |  |  |  Branch (83:30): [True: 0, False: 0]
  |  |  |  Branch (83:61): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  964|      0|      indexR = uprv_strtol(pathP, &closeIndex, 10);
  ------------------
  |  |   77|      0|#define uprv_strtol(str, end, base) U_STANDARD_CPP_NAMESPACE strtol(str, end, base)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  965|      0|      if(indexR >= 0 && *closeIndex == 0) {
  ------------------
  |  Branch (965:10): [True: 0, False: 0]
  |  Branch (965:25): [True: 0, False: 0]
  ------------------
  966|      0|        t2 = res_getArrayItem(pResData, t1, indexR);
  ------------------
  |  |  200|      0|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  967|      0|      } else {
  968|      0|        t2 = RES_BOGUS; /* have an array, but don't have a valid index */
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  969|      0|      }
  970|      0|      *key = nullptr;
  971|      0|    } else { /* can't do much here, except setting t2 to bogus */
  972|      0|      t2 = RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  973|      0|    }
  974|   232k|    t1 = t2;
  975|   232k|    type = (UResType)RES_GET_TYPE(t1);
  ------------------
  |  |   68|   232k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  976|       |    /* position pathP to next resource key/index */
  977|   232k|    pathP = *path;
  978|   232k|  }
  979|       |
  980|   100k|  return t1;
  981|   100k|}
uresdata.cpp:_ZL12isAcceptablePvPKcS1_PK9UDataInfo:
  141|  1.58k|             const UDataInfo *pInfo) {
  142|  1.58k|    uprv_memcpy(context, pInfo->formatVersion, 4);
  ------------------
  |  |   42|  1.58k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.58k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  1.58k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  1.58k|    _Pragma("clang diagnostic push") \
  |  |   45|  1.58k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  1.58k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.58k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  1.58k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.58k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  1.58k|    _Pragma("clang diagnostic pop") \
  |  |   49|  1.58k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  1.58k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  1.58k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.58k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  143|  1.58k|    return
  144|  1.58k|        pInfo->size>=20 &&
  ------------------
  |  Branch (144:9): [True: 1.58k, False: 0]
  ------------------
  145|  1.58k|        pInfo->isBigEndian==U_IS_BIG_ENDIAN &&
  ------------------
  |  |  353|  3.16k|#   define U_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
  ------------------
  |  Branch (145:9): [True: 1.58k, False: 0]
  ------------------
  146|  1.58k|        pInfo->charsetFamily==U_CHARSET_FAMILY &&
  ------------------
  |  |  588|  1.58k|#   define U_CHARSET_FAMILY U_ASCII_FAMILY
  |  |  ------------------
  |  |  |  |  531|  3.16k|#define U_ASCII_FAMILY 0
  |  |  ------------------
  ------------------
  |  Branch (146:9): [True: 1.58k, False: 0]
  ------------------
  147|  1.58k|        pInfo->sizeofUChar==U_SIZEOF_UCHAR &&
  ------------------
  |  |  352|  3.16k|#define U_SIZEOF_UCHAR 2
  ------------------
  |  Branch (147:9): [True: 1.58k, False: 0]
  ------------------
  148|  1.58k|        pInfo->dataFormat[0]==0x52 &&   /* dataFormat="ResB" */
  ------------------
  |  Branch (148:9): [True: 1.58k, False: 0]
  ------------------
  149|  1.58k|        pInfo->dataFormat[1]==0x65 &&
  ------------------
  |  Branch (149:9): [True: 1.58k, False: 0]
  ------------------
  150|  1.58k|        pInfo->dataFormat[2]==0x73 &&
  ------------------
  |  Branch (150:9): [True: 1.58k, False: 0]
  ------------------
  151|  1.58k|        pInfo->dataFormat[3]==0x42 &&
  ------------------
  |  Branch (151:9): [True: 1.58k, False: 0]
  ------------------
  152|  1.58k|        (1<=pInfo->formatVersion[0] && pInfo->formatVersion[0]<=3);
  ------------------
  |  Branch (152:10): [True: 1.58k, False: 0]
  |  Branch (152:40): [True: 1.58k, False: 0]
  ------------------
  153|  1.58k|}
uresdata.cpp:_ZL8res_initP12ResourceDataPhPKviP10UErrorCode:
  160|  1.58k|         UErrorCode *errorCode) {
  161|  1.58k|    UResType rootType;
  162|       |
  163|       |    /* get the root resource */
  164|  1.58k|    pResData->pRoot = static_cast<const int32_t*>(inBytes);
  165|  1.58k|    pResData->rootRes = static_cast<Resource>(*pResData->pRoot);
  166|  1.58k|    pResData->p16BitUnits=&gEmpty16;
  167|       |
  168|       |    /* formatVersion 1.1 must have a root item and at least 5 indexes */
  169|  1.58k|    if(length>=0 && (length/4)<((formatVersion[0]==1 && formatVersion[1]==0) ? 1 : 1+5)) {
  ------------------
  |  Branch (169:8): [True: 0, False: 1.58k]
  |  Branch (169:21): [True: 0, False: 0]
  |  Branch (169:34): [True: 0, False: 0]
  |  Branch (169:57): [True: 0, False: 0]
  ------------------
  170|      0|        *errorCode=U_INVALID_FORMAT_ERROR;
  171|      0|        res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  172|      0|        return;
  173|      0|    }
  174|       |
  175|       |    /* currently, we accept only resources that have a Table as their roots */
  176|  1.58k|    rootType = static_cast<UResType>(RES_GET_TYPE(pResData->rootRes));
  ------------------
  |  |   68|  1.58k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  177|  1.58k|    if(!URES_IS_TABLE(rootType)) {
  ------------------
  |  |   84|  1.58k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 1.42k, False: 158]
  |  |  |  Branch (84:61): [True: 158, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  178|      0|        *errorCode=U_INVALID_FORMAT_ERROR;
  179|      0|        res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|      0|        return;
  181|      0|    }
  182|       |
  183|  1.58k|    if(formatVersion[0]==1 && formatVersion[1]==0) {
  ------------------
  |  Branch (183:8): [True: 0, False: 1.58k]
  |  Branch (183:31): [True: 0, False: 0]
  ------------------
  184|      0|        pResData->localKeyLimit=0x10000;  /* greater than any 16-bit key string offset */
  185|  1.58k|    } else {
  186|       |        /* bundles with formatVersion 1.1 and later contain an indexes[] array */
  187|  1.58k|        const int32_t *indexes=pResData->pRoot+1;
  188|  1.58k|        int32_t indexLength=indexes[URES_INDEX_LENGTH]&0xff;
  189|  1.58k|        if(indexLength<=URES_INDEX_MAX_TABLE_LENGTH) {
  ------------------
  |  Branch (189:12): [True: 0, False: 1.58k]
  ------------------
  190|      0|            *errorCode=U_INVALID_FORMAT_ERROR;
  191|      0|            res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|      0|            return;
  193|      0|        }
  194|  1.58k|        if( length>=0 &&
  ------------------
  |  Branch (194:13): [True: 0, False: 1.58k]
  ------------------
  195|  1.58k|            (length<((1+indexLength)<<2) ||
  ------------------
  |  Branch (195:14): [True: 0, False: 0]
  ------------------
  196|      0|             length<(indexes[URES_INDEX_BUNDLE_TOP]<<2))
  ------------------
  |  Branch (196:14): [True: 0, False: 0]
  ------------------
  197|  1.58k|        ) {
  198|      0|            *errorCode=U_INVALID_FORMAT_ERROR;
  199|      0|            res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  200|      0|            return;
  201|      0|        }
  202|  1.58k|        if(indexes[URES_INDEX_KEYS_TOP]>(1+indexLength)) {
  ------------------
  |  Branch (202:12): [True: 10, False: 1.57k]
  ------------------
  203|     10|            pResData->localKeyLimit=indexes[URES_INDEX_KEYS_TOP]<<2;
  204|     10|        }
  205|  1.58k|        if(formatVersion[0]>=3) {
  ------------------
  |  Branch (205:12): [True: 1.09k, False: 492]
  ------------------
  206|       |            // In formatVersion 1, the indexLength took up this whole int.
  207|       |            // In version 2, bits 31..8 were reserved and always 0.
  208|       |            // In version 3, they contain bits 23..0 of the poolStringIndexLimit.
  209|       |            // Bits 27..24 are in indexes[URES_INDEX_ATTRIBUTES] bits 15..12.
  210|  1.09k|            pResData->poolStringIndexLimit = static_cast<int32_t>(static_cast<uint32_t>(indexes[URES_INDEX_LENGTH]) >> 8);
  211|  1.09k|        }
  212|  1.58k|        if(indexLength>URES_INDEX_ATTRIBUTES) {
  ------------------
  |  Branch (212:12): [True: 1.58k, False: 0]
  ------------------
  213|  1.58k|            int32_t att=indexes[URES_INDEX_ATTRIBUTES];
  214|  1.58k|            pResData->noFallback = static_cast<UBool>(att & URES_ATT_NO_FALLBACK);
  ------------------
  |  |  148|  1.58k|#define URES_ATT_NO_FALLBACK 1
  ------------------
  215|  1.58k|            pResData->isPoolBundle = static_cast<UBool>((att & URES_ATT_IS_POOL_BUNDLE) != 0);
  ------------------
  |  |  156|  1.58k|#define URES_ATT_IS_POOL_BUNDLE 2
  ------------------
  216|  1.58k|            pResData->usesPoolBundle = static_cast<UBool>((att & URES_ATT_USES_POOL_BUNDLE) != 0);
  ------------------
  |  |  157|  1.58k|#define URES_ATT_USES_POOL_BUNDLE 4
  ------------------
  217|  1.58k|            pResData->poolStringIndexLimit|=(att&0xf000)<<12;  // bits 15..12 -> 27..24
  218|  1.58k|            pResData->poolStringIndex16Limit = static_cast<int32_t>(static_cast<uint32_t>(att) >> 16);
  219|  1.58k|        }
  220|  1.58k|        if((pResData->isPoolBundle || pResData->usesPoolBundle) && indexLength<=URES_INDEX_POOL_CHECKSUM) {
  ------------------
  |  Branch (220:13): [True: 3, False: 1.58k]
  |  Branch (220:39): [True: 1.57k, False: 7]
  |  Branch (220:68): [True: 0, False: 1.57k]
  ------------------
  221|      0|            *errorCode=U_INVALID_FORMAT_ERROR;
  222|      0|            res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|      0|            return;
  224|      0|        }
  225|  1.58k|        if( indexLength>URES_INDEX_16BIT_TOP &&
  ------------------
  |  Branch (225:13): [True: 1.58k, False: 0]
  ------------------
  226|  1.58k|            indexes[URES_INDEX_16BIT_TOP]>indexes[URES_INDEX_KEYS_TOP]
  ------------------
  |  Branch (226:13): [True: 1.58k, False: 0]
  ------------------
  227|  1.58k|        ) {
  228|  1.58k|            pResData->p16BitUnits = reinterpret_cast<const uint16_t*>(pResData->pRoot + indexes[URES_INDEX_KEYS_TOP]);
  229|  1.58k|        }
  230|  1.58k|    }
  231|       |
  232|  1.58k|    if(formatVersion[0]==1 || U_CHARSET_FAMILY==U_ASCII_FAMILY) {
  ------------------
  |  |  588|  1.58k|#   define U_CHARSET_FAMILY U_ASCII_FAMILY
  |  |  ------------------
  |  |  |  |  531|  1.58k|#define U_ASCII_FAMILY 0
  |  |  ------------------
  ------------------
                  if(formatVersion[0]==1 || U_CHARSET_FAMILY==U_ASCII_FAMILY) {
  ------------------
  |  |  531|  1.58k|#define U_ASCII_FAMILY 0
  ------------------
  |  Branch (232:8): [True: 0, False: 1.58k]
  |  Branch (232:31): [Folded - Ignored]
  ------------------
  233|       |        /*
  234|       |         * formatVersion 1: compare key strings in native-charset order
  235|       |         * formatVersion 2 and up: compare key strings in ASCII order
  236|       |         */
  237|  1.58k|        pResData->useNativeStrcmp=true;
  238|  1.58k|    }
  239|  1.58k|}
uresdata.cpp:_ZL18_res_findTableItemPK12ResourceDataPKtiPKcPS5_:
   76|   467k|                   const char *key, const char **realKey) {
   77|   467k|    const char *tableKey;
   78|   467k|    int32_t mid, start, limit;
   79|   467k|    int result;
   80|       |
   81|       |    /* do a binary search for the key */
   82|   467k|    start=0;
   83|   467k|    limit=length;
   84|  1.31M|    while(start<limit) {
  ------------------
  |  Branch (84:11): [True: 1.22M, False: 89.0k]
  ------------------
   85|  1.22M|        mid = (start + limit) / 2;
   86|  1.22M|        tableKey = RES_GET_KEY16(pResData, keyOffsets[mid]);
  ------------------
  |  |   44|  1.22M|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 233k, False: 994k]
  |  |  ------------------
  |  |   45|  1.22M|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|  1.22M|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
   87|  1.22M|        if (pResData->useNativeStrcmp) {
  ------------------
  |  Branch (87:13): [True: 1.22M, False: 0]
  ------------------
   88|  1.22M|            result = uprv_strcmp(key, tableKey);
  ------------------
  |  |   38|  1.22M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.22M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   89|  1.22M|        } else {
   90|      0|            result = uprv_compareInvCharsAsAscii(key, tableKey);
  ------------------
  |  |  153|      0|#   define uprv_compareInvCharsAsAscii(s1, s2) uprv_strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   91|      0|        }
   92|  1.22M|        if (result < 0) {
  ------------------
  |  Branch (92:13): [True: 472k, False: 755k]
  ------------------
   93|   472k|            limit = mid;
   94|   755k|        } else if (result > 0) {
  ------------------
  |  Branch (94:20): [True: 377k, False: 378k]
  ------------------
   95|   377k|            start = mid + 1;
   96|   378k|        } else {
   97|       |            /* We found it! */
   98|   378k|            *realKey=tableKey;
   99|   378k|            return mid;
  100|   378k|        }
  101|  1.22M|    }
  102|  89.0k|    return URESDATA_ITEM_NOT_FOUND;  /* not found or table is empty. */
  ------------------
  |  |   53|  89.0k|#define URESDATA_ITEM_NOT_FOUND -1
  ------------------
  103|   467k|}
uresdata.cpp:_ZL18makeResourceFrom16PK12ResourceDatai:
  700|   340k|makeResourceFrom16(const ResourceData *pResData, int32_t res16) {
  701|   340k|    if(res16<pResData->poolStringIndex16Limit) {
  ------------------
  |  Branch (701:8): [True: 162k, False: 177k]
  ------------------
  702|       |        // Pool string, nothing to do.
  703|   177k|    } else {
  704|       |        // Local string, adjust the 16-bit offset to a regular one,
  705|       |        // with a larger pool string index limit.
  706|   177k|        res16=res16-pResData->poolStringIndex16Limit+pResData->poolStringIndexLimit;
  707|   177k|    }
  708|   340k|    return URES_MAKE_RESOURCE(URES_STRING_V2, res16);
  ------------------
  |  |   87|   340k|#define URES_MAKE_RESOURCE(type, offset) (((Resource)(type)<<28)|(Resource)(offset))
  ------------------
  709|   340k|}

_ZN6icu_7817ResourceDataValueC2Ev:
  516|  25.0k|        pResData(nullptr),
  517|  25.0k|        validLocaleDataEntry(nullptr),
  518|  25.0k|        res(static_cast<Resource>(URES_NONE)),
  519|  25.0k|        fTraceInfo() {}
_ZN6icu_7817ResourceDataValue7setDataERK12ResourceData:
  522|  37.1k|    void setData(const ResourceData &data) {
  523|  37.1k|        pResData = &data;
  524|  37.1k|    }
_ZN6icu_7817ResourceDataValue23setValidLocaleDataEntryEP18UResourceDataEntry:
  526|  37.1k|    void setValidLocaleDataEntry(UResourceDataEntry *entry) {
  527|  37.1k|        validLocaleDataEntry = entry;
  528|  37.1k|    }
_ZN6icu_7817ResourceDataValue11setResourceEjONS_14ResourceTracerE:
  530|   452k|    void setResource(Resource r, ResourceTracer&& traceInfo) {
  531|   452k|        res = r;
  532|   452k|        fTraceInfo = traceInfo;
  533|   452k|    }
_ZNK6icu_7817ResourceDataValue7getDataEv:
  535|  1.91M|    const ResourceData &getData() const { return *pResData; }
_ZN6icu_7813res_getStringERKNS_14ResourceTracerEPK12ResourceDatajPi:
  486|   290k|        const ResourceData *pResData, Resource res, int32_t *pLength) {
  487|   290k|    traceInfo.trace("string");
  488|   290k|    return res_getStringNoTrace(pResData, res, pLength);
  ------------------
  |  |  205|   290k|#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
  |  |  ------------------
  |  |  |  |  123|   290k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   290k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   290k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  489|   290k|}
_ZN6icu_7810res_getIntERKNS_14ResourceTracerEj:
  503|  18.6k|inline int32_t res_getInt(const ResourceTracer& traceInfo, Resource res) {
  504|  18.6k|    traceInfo.trace("int");
  505|  18.6k|    return RES_GET_INT_NO_TRACE(res);
  ------------------
  |  |   76|  18.6k|#   define RES_GET_INT_NO_TRACE(res) (((int32_t)((res)<<4L))>>4L)
  ------------------
  506|  18.6k|}

_ZNK15UResourceBundle10getResDataEv:
   94|   740k|    inline const ResourceData &getResData() const { return fData->fData; }
_ZN6icu_7820StackUResourceBundle8getAliasEv:
  130|  53.9k|    UResourceBundle* getAlias() { return &bundle; }
_ZN6icu_7820StackUResourceBundle3refEv:
  132|  12.1k|    UResourceBundle& ref() { return bundle; }

u_strcmp_78:
  673|  68.5k|{
  674|  68.5k|    char16_t  c1, c2;
  675|       |
  676|   135k|    for(;;) {
  677|   135k|        c1=*s1++;
  678|   135k|        c2=*s2++;
  679|   135k|        if (c1 != c2 || c1 == 0) {
  ------------------
  |  Branch (679:13): [True: 68.2k, False: 67.3k]
  |  Branch (679:25): [True: 362, False: 67.0k]
  ------------------
  680|  68.5k|            break;
  681|  68.5k|        }
  682|   135k|    }
  683|  68.5k|    return (int32_t)c1 - (int32_t)c2;
  684|  68.5k|}
u_strcpy_78:
  969|  53.1k|{
  970|  53.1k|    char16_t *anchor = dst;            /* save a pointer to start of dst */
  971|       |
  972|   212k|    while((*(dst++) = *(src++)) != 0) {     /* copy string 2 over              */
  ------------------
  |  Branch (972:11): [True: 159k, False: 53.1k]
  ------------------
  973|   159k|    }
  974|       |
  975|  53.1k|    return anchor;
  976|  53.1k|}
u_strlen_78:
  995|   306k|{
  996|       |#if U_SIZEOF_WCHAR_T == U_SIZEOF_UCHAR
  997|       |    return (int32_t)uprv_wcslen((const wchar_t *)s);
  998|       |#else
  999|   306k|    const char16_t *t = s;
 1000|  1.73M|    while(*t != 0) {
  ------------------
  |  Branch (1000:11): [True: 1.42M, False: 306k]
  ------------------
 1001|  1.42M|      ++t;
 1002|  1.42M|    }
 1003|   306k|    return t - s;
 1004|   306k|#endif
 1005|   306k|}
u_countChar32_78:
 1008|   102k|u_countChar32(const char16_t *s, int32_t length) {
 1009|   102k|    int32_t count;
 1010|       |
 1011|   102k|    if(s==nullptr || length<-1) {
  ------------------
  |  Branch (1011:8): [True: 0, False: 102k]
  |  Branch (1011:22): [True: 0, False: 102k]
  ------------------
 1012|      0|        return 0;
 1013|      0|    }
 1014|       |
 1015|   102k|    count=0;
 1016|   102k|    if(length>=0) {
  ------------------
  |  Branch (1016:8): [True: 102k, False: 0]
  ------------------
 1017|   289k|        while(length>0) {
  ------------------
  |  Branch (1017:15): [True: 186k, False: 102k]
  ------------------
 1018|   186k|            ++count;
 1019|   186k|            if(U16_IS_LEAD(*s) && length>=2 && U16_IS_TRAIL(*(s+1))) {
  ------------------
  |  |   59|   373k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 3.92k, False: 182k]
  |  |  ------------------
  ------------------
                          if(U16_IS_LEAD(*s) && length>=2 && U16_IS_TRAIL(*(s+1))) {
  ------------------
  |  |   67|  3.92k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 3.92k, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1019:35): [True: 3.92k, False: 0]
  ------------------
 1020|  3.92k|                s+=2;
 1021|  3.92k|                length-=2;
 1022|   182k|            } else {
 1023|   182k|                ++s;
 1024|   182k|                --length;
 1025|   182k|            }
 1026|   186k|        }
 1027|   102k|    } else /* length==-1 */ {
 1028|      0|        char16_t c;
 1029|       |
 1030|      0|        for(;;) {
 1031|      0|            if((c=*s++)==0) {
  ------------------
  |  Branch (1031:16): [True: 0, False: 0]
  ------------------
 1032|      0|                break;
 1033|      0|            }
 1034|      0|            ++count;
 1035|       |
 1036|       |            /*
 1037|       |             * sufficient to look ahead one because of UTF-16;
 1038|       |             * safe to look ahead one because at worst that would be the terminating NUL
 1039|       |             */
 1040|      0|            if(U16_IS_LEAD(c) && U16_IS_TRAIL(*s)) {
  ------------------
  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
                          if(U16_IS_LEAD(c) && U16_IS_TRAIL(*s)) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1041|      0|                ++s;
 1042|      0|            }
 1043|      0|        }
 1044|      0|    }
 1045|   102k|    return count;
 1046|   102k|}
u_memcpy_78:
 1117|   194k|u_memcpy(char16_t *dest, const char16_t *src, int32_t count) {
 1118|   194k|    if(count > 0) {
  ------------------
  |  Branch (1118:8): [True: 194k, False: 0]
  ------------------
 1119|   194k|        uprv_memcpy(dest, src, (size_t)count*U_SIZEOF_UCHAR);
  ------------------
  |  |   42|   194k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   194k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   194k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   194k|    _Pragma("clang diagnostic push") \
  |  |   45|   194k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   194k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   194k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   194k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   194k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   194k|    _Pragma("clang diagnostic pop") \
  |  |   49|   194k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   194k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   194k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   194k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1120|   194k|    }
 1121|   194k|    return dest;
 1122|   194k|}
u_terminateUChars_78:
 1469|  9.33k|u_terminateUChars(char16_t *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode) {
 1470|  9.33k|    __TERMINATE_STRING(dest, destCapacity, length, pErrorCode);
  ------------------
  |  | 1437|  9.33k|#define __TERMINATE_STRING(dest, destCapacity, length, pErrorCode) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  9.33k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1438|  9.33k|    if(pErrorCode!=nullptr && U_SUCCESS(*pErrorCode)) {                    \
  |  |  ------------------
  |  |  |  Branch (1438:8): [True: 9.33k, False: 0]
  |  |  |  Branch (1438:31): [True: 6.44k, False: 2.89k]
  |  |  ------------------
  |  | 1439|  6.44k|        /* not a public function, so no complete argument checking */   \
  |  | 1440|  6.44k|                                                                        \
  |  | 1441|  6.44k|        if(length<0) {                                                  \
  |  |  ------------------
  |  |  |  Branch (1441:12): [True: 0, False: 6.44k]
  |  |  ------------------
  |  | 1442|      0|            /* assume that the caller handles this */                   \
  |  | 1443|  6.44k|        } else if(length<destCapacity) {                                \
  |  |  ------------------
  |  |  |  Branch (1443:19): [True: 6.44k, False: 0]
  |  |  ------------------
  |  | 1444|  6.44k|            /* NUL-terminate the string, the NUL fits */                \
  |  | 1445|  6.44k|            dest[length]=0;                                             \
  |  | 1446|  6.44k|            /* unset the not-terminated warning but leave all others */ \
  |  | 1447|  6.44k|            if(*pErrorCode==U_STRING_NOT_TERMINATED_WARNING) {          \
  |  |  ------------------
  |  |  |  Branch (1447:16): [True: 0, False: 6.44k]
  |  |  ------------------
  |  | 1448|      0|                *pErrorCode=U_ZERO_ERROR;                               \
  |  | 1449|      0|            }                                                           \
  |  | 1450|  6.44k|        } else if(length==destCapacity) {                               \
  |  |  ------------------
  |  |  |  Branch (1450:19): [True: 0, False: 0]
  |  |  ------------------
  |  | 1451|      0|            /* unable to NUL-terminate, but the string itself fit - set a warning code */ \
  |  | 1452|      0|            *pErrorCode=U_STRING_NOT_TERMINATED_WARNING;                \
  |  | 1453|      0|        } else /* length>destCapacity */ {                              \
  |  | 1454|      0|            /* even the string itself did not fit - set an error code */ \
  |  | 1455|      0|            *pErrorCode=U_BUFFER_OVERFLOW_ERROR;                        \
  |  | 1456|      0|        }                                                               \
  |  | 1457|  6.44k|    } \
  |  | 1458|  9.33k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  9.33k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1471|  9.33k|    return length;
 1472|  9.33k|}
u_terminateChars_78:
 1475|  10.7k|u_terminateChars(char *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode) {
 1476|  10.7k|    __TERMINATE_STRING(dest, destCapacity, length, pErrorCode);
  ------------------
  |  | 1437|  10.7k|#define __TERMINATE_STRING(dest, destCapacity, length, pErrorCode) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  10.7k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1438|  10.7k|    if(pErrorCode!=nullptr && U_SUCCESS(*pErrorCode)) {                    \
  |  |  ------------------
  |  |  |  Branch (1438:8): [True: 10.7k, False: 0]
  |  |  |  Branch (1438:31): [True: 10.7k, False: 0]
  |  |  ------------------
  |  | 1439|  10.7k|        /* not a public function, so no complete argument checking */   \
  |  | 1440|  10.7k|                                                                        \
  |  | 1441|  10.7k|        if(length<0) {                                                  \
  |  |  ------------------
  |  |  |  Branch (1441:12): [True: 0, False: 10.7k]
  |  |  ------------------
  |  | 1442|      0|            /* assume that the caller handles this */                   \
  |  | 1443|  10.7k|        } else if(length<destCapacity) {                                \
  |  |  ------------------
  |  |  |  Branch (1443:19): [True: 10.7k, False: 0]
  |  |  ------------------
  |  | 1444|  10.7k|            /* NUL-terminate the string, the NUL fits */                \
  |  | 1445|  10.7k|            dest[length]=0;                                             \
  |  | 1446|  10.7k|            /* unset the not-terminated warning but leave all others */ \
  |  | 1447|  10.7k|            if(*pErrorCode==U_STRING_NOT_TERMINATED_WARNING) {          \
  |  |  ------------------
  |  |  |  Branch (1447:16): [True: 0, False: 10.7k]
  |  |  ------------------
  |  | 1448|      0|                *pErrorCode=U_ZERO_ERROR;                               \
  |  | 1449|      0|            }                                                           \
  |  | 1450|  10.7k|        } else if(length==destCapacity) {                               \
  |  |  ------------------
  |  |  |  Branch (1450:19): [True: 0, False: 0]
  |  |  ------------------
  |  | 1451|      0|            /* unable to NUL-terminate, but the string itself fit - set a warning code */ \
  |  | 1452|      0|            *pErrorCode=U_STRING_NOT_TERMINATED_WARNING;                \
  |  | 1453|      0|        } else /* length>destCapacity */ {                              \
  |  | 1454|      0|            /* even the string itself did not fit - set an error code */ \
  |  | 1455|      0|            *pErrorCode=U_BUFFER_OVERFLOW_ERROR;                        \
  |  | 1456|      0|        }                                                               \
  |  | 1457|  10.7k|    } \
  |  | 1458|  10.7k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  10.7k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1477|  10.7k|    return length;
 1478|  10.7k|}
ustr_hashUCharsN_78:
 1523|  2.10k|ustr_hashUCharsN(const char16_t *str, int32_t length) {
 1524|  2.10k|    STRING_HASH(char16_t, str, length, *p);
  ------------------
  |  | 1506|  2.10k|#define STRING_HASH(TYPE, STR, STRLEN, DEREF) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.10k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1507|  2.10k|    uint32_t hash = 0;                        \
  |  | 1508|  2.10k|    const TYPE *p = (const TYPE*) STR;        \
  |  | 1509|  2.10k|    if (p != nullptr) {                          \
  |  |  ------------------
  |  |  |  Branch (1509:9): [True: 2.10k, False: 0]
  |  |  ------------------
  |  | 1510|  2.10k|        int32_t len = (int32_t)(STRLEN);      \
  |  | 1511|  2.10k|        int32_t inc = ((len - 32) / 32) + 1;  \
  |  | 1512|  2.10k|        const TYPE *limit = p + len;          \
  |  | 1513|  8.18k|        while (p<limit) {                     \
  |  |  ------------------
  |  |  |  Branch (1513:16): [True: 6.08k, False: 2.10k]
  |  |  ------------------
  |  | 1514|  6.08k|            hash = (hash * 37) + DEREF;       \
  |  | 1515|  6.08k|            p += inc;                         \
  |  | 1516|  6.08k|        }                                     \
  |  | 1517|  2.10k|    }                                         \
  |  | 1518|  2.10k|    return static_cast<int32_t>(hash);        \
  |  | 1519|  2.10k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.10k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1525|  2.10k|}
ustr_hashCharsN_78:
 1528|   193k|ustr_hashCharsN(const char *str, int32_t length) {
 1529|   193k|    STRING_HASH(uint8_t, str, length, *p);
  ------------------
  |  | 1506|   193k|#define STRING_HASH(TYPE, STR, STRLEN, DEREF) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   193k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1507|   193k|    uint32_t hash = 0;                        \
  |  | 1508|   193k|    const TYPE *p = (const TYPE*) STR;        \
  |  | 1509|   193k|    if (p != nullptr) {                          \
  |  |  ------------------
  |  |  |  Branch (1509:9): [True: 193k, False: 0]
  |  |  ------------------
  |  | 1510|   193k|        int32_t len = (int32_t)(STRLEN);      \
  |  | 1511|   193k|        int32_t inc = ((len - 32) / 32) + 1;  \
  |  | 1512|   193k|        const TYPE *limit = p + len;          \
  |  | 1513|  1.93M|        while (p<limit) {                     \
  |  |  ------------------
  |  |  |  Branch (1513:16): [True: 1.74M, False: 193k]
  |  |  ------------------
  |  | 1514|  1.74M|            hash = (hash * 37) + DEREF;       \
  |  | 1515|  1.74M|            p += inc;                         \
  |  | 1516|  1.74M|        }                                     \
  |  | 1517|   193k|    }                                         \
  |  | 1518|   193k|    return static_cast<int32_t>(hash);        \
  |  | 1519|   193k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   193k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1530|   193k|}

_ZN6icu_7811ICU_Utility15makeBogusStringEv:
   50|  9.45k|    static inline UnicodeString makeBogusString() {
   51|  9.45k|        UnicodeString result;
   52|  9.45k|        result.setToBogus();
   53|  9.45k|        return result;
   54|  9.45k|    }

_ZN6icu_7811ICU_Utility11parseNumberERKNS_13UnicodeStringERia:
  189|  2.19k|                                 int32_t& pos, int8_t radix) {
  190|       |    // assert(pos[0] >= 0);
  191|       |    // assert(radix >= 2);
  192|       |    // assert(radix <= 36);
  193|  2.19k|    int32_t n = 0;
  194|  2.19k|    int32_t p = pos;
  195|  5.70k|    while (p < text.length()) {
  ------------------
  |  Branch (195:12): [True: 3.51k, False: 2.19k]
  ------------------
  196|  3.51k|        UChar32 ch = text.char32At(p);
  197|  3.51k|        int32_t d = u_digit(ch, radix);
  ------------------
  |  |  229|  3.51k|#define u_digit U_ICU_ENTRY_POINT_RENAME(u_digit)
  |  |  ------------------
  |  |  |  |  123|  3.51k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.51k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.51k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  198|  3.51k|        if (d < 0) {
  ------------------
  |  Branch (198:13): [True: 0, False: 3.51k]
  ------------------
  199|      0|            break;
  200|      0|        }
  201|  3.51k|        int64_t update = radix*static_cast<int64_t>(n) + d;
  202|  3.51k|        if (update > INT32_MAX) {
  ------------------
  |  Branch (202:13): [True: 0, False: 3.51k]
  ------------------
  203|      0|            return -1;
  204|      0|        }
  205|  3.51k|        n = static_cast<int32_t>(update);
  206|  3.51k|        ++p;
  207|  3.51k|    }
  208|  2.19k|    if (p == pos) {
  ------------------
  |  Branch (208:9): [True: 0, False: 2.19k]
  ------------------
  209|      0|        return -1;
  210|      0|    }
  211|  2.19k|    pos = p;
  212|  2.19k|    return n;
  213|  2.19k|}

_ZN6icu_787UVectorC2EPFvPvEPFa8UElementS4_ER10UErrorCode:
   41|    717|        UVector(d, c, DEFAULT_CAPACITY, status) {
   42|    717|}
_ZN6icu_787UVectorC2EPFvPvEPFa8UElementS4_EiR10UErrorCode:
   45|  1.43k|    deleter(d),
   46|  1.43k|    comparer(c)
   47|  1.43k|{
   48|  1.43k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (48:9): [True: 0, False: 1.43k]
  ------------------
   49|      0|        return;
   50|      0|    }
   51|       |    // Fix bogus initialCapacity values; avoid malloc(0) and integer overflow
   52|  1.43k|    if ((initialCapacity < 1) || (initialCapacity > static_cast<int32_t>(INT32_MAX / sizeof(UElement)))) {
  ------------------
  |  Branch (52:9): [True: 0, False: 1.43k]
  |  Branch (52:34): [True: 0, False: 1.43k]
  ------------------
   53|      0|        initialCapacity = DEFAULT_CAPACITY;
   54|      0|    }
   55|  1.43k|    elements = static_cast<UElement*>(uprv_malloc(sizeof(UElement) * initialCapacity));
  ------------------
  |  | 1524|  1.43k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.43k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.43k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.43k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   56|  1.43k|    if (elements == nullptr) {
  ------------------
  |  Branch (56:9): [True: 0, False: 1.43k]
  ------------------
   57|      0|        status = U_MEMORY_ALLOCATION_ERROR;
   58|  1.43k|    } else {
   59|  1.43k|        capacity = initialCapacity;
   60|  1.43k|    }
   61|  1.43k|}
_ZN6icu_787UVectorD2Ev:
   63|  1.43k|UVector::~UVector() {
   64|  1.43k|    removeAllElements();
   65|  1.43k|    uprv_free(elements);
  ------------------
  |  | 1503|  1.43k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  1.43k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.43k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.43k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   66|  1.43k|    elements = nullptr;
   67|  1.43k|}
_ZN6icu_787UVector10addElementEPvR10UErrorCode:
  102|      1|void UVector::addElement(void* obj, UErrorCode &status) {
  103|      1|    U_ASSERT(deleter == nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  104|      1|    if (ensureCapacity(count + 1, status)) {
  ------------------
  |  Branch (104:9): [True: 1, False: 0]
  ------------------
  105|      1|        elements[count++].pointer = obj;
  106|      1|    }
  107|      1|}
_ZNK6icu_787UVector9elementAtEi:
  185|      4|void* UVector::elementAt(int32_t index) const {
  186|      4|    return (0 <= index && index < count) ? elements[index].pointer : nullptr;
  ------------------
  |  Branch (186:13): [True: 4, False: 0]
  |  Branch (186:27): [True: 4, False: 0]
  ------------------
  187|      4|}
_ZN6icu_787UVector17removeAllElementsEv:
  251|  1.43k|void UVector::removeAllElements() {
  252|  1.43k|    if (deleter != nullptr) {
  ------------------
  |  Branch (252:9): [True: 717, False: 717]
  ------------------
  253|    717|        for (int32_t i=0; i<count; ++i) {
  ------------------
  |  Branch (253:27): [True: 0, False: 717]
  ------------------
  254|      0|            if (elements[i].pointer != nullptr) {
  ------------------
  |  Branch (254:17): [True: 0, False: 0]
  ------------------
  255|      0|                (*deleter)(elements[i].pointer);
  256|      0|            }
  257|      0|        }
  258|    717|    }
  259|  1.43k|    count = 0;
  260|  1.43k|}
_ZNK6icu_787UVector7indexOfEPvi:
  288|      1|int32_t UVector::indexOf(void* obj, int32_t startIndex) const {
  289|      1|    UElement key;
  290|      1|    key.pointer = obj;
  291|      1|    return indexOf(key, startIndex, HINT_KEY_POINTER);
  292|      1|}
_ZNK6icu_787UVector7indexOfE8UElementia:
  300|      1|int32_t UVector::indexOf(UElement key, int32_t startIndex, int8_t hint) const {
  301|      1|    if (comparer != nullptr) {
  ------------------
  |  Branch (301:9): [True: 1, False: 0]
  ------------------
  302|      1|        for (int32_t i=startIndex; i<count; ++i) {
  ------------------
  |  Branch (302:36): [True: 0, False: 1]
  ------------------
  303|      0|            if ((*comparer)(key, elements[i])) {
  ------------------
  |  Branch (303:17): [True: 0, False: 0]
  ------------------
  304|      0|                return i;
  305|      0|            }
  306|      0|        }
  307|      1|    } else {
  308|      0|        for (int32_t i=startIndex; i<count; ++i) {
  ------------------
  |  Branch (308:36): [True: 0, False: 0]
  ------------------
  309|       |            /* Pointers are not always the same size as ints so to perform
  310|       |             * a valid comparison we need to know whether we are being
  311|       |             * provided an int or a pointer. */
  312|      0|            if (hint & HINT_KEY_POINTER) {
  ------------------
  |  Branch (312:17): [True: 0, False: 0]
  ------------------
  313|      0|                if (key.pointer == elements[i].pointer) {
  ------------------
  |  Branch (313:21): [True: 0, False: 0]
  ------------------
  314|      0|                    return i;
  315|      0|                }
  316|      0|            } else {
  317|      0|                if (key.integer == elements[i].integer) {
  ------------------
  |  Branch (317:21): [True: 0, False: 0]
  ------------------
  318|      0|                    return i;
  319|      0|                }
  320|      0|            }
  321|      0|        }
  322|      0|    }
  323|      1|    return -1;
  324|      1|}
_ZN6icu_787UVector14ensureCapacityEiR10UErrorCode:
  326|      1|UBool UVector::ensureCapacity(int32_t minimumCapacity, UErrorCode &status) {
  327|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (327:9): [True: 0, False: 1]
  ------------------
  328|      0|        return false;
  329|      0|    }
  330|      1|    if (minimumCapacity < 0) {
  ------------------
  |  Branch (330:9): [True: 0, False: 1]
  ------------------
  331|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  332|      0|        return false;
  333|      0|    }
  334|      1|    if (capacity < minimumCapacity) {
  ------------------
  |  Branch (334:9): [True: 0, False: 1]
  ------------------
  335|      0|        if (capacity > (INT32_MAX - 1) / 2) {        	// integer overflow check
  ------------------
  |  Branch (335:13): [True: 0, False: 0]
  ------------------
  336|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  337|      0|            return false;
  338|      0|        }
  339|      0|        int32_t newCap = capacity * 2;
  340|      0|        if (newCap < minimumCapacity) {
  ------------------
  |  Branch (340:13): [True: 0, False: 0]
  ------------------
  341|      0|            newCap = minimumCapacity;
  342|      0|        }
  343|      0|        if (newCap > static_cast<int32_t>(INT32_MAX / sizeof(UElement))) { // integer overflow check
  ------------------
  |  Branch (343:13): [True: 0, False: 0]
  ------------------
  344|       |            // We keep the original memory contents on bad minimumCapacity.
  345|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  346|      0|            return false;
  347|      0|        }
  348|      0|        UElement* newElems = static_cast<UElement*>(uprv_realloc(elements, sizeof(UElement) * newCap));
  ------------------
  |  | 1536|      0|#define uprv_realloc U_ICU_ENTRY_POINT_RENAME(uprv_realloc)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  349|      0|        if (newElems == nullptr) {
  ------------------
  |  Branch (349:13): [True: 0, False: 0]
  ------------------
  350|       |            // We keep the original contents on the memory failure on realloc or bad minimumCapacity.
  351|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  352|      0|            return false;
  353|      0|        }
  354|      0|        elements = newElems;
  355|      0|        capacity = newCap;
  356|      0|    }
  357|      1|    return true;
  358|      1|}
_ZN6icu_787UVector4sortEPFi8UElementS1_ER10UErrorCode:
  547|    717|void UVector::sort(UElementComparator *compare, UErrorCode &ec) {
  548|    717|    if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (548:9): [True: 717, False: 0]
  ------------------
  549|    717|        uprv_sortArray(elements, count, sizeof(UElement),
  ------------------
  |  | 1538|    717|#define uprv_sortArray U_ICU_ENTRY_POINT_RENAME(uprv_sortArray)
  |  |  ------------------
  |  |  |  |  123|    717|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    717|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    717|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  550|    717|                       sortComparator, &compare, false, &ec);
  551|    717|    }
  552|    717|}

_ZNK6icu_787UVector8containsEPv:
  174|      1|    inline UBool contains(void* obj) const {return indexOf(obj) >= 0;}
_ZNK6icu_787UVector4sizeEv:
  190|  3.40k|    inline int32_t size() const {return count;}

_ZN6icu_789UVector32C2ER10UErrorCode:
   30|  15.6k|    count(0),
   31|  15.6k|    capacity(0),
   32|  15.6k|    maxCapacity(0),
   33|  15.6k|    elements(nullptr)
   34|  15.6k|{
   35|  15.6k|    _init(DEFAULT_CAPACITY, status);
  ------------------
  |  |   19|  15.6k|#define DEFAULT_CAPACITY 8
  ------------------
   36|  15.6k|}
_ZN6icu_789UVector325_initEiR10UErrorCode:
   49|  15.6k|void UVector32::_init(int32_t initialCapacity, UErrorCode &status) {
   50|       |    // Fix bogus initialCapacity values; avoid malloc(0)
   51|  15.6k|    if (initialCapacity < 1) {
  ------------------
  |  Branch (51:9): [True: 0, False: 15.6k]
  ------------------
   52|      0|        initialCapacity = DEFAULT_CAPACITY;
  ------------------
  |  |   19|      0|#define DEFAULT_CAPACITY 8
  ------------------
   53|      0|    }
   54|  15.6k|    if (maxCapacity>0 && maxCapacity<initialCapacity) {
  ------------------
  |  Branch (54:9): [True: 0, False: 15.6k]
  |  Branch (54:26): [True: 0, False: 0]
  ------------------
   55|      0|        initialCapacity = maxCapacity;
   56|      0|    }
   57|  15.6k|    if (initialCapacity > static_cast<int32_t>(INT32_MAX / sizeof(int32_t))) {
  ------------------
  |  Branch (57:9): [True: 0, False: 15.6k]
  ------------------
   58|      0|        initialCapacity = uprv_min(DEFAULT_CAPACITY, maxCapacity);
  ------------------
  |  | 1529|      0|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      initialCapacity = uprv_min(DEFAULT_CAPACITY, maxCapacity);
  ------------------
  |  |   19|      0|#define DEFAULT_CAPACITY 8
  ------------------
   59|      0|    }
   60|  15.6k|    elements = static_cast<int32_t*>(uprv_malloc(sizeof(int32_t) * initialCapacity));
  ------------------
  |  | 1524|  15.6k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  15.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  15.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  15.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   61|  15.6k|    if (elements == nullptr) {
  ------------------
  |  Branch (61:9): [True: 0, False: 15.6k]
  ------------------
   62|      0|        status = U_MEMORY_ALLOCATION_ERROR;
   63|  15.6k|    } else {
   64|  15.6k|        capacity = initialCapacity;
   65|  15.6k|    }
   66|  15.6k|}
_ZN6icu_789UVector32D2Ev:
   68|  14.2k|UVector32::~UVector32() {
   69|  14.2k|    uprv_free(elements);
  ------------------
  |  | 1503|  14.2k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  14.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   70|  14.2k|    elements = nullptr;
   71|  14.2k|}
_ZN6icu_789UVector326assignERKS0_R10UErrorCode:
   76|  14.2k|void UVector32::assign(const UVector32& other, UErrorCode &ec) {
   77|  14.2k|    if (ensureCapacity(other.count, ec)) {
  ------------------
  |  Branch (77:9): [True: 14.2k, False: 0]
  ------------------
   78|  14.2k|        setSize(other.count);
   79|  52.5k|        for (int32_t i=0; i<other.count; ++i) {
  ------------------
  |  Branch (79:27): [True: 38.3k, False: 14.2k]
  ------------------
   80|  38.3k|            elements[i] = other.elements[i];
   81|  38.3k|        }
   82|  14.2k|    }
   83|  14.2k|}
_ZN6icu_789UVector3212setElementAtEii:
   98|  3.26k|void UVector32::setElementAt(int32_t elem, int32_t index) {
   99|  3.26k|    if (0 <= index && index < count) {
  ------------------
  |  Branch (99:9): [True: 3.26k, False: 0]
  |  Branch (99:23): [True: 3.26k, False: 0]
  ------------------
  100|  3.26k|        elements[index] = elem;
  101|  3.26k|    }
  102|       |    /* else index out of range */
  103|  3.26k|}
_ZN6icu_789UVector3214expandCapacityEiR10UErrorCode:
  200|    804|UBool UVector32::expandCapacity(int32_t minimumCapacity, UErrorCode &status) {
  201|    804|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (201:9): [True: 0, False: 804]
  ------------------
  202|      0|        return false;
  203|      0|    }
  204|    804|    if (minimumCapacity < 0) {
  ------------------
  |  Branch (204:9): [True: 0, False: 804]
  ------------------
  205|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  206|      0|        return false;
  207|      0|    }
  208|    804|    if (capacity >= minimumCapacity) {
  ------------------
  |  Branch (208:9): [True: 0, False: 804]
  ------------------
  209|      0|        return true;
  210|      0|    }
  211|    804|    if (maxCapacity>0 && minimumCapacity>maxCapacity) {
  ------------------
  |  Branch (211:9): [True: 0, False: 804]
  |  Branch (211:26): [True: 0, False: 0]
  ------------------
  212|      0|        status = U_BUFFER_OVERFLOW_ERROR;
  213|      0|        return false;
  214|      0|    }
  215|    804|    if (capacity > (INT32_MAX - 1) / 2) {  // integer overflow check
  ------------------
  |  Branch (215:9): [True: 0, False: 804]
  ------------------
  216|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  217|      0|        return false;
  218|      0|    }
  219|    804|    int32_t newCap = capacity * 2;
  220|    804|    if (newCap < minimumCapacity) {
  ------------------
  |  Branch (220:9): [True: 0, False: 804]
  ------------------
  221|      0|        newCap = minimumCapacity;
  222|      0|    }
  223|    804|    if (maxCapacity > 0 && newCap > maxCapacity) {
  ------------------
  |  Branch (223:9): [True: 0, False: 804]
  |  Branch (223:28): [True: 0, False: 0]
  ------------------
  224|      0|        newCap = maxCapacity;
  225|      0|    }
  226|    804|    if (newCap > static_cast<int32_t>(INT32_MAX / sizeof(int32_t))) { // integer overflow check
  ------------------
  |  Branch (226:9): [True: 0, False: 804]
  ------------------
  227|       |        // We keep the original memory contents on bad minimumCapacity/maxCapacity.
  228|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  229|      0|        return false;
  230|      0|    }
  231|    804|    int32_t* newElems = static_cast<int32_t*>(uprv_realloc(elements, sizeof(int32_t) * newCap));
  ------------------
  |  | 1536|    804|#define uprv_realloc U_ICU_ENTRY_POINT_RENAME(uprv_realloc)
  |  |  ------------------
  |  |  |  |  123|    804|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    804|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    804|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  232|    804|    if (newElems == nullptr) {
  ------------------
  |  Branch (232:9): [True: 0, False: 804]
  ------------------
  233|       |        // We keep the original contents on the memory failure on realloc.
  234|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  235|      0|        return false;
  236|      0|    }
  237|    804|    elements = newElems;
  238|    804|    capacity = newCap;
  239|    804|    return true;
  240|    804|}
_ZN6icu_789UVector327setSizeEi:
  278|  14.2k|void UVector32::setSize(int32_t newSize) {
  279|  14.2k|    int32_t i;
  280|  14.2k|    if (newSize < 0) {
  ------------------
  |  Branch (280:9): [True: 0, False: 14.2k]
  ------------------
  281|      0|        return;
  282|      0|    }
  283|  14.2k|    if (newSize > count) {
  ------------------
  |  Branch (283:9): [True: 14.2k, False: 0]
  ------------------
  284|  14.2k|        UErrorCode ec = U_ZERO_ERROR;
  285|  14.2k|        if (!ensureCapacity(newSize, ec)) {
  ------------------
  |  Branch (285:13): [True: 0, False: 14.2k]
  ------------------
  286|      0|            return;
  287|      0|        }
  288|  52.5k|        for (i=count; i<newSize; ++i) {
  ------------------
  |  Branch (288:23): [True: 38.3k, False: 14.2k]
  ------------------
  289|  38.3k|            elements[i] = 0;
  290|  38.3k|        }
  291|  14.2k|    } 
  292|  14.2k|    count = newSize;
  293|  14.2k|}

_ZN6icu_789UVector3214ensureCapacityEiR10UErrorCode:
  215|  31.4k|inline UBool UVector32::ensureCapacity(int32_t minimumCapacity, UErrorCode &status) {
  216|  31.4k|    if ((minimumCapacity >= 0) && (capacity >= minimumCapacity)) {
  ------------------
  |  Branch (216:9): [True: 31.4k, False: 0]
  |  Branch (216:35): [True: 30.6k, False: 804]
  ------------------
  217|  30.6k|        return true;
  218|  30.6k|    } else {
  219|    804|        return expandCapacity(minimumCapacity, status);
  220|    804|    }
  221|  31.4k|}
_ZNK6icu_789UVector3210elementAtiEi:
  223|  29.6k|inline int32_t UVector32::elementAti(int32_t index) const {
  224|  29.6k|    return (index >= 0 && count > 0 && count - index > 0) ? elements[index] : 0;
  ------------------
  |  Branch (224:13): [True: 29.6k, False: 0]
  |  Branch (224:27): [True: 29.6k, False: 0]
  |  Branch (224:40): [True: 29.6k, False: 0]
  ------------------
  225|  29.6k|}
_ZN6icu_789UVector3210addElementEiR10UErrorCode:
  228|  2.97k|inline void UVector32::addElement(int32_t elem, UErrorCode &status) {
  229|  2.97k|    if (ensureCapacity(count + 1, status)) {
  ------------------
  |  Branch (229:9): [True: 2.97k, False: 0]
  ------------------
  230|  2.97k|        elements[count] = elem;
  231|  2.97k|        count++;
  232|  2.97k|    }
  233|  2.97k|}
_ZNK6icu_789UVector324sizeEv:
  255|  25.6k|inline int32_t UVector32::size() const {
  256|  25.6k|    return count;
  257|  25.6k|}

_ZN6icu_7812CurrencyUnitC2ENS_14ConstChar16PtrER10UErrorCode:
   28|  9.33k|CurrencyUnit::CurrencyUnit(ConstChar16Ptr _isoCode, UErrorCode& ec) {
   29|       |    // The constructor always leaves the CurrencyUnit in a valid state (with a 3-character currency code).
   30|       |    // Note: in ICU4J Currency.getInstance(), we check string length for 3, but in ICU4C we allow a
   31|       |    // non-NUL-terminated string to be passed as an argument, so it is not possible to check length.
   32|       |    // However, we allow a NUL-terminated empty string, which should have the same behavior as nullptr.
   33|       |    // Consider NUL-terminated strings of length 1 or 2 as invalid.
   34|  9.33k|    bool useDefault = false;
   35|  9.33k|    if (U_FAILURE(ec) || _isoCode == nullptr || _isoCode[0] == 0) {
  ------------------
  |  Branch (35:9): [True: 0, False: 9.33k]
  |  Branch (35:26): [True: 0, False: 9.33k]
  |  Branch (35:49): [True: 9.33k, False: 0]
  ------------------
   36|  9.33k|        useDefault = true;
   37|  9.33k|    } else if (_isoCode[1] == 0 || _isoCode[2] == 0) {
  ------------------
  |  Branch (37:16): [True: 0, False: 0]
  |  Branch (37:36): [True: 0, False: 0]
  ------------------
   38|      0|        useDefault = true;
   39|      0|        ec = U_ILLEGAL_ARGUMENT_ERROR;
   40|      0|    } else if (!uprv_isInvariantUString(_isoCode, 3)) {
  ------------------
  |  | 1518|      0|#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (40:16): [True: 0, False: 0]
  ------------------
   41|       |        // TODO: Perform a more strict ASCII check like in ICU4J isAlpha3Code?
   42|      0|        useDefault = true;
   43|      0|        ec = U_INVARIANT_CONVERSION_ERROR;
   44|      0|    } else {
   45|      0|        for (int32_t i=0; i<3; i++) {
  ------------------
  |  Branch (45:27): [True: 0, False: 0]
  ------------------
   46|      0|            isoCode[i] = u_asciiToUpper(_isoCode[i]);
  ------------------
  |  |  212|      0|#define u_asciiToUpper U_ICU_ENTRY_POINT_RENAME(u_asciiToUpper)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   47|      0|        }
   48|      0|        isoCode[3] = 0;
   49|      0|    }
   50|  9.33k|    if (useDefault) {
  ------------------
  |  Branch (50:9): [True: 9.33k, False: 0]
  ------------------
   51|  9.33k|        uprv_memcpy(isoCode, kDefaultCurrency, sizeof(char16_t) * 4);
  ------------------
  |  |   42|  9.33k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  9.33k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  9.33k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  9.33k|    _Pragma("clang diagnostic push") \
  |  |   45|  9.33k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  9.33k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  9.33k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  9.33k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  9.33k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  9.33k|    _Pragma("clang diagnostic pop") \
  |  |   49|  9.33k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  9.33k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  9.33k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   52|  9.33k|    }
   53|  9.33k|    char simpleIsoCode[4];
   54|  9.33k|    u_UCharsToChars(isoCode, simpleIsoCode, 4);
  ------------------
  |  |  211|  9.33k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   55|  9.33k|    initCurrency(simpleIsoCode);
   56|  9.33k|}
_ZN6icu_7812CurrencyUnitC2ERKS0_:
   82|  28.0k|CurrencyUnit::CurrencyUnit(const CurrencyUnit& other) : MeasureUnit(other) {
   83|  28.0k|    u_strcpy(isoCode, other.isoCode);
  ------------------
  |  |  390|  28.0k|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|  28.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  28.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  28.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   84|  28.0k|}
_ZN6icu_7812CurrencyUnitC2Ev:
   99|  9.33k|CurrencyUnit::CurrencyUnit() : MeasureUnit() {
  100|  9.33k|    u_strcpy(isoCode, kDefaultCurrency);
  ------------------
  |  |  390|  9.33k|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  101|  9.33k|    char simpleIsoCode[4];
  102|  9.33k|    u_UCharsToChars(isoCode, simpleIsoCode, 4);
  ------------------
  |  |  211|  9.33k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  103|  9.33k|    initCurrency(simpleIsoCode);
  104|  9.33k|}
_ZN6icu_7812CurrencyUnitaSERKS0_:
  106|  9.33k|CurrencyUnit& CurrencyUnit::operator=(const CurrencyUnit& other) {
  107|  9.33k|    if (this == &other) {
  ------------------
  |  Branch (107:9): [True: 0, False: 9.33k]
  ------------------
  108|      0|        return *this;
  109|      0|    }
  110|  9.33k|    MeasureUnit::operator=(other);
  111|  9.33k|    u_strcpy(isoCode, other.isoCode);
  ------------------
  |  |  390|  9.33k|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  112|  9.33k|    return *this;
  113|  9.33k|}
_ZN6icu_7812CurrencyUnitD2Ev:
  119|  46.6k|CurrencyUnit::~CurrencyUnit() {
  120|  46.6k|}

_ZN6icu_7820DecimalFormatSymbolsC2ERKNS_6LocaleERKNS_15NumberingSystemER10UErrorCode:
  115|  9.33k|        : UObject(), locale(loc) {
  116|  9.33k|    initialize(locale, status, false, &ns);
  117|  9.33k|}
_ZN6icu_7820DecimalFormatSymbolsD2Ev:
  137|  9.33k|{
  138|  9.33k|    delete actualLocale;
  139|  9.33k|    delete validLocale;
  140|  9.33k|}
_ZN6icu_7820DecimalFormatSymbols10initializeERKNS_6LocaleER10UErrorCodeaPKNS_15NumberingSystemE:
  359|  9.33k|{
  360|  9.33k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (360:9): [True: 0, False: 9.33k]
  ------------------
  361|       |
  362|       |    // First initialize all the symbols to the fallbacks for anything we can't find
  363|  9.33k|    initialize();
  364|       |
  365|       |    //
  366|       |    // Next get the numbering system for this locale and set zero digit
  367|       |    // and the digit string based on the numbering system for the locale
  368|       |    //
  369|  9.33k|    LocalPointer<NumberingSystem> nsLocal;
  370|  9.33k|    if (ns == nullptr) {
  ------------------
  |  Branch (370:9): [True: 0, False: 9.33k]
  ------------------
  371|       |        // Use the numbering system according to the locale.
  372|       |        // Save it into a LocalPointer so it gets cleaned up.
  373|      0|        nsLocal.adoptInstead(NumberingSystem::createInstance(loc, status));
  374|      0|        ns = nsLocal.getAlias();
  375|      0|    }
  376|  9.33k|    const char *nsName;
  377|  9.33k|    if (U_SUCCESS(status) && ns->getRadix() == 10 && !ns->isAlgorithmic()) {
  ------------------
  |  Branch (377:9): [True: 9.33k, False: 0]
  |  Branch (377:30): [True: 9.33k, False: 0]
  |  Branch (377:54): [True: 9.33k, False: 0]
  ------------------
  378|  9.33k|        nsName = ns->getName();
  379|  9.33k|        UnicodeString digitString(ns->getDescription());
  380|  9.33k|        int32_t digitIndex = 0;
  381|  9.33k|        UChar32 digit = digitString.char32At(0);
  382|  9.33k|        fSymbols[kZeroDigitSymbol].setTo(digit);
  383|  93.3k|        for (int32_t i = kOneDigitSymbol; i <= kNineDigitSymbol; ++i) {
  ------------------
  |  Branch (383:43): [True: 84.0k, False: 9.33k]
  ------------------
  384|  84.0k|            digitIndex += U16_LENGTH(digit);
  ------------------
  |  |  141|  84.0k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 82.2k, False: 1.76k]
  |  |  ------------------
  ------------------
  385|  84.0k|            digit = digitString.char32At(digitIndex);
  386|  84.0k|            fSymbols[i].setTo(digit);
  387|  84.0k|        }
  388|  9.33k|    } else {
  389|      0|        nsName = gLatn;
  390|      0|    }
  391|  9.33k|    uprv_strcpy(this->nsName, nsName);
  ------------------
  |  |   36|  9.33k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  392|       |
  393|       |    // Open resource bundles
  394|  9.33k|    const char* locStr = loc.getName();
  395|  9.33k|    LocalUResourceBundlePointer resource(ures_open(nullptr, locStr, &status));
  ------------------
  |  | 1691|  9.33k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  396|  9.33k|    LocalUResourceBundlePointer numberElementsRes(
  397|  9.33k|        ures_getByKeyWithFallback(resource.getAlias(), gNumberElements, nullptr, &status));
  ------------------
  |  | 1662|  9.33k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  398|       |
  399|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (399:9): [True: 0, False: 9.33k]
  ------------------
  400|      0|        if ( useLastResortData ) {
  ------------------
  |  Branch (400:14): [True: 0, False: 0]
  ------------------
  401|      0|            status = U_USING_DEFAULT_WARNING;
  402|      0|            initialize();
  403|      0|        }
  404|      0|        return;
  405|      0|    }
  406|       |
  407|       |    // Set locale IDs
  408|       |    // TODO: Is there a way to do this without depending on the resource bundle instance?
  409|  9.33k|    U_LOCALE_BASED(locBased, *this);
  ------------------
  |  |   25|  9.33k|  LocaleBased varname((objname).validLocale, (objname).actualLocale)
  ------------------
  410|  9.33k|    locBased.setLocaleIDs(
  411|  9.33k|        ures_getLocaleByType(
  ------------------
  |  | 1669|  9.33k|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  412|  9.33k|            numberElementsRes.getAlias(),
  413|  9.33k|            ULOC_VALID_LOCALE, &status),
  414|  9.33k|        ures_getLocaleByType(
  ------------------
  |  | 1669|  9.33k|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  415|  9.33k|            numberElementsRes.getAlias(),
  416|  9.33k|            ULOC_ACTUAL_LOCALE, &status),
  417|  9.33k|        status);
  418|       |
  419|       |    // Now load the rest of the data from the data sink.
  420|       |    // Start with loading this nsName if it is not Latin.
  421|  9.33k|    DecFmtSymDataSink sink(*this);
  422|  9.33k|    if (uprv_strcmp(nsName, gLatn) != 0) {
  ------------------
  |  |   38|  9.33k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (422:9): [True: 1.22k, False: 8.11k]
  ------------------
  423|  1.22k|        CharString path;
  424|  1.22k|        path.append(gNumberElements, status)
  425|  1.22k|            .append('/', status)
  426|  1.22k|            .append(nsName, status)
  427|  1.22k|            .append('/', status)
  428|  1.22k|            .append(gSymbols, status);
  429|  1.22k|        ures_getAllItemsWithFallback(resource.getAlias(), path.data(), sink, status);
  ------------------
  |  | 1658|  1.22k|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|  1.22k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.22k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.22k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  430|       |
  431|       |        // If no symbols exist for the given nsName and resource bundle, silently ignore
  432|       |        // and fall back to Latin.
  433|  1.22k|        if (status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (433:13): [True: 0, False: 1.22k]
  ------------------
  434|      0|            status = U_ZERO_ERROR;
  435|  1.22k|        } else if (U_FAILURE(status)) {
  ------------------
  |  Branch (435:20): [True: 0, False: 1.22k]
  ------------------
  436|      0|            return;
  437|      0|        }
  438|  1.22k|    }
  439|       |
  440|       |    // Continue with Latin if necessary.
  441|  9.33k|    if (!sink.seenAll()) {
  ------------------
  |  Branch (441:9): [True: 9.33k, False: 0]
  ------------------
  442|  9.33k|        ures_getAllItemsWithFallback(resource.getAlias(), gNumberElementsLatnSymbols, sink, status);
  ------------------
  |  | 1658|  9.33k|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  443|  9.33k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (443:13): [True: 0, False: 9.33k]
  ------------------
  444|  9.33k|    }
  445|       |
  446|       |    // Let the monetary number separators equal the default number separators if necessary.
  447|  9.33k|    sink.resolveMissingMonetarySeparators(fSymbols);
  448|       |
  449|       |    // Resolve codePointZero
  450|  9.33k|    UChar32 tempCodePointZero = -1;
  451|   102k|    for (int32_t i=0; i<=9; i++) {
  ------------------
  |  Branch (451:23): [True: 93.3k, False: 9.33k]
  ------------------
  452|  93.3k|        const UnicodeString& stringDigit = getConstDigitSymbol(i);
  453|  93.3k|        if (stringDigit.countChar32() != 1) {
  ------------------
  |  Branch (453:13): [True: 0, False: 93.3k]
  ------------------
  454|      0|            tempCodePointZero = -1;
  455|      0|            break;
  456|      0|        }
  457|  93.3k|        UChar32 cp = stringDigit.char32At(0);
  458|  93.3k|        if (i == 0) {
  ------------------
  |  Branch (458:13): [True: 9.33k, False: 84.0k]
  ------------------
  459|  9.33k|            tempCodePointZero = cp;
  460|  84.0k|        } else if (cp != tempCodePointZero + i) {
  ------------------
  |  Branch (460:20): [True: 0, False: 84.0k]
  ------------------
  461|      0|            tempCodePointZero = -1;
  462|      0|            break;
  463|      0|        }
  464|  93.3k|    }
  465|  9.33k|    fCodePointZero = tempCodePointZero;
  466|       |
  467|       |    // Get the default currency from the currency API.
  468|  9.33k|    UErrorCode internalStatus = U_ZERO_ERROR; // don't propagate failures out
  469|  9.33k|    char16_t curriso[4];
  470|  9.33k|    UnicodeString tempStr;
  471|  9.33k|    int32_t currisoLength = ucurr_forLocale(locStr, curriso, UPRV_LENGTHOF(curriso), &internalStatus);
  ------------------
  |  |  832|  9.33k|#define ucurr_forLocale U_ICU_ENTRY_POINT_RENAME(ucurr_forLocale)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  int32_t currisoLength = ucurr_forLocale(locStr, curriso, UPRV_LENGTHOF(curriso), &internalStatus);
  ------------------
  |  |   99|  9.33k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  472|  9.33k|    if (U_SUCCESS(internalStatus) && currisoLength == 3) {
  ------------------
  |  Branch (472:9): [True: 6.44k, False: 2.89k]
  |  Branch (472:38): [True: 6.44k, False: 0]
  ------------------
  473|  6.44k|        setCurrency(curriso, status);
  474|  6.44k|    } else {
  475|  2.89k|        setCurrency(nullptr, status);
  476|  2.89k|    }
  477|       |
  478|       |    // Currency Spacing.
  479|  9.33k|    LocalUResourceBundlePointer currencyResource(ures_open(U_ICUDATA_CURR, locStr, &status));
  ------------------
  |  | 1691|  9.33k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  LocalUResourceBundlePointer currencyResource(ures_open(U_ICUDATA_CURR, locStr, &status));
  ------------------
  |  |   21|  9.33k|#define U_ICUDATA_CURR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "curr"
  |  |  ------------------
  |  |  |  |  154|  9.33k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  480|  9.33k|    CurrencySpacingSink currencySink(*this);
  481|  9.33k|    ures_getAllItemsWithFallback(currencyResource.getAlias(), gCurrencySpacingTag, currencySink, status);
  ------------------
  |  | 1658|  9.33k|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  482|  9.33k|    currencySink.resolveMissing();
  483|  9.33k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (483:9): [True: 0, False: 9.33k]
  ------------------
  484|  9.33k|}
_ZN6icu_7820DecimalFormatSymbols10initializeEv:
  487|  9.33k|DecimalFormatSymbols::initialize() {
  488|       |    /*
  489|       |     * These strings used to be in static arrays, but the HP/UX aCC compiler
  490|       |     * cannot initialize a static array with class constructors.
  491|       |     *  markus 2000may25
  492|       |     */
  493|  9.33k|    fSymbols[kDecimalSeparatorSymbol] = static_cast<char16_t>(0x2e); // '.' decimal separator
  494|  9.33k|    fSymbols[kGroupingSeparatorSymbol].remove();        //     group (thousands) separator
  495|  9.33k|    fSymbols[kPatternSeparatorSymbol] = static_cast<char16_t>(0x3b); // ';' pattern separator
  496|  9.33k|    fSymbols[kPercentSymbol] = static_cast<char16_t>(0x25);          // '%' percent sign
  497|  9.33k|    fSymbols[kZeroDigitSymbol] = static_cast<char16_t>(0x30);        // '0' native 0 digit
  498|  9.33k|    fSymbols[kOneDigitSymbol] = static_cast<char16_t>(0x31);         // '1' native 1 digit
  499|  9.33k|    fSymbols[kTwoDigitSymbol] = static_cast<char16_t>(0x32);         // '2' native 2 digit
  500|  9.33k|    fSymbols[kThreeDigitSymbol] = static_cast<char16_t>(0x33);       // '3' native 3 digit
  501|  9.33k|    fSymbols[kFourDigitSymbol] = static_cast<char16_t>(0x34);        // '4' native 4 digit
  502|  9.33k|    fSymbols[kFiveDigitSymbol] = static_cast<char16_t>(0x35);        // '5' native 5 digit
  503|  9.33k|    fSymbols[kSixDigitSymbol] = static_cast<char16_t>(0x36);         // '6' native 6 digit
  504|  9.33k|    fSymbols[kSevenDigitSymbol] = static_cast<char16_t>(0x37);       // '7' native 7 digit
  505|  9.33k|    fSymbols[kEightDigitSymbol] = static_cast<char16_t>(0x38);       // '8' native 8 digit
  506|  9.33k|    fSymbols[kNineDigitSymbol] = static_cast<char16_t>(0x39);        // '9' native 9 digit
  507|  9.33k|    fSymbols[kDigitSymbol] = static_cast<char16_t>(0x23);            // '#' pattern digit
  508|  9.33k|    fSymbols[kPlusSignSymbol] = static_cast<char16_t>(0x002b);       // '+' plus sign
  509|  9.33k|    fSymbols[kMinusSignSymbol] = static_cast<char16_t>(0x2d);        // '-' minus sign
  510|  9.33k|    fSymbols[kCurrencySymbol] = static_cast<char16_t>(0xa4);         // 'OX' currency symbol
  511|  9.33k|    fSymbols[kIntlCurrencySymbol].setTo(true, INTL_CURRENCY_SYMBOL_STR, 2);
  512|  9.33k|    fSymbols[kMonetarySeparatorSymbol] = static_cast<char16_t>(0x2e);  // '.' monetary decimal separator
  513|  9.33k|    fSymbols[kExponentialSymbol] = static_cast<char16_t>(0x45);        // 'E' exponential
  514|  9.33k|    fSymbols[kPerMillSymbol] = static_cast<char16_t>(0x2030);          // '%o' per mill
  515|  9.33k|    fSymbols[kPadEscapeSymbol] = static_cast<char16_t>(0x2a);          // '*' pad escape symbol
  516|  9.33k|    fSymbols[kInfinitySymbol] = static_cast<char16_t>(0x221e);         // 'oo' infinite
  517|  9.33k|    fSymbols[kNaNSymbol] = static_cast<char16_t>(0xfffd);              // SUB NaN
  518|  9.33k|    fSymbols[kSignificantDigitSymbol] = static_cast<char16_t>(0x0040); // '@' significant digit
  519|  9.33k|    fSymbols[kMonetaryGroupingSeparatorSymbol].remove(); // 
  520|  9.33k|    fSymbols[kExponentMultiplicationSymbol] = static_cast<char16_t>(0xd7); // 'x' multiplication symbol for exponents
  521|  9.33k|    fSymbols[kApproximatelySignSymbol] = u'~';          // '~' approximately sign
  522|  9.33k|    fIsCustomCurrencySymbol = false; 
  523|  9.33k|    fIsCustomIntlCurrencySymbol = false;
  524|  9.33k|    fCodePointZero = 0x30;
  525|  9.33k|    U_ASSERT(fCodePointZero == fSymbols[kZeroDigitSymbol].char32At(0));
  ------------------
  |  |   35|  9.33k|#   define U_ASSERT(exp) (void)0
  ------------------
  526|  9.33k|    currPattern = nullptr;
  527|  9.33k|    nsName[0] = 0;
  528|  9.33k|}
_ZN6icu_7820DecimalFormatSymbols11setCurrencyEPKDsR10UErrorCode:
  530|  9.33k|void DecimalFormatSymbols::setCurrency(const char16_t* currency, UErrorCode& status) {
  531|       |    // TODO: If this method is made public:
  532|       |    // - Adopt ICU4J behavior of not allowing currency to be null.
  533|       |    // - Also verify that the length of currency is 3.
  534|  9.33k|    if (!currency) {
  ------------------
  |  Branch (534:9): [True: 2.89k, False: 6.44k]
  ------------------
  535|  2.89k|        return;
  536|  2.89k|    }
  537|       |
  538|  6.44k|    UnicodeString tempStr;
  539|  6.44k|    uprv_getStaticCurrencyName(currency, locale.getName(), tempStr, status);
  ------------------
  |  | 1511|  6.44k|#define uprv_getStaticCurrencyName U_ICU_ENTRY_POINT_RENAME(uprv_getStaticCurrencyName)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  540|  6.44k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (540:9): [True: 6.44k, False: 0]
  ------------------
  541|  6.44k|        fSymbols[kIntlCurrencySymbol].setTo(currency, 3);
  542|  6.44k|        fSymbols[kCurrencySymbol] = tempStr;
  543|  6.44k|    }
  544|       |
  545|  6.44k|    char cc[4]={0};
  546|  6.44k|    u_UCharsToChars(currency, cc, 3);
  ------------------
  |  |  211|  6.44k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  547|       |
  548|       |    /* An explicit currency was requested */
  549|       |    // TODO(ICU-13297): Move this data loading logic into a centralized place
  550|  6.44k|    UErrorCode localStatus = U_ZERO_ERROR;
  551|  6.44k|    LocalUResourceBundlePointer rbTop(ures_open(U_ICUDATA_CURR, locale.getName(), &localStatus));
  ------------------
  |  | 1691|  6.44k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  LocalUResourceBundlePointer rbTop(ures_open(U_ICUDATA_CURR, locale.getName(), &localStatus));
  ------------------
  |  |   21|  6.44k|#define U_ICUDATA_CURR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "curr"
  |  |  ------------------
  |  |  |  |  154|  6.44k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  552|  6.44k|    LocalUResourceBundlePointer rb(
  553|  6.44k|        ures_getByKeyWithFallback(rbTop.getAlias(), "Currencies", nullptr, &localStatus));
  ------------------
  |  | 1662|  6.44k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  554|  6.44k|    ures_getByKeyWithFallback(rb.getAlias(), cc, rb.getAlias(), &localStatus);
  ------------------
  |  | 1662|  6.44k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  6.44k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.44k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.44k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  555|  6.44k|    if(U_SUCCESS(localStatus) && ures_getSize(rb.getAlias())>2) { // the length is 3 if more data is present
  ------------------
  |  | 1674|  6.30k|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  123|  6.30k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.30k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.30k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (555:8): [True: 6.30k, False: 136]
  |  Branch (555:34): [True: 104, False: 6.20k]
  ------------------
  556|    104|        ures_getByIndex(rb.getAlias(), 2, rb.getAlias(), &localStatus);
  ------------------
  |  | 1660|    104|#define ures_getByIndex U_ICU_ENTRY_POINT_RENAME(ures_getByIndex)
  |  |  ------------------
  |  |  |  |  123|    104|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    104|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    104|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  557|    104|        int32_t currPatternLen = 0;
  558|    104|        currPattern =
  559|    104|            ures_getStringByIndex(rb.getAlias(), static_cast<int32_t>(0), &currPatternLen, &localStatus);
  ------------------
  |  | 1676|    104|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  123|    104|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    104|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    104|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  560|    104|        UnicodeString decimalSep =
  561|    104|            ures_getUnicodeStringByIndex(rb.getAlias(), static_cast<int32_t>(1), &localStatus);
  562|    104|        UnicodeString groupingSep =
  563|    104|            ures_getUnicodeStringByIndex(rb.getAlias(), static_cast<int32_t>(2), &localStatus);
  564|    104|        if(U_SUCCESS(localStatus)){
  ------------------
  |  Branch (564:12): [True: 104, False: 0]
  ------------------
  565|    104|            fSymbols[kMonetaryGroupingSeparatorSymbol] = groupingSep;
  566|    104|            fSymbols[kMonetarySeparatorSymbol] = decimalSep;
  567|       |            //pattern.setTo(true, currPattern, currPatternLen);
  568|    104|        }
  569|    104|    }
  570|       |    /* else An explicit currency was requested and is unknown or locale data is malformed. */
  571|       |    /* ucurr_* API will get the correct value later on. */
  572|  6.44k|}
_ZNK6icu_7820DecimalFormatSymbols28getPatternForCurrencySpacingE16UCurrencySpacingaR10UErrorCode:
  582|  56.0k|                                                 UErrorCode& status) const {
  583|  56.0k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (583:9): [True: 0, False: 56.0k]
  ------------------
  584|      0|      return fNoSymbol;  // always empty.
  585|      0|    }
  586|  56.0k|    if (beforeCurrency) {
  ------------------
  |  Branch (586:9): [True: 28.0k, False: 28.0k]
  ------------------
  587|  28.0k|      return currencySpcBeforeSym[static_cast<int32_t>(type)];
  588|  28.0k|    } else {
  589|  28.0k|      return currencySpcAfterSym[static_cast<int32_t>(type)];
  590|  28.0k|    }
  591|  56.0k|}
_ZN6icu_7820DecimalFormatSymbols28setPatternForCurrencySpacingE16UCurrencySpacingaRKNS_13UnicodeStringE:
  596|  56.0k|                                             const UnicodeString& pattern) {
  597|  56.0k|  if (beforeCurrency) {
  ------------------
  |  Branch (597:7): [True: 28.0k, False: 28.0k]
  ------------------
  598|  28.0k|    currencySpcBeforeSym[static_cast<int32_t>(type)] = pattern;
  599|  28.0k|  } else {
  600|  28.0k|    currencySpcAfterSym[static_cast<int32_t>(type)] = pattern;
  601|  28.0k|  }
  602|  56.0k|}
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_117DecFmtSymDataSinkC2ERNS_20DecimalFormatSymbolsE:
  235|  9.33k|    DecFmtSymDataSink(DecimalFormatSymbols& _dfs) : dfs(_dfs) {
  236|  9.33k|        uprv_memset(seenSymbol, false, sizeof(seenSymbol));
  ------------------
  |  |  100|  9.33k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  237|  9.33k|    }
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_117DecFmtSymDataSink3putEPKcRNS_13ResourceValueEaR10UErrorCode:
  241|  19.3k|            UErrorCode &errorCode) override {
  242|  19.3k|        ResourceTable symbolsTable = value.getTable(errorCode);
  243|  19.3k|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (243:13): [True: 0, False: 19.3k]
  ------------------
  244|   185k|        for (int32_t j = 0; symbolsTable.getKeyAndValue(j, key, value); ++j) {
  ------------------
  |  Branch (244:29): [True: 166k, False: 19.3k]
  ------------------
  245|  2.32M|            for (int32_t i=0; i<DecimalFormatSymbols::kFormatSymbolCount; i++) {
  ------------------
  |  Branch (245:31): [True: 2.30M, False: 22.8k]
  ------------------
  246|  2.30M|                if (gNumberElementKeys[i] != nullptr && uprv_strcmp(key, gNumberElementKeys[i]) == 0) {
  ------------------
  |  |   38|  1.20M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.20M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (246:21): [True: 1.20M, False: 1.09M]
  |  Branch (246:57): [True: 143k, False: 1.06M]
  ------------------
  247|   143k|                    if (!seenSymbol[i]) {
  ------------------
  |  Branch (247:25): [True: 102k, False: 40.6k]
  ------------------
  248|   102k|                        seenSymbol[i] = true;
  249|   102k|                        dfs.setSymbol(
  250|   102k|                            static_cast<DecimalFormatSymbols::ENumberFormatSymbol>(i),
  251|   102k|                            value.getUnicodeString(errorCode));
  252|   102k|                        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (252:29): [True: 0, False: 102k]
  ------------------
  253|   102k|                    }
  254|   143k|                    break;
  255|   143k|                }
  256|  2.30M|            }
  257|   166k|        }
  258|  19.3k|    }
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_117DecFmtSymDataSink7seenAllEv:
  261|  9.33k|    UBool seenAll() {
  262|  11.7k|        for (int32_t i=0; i<DecimalFormatSymbols::kFormatSymbolCount; i++) {
  ------------------
  |  Branch (262:27): [True: 11.7k, False: 0]
  ------------------
  263|  11.7k|            if (!seenSymbol[i]) {
  ------------------
  |  Branch (263:17): [True: 9.33k, False: 2.44k]
  ------------------
  264|  9.33k|                return false;
  265|  9.33k|            }
  266|  11.7k|        }
  267|      0|        return true;
  268|  9.33k|    }
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_117DecFmtSymDataSink32resolveMissingMonetarySeparatorsEPKNS_13UnicodeStringE:
  272|  9.33k|    void resolveMissingMonetarySeparators(const UnicodeString* fSymbols) {
  273|  9.33k|        if (!seenSymbol[DecimalFormatSymbols::kMonetarySeparatorSymbol]) {
  ------------------
  |  Branch (273:13): [True: 9.32k, False: 8]
  ------------------
  274|  9.32k|            dfs.setSymbol(
  275|  9.32k|                DecimalFormatSymbols::kMonetarySeparatorSymbol,
  276|  9.32k|                fSymbols[DecimalFormatSymbols::kDecimalSeparatorSymbol]);
  277|  9.32k|        }
  278|  9.33k|        if (!seenSymbol[DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol]) {
  ------------------
  |  Branch (278:13): [True: 9.32k, False: 6]
  ------------------
  279|  9.32k|            dfs.setSymbol(
  280|  9.32k|                DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol,
  281|  9.32k|                fSymbols[DecimalFormatSymbols::kGroupingSeparatorSymbol]);
  282|  9.32k|        }
  283|  9.33k|    }
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_119CurrencySpacingSinkC2ERNS_20DecimalFormatSymbolsE:
  292|  9.33k|        : dfs(_dfs), hasBeforeCurrency(false), hasAfterCurrency(false) {}
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_119CurrencySpacingSink3putEPKcRNS_13ResourceValueEaR10UErrorCode:
  296|  9.33k|            UErrorCode &errorCode) override {
  297|  9.33k|        ResourceTable spacingTypesTable = value.getTable(errorCode);
  298|  28.0k|        for (int32_t i = 0; spacingTypesTable.getKeyAndValue(i, key, value); ++i) {
  ------------------
  |  Branch (298:29): [True: 18.6k, False: 9.33k]
  ------------------
  299|  18.6k|            UBool beforeCurrency;
  300|  18.6k|            if (uprv_strcmp(key, gBeforeCurrencyTag) == 0) {
  ------------------
  |  |   38|  18.6k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  18.6k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (300:17): [True: 9.33k, False: 9.33k]
  ------------------
  301|  9.33k|                beforeCurrency = true;
  302|  9.33k|                hasBeforeCurrency = true;
  303|  9.33k|            } else if (uprv_strcmp(key, gAfterCurrencyTag) == 0) {
  ------------------
  |  |   38|  9.33k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (303:24): [True: 9.33k, False: 0]
  ------------------
  304|  9.33k|                beforeCurrency = false;
  305|  9.33k|                hasAfterCurrency = true;
  306|  9.33k|            } else {
  307|      0|                continue;
  308|      0|            }
  309|       |
  310|  18.6k|            ResourceTable patternsTable = value.getTable(errorCode);
  311|  74.6k|            for (int32_t j = 0; patternsTable.getKeyAndValue(j, key, value); ++j) {
  ------------------
  |  Branch (311:33): [True: 56.0k, False: 18.6k]
  ------------------
  312|  56.0k|                UCurrencySpacing pattern;
  313|  56.0k|                if (uprv_strcmp(key, gCurrencyMatchTag) == 0) {
  ------------------
  |  |   38|  56.0k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  56.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (313:21): [True: 18.6k, False: 37.3k]
  ------------------
  314|  18.6k|                    pattern = UNUM_CURRENCY_MATCH;
  315|  37.3k|                } else if (uprv_strcmp(key, gCurrencySudMatchTag) == 0) {
  ------------------
  |  |   38|  37.3k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  37.3k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (315:28): [True: 18.6k, False: 18.6k]
  ------------------
  316|  18.6k|                    pattern = UNUM_CURRENCY_SURROUNDING_MATCH;
  317|  18.6k|                } else if (uprv_strcmp(key, gCurrencyInsertBtnTag) == 0) {
  ------------------
  |  |   38|  18.6k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  18.6k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (317:28): [True: 18.6k, False: 0]
  ------------------
  318|  18.6k|                    pattern = UNUM_CURRENCY_INSERT;
  319|  18.6k|                } else {
  320|      0|                    continue;
  321|      0|                }
  322|       |
  323|  56.0k|                const UnicodeString& current = dfs.getPatternForCurrencySpacing(
  324|  56.0k|                    pattern, beforeCurrency, errorCode);
  325|  56.0k|                if (current.isEmpty()) {
  ------------------
  |  Branch (325:21): [True: 56.0k, False: 0]
  ------------------
  326|  56.0k|                    dfs.setPatternForCurrencySpacing(
  327|  56.0k|                        pattern, beforeCurrency, value.getUnicodeString(errorCode));
  328|  56.0k|                }
  329|  56.0k|            }
  330|  18.6k|        }
  331|  9.33k|    }
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_119CurrencySpacingSink14resolveMissingEv:
  333|  9.33k|    void resolveMissing() {
  334|       |        // For consistency with Java, this method overwrites everything with the defaults unless
  335|       |        // both beforeCurrency and afterCurrency were found in CLDR.
  336|  9.33k|        static const char* defaults[] = { "[:letter:]", "[:digit:]", " " };
  337|  9.33k|        if (!hasBeforeCurrency || !hasAfterCurrency) {
  ------------------
  |  Branch (337:13): [True: 0, False: 9.33k]
  |  Branch (337:35): [True: 0, False: 9.33k]
  ------------------
  338|      0|            for (int32_t pattern = 0; pattern < UNUM_CURRENCY_SPACING_COUNT; pattern++) {
  ------------------
  |  Branch (338:39): [True: 0, False: 0]
  ------------------
  339|      0|                dfs.setPatternForCurrencySpacing(static_cast<UCurrencySpacing>(pattern),
  340|      0|                    false, UnicodeString(defaults[pattern], -1, US_INV));
  ------------------
  |  |   98|      0|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  341|      0|            }
  342|      0|            for (int32_t pattern = 0; pattern < UNUM_CURRENCY_SPACING_COUNT; pattern++) {
  ------------------
  |  Branch (342:39): [True: 0, False: 0]
  ------------------
  343|      0|                dfs.setPatternForCurrencySpacing(static_cast<UCurrencySpacing>(pattern),
  344|      0|                    true, UnicodeString(defaults[pattern], -1, US_INV));
  ------------------
  |  |   98|      0|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  345|      0|            }
  346|      0|        }
  347|  9.33k|    }

uprv_decContextDefault_78:
   65|  3.61k|U_CAPI decContext *  U_EXPORT2 uprv_decContextDefault(decContext *context, Int kind) {
   66|       |  /* set defaults...  */
   67|  3.61k|  context->digits=9;                         /* 9 digits  */
   68|  3.61k|  context->emax=DEC_MAX_EMAX;                /* 9-digit exponents  */
  ------------------
  |  |  106|  3.61k|  #define DEC_MAX_EMAX   999999999
  ------------------
   69|  3.61k|  context->emin=DEC_MIN_EMIN;                /* .. balanced  */
  ------------------
  |  |  109|  3.61k|  #define DEC_MIN_EMIN  -999999999
  ------------------
   70|  3.61k|  context->round=DEC_ROUND_HALF_UP;          /* 0.5 rises  */
   71|  3.61k|  context->traps=DEC_Errors;                 /* all but informational  */
  ------------------
  |  |  199|  3.61k|  #define DEC_Errors (DEC_IEEE_754_Division_by_zero |                 \
  |  |  ------------------
  |  |  |  |  183|  3.61k|  #define DEC_IEEE_754_Division_by_zero  (DEC_Division_by_zero)
  |  |  |  |  ------------------
  |  |  |  |  |  |  145|  3.61k|    #define DEC_Division_by_zero     0x00000002
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  200|  3.61k|                      DEC_IEEE_754_Invalid_operation |                \
  |  |  ------------------
  |  |  |  |  189|  3.61k|  #define DEC_IEEE_754_Invalid_operation (DEC_Conversion_syntax |     \
  |  |  |  |  ------------------
  |  |  |  |  |  |  144|  3.61k|    #define DEC_Conversion_syntax    0x00000001
  |  |  |  |  ------------------
  |  |  |  |  190|  3.61k|                                          DEC_Division_impossible |   \
  |  |  |  |  ------------------
  |  |  |  |  |  |  146|  3.61k|    #define DEC_Division_impossible  0x00000004
  |  |  |  |  ------------------
  |  |  |  |  191|  3.61k|                                          DEC_Division_undefined |    \
  |  |  |  |  ------------------
  |  |  |  |  |  |  147|  3.61k|    #define DEC_Division_undefined   0x00000008
  |  |  |  |  ------------------
  |  |  |  |  192|  3.61k|                                          DEC_Insufficient_storage |  \
  |  |  |  |  ------------------
  |  |  |  |  |  |  148|  3.61k|    #define DEC_Insufficient_storage 0x00000010 /* [when malloc fails]  */
  |  |  |  |  ------------------
  |  |  |  |  193|  3.61k|                                          DEC_Invalid_context |       \
  |  |  |  |  ------------------
  |  |  |  |  |  |  150|  3.61k|    #define DEC_Invalid_context      0x00000040
  |  |  |  |  ------------------
  |  |  |  |  194|  3.61k|                                          DEC_Invalid_operation)
  |  |  |  |  ------------------
  |  |  |  |  |  |  151|  3.61k|    #define DEC_Invalid_operation    0x00000080
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  201|  3.61k|                      DEC_IEEE_754_Overflow | DEC_IEEE_754_Underflow)
  |  |  ------------------
  |  |  |  |  195|  3.61k|  #define DEC_IEEE_754_Overflow          (DEC_Overflow)
  |  |  |  |  ------------------
  |  |  |  |  |  |  155|  3.61k|    #define DEC_Overflow             0x00000200
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                                     DEC_IEEE_754_Overflow | DEC_IEEE_754_Underflow)
  |  |  ------------------
  |  |  |  |  196|  3.61k|  #define DEC_IEEE_754_Underflow         (DEC_Underflow)
  |  |  |  |  ------------------
  |  |  |  |  |  |  159|  3.61k|    #define DEC_Underflow            0x00002000
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   72|  3.61k|  context->status=0;                         /* cleared  */
   73|  3.61k|  context->clamp=0;                          /* no clamping  */
   74|       |  #if DECSUBSET
   75|       |  context->extended=0;                       /* cleared  */
   76|       |  #endif
   77|  3.61k|  switch (kind) {
   78|  3.61k|    case DEC_INIT_BASE:
  ------------------
  |  |  243|  3.61k|  #define DEC_INIT_BASE         0
  ------------------
  |  Branch (78:5): [True: 3.61k, False: 0]
  ------------------
   79|       |      /* [use defaults]  */
   80|  3.61k|      break;
   81|      0|    case DEC_INIT_DECIMAL32:
  ------------------
  |  |  244|      0|  #define DEC_INIT_DECIMAL32   32
  ------------------
  |  Branch (81:5): [True: 0, False: 3.61k]
  ------------------
   82|      0|      context->digits=7;                     /* digits  */
   83|      0|      context->emax=96;                      /* Emax  */
   84|      0|      context->emin=-95;                     /* Emin  */
   85|      0|      context->round=DEC_ROUND_HALF_EVEN;    /* 0.5 to nearest even  */
   86|      0|      context->traps=0;                      /* no traps set  */
   87|      0|      context->clamp=1;                      /* clamp exponents  */
   88|       |      #if DECSUBSET
   89|       |      context->extended=1;                   /* set  */
   90|       |      #endif
   91|      0|      break;
   92|      0|    case DEC_INIT_DECIMAL64:
  ------------------
  |  |  245|      0|  #define DEC_INIT_DECIMAL64   64
  ------------------
  |  Branch (92:5): [True: 0, False: 3.61k]
  ------------------
   93|      0|      context->digits=16;                    /* digits  */
   94|      0|      context->emax=384;                     /* Emax  */
   95|      0|      context->emin=-383;                    /* Emin  */
   96|      0|      context->round=DEC_ROUND_HALF_EVEN;    /* 0.5 to nearest even  */
   97|      0|      context->traps=0;                      /* no traps set  */
   98|      0|      context->clamp=1;                      /* clamp exponents  */
   99|       |      #if DECSUBSET
  100|       |      context->extended=1;                   /* set  */
  101|       |      #endif
  102|      0|      break;
  103|      0|    case DEC_INIT_DECIMAL128:
  ------------------
  |  |  246|      0|  #define DEC_INIT_DECIMAL128 128
  ------------------
  |  Branch (103:5): [True: 0, False: 3.61k]
  ------------------
  104|      0|      context->digits=34;                    /* digits  */
  105|      0|      context->emax=6144;                    /* Emax  */
  106|      0|      context->emin=-6143;                   /* Emin  */
  107|      0|      context->round=DEC_ROUND_HALF_EVEN;    /* 0.5 to nearest even  */
  108|      0|      context->traps=0;                      /* no traps set  */
  109|      0|      context->clamp=1;                      /* clamp exponents  */
  110|       |      #if DECSUBSET
  111|       |      context->extended=1;                   /* set  */
  112|       |      #endif
  113|      0|      break;
  114|       |
  115|      0|    default:                                 /* invalid Kind  */
  ------------------
  |  Branch (115:5): [True: 0, False: 3.61k]
  ------------------
  116|       |      /* use defaults, and ..  */
  117|      0|      uprv_decContextSetStatus(context, DEC_Invalid_operation); /* trap  */
  ------------------
  |  | 1418|      0|#define uprv_decContextSetStatus U_ICU_ENTRY_POINT_RENAME(uprv_decContextSetStatus)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                    uprv_decContextSetStatus(context, DEC_Invalid_operation); /* trap  */
  ------------------
  |  |  151|      0|    #define DEC_Invalid_operation    0x00000080
  ------------------
  118|  3.61k|    }
  119|       |
  120|  3.61k|  return context;} /* decContextDefault  */
uprv_decContextSetRounding_78:
  189|  3.61k|                                  enum rounding newround) {
  190|  3.61k|  context->round=newround;
  191|  3.61k|  return context;
  192|  3.61k|  } /* decContextSetRounding  */
uprv_decContextSetStatus_78:
  204|    704|U_CAPI decContext *  U_EXPORT2 uprv_decContextSetStatus(decContext *context, uInt status) {
  205|    704|  context->status|=status;
  206|       |#if 0  /* ICU: Do not raise signals. */
  207|       |  if (status & context->traps) raise(SIGFPE);
  208|       |#endif
  209|    704|  return context;} /* decContextSetStatus  */

uprv_decNumberFromString_78:
  513|  1.59k|                                decContext *set) {
  514|  1.59k|  Int   exponent=0;                /* working exponent [assume 0]  */
  ------------------
  |  |   76|  1.59k|  #define Int    int32_t
  ------------------
  515|  1.59k|  uByte bits=0;                    /* working flags [assume +ve]  */
  ------------------
  |  |   73|  1.59k|  #define uByte  uint8_t
  ------------------
  516|  1.59k|  Unit  *res;                      /* where result will be built  */
  ------------------
  |  |   78|  1.59k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  1.59k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
  517|  1.59k|  Unit  resbuff[SD2U(DECBUFFER+9)];/* local buffer in case need temporary  */
  ------------------
  |  |   78|  1.59k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  1.59k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
  518|       |                                   /* [+9 allows for ln() constants]  */
  519|  1.59k|  Unit  *allocres=nullptr;            /* -> allocated result, iff allocated  */
  ------------------
  |  |   78|  1.59k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  1.59k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
  520|  1.59k|  Int   d=0;                       /* count of digits found in decimal part  */
  ------------------
  |  |   76|  1.59k|  #define Int    int32_t
  ------------------
  521|  1.59k|  const char *dotchar=nullptr;        /* where dot was found  */
  522|  1.59k|  const char *cfirst=chars;        /* -> first character of decimal part  */
  523|  1.59k|  const char *last=nullptr;           /* -> last digit of decimal part  */
  524|  1.59k|  const char *c;                   /* work  */
  525|  1.59k|  Unit  *up;                       /* ..  */
  ------------------
  |  |   78|  1.59k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  1.59k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
  526|       |  #if DECDPUN>1
  527|       |  Int   cut, out;                  /* ..  */
  528|       |  #endif
  529|  1.59k|  Int   residue;                   /* rounding residue  */
  ------------------
  |  |   76|  1.59k|  #define Int    int32_t
  ------------------
  530|  1.59k|  uInt  status=0;                  /* error code  */
  ------------------
  |  |   77|  1.59k|  #define uInt   uint32_t
  ------------------
  531|       |
  532|       |  #if DECCHECK
  533|       |  if (decCheckOperands(DECUNRESU, DECUNUSED, DECUNUSED, set))
  534|       |    return uprv_decNumberZero(dn);
  535|       |  #endif
  536|       |
  537|  1.59k|  do {                             /* status & malloc protection  */
  538|  3.68M|    for (c=chars;; c++) {          /* -> input character  */
  539|  3.68M|      if (*c>='0' && *c<='9') {    /* test for Arabic digit  */
  ------------------
  |  Branch (539:11): [True: 3.68M, False: 797]
  |  Branch (539:22): [True: 3.68M, False: 1.02k]
  ------------------
  540|  3.68M|        last=c;
  541|  3.68M|        d++;                       /* count of real digits  */
  542|  3.68M|        continue;                  /* still in decimal part  */
  543|  3.68M|        }
  544|  1.82k|      if (*c=='.' && dotchar==nullptr) { /* first '.'  */
  ------------------
  |  Branch (544:11): [True: 200, False: 1.62k]
  |  Branch (544:22): [True: 199, False: 1]
  ------------------
  545|    199|        dotchar=c;                 /* record offset into decimal part  */
  546|    199|        if (c==cfirst) cfirst++;   /* first digit must follow  */
  ------------------
  |  Branch (546:13): [True: 27, False: 172]
  ------------------
  547|    199|        continue;}
  548|  1.62k|      if (c==chars) {              /* first in string...  */
  ------------------
  |  Branch (548:11): [True: 99, False: 1.52k]
  ------------------
  549|     99|        if (*c=='-') {             /* valid - sign  */
  ------------------
  |  Branch (549:13): [True: 33, False: 66]
  ------------------
  550|     33|          cfirst++;
  551|     33|          bits=DECNEG;
  ------------------
  |  |   44|     33|  #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
  ------------------
  552|     33|          continue;}
  553|     66|        if (*c=='+') {             /* valid + sign  */
  ------------------
  |  Branch (553:13): [True: 1, False: 65]
  ------------------
  554|      1|          cfirst++;
  555|      1|          continue;}
  556|     66|        }
  557|       |      /* *c is not a digit, or a valid +, -, or '.'  */
  558|  1.59k|      break;
  559|  1.62k|      } /* c  */
  560|       |
  561|  1.59k|    if (last==nullptr) {              /* no digits yet  */
  ------------------
  |  Branch (561:9): [True: 70, False: 1.52k]
  ------------------
  562|     70|      status=DEC_Conversion_syntax;/* assume the worst  */
  ------------------
  |  |  144|     70|    #define DEC_Conversion_syntax    0x00000001
  ------------------
  563|     70|      if (*c=='\0') break;         /* and no more to come...  */
  ------------------
  |  Branch (563:11): [True: 5, False: 65]
  ------------------
  564|       |      #if DECSUBSET
  565|       |      /* if subset then infinities and NaNs are not allowed  */
  566|       |      if (!set->extended) break;   /* hopeless  */
  567|       |      #endif
  568|       |      /* Infinities and NaNs are possible, here  */
  569|     65|      if (dotchar!=nullptr) break;    /* .. unless had a dot  */
  ------------------
  |  Branch (569:11): [True: 1, False: 64]
  ------------------
  570|     64|      uprv_decNumberZero(dn);           /* be optimistic  */
  ------------------
  |  | 1487|     64|#define uprv_decNumberZero U_ICU_ENTRY_POINT_RENAME(uprv_decNumberZero)
  |  |  ------------------
  |  |  |  |  123|     64|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     64|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     64|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  571|     64|      if (decBiStr(c, "infinity", "INFINITY")
  ------------------
  |  Branch (571:11): [True: 0, False: 64]
  ------------------
  572|     64|       || decBiStr(c, "inf", "INF")) {
  ------------------
  |  Branch (572:11): [True: 3, False: 61]
  ------------------
  573|      3|        dn->bits=bits | DECINF;
  ------------------
  |  |   45|      3|  #define DECINF    0x40      /* 1=Infinity                           */
  ------------------
  574|      3|        status=0;                  /* is OK  */
  575|      3|        break; /* all done  */
  576|      3|        }
  577|       |      /* a NaN expected  */
  578|       |      /* 2003.09.10 NaNs are now permitted to have a sign  */
  579|     61|      dn->bits=bits | DECNAN;      /* assume simple NaN  */
  ------------------
  |  |   46|     61|  #define DECNAN    0x20      /* 1=NaN                                */
  ------------------
  580|     61|      if (*c=='s' || *c=='S') {    /* looks like an sNaN  */
  ------------------
  |  Branch (580:11): [True: 1, False: 60]
  |  Branch (580:22): [True: 1, False: 59]
  ------------------
  581|      2|        c++;
  582|      2|        dn->bits=bits | DECSNAN;
  ------------------
  |  |   47|      2|  #define DECSNAN   0x10      /* 1=sNaN                               */
  ------------------
  583|      2|        }
  584|     61|      if (*c!='n' && *c!='N') break;    /* check caseless "NaN"  */
  ------------------
  |  Branch (584:11): [True: 50, False: 11]
  |  Branch (584:22): [True: 21, False: 29]
  ------------------
  585|     40|      c++;
  586|     40|      if (*c!='a' && *c!='A') break;    /* ..  */
  ------------------
  |  Branch (586:11): [True: 19, False: 21]
  |  Branch (586:22): [True: 7, False: 12]
  ------------------
  587|     33|      c++;
  588|     33|      if (*c!='n' && *c!='N') break;    /* ..  */
  ------------------
  |  Branch (588:11): [True: 27, False: 6]
  |  Branch (588:22): [True: 7, False: 20]
  ------------------
  589|     26|      c++;
  590|       |      /* now either nothing, or nnnn payload, expected  */
  591|       |      /* -> start of integer and skip leading 0s [including plain 0]  */
  592|    359|      for (cfirst=c; *cfirst=='0';) cfirst++;
  ------------------
  |  Branch (592:22): [True: 333, False: 26]
  ------------------
  593|     26|      if (*cfirst=='\0') {         /* "NaN" or "sNaN", maybe with all 0s  */
  ------------------
  |  Branch (593:11): [True: 10, False: 16]
  ------------------
  594|     10|        status=0;                  /* it's good  */
  595|     10|        break;                     /* ..  */
  596|     10|        }
  597|       |      /* something other than 0s; setup last and d as usual [no dots]  */
  598|    935|      for (c=cfirst;; c++, d++) {
  599|    935|        if (*c<'0' || *c>'9') break; /* test for Arabic digit  */
  ------------------
  |  Branch (599:13): [True: 13, False: 922]
  |  Branch (599:23): [True: 3, False: 919]
  ------------------
  600|    919|        last=c;
  601|    919|        }
  602|     16|      if (*c!='\0') break;         /* not all digits  */
  ------------------
  |  Branch (602:11): [True: 5, False: 11]
  ------------------
  603|     11|      if (d>set->digits-1) {
  ------------------
  |  Branch (603:11): [True: 0, False: 11]
  ------------------
  604|       |        /* [NB: payload in a decNumber can be full length unless  */
  605|       |        /* clamped, in which case can only be digits-1]  */
  606|      0|        if (set->clamp) break;
  ------------------
  |  Branch (606:13): [True: 0, False: 0]
  ------------------
  607|      0|        if (d>set->digits) break;
  ------------------
  |  Branch (607:13): [True: 0, False: 0]
  ------------------
  608|      0|        } /* too many digits?  */
  609|       |      /* good; drop through to convert the integer to coefficient  */
  610|     11|      status=0;                    /* syntax is OK  */
  611|     11|      bits=dn->bits;               /* for copy-back  */
  612|     11|      } /* last==nullptr  */
  613|       |
  614|  1.52k|     else if (*c!='\0') {          /* more to process...  */
  ------------------
  |  Branch (614:15): [True: 974, False: 547]
  ------------------
  615|       |      /* had some digits; exponent is only valid sequence now  */
  616|    974|      Flag nege;                   /* 1=negative exponent  */
  ------------------
  |  |   71|    974|  #define Flag   uint8_t
  ------------------
  617|    974|      const char *firstexp;        /* -> first significant exponent digit  */
  618|    974|      status=DEC_Conversion_syntax;/* assume the worst  */
  ------------------
  |  |  144|    974|    #define DEC_Conversion_syntax    0x00000001
  ------------------
  619|    974|      if (*c!='e' && *c!='E') break;
  ------------------
  |  Branch (619:11): [True: 868, False: 106]
  |  Branch (619:22): [True: 12, False: 856]
  ------------------
  620|       |      /* Found 'e' or 'E' -- now process explicit exponent */
  621|       |      /* 1998.07.11: sign no longer required  */
  622|    962|      nege=0;
  623|    962|      c++;                         /* to (possible) sign  */
  624|    962|      if (*c=='-') {nege=1; c++;}
  ------------------
  |  Branch (624:11): [True: 550, False: 412]
  ------------------
  625|    412|       else if (*c=='+') c++;
  ------------------
  |  Branch (625:17): [True: 36, False: 376]
  ------------------
  626|    962|      if (*c=='\0') break;
  ------------------
  |  Branch (626:11): [True: 4, False: 958]
  ------------------
  627|       |
  628|  1.61k|      for (; *c=='0' && *(c+1)!='\0';) c++;  /* strip insignificant zeros  */
  ------------------
  |  Branch (628:14): [True: 673, False: 946]
  |  Branch (628:25): [True: 661, False: 12]
  ------------------
  629|    958|      firstexp=c;                            /* save exponent digit place  */
  630|    958|      uInt uexponent = 0;   /* Avoid undefined behavior on signed int overflow */
  ------------------
  |  |   77|    958|  #define uInt   uint32_t
  ------------------
  631|   177k|      for (; ;c++) {
  632|   177k|        if (*c<'0' || *c>'9') break;         /* not a digit  */
  ------------------
  |  Branch (632:13): [True: 954, False: 176k]
  |  Branch (632:23): [True: 4, False: 176k]
  ------------------
  633|   176k|        uexponent=X10(uexponent)+(uInt)*c-(uInt)'0';
  ------------------
  |  |  135|   176k|  #define X10(i)  (((i)<<1)+((i)<<3))
  ------------------
  634|   176k|        } /* c  */
  635|    958|      exponent = (Int)uexponent;
  636|       |      /* if not now on a '\0', *c must not be a digit  */
  637|    958|      if (*c!='\0') break;
  ------------------
  |  Branch (637:11): [True: 10, False: 948]
  ------------------
  638|       |
  639|       |      /* (this next test must be after the syntax checks)  */
  640|       |      /* if it was too long the exponent may have wrapped, so check  */
  641|       |      /* carefully and set it to a certain overflow if wrap possible  */
  642|    948|      if (c>=firstexp+9+1) {
  ------------------
  |  Branch (642:11): [True: 249, False: 699]
  ------------------
  643|    249|        if (c>firstexp+9+1 || *firstexp>'1') exponent=DECNUMMAXE*2;
  ------------------
  |  |  155|     21|  #define DECNUMMAXE 999999999  /* maximum adjusted exponent ditto    */
  ------------------
  |  Branch (643:13): [True: 17, False: 232]
  |  Branch (643:31): [True: 4, False: 228]
  ------------------
  644|       |        /* [up to 1999999999 is OK, for example 1E-1000000998]  */
  645|    249|        }
  646|    948|      if (nege) exponent=-exponent;     /* was negative  */
  ------------------
  |  Branch (646:11): [True: 549, False: 399]
  ------------------
  647|    948|      status=0;                         /* is OK  */
  648|    948|      } /* stuff after digits  */
  649|       |
  650|       |    /* Here when whole string has been inspected; syntax is good  */
  651|       |    /* cfirst->first digit (never dot), last->last digit (ditto)  */
  652|       |
  653|       |    /* strip leading zeros/dot [leave final 0 if all 0's]  */
  654|  1.50k|    if (*cfirst=='0') {                 /* [cfirst has stepped over .]  */
  ------------------
  |  Branch (654:9): [True: 173, False: 1.33k]
  ------------------
  655|  1.47k|      for (c=cfirst; c<last; c++, cfirst++) {
  ------------------
  |  Branch (655:22): [True: 1.36k, False: 110]
  ------------------
  656|  1.36k|        if (*c=='.') continue;          /* ignore dots  */
  ------------------
  |  Branch (656:13): [True: 5, False: 1.36k]
  ------------------
  657|  1.36k|        if (*c!='0') break;             /* non-zero found  */
  ------------------
  |  Branch (657:13): [True: 63, False: 1.30k]
  ------------------
  658|  1.30k|        d--;                            /* 0 stripped  */
  659|  1.30k|        } /* c  */
  660|       |      #if DECSUBSET
  661|       |      /* make a rapid exit for easy zeros if !extended  */
  662|       |      if (*cfirst=='0' && !set->extended) {
  663|       |        uprv_decNumberZero(dn);              /* clean result  */
  664|       |        break;                          /* [could be return]  */
  665|       |        }
  666|       |      #endif
  667|    173|      } /* at least one leading 0  */
  668|       |
  669|       |    /* Handle decimal point...  */
  670|  1.50k|    if (dotchar!=nullptr && dotchar<last)  /* non-trailing '.' found?  */
  ------------------
  |  Branch (670:9): [True: 195, False: 1.31k]
  |  Branch (670:29): [True: 194, False: 1]
  ------------------
  671|    194|      exponent -= static_cast<int32_t>(last-dotchar);         /* adjust exponent  */
  672|       |    /* [we can now ignore the .]  */
  673|       |
  674|       |    /* OK, the digits string is good.  Assemble in the decNumber, or in  */
  675|       |    /* a temporary units array if rounding is needed  */
  676|  1.50k|    if (d<=set->digits) res=dn->lsu;    /* fits into supplied decNumber  */
  ------------------
  |  Branch (676:9): [True: 1.50k, False: 0]
  ------------------
  677|      0|     else {                             /* rounding needed  */
  678|      0|      Int needbytes=D2U(d)*sizeof(Unit);/* bytes needed  */
  ------------------
  |  |   76|      0|  #define Int    int32_t
  ------------------
                    Int needbytes=D2U(d)*sizeof(Unit);/* bytes needed  */
  ------------------
  |  |  238|      0|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|      0|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  679|      0|      res=resbuff;                      /* assume use local buffer  */
  680|      0|      if (needbytes>(Int)sizeof(resbuff)) { /* too big for local  */
  ------------------
  |  Branch (680:11): [True: 0, False: 0]
  ------------------
  681|      0|        allocres=(Unit *)malloc(needbytes);
  ------------------
  |  |  309|      0|#define malloc(a) uprv_malloc(a)
  |  |  ------------------
  |  |  |  | 1524|      0|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  682|      0|        if (allocres==nullptr) {status|=DEC_Insufficient_storage; break;}
  ------------------
  |  |  148|      0|    #define DEC_Insufficient_storage 0x00000010 /* [when malloc fails]  */
  ------------------
  |  Branch (682:13): [True: 0, False: 0]
  ------------------
  683|      0|        res=allocres;
  684|      0|        }
  685|      0|      }
  686|       |    /* res now -> number lsu, buffer, or allocated storage for Unit array  */
  687|       |
  688|       |    /* Place the coefficient into the selected Unit array  */
  689|       |    /* [this is often 70% of the cost of this function when DECDPUN>1]  */
  690|       |    #if DECDPUN>1
  691|       |    out=0;                         /* accumulator  */
  692|       |    up=res+D2U(d)-1;               /* -> msu  */
  693|       |    cut=d-(up-res)*DECDPUN;        /* digits in top unit  */
  694|       |    for (c=cfirst;; c++) {         /* along the digits  */
  695|       |      if (*c=='.') continue;       /* ignore '.' [don't decrement cut]  */
  696|       |      out=X10(out)+(Int)*c-(Int)'0';
  697|       |      if (c==last) break;          /* done [never get to trailing '.']  */
  698|       |      cut--;
  699|       |      if (cut>0) continue;         /* more for this unit  */
  700|       |      *up=(Unit)out;               /* write unit  */
  701|       |      up--;                        /* prepare for unit below..  */
  702|       |      cut=DECDPUN;                 /* ..  */
  703|       |      out=0;                       /* ..  */
  704|       |      } /* c  */
  705|       |    *up=(Unit)out;                 /* write lsu  */
  706|       |
  707|       |    #else
  708|       |    /* DECDPUN==1  */
  709|  1.50k|    up=res;                        /* -> lsu  */
  710|  3.64M|    for (c=last; c>=cfirst; c--) { /* over each character, from least  */
  ------------------
  |  Branch (710:18): [True: 3.64M, False: 1.50k]
  ------------------
  711|  3.64M|      if (*c=='.') continue;       /* ignore . [don't step up]  */
  ------------------
  |  Branch (711:11): [True: 165, False: 3.64M]
  ------------------
  712|  3.64M|      *up=(Unit)((Int)*c-(Int)'0');
  713|  3.64M|      up++;
  714|  3.64M|      } /* c  */
  715|  1.50k|    #endif
  716|       |
  717|  1.50k|    dn->bits=bits;
  718|  1.50k|    dn->exponent=exponent;
  719|  1.50k|    dn->digits=d;
  720|       |
  721|       |    /* if not in number (too long) shorten into the number  */
  722|  1.50k|    if (d>set->digits) {
  ------------------
  |  Branch (722:9): [True: 0, False: 1.50k]
  ------------------
  723|      0|      residue=0;
  724|      0|      decSetCoeff(dn, set, res, d, &residue, &status);
  725|       |      /* always check for overflow or subnormal and round as needed  */
  726|      0|      decFinalize(dn, set, &residue, &status);
  727|      0|      }
  728|  1.50k|     else { /* no rounding, but may still have overflow or subnormal  */
  729|       |      /* [these tests are just for performance; finalize repeats them]  */
  730|  1.50k|      if ((dn->exponent-1<set->emin-dn->digits)
  ------------------
  |  Branch (730:11): [True: 101, False: 1.40k]
  ------------------
  731|  1.50k|       || (dn->exponent-1>set->emax-set->digits)) {
  ------------------
  |  Branch (731:11): [True: 50, False: 1.35k]
  ------------------
  732|    151|        residue=0;
  733|    151|        decFinalize(dn, set, &residue, &status);
  734|    151|        }
  735|  1.50k|      }
  736|       |    /* decNumberShow(dn);  */
  737|  1.50k|    } while(0);                         /* [for break]  */
  ------------------
  |  Branch (737:13): [Folded - Ignored]
  ------------------
  738|       |
  739|  1.59k|  if (allocres!=nullptr) free(allocres);   /* drop any storage used  */
  ------------------
  |  |  310|      0|#define free(a) uprv_free(a)
  |  |  ------------------
  |  |  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (739:7): [True: 0, False: 1.59k]
  ------------------
  740|  1.59k|  if (status!=0) decStatus(dn, status, set);
  ------------------
  |  Branch (740:7): [True: 197, False: 1.39k]
  ------------------
  741|  1.59k|  return dn;
  742|  1.59k|  } /* decNumberFromString */
uprv_decNumberMultiply_78:
 1938|  2.02k|                              const decNumber *rhs, decContext *set) {
 1939|  2.02k|  uInt status=0;                   /* accumulator  */
  ------------------
  |  |   77|  2.02k|  #define uInt   uint32_t
  ------------------
 1940|  2.02k|  decMultiplyOp(res, lhs, rhs, set, &status);
 1941|  2.02k|  if (status!=0) decStatus(res, status, set);
  ------------------
  |  Branch (1941:7): [True: 507, False: 1.51k]
  ------------------
 1942|       |  #if DECCHECK
 1943|       |  decCheckInexact(res, set);
 1944|       |  #endif
 1945|  2.02k|  return res;
 1946|  2.02k|  } /* decNumberMultiply  */
uprv_decNumberReduce_78:
 2345|  1.33k|                            decContext *set) {
 2346|       |  #if DECSUBSET
 2347|       |  decNumber *allocrhs=nullptr;        /* non-nullptr if rounded rhs allocated  */
 2348|       |  #endif
 2349|  1.33k|  uInt status=0;                   /* as usual  */
  ------------------
  |  |   77|  1.33k|  #define uInt   uint32_t
  ------------------
 2350|  1.33k|  Int  residue=0;                  /* as usual  */
  ------------------
  |  |   76|  1.33k|  #define Int    int32_t
  ------------------
 2351|  1.33k|  Int  dropped;                    /* work  */
  ------------------
  |  |   76|  1.33k|  #define Int    int32_t
  ------------------
 2352|       |
 2353|       |  #if DECCHECK
 2354|       |  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
 2355|       |  #endif
 2356|       |
 2357|  1.33k|  do {                             /* protect allocated storage  */
 2358|       |    #if DECSUBSET
 2359|       |    if (!set->extended) {
 2360|       |      /* reduce operand and set lostDigits status, as needed  */
 2361|       |      if (rhs->digits>set->digits) {
 2362|       |        allocrhs=decRoundOperand(rhs, set, &status);
 2363|       |        if (allocrhs==nullptr) break;
 2364|       |        rhs=allocrhs;
 2365|       |        }
 2366|       |      }
 2367|       |    #endif
 2368|       |    /* [following code does not require input rounding]  */
 2369|       |
 2370|       |    /* Infinities copy through; NaNs need usual treatment  */
 2371|  1.33k|    if (decNumberIsNaN(rhs)) {
  ------------------
  |  |  188|  1.33k|  #define decNumberIsNaN(dn)       (((dn)->bits&(DECNAN|DECSNAN))!=0)
  |  |  ------------------
  |  |  |  |   46|  1.33k|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  ------------------
  |  |                 #define decNumberIsNaN(dn)       (((dn)->bits&(DECNAN|DECSNAN))!=0)
  |  |  ------------------
  |  |  |  |   47|  1.33k|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  ------------------
  |  |  |  Branch (188:36): [True: 0, False: 1.33k]
  |  |  ------------------
  ------------------
 2372|      0|      decNaNs(res, rhs, nullptr, set, &status);
 2373|      0|      break;
 2374|      0|      }
 2375|       |
 2376|       |    /* reduce result to the requested length and copy to result  */
 2377|  1.33k|    decCopyFit(res, rhs, set, &residue, &status); /* copy & round  */
 2378|  1.33k|    decFinish(res, set, &residue, &status);       /* cleanup/set flags  */
  ------------------
  |  |  297|  1.33k|#define decFinish(a,b,c,d) decFinalize(a,b,c,d)
  ------------------
 2379|  1.33k|    decTrim(res, set, 1, 0, &dropped);            /* normalize in place  */
 2380|       |                                                  /* [may clamp]  */
 2381|  1.33k|    } while(0);                              /* end protected  */
  ------------------
  |  Branch (2381:13): [Folded - Ignored]
  ------------------
 2382|       |
 2383|       |  #if DECSUBSET
 2384|       |  if (allocrhs !=nullptr) free(allocrhs);       /* ..  */
 2385|       |  #endif
 2386|  1.33k|  if (status!=0) decStatus(res, status, set);/* then report status  */
  ------------------
  |  Branch (2386:7): [True: 0, False: 1.33k]
  ------------------
 2387|  1.33k|  return res;
 2388|  1.33k|  } /* decNumberReduce  */
uprv_decNumberSetBCD_78:
 3524|  2.02k|U_CAPI decNumber * U_EXPORT2 uprv_decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
 3525|  2.02k|  Unit *up=dn->lsu+D2U(dn->digits)-1;   /* -> msu [target pointer]  */
  ------------------
  |  |   78|  2.02k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  2.02k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
                Unit *up=dn->lsu+D2U(dn->digits)-1;   /* -> msu [target pointer]  */
  ------------------
  |  |  238|  2.02k|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|  2.02k|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 2.02k, False: 0]
  |  |  ------------------
  ------------------
 3526|  2.02k|  const uByte *ub=bcd;                  /* -> source msd  */
 3527|       |
 3528|  2.02k|  #if DECDPUN==1                        /* trivial simple copy  */
 3529|  32.4k|    for (; ub<bcd+n; ub++, up--) *up=*ub;
  ------------------
  |  Branch (3529:12): [True: 30.4k, False: 2.02k]
  ------------------
 3530|       |  #else                                 /* some assembly needed  */
 3531|       |    /* calculate how many digits in msu, and hence first cut  */
 3532|       |    Int cut=MSUDIGITS(n);               /* [faster than remainder]  */
 3533|       |    for (;up>=dn->lsu; up--) {          /* each Unit from msu  */
 3534|       |      *up=0;                            /* will take <=DECDPUN digits  */
 3535|       |      for (; cut>0; ub++, cut--) *up=X10(*up)+*ub;
 3536|       |      cut=DECDPUN;                      /* next Unit has all digits  */
 3537|       |      }
 3538|       |  #endif
 3539|  2.02k|  dn->digits=n;                         /* set digit count  */
 3540|  2.02k|  return dn;
 3541|  2.02k|  } /* decNumberSetBCD  */
uprv_decNumberZero_78:
 3621|    297|U_CAPI decNumber * U_EXPORT2 uprv_decNumberZero(decNumber *dn) {
 3622|       |
 3623|       |  #if DECCHECK
 3624|       |  if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
 3625|       |  #endif
 3626|       |
 3627|    297|  dn->bits=0;
 3628|    297|  dn->exponent=0;
 3629|    297|  dn->digits=1;
 3630|    297|  dn->lsu[0]=0;
 3631|    297|  return dn;
 3632|    297|  } /* decNumberZero  */
decNumber.cpp:_ZL13decUnitAddSubPKhiS0_iiPhi:
 6384|  1.52k|                         Unit *c, Int m) {
 6385|  1.52k|  const Unit *alsu=a;              /* A lsu [need to remember it]  */
 6386|  1.52k|  Unit *clsu=c;                    /* C ditto  */
  ------------------
  |  |   78|  1.52k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  1.52k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 6387|  1.52k|  Unit *minC;                      /* low water mark for C  */
  ------------------
  |  |   78|  1.52k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  1.52k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 6388|  1.52k|  Unit *maxC;                      /* high water mark for C  */
  ------------------
  |  |   78|  1.52k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  1.52k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 6389|  1.52k|  eInt carry=0;                    /* carry integer (could be Long)  */
  ------------------
  |  |  233|  1.52k|  #define eInt  Int           /* extended integer  */
  |  |  ------------------
  |  |  |  |   76|  1.52k|  #define Int    int32_t
  |  |  ------------------
  ------------------
 6390|  1.52k|  Int  add;                        /* work  */
  ------------------
  |  |   76|  1.52k|  #define Int    int32_t
  ------------------
 6391|  1.52k|  #if DECDPUN<=4                   /* myriadal, millenary, etc.  */
 6392|  1.52k|  Int  est;                        /* estimated quotient  */
  ------------------
  |  |   76|  1.52k|  #define Int    int32_t
  ------------------
 6393|  1.52k|  #endif
 6394|       |
 6395|       |  #if DECTRACE
 6396|       |  if (alength<1 || blength<1)
 6397|       |    printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength, blength, m);
 6398|       |  #endif
 6399|       |
 6400|  1.52k|  maxC=c+alength;                  /* A is usually the longer  */
 6401|  1.52k|  minC=c+blength;                  /* .. and B the shorter  */
 6402|  1.52k|  if (bshift!=0) {                 /* B is shifted; low As copy across  */
  ------------------
  |  Branch (6402:7): [True: 119, False: 1.40k]
  ------------------
 6403|    119|    minC+=bshift;
 6404|       |    /* if in place [common], skip copy unless there's a gap [rare]  */
 6405|    119|    if (a==c && bshift<=alength) {
  ------------------
  |  Branch (6405:9): [True: 0, False: 119]
  |  Branch (6405:17): [True: 0, False: 0]
  ------------------
 6406|      0|      c+=bshift;
 6407|      0|      a+=bshift;
 6408|      0|      }
 6409|   707k|     else for (; c<clsu+bshift; a++, c++) {  /* copy needed  */
  ------------------
  |  Branch (6409:18): [True: 707k, False: 119]
  ------------------
 6410|   707k|      if (a<alsu+alength) *c=*a;
  ------------------
  |  Branch (6410:11): [True: 707k, False: 0]
  ------------------
 6411|      0|       else *c=0;
 6412|   707k|      }
 6413|    119|    }
 6414|  1.52k|  if (minC>maxC) { /* swap  */
  ------------------
  |  Branch (6414:7): [True: 1.18k, False: 341]
  ------------------
 6415|  1.18k|    Unit *hold=minC;
  ------------------
  |  |   78|  1.18k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  1.18k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 6416|  1.18k|    minC=maxC;
 6417|  1.18k|    maxC=hold;
 6418|  1.18k|    }
 6419|       |
 6420|       |  /* For speed, do the addition as two loops; the first where both A  */
 6421|       |  /* and B contribute, and the second (if necessary) where only one or  */
 6422|       |  /* other of the numbers contribute.  */
 6423|       |  /* Carry handling is the same (i.e., duplicated) in each case.  */
 6424|  59.0k|  for (; c<minC; c++) {
  ------------------
  |  Branch (6424:10): [True: 57.5k, False: 1.52k]
  ------------------
 6425|  57.5k|    carry+=*a;
 6426|  57.5k|    a++;
 6427|  57.5k|    carry += (static_cast<eInt>(*b)) * m; /* [special-casing m=1/-1  */
 6428|  57.5k|    b++;                                /* here is not a win]  */
 6429|       |    /* here carry is new Unit of digits; it could be +ve or -ve  */
 6430|  57.5k|    if (static_cast<ueInt>(carry) <= DECDPUNMAX) { /* fastpath 0-DECDPUNMAX  */
  ------------------
  |  |  172|  57.5k|    #define DECDPUNMAX 9
  ------------------
  |  Branch (6430:9): [True: 54.8k, False: 2.67k]
  ------------------
 6431|  54.8k|      *c = static_cast<Unit>(carry);
 6432|  54.8k|      carry=0;
 6433|  54.8k|      continue;
 6434|  54.8k|      }
 6435|       |    #if DECDPUN==4                           /* use divide-by-multiply  */
 6436|       |      if (carry>=0) {
 6437|       |        est=(((ueInt)carry>>11)*53687)>>18;
 6438|       |        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder  */
 6439|       |        carry=est;                           /* likely quotient [89%]  */
 6440|       |        if (*c<DECDPUNMAX+1) continue;       /* estimate was correct  */
 6441|       |        carry++;
 6442|       |        *c-=DECDPUNMAX+1;
 6443|       |        continue;
 6444|       |        }
 6445|       |      /* negative case  */
 6446|       |      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
 6447|       |      est=(((ueInt)carry>>11)*53687)>>18;
 6448|       |      *c=(Unit)(carry-est*(DECDPUNMAX+1));
 6449|       |      carry=est-(DECDPUNMAX+1);              /* correctly negative  */
 6450|       |      if (*c<DECDPUNMAX+1) continue;         /* was OK  */
 6451|       |      carry++;
 6452|       |      *c-=DECDPUNMAX+1;
 6453|       |    #elif DECDPUN==3
 6454|       |      if (carry>=0) {
 6455|       |        est=(((ueInt)carry>>3)*16777)>>21;
 6456|       |        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder  */
 6457|       |        carry=est;                           /* likely quotient [99%]  */
 6458|       |        if (*c<DECDPUNMAX+1) continue;       /* estimate was correct  */
 6459|       |        carry++;
 6460|       |        *c-=DECDPUNMAX+1;
 6461|       |        continue;
 6462|       |        }
 6463|       |      /* negative case  */
 6464|       |      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
 6465|       |      est=(((ueInt)carry>>3)*16777)>>21;
 6466|       |      *c=(Unit)(carry-est*(DECDPUNMAX+1));
 6467|       |      carry=est-(DECDPUNMAX+1);              /* correctly negative  */
 6468|       |      if (*c<DECDPUNMAX+1) continue;         /* was OK  */
 6469|       |      carry++;
 6470|       |      *c-=DECDPUNMAX+1;
 6471|       |    #elif DECDPUN<=2
 6472|       |      /* Can use QUOT10 as carry <= 4 digits  */
 6473|  2.67k|      if (carry>=0) {
  ------------------
  |  Branch (6473:11): [True: 2.67k, False: 0]
  ------------------
 6474|  2.67k|        est=QUOT10(carry, DECDPUN);
  ------------------
  |  |  240|  2.67k|  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
  ------------------
 6475|  2.67k|        *c = static_cast<Unit>(carry - est * (DECDPUNMAX + 1)); /* remainder  */
  ------------------
  |  |  172|  2.67k|    #define DECDPUNMAX 9
  ------------------
 6476|  2.67k|        carry=est;                           /* quotient  */
 6477|  2.67k|        continue;
 6478|  2.67k|        }
 6479|       |      /* negative case  */
 6480|      0|      carry = carry + static_cast<eInt>(DECDPUNMAX + 1) * (DECDPUNMAX + 1); /* make positive  */
  ------------------
  |  |  172|      0|    #define DECDPUNMAX 9
  ------------------
                    carry = carry + static_cast<eInt>(DECDPUNMAX + 1) * (DECDPUNMAX + 1); /* make positive  */
  ------------------
  |  |  172|      0|    #define DECDPUNMAX 9
  ------------------
 6481|      0|      est=QUOT10(carry, DECDPUN);
  ------------------
  |  |  240|      0|  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
  ------------------
 6482|      0|      *c = static_cast<Unit>(carry - est * (DECDPUNMAX + 1));
  ------------------
  |  |  172|      0|    #define DECDPUNMAX 9
  ------------------
 6483|      0|      carry=est-(DECDPUNMAX+1);              /* correctly negative  */
  ------------------
  |  |  172|      0|    #define DECDPUNMAX 9
  ------------------
 6484|       |    #else
 6485|       |      /* remainder operator is undefined if negative, so must test  */
 6486|       |      if ((ueInt)carry<(DECDPUNMAX+1)*2) {   /* fastpath carry +1  */
 6487|       |        *c=(Unit)(carry-(DECDPUNMAX+1));     /* [helps additions]  */
 6488|       |        carry=1;
 6489|       |        continue;
 6490|       |        }
 6491|       |      if (carry>=0) {
 6492|       |        *c=(Unit)(carry%(DECDPUNMAX+1));
 6493|       |        carry=carry/(DECDPUNMAX+1);
 6494|       |        continue;
 6495|       |        }
 6496|       |      /* negative case  */
 6497|       |      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
 6498|       |      *c=(Unit)(carry%(DECDPUNMAX+1));
 6499|       |      carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
 6500|       |    #endif
 6501|      0|    } /* c  */
 6502|       |
 6503|       |  /* now may have one or other to complete  */
 6504|       |  /* [pretest to avoid loop setup/shutdown]  */
 6505|  1.18M|  if (c<maxC) for (; c<maxC; c++) {
  ------------------
  |  Branch (6505:7): [True: 1.32k, False: 202]
  |  Branch (6505:22): [True: 1.18M, False: 1.32k]
  ------------------
 6506|  1.18M|    if (a<alsu+alength) {               /* still in A  */
  ------------------
  |  Branch (6506:9): [True: 4.44k, False: 1.18M]
  ------------------
 6507|  4.44k|      carry+=*a;
 6508|  4.44k|      a++;
 6509|  4.44k|      }
 6510|  1.18M|     else {                             /* inside B  */
 6511|  1.18M|      carry += static_cast<eInt>(*b) * m;
 6512|  1.18M|      b++;
 6513|  1.18M|      }
 6514|       |    /* here carry is new Unit of digits; it could be +ve or -ve and  */
 6515|       |    /* magnitude up to DECDPUNMAX squared  */
 6516|  1.18M|    if (static_cast<ueInt>(carry) <= DECDPUNMAX) { /* fastpath 0-DECDPUNMAX  */
  ------------------
  |  |  172|  1.18M|    #define DECDPUNMAX 9
  ------------------
  |  Branch (6516:9): [True: 1.14M, False: 45.2k]
  ------------------
 6517|  1.14M|      *c = static_cast<Unit>(carry);
 6518|  1.14M|      carry=0;
 6519|  1.14M|      continue;
 6520|  1.14M|      }
 6521|       |    /* result for this unit is negative or >DECDPUNMAX  */
 6522|       |    #if DECDPUN==4                           /* use divide-by-multiply  */
 6523|       |      if (carry>=0) {
 6524|       |        est=(((ueInt)carry>>11)*53687)>>18;
 6525|       |        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder  */
 6526|       |        carry=est;                           /* likely quotient [79.7%]  */
 6527|       |        if (*c<DECDPUNMAX+1) continue;       /* estimate was correct  */
 6528|       |        carry++;
 6529|       |        *c-=DECDPUNMAX+1;
 6530|       |        continue;
 6531|       |        }
 6532|       |      /* negative case  */
 6533|       |      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
 6534|       |      est=(((ueInt)carry>>11)*53687)>>18;
 6535|       |      *c=(Unit)(carry-est*(DECDPUNMAX+1));
 6536|       |      carry=est-(DECDPUNMAX+1);              /* correctly negative  */
 6537|       |      if (*c<DECDPUNMAX+1) continue;         /* was OK  */
 6538|       |      carry++;
 6539|       |      *c-=DECDPUNMAX+1;
 6540|       |    #elif DECDPUN==3
 6541|       |      if (carry>=0) {
 6542|       |        est=(((ueInt)carry>>3)*16777)>>21;
 6543|       |        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder  */
 6544|       |        carry=est;                           /* likely quotient [99%]  */
 6545|       |        if (*c<DECDPUNMAX+1) continue;       /* estimate was correct  */
 6546|       |        carry++;
 6547|       |        *c-=DECDPUNMAX+1;
 6548|       |        continue;
 6549|       |        }
 6550|       |      /* negative case  */
 6551|       |      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
 6552|       |      est=(((ueInt)carry>>3)*16777)>>21;
 6553|       |      *c=(Unit)(carry-est*(DECDPUNMAX+1));
 6554|       |      carry=est-(DECDPUNMAX+1);              /* correctly negative  */
 6555|       |      if (*c<DECDPUNMAX+1) continue;         /* was OK  */
 6556|       |      carry++;
 6557|       |      *c-=DECDPUNMAX+1;
 6558|       |    #elif DECDPUN<=2
 6559|  45.2k|      if (carry>=0) {
  ------------------
  |  Branch (6559:11): [True: 45.2k, False: 0]
  ------------------
 6560|  45.2k|        est=QUOT10(carry, DECDPUN);
  ------------------
  |  |  240|  45.2k|  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
  ------------------
 6561|  45.2k|        *c = static_cast<Unit>(carry - est * (DECDPUNMAX + 1)); /* remainder  */
  ------------------
  |  |  172|  45.2k|    #define DECDPUNMAX 9
  ------------------
 6562|  45.2k|        carry=est;                           /* quotient  */
 6563|  45.2k|        continue;
 6564|  45.2k|        }
 6565|       |      /* negative case  */
 6566|      0|      carry = carry + static_cast<eInt>(DECDPUNMAX + 1) * (DECDPUNMAX + 1); /* make positive  */
  ------------------
  |  |  172|      0|    #define DECDPUNMAX 9
  ------------------
                    carry = carry + static_cast<eInt>(DECDPUNMAX + 1) * (DECDPUNMAX + 1); /* make positive  */
  ------------------
  |  |  172|      0|    #define DECDPUNMAX 9
  ------------------
 6567|      0|      est=QUOT10(carry, DECDPUN);
  ------------------
  |  |  240|      0|  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
  ------------------
 6568|      0|      *c = static_cast<Unit>(carry - est * (DECDPUNMAX + 1));
  ------------------
  |  |  172|      0|    #define DECDPUNMAX 9
  ------------------
 6569|      0|      carry=est-(DECDPUNMAX+1);              /* correctly negative  */
  ------------------
  |  |  172|      0|    #define DECDPUNMAX 9
  ------------------
 6570|       |    #else
 6571|       |      if ((ueInt)carry<(DECDPUNMAX+1)*2){    /* fastpath carry 1  */
 6572|       |        *c=(Unit)(carry-(DECDPUNMAX+1));
 6573|       |        carry=1;
 6574|       |        continue;
 6575|       |        }
 6576|       |      /* remainder operator is undefined if negative, so must test  */
 6577|       |      if (carry>=0) {
 6578|       |        *c=(Unit)(carry%(DECDPUNMAX+1));
 6579|       |        carry=carry/(DECDPUNMAX+1);
 6580|       |        continue;
 6581|       |        }
 6582|       |      /* negative case  */
 6583|       |      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
 6584|       |      *c=(Unit)(carry%(DECDPUNMAX+1));
 6585|       |      carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
 6586|       |    #endif
 6587|      0|    } /* c  */
 6588|       |
 6589|       |  /* OK, all A and B processed; might still have carry or borrow  */
 6590|       |  /* return number of Units in the result, negated if a borrow  */
 6591|  1.52k|  if (carry==0) return static_cast<int32_t>(c-clsu);     /* no carry, so no more to do  */
  ------------------
  |  Branch (6591:7): [True: 773, False: 749]
  ------------------
 6592|    749|  if (carry>0) {                   /* positive carry  */
  ------------------
  |  Branch (6592:7): [True: 749, False: 0]
  ------------------
 6593|    749|    *c = static_cast<Unit>(carry); /* place as new unit  */
 6594|    749|    c++;                           /* ..  */
 6595|    749|    return static_cast<int32_t>(c-clsu);
 6596|    749|    }
 6597|       |  /* -ve carry: it's a borrow; complement needed  */
 6598|      0|  add=1;                           /* temporary carry...  */
 6599|      0|  for (c=clsu; c<maxC; c++) {
  ------------------
  |  Branch (6599:16): [True: 0, False: 0]
  ------------------
 6600|      0|    add=DECDPUNMAX+add-*c;
  ------------------
  |  |  172|      0|    #define DECDPUNMAX 9
  ------------------
 6601|      0|    if (add<=DECDPUNMAX) {
  ------------------
  |  |  172|      0|    #define DECDPUNMAX 9
  ------------------
  |  Branch (6601:9): [True: 0, False: 0]
  ------------------
 6602|      0|      *c = static_cast<Unit>(add);
 6603|      0|      add=0;
 6604|      0|      }
 6605|      0|     else {
 6606|      0|      *c=0;
 6607|      0|      add=1;
 6608|      0|      }
 6609|      0|    }
 6610|       |  /* add an extra unit iff it would be non-zero  */
 6611|       |  #if DECTRACE
 6612|       |    printf("UAS borrow: add %ld, carry %ld\n", add, carry);
 6613|       |  #endif
 6614|      0|  if ((add-carry-1)!=0) {
  ------------------
  |  Branch (6614:7): [True: 0, False: 0]
  ------------------
 6615|      0|    *c = static_cast<Unit>(add - carry - 1);
 6616|      0|    c++;                      /* interesting, include it  */
 6617|      0|    }
 6618|      0|  return static_cast<int32_t>(clsu-c);              /* -ve result indicates borrowed  */
 6619|    749|  } /* decUnitAddSub  */
decNumber.cpp:_ZL14decUnitComparePKhiS0_ii:
 6279|    132|                          const Unit *b, Int blength, Int exp) {
 6280|    132|  Unit  *acc;                      /* accumulator for result  */
  ------------------
  |  |   78|    132|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|    132|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 6281|    132|  Unit  accbuff[SD2U(DECBUFFER*2+1)]; /* local buffer  */
  ------------------
  |  |   78|    132|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|    132|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 6282|    132|  Unit  *allocacc=nullptr;            /* -> allocated acc buffer, iff allocated  */
  ------------------
  |  |   78|    132|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|    132|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 6283|    132|  Int   accunits, need;            /* units in use or needed for acc  */
  ------------------
  |  |   76|    132|  #define Int    int32_t
  ------------------
 6284|    132|  const Unit *l, *r, *u;           /* work  */
 6285|    132|  Int   expunits, exprem, result;  /* ..  */
  ------------------
  |  |   76|    132|  #define Int    int32_t
  ------------------
 6286|       |
 6287|    132|  if (exp==0) {                    /* aligned; fastpath  */
  ------------------
  |  Branch (6287:7): [True: 13, False: 119]
  ------------------
 6288|     13|    if (alength>blength) return 1;
  ------------------
  |  Branch (6288:9): [True: 0, False: 13]
  ------------------
 6289|     13|    if (alength<blength) return -1;
  ------------------
  |  Branch (6289:9): [True: 0, False: 13]
  ------------------
 6290|       |    /* same number of units in both -- need unit-by-unit compare  */
 6291|     13|    l=a+alength-1;
 6292|     13|    r=b+alength-1;
 6293|     16|    for (;l>=a; l--, r--) {
  ------------------
  |  Branch (6293:11): [True: 13, False: 3]
  ------------------
 6294|     13|      if (*l>*r) return 1;
  ------------------
  |  Branch (6294:11): [True: 10, False: 3]
  ------------------
 6295|      3|      if (*l<*r) return -1;
  ------------------
  |  Branch (6295:11): [True: 0, False: 3]
  ------------------
 6296|      3|      }
 6297|      3|    return 0;                      /* all units match  */
 6298|     13|    } /* aligned  */
 6299|       |
 6300|       |  /* Unaligned.  If one is >1 unit longer than the other, padded  */
 6301|       |  /* approximately, then can return easily  */
 6302|    119|  if (alength > blength + static_cast<Int>(D2U(exp))) return 1;
  ------------------
  |  |  238|    119|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|    119|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     66|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     66|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 53, False: 66]
  |  |  ------------------
  ------------------
  |  Branch (6302:7): [True: 0, False: 119]
  ------------------
 6303|    119|  if (alength + 1 < blength + static_cast<Int>(D2U(exp))) return -1;
  ------------------
  |  |  238|    119|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|    119|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     66|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     66|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 53, False: 66]
  |  |  ------------------
  ------------------
  |  Branch (6303:7): [True: 0, False: 119]
  ------------------
 6304|       |
 6305|       |  /* Need to do a real subtract.  For this, a result buffer is needed  */
 6306|       |  /* even though only the sign is of interest.  Its length needs  */
 6307|       |  /* to be the larger of alength and padded blength, +2  */
 6308|    119|  need=blength+D2U(exp);                /* maximum real length of B  */
  ------------------
  |  |  238|    119|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|    119|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     66|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     66|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 53, False: 66]
  |  |  ------------------
  ------------------
 6309|    119|  if (need<alength) need=alength;
  ------------------
  |  Branch (6309:7): [True: 0, False: 119]
  ------------------
 6310|    119|  need+=2;
 6311|    119|  acc=accbuff;                          /* assume use local buffer  */
 6312|    119|  if (need*sizeof(Unit)>sizeof(accbuff)) {
  ------------------
  |  Branch (6312:7): [True: 61, False: 58]
  ------------------
 6313|     61|    allocacc = static_cast<Unit*>(malloc(need * sizeof(Unit)));
  ------------------
  |  |  309|     61|#define malloc(a) uprv_malloc(a)
  |  |  ------------------
  |  |  |  | 1524|     61|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|     61|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|     61|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|     61|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 6314|     61|    if (allocacc==nullptr) return BADINT;  /* hopeless -- abandon  */
  ------------------
  |  |  210|      0|#define BADINT  (Int)0x80000000    /* most-negative Int; error indicator  */
  ------------------
  |  Branch (6314:9): [True: 0, False: 61]
  ------------------
 6315|     61|    acc=allocacc;
 6316|     61|    }
 6317|       |  /* Calculate units and remainder from exponent.  */
 6318|    119|  expunits=exp/DECDPUN;
  ------------------
  |  |   59|    119|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 6319|    119|  exprem=exp%DECDPUN;
  ------------------
  |  |   59|    119|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 6320|       |  /* subtract [A+B*(-m)]  */
 6321|    119|  accunits=decUnitAddSub(a, alength, b, blength, expunits, acc,
 6322|    119|                         -static_cast<Int>(powers[exprem]));
  ------------------
  |  |  193|    119|#define powers      DECPOWERS      /* old internal name  */
  ------------------
 6323|       |  /* [UnitAddSub result may have leading zeros, even on zero]  */
 6324|    119|  if (accunits<0) result=-1;            /* negative result  */
  ------------------
  |  Branch (6324:7): [True: 0, False: 119]
  ------------------
 6325|    119|   else {                               /* non-negative result  */
 6326|       |    /* check units of the result before freeing any storage  */
 6327|  2.63k|    for (u=acc; u<acc+accunits-1 && *u==0;) u++;
  ------------------
  |  Branch (6327:17): [True: 2.62k, False: 11]
  |  Branch (6327:37): [True: 2.51k, False: 108]
  ------------------
 6328|    119|    result=(*u==0 ? 0 : +1);
  ------------------
  |  Branch (6328:13): [True: 0, False: 119]
  ------------------
 6329|    119|    }
 6330|       |  /* clean up and return the result  */
 6331|    119|  if (allocacc!=nullptr) free(allocacc);   /* drop any storage used  */
  ------------------
  |  |  310|     61|#define free(a) uprv_free(a)
  |  |  ------------------
  |  |  |  | 1503|     61|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|     61|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|     61|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|     61|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (6331:7): [True: 61, False: 58]
  ------------------
 6332|    119|  return result;
 6333|    119|  } /* decUnitCompare  */
decNumber.cpp:_ZL13decMultiplyOpP9decNumberPKS_S2_P10decContextPj:
 4873|  2.02k|                                 uInt *status) {
 4874|  2.02k|  Int    accunits;                 /* Units of accumulator in use  */
  ------------------
  |  |   76|  2.02k|  #define Int    int32_t
  ------------------
 4875|  2.02k|  Int    exponent;                 /* work  */
  ------------------
  |  |   76|  2.02k|  #define Int    int32_t
  ------------------
 4876|  2.02k|  Int    residue=0;                /* rounding residue  */
  ------------------
  |  |   76|  2.02k|  #define Int    int32_t
  ------------------
 4877|  2.02k|  uByte  bits;                     /* result sign  */
  ------------------
  |  |   73|  2.02k|  #define uByte  uint8_t
  ------------------
 4878|  2.02k|  Unit  *acc;                      /* -> accumulator Unit array  */
  ------------------
  |  |   78|  2.02k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  2.02k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 4879|  2.02k|  Int    needbytes;                /* size calculator  */
  ------------------
  |  |   76|  2.02k|  #define Int    int32_t
  ------------------
 4880|  2.02k|  void  *allocacc=nullptr;            /* -> allocated accumulator, iff allocated  */
 4881|  2.02k|  Unit  accbuff[SD2U(DECBUFFER*4+1)]; /* buffer (+1 for DECBUFFER==0,  */
  ------------------
  |  |   78|  2.02k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  2.02k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 4882|       |                                   /* *4 for calls from other operations)  */
 4883|  2.02k|  const Unit *mer, *mermsup;       /* work  */
 4884|  2.02k|  Int   madlength;                 /* Units in multiplicand  */
  ------------------
  |  |   76|  2.02k|  #define Int    int32_t
  ------------------
 4885|  2.02k|  Int   shift;                     /* Units to shift multiplicand by  */
  ------------------
  |  |   76|  2.02k|  #define Int    int32_t
  ------------------
 4886|       |
 4887|  2.02k|  #if FASTMUL
 4888|       |    /* if DECDPUN is 1 or 3 work in base 10**9, otherwise  */
 4889|       |    /* (DECDPUN is 2 or 4) then work in base 10**8  */
 4890|  2.02k|    #if DECDPUN & 1                /* odd  */
 4891|  2.02k|      #define FASTBASE 1000000000  /* base  */
 4892|  2.02k|      #define FASTDIGS          9  /* digits in base  */
 4893|  2.02k|      #define FASTLAZY         18  /* carry resolution point [1->18]  */
 4894|       |    #else
 4895|       |      #define FASTBASE  100000000
 4896|       |      #define FASTDIGS          8
 4897|       |      #define FASTLAZY       1844  /* carry resolution point [1->1844]  */
 4898|       |    #endif
 4899|       |    /* three buffers are used, two for chunked copies of the operands  */
 4900|       |    /* (base 10**8 or base 10**9) and one base 2**64 accumulator with  */
 4901|       |    /* lazy carry evaluation  */
 4902|  2.02k|    uInt   zlhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0)  */
  ------------------
  |  |   77|  2.02k|  #define uInt   uint32_t
  ------------------
 4903|  2.02k|    uInt  *zlhi=zlhibuff;                 /* -> lhs array  */
  ------------------
  |  |   77|  2.02k|  #define uInt   uint32_t
  ------------------
 4904|  2.02k|    uInt  *alloclhi=nullptr;                 /* -> allocated buffer, iff allocated  */
  ------------------
  |  |   77|  2.02k|  #define uInt   uint32_t
  ------------------
 4905|  2.02k|    uInt   zrhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0)  */
  ------------------
  |  |   77|  2.02k|  #define uInt   uint32_t
  ------------------
 4906|  2.02k|    uInt  *zrhi=zrhibuff;                 /* -> rhs array  */
  ------------------
  |  |   77|  2.02k|  #define uInt   uint32_t
  ------------------
 4907|  2.02k|    uInt  *allocrhi=nullptr;                 /* -> allocated buffer, iff allocated  */
  ------------------
  |  |   77|  2.02k|  #define uInt   uint32_t
  ------------------
 4908|  2.02k|    uLong  zaccbuff[(DECBUFFER*2+1)/4+2]; /* buffer (+1 for DECBUFFER==0)  */
  ------------------
  |  |   81|  2.02k|  #define uLong  uint64_t
  ------------------
 4909|       |    /* [allocacc is shared for both paths, as only one will run]  */
 4910|  2.02k|    uLong *zacc=zaccbuff;          /* -> accumulator array for exact result  */
  ------------------
  |  |   81|  2.02k|  #define uLong  uint64_t
  ------------------
 4911|  2.02k|    #if DECDPUN==1
 4912|  2.02k|    Int    zoff;                   /* accumulator offset  */
  ------------------
  |  |   76|  2.02k|  #define Int    int32_t
  ------------------
 4913|  2.02k|    #endif
 4914|  2.02k|    uInt  *lip, *rip;              /* item pointers  */
  ------------------
  |  |   77|  2.02k|  #define uInt   uint32_t
  ------------------
 4915|  2.02k|    uInt  *lmsi, *rmsi;            /* most significant items  */
  ------------------
  |  |   77|  2.02k|  #define uInt   uint32_t
  ------------------
 4916|  2.02k|    Int    ilhs, irhs, iacc;       /* item counts in the arrays  */
  ------------------
  |  |   76|  2.02k|  #define Int    int32_t
  ------------------
 4917|  2.02k|    Int    lazy;                   /* lazy carry counter  */
  ------------------
  |  |   76|  2.02k|  #define Int    int32_t
  ------------------
 4918|  2.02k|    uLong  lcarry;                 /* uLong carry  */
  ------------------
  |  |   81|  2.02k|  #define uLong  uint64_t
  ------------------
 4919|  2.02k|    uInt   carry;                  /* carry (NB not uLong)  */
  ------------------
  |  |   77|  2.02k|  #define uInt   uint32_t
  ------------------
 4920|  2.02k|    Int    count;                  /* work  */
  ------------------
  |  |   76|  2.02k|  #define Int    int32_t
  ------------------
 4921|  2.02k|    const  Unit *cup;              /* ..  */
 4922|  2.02k|    Unit  *up;                     /* ..  */
  ------------------
  |  |   78|  2.02k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  2.02k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 4923|  2.02k|    uLong *lp;                     /* ..  */
  ------------------
  |  |   81|  2.02k|  #define uLong  uint64_t
  ------------------
 4924|  2.02k|    Int    p;                      /* ..  */
  ------------------
  |  |   76|  2.02k|  #define Int    int32_t
  ------------------
 4925|  2.02k|  #endif
 4926|       |
 4927|       |  #if DECSUBSET
 4928|       |    decNumber *alloclhs=nullptr;      /* -> allocated buffer, iff allocated  */
 4929|       |    decNumber *allocrhs=nullptr;      /* -> allocated buffer, iff allocated  */
 4930|       |  #endif
 4931|       |
 4932|       |  #if DECCHECK
 4933|       |  if (decCheckOperands(res, lhs, rhs, set)) return res;
 4934|       |  #endif
 4935|       |
 4936|       |  /* precalculate result sign  */
 4937|  2.02k|  bits = static_cast<uByte>((lhs->bits ^ rhs->bits) & DECNEG);
  ------------------
  |  |   44|  2.02k|  #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
  ------------------
 4938|       |
 4939|       |  /* handle infinities and NaNs  */
 4940|  2.02k|  if (SPECIALARGS) {               /* a special bit set  */
  ------------------
  |  |  306|  2.02k|#define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)
  |  |  ------------------
  |  |  |  |   49|  2.02k|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  2.02k|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  ------------------
  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  ------------------
  |  |  |  |  |  |   46|  2.02k|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  ------------------
  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  ------------------
  |  |  |  |  |  |   47|  2.02k|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (306:21): [True: 0, False: 2.02k]
  |  |  ------------------
  ------------------
 4941|      0|    if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs  */
  ------------------
  |  |  306|      0|#define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)
  |  |  ------------------
  |  |  |  |   49|      0|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  ------------------
  |  |  |  |  |  |   45|      0|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  ------------------
  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  ------------------
  |  |  |  |  |  |   46|      0|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  ------------------
  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  ------------------
  |  |  |  |  |  |   47|      0|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs  */
  ------------------
  |  |   47|      0|  #define DECSNAN   0x10      /* 1=sNaN                               */
  ------------------
                  if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs  */
  ------------------
  |  |   46|      0|  #define DECNAN    0x20      /* 1=NaN                                */
  ------------------
  |  Branch (4941:9): [True: 0, False: 0]
  ------------------
 4942|      0|      decNaNs(res, lhs, rhs, set, status);
 4943|      0|      return res;}
 4944|       |    /* one or two infinities; Infinity * 0 is invalid  */
 4945|      0|    if (((lhs->bits & DECINF)==0 && ISZERO(lhs))
  ------------------
  |  |   45|      0|  #define DECINF    0x40      /* 1=Infinity                           */
  ------------------
                  if (((lhs->bits & DECINF)==0 && ISZERO(lhs))
  ------------------
  |  |  229|      0|  #define ISZERO(dn) decNumberIsZero(dn)     /* now just a local name */
  |  |  ------------------
  |  |  |  |  193|      0|  #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:37): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  194|      0|                                    && (dn)->digits==1 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (194:40): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  195|      0|                                    && (((dn)->bits&DECSPECIAL)==0))
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      0|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|      0|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   46|      0|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   47|      0|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (195:40): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (4945:10): [True: 0, False: 0]
  ------------------
 4946|      0|      ||((rhs->bits & DECINF)==0 && ISZERO(rhs))) {
  ------------------
  |  |   45|      0|  #define DECINF    0x40      /* 1=Infinity                           */
  ------------------
                    ||((rhs->bits & DECINF)==0 && ISZERO(rhs))) {
  ------------------
  |  |  229|      0|  #define ISZERO(dn) decNumberIsZero(dn)     /* now just a local name */
  |  |  ------------------
  |  |  |  |  193|      0|  #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:37): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  194|      0|                                    && (dn)->digits==1 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (194:40): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  195|      0|                                    && (((dn)->bits&DECSPECIAL)==0))
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      0|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|      0|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   46|      0|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   47|      0|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (195:40): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (4946:10): [True: 0, False: 0]
  ------------------
 4947|      0|      *status|=DEC_Invalid_operation;
  ------------------
  |  |  151|      0|    #define DEC_Invalid_operation    0x00000080
  ------------------
 4948|      0|      return res;}
 4949|      0|    uprv_decNumberZero(res);
  ------------------
  |  | 1487|      0|#define uprv_decNumberZero U_ICU_ENTRY_POINT_RENAME(uprv_decNumberZero)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4950|      0|    res->bits=bits|DECINF;         /* infinity  */
  ------------------
  |  |   45|      0|  #define DECINF    0x40      /* 1=Infinity                           */
  ------------------
 4951|      0|    return res;}
 4952|       |
 4953|       |  /* For best speed, as in DMSRCN [the original Rexx numerics  */
 4954|       |  /* module], use the shorter number as the multiplier (rhs) and  */
 4955|       |  /* the longer as the multiplicand (lhs) to minimise the number of  */
 4956|       |  /* adds (partial products)  */
 4957|  2.02k|  if (lhs->digits<rhs->digits) {   /* swap...  */
  ------------------
  |  Branch (4957:7): [True: 470, False: 1.55k]
  ------------------
 4958|    470|    const decNumber *hold=lhs;
 4959|    470|    lhs=rhs;
 4960|    470|    rhs=hold;
 4961|    470|    }
 4962|       |
 4963|  2.02k|  do {                             /* protect allocated storage  */
 4964|       |    #if DECSUBSET
 4965|       |    if (!set->extended) {
 4966|       |      /* reduce operands and set lostDigits status, as needed  */
 4967|       |      if (lhs->digits>set->digits) {
 4968|       |        alloclhs=decRoundOperand(lhs, set, status);
 4969|       |        if (alloclhs==nullptr) break;
 4970|       |        lhs=alloclhs;
 4971|       |        }
 4972|       |      if (rhs->digits>set->digits) {
 4973|       |        allocrhs=decRoundOperand(rhs, set, status);
 4974|       |        if (allocrhs==nullptr) break;
 4975|       |        rhs=allocrhs;
 4976|       |        }
 4977|       |      }
 4978|       |    #endif
 4979|       |    /* [following code does not require input rounding]  */
 4980|       |
 4981|       |    #if FASTMUL                    /* fastpath can be used  */
 4982|       |    /* use the fast path if there are enough digits in the shorter  */
 4983|       |    /* operand to make the setup and takedown worthwhile  */
 4984|  2.02k|    #define NEEDTWO (DECDPUN*2)    /* within two decUnitAddSub calls  */
 4985|  2.02k|    if (rhs->digits>NEEDTWO) {     /* use fastpath...  */
  ------------------
  |  | 4984|  2.02k|    #define NEEDTWO (DECDPUN*2)    /* within two decUnitAddSub calls  */
  |  |  ------------------
  |  |  |  |   59|  2.02k|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  ------------------
  |  Branch (4985:9): [True: 769, False: 1.25k]
  ------------------
 4986|       |      /* calculate the number of elements in each array  */
 4987|    769|      ilhs=(lhs->digits+FASTDIGS-1)/FASTDIGS; /* [ceiling]  */
  ------------------
  |  | 4892|    769|      #define FASTDIGS          9  /* digits in base  */
  ------------------
                    ilhs=(lhs->digits+FASTDIGS-1)/FASTDIGS; /* [ceiling]  */
  ------------------
  |  | 4892|    769|      #define FASTDIGS          9  /* digits in base  */
  ------------------
 4988|    769|      irhs=(rhs->digits+FASTDIGS-1)/FASTDIGS; /* ..  */
  ------------------
  |  | 4892|    769|      #define FASTDIGS          9  /* digits in base  */
  ------------------
                    irhs=(rhs->digits+FASTDIGS-1)/FASTDIGS; /* ..  */
  ------------------
  |  | 4892|    769|      #define FASTDIGS          9  /* digits in base  */
  ------------------
 4989|    769|      iacc=ilhs+irhs;
 4990|       |
 4991|       |      /* allocate buffers if required, as usual  */
 4992|    769|      needbytes=ilhs*sizeof(uInt);
 4993|    769|      if (needbytes > static_cast<Int>(sizeof(zlhibuff))) {
  ------------------
  |  Branch (4993:11): [True: 255, False: 514]
  ------------------
 4994|    255|        alloclhi = static_cast<uInt*>(malloc(needbytes));
  ------------------
  |  |  309|    255|#define malloc(a) uprv_malloc(a)
  |  |  ------------------
  |  |  |  | 1524|    255|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|    255|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|    255|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|    255|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4995|    255|        zlhi=alloclhi;}
 4996|    769|      needbytes=irhs*sizeof(uInt);
 4997|    769|      if (needbytes > static_cast<Int>(sizeof(zrhibuff))) {
  ------------------
  |  Branch (4997:11): [True: 0, False: 769]
  ------------------
 4998|      0|        allocrhi = static_cast<uInt*>(malloc(needbytes));
  ------------------
  |  |  309|      0|#define malloc(a) uprv_malloc(a)
  |  |  ------------------
  |  |  |  | 1524|      0|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4999|      0|        zrhi=allocrhi;}
 5000|       |
 5001|       |      /* Allocating the accumulator space needs a special case when  */
 5002|       |      /* DECDPUN=1 because when converting the accumulator to Units  */
 5003|       |      /* after the multiplication each 8-byte item becomes 9 1-byte  */
 5004|       |      /* units.  Therefore iacc extra bytes are needed at the front  */
 5005|       |      /* (rounded up to a multiple of 8 bytes), and the uLong  */
 5006|       |      /* accumulator starts offset the appropriate number of units  */
 5007|       |      /* to the right to avoid overwrite during the unchunking.  */
 5008|       |
 5009|       |      /* Make sure no signed int overflow below. This is always true */
 5010|       |      /* if the given numbers have less digits than DEC_MAX_DIGITS. */
 5011|    769|      U_ASSERT((uint32_t)iacc <= INT32_MAX/sizeof(uLong));
  ------------------
  |  |   35|    769|#   define U_ASSERT(exp) (void)0
  ------------------
 5012|    769|      needbytes=iacc*sizeof(uLong);
 5013|    769|      #if DECDPUN==1
 5014|    769|      zoff=(iacc+7)/8;        /* items to offset by  */
 5015|    769|      needbytes+=zoff*8;
 5016|    769|      #endif
 5017|    769|      if (needbytes > static_cast<Int>(sizeof(zaccbuff))) {
  ------------------
  |  Branch (5017:11): [True: 233, False: 536]
  ------------------
 5018|    233|        allocacc = static_cast<uLong*>(malloc(needbytes));
  ------------------
  |  |  309|    233|#define malloc(a) uprv_malloc(a)
  |  |  ------------------
  |  |  |  | 1524|    233|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|    233|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|    233|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|    233|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5019|    233|        zacc = static_cast<uLong*>(allocacc);}
 5020|    769|      if (zlhi==nullptr||zrhi==nullptr||zacc==nullptr) {
  ------------------
  |  Branch (5020:11): [True: 0, False: 769]
  |  Branch (5020:26): [True: 0, False: 769]
  |  Branch (5020:41): [True: 0, False: 769]
  ------------------
 5021|      0|        *status|=DEC_Insufficient_storage;
  ------------------
  |  |  148|      0|    #define DEC_Insufficient_storage 0x00000010 /* [when malloc fails]  */
  ------------------
 5022|      0|        break;}
 5023|       |
 5024|    769|      acc = reinterpret_cast<Unit*>(zacc); /* -> target Unit array  */
 5025|    769|      #if DECDPUN==1
 5026|    769|      zacc+=zoff;             /* start uLong accumulator to right  */
 5027|    769|      #endif
 5028|       |
 5029|       |      /* assemble the chunked copies of the left and right sides  */
 5030|   550k|      for (count=lhs->digits, cup=lhs->lsu, lip=zlhi; count>0; lip++)
  ------------------
  |  Branch (5030:55): [True: 549k, False: 769]
  ------------------
 5031|  5.48M|        for (p=0, *lip=0; p<FASTDIGS && count>0;
  ------------------
  |  | 4892|  10.9M|      #define FASTDIGS          9  /* digits in base  */
  ------------------
  |  Branch (5031:27): [True: 4.94M, False: 548k]
  |  Branch (5031:41): [True: 4.94M, False: 631]
  ------------------
 5032|  4.94M|             p+=DECDPUN, cup++, count-=DECDPUN)
  ------------------
  |  |   59|  4.94M|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
                           p+=DECDPUN, cup++, count-=DECDPUN)
  ------------------
  |  |   59|  4.94M|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 5033|  4.94M|          *lip+=*cup*powers[p];
  ------------------
  |  |  193|  4.94M|#define powers      DECPOWERS      /* old internal name  */
  ------------------
 5034|    769|      lmsi=lip-1;     /* save -> msi  */
 5035|  2.05k|      for (count=rhs->digits, cup=rhs->lsu, rip=zrhi; count>0; rip++)
  ------------------
  |  Branch (5035:55): [True: 1.28k, False: 769]
  ------------------
 5036|  10.3k|        for (p=0, *rip=0; p<FASTDIGS && count>0;
  ------------------
  |  | 4892|  20.6k|      #define FASTDIGS          9  /* digits in base  */
  ------------------
  |  Branch (5036:27): [True: 9.72k, False: 606]
  |  Branch (5036:41): [True: 9.04k, False: 678]
  ------------------
 5037|  9.04k|             p+=DECDPUN, cup++, count-=DECDPUN)
  ------------------
  |  |   59|  9.04k|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
                           p+=DECDPUN, cup++, count-=DECDPUN)
  ------------------
  |  |   59|  9.04k|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 5038|  9.04k|          *rip+=*cup*powers[p];
  ------------------
  |  |  193|  9.04k|#define powers      DECPOWERS      /* old internal name  */
  ------------------
 5039|    769|      rmsi=rip-1;     /* save -> msi  */
 5040|       |
 5041|       |      /* zero the accumulator  */
 5042|   551k|      for (lp=zacc; lp<zacc+iacc; lp++) *lp=0;
  ------------------
  |  Branch (5042:21): [True: 550k, False: 769]
  ------------------
 5043|       |
 5044|       |      /* Start the multiplication */
 5045|       |      /* Resolving carries can dominate the cost of accumulating the  */
 5046|       |      /* partial products, so this is only done when necessary.  */
 5047|       |      /* Each uLong item in the accumulator can hold values up to  */
 5048|       |      /* 2**64-1, and each partial product can be as large as  */
 5049|       |      /* (10**FASTDIGS-1)**2.  When FASTDIGS=9, this can be added to  */
 5050|       |      /* itself 18.4 times in a uLong without overflowing, so during  */
 5051|       |      /* the main calculation resolution is carried out every 18th  */
 5052|       |      /* add -- every 162 digits.  Similarly, when FASTDIGS=8, the  */
 5053|       |      /* partial products can be added to themselves 1844.6 times in  */
 5054|       |      /* a uLong without overflowing, so intermediate carry  */
 5055|       |      /* resolution occurs only every 14752 digits.  Hence for common  */
 5056|       |      /* short numbers usually only the one final carry resolution  */
 5057|       |      /* occurs.  */
 5058|       |      /* (The count is set via FASTLAZY to simplify experiments to  */
 5059|       |      /* measure the value of this approach: a 35% improvement on a  */
 5060|       |      /* [34x34] multiply.)  */
 5061|    769|      lazy=FASTLAZY;                         /* carry delay count  */
  ------------------
  |  | 4893|    769|      #define FASTLAZY         18  /* carry resolution point [1->18]  */
  ------------------
 5062|  2.05k|      for (rip=zrhi; rip<=rmsi; rip++) {     /* over each item in rhs  */
  ------------------
  |  Branch (5062:22): [True: 1.28k, False: 769]
  ------------------
 5063|  1.28k|        lp=zacc+(rip-zrhi);                  /* where to add the lhs  */
 5064|  1.10M|        for (lip=zlhi; lip<=lmsi; lip++, lp++) { /* over each item in lhs  */
  ------------------
  |  Branch (5064:24): [True: 1.09M, False: 1.28k]
  ------------------
 5065|  1.09M|          *lp += static_cast<uLong>(*lip) * (*rip); /* [this should in-line]  */
 5066|  1.09M|          } /* lip loop  */
 5067|  1.28k|        lazy--;
 5068|  1.28k|        if (lazy>0 && rip!=rmsi) continue;
  ------------------
  |  Branch (5068:13): [True: 1.28k, False: 0]
  |  Branch (5068:23): [True: 515, False: 769]
  ------------------
 5069|    769|        lazy=FASTLAZY;                       /* reset delay count  */
  ------------------
  |  | 4893|    769|      #define FASTLAZY         18  /* carry resolution point [1->18]  */
  ------------------
 5070|       |        /* spin up the accumulator resolving overflows  */
 5071|   551k|        for (lp=zacc; lp<zacc+iacc; lp++) {
  ------------------
  |  Branch (5071:23): [True: 550k, False: 769]
  ------------------
 5072|   550k|          if (*lp<FASTBASE) continue;        /* it fits  */
  ------------------
  |  | 4891|   550k|      #define FASTBASE 1000000000  /* base  */
  ------------------
  |  Branch (5072:15): [True: 244k, False: 305k]
  ------------------
 5073|   305k|          lcarry=*lp/FASTBASE;               /* top part [slow divide]  */
  ------------------
  |  | 4891|   305k|      #define FASTBASE 1000000000  /* base  */
  ------------------
 5074|       |          /* lcarry can exceed 2**32-1, so check again; this check  */
 5075|       |          /* and occasional extra divide (slow) is well worth it, as  */
 5076|       |          /* it allows FASTLAZY to be increased to 18 rather than 4  */
 5077|       |          /* in the FASTDIGS=9 case  */
 5078|   305k|          if (lcarry<FASTBASE) carry = static_cast<uInt>(lcarry); /* [usual]  */
  ------------------
  |  | 4891|   305k|      #define FASTBASE 1000000000  /* base  */
  ------------------
  |  Branch (5078:15): [True: 305k, False: 335]
  ------------------
 5079|    335|           else { /* two-place carry [fairly rare]  */
 5080|    335|            uInt carry2 = static_cast<uInt>(lcarry / FASTBASE);        /* top top part  */
  ------------------
  |  |   77|    335|  #define uInt   uint32_t
  ------------------
                          uInt carry2 = static_cast<uInt>(lcarry / FASTBASE);        /* top top part  */
  ------------------
  |  | 4891|    335|      #define FASTBASE 1000000000  /* base  */
  ------------------
 5081|    335|            *(lp+2)+=carry2;                        /* add to item+2  */
 5082|    335|            *lp -= (static_cast<uLong>(FASTBASE) * FASTBASE * carry2); /* [slow]  */
  ------------------
  |  | 4891|    335|      #define FASTBASE 1000000000  /* base  */
  ------------------
                          *lp -= (static_cast<uLong>(FASTBASE) * FASTBASE * carry2); /* [slow]  */
  ------------------
  |  | 4891|    335|      #define FASTBASE 1000000000  /* base  */
  ------------------
 5083|    335|            carry = static_cast<uInt>(lcarry - (static_cast<uLong>(FASTBASE) * carry2)); /* [inline]  */
  ------------------
  |  | 4891|    335|      #define FASTBASE 1000000000  /* base  */
  ------------------
 5084|    335|            }
 5085|   305k|          *(lp+1)+=carry;                    /* add to item above [inline]  */
 5086|   305k|          *lp -= (static_cast<uLong>(FASTBASE) * carry); /* [inline]  */
  ------------------
  |  | 4891|   305k|      #define FASTBASE 1000000000  /* base  */
  ------------------
 5087|   305k|          } /* carry resolution  */
 5088|    769|        } /* rip loop  */
 5089|       |
 5090|       |      /* The multiplication is complete; time to convert back into  */
 5091|       |      /* units.  This can be done in-place in the accumulator and in  */
 5092|       |      /* 32-bit operations, because carries were resolved after the  */
 5093|       |      /* final add.  This needs N-1 divides and multiplies for  */
 5094|       |      /* each item in the accumulator (which will become up to N  */
 5095|       |      /* units, where 2<=N<=9).  */
 5096|   551k|      for (lp=zacc, up=acc; lp<zacc+iacc; lp++) {
  ------------------
  |  Branch (5096:29): [True: 550k, False: 769]
  ------------------
 5097|   550k|        uInt item = static_cast<uInt>(*lp); /* decapitate to uInt  */
  ------------------
  |  |   77|   550k|  #define uInt   uint32_t
  ------------------
 5098|  4.95M|        for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
  ------------------
  |  | 4892|  4.95M|      #define FASTDIGS          9  /* digits in base  */
  ------------------
                      for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
  ------------------
  |  |   59|  4.95M|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
                      for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
  ------------------
  |  |   59|  4.40M|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
  |  Branch (5098:19): [True: 4.40M, False: 550k]
  ------------------
 5099|  4.40M|          uInt part=item/(DECDPUNMAX+1);
  ------------------
  |  |   77|  4.40M|  #define uInt   uint32_t
  ------------------
                        uInt part=item/(DECDPUNMAX+1);
  ------------------
  |  |  172|  4.40M|    #define DECDPUNMAX 9
  ------------------
 5100|  4.40M|          *up = static_cast<Unit>(item - (part * (DECDPUNMAX + 1)));
  ------------------
  |  |  172|  4.40M|    #define DECDPUNMAX 9
  ------------------
 5101|  4.40M|          item=part;
 5102|  4.40M|          } /* p  */
 5103|   550k|        *up = static_cast<Unit>(item); up++; /* [final needs no division]  */
 5104|   550k|        } /* lp  */
 5105|    769|      accunits = static_cast<int32_t>(up-acc);                       /* count of units  */
 5106|    769|      }
 5107|  1.25k|     else { /* here to use units directly, without chunking ['old code']  */
 5108|  1.25k|    #endif
 5109|       |
 5110|       |      /* if accumulator will be too long for local storage, then allocate  */
 5111|  1.25k|      acc=accbuff;                 /* -> assume buffer for accumulator  */
 5112|  1.25k|      needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit);
  ------------------
  |  |  238|  1.25k|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|  1.25k|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     43|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     43|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 1.21k, False: 43]
  |  |  ------------------
  ------------------
                    needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit);
  ------------------
  |  |  238|  1.25k|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|  1.25k|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 1.25k, False: 0]
  |  |  ------------------
  ------------------
 5113|  1.25k|      if (needbytes > static_cast<Int>(sizeof(accbuff))) {
  ------------------
  |  Branch (5113:11): [True: 28, False: 1.22k]
  ------------------
 5114|     28|        allocacc = static_cast<Unit*>(malloc(needbytes));
  ------------------
  |  |  309|     28|#define malloc(a) uprv_malloc(a)
  |  |  ------------------
  |  |  |  | 1524|     28|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|     28|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|     28|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|     28|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 5115|     28|        if (allocacc==nullptr) {*status|=DEC_Insufficient_storage; break;}
  ------------------
  |  |  148|      0|    #define DEC_Insufficient_storage 0x00000010 /* [when malloc fails]  */
  ------------------
  |  Branch (5115:13): [True: 0, False: 28]
  ------------------
 5116|     28|        acc = static_cast<Unit*>(allocacc); /* use the allocated space  */
 5117|     28|        }
 5118|       |
 5119|       |      /* Now the main long multiplication loop */
 5120|       |      /* Unlike the equivalent in the IBM Java implementation, there  */
 5121|       |      /* is no advantage in calculating from msu to lsu.  So, do it  */
 5122|       |      /* by the book, as it were.  */
 5123|       |      /* Each iteration calculates ACC=ACC+MULTAND*MULT  */
 5124|  1.25k|      accunits=1;                  /* accumulator starts at '0'  */
 5125|  1.25k|      *acc=0;                      /* .. (lsu=0)  */
 5126|  1.25k|      shift=0;                     /* no multiplicand shift at first  */
 5127|  1.25k|      madlength=D2U(lhs->digits);  /* this won't change  */
  ------------------
  |  |  238|  1.25k|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|  1.25k|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     43|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     43|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 1.21k, False: 43]
  |  |  ------------------
  ------------------
 5128|  1.25k|      mermsup=rhs->lsu+D2U(rhs->digits); /* -> msu+1 of multiplier  */
  ------------------
  |  |  238|  1.25k|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|  1.25k|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 1.25k, False: 0]
  |  |  ------------------
  ------------------
 5129|       |
 5130|  2.60k|      for (mer=rhs->lsu; mer<mermsup; mer++) {
  ------------------
  |  Branch (5130:26): [True: 1.35k, False: 1.25k]
  ------------------
 5131|       |        /* Here, *mer is the next Unit in the multiplier to use  */
 5132|       |        /* If non-zero [optimization] add it...  */
 5133|  1.35k|        if (*mer!=0) accunits=decUnitAddSub(&acc[shift], accunits-shift,
  ------------------
  |  Branch (5133:13): [True: 1.25k, False: 91]
  ------------------
 5134|  1.25k|                                            lhs->lsu, madlength, 0,
 5135|  1.25k|                                            &acc[shift], *mer)
 5136|  1.25k|                                            + shift;
 5137|     91|         else { /* extend acc with a 0; it will be used shortly  */
 5138|     91|          *(acc+accunits)=0;       /* [this avoids length of <=0 later]  */
 5139|     91|          accunits++;
 5140|     91|          }
 5141|       |        /* multiply multiplicand by 10**DECDPUN for next Unit to left  */
 5142|  1.35k|        shift++;                   /* add this for 'logical length'  */
 5143|  1.35k|        } /* n  */
 5144|  1.25k|    #if FASTMUL
 5145|  1.25k|      } /* unchunked units  */
 5146|  2.02k|    #endif
 5147|       |    /* common end-path  */
 5148|       |    #if DECTRACE
 5149|       |      decDumpAr('*', acc, accunits);         /* Show exact result  */
 5150|       |    #endif
 5151|       |
 5152|       |    /* acc now contains the exact result of the multiplication,  */
 5153|       |    /* possibly with a leading zero unit; build the decNumber from  */
 5154|       |    /* it, noting if any residue  */
 5155|  2.02k|    res->bits=bits;                          /* set sign  */
 5156|  2.02k|    res->digits=decGetDigits(acc, accunits); /* count digits exactly  */
 5157|       |
 5158|       |    /* There can be a 31-bit wrap in calculating the exponent.  */
 5159|       |    /* This can only happen if both input exponents are negative and  */
 5160|       |    /* both their magnitudes are large.  If there was a wrap, set a  */
 5161|       |    /* safe very negative exponent, from which decFinalize() will  */
 5162|       |    /* raise a hard underflow shortly.  */
 5163|  2.02k|    exponent=lhs->exponent+rhs->exponent;    /* calculate exponent  */
 5164|  2.02k|    if (lhs->exponent<0 && rhs->exponent<0 && exponent>0)
  ------------------
  |  Branch (5164:9): [True: 707, False: 1.31k]
  |  Branch (5164:28): [True: 304, False: 403]
  |  Branch (5164:47): [True: 0, False: 304]
  ------------------
 5165|      0|      exponent=-2*DECNUMMAXE;                /* force underflow  */
  ------------------
  |  |  155|      0|  #define DECNUMMAXE 999999999  /* maximum adjusted exponent ditto    */
  ------------------
 5166|  2.02k|    res->exponent=exponent;                  /* OK to overwrite now  */
 5167|       |
 5168|       |
 5169|       |    /* Set the coefficient.  If any rounding, residue records  */
 5170|  2.02k|    decSetCoeff(res, set, acc, res->digits, &residue, status);
 5171|  2.02k|    decFinish(res, set, &residue, status);   /* final cleanup  */
  ------------------
  |  |  297|  2.02k|#define decFinish(a,b,c,d) decFinalize(a,b,c,d)
  ------------------
 5172|  2.02k|    } while(0);                         /* end protected  */
  ------------------
  |  Branch (5172:13): [Folded - Ignored]
  ------------------
 5173|       |
 5174|  2.02k|  if (allocacc!=nullptr) free(allocacc);   /* drop any storage used  */
  ------------------
  |  |  310|    261|#define free(a) uprv_free(a)
  |  |  ------------------
  |  |  |  | 1503|    261|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|    261|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|    261|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|    261|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (5174:7): [True: 261, False: 1.76k]
  ------------------
 5175|       |  #if DECSUBSET
 5176|       |  if (allocrhs!=nullptr) free(allocrhs);   /* ..  */
 5177|       |  if (alloclhs!=nullptr) free(alloclhs);   /* ..  */
 5178|       |  #endif
 5179|  2.02k|  #if FASTMUL
 5180|  2.02k|  if (allocrhi!=nullptr) free(allocrhi);   /* ..  */
  ------------------
  |  |  310|      0|#define free(a) uprv_free(a)
  |  |  ------------------
  |  |  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (5180:7): [True: 0, False: 2.02k]
  ------------------
 5181|  2.02k|  if (alloclhi!=nullptr) free(alloclhi);   /* ..  */
  ------------------
  |  |  310|    255|#define free(a) uprv_free(a)
  |  |  ------------------
  |  |  |  | 1503|    255|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|    255|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|    255|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|    255|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (5181:7): [True: 255, False: 1.76k]
  ------------------
 5182|  2.02k|  #endif
 5183|  2.02k|  return res;
 5184|  2.02k|  } /* decMultiplyOp  */
decNumber.cpp:_ZL13decApplyRoundP9decNumberP10decContextiPj:
 7115|    529|                          uInt *status) {
 7116|    529|  Int  bump;                  /* 1 if coefficient needs to be incremented  */
  ------------------
  |  |   76|    529|  #define Int    int32_t
  ------------------
 7117|       |                              /* -1 if coefficient needs to be decremented  */
 7118|       |
 7119|    529|  if (residue==0) return;     /* nothing to apply  */
  ------------------
  |  Branch (7119:7): [True: 10, False: 519]
  ------------------
 7120|       |
 7121|    519|  bump=0;                     /* assume a smooth ride  */
 7122|       |
 7123|       |  /* now decide whether, and how, to round, depending on mode  */
 7124|    519|  switch (set->round) {
 7125|      0|    case DEC_ROUND_05UP: {    /* round zero or five up (for reround)  */
  ------------------
  |  Branch (7125:5): [True: 0, False: 519]
  ------------------
 7126|       |      /* This is the same as DEC_ROUND_DOWN unless there is a  */
 7127|       |      /* positive residue and the lsd of dn is 0 or 5, in which case  */
 7128|       |      /* it is bumped; when residue is <0, the number is therefore  */
 7129|       |      /* bumped down unless the final digit was 1 or 6 (in which  */
 7130|       |      /* case it is bumped down and then up -- a no-op)  */
 7131|      0|      Int lsd5=*dn->lsu%5;     /* get lsd and quintate  */
  ------------------
  |  |   76|      0|  #define Int    int32_t
  ------------------
 7132|      0|      if (residue<0 && lsd5!=1) bump=-1;
  ------------------
  |  Branch (7132:11): [True: 0, False: 0]
  |  Branch (7132:24): [True: 0, False: 0]
  ------------------
 7133|      0|       else if (residue>0 && lsd5==0) bump=1;
  ------------------
  |  Branch (7133:17): [True: 0, False: 0]
  |  Branch (7133:30): [True: 0, False: 0]
  ------------------
 7134|       |      /* [bump==1 could be applied directly; use common path for clarity]  */
 7135|      0|      break;} /* r-05  */
 7136|       |
 7137|      0|    case DEC_ROUND_DOWN: {
  ------------------
  |  Branch (7137:5): [True: 0, False: 519]
  ------------------
 7138|       |      /* no change, except if negative residue  */
 7139|      0|      if (residue<0) bump=-1;
  ------------------
  |  Branch (7139:11): [True: 0, False: 0]
  ------------------
 7140|      0|      break;} /* r-d  */
 7141|       |
 7142|      0|    case DEC_ROUND_HALF_DOWN: {
  ------------------
  |  Branch (7142:5): [True: 0, False: 519]
  ------------------
 7143|      0|      if (residue>5) bump=1;
  ------------------
  |  Branch (7143:11): [True: 0, False: 0]
  ------------------
 7144|      0|      break;} /* r-h-d  */
 7145|       |
 7146|    519|    case DEC_ROUND_HALF_EVEN: {
  ------------------
  |  Branch (7146:5): [True: 519, False: 0]
  ------------------
 7147|    519|      if (residue>5) bump=1;            /* >0.5 goes up  */
  ------------------
  |  Branch (7147:11): [True: 146, False: 373]
  ------------------
 7148|    373|       else if (residue==5) {           /* exactly 0.5000...  */
  ------------------
  |  Branch (7148:17): [True: 6, False: 367]
  ------------------
 7149|       |        /* 0.5 goes up iff [new] lsd is odd  */
 7150|      6|        if (*dn->lsu & 0x01) bump=1;
  ------------------
  |  Branch (7150:13): [True: 3, False: 3]
  ------------------
 7151|      6|        }
 7152|    519|      break;} /* r-h-e  */
 7153|       |
 7154|      0|    case DEC_ROUND_HALF_UP: {
  ------------------
  |  Branch (7154:5): [True: 0, False: 519]
  ------------------
 7155|      0|      if (residue>=5) bump=1;
  ------------------
  |  Branch (7155:11): [True: 0, False: 0]
  ------------------
 7156|      0|      break;} /* r-h-u  */
 7157|       |
 7158|      0|    case DEC_ROUND_UP: {
  ------------------
  |  Branch (7158:5): [True: 0, False: 519]
  ------------------
 7159|      0|      if (residue>0) bump=1;
  ------------------
  |  Branch (7159:11): [True: 0, False: 0]
  ------------------
 7160|      0|      break;} /* r-u  */
 7161|       |
 7162|      0|    case DEC_ROUND_CEILING: {
  ------------------
  |  Branch (7162:5): [True: 0, False: 519]
  ------------------
 7163|       |      /* same as _UP for positive numbers, and as _DOWN for negatives  */
 7164|       |      /* [negative residue cannot occur on 0]  */
 7165|      0|      if (decNumberIsNegative(dn)) {
  ------------------
  |  |  189|      0|  #define decNumberIsNegative(dn)  (((dn)->bits&DECNEG)!=0)
  |  |  ------------------
  |  |  |  |   44|      0|  #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
  |  |  ------------------
  |  |  |  Branch (189:36): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 7166|      0|        if (residue<0) bump=-1;
  ------------------
  |  Branch (7166:13): [True: 0, False: 0]
  ------------------
 7167|      0|        }
 7168|      0|       else {
 7169|      0|        if (residue>0) bump=1;
  ------------------
  |  Branch (7169:13): [True: 0, False: 0]
  ------------------
 7170|      0|        }
 7171|      0|      break;} /* r-c  */
 7172|       |
 7173|      0|    case DEC_ROUND_FLOOR: {
  ------------------
  |  Branch (7173:5): [True: 0, False: 519]
  ------------------
 7174|       |      /* same as _UP for negative numbers, and as _DOWN for positive  */
 7175|       |      /* [negative residue cannot occur on 0]  */
 7176|      0|      if (!decNumberIsNegative(dn)) {
  ------------------
  |  |  189|      0|  #define decNumberIsNegative(dn)  (((dn)->bits&DECNEG)!=0)
  |  |  ------------------
  |  |  |  |   44|      0|  #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
  |  |  ------------------
  ------------------
  |  Branch (7176:11): [True: 0, False: 0]
  ------------------
 7177|      0|        if (residue<0) bump=-1;
  ------------------
  |  Branch (7177:13): [True: 0, False: 0]
  ------------------
 7178|      0|        }
 7179|      0|       else {
 7180|      0|        if (residue>0) bump=1;
  ------------------
  |  Branch (7180:13): [True: 0, False: 0]
  ------------------
 7181|      0|        }
 7182|      0|      break;} /* r-f  */
 7183|       |
 7184|      0|    default: {      /* e.g., DEC_ROUND_MAX  */
  ------------------
  |  Branch (7184:5): [True: 0, False: 519]
  ------------------
 7185|      0|      *status|=DEC_Invalid_context;
  ------------------
  |  |  150|      0|    #define DEC_Invalid_context      0x00000040
  ------------------
 7186|       |      #if DECTRACE || (DECCHECK && DECVERB)
 7187|       |      printf("Unknown rounding mode: %d\n", set->round);
 7188|       |      #endif
 7189|      0|      break;}
 7190|    519|    } /* switch  */
 7191|       |
 7192|       |  /* now bump the number, up or down, if need be  */
 7193|    519|  if (bump==0) return;                       /* no action required  */
  ------------------
  |  Branch (7193:7): [True: 370, False: 149]
  ------------------
 7194|       |
 7195|       |  /* Simply use decUnitAddSub unless bumping up and the number is  */
 7196|       |  /* all nines.  In this special case set to 100... explicitly  */
 7197|       |  /* and adjust the exponent by one (as otherwise could overflow  */
 7198|       |  /* the array)  */
 7199|       |  /* Similarly handle all-nines result if bumping down.  */
 7200|    149|  if (bump>0) {
  ------------------
  |  Branch (7200:7): [True: 149, False: 0]
  ------------------
 7201|    149|    Unit *up;                                /* work  */
  ------------------
  |  |   78|    149|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|    149|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 7202|    149|    uInt count=dn->digits;                   /* digits to be checked  */
  ------------------
  |  |   77|    149|  #define uInt   uint32_t
  ------------------
 7203|    392|    for (up=dn->lsu; ; up++) {
 7204|    392|      if (count<=DECDPUN) {
  ------------------
  |  |   59|    392|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
  |  Branch (7204:11): [True: 14, False: 378]
  ------------------
 7205|       |        /* this is the last Unit (the msu)  */
 7206|     14|        if (*up!=powers[count]-1) break;     /* not still 9s  */
  ------------------
  |  |  193|     14|#define powers      DECPOWERS      /* old internal name  */
  ------------------
  |  Branch (7206:13): [True: 9, False: 5]
  ------------------
 7207|       |        /* here if it, too, is all nines  */
 7208|      5|        *up = static_cast<Unit>(powers[count - 1]); /* here 999 -> 100 etc.  */
  ------------------
  |  |  193|      5|#define powers      DECPOWERS      /* old internal name  */
  ------------------
 7209|     44|        for (up=up-1; up>=dn->lsu; up--) *up=0; /* others all to 0  */
  ------------------
  |  Branch (7209:23): [True: 39, False: 5]
  ------------------
 7210|      5|        dn->exponent++;                      /* and bump exponent  */
 7211|       |        /* [which, very rarely, could cause Overflow...]  */
 7212|      5|        if ((dn->exponent+dn->digits)>set->emax+1) {
  ------------------
  |  Branch (7212:13): [True: 0, False: 5]
  ------------------
 7213|      0|          decSetOverflow(dn, set, status);
 7214|      0|          }
 7215|      5|        return;                              /* done  */
 7216|     14|        }
 7217|       |      /* a full unit to check, with more to come  */
 7218|    378|      if (*up!=DECDPUNMAX) break;            /* not still 9s  */
  ------------------
  |  |  172|    378|    #define DECDPUNMAX 9
  ------------------
  |  Branch (7218:11): [True: 135, False: 243]
  ------------------
 7219|    243|      count-=DECDPUN;
  ------------------
  |  |   59|    243|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 7220|    243|      } /* up  */
 7221|    149|    } /* bump>0  */
 7222|      0|   else {                                    /* -1  */
 7223|       |    /* here checking for a pre-bump of 1000... (leading 1, all  */
 7224|       |    /* other digits zero)  */
 7225|      0|    Unit *up, *sup;                          /* work  */
  ------------------
  |  |   78|      0|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|      0|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 7226|      0|    uInt count=dn->digits;                   /* digits to be checked  */
  ------------------
  |  |   77|      0|  #define uInt   uint32_t
  ------------------
 7227|      0|    for (up=dn->lsu; ; up++) {
 7228|      0|      if (count<=DECDPUN) {
  ------------------
  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
  |  Branch (7228:11): [True: 0, False: 0]
  ------------------
 7229|       |        /* this is the last Unit (the msu)  */
 7230|      0|        if (*up!=powers[count-1]) break;     /* not 100..  */
  ------------------
  |  |  193|      0|#define powers      DECPOWERS      /* old internal name  */
  ------------------
  |  Branch (7230:13): [True: 0, False: 0]
  ------------------
 7231|       |        /* here if have the 1000... case  */
 7232|      0|        sup=up;                              /* save msu pointer  */
 7233|      0|        *up = static_cast<Unit>(powers[count]) - 1; /* here 100 in msu -> 999  */
  ------------------
  |  |  193|      0|#define powers      DECPOWERS      /* old internal name  */
  ------------------
 7234|       |        /* others all to all-nines, too  */
 7235|      0|        for (up=up-1; up>=dn->lsu; up--) *up = static_cast<Unit>(powers[DECDPUN]) - 1;
  ------------------
  |  |  193|      0|#define powers      DECPOWERS      /* old internal name  */
  ------------------
                      for (up=up-1; up>=dn->lsu; up--) *up = static_cast<Unit>(powers[DECDPUN]) - 1;
  ------------------
  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
  |  Branch (7235:23): [True: 0, False: 0]
  ------------------
 7236|      0|        dn->exponent--;                      /* and bump exponent  */
 7237|       |
 7238|       |        /* iff the number was at the subnormal boundary (exponent=etiny)  */
 7239|       |        /* then the exponent is now out of range, so it will in fact get  */
 7240|       |        /* clamped to etiny and the final 9 dropped.  */
 7241|       |        /* printf(">> emin=%d exp=%d sdig=%d\n", set->emin,  */
 7242|       |        /*        dn->exponent, set->digits);  */
 7243|      0|        if (dn->exponent+1==set->emin-set->digits+1) {
  ------------------
  |  Branch (7243:13): [True: 0, False: 0]
  ------------------
 7244|      0|          if (count==1 && dn->digits==1) *sup=0;  /* here 9 -> 0[.9]  */
  ------------------
  |  Branch (7244:15): [True: 0, False: 0]
  |  Branch (7244:27): [True: 0, False: 0]
  ------------------
 7245|      0|           else {
 7246|      0|            *sup = static_cast<Unit>(powers[count - 1]) - 1; /* here 999.. in msu -> 99..  */
  ------------------
  |  |  193|      0|#define powers      DECPOWERS      /* old internal name  */
  ------------------
 7247|      0|            dn->digits--;
 7248|      0|            }
 7249|      0|          dn->exponent++;
 7250|      0|          *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
  ------------------
  |  |  159|      0|    #define DEC_Underflow            0x00002000
  ------------------
                        *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
  ------------------
  |  |  158|      0|    #define DEC_Subnormal            0x00001000
  ------------------
                        *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
  ------------------
  |  |  149|      0|    #define DEC_Inexact              0x00000020
  ------------------
                        *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
  ------------------
  |  |  157|      0|    #define DEC_Rounded              0x00000800
  ------------------
 7251|      0|          }
 7252|      0|        return;                              /* done  */
 7253|      0|        }
 7254|       |
 7255|       |      /* a full unit to check, with more to come  */
 7256|      0|      if (*up!=0) break;                     /* not still 0s  */
  ------------------
  |  Branch (7256:11): [True: 0, False: 0]
  ------------------
 7257|      0|      count-=DECDPUN;
  ------------------
  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 7258|      0|      } /* up  */
 7259|       |
 7260|      0|    } /* bump<0  */
 7261|       |
 7262|       |  /* Actual bump needed.  Do it.  */
 7263|    144|  decUnitAddSub(dn->lsu, D2U(dn->digits), uarrone, 1, 0, dn->lsu, bump);
  ------------------
  |  |  238|    144|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|    144|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      3|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      3|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 141, False: 3]
  |  |  ------------------
  ------------------
 7264|    144|  } /* decApplyRound  */
decNumber.cpp:_ZL14decSetOverflowP9decNumberP10decContextPj:
 7391|     54|static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
 7392|     54|  Flag needmax=0;                  /* result is maximum finite value  */
  ------------------
  |  |   71|     54|  #define Flag   uint8_t
  ------------------
 7393|     54|  uByte sign=dn->bits&DECNEG;      /* clean and save sign bit  */
  ------------------
  |  |   73|     54|  #define uByte  uint8_t
  ------------------
                uByte sign=dn->bits&DECNEG;      /* clean and save sign bit  */
  ------------------
  |  |   44|     54|  #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
  ------------------
 7394|       |
 7395|     54|  if (ISZERO(dn)) {                /* zero does not overflow magnitude  */
  ------------------
  |  |  229|     54|  #define ISZERO(dn) decNumberIsZero(dn)     /* now just a local name */
  |  |  ------------------
  |  |  |  |  193|     54|  #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:37): [True: 37, False: 17]
  |  |  |  |  ------------------
  |  |  |  |  194|     54|                                    && (dn)->digits==1 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (194:40): [True: 26, False: 11]
  |  |  |  |  ------------------
  |  |  |  |  195|     54|                                    && (((dn)->bits&DECSPECIAL)==0))
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     26|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|     26|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   46|     26|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   47|     26|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (195:40): [True: 26, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7396|     26|    Int emax=set->emax;                      /* limit value  */
  ------------------
  |  |   76|     26|  #define Int    int32_t
  ------------------
 7397|     26|    if (set->clamp) emax-=set->digits-1;     /* lower if clamping  */
  ------------------
  |  Branch (7397:9): [True: 0, False: 26]
  ------------------
 7398|     26|    if (dn->exponent>emax) {                 /* clamp required  */
  ------------------
  |  Branch (7398:9): [True: 26, False: 0]
  ------------------
 7399|     26|      dn->exponent=emax;
 7400|     26|      *status|=DEC_Clamped;
  ------------------
  |  |  156|     26|    #define DEC_Clamped              0x00000400
  ------------------
 7401|     26|      }
 7402|     26|    return;
 7403|     26|    }
 7404|       |
 7405|     28|  uprv_decNumberZero(dn);
  ------------------
  |  | 1487|     28|#define uprv_decNumberZero U_ICU_ENTRY_POINT_RENAME(uprv_decNumberZero)
  |  |  ------------------
  |  |  |  |  123|     28|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     28|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     28|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7406|     28|  switch (set->round) {
 7407|      0|    case DEC_ROUND_DOWN: {
  ------------------
  |  Branch (7407:5): [True: 0, False: 28]
  ------------------
 7408|      0|      needmax=1;                   /* never Infinity  */
 7409|      0|      break;} /* r-d  */
 7410|      0|    case DEC_ROUND_05UP: {
  ------------------
  |  Branch (7410:5): [True: 0, False: 28]
  ------------------
 7411|      0|      needmax=1;                   /* never Infinity  */
 7412|      0|      break;} /* r-05  */
 7413|      0|    case DEC_ROUND_CEILING: {
  ------------------
  |  Branch (7413:5): [True: 0, False: 28]
  ------------------
 7414|      0|      if (sign) needmax=1;         /* Infinity if non-negative  */
  ------------------
  |  Branch (7414:11): [True: 0, False: 0]
  ------------------
 7415|      0|      break;} /* r-c  */
 7416|      0|    case DEC_ROUND_FLOOR: {
  ------------------
  |  Branch (7416:5): [True: 0, False: 28]
  ------------------
 7417|      0|      if (!sign) needmax=1;        /* Infinity if negative  */
  ------------------
  |  Branch (7417:11): [True: 0, False: 0]
  ------------------
 7418|      0|      break;} /* r-f  */
 7419|     28|    default: break;                /* Infinity in all other cases  */
  ------------------
  |  Branch (7419:5): [True: 28, False: 0]
  ------------------
 7420|     28|    }
 7421|     28|  if (needmax) {
  ------------------
  |  Branch (7421:7): [True: 0, False: 28]
  ------------------
 7422|      0|    decSetMaxValue(dn, set);
 7423|      0|    dn->bits=sign;                 /* set sign  */
 7424|      0|    }
 7425|     28|   else dn->bits=sign|DECINF;      /* Value is +/-Infinity  */
  ------------------
  |  |   45|     28|  #define DECINF    0x40      /* 1=Infinity                           */
  ------------------
 7426|     28|  *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
  ------------------
  |  |  155|     28|    #define DEC_Overflow             0x00000200
  ------------------
                *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
  ------------------
  |  |  149|     28|    #define DEC_Inexact              0x00000020
  ------------------
                *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
  ------------------
  |  |  157|     28|    #define DEC_Rounded              0x00000800
  ------------------
 7427|     28|  } /* decSetOverflow  */
decNumber.cpp:_ZL10decComparePK9decNumberS1_h:
 6215|    133|                      Flag abs_c) {
 6216|    133|  Int   result;                    /* result value  */
  ------------------
  |  |   76|    133|  #define Int    int32_t
  ------------------
 6217|    133|  Int   sigr;                      /* rhs signum  */
  ------------------
  |  |   76|    133|  #define Int    int32_t
  ------------------
 6218|    133|  Int   compare;                   /* work  */
  ------------------
  |  |   76|    133|  #define Int    int32_t
  ------------------
 6219|       |
 6220|    133|  result=1;                                  /* assume signum(lhs)  */
 6221|    133|  if (ISZERO(lhs)) result=0;
  ------------------
  |  |  229|    133|  #define ISZERO(dn) decNumberIsZero(dn)     /* now just a local name */
  |  |  ------------------
  |  |  |  |  193|    133|  #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:37): [True: 93, False: 40]
  |  |  |  |  ------------------
  |  |  |  |  194|    133|                                    && (dn)->digits==1 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (194:40): [True: 1, False: 92]
  |  |  |  |  ------------------
  |  |  |  |  195|    133|                                    && (((dn)->bits&DECSPECIAL)==0))
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|      1|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   46|      1|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   47|      1|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (195:40): [True: 1, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 6222|    133|  if (abs_c) {
  ------------------
  |  Branch (6222:7): [True: 133, False: 0]
  ------------------
 6223|    133|    if (ISZERO(rhs)) return result;          /* LHS wins or both 0  */
  ------------------
  |  |  229|    133|  #define ISZERO(dn) decNumberIsZero(dn)     /* now just a local name */
  |  |  ------------------
  |  |  |  |  193|    133|  #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:37): [True: 0, False: 133]
  |  |  |  |  ------------------
  |  |  |  |  194|    133|                                    && (dn)->digits==1 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (194:40): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  195|    133|                                    && (((dn)->bits&DECSPECIAL)==0))
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      0|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|      0|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   46|      0|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   47|      0|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (195:40): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 6224|       |    /* RHS is non-zero  */
 6225|    133|    if (result==0) return -1;                /* LHS is 0; RHS wins  */
  ------------------
  |  Branch (6225:9): [True: 1, False: 132]
  ------------------
 6226|       |    /* [here, both non-zero, result=1]  */
 6227|    133|    }
 6228|      0|   else {                                    /* signs matter  */
 6229|      0|    if (result && decNumberIsNegative(lhs)) result=-1;
  ------------------
  |  |  189|      0|  #define decNumberIsNegative(dn)  (((dn)->bits&DECNEG)!=0)
  |  |  ------------------
  |  |  |  |   44|      0|  #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
  |  |  ------------------
  |  |  |  Branch (189:36): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (6229:9): [True: 0, False: 0]
  ------------------
 6230|      0|    sigr=1;                                  /* compute signum(rhs)  */
 6231|      0|    if (ISZERO(rhs)) sigr=0;
  ------------------
  |  |  229|      0|  #define ISZERO(dn) decNumberIsZero(dn)     /* now just a local name */
  |  |  ------------------
  |  |  |  |  193|      0|  #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:37): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  194|      0|                                    && (dn)->digits==1 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (194:40): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  195|      0|                                    && (((dn)->bits&DECSPECIAL)==0))
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      0|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|      0|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   46|      0|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   47|      0|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (195:40): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 6232|      0|     else if (decNumberIsNegative(rhs)) sigr=-1;
  ------------------
  |  |  189|      0|  #define decNumberIsNegative(dn)  (((dn)->bits&DECNEG)!=0)
  |  |  ------------------
  |  |  |  |   44|      0|  #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
  |  |  ------------------
  |  |  |  Branch (189:36): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 6233|      0|    if (result > sigr) return +1;            /* L > R, return 1  */
  ------------------
  |  Branch (6233:9): [True: 0, False: 0]
  ------------------
 6234|      0|    if (result < sigr) return -1;            /* L < R, return -1  */
  ------------------
  |  Branch (6234:9): [True: 0, False: 0]
  ------------------
 6235|      0|    if (result==0) return 0;                   /* both 0  */
  ------------------
  |  Branch (6235:9): [True: 0, False: 0]
  ------------------
 6236|      0|    }
 6237|       |
 6238|       |  /* signums are the same; both are non-zero  */
 6239|    132|  if ((lhs->bits | rhs->bits) & DECINF) {    /* one or more infinities  */
  ------------------
  |  |   45|    132|  #define DECINF    0x40      /* 1=Infinity                           */
  ------------------
  |  Branch (6239:7): [True: 0, False: 132]
  ------------------
 6240|      0|    if (decNumberIsInfinite(rhs)) {
  ------------------
  |  |  187|      0|  #define decNumberIsInfinite(dn)  (((dn)->bits&DECINF)!=0)
  |  |  ------------------
  |  |  |  |   45|      0|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  ------------------
  |  |  |  Branch (187:36): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 6241|      0|      if (decNumberIsInfinite(lhs)) result=0;/* both infinite  */
  ------------------
  |  |  187|      0|  #define decNumberIsInfinite(dn)  (((dn)->bits&DECINF)!=0)
  |  |  ------------------
  |  |  |  |   45|      0|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  ------------------
  |  |  |  Branch (187:36): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 6242|      0|       else result=-result;                  /* only rhs infinite  */
 6243|      0|      }
 6244|      0|    return result;
 6245|      0|    }
 6246|       |  /* must compare the coefficients, allowing for exponents  */
 6247|    132|  if (lhs->exponent>rhs->exponent) {         /* LHS exponent larger  */
  ------------------
  |  Branch (6247:7): [True: 0, False: 132]
  ------------------
 6248|       |    /* swap sides, and sign  */
 6249|      0|    const decNumber *temp=lhs;
 6250|      0|    lhs=rhs;
 6251|      0|    rhs=temp;
 6252|      0|    result=-result;
 6253|      0|    }
 6254|    132|  compare=decUnitCompare(lhs->lsu, D2U(lhs->digits),
  ------------------
  |  |  238|    132|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|    132|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     67|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     67|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 65, False: 67]
  |  |  ------------------
  ------------------
 6255|    132|                         rhs->lsu, D2U(rhs->digits),
  ------------------
  |  |  238|    132|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|    132|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 132, False: 0]
  |  |  ------------------
  ------------------
 6256|    132|                         rhs->exponent-lhs->exponent);
 6257|    132|  if (compare!=BADINT) compare*=result;      /* comparison succeeded  */
  ------------------
  |  |  210|    132|#define BADINT  (Int)0x80000000    /* most-negative Int; error indicator  */
  ------------------
  |  Branch (6257:7): [True: 132, False: 0]
  ------------------
 6258|    132|  return compare;
 6259|    132|  } /* decCompare  */
decNumber.cpp:_ZL7decTrimP9decNumberP10decContexthhPi:
 6637|  1.33k|                           Flag noclamp, Int *dropped) {
 6638|  1.33k|  Int   d, exp;                    /* work  */
  ------------------
  |  |   76|  1.33k|  #define Int    int32_t
  ------------------
 6639|  1.33k|  uInt  cut;                       /* ..  */
  ------------------
  |  |   77|  1.33k|  #define uInt   uint32_t
  ------------------
 6640|  1.33k|  Unit  *up;                       /* -> current Unit  */
  ------------------
  |  |   78|  1.33k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  1.33k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 6641|       |
 6642|       |  #if DECCHECK
 6643|       |  if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
 6644|       |  #endif
 6645|       |
 6646|  1.33k|  *dropped=0;                           /* assume no zeros dropped  */
 6647|  1.33k|  if ((dn->bits & DECSPECIAL)           /* fast exit if special ..  */
  ------------------
  |  |   49|  1.33k|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  ------------------
  |  |  |  |   45|  1.33k|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  ------------------
  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  ------------------
  |  |  |  |   46|  1.33k|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  ------------------
  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  ------------------
  |  |  |  |   47|  1.33k|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  ------------------
  ------------------
  |  Branch (6647:7): [True: 0, False: 1.33k]
  ------------------
 6648|  1.33k|    || (*dn->lsu & 0x01)) return dn;    /* .. or odd  */
  ------------------
  |  Branch (6648:8): [True: 642, False: 693]
  ------------------
 6649|    693|  if (ISZERO(dn)) {                     /* .. or 0  */
  ------------------
  |  |  229|    693|  #define ISZERO(dn) decNumberIsZero(dn)     /* now just a local name */
  |  |  ------------------
  |  |  |  |  193|    693|  #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:37): [True: 250, False: 443]
  |  |  |  |  ------------------
  |  |  |  |  194|    693|                                    && (dn)->digits==1 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (194:40): [True: 52, False: 198]
  |  |  |  |  ------------------
  |  |  |  |  195|    693|                                    && (((dn)->bits&DECSPECIAL)==0))
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     52|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|     52|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   46|     52|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   47|     52|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (195:40): [True: 52, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 6650|     52|    dn->exponent=0;                     /* (sign is preserved)  */
 6651|     52|    return dn;
 6652|     52|    }
 6653|       |
 6654|       |  /* have a finite number which is even  */
 6655|    641|  exp=dn->exponent;
 6656|    641|  cut=1;                           /* digit (1-DECDPUN) in Unit  */
 6657|    641|  up=dn->lsu;                      /* -> current Unit  */
 6658|  10.6k|  for (d=0; d<dn->digits-1; d++) { /* [don't strip the final digit]  */
  ------------------
  |  Branch (6658:13): [True: 10.3k, False: 362]
  ------------------
 6659|       |    /* slice by powers  */
 6660|  10.3k|    #if DECDPUN<=4
 6661|  10.3k|      uInt quot=QUOT10(*up, cut);
  ------------------
  |  |   77|  10.3k|  #define uInt   uint32_t
  ------------------
                    uInt quot=QUOT10(*up, cut);
  ------------------
  |  |  240|  10.3k|  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
  ------------------
 6662|  10.3k|      if ((*up-quot*powers[cut])!=0) break;  /* found non-0 digit  */
  ------------------
  |  |  193|  10.3k|#define powers      DECPOWERS      /* old internal name  */
  ------------------
  |  Branch (6662:11): [True: 279, False: 10.0k]
  ------------------
 6663|       |    #else
 6664|       |      if (*up%powers[cut]!=0) break;         /* found non-0 digit  */
 6665|       |    #endif
 6666|       |    /* have a trailing 0  */
 6667|  10.0k|    if (!all) {                    /* trimming  */
  ------------------
  |  Branch (6667:9): [True: 0, False: 10.0k]
  ------------------
 6668|       |      /* [if exp>0 then all trailing 0s are significant for trim]  */
 6669|      0|      if (exp<=0) {                /* if digit might be significant  */
  ------------------
  |  Branch (6669:11): [True: 0, False: 0]
  ------------------
 6670|      0|        if (exp==0) break;         /* then quit  */
  ------------------
  |  Branch (6670:13): [True: 0, False: 0]
  ------------------
 6671|      0|        exp++;                     /* next digit might be significant  */
 6672|      0|        }
 6673|      0|      }
 6674|  10.0k|    cut++;                         /* next power  */
 6675|  10.0k|    if (cut>DECDPUN) {             /* need new Unit  */
  ------------------
  |  |   59|  10.0k|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
  |  Branch (6675:9): [True: 10.0k, False: 0]
  ------------------
 6676|  10.0k|      up++;
 6677|  10.0k|      cut=1;
 6678|  10.0k|      }
 6679|  10.0k|    } /* d  */
 6680|    641|  if (d==0) return dn;             /* none to drop  */
  ------------------
  |  Branch (6680:7): [True: 443, False: 198]
  ------------------
 6681|       |
 6682|       |  /* may need to limit drop if clamping  */
 6683|    198|  if (set->clamp && !noclamp) {
  ------------------
  |  Branch (6683:7): [True: 0, False: 198]
  |  Branch (6683:21): [True: 0, False: 0]
  ------------------
 6684|      0|    Int maxd=set->emax-set->digits+1-dn->exponent;
  ------------------
  |  |   76|      0|  #define Int    int32_t
  ------------------
 6685|      0|    if (maxd<=0) return dn;        /* nothing possible  */
  ------------------
  |  Branch (6685:9): [True: 0, False: 0]
  ------------------
 6686|      0|    if (d>maxd) d=maxd;
  ------------------
  |  Branch (6686:9): [True: 0, False: 0]
  ------------------
 6687|      0|    }
 6688|       |
 6689|       |  /* effect the drop  */
 6690|    198|  decShiftToLeast(dn->lsu, D2U(dn->digits), d);
  ------------------
  |  |  238|    198|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|    198|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|    132|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|    132|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 66, False: 132]
  |  |  ------------------
  ------------------
 6691|    198|  dn->exponent+=d;                 /* maintain numerical value  */
 6692|    198|  dn->digits-=d;                   /* new length  */
 6693|    198|  *dropped=d;                      /* report the count  */
 6694|    198|  return dn;
 6695|    198|  } /* decTrim  */
decNumber.cpp:_ZL14decShiftToMostPhii:
 6729|      4|static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
 6730|      4|  Unit  *target, *source, *first;  /* work  */
  ------------------
  |  |   78|      4|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|      4|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 6731|      4|  Int   cut;                       /* odd 0's to add  */
  ------------------
  |  |   76|      4|  #define Int    int32_t
  ------------------
 6732|      4|  uInt  next;                      /* work  */
  ------------------
  |  |   77|      4|  #define uInt   uint32_t
  ------------------
 6733|       |
 6734|      4|  if (shift==0) return digits;     /* [fastpath] nothing to do  */
  ------------------
  |  Branch (6734:7): [True: 0, False: 4]
  ------------------
 6735|      4|  if ((digits+shift)<=DECDPUN) {   /* [fastpath] single-unit case  */
  ------------------
  |  |   59|      4|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
  |  Branch (6735:7): [True: 0, False: 4]
  ------------------
 6736|      0|    *uar = static_cast<Unit>(*uar * powers[shift]);
  ------------------
  |  |  193|      0|#define powers      DECPOWERS      /* old internal name  */
  ------------------
 6737|      0|    return digits+shift;
 6738|      0|    }
 6739|       |
 6740|      4|  next=0;                          /* all paths  */
 6741|      4|  source=uar+D2U(digits)-1;        /* where msu comes from  */
  ------------------
  |  |  238|      4|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|      4|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 4, False: 0]
  |  |  ------------------
  ------------------
 6742|      4|  target=source+D2U(shift);        /* where upper part of first cut goes  */
  ------------------
  |  |  238|      4|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|      4|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 4, False: 0]
  |  |  ------------------
  ------------------
 6743|      4|  cut=DECDPUN-MSUDIGITS(shift);    /* where to slice  */
  ------------------
  |  |   59|      4|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
                cut=DECDPUN-MSUDIGITS(shift);    /* where to slice  */
  ------------------
  |  |  245|      4|  #define MSUDIGITS(d) ((d)-(D2U(d)-1)*DECDPUN)
  |  |  ------------------
  |  |  |  |  238|      4|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      4|  #define DECMAXD2U 49
  |  |  |  |  ------------------
  |  |  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  |  |  ------------------
  |  |  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (238:21): [True: 4, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                 #define MSUDIGITS(d) ((d)-(D2U(d)-1)*DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      4|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  ------------------
 6744|      4|  if (cut==0) {                    /* unit-boundary case  */
  ------------------
  |  Branch (6744:7): [True: 4, False: 0]
  ------------------
 6745|     14|    for (; source>=uar; source--, target--) *target=*source;
  ------------------
  |  Branch (6745:12): [True: 10, False: 4]
  ------------------
 6746|      4|    }
 6747|      0|   else {
 6748|      0|    first=uar+D2U(digits+shift)-1; /* where msu of source will end up  */
  ------------------
  |  |  238|      0|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|      0|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 6749|      0|    for (; source>=uar; source--, target--) {
  ------------------
  |  Branch (6749:12): [True: 0, False: 0]
  ------------------
 6750|       |      /* split the source Unit and accumulate remainder for next  */
 6751|      0|      #if DECDPUN<=4
 6752|      0|        uInt quot=QUOT10(*source, cut);
  ------------------
  |  |   77|      0|  #define uInt   uint32_t
  ------------------
                      uInt quot=QUOT10(*source, cut);
  ------------------
  |  |  240|      0|  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
  ------------------
 6753|      0|        uInt rem=*source-quot*powers[cut];
  ------------------
  |  |   77|      0|  #define uInt   uint32_t
  ------------------
                      uInt rem=*source-quot*powers[cut];
  ------------------
  |  |  193|      0|#define powers      DECPOWERS      /* old internal name  */
  ------------------
 6754|      0|        next+=quot;
 6755|       |      #else
 6756|       |        uInt rem=*source%powers[cut];
 6757|       |        next+=*source/powers[cut];
 6758|       |      #endif
 6759|      0|      if (target <= first) *target = static_cast<Unit>(next); /* write to target iff valid  */
  ------------------
  |  Branch (6759:11): [True: 0, False: 0]
  ------------------
 6760|      0|      next=rem*powers[DECDPUN-cut];            /* save remainder for next Unit  */
  ------------------
  |  |  193|      0|#define powers      DECPOWERS      /* old internal name  */
  ------------------
                    next=rem*powers[DECDPUN-cut];            /* save remainder for next Unit  */
  ------------------
  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 6761|      0|      }
 6762|      0|    } /* shift-move  */
 6763|       |
 6764|       |  /* propagate any partial unit to one below and clear the rest  */
 6765|      8|  for (; target>=uar; target--) {
  ------------------
  |  Branch (6765:10): [True: 4, False: 4]
  ------------------
 6766|      4|    *target = static_cast<Unit>(next);
 6767|      4|    next=0;
 6768|      4|    }
 6769|      4|  return digits+shift;
 6770|      4|  } /* decShiftToMost  */
decNumber.cpp:_ZL15decShiftToLeastPhii:
 6785|    198|static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
 6786|    198|  Unit  *target, *up;              /* work  */
  ------------------
  |  |   78|    198|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|    198|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 6787|    198|  Int   cut, count;                /* work  */
  ------------------
  |  |   76|    198|  #define Int    int32_t
  ------------------
 6788|    198|  Int   quot, rem;                 /* for division  */
  ------------------
  |  |   76|    198|  #define Int    int32_t
  ------------------
 6789|       |
 6790|    198|  if (shift==0) return units;      /* [fastpath] nothing to do  */
  ------------------
  |  Branch (6790:7): [True: 0, False: 198]
  ------------------
 6791|    198|  if (shift==units*DECDPUN) {      /* [fastpath] little to do  */
  ------------------
  |  |   59|    198|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
  |  Branch (6791:7): [True: 0, False: 198]
  ------------------
 6792|      0|    *uar=0;                        /* all digits cleared gives zero  */
 6793|      0|    return 1;                      /* leaves just the one  */
 6794|      0|    }
 6795|       |
 6796|    198|  target=uar;                      /* both paths  */
 6797|    198|  cut=MSUDIGITS(shift);
  ------------------
  |  |  245|    198|  #define MSUDIGITS(d) ((d)-(D2U(d)-1)*DECDPUN)
  |  |  ------------------
  |  |  |  |  238|    198|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  |  |  ------------------
  |  |  |  |  |  |  223|    198|  #define DECMAXD2U 49
  |  |  |  |  ------------------
  |  |  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|     14|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  |  |  ------------------
  |  |  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|     14|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (238:21): [True: 184, False: 14]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                 #define MSUDIGITS(d) ((d)-(D2U(d)-1)*DECDPUN)
  |  |  ------------------
  |  |  |  |   59|    198|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  ------------------
 6798|    198|  if (cut==DECDPUN) {              /* unit-boundary case; easy  */
  ------------------
  |  |   59|    198|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
  |  Branch (6798:7): [True: 198, False: 0]
  ------------------
 6799|    198|    up=uar+D2U(shift);
  ------------------
  |  |  238|    198|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|    198|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     14|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|     14|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 184, False: 14]
  |  |  ------------------
  ------------------
 6800|  2.63M|    for (; up<uar+units; target++, up++) *target=*up;
  ------------------
  |  Branch (6800:12): [True: 2.63M, False: 198]
  ------------------
 6801|    198|    return static_cast<int32_t>(target-uar);
 6802|    198|    }
 6803|       |
 6804|       |  /* messier  */
 6805|      0|  up=uar+D2U(shift-cut);           /* source; correct to whole Units  */
  ------------------
  |  |  238|      0|    #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |  223|      0|  #define DECMAXD2U 49
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |                   #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN)
  |  |  ------------------
  |  |  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  |  |  ------------------
  |  |  |  Branch (238:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 6806|      0|  count=units*DECDPUN-shift;       /* the maximum new length  */
  ------------------
  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 6807|      0|  #if DECDPUN<=4
 6808|      0|    quot=QUOT10(*up, cut);
  ------------------
  |  |  240|      0|  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
  ------------------
 6809|       |  #else
 6810|       |    quot=*up/powers[cut];
 6811|       |  #endif
 6812|      0|  for (; ; target++) {
 6813|      0|    *target = static_cast<Unit>(quot);
 6814|      0|    count-=(DECDPUN-cut);
  ------------------
  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 6815|      0|    if (count<=0) break;
  ------------------
  |  Branch (6815:9): [True: 0, False: 0]
  ------------------
 6816|      0|    up++;
 6817|      0|    quot=*up;
 6818|      0|    #if DECDPUN<=4
 6819|      0|      quot=QUOT10(quot, cut);
  ------------------
  |  |  240|      0|  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
  ------------------
 6820|      0|      rem=*up-quot*powers[cut];
  ------------------
  |  |  193|      0|#define powers      DECPOWERS      /* old internal name  */
  ------------------
 6821|       |    #else
 6822|       |      rem=quot%powers[cut];
 6823|       |      quot=quot/powers[cut];
 6824|       |    #endif
 6825|      0|    *target = static_cast<Unit>(*target + rem * powers[DECDPUN - cut]);
  ------------------
  |  |  193|      0|#define powers      DECPOWERS      /* old internal name  */
  ------------------
                  *target = static_cast<Unit>(*target + rem * powers[DECDPUN - cut]);
  ------------------
  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 6826|      0|    count-=cut;
 6827|      0|    if (count<=0) break;
  ------------------
  |  Branch (6827:9): [True: 0, False: 0]
  ------------------
 6828|      0|    }
 6829|      0|  return static_cast<int32_t>(target-uar+1);
 6830|    198|  } /* decShiftToLeast  */
decNumber.cpp:_ZL10decCopyFitP9decNumberPKS_P10decContextPiPj:
 6888|  1.33k|                       decContext *set, Int *residue, uInt *status) {
 6889|  1.33k|  dest->bits=src->bits;
 6890|  1.33k|  dest->exponent=src->exponent;
 6891|  1.33k|  decSetCoeff(dest, set, src->lsu, src->digits, residue, status);
 6892|  1.33k|  } /* decCopyFit  */
decNumber.cpp:_ZL11decSetCoeffP9decNumberP10decContextPKhiPiPj:
 6934|  3.51k|                        Int len, Int *residue, uInt *status) {
 6935|  3.51k|  Int   discard;              /* number of digits to discard  */
  ------------------
  |  |   76|  3.51k|  #define Int    int32_t
  ------------------
 6936|  3.51k|  uInt  cut;                  /* cut point in Unit  */
  ------------------
  |  |   77|  3.51k|  #define uInt   uint32_t
  ------------------
 6937|  3.51k|  const Unit *up;             /* work  */
 6938|  3.51k|  Unit  *target;              /* ..  */
  ------------------
  |  |   78|  3.51k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  3.51k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 6939|  3.51k|  Int   count;                /* ..  */
  ------------------
  |  |   76|  3.51k|  #define Int    int32_t
  ------------------
 6940|  3.51k|  #if DECDPUN<=4
 6941|  3.51k|  uInt  temp;                 /* ..  */
  ------------------
  |  |   77|  3.51k|  #define uInt   uint32_t
  ------------------
 6942|  3.51k|  #endif
 6943|       |
 6944|  3.51k|  discard=len-set->digits;    /* digits to discard  */
 6945|  3.51k|  if (discard<=0) {           /* no digits are being discarded  */
  ------------------
  |  Branch (6945:7): [True: 2.90k, False: 607]
  ------------------
 6946|  2.90k|    if (dn->lsu!=lsu) {       /* copy needed  */
  ------------------
  |  Branch (6946:9): [True: 1.56k, False: 1.33k]
  ------------------
 6947|       |      /* copy the coefficient array to the result number; no shift needed  */
 6948|  1.56k|      count=len;              /* avoids D2U  */
 6949|  1.56k|      up=lsu;
 6950|  27.5k|      for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
  ------------------
  |  |   59|  25.9k|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
  |  Branch (6950:28): [True: 25.9k, False: 1.56k]
  ------------------
 6951|  25.9k|        *target=*up;
 6952|  1.56k|      dn->digits=len;         /* set the new length  */
 6953|  1.56k|      }
 6954|       |    /* dn->exponent and residue are unchanged, record any inexactitude  */
 6955|  2.90k|    if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
  ------------------
  |  |  149|      0|    #define DEC_Inexact              0x00000020
  ------------------
                  if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
  ------------------
  |  |  157|      0|    #define DEC_Rounded              0x00000800
  ------------------
  |  Branch (6955:9): [True: 0, False: 2.90k]
  ------------------
 6956|  2.90k|    return;
 6957|  2.90k|    }
 6958|       |
 6959|       |  /* some digits must be discarded ...  */
 6960|    607|  dn->exponent+=discard;      /* maintain numerical value  */
 6961|    607|  *status|=DEC_Rounded;       /* accumulate Rounded status  */
  ------------------
  |  |  157|    607|    #define DEC_Rounded              0x00000800
  ------------------
 6962|    607|  if (*residue>1) *residue=1; /* previous residue now to right, so reduce  */
  ------------------
  |  Branch (6962:7): [True: 24, False: 583]
  ------------------
 6963|       |
 6964|    607|  if (discard>len) {          /* everything, +1, is being discarded  */
  ------------------
  |  Branch (6964:7): [True: 106, False: 501]
  ------------------
 6965|       |    /* guard digit is 0  */
 6966|       |    /* residue is all the number [NB could be all 0s]  */
 6967|    106|    if (*residue<=0) {        /* not already positive  */
  ------------------
  |  Branch (6967:9): [True: 40, False: 66]
  ------------------
 6968|     40|      count=len;              /* avoids D2U  */
 6969|    541|      for (up=lsu; count>0; up++, count-=DECDPUN) if (*up!=0) { /* found non-0  */
  ------------------
  |  |   59|    501|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
  |  Branch (6969:20): [True: 541, False: 0]
  |  Branch (6969:55): [True: 40, False: 501]
  ------------------
 6970|     40|        *residue=1;
 6971|     40|        break;                /* no need to check any others  */
 6972|     40|        }
 6973|     40|      }
 6974|    106|    if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude  */
  ------------------
  |  |  149|    106|    #define DEC_Inexact              0x00000020
  ------------------
  |  Branch (6974:9): [True: 106, False: 0]
  ------------------
 6975|    106|    *dn->lsu=0;               /* coefficient will now be 0  */
 6976|    106|    dn->digits=1;             /* ..  */
 6977|    106|    return;
 6978|    106|    } /* total discard  */
 6979|       |
 6980|       |  /* partial discard [most common case]  */
 6981|       |  /* here, at least the first (most significant) discarded digit exists  */
 6982|       |
 6983|       |  /* spin up the number, noting residue during the spin, until get to  */
 6984|       |  /* the Unit with the first discarded digit.  When reach it, extract  */
 6985|       |  /* it and remember its position  */
 6986|    501|  count=0;
 6987|  6.09M|  for (up=lsu;; up++) {
 6988|  6.09M|    count+=DECDPUN;
  ------------------
  |  |   59|  6.09M|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 6989|  6.09M|    if (count>=discard) break; /* full ones all checked  */
  ------------------
  |  Branch (6989:9): [True: 501, False: 6.09M]
  ------------------
 6990|  6.09M|    if (*up!=0) *residue=1;
  ------------------
  |  Branch (6990:9): [True: 2.77M, False: 3.31M]
  ------------------
 6991|  6.09M|    } /* up  */
 6992|       |
 6993|       |  /* here up -> Unit with first discarded digit  */
 6994|    501|  cut=discard-(count-DECDPUN)-1;
  ------------------
  |  |   59|    501|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 6995|    501|  if (cut==DECDPUN-1) {       /* unit-boundary case (fast)  */
  ------------------
  |  |   59|    501|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
  |  Branch (6995:7): [True: 501, False: 0]
  ------------------
 6996|    501|    Unit half = static_cast<Unit>(powers[DECDPUN]) >> 1;
  ------------------
  |  |   78|    501|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|    501|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
                  Unit half = static_cast<Unit>(powers[DECDPUN]) >> 1;
  ------------------
  |  |  193|    501|#define powers      DECPOWERS      /* old internal name  */
  ------------------
                  Unit half = static_cast<Unit>(powers[DECDPUN]) >> 1;
  ------------------
  |  |   59|    501|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 6997|       |    /* set residue directly  */
 6998|    501|    if (*up>=half) {
  ------------------
  |  Branch (6998:9): [True: 164, False: 337]
  ------------------
 6999|    164|      if (*up>half) *residue=7;
  ------------------
  |  Branch (6999:11): [True: 129, False: 35]
  ------------------
 7000|     35|      else *residue+=5;       /* add sticky bit  */
 7001|    164|      }
 7002|    337|     else { /* <half  */
 7003|    337|      if (*up!=0) *residue=3; /* [else is 0, leave as sticky bit]  */
  ------------------
  |  Branch (7003:11): [True: 123, False: 214]
  ------------------
 7004|    337|      }
 7005|    501|    if (set->digits<=0) {     /* special for Quantize/Subnormal :-(  */
  ------------------
  |  Branch (7005:9): [True: 4, False: 497]
  ------------------
 7006|      4|      *dn->lsu=0;             /* .. result is 0  */
 7007|      4|      dn->digits=1;           /* ..  */
 7008|      4|      }
 7009|    497|     else {                   /* shift to least  */
 7010|    497|      count=set->digits;      /* now digits to end up with  */
 7011|    497|      dn->digits=count;       /* set the new length  */
 7012|    497|      up++;                   /* move to next  */
 7013|       |      /* on unit boundary, so shift-down copy loop is simple  */
 7014|   532k|      for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
  ------------------
  |  |   59|   531k|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
  |  Branch (7014:28): [True: 531k, False: 497]
  ------------------
 7015|   531k|        *target=*up;
 7016|    497|      }
 7017|    501|    } /* unit-boundary case  */
 7018|       |
 7019|      0|   else { /* discard digit is in low digit(s), and not top digit  */
 7020|      0|    uInt  discard1;                /* first discarded digit  */
  ------------------
  |  |   77|      0|  #define uInt   uint32_t
  ------------------
 7021|      0|    uInt  quot, rem;               /* for divisions  */
  ------------------
  |  |   77|      0|  #define uInt   uint32_t
  ------------------
 7022|      0|    if (cut==0) quot=*up;          /* is at bottom of unit  */
  ------------------
  |  Branch (7022:9): [True: 0, False: 0]
  ------------------
 7023|      0|     else /* cut>0 */ {            /* it's not at bottom of unit  */
 7024|      0|      #if DECDPUN<=4
 7025|      0|        U_ASSERT(/* cut >= 0 &&*/ cut <= 4);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 7026|      0|        quot=QUOT10(*up, cut);
  ------------------
  |  |  240|      0|  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
  ------------------
 7027|      0|        rem=*up-quot*powers[cut];
  ------------------
  |  |  193|      0|#define powers      DECPOWERS      /* old internal name  */
  ------------------
 7028|       |      #else
 7029|       |        rem=*up%powers[cut];
 7030|       |        quot=*up/powers[cut];
 7031|       |      #endif
 7032|      0|      if (rem!=0) *residue=1;
  ------------------
  |  Branch (7032:11): [True: 0, False: 0]
  ------------------
 7033|      0|      }
 7034|       |    /* discard digit is now at bottom of quot  */
 7035|      0|    #if DECDPUN<=4
 7036|      0|      temp=(quot*6554)>>16;        /* fast /10  */
 7037|       |      /* Vowels algorithm here not a win (9 instructions)  */
 7038|      0|      discard1=quot-X10(temp);
  ------------------
  |  |  135|      0|  #define X10(i)  (((i)<<1)+((i)<<3))
  ------------------
 7039|      0|      quot=temp;
 7040|       |    #else
 7041|       |      discard1=quot%10;
 7042|       |      quot=quot/10;
 7043|       |    #endif
 7044|       |    /* here, discard1 is the guard digit, and residue is everything  */
 7045|       |    /* else [use mapping array to accumulate residue safely]  */
 7046|      0|    *residue+=resmap[discard1];
 7047|      0|    cut++;                         /* update cut  */
 7048|       |    /* here: up -> Unit of the array with bottom digit  */
 7049|       |    /*       cut is the division point for each Unit  */
 7050|       |    /*       quot holds the uncut high-order digits for the current unit  */
 7051|      0|    if (set->digits<=0) {          /* special for Quantize/Subnormal :-(  */
  ------------------
  |  Branch (7051:9): [True: 0, False: 0]
  ------------------
 7052|      0|      *dn->lsu=0;                  /* .. result is 0  */
 7053|      0|      dn->digits=1;                /* ..  */
 7054|      0|      }
 7055|      0|     else {                        /* shift to least needed  */
 7056|      0|      count=set->digits;           /* now digits to end up with  */
 7057|      0|      dn->digits=count;            /* set the new length  */
 7058|       |      /* shift-copy the coefficient array to the result number  */
 7059|      0|      for (target=dn->lsu; ; target++) {
 7060|      0|        *target = static_cast<Unit>(quot);
 7061|      0|        count-=(DECDPUN-cut);
  ------------------
  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 7062|      0|        if (count<=0) break;
  ------------------
  |  Branch (7062:13): [True: 0, False: 0]
  ------------------
 7063|      0|        up++;
 7064|      0|        quot=*up;
 7065|      0|        #if DECDPUN<=4
 7066|      0|          quot=QUOT10(quot, cut);
  ------------------
  |  |  240|      0|  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
  ------------------
 7067|      0|          rem=*up-quot*powers[cut];
  ------------------
  |  |  193|      0|#define powers      DECPOWERS      /* old internal name  */
  ------------------
 7068|       |        #else
 7069|       |          rem=quot%powers[cut];
 7070|       |          quot=quot/powers[cut];
 7071|       |        #endif
 7072|      0|        *target = static_cast<Unit>(*target + rem * powers[DECDPUN - cut]);
  ------------------
  |  |  193|      0|#define powers      DECPOWERS      /* old internal name  */
  ------------------
                      *target = static_cast<Unit>(*target + rem * powers[DECDPUN - cut]);
  ------------------
  |  |   59|      0|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 7073|      0|        count-=cut;
 7074|      0|        if (count<=0) break;
  ------------------
  |  Branch (7074:13): [True: 0, False: 0]
  ------------------
 7075|      0|        } /* shift-copy loop  */
 7076|      0|      } /* shift to least  */
 7077|      0|    } /* not unit boundary  */
 7078|       |
 7079|    501|  if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude  */
  ------------------
  |  |  149|    483|    #define DEC_Inexact              0x00000020
  ------------------
  |  Branch (7079:7): [True: 483, False: 18]
  ------------------
 7080|    501|  } /* decSetCoeff  */
decNumber.cpp:_ZL11decFinalizeP9decNumberP10decContextPiPj:
 7319|  3.50k|                        uInt *status) {
 7320|  3.50k|  Int shift;                            /* shift needed if clamping  */
  ------------------
  |  |   76|  3.50k|  #define Int    int32_t
  ------------------
 7321|  3.50k|  Int tinyexp=set->emin-dn->digits+1;   /* precalculate subnormal boundary  */
  ------------------
  |  |   76|  3.50k|  #define Int    int32_t
  ------------------
 7322|       |
 7323|       |  /* Must be careful, here, when checking the exponent as the  */
 7324|       |  /* adjusted exponent could overflow 31 bits [because it may already  */
 7325|       |  /* be up to twice the expected].  */
 7326|       |
 7327|       |  /* First test for subnormal.  This must be done before any final  */
 7328|       |  /* round as the result could be rounded to Nmin or 0.  */
 7329|  3.50k|  if (dn->exponent<=tinyexp) {          /* prefilter  */
  ------------------
  |  Branch (7329:7): [True: 374, False: 3.13k]
  ------------------
 7330|    374|    Int comp;
  ------------------
  |  |   76|    374|  #define Int    int32_t
  ------------------
 7331|    374|    decNumber nmin;
 7332|       |    /* A very nasty case here is dn == Nmin and residue<0  */
 7333|    374|    if (dn->exponent<tinyexp) {
  ------------------
  |  Branch (7333:9): [True: 241, False: 133]
  ------------------
 7334|       |      /* Go handle subnormals; this will apply round if needed.  */
 7335|    241|      decSetSubnormal(dn, set, residue, status);
 7336|    241|      return;
 7337|    241|      }
 7338|       |    /* Equals case: only subnormal if dn=Nmin and negative residue  */
 7339|    133|    uprv_decNumberZero(&nmin);
  ------------------
  |  | 1487|    133|#define uprv_decNumberZero U_ICU_ENTRY_POINT_RENAME(uprv_decNumberZero)
  |  |  ------------------
  |  |  |  |  123|    133|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    133|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    133|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7340|    133|    nmin.lsu[0]=1;
 7341|    133|    nmin.exponent=set->emin;
 7342|    133|    comp=decCompare(dn, &nmin, 1);                /* (signless compare)  */
 7343|    133|    if (comp==BADINT) {                           /* oops  */
  ------------------
  |  |  210|    133|#define BADINT  (Int)0x80000000    /* most-negative Int; error indicator  */
  ------------------
  |  Branch (7343:9): [True: 0, False: 133]
  ------------------
 7344|      0|      *status|=DEC_Insufficient_storage;          /* abandon...  */
  ------------------
  |  |  148|      0|    #define DEC_Insufficient_storage 0x00000010 /* [when malloc fails]  */
  ------------------
 7345|      0|      return;
 7346|      0|      }
 7347|    133|    if (*residue<0 && comp==0) {                  /* neg residue and dn==Nmin  */
  ------------------
  |  Branch (7347:9): [True: 0, False: 133]
  |  Branch (7347:23): [True: 0, False: 0]
  ------------------
 7348|      0|      decApplyRound(dn, set, *residue, status);   /* might force down  */
 7349|      0|      decSetSubnormal(dn, set, residue, status);
 7350|      0|      return;
 7351|      0|      }
 7352|    133|    }
 7353|       |
 7354|       |  /* now apply any pending round (this could raise overflow).  */
 7355|  3.26k|  if (*residue!=0) decApplyRound(dn, set, *residue, status);
  ------------------
  |  Branch (7355:7): [True: 376, False: 2.89k]
  ------------------
 7356|       |
 7357|       |  /* Check for overflow [redundant in the 'rare' case] or clamp  */
 7358|  3.26k|  if (dn->exponent<=set->emax-set->digits+1) return;   /* neither needed  */
  ------------------
  |  Branch (7358:7): [True: 3.20k, False: 62]
  ------------------
 7359|       |
 7360|       |
 7361|       |  /* here when might have an overflow or clamp to do  */
 7362|     62|  if (dn->exponent>set->emax-dn->digits+1) {           /* too big  */
  ------------------
  |  Branch (7362:7): [True: 54, False: 8]
  ------------------
 7363|     54|    decSetOverflow(dn, set, status);
 7364|     54|    return;
 7365|     54|    }
 7366|       |  /* here when the result is normal but in clamp range  */
 7367|      8|  if (!set->clamp) return;
  ------------------
  |  Branch (7367:7): [True: 8, False: 0]
  ------------------
 7368|       |
 7369|       |  /* here when need to apply the IEEE exponent clamp (fold-down)  */
 7370|      0|  shift=dn->exponent-(set->emax-set->digits+1);
 7371|       |
 7372|       |  /* shift coefficient (if non-zero)  */
 7373|      0|  if (!ISZERO(dn)) {
  ------------------
  |  |  229|      0|  #define ISZERO(dn) decNumberIsZero(dn)     /* now just a local name */
  |  |  ------------------
  |  |  |  |  193|      0|  #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:37): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  194|      0|                                    && (dn)->digits==1 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (194:40): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  195|      0|                                    && (((dn)->bits&DECSPECIAL)==0))
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      0|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|      0|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   46|      0|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   47|      0|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (195:40): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7374|      0|    dn->digits=decShiftToMost(dn->lsu, dn->digits, shift);
 7375|      0|    }
 7376|      0|  dn->exponent-=shift;   /* adjust the exponent to match  */
 7377|      0|  *status|=DEC_Clamped;  /* and record the dirty deed  */
  ------------------
  |  |  156|      0|    #define DEC_Clamped              0x00000400
  ------------------
 7378|      0|  } /* decFinalize  */
decNumber.cpp:_ZL15decSetSubnormalP9decNumberP10decContextPiPj:
 7472|    241|                            uInt *status) {
 7473|    241|  decContext workset;         /* work  */
 7474|    241|  Int        etiny, adjust;   /* ..  */
  ------------------
  |  |   76|    241|  #define Int    int32_t
  ------------------
 7475|       |
 7476|       |  #if DECSUBSET
 7477|       |  /* simple set to zero and 'hard underflow' for subset  */
 7478|       |  if (!set->extended) {
 7479|       |    uprv_decNumberZero(dn);
 7480|       |    /* always full overflow  */
 7481|       |    *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
 7482|       |    return;
 7483|       |    }
 7484|       |  #endif
 7485|       |
 7486|       |  /* Full arithmetic -- allow subnormals, rounded to minimum exponent  */
 7487|       |  /* (Etiny) if needed  */
 7488|    241|  etiny=set->emin-(set->digits-1);      /* smallest allowed exponent  */
 7489|       |
 7490|    241|  if ISZERO(dn) {                       /* value is zero  */
  ------------------
  |  |  229|    241|  #define ISZERO(dn) decNumberIsZero(dn)     /* now just a local name */
  |  |  ------------------
  |  |  |  |  193|    241|  #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:37): [True: 165, False: 76]
  |  |  |  |  ------------------
  |  |  |  |  194|    241|                                    && (dn)->digits==1 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (194:40): [True: 67, False: 98]
  |  |  |  |  ------------------
  |  |  |  |  195|    241|                                    && (((dn)->bits&DECSPECIAL)==0))
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     67|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|     67|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   46|     67|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   47|     67|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (195:40): [True: 67, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7491|       |    /* residue can never be non-zero here  */
 7492|       |    #if DECCHECK
 7493|       |      if (*residue!=0) {
 7494|       |        printf("++ Subnormal 0 residue %ld\n", (LI)*residue);
 7495|       |        *status|=DEC_Invalid_operation;
 7496|       |        }
 7497|       |    #endif
 7498|     67|    if (dn->exponent<etiny) {           /* clamp required  */
  ------------------
  |  Branch (7498:9): [True: 23, False: 44]
  ------------------
 7499|     23|      dn->exponent=etiny;
 7500|     23|      *status|=DEC_Clamped;
  ------------------
  |  |  156|     23|    #define DEC_Clamped              0x00000400
  ------------------
 7501|     23|      }
 7502|     67|    return;
 7503|     67|    }
 7504|       |
 7505|    174|  *status|=DEC_Subnormal;               /* have a non-zero subnormal  */
  ------------------
  |  |  158|    174|    #define DEC_Subnormal            0x00001000
  ------------------
 7506|    174|  adjust=etiny-dn->exponent;            /* calculate digits to remove  */
 7507|    174|  if (adjust<=0) {                      /* not out of range; unrounded  */
  ------------------
  |  Branch (7507:7): [True: 21, False: 153]
  ------------------
 7508|       |    /* residue can never be non-zero here, except in the Nmin-residue  */
 7509|       |    /* case (which is a subnormal result), so can take fast-path here  */
 7510|       |    /* it may already be inexact (from setting the coefficient)  */
 7511|     21|    if (*status&DEC_Inexact) *status|=DEC_Underflow;
  ------------------
  |  |  149|     21|    #define DEC_Inexact              0x00000020
  ------------------
                  if (*status&DEC_Inexact) *status|=DEC_Underflow;
  ------------------
  |  |  159|      0|    #define DEC_Underflow            0x00002000
  ------------------
  |  Branch (7511:9): [True: 0, False: 21]
  ------------------
 7512|     21|    return;
 7513|     21|    }
 7514|       |
 7515|       |  /* adjust>0, so need to rescale the result so exponent becomes Etiny  */
 7516|       |  /* [this code is similar to that in rescale]  */
 7517|    153|  workset=*set;                         /* clone rounding, etc.  */
 7518|    153|  workset.digits=dn->digits-adjust;     /* set requested length  */
 7519|    153|  workset.emin-=adjust;                 /* and adjust emin to match  */
 7520|       |  /* [note that the latter can be <1, here, similar to Rescale case]  */
 7521|    153|  decSetCoeff(dn, &workset, dn->lsu, dn->digits, residue, status);
 7522|    153|  decApplyRound(dn, &workset, *residue, status);
 7523|       |
 7524|       |  /* Use 754 default rule: Underflow is set iff Inexact  */
 7525|       |  /* [independent of whether trapped]  */
 7526|    153|  if (*status&DEC_Inexact) *status|=DEC_Underflow;
  ------------------
  |  |  149|    153|    #define DEC_Inexact              0x00000020
  ------------------
                if (*status&DEC_Inexact) *status|=DEC_Underflow;
  ------------------
  |  |  159|    143|    #define DEC_Underflow            0x00002000
  ------------------
  |  Branch (7526:7): [True: 143, False: 10]
  ------------------
 7527|       |
 7528|       |  /* if rounded up a 999s case, exponent will be off by one; adjust  */
 7529|       |  /* back if so [it will fit, because it was shortened earlier]  */
 7530|    153|  if (dn->exponent>etiny) {
  ------------------
  |  Branch (7530:7): [True: 4, False: 149]
  ------------------
 7531|      4|    dn->digits=decShiftToMost(dn->lsu, dn->digits, 1);
 7532|      4|    dn->exponent--;                     /* (re)adjust the exponent.  */
 7533|      4|    }
 7534|       |
 7535|       |  /* if rounded to zero, it is by definition clamped...  */
 7536|    153|  if (ISZERO(dn)) *status|=DEC_Clamped;
  ------------------
  |  |  229|    153|  #define ISZERO(dn) decNumberIsZero(dn)     /* now just a local name */
  |  |  ------------------
  |  |  |  |  193|    153|  #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:37): [True: 130, False: 23]
  |  |  |  |  ------------------
  |  |  |  |  194|    153|                                    && (dn)->digits==1 \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (194:40): [True: 108, False: 22]
  |  |  |  |  ------------------
  |  |  |  |  195|    153|                                    && (((dn)->bits&DECSPECIAL)==0))
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|    108|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   45|    108|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   46|    108|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   47|    108|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (195:40): [True: 108, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                if (ISZERO(dn)) *status|=DEC_Clamped;
  ------------------
  |  |  156|    108|    #define DEC_Clamped              0x00000400
  ------------------
 7537|    153|  } /* decSetSubnormal  */
decNumber.cpp:_ZL8decBiStrPKcS0_S0_:
 7710|    128|static Flag decBiStr(const char *targ, const char *str1, const char *str2) {
 7711|    178|  for (;;targ++, str1++, str2++) {
 7712|    178|    if (*targ!=*str1 && *targ!=*str2) return 0;
  ------------------
  |  Branch (7712:9): [True: 152, False: 26]
  |  Branch (7712:25): [True: 125, False: 27]
  ------------------
 7713|       |    /* *targ has a match in one (or both, if terminator)  */
 7714|     53|    if (*targ=='\0') break;
  ------------------
  |  Branch (7714:9): [True: 3, False: 50]
  ------------------
 7715|     53|    } /* forever  */
 7716|      3|  return 1;
 7717|    128|  } /* decBiStr  */
decNumber.cpp:_ZL9decStatusP9decNumberjP10decContext:
 7784|    704|static void decStatus(decNumber *dn, uInt status, decContext *set) {
 7785|    704|  if (status & DEC_NaNs) {              /* error status -> NaN  */
  ------------------
  |  |  203|    704|  #define DEC_NaNs    DEC_IEEE_754_Invalid_operation
  |  |  ------------------
  |  |  |  |  189|    704|  #define DEC_IEEE_754_Invalid_operation (DEC_Conversion_syntax |     \
  |  |  |  |  ------------------
  |  |  |  |  |  |  144|    704|    #define DEC_Conversion_syntax    0x00000001
  |  |  |  |  ------------------
  |  |  |  |  190|    704|                                          DEC_Division_impossible |   \
  |  |  |  |  ------------------
  |  |  |  |  |  |  146|    704|    #define DEC_Division_impossible  0x00000004
  |  |  |  |  ------------------
  |  |  |  |  191|    704|                                          DEC_Division_undefined |    \
  |  |  |  |  ------------------
  |  |  |  |  |  |  147|    704|    #define DEC_Division_undefined   0x00000008
  |  |  |  |  ------------------
  |  |  |  |  192|    704|                                          DEC_Insufficient_storage |  \
  |  |  |  |  ------------------
  |  |  |  |  |  |  148|    704|    #define DEC_Insufficient_storage 0x00000010 /* [when malloc fails]  */
  |  |  |  |  ------------------
  |  |  |  |  193|    704|                                          DEC_Invalid_context |       \
  |  |  |  |  ------------------
  |  |  |  |  |  |  150|    704|    #define DEC_Invalid_context      0x00000040
  |  |  |  |  ------------------
  |  |  |  |  194|    704|                                          DEC_Invalid_operation)
  |  |  |  |  ------------------
  |  |  |  |  |  |  151|    704|    #define DEC_Invalid_operation    0x00000080
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (7785:7): [True: 72, False: 632]
  ------------------
 7786|       |    /* if cause was an sNaN, clear and propagate [NaN is already set up]  */
 7787|     72|    if (status & DEC_sNaN) status&=~DEC_sNaN;
  ------------------
  |  |  209|     72|#define DEC_sNaN     0x40000000    /* local status: sNaN signal  */
  ------------------
                  if (status & DEC_sNaN) status&=~DEC_sNaN;
  ------------------
  |  |  209|      0|#define DEC_sNaN     0x40000000    /* local status: sNaN signal  */
  ------------------
  |  Branch (7787:9): [True: 0, False: 72]
  ------------------
 7788|     72|     else {
 7789|     72|      uprv_decNumberZero(dn);                /* other error: clean throughout  */
  ------------------
  |  | 1487|     72|#define uprv_decNumberZero U_ICU_ENTRY_POINT_RENAME(uprv_decNumberZero)
  |  |  ------------------
  |  |  |  |  123|     72|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     72|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     72|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7790|     72|      dn->bits=DECNAN;                  /* and make a quiet NaN  */
  ------------------
  |  |   46|     72|  #define DECNAN    0x20      /* 1=NaN                                */
  ------------------
 7791|     72|      }
 7792|     72|    }
 7793|    704|  uprv_decContextSetStatus(set, status);     /* [may not return]  */
  ------------------
  |  | 1418|    704|#define uprv_decContextSetStatus U_ICU_ENTRY_POINT_RENAME(uprv_decContextSetStatus)
  |  |  ------------------
  |  |  |  |  123|    704|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    704|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    704|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 7794|    704|  } /* decStatus  */
decNumber.cpp:_ZL12decGetDigitsPhi:
 7809|  2.02k|static Int decGetDigits(Unit *uar, Int len) {
 7810|  2.02k|  Unit *up=uar+(len-1);            /* -> msu  */
  ------------------
  |  |   78|  2.02k|  #define Unit   decNumberUnit
  |  |  ------------------
  |  |  |  |   73|  2.02k|    #define decNumberUnit uint8_t
  |  |  ------------------
  ------------------
 7811|  2.02k|  Int  digits=(len-1)*DECDPUN+1;   /* possible digits excluding msu  */
  ------------------
  |  |   76|  2.02k|  #define Int    int32_t
  ------------------
                Int  digits=(len-1)*DECDPUN+1;   /* possible digits excluding msu  */
  ------------------
  |  |   59|  2.02k|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 7812|       |  #if DECDPUN>4
 7813|       |  uInt const *pow;                 /* work  */
 7814|       |  #endif
 7815|       |                                   /* (at least 1 in final msu)  */
 7816|       |  #if DECCHECK
 7817|       |  if (len<1) printf("decGetDigits called with len<1 [%ld]\n", (LI)len);
 7818|       |  #endif
 7819|       |
 7820|  7.61k|  for (; up>=uar; up--) {
  ------------------
  |  Branch (7820:10): [True: 7.61k, False: 0]
  ------------------
 7821|  7.61k|    if (*up==0) {                  /* unit is all 0s  */
  ------------------
  |  Branch (7821:9): [True: 5.68k, False: 1.93k]
  ------------------
 7822|  5.68k|      if (digits==1) break;        /* a zero has one digit  */
  ------------------
  |  Branch (7822:11): [True: 91, False: 5.59k]
  ------------------
 7823|  5.59k|      digits-=DECDPUN;             /* adjust for 0 unit  */
  ------------------
  |  |   59|  5.59k|  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
  ------------------
 7824|  5.59k|      continue;}
 7825|       |    /* found the first (most significant) non-zero Unit  */
 7826|       |    #if DECDPUN>1                  /* not done yet  */
 7827|       |    if (*up<10) break;             /* is 1-9  */
 7828|       |    digits++;
 7829|       |    #if DECDPUN>2                  /* not done yet  */
 7830|       |    if (*up<100) break;            /* is 10-99  */
 7831|       |    digits++;
 7832|       |    #if DECDPUN>3                  /* not done yet  */
 7833|       |    if (*up<1000) break;           /* is 100-999  */
 7834|       |    digits++;
 7835|       |    #if DECDPUN>4                  /* count the rest ...  */
 7836|       |    for (pow=&powers[4]; *up>=*pow; pow++) digits++;
 7837|       |    #endif
 7838|       |    #endif
 7839|       |    #endif
 7840|       |    #endif
 7841|  1.93k|    break;
 7842|  7.61k|    } /* up  */
 7843|  2.02k|  return digits;
 7844|  2.02k|  } /* decGetDigits  */

_ZN6icu_7817double_conversion10BignumDtoaEdNS0_14BignumDtoaModeEiNS0_6VectorIcEEPiS4_:
  104|    433|                Vector<char> buffer, int* length, int* decimal_point) {
  105|    433|  DOUBLE_CONVERSION_ASSERT(v > 0);
  ------------------
  |  |   57|    433|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    433|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  106|    433|  DOUBLE_CONVERSION_ASSERT(!Double(v).IsSpecial());
  ------------------
  |  |   57|    433|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    433|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  107|    433|  uint64_t significand;
  108|    433|  int exponent;
  109|    433|  bool lower_boundary_is_closer;
  110|    433|  if (mode == BIGNUM_DTOA_SHORTEST_SINGLE) {
  ------------------
  |  Branch (110:7): [True: 0, False: 433]
  ------------------
  111|      0|    float f = static_cast<float>(v);
  112|      0|    DOUBLE_CONVERSION_ASSERT(f == v);
  ------------------
  |  |   57|      0|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  113|      0|    significand = Single(f).Significand();
  114|      0|    exponent = Single(f).Exponent();
  115|      0|    lower_boundary_is_closer = Single(f).LowerBoundaryIsCloser();
  116|    433|  } else {
  117|    433|    significand = Double(v).Significand();
  118|    433|    exponent = Double(v).Exponent();
  119|    433|    lower_boundary_is_closer = Double(v).LowerBoundaryIsCloser();
  120|    433|  }
  121|    433|  bool need_boundary_deltas =
  122|    433|      (mode == BIGNUM_DTOA_SHORTEST || mode == BIGNUM_DTOA_SHORTEST_SINGLE);
  ------------------
  |  Branch (122:8): [True: 433, False: 0]
  |  Branch (122:40): [True: 0, False: 0]
  ------------------
  123|       |
  124|    433|  bool is_even = (significand & 1) == 0;
  125|    433|  int normalized_exponent = NormalizedExponent(significand, exponent);
  126|       |  // estimated_power might be too low by 1.
  127|    433|  int estimated_power = EstimatePower(normalized_exponent);
  128|       |
  129|       |  // Shortcut for Fixed.
  130|       |  // The requested digits correspond to the digits after the point. If the
  131|       |  // number is much too small, then there is no need in trying to get any
  132|       |  // digits.
  133|    433|  if (mode == BIGNUM_DTOA_FIXED && -estimated_power - 1 > requested_digits) {
  ------------------
  |  Branch (133:7): [True: 0, False: 433]
  |  Branch (133:36): [True: 0, False: 0]
  ------------------
  134|      0|    buffer[0] = '\0';
  135|      0|    *length = 0;
  136|       |    // Set decimal-point to -requested_digits. This is what Gay does.
  137|       |    // Note that it should not have any effect anyways since the string is
  138|       |    // empty.
  139|      0|    *decimal_point = -requested_digits;
  140|      0|    return;
  141|      0|  }
  142|       |
  143|    433|  Bignum numerator;
  144|    433|  Bignum denominator;
  145|    433|  Bignum delta_minus;
  146|    433|  Bignum delta_plus;
  147|       |  // Make sure the bignum can grow large enough. The smallest double equals
  148|       |  // 4e-324. In this case the denominator needs fewer than 324*4 binary digits.
  149|       |  // The maximum double is 1.7976931348623157e308 which needs fewer than
  150|       |  // 308*4 binary digits.
  151|    433|  DOUBLE_CONVERSION_ASSERT(Bignum::kMaxSignificantBits >= 324*4);
  ------------------
  |  |   57|    433|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    433|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  152|    433|  InitialScaledStartValues(significand, exponent, lower_boundary_is_closer,
  153|    433|                           estimated_power, need_boundary_deltas,
  154|    433|                           &numerator, &denominator,
  155|    433|                           &delta_minus, &delta_plus);
  156|       |  // We now have v = (numerator / denominator) * 10^estimated_power.
  157|    433|  FixupMultiply10(estimated_power, is_even, decimal_point,
  158|    433|                  &numerator, &denominator,
  159|    433|                  &delta_minus, &delta_plus);
  160|       |  // We now have v = (numerator / denominator) * 10^(decimal_point-1), and
  161|       |  //  1 <= (numerator + delta_plus) / denominator < 10
  162|    433|  switch (mode) {
  163|    433|    case BIGNUM_DTOA_SHORTEST:
  ------------------
  |  Branch (163:5): [True: 433, False: 0]
  ------------------
  164|    433|    case BIGNUM_DTOA_SHORTEST_SINGLE:
  ------------------
  |  Branch (164:5): [True: 0, False: 433]
  ------------------
  165|    433|      GenerateShortestDigits(&numerator, &denominator,
  166|    433|                             &delta_minus, &delta_plus,
  167|    433|                             is_even, buffer, length);
  168|    433|      break;
  169|      0|    case BIGNUM_DTOA_FIXED:
  ------------------
  |  Branch (169:5): [True: 0, False: 433]
  ------------------
  170|      0|      BignumToFixed(requested_digits, decimal_point,
  171|      0|                    &numerator, &denominator,
  172|      0|                    buffer, length);
  173|      0|      break;
  174|      0|    case BIGNUM_DTOA_PRECISION:
  ------------------
  |  Branch (174:5): [True: 0, False: 433]
  ------------------
  175|      0|      GenerateCountedDigits(requested_digits, decimal_point,
  176|      0|                            &numerator, &denominator,
  177|      0|                            buffer, length);
  178|      0|      break;
  179|      0|    default:
  ------------------
  |  Branch (179:5): [True: 0, False: 433]
  ------------------
  180|      0|      DOUBLE_CONVERSION_UNREACHABLE();
  ------------------
  |  |   87|      0|#define DOUBLE_CONVERSION_UNREACHABLE()   (abort())
  ------------------
  181|    433|  }
  182|    433|  buffer[*length] = '\0';
  183|    433|}
double-conversion-bignum-dtoa.cpp:_ZN6icu_7817double_conversionL18NormalizedExponentEmi:
   51|    433|static int NormalizedExponent(uint64_t significand, int exponent) {
   52|    433|  DOUBLE_CONVERSION_ASSERT(significand != 0);
  ------------------
  |  |   57|    433|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    433|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
   53|    524|  while ((significand & Double::kHiddenBit) == 0) {
  ------------------
  |  Branch (53:10): [True: 91, False: 433]
  ------------------
   54|     91|    significand = significand << 1;
   55|     91|    exponent = exponent - 1;
   56|     91|  }
   57|    433|  return exponent;
   58|    433|}
double-conversion-bignum-dtoa.cpp:_ZN6icu_7817double_conversionL22GenerateShortestDigitsEPNS0_6BignumES2_S2_S2_bNS0_6VectorIcEEPi:
  202|    433|                                   Vector<char> buffer, int* length) {
  203|       |  // Small optimization: if delta_minus and delta_plus are the same just reuse
  204|       |  // one of the two bignums.
  205|    433|  if (Bignum::Equal(*delta_minus, *delta_plus)) {
  ------------------
  |  Branch (205:7): [True: 424, False: 9]
  ------------------
  206|    424|    delta_plus = delta_minus;
  207|    424|  }
  208|    433|  *length = 0;
  209|  6.89k|  for (;;) {
  210|  6.89k|    uint16_t digit;
  211|  6.89k|    digit = numerator->DivideModuloIntBignum(*denominator);
  212|  6.89k|    DOUBLE_CONVERSION_ASSERT(digit <= 9);  // digit is a uint16_t and therefore always positive.
  ------------------
  |  |   57|  6.89k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  6.89k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  213|       |    // digit = numerator / denominator (integer division).
  214|       |    // numerator = numerator % denominator.
  215|  6.89k|    buffer[(*length)++] = static_cast<char>(digit + '0');
  216|       |
  217|       |    // Can we stop already?
  218|       |    // If the remainder of the division is less than the distance to the lower
  219|       |    // boundary we can stop. In this case we simply round down (discarding the
  220|       |    // remainder).
  221|       |    // Similarly we test if we can round up (using the upper boundary).
  222|  6.89k|    bool in_delta_room_minus;
  223|  6.89k|    bool in_delta_room_plus;
  224|  6.89k|    if (is_even) {
  ------------------
  |  Branch (224:9): [True: 3.43k, False: 3.46k]
  ------------------
  225|  3.43k|      in_delta_room_minus = Bignum::LessEqual(*numerator, *delta_minus);
  226|  3.46k|    } else {
  227|  3.46k|      in_delta_room_minus = Bignum::Less(*numerator, *delta_minus);
  228|  3.46k|    }
  229|  6.89k|    if (is_even) {
  ------------------
  |  Branch (229:9): [True: 3.43k, False: 3.46k]
  ------------------
  230|  3.43k|      in_delta_room_plus =
  231|  3.43k|          Bignum::PlusCompare(*numerator, *delta_plus, *denominator) >= 0;
  232|  3.46k|    } else {
  233|  3.46k|      in_delta_room_plus =
  234|  3.46k|          Bignum::PlusCompare(*numerator, *delta_plus, *denominator) > 0;
  235|  3.46k|    }
  236|  6.89k|    if (!in_delta_room_minus && !in_delta_room_plus) {
  ------------------
  |  Branch (236:9): [True: 6.53k, False: 368]
  |  Branch (236:33): [True: 6.46k, False: 65]
  ------------------
  237|       |      // Prepare for next iteration.
  238|  6.46k|      numerator->Times10();
  239|  6.46k|      delta_minus->Times10();
  240|       |      // We optimized delta_plus to be equal to delta_minus (if they share the
  241|       |      // same value). So don't multiply delta_plus if they point to the same
  242|       |      // object.
  243|  6.46k|      if (delta_minus != delta_plus) {
  ------------------
  |  Branch (243:11): [True: 143, False: 6.32k]
  ------------------
  244|    143|        delta_plus->Times10();
  245|    143|      }
  246|  6.46k|    } else if (in_delta_room_minus && in_delta_room_plus) {
  ------------------
  |  Branch (246:16): [True: 368, False: 65]
  |  Branch (246:39): [True: 238, False: 130]
  ------------------
  247|       |      // Let's see if 2*numerator < denominator.
  248|       |      // If yes, then the next digit would be < 5 and we can round down.
  249|    238|      int compare = Bignum::PlusCompare(*numerator, *numerator, *denominator);
  250|    238|      if (compare < 0) {
  ------------------
  |  Branch (250:11): [True: 98, False: 140]
  ------------------
  251|       |        // Remaining digits are less than .5. -> Round down (== do nothing).
  252|    140|      } else if (compare > 0) {
  ------------------
  |  Branch (252:18): [True: 99, False: 41]
  ------------------
  253|       |        // Remaining digits are more than .5 of denominator. -> Round up.
  254|       |        // Note that the last digit could not be a '9' as otherwise the whole
  255|       |        // loop would have stopped earlier.
  256|       |        // We still have an assert here in case the preconditions were not
  257|       |        // satisfied.
  258|     99|        DOUBLE_CONVERSION_ASSERT(buffer[(*length) - 1] != '9');
  ------------------
  |  |   57|     99|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|     99|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  259|     99|        buffer[(*length) - 1]++;
  260|     99|      } else {
  261|       |        // Halfway case.
  262|       |        // TODO(floitsch): need a way to solve half-way cases.
  263|       |        //   For now let's round towards even (since this is what Gay seems to
  264|       |        //   do).
  265|       |
  266|     41|        if ((buffer[(*length) - 1] - '0') % 2 == 0) {
  ------------------
  |  Branch (266:13): [True: 25, False: 16]
  ------------------
  267|       |          // Round down => Do nothing.
  268|     25|        } else {
  269|     16|          DOUBLE_CONVERSION_ASSERT(buffer[(*length) - 1] != '9');
  ------------------
  |  |   57|     16|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|     16|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  270|     16|          buffer[(*length) - 1]++;
  271|     16|        }
  272|     41|      }
  273|    238|      return;
  274|    238|    } else if (in_delta_room_minus) {
  ------------------
  |  Branch (274:16): [True: 130, False: 65]
  ------------------
  275|       |      // Round down (== do nothing).
  276|    130|      return;
  277|    130|    } else {  // in_delta_room_plus
  278|       |      // Round up.
  279|       |      // Note again that the last digit could not be '9' since this would have
  280|       |      // stopped the loop earlier.
  281|       |      // We still have an DOUBLE_CONVERSION_ASSERT here, in case the preconditions were not
  282|       |      // satisfied.
  283|     65|      DOUBLE_CONVERSION_ASSERT(buffer[(*length) -1] != '9');
  ------------------
  |  |   57|     65|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|     65|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  284|     65|      buffer[(*length) - 1]++;
  285|     65|      return;
  286|     65|    }
  287|  6.89k|  }
  288|    433|}
double-conversion-bignum-dtoa.cpp:_ZN6icu_7817double_conversionL13EstimatePowerEi:
  399|    433|static int EstimatePower(int exponent) {
  400|       |  // This function estimates log10 of v where v = f*2^e (with e == exponent).
  401|       |  // Note that 10^floor(log10(v)) <= v, but v <= 10^ceil(log10(v)).
  402|       |  // Note that f is bounded by its container size. Let p = 53 (the double's
  403|       |  // significand size). Then 2^(p-1) <= f < 2^p.
  404|       |  //
  405|       |  // Given that log10(v) == log2(v)/log2(10) and e+(len(f)-1) is quite close
  406|       |  // to log2(v) the function is simplified to (e+(len(f)-1)/log2(10)).
  407|       |  // The computed number undershoots by less than 0.631 (when we compute log3
  408|       |  // and not log10).
  409|       |  //
  410|       |  // Optimization: since we only need an approximated result this computation
  411|       |  // can be performed on 64 bit integers. On x86/x64 architecture the speedup is
  412|       |  // not really measurable, though.
  413|       |  //
  414|       |  // Since we want to avoid overshooting we decrement by 1e10 so that
  415|       |  // floating-point imprecisions don't affect us.
  416|       |  //
  417|       |  // Explanation for v's boundary m+: the computation takes advantage of
  418|       |  // the fact that 2^(p-1) <= f < 2^p. Boundaries still satisfy this requirement
  419|       |  // (even for denormals where the delta can be much more important).
  420|       |
  421|    433|  const double k1Log10 = 0.30102999566398114;  // 1/lg(10)
  422|       |
  423|       |  // For doubles len(f) == 53 (don't forget the hidden bit).
  424|    433|  const int kSignificandSize = Double::kSignificandSize;
  425|    433|  double estimate = ceil((exponent + kSignificandSize - 1) * k1Log10 - 1e-10);
  426|    433|  return static_cast<int>(estimate);
  427|    433|}
double-conversion-bignum-dtoa.cpp:_ZN6icu_7817double_conversionL24InitialScaledStartValuesEmibibPNS0_6BignumES2_S2_S2_:
  590|    433|                                     Bignum* delta_plus) {
  591|    433|  if (exponent >= 0) {
  ------------------
  |  Branch (591:7): [True: 229, False: 204]
  ------------------
  592|    229|    InitialScaledStartValuesPositiveExponent(
  593|    229|        significand, exponent, estimated_power, need_boundary_deltas,
  594|    229|        numerator, denominator, delta_minus, delta_plus);
  595|    229|  } else if (estimated_power >= 0) {
  ------------------
  |  Branch (595:14): [True: 73, False: 131]
  ------------------
  596|     73|    InitialScaledStartValuesNegativeExponentPositivePower(
  597|     73|        significand, exponent, estimated_power, need_boundary_deltas,
  598|     73|        numerator, denominator, delta_minus, delta_plus);
  599|    131|  } else {
  600|    131|    InitialScaledStartValuesNegativeExponentNegativePower(
  601|    131|        significand, exponent, estimated_power, need_boundary_deltas,
  602|    131|        numerator, denominator, delta_minus, delta_plus);
  603|    131|  }
  604|       |
  605|    433|  if (need_boundary_deltas && lower_boundary_is_closer) {
  ------------------
  |  Branch (605:7): [True: 433, False: 0]
  |  Branch (605:31): [True: 9, False: 424]
  ------------------
  606|       |    // The lower boundary is closer at half the distance of "normal" numbers.
  607|       |    // Increase the common denominator and adapt all but the delta_minus.
  608|      9|    denominator->ShiftLeft(1);  // *2
  609|      9|    numerator->ShiftLeft(1);    // *2
  610|      9|    delta_plus->ShiftLeft(1);   // *2
  611|      9|  }
  612|    433|}
double-conversion-bignum-dtoa.cpp:_ZN6icu_7817double_conversionL40InitialScaledStartValuesPositiveExponentEmiibPNS0_6BignumES2_S2_S2_:
  435|    229|    Bignum* delta_minus, Bignum* delta_plus) {
  436|       |  // A positive exponent implies a positive power.
  437|    229|  DOUBLE_CONVERSION_ASSERT(estimated_power >= 0);
  ------------------
  |  |   57|    229|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    229|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  438|       |  // Since the estimated_power is positive we simply multiply the denominator
  439|       |  // by 10^estimated_power.
  440|       |
  441|       |  // numerator = v.
  442|    229|  numerator->AssignUInt64(significand);
  443|    229|  numerator->ShiftLeft(exponent);
  444|       |  // denominator = 10^estimated_power.
  445|    229|  denominator->AssignPowerUInt16(10, estimated_power);
  446|       |
  447|    229|  if (need_boundary_deltas) {
  ------------------
  |  Branch (447:7): [True: 229, False: 0]
  ------------------
  448|       |    // Introduce a common denominator so that the deltas to the boundaries are
  449|       |    // integers.
  450|    229|    denominator->ShiftLeft(1);
  451|    229|    numerator->ShiftLeft(1);
  452|       |    // Let v = f * 2^e, then m+ - v = 1/2 * 2^e; With the common
  453|       |    // denominator (of 2) delta_plus equals 2^e.
  454|    229|    delta_plus->AssignUInt16(1);
  455|    229|    delta_plus->ShiftLeft(exponent);
  456|       |    // Same for delta_minus. The adjustments if f == 2^p-1 are done later.
  457|    229|    delta_minus->AssignUInt16(1);
  458|    229|    delta_minus->ShiftLeft(exponent);
  459|    229|  }
  460|    229|}
double-conversion-bignum-dtoa.cpp:_ZN6icu_7817double_conversionL53InitialScaledStartValuesNegativeExponentPositivePowerEmiibPNS0_6BignumES2_S2_S2_:
  468|     73|    Bignum* delta_minus, Bignum* delta_plus) {
  469|       |  // v = f * 2^e with e < 0, and with estimated_power >= 0.
  470|       |  // This means that e is close to 0 (have a look at how estimated_power is
  471|       |  // computed).
  472|       |
  473|       |  // numerator = significand
  474|       |  //  since v = significand * 2^exponent this is equivalent to
  475|       |  //  numerator = v * / 2^-exponent
  476|     73|  numerator->AssignUInt64(significand);
  477|       |  // denominator = 10^estimated_power * 2^-exponent (with exponent < 0)
  478|     73|  denominator->AssignPowerUInt16(10, estimated_power);
  479|     73|  denominator->ShiftLeft(-exponent);
  480|       |
  481|     73|  if (need_boundary_deltas) {
  ------------------
  |  Branch (481:7): [True: 73, False: 0]
  ------------------
  482|       |    // Introduce a common denominator so that the deltas to the boundaries are
  483|       |    // integers.
  484|     73|    denominator->ShiftLeft(1);
  485|     73|    numerator->ShiftLeft(1);
  486|       |    // Let v = f * 2^e, then m+ - v = 1/2 * 2^e; With the common
  487|       |    // denominator (of 2) delta_plus equals 2^e.
  488|       |    // Given that the denominator already includes v's exponent the distance
  489|       |    // to the boundaries is simply 1.
  490|     73|    delta_plus->AssignUInt16(1);
  491|       |    // Same for delta_minus. The adjustments if f == 2^p-1 are done later.
  492|     73|    delta_minus->AssignUInt16(1);
  493|     73|  }
  494|     73|}
double-conversion-bignum-dtoa.cpp:_ZN6icu_7817double_conversionL53InitialScaledStartValuesNegativeExponentNegativePowerEmiibPNS0_6BignumES2_S2_S2_:
  502|    131|    Bignum* delta_minus, Bignum* delta_plus) {
  503|       |  // Instead of multiplying the denominator with 10^estimated_power we
  504|       |  // multiply all values (numerator and deltas) by 10^-estimated_power.
  505|       |
  506|       |  // Use numerator as temporary container for power_ten.
  507|    131|  Bignum* power_ten = numerator;
  508|    131|  power_ten->AssignPowerUInt16(10, -estimated_power);
  509|       |
  510|    131|  if (need_boundary_deltas) {
  ------------------
  |  Branch (510:7): [True: 131, False: 0]
  ------------------
  511|       |    // Since power_ten == numerator we must make a copy of 10^estimated_power
  512|       |    // before we complete the computation of the numerator.
  513|       |    // delta_plus = delta_minus = 10^estimated_power
  514|    131|    delta_plus->AssignBignum(*power_ten);
  515|    131|    delta_minus->AssignBignum(*power_ten);
  516|    131|  }
  517|       |
  518|       |  // numerator = significand * 2 * 10^-estimated_power
  519|       |  //  since v = significand * 2^exponent this is equivalent to
  520|       |  // numerator = v * 10^-estimated_power * 2 * 2^-exponent.
  521|       |  // Remember: numerator has been abused as power_ten. So no need to assign it
  522|       |  //  to itself.
  523|    131|  DOUBLE_CONVERSION_ASSERT(numerator == power_ten);
  ------------------
  |  |   57|    131|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    131|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  524|    131|  numerator->MultiplyByUInt64(significand);
  525|       |
  526|       |  // denominator = 2 * 2^-exponent with exponent < 0.
  527|    131|  denominator->AssignUInt16(1);
  528|    131|  denominator->ShiftLeft(-exponent);
  529|       |
  530|    131|  if (need_boundary_deltas) {
  ------------------
  |  Branch (530:7): [True: 131, False: 0]
  ------------------
  531|       |    // Introduce a common denominator so that the deltas to the boundaries are
  532|       |    // integers.
  533|    131|    numerator->ShiftLeft(1);
  534|    131|    denominator->ShiftLeft(1);
  535|       |    // With this shift the boundaries have their correct value, since
  536|       |    // delta_plus = 10^-estimated_power, and
  537|       |    // delta_minus = 10^-estimated_power.
  538|       |    // These assignments have been done earlier.
  539|       |    // The adjustments if f == 2^p-1 (lower boundary is closer) are done later.
  540|    131|  }
  541|    131|}
double-conversion-bignum-dtoa.cpp:_ZN6icu_7817double_conversionL15FixupMultiply10EibPiPNS0_6BignumES3_S3_S3_:
  629|    433|                            Bignum* delta_minus, Bignum* delta_plus) {
  630|    433|  bool in_range;
  631|    433|  if (is_even) {
  ------------------
  |  Branch (631:7): [True: 219, False: 214]
  ------------------
  632|       |    // For IEEE doubles half-way cases (in decimal system numbers ending with 5)
  633|       |    // are rounded to the closest floating-point number with even significand.
  634|    219|    in_range = Bignum::PlusCompare(*numerator, *delta_plus, *denominator) >= 0;
  635|    219|  } else {
  636|    214|    in_range = Bignum::PlusCompare(*numerator, *delta_plus, *denominator) > 0;
  637|    214|  }
  638|    433|  if (in_range) {
  ------------------
  |  Branch (638:7): [True: 61, False: 372]
  ------------------
  639|       |    // Since numerator + delta_plus >= denominator we already have
  640|       |    // 1 <= numerator/denominator < 10. Simply update the estimated_power.
  641|     61|    *decimal_point = estimated_power + 1;
  642|    372|  } else {
  643|    372|    *decimal_point = estimated_power;
  644|    372|    numerator->Times10();
  645|    372|    if (Bignum::Equal(*delta_minus, *delta_plus)) {
  ------------------
  |  Branch (645:9): [True: 363, False: 9]
  ------------------
  646|    363|      delta_minus->Times10();
  647|    363|      delta_plus->AssignBignum(*delta_minus);
  648|    363|    } else {
  649|      9|      delta_minus->Times10();
  650|      9|      delta_plus->Times10();
  651|      9|    }
  652|    372|  }
  653|    433|}

_ZN6icu_7817double_conversion6Bignum8RawBigitEi:
   50|   796k|Bignum::Chunk& Bignum::RawBigit(const int index) {
   51|   796k|  DOUBLE_CONVERSION_ASSERT(static_cast<unsigned>(index) < kBigitCapacity);
  ------------------
  |  |   57|   796k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|   796k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
   52|   796k|  return bigits_buffer_[index];
   53|   796k|}
_ZNK6icu_7817double_conversion6Bignum8RawBigitEi:
   56|   143k|const Bignum::Chunk& Bignum::RawBigit(const int index) const {
   57|   143k|  DOUBLE_CONVERSION_ASSERT(static_cast<unsigned>(index) < kBigitCapacity);
  ------------------
  |  |   57|   143k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|   143k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
   58|   143k|  return bigits_buffer_[index];
   59|   143k|}
_ZN6icu_7817double_conversion6Bignum12AssignUInt16Et:
   69|    744|void Bignum::AssignUInt16(const uint16_t value) {
   70|    744|  DOUBLE_CONVERSION_ASSERT(kBigitSize >= BitSize(value));
  ------------------
  |  |   57|    744|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    744|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
   71|    744|  Zero();
   72|    744|  if (value > 0) {
  ------------------
  |  Branch (72:7): [True: 744, False: 0]
  ------------------
   73|    744|    RawBigit(0) = value;
   74|    744|    used_bigits_ = 1;
   75|    744|  }
   76|    744|}
_ZN6icu_7817double_conversion6Bignum12AssignUInt64Em:
   79|  3.39k|void Bignum::AssignUInt64(uint64_t value) {
   80|  3.39k|  Zero();
   81|  10.4k|  for(int i = 0; value > 0; ++i) {
  ------------------
  |  Branch (81:18): [True: 7.06k, False: 3.39k]
  ------------------
   82|  7.06k|    RawBigit(i) = value & kBigitMask;
   83|  7.06k|    value >>= kBigitSize;
   84|  7.06k|    ++used_bigits_;
   85|  7.06k|  }
   86|  3.39k|}
_ZN6icu_7817double_conversion6Bignum12AssignBignumERKS1_:
   89|    625|void Bignum::AssignBignum(const Bignum& other) {
   90|    625|  exponent_ = other.exponent_;
   91|  8.68k|  for (int i = 0; i < other.used_bigits_; ++i) {
  ------------------
  |  Branch (91:19): [True: 8.05k, False: 625]
  ------------------
   92|  8.05k|    RawBigit(i) = other.RawBigit(i);
   93|  8.05k|  }
   94|    625|  used_bigits_ = other.used_bigits_;
   95|    625|}
_ZN6icu_7817double_conversion6Bignum19AssignDecimalStringENS0_6VectorIKcEE:
  111|  1.24k|void Bignum::AssignDecimalString(const Vector<const char> value) {
  112|       |  // 2^64 = 18446744073709551616 > 10^19
  113|  1.24k|  static const int kMaxUint64DecimalDigits = 19;
  114|  1.24k|  Zero();
  115|  1.24k|  int length = value.length();
  116|  1.24k|  unsigned pos = 0;
  117|       |  // Let's just say that each digit needs 4 bits.
  118|  1.64k|  while (length >= kMaxUint64DecimalDigits) {
  ------------------
  |  Branch (118:10): [True: 402, False: 1.24k]
  ------------------
  119|    402|    const uint64_t digits = ReadUInt64(value, pos, kMaxUint64DecimalDigits);
  120|    402|    pos += kMaxUint64DecimalDigits;
  121|    402|    length -= kMaxUint64DecimalDigits;
  122|    402|    MultiplyByPowerOfTen(kMaxUint64DecimalDigits);
  123|    402|    AddUInt64(digits);
  124|    402|  }
  125|  1.24k|  const uint64_t digits = ReadUInt64(value, pos, length);
  126|  1.24k|  MultiplyByPowerOfTen(length);
  127|  1.24k|  AddUInt64(digits);
  128|  1.24k|  Clamp();
  129|  1.24k|}
_ZN6icu_7817double_conversion6Bignum9AddUInt64Em:
  170|  1.64k|void Bignum::AddUInt64(const uint64_t operand) {
  171|  1.64k|  if (operand == 0) {
  ------------------
  |  Branch (171:7): [True: 222, False: 1.42k]
  ------------------
  172|    222|    return;
  173|    222|  }
  174|  1.42k|  Bignum other;
  175|  1.42k|  other.AssignUInt64(operand);
  176|  1.42k|  AddBignum(other);
  177|  1.42k|}
_ZN6icu_7817double_conversion6Bignum9AddBignumERKS1_:
  180|  1.42k|void Bignum::AddBignum(const Bignum& other) {
  181|  1.42k|  DOUBLE_CONVERSION_ASSERT(IsClamped());
  ------------------
  |  |   57|  1.42k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  1.42k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  182|  1.42k|  DOUBLE_CONVERSION_ASSERT(other.IsClamped());
  ------------------
  |  |   57|  1.42k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  1.42k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  183|       |
  184|       |  // If this has a greater exponent than other append zero-bigits to this.
  185|       |  // After this call exponent_ <= other.exponent_.
  186|  1.42k|  Align(other);
  187|       |
  188|       |  // There are two possibilities:
  189|       |  //   aaaaaaaaaaa 0000  (where the 0s represent a's exponent)
  190|       |  //     bbbbb 00000000
  191|       |  //   ----------------
  192|       |  //   ccccccccccc 0000
  193|       |  // or
  194|       |  //    aaaaaaaaaa 0000
  195|       |  //  bbbbbbbbb 0000000
  196|       |  //  -----------------
  197|       |  //  cccccccccccc 0000
  198|       |  // In both cases we might need a carry bigit.
  199|       |
  200|  1.42k|  EnsureCapacity(1 + (std::max)(BigitLength(), other.BigitLength()) - exponent_);
  201|  1.42k|  Chunk carry = 0;
  202|  1.42k|  int bigit_pos = other.exponent_ - exponent_;
  203|  1.42k|  DOUBLE_CONVERSION_ASSERT(bigit_pos >= 0);
  ------------------
  |  |   57|  1.42k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  1.42k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  204|  1.42k|  for (int i = used_bigits_; i < bigit_pos; ++i) {
  ------------------
  |  Branch (204:30): [True: 0, False: 1.42k]
  ------------------
  205|      0|    RawBigit(i) = 0;
  206|      0|  }
  207|  4.55k|  for (int i = 0; i < other.used_bigits_; ++i) {
  ------------------
  |  Branch (207:19): [True: 3.12k, False: 1.42k]
  ------------------
  208|  3.12k|    const Chunk my = (bigit_pos < used_bigits_) ? RawBigit(bigit_pos) : 0;
  ------------------
  |  Branch (208:22): [True: 200, False: 2.92k]
  ------------------
  209|  3.12k|    const Chunk sum = my + other.RawBigit(i) + carry;
  210|  3.12k|    RawBigit(bigit_pos) = sum & kBigitMask;
  211|  3.12k|    carry = sum >> kBigitSize;
  212|  3.12k|    ++bigit_pos;
  213|  3.12k|  }
  214|  1.47k|  while (carry != 0) {
  ------------------
  |  Branch (214:10): [True: 47, False: 1.42k]
  ------------------
  215|     47|    const Chunk my = (bigit_pos < used_bigits_) ? RawBigit(bigit_pos) : 0;
  ------------------
  |  Branch (215:22): [True: 47, False: 0]
  ------------------
  216|     47|    const Chunk sum = my + carry;
  217|     47|    RawBigit(bigit_pos) = sum & kBigitMask;
  218|     47|    carry = sum >> kBigitSize;
  219|     47|    ++bigit_pos;
  220|     47|  }
  221|  1.42k|  used_bigits_ = static_cast<int16_t>(std::max(bigit_pos, static_cast<int>(used_bigits_)));
  222|  1.42k|  DOUBLE_CONVERSION_ASSERT(IsClamped());
  ------------------
  |  |   57|  1.42k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  1.42k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  223|  1.42k|}
_ZN6icu_7817double_conversion6Bignum14SubtractBignumERKS1_:
  226|  5.69k|void Bignum::SubtractBignum(const Bignum& other) {
  227|  5.69k|  DOUBLE_CONVERSION_ASSERT(IsClamped());
  ------------------
  |  |   57|  5.69k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  5.69k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  228|  5.69k|  DOUBLE_CONVERSION_ASSERT(other.IsClamped());
  ------------------
  |  |   57|  5.69k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  5.69k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  229|       |  // We require this to be bigger than other.
  230|  5.69k|  DOUBLE_CONVERSION_ASSERT(LessEqual(other, *this));
  ------------------
  |  |   57|  5.69k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  5.69k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  231|       |
  232|  5.69k|  Align(other);
  233|       |
  234|  5.69k|  const int offset = other.exponent_ - exponent_;
  235|  5.69k|  Chunk borrow = 0;
  236|  5.69k|  int i;
  237|  50.7k|  for (i = 0; i < other.used_bigits_; ++i) {
  ------------------
  |  Branch (237:15): [True: 45.0k, False: 5.69k]
  ------------------
  238|  45.0k|    DOUBLE_CONVERSION_ASSERT((borrow == 0) || (borrow == 1));
  ------------------
  |  |   57|  45.0k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  45.0k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  239|  45.0k|    const Chunk difference = RawBigit(i + offset) - other.RawBigit(i) - borrow;
  240|  45.0k|    RawBigit(i + offset) = difference & kBigitMask;
  241|  45.0k|    borrow = difference >> (kChunkSize - 1);
  242|  45.0k|  }
  243|  6.84k|  while (borrow != 0) {
  ------------------
  |  Branch (243:10): [True: 1.14k, False: 5.69k]
  ------------------
  244|  1.14k|    const Chunk difference = RawBigit(i + offset) - borrow;
  245|  1.14k|    RawBigit(i + offset) = difference & kBigitMask;
  246|  1.14k|    borrow = difference >> (kChunkSize - 1);
  247|  1.14k|    ++i;
  248|  1.14k|  }
  249|  5.69k|  Clamp();
  250|  5.69k|}
_ZN6icu_7817double_conversion6Bignum9ShiftLeftEi:
  253|  4.39k|void Bignum::ShiftLeft(const int shift_amount) {
  254|  4.39k|  if (used_bigits_ == 0) {
  ------------------
  |  Branch (254:7): [True: 0, False: 4.39k]
  ------------------
  255|      0|    return;
  256|      0|  }
  257|  4.39k|  exponent_ += static_cast<int16_t>(shift_amount / kBigitSize);
  258|  4.39k|  const int local_shift = shift_amount % kBigitSize;
  259|  4.39k|  EnsureCapacity(used_bigits_ + 1);
  260|  4.39k|  BigitsShiftLeft(local_shift);
  261|  4.39k|}
_ZN6icu_7817double_conversion6Bignum16MultiplyByUInt32Ej:
  264|  15.4k|void Bignum::MultiplyByUInt32(const uint32_t factor) {
  265|  15.4k|  if (factor == 1) {
  ------------------
  |  Branch (265:7): [True: 0, False: 15.4k]
  ------------------
  266|      0|    return;
  267|      0|  }
  268|  15.4k|  if (factor == 0) {
  ------------------
  |  Branch (268:7): [True: 0, False: 15.4k]
  ------------------
  269|      0|    Zero();
  270|      0|    return;
  271|      0|  }
  272|  15.4k|  if (used_bigits_ == 0) {
  ------------------
  |  Branch (272:7): [True: 0, False: 15.4k]
  ------------------
  273|      0|    return;
  274|      0|  }
  275|       |  // The product of a bigit with the factor is of size kBigitSize + 32.
  276|       |  // Assert that this number + 1 (for the carry) fits into double chunk.
  277|  15.4k|  DOUBLE_CONVERSION_ASSERT(kDoubleChunkSize >= kBigitSize + 32 + 1);
  ------------------
  |  |   57|  15.4k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  15.4k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  278|  15.4k|  DoubleChunk carry = 0;
  279|   173k|  for (int i = 0; i < used_bigits_; ++i) {
  ------------------
  |  Branch (279:19): [True: 157k, False: 15.4k]
  ------------------
  280|   157k|    const DoubleChunk product = static_cast<DoubleChunk>(factor) * RawBigit(i) + carry;
  281|   157k|    RawBigit(i) = static_cast<Chunk>(product & kBigitMask);
  282|   157k|    carry = (product >> kBigitSize);
  283|   157k|  }
  284|  18.8k|  while (carry != 0) {
  ------------------
  |  Branch (284:10): [True: 3.41k, False: 15.4k]
  ------------------
  285|  3.41k|    EnsureCapacity(used_bigits_ + 1);
  286|  3.41k|    RawBigit(used_bigits_) = carry & kBigitMask;
  287|  3.41k|    used_bigits_++;
  288|  3.41k|    carry >>= kBigitSize;
  289|  3.41k|  }
  290|  15.4k|}
_ZN6icu_7817double_conversion6Bignum16MultiplyByUInt64Em:
  293|  2.67k|void Bignum::MultiplyByUInt64(const uint64_t factor) {
  294|  2.67k|  if (factor == 1) {
  ------------------
  |  Branch (294:7): [True: 0, False: 2.67k]
  ------------------
  295|      0|    return;
  296|      0|  }
  297|  2.67k|  if (factor == 0) {
  ------------------
  |  Branch (297:7): [True: 0, False: 2.67k]
  ------------------
  298|      0|    Zero();
  299|      0|    return;
  300|      0|  }
  301|  2.67k|  if (used_bigits_ == 0) {
  ------------------
  |  Branch (301:7): [True: 0, False: 2.67k]
  ------------------
  302|      0|    return;
  303|      0|  }
  304|  2.67k|  DOUBLE_CONVERSION_ASSERT(kBigitSize < 32);
  ------------------
  |  |   57|  2.67k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.67k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  305|  2.67k|  uint64_t carry = 0;
  306|  2.67k|  const uint64_t low = factor & 0xFFFFFFFF;
  307|  2.67k|  const uint64_t high = factor >> 32;
  308|  32.1k|  for (int i = 0; i < used_bigits_; ++i) {
  ------------------
  |  Branch (308:19): [True: 29.4k, False: 2.67k]
  ------------------
  309|  29.4k|    const uint64_t product_low = low * RawBigit(i);
  310|  29.4k|    const uint64_t product_high = high * RawBigit(i);
  311|  29.4k|    const uint64_t tmp = (carry & kBigitMask) + product_low;
  312|  29.4k|    RawBigit(i) = tmp & kBigitMask;
  313|  29.4k|    carry = (carry >> kBigitSize) + (tmp >> kBigitSize) +
  314|  29.4k|        (product_high << (32 - kBigitSize));
  315|  29.4k|  }
  316|  8.76k|  while (carry != 0) {
  ------------------
  |  Branch (316:10): [True: 6.08k, False: 2.67k]
  ------------------
  317|  6.08k|    EnsureCapacity(used_bigits_ + 1);
  318|  6.08k|    RawBigit(used_bigits_) = carry & kBigitMask;
  319|  6.08k|    used_bigits_++;
  320|  6.08k|    carry >>= kBigitSize;
  321|  6.08k|  }
  322|  2.67k|}
_ZN6icu_7817double_conversion6Bignum20MultiplyByPowerOfTenEi:
  325|  2.89k|void Bignum::MultiplyByPowerOfTen(const int exponent) {
  326|  2.89k|  static const uint64_t kFive27 = DOUBLE_CONVERSION_UINT64_2PART_C(0x6765c793, fa10079d);
  ------------------
  |  |  205|  2.89k|#define DOUBLE_CONVERSION_UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
  ------------------
  327|  2.89k|  static const uint16_t kFive1 = 5;
  328|  2.89k|  static const uint16_t kFive2 = kFive1 * 5;
  329|  2.89k|  static const uint16_t kFive3 = kFive2 * 5;
  330|  2.89k|  static const uint16_t kFive4 = kFive3 * 5;
  331|  2.89k|  static const uint16_t kFive5 = kFive4 * 5;
  332|  2.89k|  static const uint16_t kFive6 = kFive5 * 5;
  333|  2.89k|  static const uint32_t kFive7 = kFive6 * 5;
  334|  2.89k|  static const uint32_t kFive8 = kFive7 * 5;
  335|  2.89k|  static const uint32_t kFive9 = kFive8 * 5;
  336|  2.89k|  static const uint32_t kFive10 = kFive9 * 5;
  337|  2.89k|  static const uint32_t kFive11 = kFive10 * 5;
  338|  2.89k|  static const uint32_t kFive12 = kFive11 * 5;
  339|  2.89k|  static const uint32_t kFive13 = kFive12 * 5;
  340|  2.89k|  static const uint32_t kFive1_to_12[] =
  341|  2.89k|      { kFive1, kFive2, kFive3, kFive4, kFive5, kFive6,
  342|  2.89k|        kFive7, kFive8, kFive9, kFive10, kFive11, kFive12 };
  343|       |
  344|  2.89k|  DOUBLE_CONVERSION_ASSERT(exponent >= 0);
  ------------------
  |  |   57|  2.89k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.89k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  345|       |
  346|  2.89k|  if (exponent == 0) {
  ------------------
  |  Branch (346:7): [True: 706, False: 2.18k]
  ------------------
  347|    706|    return;
  348|    706|  }
  349|  2.18k|  if (used_bigits_ == 0) {
  ------------------
  |  Branch (349:7): [True: 1.24k, False: 942]
  ------------------
  350|  1.24k|    return;
  351|  1.24k|  }
  352|       |  // We shift by exponent at the end just before returning.
  353|    942|  int remaining_exponent = exponent;
  354|  3.48k|  while (remaining_exponent >= 27) {
  ------------------
  |  Branch (354:10): [True: 2.54k, False: 942]
  ------------------
  355|  2.54k|    MultiplyByUInt64(kFive27);
  356|  2.54k|    remaining_exponent -= 27;
  357|  2.54k|  }
  358|  1.33k|  while (remaining_exponent >= 13) {
  ------------------
  |  Branch (358:10): [True: 388, False: 942]
  ------------------
  359|    388|    MultiplyByUInt32(kFive13);
  360|    388|    remaining_exponent -= 13;
  361|    388|  }
  362|    942|  if (remaining_exponent > 0) {
  ------------------
  |  Branch (362:7): [True: 797, False: 145]
  ------------------
  363|    797|    MultiplyByUInt32(kFive1_to_12[remaining_exponent - 1]);
  364|    797|  }
  365|    942|  ShiftLeft(exponent);
  366|    942|}
_ZN6icu_7817double_conversion6Bignum6SquareEv:
  369|    897|void Bignum::Square() {
  370|    897|  DOUBLE_CONVERSION_ASSERT(IsClamped());
  ------------------
  |  |   57|    897|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    897|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  371|    897|  const int product_length = 2 * used_bigits_;
  372|    897|  EnsureCapacity(product_length);
  373|       |
  374|       |  // Comba multiplication: compute each column separately.
  375|       |  // Example: r = a2a1a0 * b2b1b0.
  376|       |  //    r =  1    * a0b0 +
  377|       |  //        10    * (a1b0 + a0b1) +
  378|       |  //        100   * (a2b0 + a1b1 + a0b2) +
  379|       |  //        1000  * (a2b1 + a1b2) +
  380|       |  //        10000 * a2b2
  381|       |  //
  382|       |  // In the worst case we have to accumulate nb-digits products of digit*digit.
  383|       |  //
  384|       |  // Assert that the additional number of bits in a DoubleChunk are enough to
  385|       |  // sum up used_digits of Bigit*Bigit.
  386|    897|  if ((1 << (2 * (kChunkSize - kBigitSize))) <= used_bigits_) {
  ------------------
  |  Branch (386:7): [True: 0, False: 897]
  ------------------
  387|      0|    DOUBLE_CONVERSION_UNIMPLEMENTED();
  ------------------
  |  |   64|      0|#define DOUBLE_CONVERSION_UNIMPLEMENTED() (abort())
  ------------------
  388|      0|  }
  389|    897|  DoubleChunk accumulator = 0;
  390|       |  // First shift the digits so we don't overwrite them.
  391|    897|  const int copy_offset = used_bigits_;
  392|  5.91k|  for (int i = 0; i < used_bigits_; ++i) {
  ------------------
  |  Branch (392:19): [True: 5.01k, False: 897]
  ------------------
  393|  5.01k|    RawBigit(copy_offset + i) = RawBigit(i);
  394|  5.01k|  }
  395|       |  // We have two loops to avoid some 'if's in the loop.
  396|  5.91k|  for (int i = 0; i < used_bigits_; ++i) {
  ------------------
  |  Branch (396:19): [True: 5.01k, False: 897]
  ------------------
  397|       |    // Process temporary digit i with power i.
  398|       |    // The sum of the two indices must be equal to i.
  399|  5.01k|    int bigit_index1 = i;
  400|  5.01k|    int bigit_index2 = 0;
  401|       |    // Sum all of the sub-products.
  402|  27.7k|    while (bigit_index1 >= 0) {
  ------------------
  |  Branch (402:12): [True: 22.7k, False: 5.01k]
  ------------------
  403|  22.7k|      const Chunk chunk1 = RawBigit(copy_offset + bigit_index1);
  404|  22.7k|      const Chunk chunk2 = RawBigit(copy_offset + bigit_index2);
  405|  22.7k|      accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
  406|  22.7k|      bigit_index1--;
  407|  22.7k|      bigit_index2++;
  408|  22.7k|    }
  409|  5.01k|    RawBigit(i) = static_cast<Chunk>(accumulator) & kBigitMask;
  410|  5.01k|    accumulator >>= kBigitSize;
  411|  5.01k|  }
  412|  5.91k|  for (int i = used_bigits_; i < product_length; ++i) {
  ------------------
  |  Branch (412:30): [True: 5.01k, False: 897]
  ------------------
  413|  5.01k|    int bigit_index1 = used_bigits_ - 1;
  414|  5.01k|    int bigit_index2 = i - bigit_index1;
  415|       |    // Invariant: sum of both indices is again equal to i.
  416|       |    // Inner loop runs 0 times on last iteration, emptying accumulator.
  417|  22.7k|    while (bigit_index2 < used_bigits_) {
  ------------------
  |  Branch (417:12): [True: 17.7k, False: 5.01k]
  ------------------
  418|  17.7k|      const Chunk chunk1 = RawBigit(copy_offset + bigit_index1);
  419|  17.7k|      const Chunk chunk2 = RawBigit(copy_offset + bigit_index2);
  420|  17.7k|      accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
  421|  17.7k|      bigit_index1--;
  422|  17.7k|      bigit_index2++;
  423|  17.7k|    }
  424|       |    // The overwritten RawBigit(i) will never be read in further loop iterations,
  425|       |    // because bigit_index1 and bigit_index2 are always greater
  426|       |    // than i - used_bigits_.
  427|  5.01k|    RawBigit(i) = static_cast<Chunk>(accumulator) & kBigitMask;
  428|  5.01k|    accumulator >>= kBigitSize;
  429|  5.01k|  }
  430|       |  // Since the result was guaranteed to lie inside the number the
  431|       |  // accumulator must be 0 now.
  432|    897|  DOUBLE_CONVERSION_ASSERT(accumulator == 0);
  ------------------
  |  |   57|    897|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    897|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  433|       |
  434|       |  // Don't forget to update the used_digits and the exponent.
  435|    897|  used_bigits_ = static_cast<int16_t>(product_length);
  436|    897|  exponent_ *= 2;
  437|    897|  Clamp();
  438|    897|}
_ZN6icu_7817double_conversion6Bignum17AssignPowerUInt16Eti:
  441|    433|void Bignum::AssignPowerUInt16(uint16_t base, const int power_exponent) {
  442|    433|  DOUBLE_CONVERSION_ASSERT(base != 0);
  ------------------
  |  |   57|    433|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    433|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  443|    433|  DOUBLE_CONVERSION_ASSERT(power_exponent >= 0);
  ------------------
  |  |   57|    433|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    433|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  444|    433|  if (power_exponent == 0) {
  ------------------
  |  Branch (444:7): [True: 9, False: 424]
  ------------------
  445|      9|    AssignUInt16(1);
  446|      9|    return;
  447|      9|  }
  448|    424|  Zero();
  449|    424|  int shifts = 0;
  450|       |  // We expect base to be in range 2-32, and most often to be 10.
  451|       |  // It does not make much sense to implement different algorithms for counting
  452|       |  // the bits.
  453|    848|  while ((base & 1) == 0) {
  ------------------
  |  Branch (453:10): [True: 424, False: 424]
  ------------------
  454|    424|    base >>= 1;
  455|    424|    shifts++;
  456|    424|  }
  457|    424|  int bit_size = 0;
  458|    424|  int tmp_base = base;
  459|  1.69k|  while (tmp_base != 0) {
  ------------------
  |  Branch (459:10): [True: 1.27k, False: 424]
  ------------------
  460|  1.27k|    tmp_base >>= 1;
  461|  1.27k|    bit_size++;
  462|  1.27k|  }
  463|    424|  const int final_size = bit_size * power_exponent;
  464|       |  // 1 extra bigit for the shifting, and one for rounded final_size.
  465|    424|  EnsureCapacity(final_size / kBigitSize + 2);
  466|       |
  467|       |  // Left to Right exponentiation.
  468|    424|  int mask = 1;
  469|  3.28k|  while (power_exponent >= mask) mask <<= 1;
  ------------------
  |  Branch (469:10): [True: 2.86k, False: 424]
  ------------------
  470|       |
  471|       |  // The mask is now pointing to the bit above the most significant 1-bit of
  472|       |  // power_exponent.
  473|       |  // Get rid of first 1-bit;
  474|    424|  mask >>= 2;
  475|    424|  uint64_t this_value = base;
  476|       |
  477|    424|  bool delayed_multiplication = false;
  478|    424|  const uint64_t max_32bits = 0xFFFFFFFF;
  479|  1.96k|  while (mask != 0 && this_value <= max_32bits) {
  ------------------
  |  Branch (479:10): [True: 1.80k, False: 163]
  |  Branch (479:23): [True: 1.54k, False: 261]
  ------------------
  480|  1.54k|    this_value = this_value * this_value;
  481|       |    // Verify that there is enough space in this_value to perform the
  482|       |    // multiplication.  The first bit_size bits must be 0.
  483|  1.54k|    if ((power_exponent & mask) != 0) {
  ------------------
  |  Branch (483:9): [True: 642, False: 899]
  ------------------
  484|    642|      DOUBLE_CONVERSION_ASSERT(bit_size > 0);
  ------------------
  |  |   57|    642|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    642|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  485|    642|      const uint64_t base_bits_mask =
  486|    642|        ~((static_cast<uint64_t>(1) << (64 - bit_size)) - 1);
  487|    642|      const bool high_bits_zero = (this_value & base_bits_mask) == 0;
  488|    642|      if (high_bits_zero) {
  ------------------
  |  Branch (488:11): [True: 642, False: 0]
  ------------------
  489|    642|        this_value *= base;
  490|    642|      } else {
  491|      0|        delayed_multiplication = true;
  492|      0|      }
  493|    642|    }
  494|  1.54k|    mask >>= 1;
  495|  1.54k|  }
  496|    424|  AssignUInt64(this_value);
  497|    424|  if (delayed_multiplication) {
  ------------------
  |  Branch (497:7): [True: 0, False: 424]
  ------------------
  498|      0|    MultiplyByUInt32(base);
  499|      0|  }
  500|       |
  501|       |  // Now do the same thing as a bignum.
  502|  1.32k|  while (mask != 0) {
  ------------------
  |  Branch (502:10): [True: 897, False: 424]
  ------------------
  503|    897|    Square();
  504|    897|    if ((power_exponent & mask) != 0) {
  ------------------
  |  Branch (504:9): [True: 407, False: 490]
  ------------------
  505|    407|      MultiplyByUInt32(base);
  506|    407|    }
  507|    897|    mask >>= 1;
  508|    897|  }
  509|       |
  510|       |  // And finally add the saved shifts.
  511|    424|  ShiftLeft(shifts * power_exponent);
  512|    424|}
_ZN6icu_7817double_conversion6Bignum21DivideModuloIntBignumERKS1_:
  516|  6.89k|uint16_t Bignum::DivideModuloIntBignum(const Bignum& other) {
  517|  6.89k|  DOUBLE_CONVERSION_ASSERT(IsClamped());
  ------------------
  |  |   57|  6.89k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  6.89k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  518|  6.89k|  DOUBLE_CONVERSION_ASSERT(other.IsClamped());
  ------------------
  |  |   57|  6.89k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  6.89k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  519|  6.89k|  DOUBLE_CONVERSION_ASSERT(other.used_bigits_ > 0);
  ------------------
  |  |   57|  6.89k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  6.89k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  520|       |
  521|       |  // Easy case: if we have less digits than the divisor than the result is 0.
  522|       |  // Note: this handles the case where this == 0, too.
  523|  6.89k|  if (BigitLength() < other.BigitLength()) {
  ------------------
  |  Branch (523:7): [True: 312, False: 6.58k]
  ------------------
  524|    312|    return 0;
  525|    312|  }
  526|       |
  527|  6.58k|  Align(other);
  528|       |
  529|  6.58k|  uint16_t result = 0;
  530|       |
  531|       |  // Start by removing multiples of 'other' until both numbers have the same
  532|       |  // number of digits.
  533|  8.88k|  while (BigitLength() > other.BigitLength()) {
  ------------------
  |  Branch (533:10): [True: 2.29k, False: 6.58k]
  ------------------
  534|       |    // This naive approach is extremely inefficient if `this` divided by other
  535|       |    // is big. This function is implemented for doubleToString where
  536|       |    // the result should be small (less than 10).
  537|  2.29k|    DOUBLE_CONVERSION_ASSERT(other.RawBigit(other.used_bigits_ - 1) >= ((1 << kBigitSize) / 16));
  ------------------
  |  |   57|  2.29k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.29k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  538|  2.29k|    DOUBLE_CONVERSION_ASSERT(RawBigit(used_bigits_ - 1) < 0x10000);
  ------------------
  |  |   57|  2.29k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.29k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  539|       |    // Remove the multiples of the first digit.
  540|       |    // Example this = 23 and other equals 9. -> Remove 2 multiples.
  541|  2.29k|    result += static_cast<uint16_t>(RawBigit(used_bigits_ - 1));
  542|  2.29k|    SubtractTimes(other, RawBigit(used_bigits_ - 1));
  543|  2.29k|  }
  544|       |
  545|  6.58k|  DOUBLE_CONVERSION_ASSERT(BigitLength() == other.BigitLength());
  ------------------
  |  |   57|  6.58k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  6.58k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  546|       |
  547|       |  // Both bignums are at the same length now.
  548|       |  // Since other has more than 0 digits we know that the access to
  549|       |  // RawBigit(used_bigits_ - 1) is safe.
  550|  6.58k|  const Chunk this_bigit = RawBigit(used_bigits_ - 1);
  551|  6.58k|  const Chunk other_bigit = other.RawBigit(other.used_bigits_ - 1);
  552|       |
  553|  6.58k|  if (other.used_bigits_ == 1) {
  ------------------
  |  Branch (553:7): [True: 2.24k, False: 4.34k]
  ------------------
  554|       |    // Shortcut for easy (and common) case.
  555|  2.24k|    int quotient = this_bigit / other_bigit;
  556|  2.24k|    RawBigit(used_bigits_ - 1) = this_bigit - other_bigit * quotient;
  557|  2.24k|    DOUBLE_CONVERSION_ASSERT(quotient < 0x10000);
  ------------------
  |  |   57|  2.24k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.24k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  558|  2.24k|    result += static_cast<uint16_t>(quotient);
  559|  2.24k|    Clamp();
  560|  2.24k|    return result;
  561|  2.24k|  }
  562|       |
  563|  4.34k|  const int division_estimate = this_bigit / (other_bigit + 1);
  564|  4.34k|  DOUBLE_CONVERSION_ASSERT(division_estimate < 0x10000);
  ------------------
  |  |   57|  4.34k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  4.34k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  565|  4.34k|  result += static_cast<uint16_t>(division_estimate);
  566|  4.34k|  SubtractTimes(other, division_estimate);
  567|       |
  568|  4.34k|  if (other_bigit * (division_estimate + 1) > this_bigit) {
  ------------------
  |  Branch (568:7): [True: 2.81k, False: 1.52k]
  ------------------
  569|       |    // No need to even try to subtract. Even if other's remaining digits were 0
  570|       |    // another subtraction would be too much.
  571|  2.81k|    return result;
  572|  2.81k|  }
  573|       |
  574|  3.20k|  while (LessEqual(other, *this)) {
  ------------------
  |  Branch (574:10): [True: 1.68k, False: 1.52k]
  ------------------
  575|  1.68k|    SubtractBignum(other);
  576|  1.68k|    result++;
  577|  1.68k|  }
  578|  1.52k|  return result;
  579|  4.34k|}
_ZNK6icu_7817double_conversion6Bignum11BigitOrZeroEi:
  647|  58.0k|Bignum::Chunk Bignum::BigitOrZero(const int index) const {
  648|  58.0k|  if (index >= BigitLength()) {
  ------------------
  |  Branch (648:7): [True: 7.48k, False: 50.5k]
  ------------------
  649|  7.48k|    return 0;
  650|  7.48k|  }
  651|  50.5k|  if (index < exponent_) {
  ------------------
  |  Branch (651:7): [True: 657, False: 49.9k]
  ------------------
  652|    657|    return 0;
  653|    657|  }
  654|  49.9k|  return RawBigit(index - exponent_);
  655|  50.5k|}
_ZN6icu_7817double_conversion6Bignum7CompareERKS1_S3_:
  658|  12.1k|int Bignum::Compare(const Bignum& a, const Bignum& b) {
  659|  12.1k|  DOUBLE_CONVERSION_ASSERT(a.IsClamped());
  ------------------
  |  |   57|  12.1k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  12.1k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  660|  12.1k|  DOUBLE_CONVERSION_ASSERT(b.IsClamped());
  ------------------
  |  |   57|  12.1k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  12.1k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  661|  12.1k|  const int bigit_length_a = a.BigitLength();
  662|  12.1k|  const int bigit_length_b = b.BigitLength();
  663|  12.1k|  if (bigit_length_a < bigit_length_b) {
  ------------------
  |  Branch (663:7): [True: 83, False: 12.0k]
  ------------------
  664|     83|    return -1;
  665|     83|  }
  666|  12.0k|  if (bigit_length_a > bigit_length_b) {
  ------------------
  |  Branch (666:7): [True: 5.26k, False: 6.80k]
  ------------------
  667|  5.26k|    return +1;
  668|  5.26k|  }
  669|  16.3k|  for (int i = bigit_length_a - 1; i >= (std::min)(a.exponent_, b.exponent_); --i) {
  ------------------
  |  Branch (669:36): [True: 15.0k, False: 1.33k]
  ------------------
  670|  15.0k|    const Chunk bigit_a = a.BigitOrZero(i);
  671|  15.0k|    const Chunk bigit_b = b.BigitOrZero(i);
  672|  15.0k|    if (bigit_a < bigit_b) {
  ------------------
  |  Branch (672:9): [True: 2.22k, False: 12.8k]
  ------------------
  673|  2.22k|      return -1;
  674|  2.22k|    }
  675|  12.8k|    if (bigit_a > bigit_b) {
  ------------------
  |  Branch (675:9): [True: 3.24k, False: 9.55k]
  ------------------
  676|  3.24k|      return +1;
  677|  3.24k|    }
  678|       |    // Otherwise they are equal up to this digit. Try the next digit.
  679|  12.8k|  }
  680|  1.33k|  return 0;
  681|  6.80k|}
_ZN6icu_7817double_conversion6Bignum11PlusCompareERKS1_S3_S3_:
  684|  7.65k|int Bignum::PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c) {
  685|  7.65k|  DOUBLE_CONVERSION_ASSERT(a.IsClamped());
  ------------------
  |  |   57|  7.65k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  7.65k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  686|  7.65k|  DOUBLE_CONVERSION_ASSERT(b.IsClamped());
  ------------------
  |  |   57|  7.65k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  7.65k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  687|  7.65k|  DOUBLE_CONVERSION_ASSERT(c.IsClamped());
  ------------------
  |  |   57|  7.65k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  7.65k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  688|  7.65k|  if (a.BigitLength() < b.BigitLength()) {
  ------------------
  |  Branch (688:7): [True: 82, False: 7.57k]
  ------------------
  689|     82|    return PlusCompare(b, a, c);
  690|     82|  }
  691|  7.57k|  if (a.BigitLength() + 1 < c.BigitLength()) {
  ------------------
  |  Branch (691:7): [True: 95, False: 7.47k]
  ------------------
  692|     95|    return -1;
  693|     95|  }
  694|  7.47k|  if (a.BigitLength() > c.BigitLength()) {
  ------------------
  |  Branch (694:7): [True: 30, False: 7.44k]
  ------------------
  695|     30|    return +1;
  696|     30|  }
  697|       |  // The exponent encodes 0-bigits. So if there are more 0-digits in 'a' than
  698|       |  // 'b' has digits, then the bigit-length of 'a'+'b' must be equal to the one
  699|       |  // of 'a'.
  700|  7.44k|  if (a.exponent_ >= b.BigitLength() && a.BigitLength() < c.BigitLength()) {
  ------------------
  |  Branch (700:7): [True: 24, False: 7.42k]
  |  Branch (700:41): [True: 0, False: 24]
  ------------------
  701|      0|    return -1;
  702|      0|  }
  703|       |
  704|  7.44k|  Chunk borrow = 0;
  705|       |  // Starting at min_exponent all digits are == 0. So no need to compare them.
  706|  7.44k|  const int min_exponent = (std::min)((std::min)(a.exponent_, b.exponent_), c.exponent_);
  707|  9.46k|  for (int i = c.BigitLength() - 1; i >= min_exponent; --i) {
  ------------------
  |  Branch (707:37): [True: 9.33k, False: 129]
  ------------------
  708|  9.33k|    const Chunk chunk_a = a.BigitOrZero(i);
  709|  9.33k|    const Chunk chunk_b = b.BigitOrZero(i);
  710|  9.33k|    const Chunk chunk_c = c.BigitOrZero(i);
  711|  9.33k|    const Chunk sum = chunk_a + chunk_b;
  712|  9.33k|    if (sum > chunk_c + borrow) {
  ------------------
  |  Branch (712:9): [True: 413, False: 8.92k]
  ------------------
  713|    413|      return +1;
  714|  8.92k|    } else {
  715|  8.92k|      borrow = chunk_c + borrow - sum;
  716|  8.92k|      if (borrow > 1) {
  ------------------
  |  Branch (716:11): [True: 6.90k, False: 2.02k]
  ------------------
  717|  6.90k|        return -1;
  718|  6.90k|      }
  719|  2.02k|      borrow <<= kBigitSize;
  720|  2.02k|    }
  721|  9.33k|  }
  722|    129|  if (borrow == 0) {
  ------------------
  |  Branch (722:7): [True: 129, False: 0]
  ------------------
  723|    129|    return 0;
  724|    129|  }
  725|      0|  return -1;
  726|    129|}
_ZN6icu_7817double_conversion6Bignum5ClampEv:
  729|  12.9k|void Bignum::Clamp() {
  730|  15.3k|  while (used_bigits_ > 0 && RawBigit(used_bigits_ - 1) == 0) {
  ------------------
  |  Branch (730:10): [True: 15.3k, False: 24]
  |  Branch (730:30): [True: 2.39k, False: 12.9k]
  ------------------
  731|  2.39k|    used_bigits_--;
  732|  2.39k|  }
  733|  12.9k|  if (used_bigits_ == 0) {
  ------------------
  |  Branch (733:7): [True: 24, False: 12.9k]
  ------------------
  734|       |    // Zero.
  735|     24|    exponent_ = 0;
  736|     24|  }
  737|  12.9k|}
_ZN6icu_7817double_conversion6Bignum5AlignERKS1_:
  740|  13.7k|void Bignum::Align(const Bignum& other) {
  741|  13.7k|  if (exponent_ > other.exponent_) {
  ------------------
  |  Branch (741:7): [True: 158, False: 13.5k]
  ------------------
  742|       |    // If "X" represents a "hidden" bigit (by the exponent) then we are in the
  743|       |    // following case (a == this, b == other):
  744|       |    // a:  aaaaaaXXXX   or a:   aaaaaXXX
  745|       |    // b:     bbbbbbX      b: bbbbbbbbXX
  746|       |    // We replace some of the hidden digits (X) of a with 0 digits.
  747|       |    // a:  aaaaaa000X   or a:   aaaaa0XX
  748|    158|    const int zero_bigits = exponent_ - other.exponent_;
  749|    158|    EnsureCapacity(used_bigits_ + zero_bigits);
  750|    641|    for (int i = used_bigits_ - 1; i >= 0; --i) {
  ------------------
  |  Branch (750:36): [True: 483, False: 158]
  ------------------
  751|    483|      RawBigit(i + zero_bigits) = RawBigit(i);
  752|    483|    }
  753|  2.31k|    for (int i = 0; i < zero_bigits; ++i) {
  ------------------
  |  Branch (753:21): [True: 2.15k, False: 158]
  ------------------
  754|  2.15k|      RawBigit(i) = 0;
  755|  2.15k|    }
  756|    158|    used_bigits_ += static_cast<int16_t>(zero_bigits);
  757|    158|    exponent_ -= static_cast<int16_t>(zero_bigits);
  758|       |
  759|    158|    DOUBLE_CONVERSION_ASSERT(used_bigits_ >= 0);
  ------------------
  |  |   57|    158|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    158|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  760|    158|    DOUBLE_CONVERSION_ASSERT(exponent_ >= 0);
  ------------------
  |  |   57|    158|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    158|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  761|    158|  }
  762|  13.7k|}
_ZN6icu_7817double_conversion6Bignum15BigitsShiftLeftEi:
  765|  4.39k|void Bignum::BigitsShiftLeft(const int shift_amount) {
  766|  4.39k|  DOUBLE_CONVERSION_ASSERT(shift_amount < kBigitSize);
  ------------------
  |  |   57|  4.39k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  4.39k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  767|  4.39k|  DOUBLE_CONVERSION_ASSERT(shift_amount >= 0);
  ------------------
  |  |   57|  4.39k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  4.39k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  768|  4.39k|  Chunk carry = 0;
  769|  29.2k|  for (int i = 0; i < used_bigits_; ++i) {
  ------------------
  |  Branch (769:19): [True: 24.8k, False: 4.39k]
  ------------------
  770|  24.8k|    const Chunk new_carry = RawBigit(i) >> (kBigitSize - shift_amount);
  771|  24.8k|    RawBigit(i) = ((RawBigit(i) << shift_amount) + carry) & kBigitMask;
  772|  24.8k|    carry = new_carry;
  773|  24.8k|  }
  774|  4.39k|  if (carry != 0) {
  ------------------
  |  Branch (774:7): [True: 1.66k, False: 2.73k]
  ------------------
  775|  1.66k|    RawBigit(used_bigits_) = carry;
  776|  1.66k|    used_bigits_++;
  777|  1.66k|  }
  778|  4.39k|}
_ZN6icu_7817double_conversion6Bignum13SubtractTimesERKS1_i:
  781|  6.63k|void Bignum::SubtractTimes(const Bignum& other, const int factor) {
  782|  6.63k|  DOUBLE_CONVERSION_ASSERT(exponent_ <= other.exponent_);
  ------------------
  |  |   57|  6.63k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  6.63k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  783|  6.63k|  if (factor < 3) {
  ------------------
  |  Branch (783:7): [True: 3.72k, False: 2.91k]
  ------------------
  784|  7.73k|    for (int i = 0; i < factor; ++i) {
  ------------------
  |  Branch (784:21): [True: 4.01k, False: 3.72k]
  ------------------
  785|  4.01k|      SubtractBignum(other);
  786|  4.01k|    }
  787|  3.72k|    return;
  788|  3.72k|  }
  789|  2.91k|  Chunk borrow = 0;
  790|  2.91k|  const int exponent_diff = other.exponent_ - exponent_;
  791|  33.6k|  for (int i = 0; i < other.used_bigits_; ++i) {
  ------------------
  |  Branch (791:19): [True: 30.7k, False: 2.91k]
  ------------------
  792|  30.7k|    const DoubleChunk product = static_cast<DoubleChunk>(factor) * other.RawBigit(i);
  793|  30.7k|    const DoubleChunk remove = borrow + product;
  794|  30.7k|    const Chunk difference = RawBigit(i + exponent_diff) - (remove & kBigitMask);
  795|  30.7k|    RawBigit(i + exponent_diff) = difference & kBigitMask;
  796|  30.7k|    borrow = static_cast<Chunk>((difference >> (kChunkSize - 1)) +
  797|  30.7k|                                (remove >> kBigitSize));
  798|  30.7k|  }
  799|  3.32k|  for (int i = other.used_bigits_ + exponent_diff; i < used_bigits_; ++i) {
  ------------------
  |  Branch (799:52): [True: 410, False: 2.91k]
  ------------------
  800|    410|    if (borrow == 0) {
  ------------------
  |  Branch (800:9): [True: 0, False: 410]
  ------------------
  801|      0|      return;
  802|      0|    }
  803|    410|    const Chunk difference = RawBigit(i) - borrow;
  804|    410|    RawBigit(i) = difference & kBigitMask;
  805|    410|    borrow = difference >> (kChunkSize - 1);
  806|    410|  }
  807|  2.91k|  Clamp();
  808|  2.91k|}
double-conversion-bignum.cpp:_ZN6icu_7817double_conversionL10ReadUInt64ENS0_6VectorIKcEEii:
  100|  1.64k|                           const int digits_to_read) {
  101|  1.64k|  uint64_t result = 0;
  102|  22.9k|  for (int i = from; i < from + digits_to_read; ++i) {
  ------------------
  |  Branch (102:22): [True: 21.3k, False: 1.64k]
  ------------------
  103|  21.3k|    const int digit = buffer[i] - '0';
  104|  21.3k|    DOUBLE_CONVERSION_ASSERT(0 <= digit && digit <= 9);
  ------------------
  |  |   57|  21.3k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  21.3k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  105|  21.3k|    result = result * 10 + digit;
  106|  21.3k|  }
  107|  1.64k|  return result;
  108|  1.64k|}

_ZN6icu_7817double_conversion6BignumC2Ev:
   56|  5.65k|  Bignum() : used_bigits_(0), exponent_(0) {}
_ZN6icu_7817double_conversion6Bignum7Times10Ev:
   77|  13.8k|  void Times10() { return MultiplyByUInt32(10); }
_ZN6icu_7817double_conversion6Bignum5EqualERKS1_S3_:
   91|    805|  static bool Equal(const Bignum& a, const Bignum& b) {
   92|    805|    return Compare(a, b) == 0;
   93|    805|  }
_ZN6icu_7817double_conversion6Bignum9LessEqualERKS1_S3_:
   94|  6.64k|  static bool LessEqual(const Bignum& a, const Bignum& b) {
   95|  6.64k|    return Compare(a, b) <= 0;
   96|  6.64k|  }
_ZN6icu_7817double_conversion6Bignum4LessERKS1_S3_:
   97|  3.46k|  static bool Less(const Bignum& a, const Bignum& b) {
   98|  3.46k|    return Compare(a, b) < 0;
   99|  3.46k|  }
_ZN6icu_7817double_conversion6Bignum14EnsureCapacityEi:
  128|  16.8k|  static void EnsureCapacity(const int size) {
  129|  16.8k|    if (size > kBigitCapacity) {
  ------------------
  |  Branch (129:9): [True: 0, False: 16.8k]
  ------------------
  130|      0|      DOUBLE_CONVERSION_UNREACHABLE();
  ------------------
  |  |   87|      0|#define DOUBLE_CONVERSION_UNREACHABLE()   (abort())
  ------------------
  131|      0|    }
  132|  16.8k|  }
_ZN6icu_7817double_conversion6Bignum4ZeroEv:
  138|  5.81k|  void Zero() {
  139|  5.81k|    used_bigits_ = 0;
  140|  5.81k|    exponent_ = 0;
  141|  5.81k|  }
_ZNK6icu_7817double_conversion6Bignum11BigitLengthEv:
  147|   177k|  int BigitLength() const { return used_bigits_ + exponent_; }

_ZN6icu_7817double_conversion16PowersOfTenCache36GetCachedPowerForBinaryExponentRangeEiiPNS0_5DiyFpEPi:
  155|  2.97k|    int* decimal_exponent) {
  156|  2.97k|  int kQ = DiyFp::kSignificandSize;
  157|  2.97k|  double k = ceil((min_exponent + kQ - 1) * kD_1_LOG2_10);
  158|  2.97k|  int foo = kCachedPowersOffset;
  159|  2.97k|  int index =
  160|  2.97k|      (foo + static_cast<int>(k) - 1) / kDecimalExponentDistance + 1;
  161|  2.97k|  DOUBLE_CONVERSION_ASSERT(0 <= index && index < static_cast<int>(DOUBLE_CONVERSION_ARRAY_SIZE(kCachedPowers)));
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  162|  2.97k|  CachedPower cached_power = kCachedPowers[index];
  163|  2.97k|  DOUBLE_CONVERSION_ASSERT(min_exponent <= cached_power.binary_exponent);
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  164|  2.97k|  (void) max_exponent;  // Mark variable as used.
  165|  2.97k|  DOUBLE_CONVERSION_ASSERT(cached_power.binary_exponent <= max_exponent);
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  166|  2.97k|  *decimal_exponent = cached_power.decimal_exponent;
  167|  2.97k|  *power = DiyFp(cached_power.significand, cached_power.binary_exponent);
  168|  2.97k|}
_ZN6icu_7817double_conversion16PowersOfTenCache32GetCachedPowerForDecimalExponentEiPNS0_5DiyFpEPi:
  173|  4.26k|                                      int* found_exponent) {
  174|  4.26k|  DOUBLE_CONVERSION_ASSERT(kMinDecimalExponent <= requested_exponent);
  ------------------
  |  |   57|  4.26k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  4.26k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  175|  4.26k|  DOUBLE_CONVERSION_ASSERT(requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance);
  ------------------
  |  |   57|  4.26k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  4.26k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  176|  4.26k|  int index =
  177|  4.26k|      (requested_exponent + kCachedPowersOffset) / kDecimalExponentDistance;
  178|  4.26k|  CachedPower cached_power = kCachedPowers[index];
  179|  4.26k|  *power = DiyFp(cached_power.significand, cached_power.binary_exponent);
  180|  4.26k|  *found_exponent = cached_power.decimal_exponent;
  181|  4.26k|  DOUBLE_CONVERSION_ASSERT(*found_exponent <= requested_exponent);
  ------------------
  |  |   57|  4.26k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  4.26k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  182|  4.26k|  DOUBLE_CONVERSION_ASSERT(requested_exponent < *found_exponent + kDecimalExponentDistance);
  ------------------
  |  |   57|  4.26k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  4.26k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  183|  4.26k|}

_ZN6icu_7817double_conversion5DiyFpC2Ev:
   59|  20.4k|  DiyFp() : f_(0), e_(0) {}
_ZN6icu_7817double_conversion5DiyFpC2Emi:
   60|  41.5k|  DiyFp(const uint64_t significand, const int32_t exponent) : f_(significand), e_(exponent) {}
_ZN6icu_7817double_conversion5DiyFp8SubtractERKS1_:
   66|  5.94k|  void Subtract(const DiyFp& other) {
   67|  5.94k|    DOUBLE_CONVERSION_ASSERT(e_ == other.e_);
  ------------------
  |  |   57|  5.94k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  5.94k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
   68|  5.94k|    DOUBLE_CONVERSION_ASSERT(f_ >= other.f_);
  ------------------
  |  |   57|  5.94k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  5.94k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
   69|  5.94k|    f_ -= other.f_;
   70|  5.94k|  }
_ZN6icu_7817double_conversion5DiyFp5MinusERKS1_S3_:
   75|  5.94k|  static DiyFp Minus(const DiyFp& a, const DiyFp& b) {
   76|  5.94k|    DiyFp result = a;
   77|  5.94k|    result.Subtract(b);
   78|  5.94k|    return result;
   79|  5.94k|  }
_ZN6icu_7817double_conversion5DiyFp8MultiplyERKS1_:
   82|  16.9k|  void Multiply(const DiyFp& other) {
   83|       |    // Simply "emulates" a 128 bit multiplication.
   84|       |    // However: the resulting number only contains 64 bits. The least
   85|       |    // significant 64 bits are only used for rounding the most significant 64
   86|       |    // bits.
   87|  16.9k|    const uint64_t kM32 = 0xFFFFFFFFU;
   88|  16.9k|    const uint64_t a = f_ >> 32;
   89|  16.9k|    const uint64_t b = f_ & kM32;
   90|  16.9k|    const uint64_t c = other.f_ >> 32;
   91|  16.9k|    const uint64_t d = other.f_ & kM32;
   92|  16.9k|    const uint64_t ac = a * c;
   93|  16.9k|    const uint64_t bc = b * c;
   94|  16.9k|    const uint64_t ad = a * d;
   95|  16.9k|    const uint64_t bd = b * d;
   96|       |    // By adding 1U << 31 to tmp we round the final result.
   97|       |    // Halfway cases will be rounded up.
   98|  16.9k|    const uint64_t tmp = (bd >> 32) + (ad & kM32) + (bc & kM32) + (1U << 31);
   99|  16.9k|    e_ += other.e_ + 64;
  100|  16.9k|    f_ = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32);
  101|  16.9k|  }
_ZN6icu_7817double_conversion5DiyFp5TimesERKS1_S3_:
  104|  8.91k|  static DiyFp Times(const DiyFp& a, const DiyFp& b) {
  105|  8.91k|    DiyFp result = a;
  106|  8.91k|    result.Multiply(b);
  107|  8.91k|    return result;
  108|  8.91k|  }
_ZN6icu_7817double_conversion5DiyFp9NormalizeEv:
  110|  11.5k|  void Normalize() {
  111|  11.5k|    DOUBLE_CONVERSION_ASSERT(f_ != 0);
  ------------------
  |  |   57|  11.5k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  11.5k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  112|  11.5k|    uint64_t significand = f_;
  113|  11.5k|    int32_t exponent = e_;
  114|       |
  115|       |    // This method is mainly called for normalizing boundaries. In general,
  116|       |    // boundaries need to be shifted by 10 bits, and we optimize for this case.
  117|  11.5k|    const uint64_t k10MSBits = DOUBLE_CONVERSION_UINT64_2PART_C(0xFFC00000, 00000000);
  ------------------
  |  |  205|  11.5k|#define DOUBLE_CONVERSION_UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
  ------------------
  118|  21.4k|    while ((significand & k10MSBits) == 0) {
  ------------------
  |  Branch (118:12): [True: 9.93k, False: 11.5k]
  ------------------
  119|  9.93k|      significand <<= 10;
  120|  9.93k|      exponent -= 10;
  121|  9.93k|    }
  122|  33.1k|    while ((significand & kUint64MSB) == 0) {
  ------------------
  |  Branch (122:12): [True: 21.6k, False: 11.5k]
  ------------------
  123|  21.6k|      significand <<= 1;
  124|  21.6k|      exponent--;
  125|  21.6k|    }
  126|  11.5k|    f_ = significand;
  127|  11.5k|    e_ = exponent;
  128|  11.5k|  }
_ZN6icu_7817double_conversion5DiyFp9NormalizeERKS1_:
  130|  2.97k|  static DiyFp Normalize(const DiyFp& a) {
  131|  2.97k|    DiyFp result = a;
  132|  2.97k|    result.Normalize();
  133|  2.97k|    return result;
  134|  2.97k|  }
_ZNK6icu_7817double_conversion5DiyFp1fEv:
  136|   141k|  uint64_t f() const { return f_; }
_ZNK6icu_7817double_conversion5DiyFp1eEv:
  137|   114k|  int32_t e() const { return e_; }
_ZN6icu_7817double_conversion5DiyFp5set_fEm:
  139|  29.7k|  void set_f(uint64_t new_value) { f_ = new_value; }
_ZN6icu_7817double_conversion5DiyFp5set_eEi:
  140|  3.05k|  void set_e(int32_t new_value) { e_ = new_value; }

_ZN6icu_7817double_conversion23DoubleToStringConverter13DoubleToAsciiEdNS1_8DtoaModeEiPciPbPiS5_:
  409|  2.97k|                                            int* point) {
  410|  2.97k|  Vector<char> vector(buffer, buffer_length);
  411|  2.97k|  DOUBLE_CONVERSION_ASSERT(!Double(v).IsSpecial());
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  412|  2.97k|  DOUBLE_CONVERSION_ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE || requested_digits >= 0);
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  413|       |
  414|  2.97k|  if (Double(v).Sign() < 0) {
  ------------------
  |  Branch (414:7): [True: 0, False: 2.97k]
  ------------------
  415|      0|    *sign = true;
  416|      0|    v = -v;
  417|  2.97k|  } else {
  418|  2.97k|    *sign = false;
  419|  2.97k|  }
  420|       |
  421|  2.97k|  if (mode == PRECISION && requested_digits == 0) {
  ------------------
  |  Branch (421:7): [True: 0, False: 2.97k]
  |  Branch (421:28): [True: 0, False: 0]
  ------------------
  422|      0|    vector[0] = '\0';
  423|      0|    *length = 0;
  424|      0|    return;
  425|      0|  }
  426|       |
  427|  2.97k|  if (v == 0) {
  ------------------
  |  Branch (427:7): [True: 0, False: 2.97k]
  ------------------
  428|      0|    vector[0] = '0';
  429|      0|    vector[1] = '\0';
  430|      0|    *length = 1;
  431|      0|    *point = 1;
  432|      0|    return;
  433|      0|  }
  434|       |
  435|  2.97k|  bool fast_worked;
  436|  2.97k|  switch (mode) {
  437|  2.97k|    case SHORTEST:
  ------------------
  |  Branch (437:5): [True: 2.97k, False: 0]
  ------------------
  438|  2.97k|      fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST, 0, vector, length, point);
  439|  2.97k|      break;
  440|       |#if 0 // not needed for ICU
  441|       |    case SHORTEST_SINGLE:
  442|       |      fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST_SINGLE, 0,
  443|       |                             vector, length, point);
  444|       |      break;
  445|       |    case FIXED:
  446|       |      fast_worked = FastFixedDtoa(v, requested_digits, vector, length, point);
  447|       |      break;
  448|       |    case PRECISION:
  449|       |      fast_worked = FastDtoa(v, FAST_DTOA_PRECISION, requested_digits,
  450|       |                             vector, length, point);
  451|       |      break;
  452|       |#endif // not needed for ICU
  453|      0|    default:
  ------------------
  |  Branch (453:5): [True: 0, False: 2.97k]
  ------------------
  454|      0|      fast_worked = false;
  455|      0|      DOUBLE_CONVERSION_UNREACHABLE();
  ------------------
  |  |   87|      0|#define DOUBLE_CONVERSION_UNREACHABLE()   (abort())
  ------------------
  456|  2.97k|  }
  457|  2.97k|  if (fast_worked) return;
  ------------------
  |  Branch (457:7): [True: 2.53k, False: 433]
  ------------------
  458|       |
  459|       |  // If the fast dtoa didn't succeed use the slower bignum version.
  460|    433|  BignumDtoaMode bignum_mode = DtoaToBignumDtoaMode(mode);
  461|    433|  BignumDtoa(v, bignum_mode, requested_digits, vector, length, point);
  462|    433|  vector[*length] = '\0';
  463|    433|}
double-conversion-double-to-string.cpp:_ZN6icu_7817double_conversionL20DtoaToBignumDtoaModeENS0_23DoubleToStringConverter8DtoaModeE:
  389|    433|    DoubleToStringConverter::DtoaMode dtoa_mode) {
  390|    433|  switch (dtoa_mode) {
  391|    433|    case DoubleToStringConverter::SHORTEST:  return BIGNUM_DTOA_SHORTEST;
  ------------------
  |  Branch (391:5): [True: 433, False: 0]
  ------------------
  392|      0|    case DoubleToStringConverter::SHORTEST_SINGLE:
  ------------------
  |  Branch (392:5): [True: 0, False: 433]
  ------------------
  393|      0|        return BIGNUM_DTOA_SHORTEST_SINGLE;
  394|      0|    case DoubleToStringConverter::FIXED:     return BIGNUM_DTOA_FIXED;
  ------------------
  |  Branch (394:5): [True: 0, False: 433]
  ------------------
  395|      0|    case DoubleToStringConverter::PRECISION: return BIGNUM_DTOA_PRECISION;
  ------------------
  |  Branch (395:5): [True: 0, False: 433]
  ------------------
  396|      0|    default:
  ------------------
  |  Branch (396:5): [True: 0, False: 433]
  ------------------
  397|      0|      DOUBLE_CONVERSION_UNREACHABLE();
  ------------------
  |  |   87|      0|#define DOUBLE_CONVERSION_UNREACHABLE()   (abort())
  ------------------
  398|    433|  }
  399|    433|}

_ZN6icu_7817double_conversion8FastDtoaEdNS0_12FastDtoaModeEiNS0_6VectorIcEEPiS4_:
  654|  2.97k|              int* decimal_point) {
  655|  2.97k|  DOUBLE_CONVERSION_ASSERT(v > 0);
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  656|  2.97k|  DOUBLE_CONVERSION_ASSERT(!Double(v).IsSpecial());
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  657|       |
  658|  2.97k|  bool result = false;
  659|  2.97k|  int decimal_exponent = 0;
  660|  2.97k|  switch (mode) {
  661|  2.97k|    case FAST_DTOA_SHORTEST:
  ------------------
  |  Branch (661:5): [True: 2.97k, False: 0]
  ------------------
  662|  2.97k|    case FAST_DTOA_SHORTEST_SINGLE:
  ------------------
  |  Branch (662:5): [True: 0, False: 2.97k]
  ------------------
  663|  2.97k|      result = Grisu3(v, mode, buffer, length, &decimal_exponent);
  664|  2.97k|      break;
  665|      0|    case FAST_DTOA_PRECISION:
  ------------------
  |  Branch (665:5): [True: 0, False: 2.97k]
  ------------------
  666|      0|      result = Grisu3Counted(v, requested_digits,
  667|      0|                             buffer, length, &decimal_exponent);
  668|      0|      break;
  669|      0|    default:
  ------------------
  |  Branch (669:5): [True: 0, False: 2.97k]
  ------------------
  670|      0|      DOUBLE_CONVERSION_UNREACHABLE();
  ------------------
  |  |   87|      0|#define DOUBLE_CONVERSION_UNREACHABLE()   (abort())
  ------------------
  671|  2.97k|  }
  672|  2.97k|  if (result) {
  ------------------
  |  Branch (672:7): [True: 2.53k, False: 433]
  ------------------
  673|  2.53k|    *decimal_point = *length + decimal_exponent;
  674|  2.53k|    buffer[*length] = '\0';
  675|  2.53k|  }
  676|  2.97k|  return result;
  677|  2.97k|}
double-conversion-fast-dtoa.cpp:_ZN6icu_7817double_conversionL6Grisu3EdNS0_12FastDtoaModeENS0_6VectorIcEEPiS4_:
  537|  2.97k|                   int* decimal_exponent) {
  538|  2.97k|  DiyFp w = Double(v).AsNormalizedDiyFp();
  539|       |  // boundary_minus and boundary_plus are the boundaries between v and its
  540|       |  // closest floating-point neighbors. Any number strictly between
  541|       |  // boundary_minus and boundary_plus will round to v when convert to a double.
  542|       |  // Grisu3 will never output representations that lie exactly on a boundary.
  543|  2.97k|  DiyFp boundary_minus, boundary_plus;
  544|  2.97k|  if (mode == FAST_DTOA_SHORTEST) {
  ------------------
  |  Branch (544:7): [True: 2.97k, False: 0]
  ------------------
  545|  2.97k|    Double(v).NormalizedBoundaries(&boundary_minus, &boundary_plus);
  546|  2.97k|  } else {
  547|      0|    DOUBLE_CONVERSION_ASSERT(mode == FAST_DTOA_SHORTEST_SINGLE);
  ------------------
  |  |   57|      0|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  548|      0|    float single_v = static_cast<float>(v);
  549|      0|    Single(single_v).NormalizedBoundaries(&boundary_minus, &boundary_plus);
  550|      0|  }
  551|  2.97k|  DOUBLE_CONVERSION_ASSERT(boundary_plus.e() == w.e());
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  552|  2.97k|  DiyFp ten_mk;  // Cached power of ten: 10^-k
  553|  2.97k|  int mk;        // -k
  554|  2.97k|  int ten_mk_minimal_binary_exponent =
  555|  2.97k|     kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize);
  556|  2.97k|  int ten_mk_maximal_binary_exponent =
  557|  2.97k|     kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize);
  558|  2.97k|  PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
  559|  2.97k|      ten_mk_minimal_binary_exponent,
  560|  2.97k|      ten_mk_maximal_binary_exponent,
  561|  2.97k|      &ten_mk, &mk);
  562|  2.97k|  DOUBLE_CONVERSION_ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  563|  2.97k|          DiyFp::kSignificandSize) &&
  564|  2.97k|         (kMaximalTargetExponent >= w.e() + ten_mk.e() +
  565|  2.97k|          DiyFp::kSignificandSize));
  566|       |  // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a
  567|       |  // 64 bit significand and ten_mk is thus only precise up to 64 bits.
  568|       |
  569|       |  // The DiyFp::Times procedure rounds its result, and ten_mk is approximated
  570|       |  // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now
  571|       |  // off by a small amount.
  572|       |  // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w.
  573|       |  // In other words: let f = scaled_w.f() and e = scaled_w.e(), then
  574|       |  //           (f-1) * 2^e < w*10^k < (f+1) * 2^e
  575|  2.97k|  DiyFp scaled_w = DiyFp::Times(w, ten_mk);
  576|  2.97k|  DOUBLE_CONVERSION_ASSERT(scaled_w.e() ==
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  577|  2.97k|         boundary_plus.e() + ten_mk.e() + DiyFp::kSignificandSize);
  578|       |  // In theory it would be possible to avoid some recomputations by computing
  579|       |  // the difference between w and boundary_minus/plus (a power of 2) and to
  580|       |  // compute scaled_boundary_minus/plus by subtracting/adding from
  581|       |  // scaled_w. However the code becomes much less readable and the speed
  582|       |  // enhancements are not terrific.
  583|  2.97k|  DiyFp scaled_boundary_minus = DiyFp::Times(boundary_minus, ten_mk);
  584|  2.97k|  DiyFp scaled_boundary_plus  = DiyFp::Times(boundary_plus,  ten_mk);
  585|       |
  586|       |  // DigitGen will generate the digits of scaled_w. Therefore we have
  587|       |  // v == (double) (scaled_w * 10^-mk).
  588|       |  // Set decimal_exponent == -mk and pass it to DigitGen. If scaled_w is not an
  589|       |  // integer than it will be updated. For instance if scaled_w == 1.23 then
  590|       |  // the buffer will be filled with "123" and the decimal_exponent will be
  591|       |  // decreased by 2.
  592|  2.97k|  int kappa;
  593|  2.97k|  bool result = DigitGen(scaled_boundary_minus, scaled_w, scaled_boundary_plus,
  594|  2.97k|                         buffer, length, &kappa);
  595|  2.97k|  *decimal_exponent = -mk + kappa;
  596|  2.97k|  return result;
  597|  2.97k|}
double-conversion-fast-dtoa.cpp:_ZN6icu_7817double_conversionL8DigitGenENS0_5DiyFpES1_S1_NS0_6VectorIcEEPiS4_:
  319|  2.97k|                     int* kappa) {
  320|  2.97k|  DOUBLE_CONVERSION_ASSERT(low.e() == w.e() && w.e() == high.e());
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  321|  2.97k|  DOUBLE_CONVERSION_ASSERT(low.f() + 1 <= high.f() - 1);
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  322|  2.97k|  DOUBLE_CONVERSION_ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  323|       |  // low, w and high are imprecise, but by less than one ulp (unit in the last
  324|       |  // place).
  325|       |  // If we remove (resp. add) 1 ulp from low (resp. high) we are certain that
  326|       |  // the new numbers are outside of the interval we want the final
  327|       |  // representation to lie in.
  328|       |  // Inversely adding (resp. removing) 1 ulp from low (resp. high) would yield
  329|       |  // numbers that are certain to lie in the interval. We will use this fact
  330|       |  // later on.
  331|       |  // We will now start by generating the digits within the uncertain
  332|       |  // interval. Later we will weed out representations that lie outside the safe
  333|       |  // interval and thus _might_ lie outside the correct interval.
  334|  2.97k|  uint64_t unit = 1;
  335|  2.97k|  DiyFp too_low = DiyFp(low.f() - unit, low.e());
  336|  2.97k|  DiyFp too_high = DiyFp(high.f() + unit, high.e());
  337|       |  // too_low and too_high are guaranteed to lie outside the interval we want the
  338|       |  // generated number in.
  339|  2.97k|  DiyFp unsafe_interval = DiyFp::Minus(too_high, too_low);
  340|       |  // We now cut the input number into two parts: the integral digits and the
  341|       |  // fractionals. We will not write any decimal separator though, but adapt
  342|       |  // kappa instead.
  343|       |  // Reminder: we are currently computing the digits (stored inside the buffer)
  344|       |  // such that:   too_low < buffer * 10^kappa < too_high
  345|       |  // We use too_high for the digit_generation and stop as soon as possible.
  346|       |  // If we stop early we effectively round down.
  347|  2.97k|  DiyFp one = DiyFp(static_cast<uint64_t>(1) << -w.e(), w.e());
  348|       |  // Division by one is a shift.
  349|  2.97k|  uint32_t integrals = static_cast<uint32_t>(too_high.f() >> -one.e());
  350|       |  // Modulo by one is an and.
  351|  2.97k|  uint64_t fractionals = too_high.f() & (one.f() - 1);
  352|  2.97k|  uint32_t divisor;
  353|  2.97k|  int divisor_exponent_plus_one;
  354|  2.97k|  BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()),
  355|  2.97k|                  &divisor, &divisor_exponent_plus_one);
  356|  2.97k|  *kappa = divisor_exponent_plus_one;
  357|  2.97k|  *length = 0;
  358|       |  // Loop invariant: buffer = too_high / 10^kappa  (integer division)
  359|       |  // The invariant holds for the first iteration: kappa has been initialized
  360|       |  // with the divisor exponent + 1. And the divisor is the biggest power of ten
  361|       |  // that is smaller than integrals.
  362|  20.4k|  while (*kappa > 0) {
  ------------------
  |  Branch (362:10): [True: 17.8k, False: 2.59k]
  ------------------
  363|  17.8k|    int digit = integrals / divisor;
  364|  17.8k|    DOUBLE_CONVERSION_ASSERT(digit <= 9);
  ------------------
  |  |   57|  17.8k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  17.8k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  365|  17.8k|    buffer[*length] = static_cast<char>('0' + digit);
  366|  17.8k|    (*length)++;
  367|  17.8k|    integrals %= divisor;
  368|  17.8k|    (*kappa)--;
  369|       |    // Note that kappa now equals the exponent of the divisor and that the
  370|       |    // invariant thus holds again.
  371|  17.8k|    uint64_t rest =
  372|  17.8k|        (static_cast<uint64_t>(integrals) << -one.e()) + fractionals;
  373|       |    // Invariant: too_high = buffer * 10^kappa + DiyFp(rest, one.e())
  374|       |    // Reminder: unsafe_interval.e() == one.e()
  375|  17.8k|    if (rest < unsafe_interval.f()) {
  ------------------
  |  Branch (375:9): [True: 374, False: 17.4k]
  ------------------
  376|       |      // Rounding down (by not emitting the remaining digits) yields a number
  377|       |      // that lies within the unsafe interval.
  378|    374|      return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f(),
  379|    374|                       unsafe_interval.f(), rest,
  380|    374|                       static_cast<uint64_t>(divisor) << -one.e(), unit);
  381|    374|    }
  382|  17.4k|    divisor /= 10;
  383|  17.4k|  }
  384|       |
  385|       |  // The integrals have been generated. We are at the point of the decimal
  386|       |  // separator. In the following loop we simply multiply the remaining digits by
  387|       |  // 10 and divide by one. We just need to pay attention to multiply associated
  388|       |  // data (like the interval or 'unit'), too.
  389|       |  // Note that the multiplication by 10 does not overflow, because w.e >= -60
  390|       |  // and thus one.e >= -60.
  391|  2.59k|  DOUBLE_CONVERSION_ASSERT(one.e() >= -60);
  ------------------
  |  |   57|  2.59k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.59k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  392|  2.59k|  DOUBLE_CONVERSION_ASSERT(fractionals < one.f());
  ------------------
  |  |   57|  2.59k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.59k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  393|  2.59k|  DOUBLE_CONVERSION_ASSERT(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
  ------------------
  |  |   57|  2.59k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.59k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  394|  25.1k|  for (;;) {
  395|  25.1k|    fractionals *= 10;
  396|  25.1k|    unit *= 10;
  397|  25.1k|    unsafe_interval.set_f(unsafe_interval.f() * 10);
  398|       |    // Integer division by one.
  399|  25.1k|    int digit = static_cast<int>(fractionals >> -one.e());
  400|  25.1k|    DOUBLE_CONVERSION_ASSERT(digit <= 9);
  ------------------
  |  |   57|  25.1k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  25.1k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  401|  25.1k|    buffer[*length] = static_cast<char>('0' + digit);
  402|  25.1k|    (*length)++;
  403|  25.1k|    fractionals &= one.f() - 1;  // Modulo by one.
  404|  25.1k|    (*kappa)--;
  405|  25.1k|    if (fractionals < unsafe_interval.f()) {
  ------------------
  |  Branch (405:9): [True: 2.59k, False: 22.5k]
  ------------------
  406|  2.59k|      return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f() * unit,
  407|  2.59k|                       unsafe_interval.f(), fractionals, one.f(), unit);
  408|  2.59k|    }
  409|  25.1k|  }
  410|  2.59k|}
double-conversion-fast-dtoa.cpp:_ZN6icu_7817double_conversionL15BiggestPowerTenEjiPjPi:
  257|  2.97k|                            int* exponent_plus_one) {
  258|  2.97k|  DOUBLE_CONVERSION_ASSERT(number < (1u << (number_bits + 1)));
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  259|       |  // 1233/4096 is approximately 1/lg(10).
  260|  2.97k|  int exponent_plus_one_guess = ((number_bits + 1) * 1233 >> 12);
  261|       |  // We increment to skip over the first entry in the kPowersOf10 table.
  262|       |  // Note: kPowersOf10[i] == 10^(i-1).
  263|  2.97k|  exponent_plus_one_guess++;
  264|       |  // We don't have any guarantees that 2^number_bits <= number.
  265|  2.97k|  if (number < kSmallPowersOfTen[exponent_plus_one_guess]) {
  ------------------
  |  Branch (265:7): [True: 1.59k, False: 1.37k]
  ------------------
  266|  1.59k|    exponent_plus_one_guess--;
  267|  1.59k|  }
  268|  2.97k|  *power = kSmallPowersOfTen[exponent_plus_one_guess];
  269|  2.97k|  *exponent_plus_one = exponent_plus_one_guess;
  270|  2.97k|}
double-conversion-fast-dtoa.cpp:_ZN6icu_7817double_conversionL9RoundWeedENS0_6VectorIcEEimmmmm:
   81|  2.97k|                      uint64_t unit) {
   82|  2.97k|  uint64_t small_distance = distance_too_high_w - unit;
   83|  2.97k|  uint64_t big_distance = distance_too_high_w + unit;
   84|       |  // Let w_low  = too_high - big_distance, and
   85|       |  //     w_high = too_high - small_distance.
   86|       |  // Note: w_low < w < w_high
   87|       |  //
   88|       |  // The real w (* unit) must lie somewhere inside the interval
   89|       |  // ]w_low; w_high[ (often written as "(w_low; w_high)")
   90|       |
   91|       |  // Basically the buffer currently contains a number in the unsafe interval
   92|       |  // ]too_low; too_high[ with too_low < w < too_high
   93|       |  //
   94|       |  //  too_high - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   95|       |  //                     ^v 1 unit            ^      ^                 ^      ^
   96|       |  //  boundary_high ---------------------     .      .                 .      .
   97|       |  //                     ^v 1 unit            .      .                 .      .
   98|       |  //   - - - - - - - - - - - - - - - - - - -  +  - - + - - - - - -     .      .
   99|       |  //                                          .      .         ^       .      .
  100|       |  //                                          .  big_distance  .       .      .
  101|       |  //                                          .      .         .       .    rest
  102|       |  //                              small_distance     .         .       .      .
  103|       |  //                                          v      .         .       .      .
  104|       |  //  w_high - - - - - - - - - - - - - - - - - -     .         .       .      .
  105|       |  //                     ^v 1 unit                   .         .       .      .
  106|       |  //  w ----------------------------------------     .         .       .      .
  107|       |  //                     ^v 1 unit                   v         .       .      .
  108|       |  //  w_low  - - - - - - - - - - - - - - - - - - - - -         .       .      .
  109|       |  //                                                           .       .      v
  110|       |  //  buffer --------------------------------------------------+-------+--------
  111|       |  //                                                           .       .
  112|       |  //                                                  safe_interval    .
  113|       |  //                                                           v       .
  114|       |  //   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -     .
  115|       |  //                     ^v 1 unit                                     .
  116|       |  //  boundary_low -------------------------                     unsafe_interval
  117|       |  //                     ^v 1 unit                                     v
  118|       |  //  too_low  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  119|       |  //
  120|       |  //
  121|       |  // Note that the value of buffer could lie anywhere inside the range too_low
  122|       |  // to too_high.
  123|       |  //
  124|       |  // boundary_low, boundary_high and w are approximations of the real boundaries
  125|       |  // and v (the input number). They are guaranteed to be precise up to one unit.
  126|       |  // In fact the error is guaranteed to be strictly less than one unit.
  127|       |  //
  128|       |  // Anything that lies outside the unsafe interval is guaranteed not to round
  129|       |  // to v when read again.
  130|       |  // Anything that lies inside the safe interval is guaranteed to round to v
  131|       |  // when read again.
  132|       |  // If the number inside the buffer lies inside the unsafe interval but not
  133|       |  // inside the safe interval then we simply do not know and bail out (returning
  134|       |  // false).
  135|       |  //
  136|       |  // Similarly we have to take into account the imprecision of 'w' when finding
  137|       |  // the closest representation of 'w'. If we have two potential
  138|       |  // representations, and one is closer to both w_low and w_high, then we know
  139|       |  // it is closer to the actual value v.
  140|       |  //
  141|       |  // By generating the digits of too_high we got the largest (closest to
  142|       |  // too_high) buffer that is still in the unsafe interval. In the case where
  143|       |  // w_high < buffer < too_high we try to decrement the buffer.
  144|       |  // This way the buffer approaches (rounds towards) w.
  145|       |  // There are 3 conditions that stop the decrementation process:
  146|       |  //   1) the buffer is already below w_high
  147|       |  //   2) decrementing the buffer would make it leave the unsafe interval
  148|       |  //   3) decrementing the buffer would yield a number below w_high and farther
  149|       |  //      away than the current number. In other words:
  150|       |  //              (buffer{-1} < w_high) && w_high - buffer{-1} > buffer - w_high
  151|       |  // Instead of using the buffer directly we use its distance to too_high.
  152|       |  // Conceptually rest ~= too_high - buffer
  153|       |  // We need to do the following tests in this order to avoid over- and
  154|       |  // underflows.
  155|  2.97k|  DOUBLE_CONVERSION_ASSERT(rest <= unsafe_interval);
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  156|  5.24k|  while (rest < small_distance &&  // Negated condition 1
  ------------------
  |  Branch (156:10): [True: 3.83k, False: 1.41k]
  ------------------
  157|  5.24k|         unsafe_interval - rest >= ten_kappa &&  // Negated condition 2
  ------------------
  |  Branch (157:10): [True: 3.15k, False: 684]
  ------------------
  158|  5.24k|         (rest + ten_kappa < small_distance ||  // buffer{-1} > w_high
  ------------------
  |  Branch (158:11): [True: 1.57k, False: 1.57k]
  ------------------
  159|  3.15k|          small_distance - rest >= rest + ten_kappa - small_distance)) {
  ------------------
  |  Branch (159:11): [True: 701, False: 877]
  ------------------
  160|  2.27k|    buffer[length - 1]--;
  161|  2.27k|    rest += ten_kappa;
  162|  2.27k|  }
  163|       |
  164|       |  // We have approached w+ as much as possible. We now test if approaching w-
  165|       |  // would require changing the buffer. If yes, then we have two possible
  166|       |  // representations close to w, but we cannot decide which one is closer.
  167|  2.97k|  if (rest < big_distance &&
  ------------------
  |  Branch (167:7): [True: 1.63k, False: 1.34k]
  ------------------
  168|  2.97k|      unsafe_interval - rest >= ten_kappa &&
  ------------------
  |  Branch (168:7): [True: 904, False: 726]
  ------------------
  169|  2.97k|      (rest + ten_kappa < big_distance ||
  ------------------
  |  Branch (169:8): [True: 0, False: 904]
  ------------------
  170|    904|       big_distance - rest > rest + ten_kappa - big_distance)) {
  ------------------
  |  Branch (170:8): [True: 163, False: 741]
  ------------------
  171|    163|    return false;
  172|    163|  }
  173|       |
  174|       |  // Weeding test.
  175|       |  //   The safe interval is [too_low + 2 ulp; too_high - 2 ulp]
  176|       |  //   Since too_low = too_high - unsafe_interval this is equivalent to
  177|       |  //      [too_high - unsafe_interval + 4 ulp; too_high - 2 ulp]
  178|       |  //   Conceptually we have: rest ~= too_high - buffer
  179|  2.80k|  return (2 * unit <= rest) && (rest <= unsafe_interval - 4 * unit);
  ------------------
  |  Branch (179:10): [True: 2.68k, False: 122]
  |  Branch (179:32): [True: 2.53k, False: 148]
  ------------------
  180|  2.97k|}

_ZN6icu_7817double_conversion6DoubleC2Ed:
   69|  12.7k|  explicit Double(double d) : d64_(double_to_uint64(d)) {}
double-conversion-double-to-string.cpp:_ZN6icu_7817double_conversionL16double_to_uint64Ed:
   50|  2.97k|static uint64_t double_to_uint64(double d) { return BitCast<uint64_t>(d); }
_ZNK6icu_7817double_conversion6Double4SignEv:
  189|  4.48k|  int Sign() const {
  190|  4.48k|    uint64_t d64 = AsUint64();
  191|  4.48k|    return (d64 & kSignMask) == 0? 1: -1;
  ------------------
  |  Branch (191:12): [True: 4.48k, False: 0]
  ------------------
  192|  4.48k|  }
_ZNK6icu_7817double_conversion6Double8AsUint64Ev:
  100|  37.2k|  uint64_t AsUint64() const {
  101|  37.2k|    return d64_;
  102|  37.2k|  }
_ZN6icu_7817double_conversion6DoubleC2Em:
   70|  2.74k|  explicit Double(uint64_t d64) : d64_(d64) {}
_ZN6icu_7817double_conversion6DoubleC2ENS0_5DiyFpE:
   72|  4.26k|    : d64_(DiyFpToUint64(diy_fp)) {}
_ZNK6icu_7817double_conversion6Double7AsDiyFpEv:
   76|  2.97k|  DiyFp AsDiyFp() const {
   77|  2.97k|    DOUBLE_CONVERSION_ASSERT(Sign() > 0);
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
   78|  2.97k|    DOUBLE_CONVERSION_ASSERT(!IsSpecial());
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
   79|  2.97k|    return DiyFp(Significand(), Exponent());
   80|  2.97k|  }
_ZNK6icu_7817double_conversion6Double17AsNormalizedDiyFpEv:
   83|  2.97k|  DiyFp AsNormalizedDiyFp() const {
   84|  2.97k|    DOUBLE_CONVERSION_ASSERT(value() > 0.0);
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
   85|  2.97k|    uint64_t f = Significand();
   86|  2.97k|    int e = Exponent();
   87|       |
   88|       |    // The current double could be a denormal.
   89|  20.2k|    while ((f & kHiddenBit) == 0) {
  ------------------
  |  Branch (89:12): [True: 17.2k, False: 2.97k]
  ------------------
   90|  17.2k|      f <<= 1;
   91|  17.2k|      e--;
   92|  17.2k|    }
   93|       |    // Do the final shifts in one go.
   94|  2.97k|    f <<= DiyFp::kSignificandSize - kSignificandSize;
   95|  2.97k|    e -= DiyFp::kSignificandSize - kSignificandSize;
   96|  2.97k|    return DiyFp(f, e);
   97|  2.97k|  }
_ZNK6icu_7817double_conversion6Double10NextDoubleEv:
  105|    755|  double NextDouble() const {
  106|    755|    if (d64_ == kInfinity) return Double(kInfinity).value();
  ------------------
  |  Branch (106:9): [True: 0, False: 755]
  ------------------
  107|    755|    if (Sign() < 0 && Significand() == 0) {
  ------------------
  |  Branch (107:9): [True: 0, False: 755]
  |  Branch (107:23): [True: 0, False: 0]
  ------------------
  108|       |      // -0.0
  109|      0|      return 0.0;
  110|      0|    }
  111|    755|    if (Sign() < 0) {
  ------------------
  |  Branch (111:9): [True: 0, False: 755]
  ------------------
  112|      0|      return Double(d64_ - 1).value();
  113|    755|    } else {
  114|    755|      return Double(d64_ + 1).value();
  115|    755|    }
  116|    755|  }
_ZNK6icu_7817double_conversion6Double8ExponentEv:
  128|  7.66k|  int Exponent() const {
  129|  7.66k|    if (IsDenormal()) return kDenormalExponent;
  ------------------
  |  Branch (129:9): [True: 2.16k, False: 5.49k]
  ------------------
  130|       |
  131|  5.49k|    uint64_t d64 = AsUint64();
  132|  5.49k|    int biased_e =
  133|  5.49k|        static_cast<int>((d64 & kExponentMask) >> kPhysicalSignificandSize);
  134|  5.49k|    return biased_e - kExponentBias;
  135|  7.66k|  }
_ZNK6icu_7817double_conversion6Double11SignificandEv:
  137|  8.11k|  uint64_t Significand() const {
  138|  8.11k|    uint64_t d64 = AsUint64();
  139|  8.11k|    uint64_t significand = d64 & kSignificandMask;
  140|  8.11k|    if (!IsDenormal()) {
  ------------------
  |  Branch (140:9): [True: 5.94k, False: 2.16k]
  ------------------
  141|  5.94k|      return significand + kHiddenBit;
  142|  5.94k|    } else {
  143|  2.16k|      return significand;
  144|  2.16k|    }
  145|  8.11k|  }
_ZNK6icu_7817double_conversion6Double10IsDenormalEv:
  148|  15.7k|  bool IsDenormal() const {
  149|  15.7k|    uint64_t d64 = AsUint64();
  150|  15.7k|    return (d64 & kExponentMask) == 0;
  151|  15.7k|  }
_ZNK6icu_7817double_conversion6Double13UpperBoundaryEv:
  196|  1.24k|  DiyFp UpperBoundary() const {
  197|  1.24k|    DOUBLE_CONVERSION_ASSERT(Sign() > 0);
  ------------------
  |  |   57|  1.24k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  1.24k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  198|  1.24k|    return DiyFp(Significand() * 2 + 1, Exponent() - 1);
  199|  1.24k|  }
_ZNK6icu_7817double_conversion6Double20NormalizedBoundariesEPNS0_5DiyFpES3_:
  205|  2.97k|  void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const {
  206|  2.97k|    DOUBLE_CONVERSION_ASSERT(value() > 0.0);
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  207|  2.97k|    DiyFp v = this->AsDiyFp();
  208|  2.97k|    DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1));
  209|  2.97k|    DiyFp m_minus;
  210|  2.97k|    if (LowerBoundaryIsCloser()) {
  ------------------
  |  Branch (210:9): [True: 31, False: 2.94k]
  ------------------
  211|     31|      m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2);
  212|  2.94k|    } else {
  213|  2.94k|      m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1);
  214|  2.94k|    }
  215|  2.97k|    m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e()));
  216|  2.97k|    m_minus.set_e(m_plus.e());
  217|  2.97k|    *out_m_plus = m_plus;
  218|  2.97k|    *out_m_minus = m_minus;
  219|  2.97k|  }
_ZNK6icu_7817double_conversion6Double21LowerBoundaryIsCloserEv:
  221|  3.40k|  bool LowerBoundaryIsCloser() const {
  222|       |    // The boundary is closer if the significand is of the form f == 2^p-1 then
  223|       |    // the lower boundary is closer.
  224|       |    // Think of v = 1000e10 and v- = 9999e9.
  225|       |    // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but
  226|       |    // at a distance of 1e8.
  227|       |    // The only exception is for the smallest normal: the largest denormal is
  228|       |    // at the same distance as its successor.
  229|       |    // Note: denormals have the same exponent as the smallest normals.
  230|  3.40k|    bool physical_significand_is_zero = ((AsUint64() & kSignificandMask) == 0);
  231|  3.40k|    return physical_significand_is_zero && (Exponent() != kDenormalExponent);
  ------------------
  |  Branch (231:12): [True: 42, False: 3.36k]
  |  Branch (231:44): [True: 40, False: 2]
  ------------------
  232|  3.40k|  }
_ZNK6icu_7817double_conversion6Double5valueEv:
  234|  7.00k|  double value() const { return uint64_to_double(d64_); }
_ZN6icu_7817double_conversion6Double34SignificandSizeForOrderOfMagnitudeEi:
  242|  4.26k|  static int SignificandSizeForOrderOfMagnitude(int order) {
  243|  4.26k|    if (order >= (kDenormalExponent + kSignificandSize)) {
  ------------------
  |  Branch (243:9): [True: 3.86k, False: 406]
  ------------------
  244|  3.86k|      return kSignificandSize;
  245|  3.86k|    }
  246|    406|    if (order <= kDenormalExponent) return 0;
  ------------------
  |  Branch (246:9): [True: 30, False: 376]
  ------------------
  247|    376|    return order - kDenormalExponent;
  248|    406|  }
_ZN6icu_7817double_conversion6Double8InfinityEv:
  250|  1.98k|  static double Infinity() {
  251|  1.98k|    return Double(kInfinity).value();
  252|  1.98k|  }
_ZN6icu_7817double_conversion6Double13DiyFpToUint64ENS0_5DiyFpE:
  270|  4.26k|  static uint64_t DiyFpToUint64(DiyFp diy_fp) {
  271|  4.26k|    uint64_t significand = diy_fp.f();
  272|  4.26k|    int exponent = diy_fp.e();
  273|  4.33k|    while (significand > kHiddenBit + kSignificandMask) {
  ------------------
  |  Branch (273:12): [True: 62, False: 4.26k]
  ------------------
  274|     62|      significand >>= 1;
  275|     62|      exponent++;
  276|     62|    }
  277|  4.26k|    if (exponent >= kMaxExponent) {
  ------------------
  |  Branch (277:9): [True: 63, False: 4.20k]
  ------------------
  278|     63|      return kInfinity;
  279|     63|    }
  280|  4.20k|    if (exponent < kDenormalExponent) {
  ------------------
  |  Branch (280:9): [True: 20, False: 4.18k]
  ------------------
  281|     20|      return 0;
  282|     20|    }
  283|  4.18k|    while (exponent > kDenormalExponent && (significand & kHiddenBit) == 0) {
  ------------------
  |  Branch (283:12): [True: 3.76k, False: 423]
  |  Branch (283:44): [True: 0, False: 3.76k]
  ------------------
  284|      0|      significand <<= 1;
  285|      0|      exponent--;
  286|      0|    }
  287|  4.18k|    uint64_t biased_exponent;
  288|  4.18k|    if (exponent == kDenormalExponent && (significand & kHiddenBit) == 0) {
  ------------------
  |  Branch (288:9): [True: 423, False: 3.76k]
  |  Branch (288:42): [True: 386, False: 37]
  ------------------
  289|    386|      biased_exponent = 0;
  290|  3.79k|    } else {
  291|  3.79k|      biased_exponent = static_cast<uint64_t>(exponent + kExponentBias);
  292|  3.79k|    }
  293|  4.18k|    return (significand & kSignificandMask) |
  294|  4.18k|        (biased_exponent << kPhysicalSignificandSize);
  295|  4.20k|  }
double-conversion-fast-dtoa.cpp:_ZN6icu_7817double_conversionL16double_to_uint64Ed:
   50|  5.94k|static uint64_t double_to_uint64(double d) { return BitCast<uint64_t>(d); }
double-conversion-strtod.cpp:_ZN6icu_7817double_conversionL16uint64_to_doubleEm:
   51|  7.00k|static double uint64_to_double(uint64_t d64) { return BitCast<double>(d64); }
double-conversion-strtod.cpp:_ZN6icu_7817double_conversionL16double_to_uint64Ed:
   50|  2.49k|static uint64_t double_to_uint64(double d) { return BitCast<uint64_t>(d); }
double-conversion-bignum-dtoa.cpp:_ZN6icu_7817double_conversionL16double_to_uint64Ed:
   50|  1.29k|static uint64_t double_to_uint64(double d) { return BitCast<uint64_t>(d); }

_ZNK6icu_7817double_conversion23StringToDoubleConverter14StringToDoubleEPKtiPi:
  781|  8.16k|    int* processed_characters_count) const {
  782|  8.16k|  return StringToIeee(buffer, length, true, processed_characters_count);
  783|  8.16k|}
double-conversion-string-to-double.cpp:_ZN6icu_7817double_conversionL12isWhitespaceEi:
  144|  3.00k|static bool isWhitespace(int x) {
  145|  3.00k|  if (x < 128) {
  ------------------
  |  Branch (145:7): [True: 3.00k, False: 0]
  ------------------
  146|  21.0k|    for (int i = 0; i < kWhitespaceTable7Length; i++) {
  ------------------
  |  Branch (146:21): [True: 18.0k, False: 3.00k]
  ------------------
  147|  18.0k|      if (kWhitespaceTable7[i] == x) return true;
  ------------------
  |  Branch (147:11): [True: 0, False: 18.0k]
  ------------------
  148|  18.0k|    }
  149|  3.00k|  } else {
  150|      0|    for (int i = 0; i < kWhitespaceTable16Length; i++) {
  ------------------
  |  Branch (150:21): [True: 0, False: 0]
  ------------------
  151|      0|      if (kWhitespaceTable16[i] == x) return true;
  ------------------
  |  Branch (151:11): [True: 0, False: 0]
  ------------------
  152|      0|    }
  153|      0|  }
  154|  3.00k|  return false;
  155|  3.00k|}
double-conversion-string-to-double.cpp:_ZN6icu_7817double_conversion12_GLOBAL__N_121ConsumeFirstCharacterEcPKcb:
  118|  16.3k|                                         bool case_insensitivity) {
  119|  16.3k|  return case_insensitivity ? ToLower(ch) == str[0] : ch == str[0];
  ------------------
  |  Branch (119:10): [True: 0, False: 16.3k]
  ------------------
  120|  16.3k|}
_ZNK6icu_7817double_conversion23StringToDoubleConverter12StringToIeeeIPKtEEdT_ibPi:
  444|  8.16k|    int* processed_characters_count) const {
  445|  8.16k|  Iterator current = input;
  446|  8.16k|  Iterator end = input + length;
  447|       |
  448|  8.16k|  *processed_characters_count = 0;
  449|       |
  450|  8.16k|  const bool allow_trailing_junk = (flags_ & ALLOW_TRAILING_JUNK) != 0;
  451|  8.16k|  const bool allow_leading_spaces = (flags_ & ALLOW_LEADING_SPACES) != 0;
  452|  8.16k|  const bool allow_trailing_spaces = (flags_ & ALLOW_TRAILING_SPACES) != 0;
  453|  8.16k|  const bool allow_spaces_after_sign = (flags_ & ALLOW_SPACES_AFTER_SIGN) != 0;
  454|  8.16k|  const bool allow_case_insensitivity = (flags_ & ALLOW_CASE_INSENSITIVITY) != 0;
  455|       |
  456|       |  // To make sure that iterator dereferencing is valid the following
  457|       |  // convention is used:
  458|       |  // 1. Each '++current' statement is followed by check for equality to 'end'.
  459|       |  // 2. If AdvanceToNonspace returned false then current == end.
  460|       |  // 3. If 'current' becomes equal to 'end' the function returns or goes to
  461|       |  // 'parsing_done'.
  462|       |  // 4. 'current' is not dereferenced after the 'parsing_done' label.
  463|       |  // 5. Code before 'parsing_done' may rely on 'current != end'.
  464|  8.16k|  if (current == end) return empty_string_value_;
  ------------------
  |  Branch (464:7): [True: 0, False: 8.16k]
  ------------------
  465|       |
  466|  8.16k|  if (allow_leading_spaces || allow_trailing_spaces) {
  ------------------
  |  Branch (466:7): [True: 0, False: 8.16k]
  |  Branch (466:31): [True: 0, False: 8.16k]
  ------------------
  467|      0|    if (!AdvanceToNonspace(&current, end)) {
  ------------------
  |  Branch (467:9): [True: 0, False: 0]
  ------------------
  468|      0|      *processed_characters_count = static_cast<int>(current - input);
  469|      0|      return empty_string_value_;
  470|      0|    }
  471|      0|    if (!allow_leading_spaces && (input != current)) {
  ------------------
  |  Branch (471:9): [True: 0, False: 0]
  |  Branch (471:34): [True: 0, False: 0]
  ------------------
  472|       |      // No leading spaces allowed, but AdvanceToNonspace moved forward.
  473|      0|      return junk_string_value_;
  474|      0|    }
  475|      0|  }
  476|       |
  477|       |  // Exponent will be adjusted if insignificant digits of the integer part
  478|       |  // or insignificant leading zeros of the fractional part are dropped.
  479|  8.16k|  int exponent = 0;
  480|  8.16k|  int significant_digits = 0;
  481|  8.16k|  int insignificant_digits = 0;
  482|  8.16k|  bool nonzero_digit_dropped = false;
  483|       |
  484|  8.16k|  bool sign = false;
  485|       |
  486|  8.16k|  if (*current == '+' || *current == '-') {
  ------------------
  |  Branch (486:7): [True: 0, False: 8.16k]
  |  Branch (486:26): [True: 3.00k, False: 5.16k]
  ------------------
  487|  3.00k|    sign = (*current == '-');
  488|  3.00k|    ++current;
  489|  3.00k|    Iterator next_non_space = current;
  490|       |    // Skip following spaces (if allowed).
  491|  3.00k|    if (!AdvanceToNonspace(&next_non_space, end)) return junk_string_value_;
  ------------------
  |  Branch (491:9): [True: 0, False: 3.00k]
  ------------------
  492|  3.00k|    if (!allow_spaces_after_sign && (current != next_non_space)) {
  ------------------
  |  Branch (492:9): [True: 3.00k, False: 0]
  |  Branch (492:37): [True: 0, False: 3.00k]
  ------------------
  493|      0|      return junk_string_value_;
  494|      0|    }
  495|  3.00k|    current = next_non_space;
  496|  3.00k|  }
  497|       |
  498|  8.16k|  if (infinity_symbol_ != DOUBLE_CONVERSION_NULLPTR) {
  ------------------
  |  |   48|  8.16k|#define DOUBLE_CONVERSION_NULLPTR nullptr
  ------------------
  |  Branch (498:7): [True: 8.16k, False: 0]
  ------------------
  499|  8.16k|    if (ConsumeFirstCharacter(*current, infinity_symbol_, allow_case_insensitivity)) {
  ------------------
  |  Branch (499:9): [True: 0, False: 8.16k]
  ------------------
  500|      0|      if (!ConsumeSubString(&current, end, infinity_symbol_, allow_case_insensitivity)) {
  ------------------
  |  Branch (500:11): [True: 0, False: 0]
  ------------------
  501|      0|        return junk_string_value_;
  502|      0|      }
  503|       |
  504|      0|      if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) {
  ------------------
  |  Branch (504:13): [True: 0, False: 0]
  |  Branch (504:38): [True: 0, False: 0]
  |  Branch (504:62): [True: 0, False: 0]
  ------------------
  505|      0|        return junk_string_value_;
  506|      0|      }
  507|      0|      if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
  ------------------
  |  Branch (507:11): [True: 0, False: 0]
  |  Branch (507:35): [True: 0, False: 0]
  ------------------
  508|      0|        return junk_string_value_;
  509|      0|      }
  510|       |
  511|      0|      *processed_characters_count = static_cast<int>(current - input);
  512|      0|      return sign ? -Double::Infinity() : Double::Infinity();
  ------------------
  |  Branch (512:14): [True: 0, False: 0]
  ------------------
  513|      0|    }
  514|  8.16k|  }
  515|       |
  516|  8.16k|  if (nan_symbol_ != DOUBLE_CONVERSION_NULLPTR) {
  ------------------
  |  |   48|  8.16k|#define DOUBLE_CONVERSION_NULLPTR nullptr
  ------------------
  |  Branch (516:7): [True: 8.16k, False: 0]
  ------------------
  517|  8.16k|    if (ConsumeFirstCharacter(*current, nan_symbol_, allow_case_insensitivity)) {
  ------------------
  |  Branch (517:9): [True: 0, False: 8.16k]
  ------------------
  518|      0|      if (!ConsumeSubString(&current, end, nan_symbol_, allow_case_insensitivity)) {
  ------------------
  |  Branch (518:11): [True: 0, False: 0]
  ------------------
  519|      0|        return junk_string_value_;
  520|      0|      }
  521|       |
  522|      0|      if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) {
  ------------------
  |  Branch (522:13): [True: 0, False: 0]
  |  Branch (522:38): [True: 0, False: 0]
  |  Branch (522:62): [True: 0, False: 0]
  ------------------
  523|      0|        return junk_string_value_;
  524|      0|      }
  525|      0|      if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
  ------------------
  |  Branch (525:11): [True: 0, False: 0]
  |  Branch (525:35): [True: 0, False: 0]
  ------------------
  526|      0|        return junk_string_value_;
  527|      0|      }
  528|       |
  529|      0|      *processed_characters_count = static_cast<int>(current - input);
  530|      0|      return sign ? -Double::NaN() : Double::NaN();
  ------------------
  |  Branch (530:14): [True: 0, False: 0]
  ------------------
  531|      0|    }
  532|  8.16k|  }
  533|       |
  534|  8.16k|  bool leading_zero = false;
  535|  8.16k|  if (*current == '0') {
  ------------------
  |  Branch (535:7): [True: 242, False: 7.92k]
  ------------------
  536|    242|    if (Advance(&current, separator_, 10, end)) {
  ------------------
  |  Branch (536:9): [True: 0, False: 242]
  ------------------
  537|      0|      *processed_characters_count = static_cast<int>(current - input);
  538|      0|      return SignedZero(sign);
  539|      0|    }
  540|       |
  541|    242|    leading_zero = true;
  542|       |
  543|       |    // It could be hexadecimal value.
  544|    242|    if (((flags_ & ALLOW_HEX) || (flags_ & ALLOW_HEX_FLOATS)) &&
  ------------------
  |  Branch (544:10): [True: 0, False: 242]
  |  Branch (544:34): [True: 0, False: 242]
  ------------------
  545|    242|        (*current == 'x' || *current == 'X')) {
  ------------------
  |  Branch (545:10): [True: 0, False: 0]
  |  Branch (545:29): [True: 0, False: 0]
  ------------------
  546|      0|      ++current;
  547|       |
  548|      0|      if (current == end) return junk_string_value_;  // "0x"
  ------------------
  |  Branch (548:11): [True: 0, False: 0]
  ------------------
  549|       |
  550|      0|      bool parse_as_hex_float = (flags_ & ALLOW_HEX_FLOATS) &&
  ------------------
  |  Branch (550:33): [True: 0, False: 0]
  ------------------
  551|      0|                IsHexFloatString(current, end, separator_, allow_trailing_junk);
  ------------------
  |  Branch (551:17): [True: 0, False: 0]
  ------------------
  552|       |
  553|      0|      if (!parse_as_hex_float && !isDigit(*current, 16)) {
  ------------------
  |  Branch (553:11): [True: 0, False: 0]
  |  Branch (553:34): [True: 0, False: 0]
  ------------------
  554|      0|        return junk_string_value_;
  555|      0|      }
  556|       |
  557|      0|      bool result_is_junk;
  558|      0|      double result = RadixStringToIeee<4>(&current,
  559|      0|                                           end,
  560|      0|                                           sign,
  561|      0|                                           separator_,
  562|      0|                                           parse_as_hex_float,
  563|      0|                                           allow_trailing_junk,
  564|      0|                                           junk_string_value_,
  565|      0|                                           read_as_double,
  566|      0|                                           &result_is_junk);
  567|      0|      if (!result_is_junk) {
  ------------------
  |  Branch (567:11): [True: 0, False: 0]
  ------------------
  568|      0|        if (allow_trailing_spaces) AdvanceToNonspace(&current, end);
  ------------------
  |  Branch (568:13): [True: 0, False: 0]
  ------------------
  569|      0|        *processed_characters_count = static_cast<int>(current - input);
  570|      0|      }
  571|      0|      return result;
  572|      0|    }
  573|       |
  574|       |    // Ignore leading zeros in the integer part.
  575|    242|    while (*current == '0') {
  ------------------
  |  Branch (575:12): [True: 0, False: 242]
  ------------------
  576|      0|      if (Advance(&current, separator_, 10, end)) {
  ------------------
  |  Branch (576:11): [True: 0, False: 0]
  ------------------
  577|      0|        *processed_characters_count = static_cast<int>(current - input);
  578|      0|        return SignedZero(sign);
  579|      0|      }
  580|      0|    }
  581|    242|  }
  582|       |
  583|  8.16k|  bool octal = leading_zero && (flags_ & ALLOW_OCTALS) != 0;
  ------------------
  |  Branch (583:16): [True: 242, False: 7.92k]
  |  Branch (583:32): [True: 0, False: 242]
  ------------------
  584|       |
  585|       |  // The longest form of simplified number is: "-<significant digits>.1eXXX\0".
  586|  8.16k|  const int kBufferSize = kMaxSignificantDigits + 10;
  587|  8.16k|  DOUBLE_CONVERSION_STACK_UNINITIALIZED char
  ------------------
  |  |  114|  8.16k|#define DOUBLE_CONVERSION_STACK_UNINITIALIZED __attribute__((uninitialized))
  ------------------
  588|  8.16k|      buffer[kBufferSize];  // NOLINT: size is known at compile time.
  589|  8.16k|  int buffer_pos = 0;
  590|       |
  591|       |  // Copy significant digits of the integer part (if any) to the buffer.
  592|  16.0k|  while (*current >= '0' && *current <= '9') {
  ------------------
  |  Branch (592:10): [True: 8.86k, False: 7.23k]
  |  Branch (592:29): [True: 7.92k, False: 935]
  ------------------
  593|  7.92k|    if (significant_digits < kMaxSignificantDigits) {
  ------------------
  |  Branch (593:9): [True: 7.92k, False: 0]
  ------------------
  594|  7.92k|      DOUBLE_CONVERSION_ASSERT(buffer_pos < kBufferSize);
  ------------------
  |  |   57|  7.92k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  7.92k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  595|  7.92k|      buffer[buffer_pos++] = static_cast<char>(*current);
  596|  7.92k|      significant_digits++;
  597|       |      // Will later check if it's an octal in the buffer.
  598|  7.92k|    } else {
  599|      0|      insignificant_digits++;  // Move the digit into the exponential part.
  600|      0|      nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
  ------------------
  |  Branch (600:31): [True: 0, False: 0]
  |  Branch (600:56): [True: 0, False: 0]
  ------------------
  601|      0|    }
  602|  7.92k|    octal = octal && *current < '8';
  ------------------
  |  Branch (602:13): [True: 0, False: 7.92k]
  |  Branch (602:22): [True: 0, False: 0]
  ------------------
  603|  7.92k|    if (Advance(&current, separator_, 10, end)) goto parsing_done;
  ------------------
  |  Branch (603:9): [True: 0, False: 7.92k]
  ------------------
  604|  7.92k|  }
  605|       |
  606|  8.16k|  if (significant_digits == 0) {
  ------------------
  |  Branch (606:7): [True: 242, False: 7.92k]
  ------------------
  607|    242|    octal = false;
  608|    242|  }
  609|       |
  610|  8.16k|  if (*current == '.') {
  ------------------
  |  Branch (610:7): [True: 7.23k, False: 935]
  ------------------
  611|  7.23k|    if (octal && !allow_trailing_junk) return junk_string_value_;
  ------------------
  |  Branch (611:9): [True: 0, False: 7.23k]
  |  Branch (611:18): [True: 0, False: 0]
  ------------------
  612|  7.23k|    if (octal) goto parsing_done;
  ------------------
  |  Branch (612:9): [True: 0, False: 7.23k]
  ------------------
  613|       |
  614|  7.23k|    if (Advance(&current, separator_, 10, end)) {
  ------------------
  |  Branch (614:9): [True: 0, False: 7.23k]
  ------------------
  615|      0|      if (significant_digits == 0 && !leading_zero) {
  ------------------
  |  Branch (615:11): [True: 0, False: 0]
  |  Branch (615:38): [True: 0, False: 0]
  ------------------
  616|      0|        return junk_string_value_;
  617|      0|      } else {
  618|      0|        goto parsing_done;
  619|      0|      }
  620|      0|    }
  621|       |
  622|  7.23k|    if (significant_digits == 0) {
  ------------------
  |  Branch (622:9): [True: 0, False: 7.23k]
  ------------------
  623|       |      // octal = false;
  624|       |      // Integer part consists of 0 or is absent. Significant digits start after
  625|       |      // leading zeros (if any).
  626|      0|      while (*current == '0') {
  ------------------
  |  Branch (626:14): [True: 0, False: 0]
  ------------------
  627|      0|        if (Advance(&current, separator_, 10, end)) {
  ------------------
  |  Branch (627:13): [True: 0, False: 0]
  ------------------
  628|      0|          *processed_characters_count = static_cast<int>(current - input);
  629|      0|          return SignedZero(sign);
  630|      0|        }
  631|      0|        exponent--;  // Move this 0 into the exponent.
  632|      0|      }
  633|      0|    }
  634|       |
  635|       |    // There is a fractional part.
  636|       |    // We don't emit a '.', but adjust the exponent instead.
  637|  91.9k|    while (*current >= '0' && *current <= '9') {
  ------------------
  |  Branch (637:12): [True: 91.9k, False: 0]
  |  Branch (637:31): [True: 84.7k, False: 7.23k]
  ------------------
  638|  84.7k|      if (significant_digits < kMaxSignificantDigits) {
  ------------------
  |  Branch (638:11): [True: 84.7k, False: 0]
  ------------------
  639|  84.7k|        DOUBLE_CONVERSION_ASSERT(buffer_pos < kBufferSize);
  ------------------
  |  |   57|  84.7k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  84.7k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  640|  84.7k|        buffer[buffer_pos++] = static_cast<char>(*current);
  641|  84.7k|        significant_digits++;
  642|  84.7k|        exponent--;
  643|  84.7k|      } else {
  644|       |        // Ignore insignificant digits in the fractional part.
  645|      0|        nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
  ------------------
  |  Branch (645:33): [True: 0, False: 0]
  |  Branch (645:58): [True: 0, False: 0]
  ------------------
  646|      0|      }
  647|  84.7k|      if (Advance(&current, separator_, 10, end)) goto parsing_done;
  ------------------
  |  Branch (647:11): [True: 0, False: 84.7k]
  ------------------
  648|  84.7k|    }
  649|  7.23k|  }
  650|       |
  651|  8.16k|  if (!leading_zero && exponent == 0 && significant_digits == 0) {
  ------------------
  |  Branch (651:7): [True: 7.92k, False: 242]
  |  Branch (651:24): [True: 693, False: 7.23k]
  |  Branch (651:41): [True: 0, False: 693]
  ------------------
  652|       |    // If leading_zeros is true then the string contains zeros.
  653|       |    // If exponent < 0 then string was [+-]\.0*...
  654|       |    // If significant_digits != 0 the string is not equal to 0.
  655|       |    // Otherwise there are no digits in the string.
  656|      0|    return junk_string_value_;
  657|      0|  }
  658|       |
  659|       |  // Parse exponential part.
  660|  8.16k|  if (*current == 'e' || *current == 'E') {
  ------------------
  |  Branch (660:7): [True: 0, False: 8.16k]
  |  Branch (660:26): [True: 8.16k, False: 0]
  ------------------
  661|  8.16k|    if (octal && !allow_trailing_junk) return junk_string_value_;
  ------------------
  |  Branch (661:9): [True: 0, False: 8.16k]
  |  Branch (661:18): [True: 0, False: 0]
  ------------------
  662|  8.16k|    if (octal) goto parsing_done;
  ------------------
  |  Branch (662:9): [True: 0, False: 8.16k]
  ------------------
  663|  8.16k|    Iterator junk_begin = current;
  664|  8.16k|    ++current;
  665|  8.16k|    if (current == end) {
  ------------------
  |  Branch (665:9): [True: 0, False: 8.16k]
  ------------------
  666|      0|      if (allow_trailing_junk) {
  ------------------
  |  Branch (666:11): [True: 0, False: 0]
  ------------------
  667|      0|        current = junk_begin;
  668|      0|        goto parsing_done;
  669|      0|      } else {
  670|      0|        return junk_string_value_;
  671|      0|      }
  672|      0|    }
  673|  8.16k|    char exponen_sign = '+';
  674|  8.16k|    if (*current == '+' || *current == '-') {
  ------------------
  |  Branch (674:9): [True: 7.16k, False: 1.00k]
  |  Branch (674:28): [True: 1.00k, False: 0]
  ------------------
  675|  8.16k|      exponen_sign = static_cast<char>(*current);
  676|  8.16k|      ++current;
  677|  8.16k|      if (current == end) {
  ------------------
  |  Branch (677:11): [True: 0, False: 8.16k]
  ------------------
  678|      0|        if (allow_trailing_junk) {
  ------------------
  |  Branch (678:13): [True: 0, False: 0]
  ------------------
  679|      0|          current = junk_begin;
  680|      0|          goto parsing_done;
  681|      0|        } else {
  682|      0|          return junk_string_value_;
  683|      0|        }
  684|      0|      }
  685|  8.16k|    }
  686|       |
  687|  8.16k|    if (current == end || *current < '0' || *current > '9') {
  ------------------
  |  Branch (687:9): [True: 0, False: 8.16k]
  |  Branch (687:27): [True: 0, False: 8.16k]
  |  Branch (687:45): [True: 0, False: 8.16k]
  ------------------
  688|      0|      if (allow_trailing_junk) {
  ------------------
  |  Branch (688:11): [True: 0, False: 0]
  ------------------
  689|      0|        current = junk_begin;
  690|      0|        goto parsing_done;
  691|      0|      } else {
  692|      0|        return junk_string_value_;
  693|      0|      }
  694|      0|    }
  695|       |
  696|  8.16k|    const int max_exponent = INT_MAX / 2;
  697|  8.16k|    DOUBLE_CONVERSION_ASSERT(-max_exponent / 2 <= exponent && exponent <= max_exponent / 2);
  ------------------
  |  |   57|  8.16k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  8.16k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  698|  8.16k|    int num = 0;
  699|  18.4k|    do {
  700|       |      // Check overflow.
  701|  18.4k|      int digit = *current - '0';
  702|  18.4k|      if (num >= max_exponent / 10
  ------------------
  |  Branch (702:11): [True: 0, False: 18.4k]
  ------------------
  703|  18.4k|          && !(num == max_exponent / 10 && digit <= max_exponent % 10)) {
  ------------------
  |  Branch (703:16): [True: 0, False: 0]
  |  Branch (703:44): [True: 0, False: 0]
  ------------------
  704|      0|        num = max_exponent;
  705|  18.4k|      } else {
  706|  18.4k|        num = num * 10 + digit;
  707|  18.4k|      }
  708|  18.4k|      ++current;
  709|  18.4k|    } while (current != end && *current >= '0' && *current <= '9');
  ------------------
  |  Branch (709:14): [True: 10.3k, False: 8.16k]
  |  Branch (709:32): [True: 10.3k, False: 0]
  |  Branch (709:51): [True: 10.3k, False: 0]
  ------------------
  710|       |
  711|  8.16k|    exponent += (exponen_sign == '-' ? -num : num);
  ------------------
  |  Branch (711:18): [True: 1.00k, False: 7.16k]
  ------------------
  712|  8.16k|  }
  713|       |
  714|  8.16k|  if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) {
  ------------------
  |  Branch (714:9): [True: 0, False: 8.16k]
  |  Branch (714:34): [True: 0, False: 8.16k]
  |  Branch (714:58): [True: 0, False: 8.16k]
  ------------------
  715|      0|    return junk_string_value_;
  716|      0|  }
  717|  8.16k|  if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
  ------------------
  |  Branch (717:7): [True: 8.16k, False: 0]
  |  Branch (717:31): [True: 0, False: 8.16k]
  ------------------
  718|      0|    return junk_string_value_;
  719|      0|  }
  720|  8.16k|  if (allow_trailing_spaces) {
  ------------------
  |  Branch (720:7): [True: 0, False: 8.16k]
  ------------------
  721|      0|    AdvanceToNonspace(&current, end);
  722|      0|  }
  723|       |
  724|  8.16k|  parsing_done:
  725|  8.16k|  exponent += insignificant_digits;
  726|       |
  727|  8.16k|  if (octal) {
  ------------------
  |  Branch (727:7): [True: 0, False: 8.16k]
  ------------------
  728|      0|    double result;
  729|      0|    bool result_is_junk;
  730|      0|    char* start = buffer;
  731|      0|    result = RadixStringToIeee<3>(&start,
  732|      0|                                  buffer + buffer_pos,
  733|      0|                                  sign,
  734|      0|                                  separator_,
  735|      0|                                  false, // Don't parse as hex_float.
  736|      0|                                  allow_trailing_junk,
  737|      0|                                  junk_string_value_,
  738|      0|                                  read_as_double,
  739|      0|                                  &result_is_junk);
  740|      0|    DOUBLE_CONVERSION_ASSERT(!result_is_junk);
  ------------------
  |  |   57|      0|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  741|      0|    *processed_characters_count = static_cast<int>(current - input);
  742|      0|    return result;
  743|      0|  }
  744|       |
  745|  8.16k|  if (nonzero_digit_dropped) {
  ------------------
  |  Branch (745:7): [True: 0, False: 8.16k]
  ------------------
  746|      0|    buffer[buffer_pos++] = '1';
  747|      0|    exponent--;
  748|      0|  }
  749|       |
  750|  8.16k|  DOUBLE_CONVERSION_ASSERT(buffer_pos < kBufferSize);
  ------------------
  |  |   57|  8.16k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  8.16k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  751|  8.16k|  buffer[buffer_pos] = '\0';
  752|       |
  753|       |  // Code above ensures there are no leading zeros and the buffer has fewer than
  754|       |  // kMaxSignificantDecimalDigits characters. Trim trailing zeros.
  755|  8.16k|  Vector<const char> chars(buffer, buffer_pos);
  756|  8.16k|  chars = TrimTrailingZeros(chars);
  757|  8.16k|  exponent += buffer_pos - chars.length();
  758|       |
  759|  8.16k|  double converted;
  760|  8.16k|  if (read_as_double) {
  ------------------
  |  Branch (760:7): [True: 8.16k, False: 0]
  ------------------
  761|  8.16k|    converted = StrtodTrimmed(chars, exponent);
  762|  8.16k|  } else {
  763|      0|    converted = StrtofTrimmed(chars, exponent);
  764|      0|  }
  765|  8.16k|  *processed_characters_count = static_cast<int>(current - input);
  766|  8.16k|  return sign? -converted: converted;
  ------------------
  |  Branch (766:10): [True: 3.00k, False: 5.16k]
  ------------------
  767|  8.16k|}
double-conversion-string-to-double.cpp:_ZN6icu_7817double_conversionL17AdvanceToNonspaceIPKtEEbPT_S4_:
  160|  11.1k|static inline bool AdvanceToNonspace(Iterator* current, Iterator end) {
  161|  11.1k|  while (*current != end) {
  ------------------
  |  Branch (161:10): [True: 3.00k, False: 8.16k]
  ------------------
  162|  3.00k|    if (!isWhitespace(**current)) return true;
  ------------------
  |  Branch (162:9): [True: 3.00k, False: 0]
  ------------------
  163|      0|    ++*current;
  164|      0|  }
  165|  8.16k|  return false;
  166|  11.1k|}
double-conversion-string-to-double.cpp:_ZN6icu_7817double_conversionL7AdvanceIPKtEEbPT_tiRS4_:
  211|   100k|static bool Advance (Iterator* it, uc16 separator, int base, Iterator& end) {
  212|   100k|  if (separator == StringToDoubleConverter::kNoSeparator) {
  ------------------
  |  Branch (212:7): [True: 100k, False: 0]
  ------------------
  213|   100k|    ++(*it);
  214|   100k|    return *it == end;
  215|   100k|  }
  216|      0|  if (!isDigit(**it, base)) {
  ------------------
  |  Branch (216:7): [True: 0, False: 0]
  ------------------
  217|      0|    ++(*it);
  218|      0|    return *it == end;
  219|      0|  }
  220|      0|  ++(*it);
  221|      0|  if (*it == end) return true;
  ------------------
  |  Branch (221:7): [True: 0, False: 0]
  ------------------
  222|      0|  if (*it + 1 == end) return false;
  ------------------
  |  Branch (222:7): [True: 0, False: 0]
  ------------------
  223|      0|  if (**it == separator && isDigit(*(*it + 1), base)) {
  ------------------
  |  Branch (223:7): [True: 0, False: 0]
  |  Branch (223:28): [True: 0, False: 0]
  ------------------
  224|      0|    ++(*it);
  225|      0|  }
  226|      0|  return *it == end;
  227|      0|}

_ZN6icu_7817double_conversion23StringToDoubleConverterC2EiddPKcS3_t:
  187|  8.16k|      : flags_(flags),
  188|  8.16k|        empty_string_value_(empty_string_value),
  189|  8.16k|        junk_string_value_(junk_string_value),
  190|  8.16k|        infinity_symbol_(infinity_symbol),
  191|  8.16k|        nan_symbol_(nan_symbol),
  192|  8.16k|        separator_(separator) {
  193|  8.16k|  }

_ZN6icu_7817double_conversion13StrtodTrimmedENS0_6VectorIKcEEi:
  482|  8.16k|double StrtodTrimmed(Vector<const char> trimmed, int exponent) {
  483|  8.16k|  DOUBLE_CONVERSION_ASSERT(trimmed.length() <= kMaxSignificantDecimalDigits);
  ------------------
  |  |   57|  8.16k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  8.16k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  484|  8.16k|  DOUBLE_CONVERSION_ASSERT(AssertTrimmedDigits(trimmed));
  ------------------
  |  |   57|  8.16k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  8.16k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  485|  8.16k|  double guess;
  486|  8.16k|  const bool is_correct = ComputeGuess(trimmed, exponent, &guess);
  487|  8.16k|  if (is_correct) {
  ------------------
  |  Branch (487:7): [True: 6.92k, False: 1.24k]
  ------------------
  488|  6.92k|    return guess;
  489|  6.92k|  }
  490|  1.24k|  DiyFp upper_boundary = Double(guess).UpperBoundary();
  491|  1.24k|  int comparison = CompareBufferWithDiyFp(trimmed, exponent, upper_boundary);
  492|  1.24k|  if (comparison < 0) {
  ------------------
  |  Branch (492:7): [True: 276, False: 970]
  ------------------
  493|    276|    return guess;
  494|    970|  } else if (comparison > 0) {
  ------------------
  |  Branch (494:14): [True: 480, False: 490]
  ------------------
  495|    480|    return Double(guess).NextDouble();
  496|    490|  } else if ((Double(guess).Significand() & 1) == 0) {
  ------------------
  |  Branch (496:14): [True: 215, False: 275]
  ------------------
  497|       |    // Round towards even.
  498|    215|    return guess;
  499|    275|  } else {
  500|    275|    return Double(guess).NextDouble();
  501|    275|  }
  502|  1.24k|}
double-conversion-strtod.cpp:_ZN6icu_7817double_conversionL12ComputeGuessENS0_6VectorIKcEEiPd:
  434|  8.16k|                         double* guess) {
  435|  8.16k|  if (trimmed.length() == 0) {
  ------------------
  |  Branch (435:7): [True: 242, False: 7.92k]
  ------------------
  436|    242|    *guess = 0.0;
  437|    242|    return true;
  438|    242|  }
  439|  7.92k|  if (exponent + trimmed.length() - 1 >= kMaxDecimalPower) {
  ------------------
  |  Branch (439:7): [True: 719, False: 7.20k]
  ------------------
  440|    719|    *guess = Double::Infinity();
  441|    719|    return true;
  442|    719|  }
  443|  7.20k|  if (exponent + trimmed.length() <= kMinDecimalPower) {
  ------------------
  |  Branch (443:7): [True: 181, False: 7.02k]
  ------------------
  444|    181|    *guess = 0.0;
  445|    181|    return true;
  446|    181|  }
  447|       |
  448|  7.02k|  if (DoubleStrtod(trimmed, exponent, guess) ||
  ------------------
  |  Branch (448:7): [True: 2.75k, False: 4.26k]
  ------------------
  449|  7.02k|      DiyFpStrtod(trimmed, exponent, guess)) {
  ------------------
  |  Branch (449:7): [True: 3.00k, False: 1.26k]
  ------------------
  450|  5.76k|    return true;
  451|  5.76k|  }
  452|  1.26k|  if (*guess == Double::Infinity()) {
  ------------------
  |  Branch (452:7): [True: 20, False: 1.24k]
  ------------------
  453|     20|    return true;
  454|     20|  }
  455|  1.24k|  return false;
  456|  1.26k|}
double-conversion-strtod.cpp:_ZN6icu_7817double_conversionL12DoubleStrtodENS0_6VectorIKcEEiPd:
  206|  7.02k|                         double* result) {
  207|       |#if !defined(DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS)
  208|       |  // Avoid "unused parameter" warnings
  209|       |  (void) trimmed;
  210|       |  (void) exponent;
  211|       |  (void) result;
  212|       |  // On x86 the floating-point stack can be 64 or 80 bits wide. If it is
  213|       |  // 80 bits wide (as is the case on Linux) then double-rounding occurs and the
  214|       |  // result is not accurate.
  215|       |  // We know that Windows32 uses 64 bits and is therefore accurate.
  216|       |  return false;
  217|       |#else
  218|  7.02k|  if (trimmed.length() <= kMaxExactDoubleIntegerDecimalDigits) {
  ------------------
  |  Branch (218:7): [True: 3.73k, False: 3.29k]
  ------------------
  219|  3.73k|    int read_digits;
  220|       |    // The trimmed input fits into a double.
  221|       |    // If the 10^exponent (resp. 10^-exponent) fits into a double too then we
  222|       |    // can compute the result-double simply by multiplying (resp. dividing) the
  223|       |    // two numbers.
  224|       |    // This is possible because IEEE guarantees that floating-point operations
  225|       |    // return the best possible approximation.
  226|  3.73k|    if (exponent < 0 && -exponent < kExactPowersOfTenSize) {
  ------------------
  |  Branch (226:9): [True: 1.03k, False: 2.69k]
  |  Branch (226:25): [True: 341, False: 697]
  ------------------
  227|       |      // 10^-exponent fits into a double.
  228|    341|      *result = static_cast<double>(ReadUint64(trimmed, &read_digits));
  229|    341|      DOUBLE_CONVERSION_ASSERT(read_digits == trimmed.length());
  ------------------
  |  |   57|    341|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    341|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  230|    341|      *result /= exact_powers_of_ten[-exponent];
  231|    341|      return true;
  232|    341|    }
  233|  3.38k|    if (0 <= exponent && exponent < kExactPowersOfTenSize) {
  ------------------
  |  Branch (233:9): [True: 2.69k, False: 697]
  |  Branch (233:26): [True: 2.26k, False: 432]
  ------------------
  234|       |      // 10^exponent fits into a double.
  235|  2.26k|      *result = static_cast<double>(ReadUint64(trimmed, &read_digits));
  236|  2.26k|      DOUBLE_CONVERSION_ASSERT(read_digits == trimmed.length());
  ------------------
  |  |   57|  2.26k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.26k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  237|  2.26k|      *result *= exact_powers_of_ten[exponent];
  238|  2.26k|      return true;
  239|  2.26k|    }
  240|  1.12k|    int remaining_digits =
  241|  1.12k|        kMaxExactDoubleIntegerDecimalDigits - trimmed.length();
  242|  1.12k|    if ((0 <= exponent) &&
  ------------------
  |  Branch (242:9): [True: 432, False: 697]
  ------------------
  243|  1.12k|        (exponent - remaining_digits < kExactPowersOfTenSize)) {
  ------------------
  |  Branch (243:9): [True: 157, False: 275]
  ------------------
  244|       |      // The trimmed string was short and we can multiply it with
  245|       |      // 10^remaining_digits. As a result the remaining exponent now fits
  246|       |      // into a double too.
  247|    157|      *result = static_cast<double>(ReadUint64(trimmed, &read_digits));
  248|    157|      DOUBLE_CONVERSION_ASSERT(read_digits == trimmed.length());
  ------------------
  |  |   57|    157|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|    157|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  249|    157|      *result *= exact_powers_of_ten[remaining_digits];
  250|    157|      *result *= exact_powers_of_ten[exponent - remaining_digits];
  251|    157|      return true;
  252|    157|    }
  253|  1.12k|  }
  254|  4.26k|  return false;
  255|  7.02k|#endif
  256|  7.02k|}
double-conversion-strtod.cpp:_ZN6icu_7817double_conversionL10ReadUint64ENS0_6VectorIKcEEPi:
  166|  7.02k|                           int* number_of_read_digits) {
  167|  7.02k|  uint64_t result = 0;
  168|  7.02k|  int i = 0;
  169|  86.1k|  while (i < buffer.length() && result <= (kMaxUint64 / 10 - 1)) {
  ------------------
  |  Branch (169:10): [True: 79.8k, False: 6.31k]
  |  Branch (169:33): [True: 79.1k, False: 710]
  ------------------
  170|  79.1k|    int digit = buffer[i++] - '0';
  171|  79.1k|    DOUBLE_CONVERSION_ASSERT(0 <= digit && digit <= 9);
  ------------------
  |  |   57|  79.1k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  79.1k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  172|  79.1k|    result = 10 * result + digit;
  173|  79.1k|  }
  174|  7.02k|  *number_of_read_digits = i;
  175|  7.02k|  return result;
  176|  7.02k|}
double-conversion-strtod.cpp:_ZN6icu_7817double_conversionL11DiyFpStrtodENS0_6VectorIKcEEiPd:
  286|  4.26k|                        double* result) {
  287|  4.26k|  DiyFp input;
  288|  4.26k|  int remaining_decimals;
  289|  4.26k|  ReadDiyFp(buffer, &input, &remaining_decimals);
  290|       |  // Since we may have dropped some digits the input is not accurate.
  291|       |  // If remaining_decimals is different than 0 than the error is at most
  292|       |  // .5 ulp (unit in the last place).
  293|       |  // We don't want to deal with fractions and therefore keep a common
  294|       |  // denominator.
  295|  4.26k|  const int kDenominatorLog = 3;
  296|  4.26k|  const int kDenominator = 1 << kDenominatorLog;
  297|       |  // Move the remaining decimals into the exponent.
  298|  4.26k|  exponent += remaining_decimals;
  299|  4.26k|  uint64_t error = (remaining_decimals == 0 ? 0 : kDenominator / 2);
  ------------------
  |  Branch (299:21): [True: 3.55k, False: 710]
  ------------------
  300|       |
  301|  4.26k|  int old_e = input.e();
  302|  4.26k|  input.Normalize();
  303|  4.26k|  error <<= old_e - input.e();
  304|       |
  305|  4.26k|  DOUBLE_CONVERSION_ASSERT(exponent <= PowersOfTenCache::kMaxDecimalExponent);
  ------------------
  |  |   57|  4.26k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  4.26k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  306|  4.26k|  if (exponent < PowersOfTenCache::kMinDecimalExponent) {
  ------------------
  |  Branch (306:7): [True: 0, False: 4.26k]
  ------------------
  307|      0|    *result = 0.0;
  308|      0|    return true;
  309|      0|  }
  310|  4.26k|  DiyFp cached_power;
  311|  4.26k|  int cached_decimal_exponent;
  312|  4.26k|  PowersOfTenCache::GetCachedPowerForDecimalExponent(exponent,
  313|  4.26k|                                                     &cached_power,
  314|  4.26k|                                                     &cached_decimal_exponent);
  315|       |
  316|  4.26k|  if (cached_decimal_exponent != exponent) {
  ------------------
  |  Branch (316:7): [True: 3.72k, False: 545]
  ------------------
  317|  3.72k|    int adjustment_exponent = exponent - cached_decimal_exponent;
  318|  3.72k|    DiyFp adjustment_power = AdjustmentPowerOfTen(adjustment_exponent);
  319|  3.72k|    input.Multiply(adjustment_power);
  320|  3.72k|    if (kMaxUint64DecimalDigits - buffer.length() >= adjustment_exponent) {
  ------------------
  |  Branch (320:9): [True: 1.15k, False: 2.56k]
  ------------------
  321|       |      // The product of input with the adjustment power fits into a 64 bit
  322|       |      // integer.
  323|  1.15k|      DOUBLE_CONVERSION_ASSERT(DiyFp::kSignificandSize == 64);
  ------------------
  |  |   57|  1.15k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  1.15k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  324|  2.56k|    } else {
  325|       |      // The adjustment power is exact. There is hence only an error of 0.5.
  326|  2.56k|      error += kDenominator / 2;
  327|  2.56k|    }
  328|  3.72k|  }
  329|       |
  330|  4.26k|  input.Multiply(cached_power);
  331|       |  // The error introduced by a multiplication of a*b equals
  332|       |  //   error_a + error_b + error_a*error_b/2^64 + 0.5
  333|       |  // Substituting a with 'input' and b with 'cached_power' we have
  334|       |  //   error_b = 0.5  (all cached powers have an error of less than 0.5 ulp),
  335|       |  //   error_ab = 0 or 1 / kDenominator > error_a*error_b/ 2^64
  336|  4.26k|  int error_b = kDenominator / 2;
  337|  4.26k|  int error_ab = (error == 0 ? 0 : 1);  // We round up to 1.
  ------------------
  |  Branch (337:19): [True: 1.61k, False: 2.65k]
  ------------------
  338|  4.26k|  int fixed_error = kDenominator / 2;
  339|  4.26k|  error += error_b + error_ab + fixed_error;
  340|       |
  341|  4.26k|  old_e = input.e();
  342|  4.26k|  input.Normalize();
  343|  4.26k|  error <<= old_e - input.e();
  344|       |
  345|       |  // See if the double's significand changes if we add/subtract the error.
  346|  4.26k|  int order_of_magnitude = DiyFp::kSignificandSize + input.e();
  347|  4.26k|  int effective_significand_size =
  348|  4.26k|      Double::SignificandSizeForOrderOfMagnitude(order_of_magnitude);
  349|  4.26k|  int precision_digits_count =
  350|  4.26k|      DiyFp::kSignificandSize - effective_significand_size;
  351|  4.26k|  if (precision_digits_count + kDenominatorLog >= DiyFp::kSignificandSize) {
  ------------------
  |  Branch (351:7): [True: 86, False: 4.18k]
  ------------------
  352|       |    // This can only happen for very small denormals. In this case the
  353|       |    // half-way multiplied by the denominator exceeds the range of an uint64.
  354|       |    // Simply shift everything to the right.
  355|     86|    int shift_amount = (precision_digits_count + kDenominatorLog) -
  356|     86|        DiyFp::kSignificandSize + 1;
  357|     86|    input.set_f(input.f() >> shift_amount);
  358|     86|    input.set_e(input.e() + shift_amount);
  359|       |    // We add 1 for the lost precision of error, and kDenominator for
  360|       |    // the lost precision of input.f().
  361|     86|    error = (error >> shift_amount) + 1 + kDenominator;
  362|     86|    precision_digits_count -= shift_amount;
  363|     86|  }
  364|       |  // We use uint64_ts now. This only works if the DiyFp uses uint64_ts too.
  365|  4.26k|  DOUBLE_CONVERSION_ASSERT(DiyFp::kSignificandSize == 64);
  ------------------
  |  |   57|  4.26k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  4.26k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  366|  4.26k|  DOUBLE_CONVERSION_ASSERT(precision_digits_count < 64);
  ------------------
  |  |   57|  4.26k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  4.26k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  367|  4.26k|  uint64_t one64 = 1;
  368|  4.26k|  uint64_t precision_bits_mask = (one64 << precision_digits_count) - 1;
  369|  4.26k|  uint64_t precision_bits = input.f() & precision_bits_mask;
  370|  4.26k|  uint64_t half_way = one64 << (precision_digits_count - 1);
  371|  4.26k|  precision_bits *= kDenominator;
  372|  4.26k|  half_way *= kDenominator;
  373|  4.26k|  DiyFp rounded_input(input.f() >> precision_digits_count,
  374|  4.26k|                      input.e() + precision_digits_count);
  375|  4.26k|  if (precision_bits >= half_way + error) {
  ------------------
  |  Branch (375:7): [True: 1.48k, False: 2.78k]
  ------------------
  376|  1.48k|    rounded_input.set_f(rounded_input.f() + 1);
  377|  1.48k|  }
  378|       |  // If the last_bits are too close to the half-way case than we are too
  379|       |  // inaccurate and round down. In this case we return false so that we can
  380|       |  // fall back to a more precise algorithm.
  381|       |
  382|  4.26k|  *result = Double(rounded_input).value();
  383|  4.26k|  if (half_way - error < precision_bits && precision_bits < half_way + error) {
  ------------------
  |  Branch (383:7): [True: 2.75k, False: 1.51k]
  |  Branch (383:44): [True: 1.26k, False: 1.48k]
  ------------------
  384|       |    // Too imprecise. The caller will have to fall back to a slower version.
  385|       |    // However the returned number is guaranteed to be either the correct
  386|       |    // double, or the next-lower double.
  387|  1.26k|    return false;
  388|  3.00k|  } else {
  389|  3.00k|    return true;
  390|  3.00k|  }
  391|  4.26k|}
double-conversion-strtod.cpp:_ZN6icu_7817double_conversionL9ReadDiyFpENS0_6VectorIKcEEPNS0_5DiyFpEPi:
  185|  4.26k|                      int* remaining_decimals) {
  186|  4.26k|  int read_digits;
  187|  4.26k|  uint64_t significand = ReadUint64(buffer, &read_digits);
  188|  4.26k|  if (buffer.length() == read_digits) {
  ------------------
  |  Branch (188:7): [True: 3.55k, False: 710]
  ------------------
  189|  3.55k|    *result = DiyFp(significand, 0);
  190|  3.55k|    *remaining_decimals = 0;
  191|  3.55k|  } else {
  192|       |    // Round the significand.
  193|    710|    if (buffer[read_digits] >= '5') {
  ------------------
  |  Branch (193:9): [True: 313, False: 397]
  ------------------
  194|    313|      significand++;
  195|    313|    }
  196|       |    // Compute the binary exponent.
  197|    710|    int exponent = 0;
  198|    710|    *result = DiyFp(significand, exponent);
  199|    710|    *remaining_decimals = buffer.length() - read_digits;
  200|    710|  }
  201|  4.26k|}
double-conversion-strtod.cpp:_ZN6icu_7817double_conversionL20AdjustmentPowerOfTenEi:
  261|  3.72k|static DiyFp AdjustmentPowerOfTen(int exponent) {
  262|  3.72k|  DOUBLE_CONVERSION_ASSERT(0 < exponent);
  ------------------
  |  |   57|  3.72k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  3.72k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  263|  3.72k|  DOUBLE_CONVERSION_ASSERT(exponent < PowersOfTenCache::kDecimalExponentDistance);
  ------------------
  |  |   57|  3.72k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  3.72k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  264|       |  // Simply hardcode the remaining powers for the given decimal exponent
  265|       |  // distance.
  266|  3.72k|  DOUBLE_CONVERSION_ASSERT(PowersOfTenCache::kDecimalExponentDistance == 8);
  ------------------
  |  |   57|  3.72k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  3.72k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  267|  3.72k|  switch (exponent) {
  268|    423|    case 1: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0xa0000000, 00000000), -60);
  ------------------
  |  |  205|    423|#define DOUBLE_CONVERSION_UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
  ------------------
  |  Branch (268:5): [True: 423, False: 3.30k]
  ------------------
  269|    353|    case 2: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0xc8000000, 00000000), -57);
  ------------------
  |  |  205|    353|#define DOUBLE_CONVERSION_UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
  ------------------
  |  Branch (269:5): [True: 353, False: 3.37k]
  ------------------
  270|    276|    case 3: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0xfa000000, 00000000), -54);
  ------------------
  |  |  205|    276|#define DOUBLE_CONVERSION_UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
  ------------------
  |  Branch (270:5): [True: 276, False: 3.44k]
  ------------------
  271|  1.27k|    case 4: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0x9c400000, 00000000), -50);
  ------------------
  |  |  205|  1.27k|#define DOUBLE_CONVERSION_UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
  ------------------
  |  Branch (271:5): [True: 1.27k, False: 2.44k]
  ------------------
  272|    591|    case 5: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0xc3500000, 00000000), -47);
  ------------------
  |  |  205|    591|#define DOUBLE_CONVERSION_UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
  ------------------
  |  Branch (272:5): [True: 591, False: 3.13k]
  ------------------
  273|    426|    case 6: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0xf4240000, 00000000), -44);
  ------------------
  |  |  205|    426|#define DOUBLE_CONVERSION_UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
  ------------------
  |  Branch (273:5): [True: 426, False: 3.29k]
  ------------------
  274|    375|    case 7: return DiyFp(DOUBLE_CONVERSION_UINT64_2PART_C(0x98968000, 00000000), -40);
  ------------------
  |  |  205|    375|#define DOUBLE_CONVERSION_UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
  ------------------
  |  Branch (274:5): [True: 375, False: 3.34k]
  ------------------
  275|      0|    default:
  ------------------
  |  Branch (275:5): [True: 0, False: 3.72k]
  ------------------
  276|      0|      DOUBLE_CONVERSION_UNREACHABLE();
  ------------------
  |  |   87|      0|#define DOUBLE_CONVERSION_UNREACHABLE()   (abort())
  ------------------
  277|  3.72k|  }
  278|  3.72k|}
double-conversion-strtod.cpp:_ZN6icu_7817double_conversionL22CompareBufferWithDiyFpENS0_6VectorIKcEEiNS0_5DiyFpE:
  404|  1.24k|                                  DiyFp diy_fp) {
  405|  1.24k|  DOUBLE_CONVERSION_ASSERT(buffer.length() + exponent <= kMaxDecimalPower + 1);
  ------------------
  |  |   57|  1.24k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  1.24k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  406|  1.24k|  DOUBLE_CONVERSION_ASSERT(buffer.length() + exponent > kMinDecimalPower);
  ------------------
  |  |   57|  1.24k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  1.24k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  407|  1.24k|  DOUBLE_CONVERSION_ASSERT(buffer.length() <= kMaxSignificantDecimalDigits);
  ------------------
  |  |   57|  1.24k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  1.24k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  408|       |  // Make sure that the Bignum will be able to hold all our numbers.
  409|       |  // Our Bignum implementation has a separate field for exponents. Shifts will
  410|       |  // consume at most one bigit (< 64 bits).
  411|       |  // ln(10) == 3.3219...
  412|  1.24k|  DOUBLE_CONVERSION_ASSERT(((kMaxDecimalPower + 1) * 333 / 100) < Bignum::kMaxSignificantBits);
  ------------------
  |  |   57|  1.24k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  1.24k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  413|  1.24k|  Bignum buffer_bignum;
  414|  1.24k|  Bignum diy_fp_bignum;
  415|  1.24k|  buffer_bignum.AssignDecimalString(buffer);
  416|  1.24k|  diy_fp_bignum.AssignUInt64(diy_fp.f());
  417|  1.24k|  if (exponent >= 0) {
  ------------------
  |  Branch (417:7): [True: 1.07k, False: 172]
  ------------------
  418|  1.07k|    buffer_bignum.MultiplyByPowerOfTen(exponent);
  419|  1.07k|  } else {
  420|    172|    diy_fp_bignum.MultiplyByPowerOfTen(-exponent);
  421|    172|  }
  422|  1.24k|  if (diy_fp.e() > 0) {
  ------------------
  |  Branch (422:7): [True: 928, False: 318]
  ------------------
  423|    928|    diy_fp_bignum.ShiftLeft(diy_fp.e());
  424|    928|  } else {
  425|    318|    buffer_bignum.ShiftLeft(-diy_fp.e());
  426|    318|  }
  427|  1.24k|  return Bignum::Compare(buffer_bignum, diy_fp_bignum);
  428|  1.24k|}

_ZN6icu_7817double_conversion17TrimTrailingZerosENS0_6VectorIKcEE:
   67|  8.16k|inline Vector<const char> TrimTrailingZeros(Vector<const char> buffer) {
   68|  8.16k|  for (int i = buffer.length() - 1; i >= 0; --i) {
  ------------------
  |  Branch (68:37): [True: 7.92k, False: 242]
  ------------------
   69|  7.92k|    if (buffer[i] != '0') {
  ------------------
  |  Branch (69:9): [True: 7.92k, False: 0]
  ------------------
   70|  7.92k|      return buffer.SubVector(0, i + 1);
   71|  7.92k|    }
   72|  7.92k|  }
   73|    242|  return Vector<const char>(buffer.start(), 0);
   74|  8.16k|}

_ZNK6icu_7817double_conversion6VectorIcEixEi:
  288|  55.7k|  T& operator[](int index) const {
  289|  55.7k|    DOUBLE_CONVERSION_ASSERT(0 <= index && index < length_);
  ------------------
  |  |   57|  55.7k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  55.7k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  290|  55.7k|    return start_[index];
  291|  55.7k|  }
_ZN6icu_7817double_conversion7BitCastImdEET_RKT0_:
  408|  12.7k|Dest BitCast(const Source& source) {
  409|       |  // Compile time assertion: sizeof(Dest) == sizeof(Source)
  410|       |  // A compile error here means your Dest and Source have different sizes.
  411|  12.7k|#if __cplusplus >= 201103L
  412|  12.7k|  static_assert(sizeof(Dest) == sizeof(Source),
  413|  12.7k|                "source and destination size mismatch");
  414|       |#else
  415|       |  DOUBLE_CONVERSION_UNUSED
  416|       |  typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1];
  417|       |#endif
  418|       |
  419|  12.7k|  Dest dest;
  420|  12.7k|  memmove(&dest, &source, sizeof(dest));
  421|  12.7k|  return dest;
  422|  12.7k|}
_ZN6icu_7817double_conversion6VectorIcEC2EPci:
  265|  2.97k|  Vector(T* data, int len) : start_(data), length_(len) {
  266|  2.97k|    DOUBLE_CONVERSION_ASSERT(len == 0 || (len > 0 && data != DOUBLE_CONVERSION_NULLPTR));
  ------------------
  |  |   57|  2.97k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  267|  2.97k|  }
_ZN6icu_7817double_conversion7BitCastIdmEET_RKT0_:
  408|  7.00k|Dest BitCast(const Source& source) {
  409|       |  // Compile time assertion: sizeof(Dest) == sizeof(Source)
  410|       |  // A compile error here means your Dest and Source have different sizes.
  411|  7.00k|#if __cplusplus >= 201103L
  412|  7.00k|  static_assert(sizeof(Dest) == sizeof(Source),
  413|  7.00k|                "source and destination size mismatch");
  414|       |#else
  415|       |  DOUBLE_CONVERSION_UNUSED
  416|       |  typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1];
  417|       |#endif
  418|       |
  419|  7.00k|  Dest dest;
  420|  7.00k|  memmove(&dest, &source, sizeof(dest));
  421|  7.00k|  return dest;
  422|  7.00k|}
_ZN6icu_7817double_conversion6VectorIKcEC2EPS2_i:
  265|  16.3k|  Vector(T* data, int len) : start_(data), length_(len) {
  266|  16.3k|    DOUBLE_CONVERSION_ASSERT(len == 0 || (len > 0 && data != DOUBLE_CONVERSION_NULLPTR));
  ------------------
  |  |   57|  16.3k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  16.3k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  267|  16.3k|  }
_ZNK6icu_7817double_conversion6VectorIKcEixEi:
  288|   109k|  T& operator[](int index) const {
  289|   109k|    DOUBLE_CONVERSION_ASSERT(0 <= index && index < length_);
  ------------------
  |  |   57|   109k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|   109k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  290|   109k|    return start_[index];
  291|   109k|  }
_ZN6icu_7817double_conversion6VectorIKcE9SubVectorEii:
  271|  7.92k|  Vector<T> SubVector(int from, int to) {
  272|  7.92k|    DOUBLE_CONVERSION_ASSERT(to <= length_);
  ------------------
  |  |   57|  7.92k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  7.92k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  273|  7.92k|    DOUBLE_CONVERSION_ASSERT(from < to);
  ------------------
  |  |   57|  7.92k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  7.92k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  274|  7.92k|    DOUBLE_CONVERSION_ASSERT(0 <= from);
  ------------------
  |  |   57|  7.92k|    U_ASSERT(condition)
  |  |  ------------------
  |  |  |  |   35|  7.92k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  ------------------
  275|  7.92k|    return Vector<T>(start() + from, to - from);
  276|  7.92k|  }
_ZNK6icu_7817double_conversion6VectorIKcE5startEv:
  285|  8.16k|  T* start() const { return start_; }
_ZNK6icu_7817double_conversion6VectorIKcE6lengthEv:
  279|   143k|  int length() const { return length_; }

_ZN6icu_7822FormattedStringBuilderC2Ev:
   37|  9.45k|FormattedStringBuilder::FormattedStringBuilder() {
   38|       |#if U_DEBUG
   39|       |    // Initializing the memory to non-zero helps catch some bugs that involve
   40|       |    // reading from an improperly terminated string.
   41|       |    for (int32_t i=0; i<getCapacity(); i++) {
   42|       |        getCharPtr()[i] = 1;
   43|       |    }
   44|       |#endif
   45|  9.45k|}
_ZN6icu_7822FormattedStringBuilderD2Ev:
   47|  9.45k|FormattedStringBuilder::~FormattedStringBuilder() {
   48|  9.45k|    if (fUsingHeap) {
  ------------------
  |  Branch (48:9): [True: 2.55k, False: 6.89k]
  ------------------
   49|  2.55k|        uprv_free(fChars.heap.ptr);
  ------------------
  |  | 1503|  2.55k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  2.55k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.55k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.55k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   50|  2.55k|        uprv_free(fFields.heap.ptr);
  ------------------
  |  | 1503|  2.55k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  2.55k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.55k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.55k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   51|  2.55k|    }
   52|  9.45k|}
_ZN6icu_7822FormattedStringBuilder15insertCodePointEiiNS0_5FieldER10UErrorCode:
  150|  1.53G|FormattedStringBuilder::insertCodePoint(int32_t index, UChar32 codePoint, Field field, UErrorCode &status) {
  151|  1.53G|    int32_t count = U16_LENGTH(codePoint);
  ------------------
  |  |  141|  1.53G|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 1.42G, False: 106M]
  |  |  ------------------
  ------------------
  152|  1.53G|    int32_t position = prepareForInsert(index, count, status);
  153|  1.53G|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (153:9): [True: 0, False: 1.53G]
  ------------------
  154|      0|        return count;
  155|      0|    }
  156|  1.53G|    auto* charPtr = getCharPtr();
  157|  1.53G|    auto* fieldPtr = getFieldPtr();
  158|  1.53G|    if (count == 1) {
  ------------------
  |  Branch (158:9): [True: 1.42G, False: 106M]
  ------------------
  159|  1.42G|        charPtr[position] = static_cast<char16_t>(codePoint);
  160|  1.42G|        fieldPtr[position] = field;
  161|  1.42G|    } else {
  162|   106M|        charPtr[position] = U16_LEAD(codePoint);
  ------------------
  |  |  123|   106M|#define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
  ------------------
  163|   106M|        charPtr[position + 1] = U16_TRAIL(codePoint);
  ------------------
  |  |  132|   106M|#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
  ------------------
  164|   106M|        fieldPtr[position] = fieldPtr[position + 1] = field;
  165|   106M|    }
  166|  1.53G|    return count;
  167|  1.53G|}
_ZN6icu_7822FormattedStringBuilder6insertEiRKNS_13UnicodeStringENS0_5FieldER10UErrorCode:
  170|   241M|                                    UErrorCode &status) {
  171|   241M|    if (unistr.length() == 0) {
  ------------------
  |  Branch (171:9): [True: 0, False: 241M]
  ------------------
  172|       |        // Nothing to insert.
  173|      0|        return 0;
  174|   241M|    } else if (unistr.length() == 1) {
  ------------------
  |  Branch (174:16): [True: 241M, False: 600]
  ------------------
  175|       |        // Fast path: insert using insertCodePoint.
  176|   241M|        return insertCodePoint(index, unistr.charAt(0), field, status);
  177|   241M|    } else {
  178|    600|        return insert(index, unistr, 0, unistr.length(), field, status);
  179|    600|    }
  180|   241M|}
_ZN6icu_7822FormattedStringBuilder6insertEiRKNS_13UnicodeStringEiiNS0_5FieldER10UErrorCode:
  184|  2.12k|                            Field field, UErrorCode &status) {
  185|  2.12k|    int32_t count = end - start;
  186|  2.12k|    int32_t position = prepareForInsert(index, count, status);
  187|  2.12k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (187:9): [True: 0, False: 2.12k]
  ------------------
  188|      0|        return count;
  189|      0|    }
  190|  5.81k|    for (int32_t i = 0; i < count; i++) {
  ------------------
  |  Branch (190:25): [True: 3.68k, False: 2.12k]
  ------------------
  191|  3.68k|        getCharPtr()[position + i] = unistr.charAt(start + i);
  192|  3.68k|        getFieldPtr()[position + i] = field;
  193|  3.68k|    }
  194|  2.12k|    return count;
  195|  2.12k|}
_ZN6icu_7822FormattedStringBuilder6spliceEiiRKNS_13UnicodeStringEiiNS0_5FieldER10UErrorCode:
  199|     15|                            int32_t startOther, int32_t endOther, Field field, UErrorCode& status) {
  200|     15|    int32_t thisLength = endThis - startThis;
  201|     15|    int32_t otherLength = endOther - startOther;
  202|     15|    int32_t count = otherLength - thisLength;
  203|     15|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (203:9): [True: 0, False: 15]
  ------------------
  204|      0|        return count;
  205|      0|    }
  206|     15|    int32_t position;
  207|     15|    if (count > 0) {
  ------------------
  |  Branch (207:9): [True: 0, False: 15]
  ------------------
  208|       |        // Overall, chars need to be added.
  209|      0|        position = prepareForInsert(startThis, count, status);
  210|     15|    } else {
  211|       |        // Overall, chars need to be removed or kept the same.
  212|     15|        position = remove(startThis, -count);
  213|     15|    }
  214|     15|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (214:9): [True: 0, False: 15]
  ------------------
  215|      0|        return count;
  216|      0|    }
  217|     15|    for (int32_t i = 0; i < otherLength; i++) {
  ------------------
  |  Branch (217:25): [True: 0, False: 15]
  ------------------
  218|      0|        getCharPtr()[position + i] = unistr.charAt(startOther + i);
  219|      0|        getFieldPtr()[position + i] = field;
  220|      0|    }
  221|     15|    return count;
  222|     15|}
_ZN6icu_7822FormattedStringBuilder15writeTerminatorER10UErrorCode:
  253|  9.33k|void FormattedStringBuilder::writeTerminator(UErrorCode& status) {
  254|  9.33k|    int32_t position = prepareForInsert(fLength, 1, status);
  255|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (255:9): [True: 0, False: 9.33k]
  ------------------
  256|      0|        return;
  257|      0|    }
  258|  9.33k|    getCharPtr()[position] = 0;
  259|  9.33k|    getFieldPtr()[position] = kUndefinedField;
  260|  9.33k|    fLength--;
  261|  9.33k|}
_ZN6icu_7822FormattedStringBuilder16prepareForInsertEiiR10UErrorCode:
  263|  1.53G|int32_t FormattedStringBuilder::prepareForInsert(int32_t index, int32_t count, UErrorCode &status) {
  264|  1.53G|    U_ASSERT(index >= 0);
  ------------------
  |  |   35|  1.53G|#   define U_ASSERT(exp) (void)0
  ------------------
  265|  1.53G|    U_ASSERT(index <= fLength);
  ------------------
  |  |   35|  1.53G|#   define U_ASSERT(exp) (void)0
  ------------------
  266|  1.53G|    U_ASSERT(count >= 0);
  ------------------
  |  |   35|  1.53G|#   define U_ASSERT(exp) (void)0
  ------------------
  267|  1.53G|    U_ASSERT(fZero >= 0);
  ------------------
  |  |   35|  1.53G|#   define U_ASSERT(exp) (void)0
  ------------------
  268|  1.53G|    U_ASSERT(fLength >= 0);
  ------------------
  |  |   35|  1.53G|#   define U_ASSERT(exp) (void)0
  ------------------
  269|  1.53G|    U_ASSERT(getCapacity() - fZero >= fLength);
  ------------------
  |  |   35|  1.53G|#   define U_ASSERT(exp) (void)0
  ------------------
  270|  1.53G|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (270:9): [True: 0, False: 1.53G]
  ------------------
  271|      0|        return count;
  272|      0|    }
  273|  1.53G|    if (index == 0 && fZero - count >= 0) {
  ------------------
  |  Branch (273:9): [True: 952M, False: 582M]
  |  Branch (273:23): [True: 952M, False: 87.9k]
  ------------------
  274|       |        // Append to start
  275|   952M|        fZero -= count;
  276|   952M|        fLength += count;
  277|   952M|        return fZero;
  278|   952M|    } else if (index == fLength && count <= getCapacity() - fZero - fLength) {
  ------------------
  |  Branch (278:16): [True: 582M, False: 101k]
  |  Branch (278:36): [True: 582M, False: 40.6k]
  ------------------
  279|       |        // Append to end
  280|   582M|        fLength += count;
  281|   582M|        return fZero + fLength - count;
  282|   582M|    } else {
  283|       |        // Move chars around and/or allocate more space
  284|   141k|        return prepareForInsertHelper(index, count, status);
  285|   141k|    }
  286|  1.53G|}
_ZN6icu_7822FormattedStringBuilder22prepareForInsertHelperEiiR10UErrorCode:
  288|   141k|int32_t FormattedStringBuilder::prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status) {
  289|   141k|    int32_t oldCapacity = getCapacity();
  290|   141k|    int32_t oldZero = fZero;
  291|   141k|    char16_t *oldChars = getCharPtr();
  292|   141k|    Field *oldFields = getFieldPtr();
  293|   141k|    int32_t newLength;
  294|   141k|    if (uprv_add32_overflow(fLength, count, &newLength)) {
  ------------------
  |  | 1394|   141k|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|   141k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   141k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   141k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (294:9): [True: 0, False: 141k]
  ------------------
  295|      0|        status = U_INPUT_TOO_LONG_ERROR;
  296|      0|        return -1;
  297|      0|    }
  298|   141k|    int32_t newZero;
  299|   141k|    if (newLength > oldCapacity) {
  ------------------
  |  Branch (299:9): [True: 13.6k, False: 128k]
  ------------------
  300|  13.6k|        if (newLength > INT32_MAX / 2) {
  ------------------
  |  Branch (300:13): [True: 0, False: 13.6k]
  ------------------
  301|       |            // We do not support more than 1G char16_t in this code because
  302|       |            // dealing with >2G *bytes* can cause subtle bugs.
  303|      0|            status = U_INPUT_TOO_LONG_ERROR;
  304|      0|            return -1;
  305|      0|        }
  306|       |        // Keep newCapacity also to at most 1G char16_t.
  307|  13.6k|        int32_t newCapacity = newLength * 2;
  308|  13.6k|        newZero = (newCapacity - newLength) / 2;
  309|       |
  310|       |        // C++ note: malloc appears in two places: here and in the assignment operator.
  311|  13.6k|        auto* newChars =
  312|  13.6k|            static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * static_cast<size_t>(newCapacity)));
  ------------------
  |  | 1524|  13.6k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  13.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  13.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  13.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  313|  13.6k|        auto* newFields =
  314|  13.6k|            static_cast<Field*>(uprv_malloc(sizeof(Field) * static_cast<size_t>(newCapacity)));
  ------------------
  |  | 1524|  13.6k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  13.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  13.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  13.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  315|  13.6k|        if (newChars == nullptr || newFields == nullptr) {
  ------------------
  |  Branch (315:13): [True: 0, False: 13.6k]
  |  Branch (315:36): [True: 0, False: 13.6k]
  ------------------
  316|      0|            uprv_free(newChars);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  317|      0|            uprv_free(newFields);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  318|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  319|      0|            return -1;
  320|      0|        }
  321|       |
  322|       |        // First copy the prefix and then the suffix, leaving room for the new chars that the
  323|       |        // caller wants to insert.
  324|       |        // C++ note: memcpy is OK because the src and dest do not overlap.
  325|  13.6k|        uprv_memcpy2(newChars + newZero, oldChars + oldZero, sizeof(char16_t) * index);
  326|  13.6k|        uprv_memcpy2(newChars + newZero + index + count,
  327|  13.6k|                oldChars + oldZero + index,
  328|  13.6k|                sizeof(char16_t) * (fLength - index));
  329|  13.6k|        uprv_memcpy2(newFields + newZero, oldFields + oldZero, sizeof(Field) * index);
  330|  13.6k|        uprv_memcpy2(newFields + newZero + index + count,
  331|  13.6k|                oldFields + oldZero + index,
  332|  13.6k|                sizeof(Field) * (fLength - index));
  333|       |
  334|  13.6k|        if (fUsingHeap) {
  ------------------
  |  Branch (334:13): [True: 11.0k, False: 2.55k]
  ------------------
  335|  11.0k|            uprv_free(oldChars);
  ------------------
  |  | 1503|  11.0k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  11.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  11.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  11.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  336|  11.0k|            uprv_free(oldFields);
  ------------------
  |  | 1503|  11.0k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  11.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  11.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  11.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  337|  11.0k|        }
  338|  13.6k|        fUsingHeap = true;
  339|  13.6k|        fChars.heap.ptr = newChars;
  340|  13.6k|        fChars.heap.capacity = newCapacity;
  341|  13.6k|        fFields.heap.ptr = newFields;
  342|  13.6k|        fFields.heap.capacity = newCapacity;
  343|   128k|    } else {
  344|   128k|        newZero = (oldCapacity - newLength) / 2;
  345|       |
  346|       |        // C++ note: memmove is required because src and dest may overlap.
  347|       |        // First copy the entire string to the location of the prefix, and then move the suffix
  348|       |        // to make room for the new chars that the caller wants to insert.
  349|   128k|        uprv_memmove2(oldChars + newZero, oldChars + oldZero, sizeof(char16_t) * fLength);
  350|   128k|        uprv_memmove2(oldChars + newZero + index + count,
  351|   128k|                oldChars + newZero + index,
  352|   128k|                sizeof(char16_t) * (fLength - index));
  353|   128k|        uprv_memmove2(oldFields + newZero, oldFields + oldZero, sizeof(Field) * fLength);
  354|   128k|        uprv_memmove2(oldFields + newZero + index + count,
  355|   128k|                oldFields + newZero + index,
  356|   128k|                sizeof(Field) * (fLength - index));
  357|   128k|    }
  358|   141k|    fZero = newZero;
  359|   141k|    fLength = newLength;
  360|   141k|    return fZero + index;
  361|   141k|}
_ZN6icu_7822FormattedStringBuilder6removeEii:
  363|     15|int32_t FormattedStringBuilder::remove(int32_t index, int32_t count) {
  364|     15|     U_ASSERT(0 <= index);
  ------------------
  |  |   35|     15|#   define U_ASSERT(exp) (void)0
  ------------------
  365|     15|     U_ASSERT(index <= fLength);
  ------------------
  |  |   35|     15|#   define U_ASSERT(exp) (void)0
  ------------------
  366|     15|     U_ASSERT(count <= (fLength - index));
  ------------------
  |  |   35|     15|#   define U_ASSERT(exp) (void)0
  ------------------
  367|     15|     U_ASSERT(index <= getCapacity() - fZero);
  ------------------
  |  |   35|     15|#   define U_ASSERT(exp) (void)0
  ------------------
  368|       |
  369|     15|    int32_t position = index + fZero;
  370|       |    // TODO: Reset the heap here?  (If the string after removal can fit on stack?)
  371|     15|    uprv_memmove2(getCharPtr() + position,
  372|     15|            getCharPtr() + position + count,
  373|     15|            sizeof(char16_t) * (fLength - index - count));
  374|     15|    uprv_memmove2(getFieldPtr() + position,
  375|     15|            getFieldPtr() + position + count,
  376|     15|            sizeof(Field) * (fLength - index - count));
  377|     15|    fLength -= count;
  378|     15|    return position;
  379|     15|}
formatted_string_builder.cpp:_ZN12_GLOBAL__N_112uprv_memcpy2EPvPKvm:
   18|  54.5k|inline void uprv_memcpy2(void* dest, const void* src, size_t len) {
   19|  54.5k|    if (len > 0) {
  ------------------
  |  Branch (19:9): [True: 27.4k, False: 27.0k]
  ------------------
   20|  27.4k|        uprv_memcpy(dest, src, len);
  ------------------
  |  |   42|  27.4k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  27.4k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  27.4k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  27.4k|    _Pragma("clang diagnostic push") \
  |  |   45|  27.4k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  27.4k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  27.4k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  27.4k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  27.4k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  27.4k|    _Pragma("clang diagnostic pop") \
  |  |   49|  27.4k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  27.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  27.4k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  27.4k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   21|  27.4k|    }
   22|  54.5k|}
formatted_string_builder.cpp:_ZN12_GLOBAL__N_113uprv_memmove2EPvPKvm:
   26|   513k|inline void uprv_memmove2(void* dest, const void* src, size_t len) {
   27|   513k|    if (len > 0) {
  ------------------
  |  Branch (27:9): [True: 441k, False: 71.9k]
  ------------------
   28|   441k|        uprv_memmove(dest, src, len);
  ------------------
  |  |   51|   441k|#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   441k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   52|   441k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   53|   441k|    _Pragma("clang diagnostic push") \
  |  |   54|   441k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   55|   441k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   441k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   56|   441k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   441k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   57|   441k|    _Pragma("clang diagnostic pop") \
  |  |   58|   441k|    U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   441k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   59|   441k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   441k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   29|   441k|    }
   30|   513k|}

_ZNK6icu_7822FormattedStringBuilder7fieldAtEi:
   85|  5.60k|    inline Field fieldAt(int32_t index) const {
   86|  5.60k|        U_ASSERT(index >= 0);
  ------------------
  |  |   35|  5.60k|#   define U_ASSERT(exp) (void)0
  ------------------
   87|  5.60k|        U_ASSERT(index < fLength);
  ------------------
  |  |   35|  5.60k|#   define U_ASSERT(exp) (void)0
  ------------------
   88|  5.60k|        return getFieldPtr()[fZero + index];
   89|  5.60k|    }
_ZN6icu_7822FormattedStringBuilder10getCharPtrEv:
  191|  1.53G|    inline char16_t *getCharPtr() {
  192|  1.53G|        return fUsingHeap ? fChars.heap.ptr : fChars.value;
  ------------------
  |  Branch (192:16): [True: 1.53G, False: 216k]
  ------------------
  193|  1.53G|    }
_ZN6icu_7822FormattedStringBuilder11getFieldPtrEv:
  199|  1.53G|    inline Field *getFieldPtr() {
  200|  1.53G|        return fUsingHeap ? fFields.heap.ptr : fFields.value;
  ------------------
  |  Branch (200:16): [True: 1.53G, False: 216k]
  ------------------
  201|  1.53G|    }
_ZNK6icu_7822FormattedStringBuilder11getFieldPtrEv:
  203|  5.60k|    inline const Field *getFieldPtr() const {
  204|  5.60k|        return fUsingHeap ? fFields.heap.ptr : fFields.value;
  ------------------
  |  Branch (204:16): [True: 1.63k, False: 3.97k]
  ------------------
  205|  5.60k|    }
_ZNK6icu_7822FormattedStringBuilder11getCapacityEv:
  207|   583M|    inline int32_t getCapacity() const {
  208|   583M|        return fUsingHeap ? fChars.heap.capacity : DEFAULT_CAPACITY;
  ------------------
  |  Branch (208:16): [True: 582M, False: 71.5k]
  ------------------
  209|   583M|    }
_ZNK6icu_7822FormattedStringBuilder5FieldneERKS1_:
  263|  5.60k|inline bool FormattedStringBuilder::Field::operator!=(const Field& other) const {
  264|  5.60k|    return bits != other.bits;
  265|  5.60k|}
_ZN6icu_7822FormattedStringBuilder5FieldC2Ehh:
  227|  1.53G|    : bits((
  228|  1.53G|        U_ASSERT(category <= 0xf),
  ------------------
  |  |   35|  1.53G|#   define U_ASSERT(exp) (void)0
  ------------------
  229|  1.53G|        U_ASSERT(field <= 0xf),
  ------------------
  |  |   35|  1.53G|#   define U_ASSERT(exp) (void)0
  ------------------
  230|  1.53G|        static_cast<uint8_t>((category << 4) | field)
  231|  1.53G|    )) {}

_ZN6icu_7831FormattedValueStringBuilderImpl12getStringRefEv:
  169|  18.7k|    inline FormattedStringBuilder& getStringRef() {
  170|  18.7k|        return fString;
  171|  18.7k|    }
_ZN6icu_786number15FormattedNumberD2Ev:
  230|  9.45k|    Name::~Name() { \
  231|  9.45k|        delete fData; \
  232|  9.45k|        fData = nullptr; \
  233|  9.45k|    } \

_ZN6icu_7831FormattedValueStringBuilderImplC2ENS_22FormattedStringBuilder5FieldE:
   27|  9.45k|        : fNumericField(numericField) {
   28|  9.45k|}
_ZN6icu_7831FormattedValueStringBuilderImplD2Ev:
   30|  9.45k|FormattedValueStringBuilderImpl::~FormattedValueStringBuilderImpl() {
   31|  9.45k|}

_ZN6icu_7814FormattedValueD2Ev:
   68|  18.9k|FormattedValue::~FormattedValue() = default;

_ZN6icu_7811MeasureUnit10getPercentEv:
  911|    830|MeasureUnit MeasureUnit::getPercent() {
  912|    830|    return MeasureUnit(3, 10);
  913|    830|}
_ZN6icu_7811MeasureUnit8getMeterEv:
 1615|  1.06k|MeasureUnit MeasureUnit::getMeter() {
 1616|  1.06k|    return MeasureUnit(13, 13);
 1617|  1.06k|}
_ZN6icu_7811MeasureUnitC2Ev:
 2566|  76.7k|MeasureUnit::MeasureUnit() : MeasureUnit(kBaseTypeIdx, kBaseSubTypeIdx) {
 2567|  76.7k|}
_ZN6icu_7811MeasureUnitC2Eii:
 2570|  78.6k|        : fImpl(nullptr), fSubTypeId(subTypeId), fTypeId(typeId) {
 2571|  78.6k|}
_ZN6icu_7811MeasureUnitC2ERKS0_:
 2574|  29.5k|        : fImpl(nullptr) {
 2575|  29.5k|    *this = other;
 2576|  29.5k|}
_ZN6icu_7811MeasureUnitC2EOS0_:
 2579|  7.61k|        : fImpl(other.fImpl),
 2580|  7.61k|        fSubTypeId(other.fSubTypeId),
 2581|  7.61k|        fTypeId(other.fTypeId) {
 2582|  7.61k|    other.fImpl = nullptr;
 2583|  7.61k|}
_ZN6icu_7811MeasureUnitaSERKS0_:
 2592|  55.9k|MeasureUnit &MeasureUnit::operator=(const MeasureUnit &other) {
 2593|  55.9k|    if (this == &other) {
  ------------------
  |  Branch (2593:9): [True: 0, False: 55.9k]
  ------------------
 2594|      0|        return *this;
 2595|      0|    }
 2596|  55.9k|    delete fImpl;
 2597|  55.9k|    if (other.fImpl) {
  ------------------
  |  Branch (2597:9): [True: 0, False: 55.9k]
  ------------------
 2598|      0|        ErrorCode localStatus;
 2599|      0|        fImpl = new MeasureUnitImpl(other.fImpl->copy(localStatus));
 2600|      0|        if (!fImpl || localStatus.isFailure()) {
  ------------------
  |  Branch (2600:13): [True: 0, False: 0]
  |  Branch (2600:23): [True: 0, False: 0]
  ------------------
 2601|       |            // Unrecoverable allocation error; set to the default unit
 2602|      0|            *this = MeasureUnit();
 2603|      0|            return *this;
 2604|      0|        }
 2605|  55.9k|    } else {
 2606|  55.9k|        fImpl = nullptr;
 2607|  55.9k|    }
 2608|  55.9k|    fTypeId = other.fTypeId;
 2609|  55.9k|    fSubTypeId = other.fSubTypeId;
 2610|  55.9k|    return *this;
 2611|  55.9k|}
_ZN6icu_7811MeasureUnitaSEOS0_:
 2613|  10.1k|MeasureUnit &MeasureUnit::operator=(MeasureUnit &&other) noexcept {
 2614|  10.1k|    if (this == &other) {
  ------------------
  |  Branch (2614:9): [True: 0, False: 10.1k]
  ------------------
 2615|      0|        return *this;
 2616|      0|    }
 2617|  10.1k|    delete fImpl;
 2618|  10.1k|    fImpl = other.fImpl;
 2619|  10.1k|    other.fImpl = nullptr;
 2620|  10.1k|    fTypeId = other.fTypeId;
 2621|  10.1k|    fSubTypeId = other.fSubTypeId;
 2622|  10.1k|    return *this;
 2623|  10.1k|}
_ZN6icu_7811MeasureUnitD2Ev:
 2629|   115k|MeasureUnit::~MeasureUnit() {
 2630|   115k|    if (fImpl != nullptr) {
  ------------------
  |  Branch (2630:9): [True: 0, False: 115k]
  ------------------
 2631|      0|        delete fImpl;
 2632|      0|        fImpl = nullptr;
 2633|      0|    }
 2634|   115k|}
_ZNK6icu_7811MeasureUnit7getTypeEv:
 2636|  14.9k|const char *MeasureUnit::getType() const {
 2637|       |    // We have a type & subtype only if fTypeId is present.
 2638|  14.9k|    if (fTypeId == -1) {
  ------------------
  |  Branch (2638:9): [True: 0, False: 14.9k]
  ------------------
 2639|      0|        return "";
 2640|      0|    }
 2641|  14.9k|    return gTypes[fTypeId];
 2642|  14.9k|}
_ZNK6icu_7811MeasureUnit10getSubtypeEv:
 2644|  23.8k|const char *MeasureUnit::getSubtype() const {
 2645|       |    // We have a type & subtype only if fTypeId is present.
 2646|  23.8k|    if (fTypeId == -1) {
  ------------------
  |  Branch (2646:9): [True: 0, False: 23.8k]
  ------------------
 2647|      0|        return "";
 2648|      0|    }
 2649|  23.8k|    return getIdentifier();
 2650|  23.8k|}
_ZNK6icu_7811MeasureUnit13getIdentifierEv:
 2652|  45.5k|const char *MeasureUnit::getIdentifier() const {
 2653|  45.5k|    return fImpl ? fImpl->identifier.data() : gSubTypes[getOffset()];
  ------------------
  |  Branch (2653:12): [True: 0, False: 45.5k]
  ------------------
 2654|  45.5k|}
_ZNK6icu_7811MeasureUniteqERKNS_7UObjectE:
 2656|  10.8k|bool MeasureUnit::operator==(const UObject& other) const {
 2657|  10.8k|    if (this == &other) {  // Same object, equal
  ------------------
  |  Branch (2657:9): [True: 0, False: 10.8k]
  ------------------
 2658|      0|        return true;
 2659|      0|    }
 2660|  10.8k|    if (typeid(*this) != typeid(other)) { // Different types, not equal
  ------------------
  |  Branch (2660:9): [True: 0, False: 10.8k]
  ------------------
 2661|      0|        return false;
 2662|      0|    }
 2663|  10.8k|    const MeasureUnit &rhs = static_cast<const MeasureUnit&>(other);
 2664|  10.8k|    return uprv_strcmp(getIdentifier(), rhs.getIdentifier()) == 0;
  ------------------
  |  |   38|  10.8k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  10.8k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2665|  10.8k|}
_ZN6icu_7811MeasureUnit12initCurrencyENS_11StringPieceE:
 2768|  18.6k|void MeasureUnit::initCurrency(StringPiece isoCurrency) {
 2769|  18.6k|    int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "currency");
  ------------------
  |  |   99|  18.6k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 2770|  18.6k|    U_ASSERT(result != -1);
  ------------------
  |  |   35|  18.6k|#   define U_ASSERT(exp) (void)0
  ------------------
 2771|  18.6k|    fTypeId = result;
 2772|  18.6k|    result = binarySearch(
 2773|  18.6k|            gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], isoCurrency);
 2774|  18.6k|    if (result == -1) {
  ------------------
  |  Branch (2774:9): [True: 0, False: 18.6k]
  ------------------
 2775|      0|        fImpl = new MeasureUnitImpl(MeasureUnitImpl::forCurrencyCode(isoCurrency));
 2776|      0|        if (fImpl) {
  ------------------
  |  Branch (2776:13): [True: 0, False: 0]
  ------------------
 2777|      0|            fSubTypeId = -1;
 2778|      0|            return;
 2779|      0|        }
 2780|       |        // malloc error: fall back to the undefined currency
 2781|      0|        result = binarySearch(
 2782|      0|            gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], kDefaultCurrency8);
 2783|      0|        U_ASSERT(result != -1);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 2784|      0|    }
 2785|  18.6k|    fSubTypeId = result - gOffsets[fTypeId];
 2786|  18.6k|}
_ZNK6icu_7811MeasureUnit9getOffsetEv:
 2797|  45.5k|int32_t MeasureUnit::getOffset() const {
 2798|  45.5k|    if (fTypeId < 0 || fSubTypeId < 0) {
  ------------------
  |  Branch (2798:9): [True: 0, False: 45.5k]
  |  Branch (2798:24): [True: 0, False: 45.5k]
  ------------------
 2799|      0|        return -1;
 2800|      0|    }
 2801|  45.5k|    return gOffsets[fTypeId] + fSubTypeId;
 2802|  45.5k|}
measunit.cpp:_ZN6icu_78L12binarySearchEPKPKciiNS_11StringPieceE:
 2550|  37.3k|        const char * const * array, int32_t start, int32_t end, StringPiece key) {
 2551|   149k|    while (start < end) {
  ------------------
  |  Branch (2551:12): [True: 149k, False: 0]
  ------------------
 2552|   149k|        int32_t mid = (start + end) / 2;
 2553|   149k|        int32_t cmp = StringPiece(array[mid]).compare(key);
 2554|   149k|        if (cmp < 0) {
  ------------------
  |  Branch (2554:13): [True: 74.6k, False: 74.6k]
  ------------------
 2555|  74.6k|            start = mid + 1;
 2556|  74.6k|            continue;
 2557|  74.6k|        }
 2558|  74.6k|        if (cmp == 0) {
  ------------------
  |  Branch (2558:13): [True: 37.3k, False: 37.3k]
  ------------------
 2559|  37.3k|            return mid;
 2560|  37.3k|        }
 2561|  37.3k|        end = mid;
 2562|  37.3k|    }
 2563|      0|    return -1;
 2564|  37.3k|}

_ZN6icu_786number4impl14SymbolProviderD2Ev:
   17|  9.33k|SymbolProvider::~SymbolProvider() = default;
_ZN6icu_786number4impl10AffixUtils15getFieldForTypeENS1_16AffixPatternTypeE:
  131|  3.21k|Field AffixUtils::getFieldForType(AffixPatternType type) {
  132|  3.21k|    switch (type) {
  133|  3.10k|        case TYPE_MINUS_SIGN:
  ------------------
  |  Branch (133:9): [True: 3.10k, False: 107]
  ------------------
  134|  3.10k|            return {UFIELD_CATEGORY_NUMBER, UNUM_SIGN_FIELD};
  135|     21|        case TYPE_PLUS_SIGN:
  ------------------
  |  Branch (135:9): [True: 21, False: 3.18k]
  ------------------
  136|     21|            return {UFIELD_CATEGORY_NUMBER, UNUM_SIGN_FIELD};
  137|      0|        case TYPE_APPROXIMATELY_SIGN:
  ------------------
  |  Branch (137:9): [True: 0, False: 3.21k]
  ------------------
  138|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_APPROXIMATELY_SIGN_FIELD};
  139|     86|        case TYPE_PERCENT:
  ------------------
  |  Branch (139:9): [True: 86, False: 3.12k]
  ------------------
  140|     86|            return {UFIELD_CATEGORY_NUMBER, UNUM_PERCENT_FIELD};
  141|      0|        case TYPE_PERMILLE:
  ------------------
  |  Branch (141:9): [True: 0, False: 3.21k]
  ------------------
  142|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_PERMILL_FIELD};
  143|      0|        case TYPE_CURRENCY_SINGLE:
  ------------------
  |  Branch (143:9): [True: 0, False: 3.21k]
  ------------------
  144|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  145|      0|        case TYPE_CURRENCY_DOUBLE:
  ------------------
  |  Branch (145:9): [True: 0, False: 3.21k]
  ------------------
  146|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  147|      0|        case TYPE_CURRENCY_TRIPLE:
  ------------------
  |  Branch (147:9): [True: 0, False: 3.21k]
  ------------------
  148|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  149|      0|        case TYPE_CURRENCY_QUAD:
  ------------------
  |  Branch (149:9): [True: 0, False: 3.21k]
  ------------------
  150|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  151|      0|        case TYPE_CURRENCY_QUINT:
  ------------------
  |  Branch (151:9): [True: 0, False: 3.21k]
  ------------------
  152|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  153|      0|        case TYPE_CURRENCY_OVERFLOW:
  ------------------
  |  Branch (153:9): [True: 0, False: 3.21k]
  ------------------
  154|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  155|      0|        default:
  ------------------
  |  Branch (155:9): [True: 0, False: 3.21k]
  ------------------
  156|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  157|  3.21k|    }
  158|  3.21k|}
_ZN6icu_786number4impl10AffixUtils8unescapeERKNS_13UnicodeStringERNS_22FormattedStringBuilderEiRKNS1_14SymbolProviderENS6_5FieldER10UErrorCode:
  162|  18.6k|                     const SymbolProvider &provider, Field field, UErrorCode &status) {
  163|  18.6k|    int32_t length = 0;
  164|  18.6k|    AffixTag tag;
  165|  29.7k|    while (hasNext(tag, affixPattern)) {
  ------------------
  |  Branch (165:12): [True: 11.0k, False: 18.6k]
  ------------------
  166|  11.0k|        tag = nextToken(tag, affixPattern, status);
  167|  11.0k|        if (U_FAILURE(status)) { return length; }
  ------------------
  |  Branch (167:13): [True: 0, False: 11.0k]
  ------------------
  168|  11.0k|        if (tag.type == TYPE_CURRENCY_OVERFLOW) {
  ------------------
  |  Branch (168:13): [True: 0, False: 11.0k]
  ------------------
  169|       |            // Don't go to the provider for this special case
  170|      0|            length += output.insertCodePoint(
  171|      0|                position + length,
  172|      0|                0xFFFD,
  173|      0|                {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD},
  174|      0|                status);
  175|  11.0k|        } else if (tag.type < 0) {
  ------------------
  |  Branch (175:20): [True: 3.21k, False: 7.87k]
  ------------------
  176|  3.21k|            length += output.insert(
  177|  3.21k|                    position + length, provider.getSymbol(tag.type), getFieldForType(tag.type), status);
  178|  7.87k|        } else {
  179|  7.87k|            length += output.insertCodePoint(position + length, tag.codePoint, field, status);
  180|  7.87k|        }
  181|  11.0k|    }
  182|  18.6k|    return length;
  183|  18.6k|}
_ZN6icu_786number4impl10AffixUtils12containsTypeERKNS_13UnicodeStringENS1_16AffixPatternTypeER10UErrorCode:
  204|  16.2k|AffixUtils::containsType(const UnicodeString &affixPattern, AffixPatternType type, UErrorCode &status) {
  205|  16.2k|    if (affixPattern.length() == 0) {
  ------------------
  |  Branch (205:9): [True: 0, False: 16.2k]
  ------------------
  206|      0|        return false;
  207|      0|    }
  208|  16.2k|    AffixTag tag;
  209|   164k|    while (hasNext(tag, affixPattern)) {
  ------------------
  |  Branch (209:12): [True: 147k, False: 16.2k]
  ------------------
  210|   147k|        tag = nextToken(tag, affixPattern, status);
  211|   147k|        if (U_FAILURE(status)) { return false; }
  ------------------
  |  Branch (211:13): [True: 0, False: 147k]
  ------------------
  212|   147k|        if (tag.type == type) {
  ------------------
  |  Branch (212:13): [True: 0, False: 147k]
  ------------------
  213|      0|            return true;
  214|      0|        }
  215|   147k|    }
  216|  16.2k|    return false;
  217|  16.2k|}
_ZN6icu_786number4impl10AffixUtils9nextTokenENS1_8AffixTagERKNS_13UnicodeStringER10UErrorCode:
  281|   158k|AffixTag AffixUtils::nextToken(AffixTag tag, const UnicodeString &patternString, UErrorCode &status) {
  282|   158k|    int32_t offset = tag.offset;
  283|   158k|    int32_t state = tag.state;
  284|   159k|    for (; offset < patternString.length();) {
  ------------------
  |  Branch (284:12): [True: 159k, False: 0]
  ------------------
  285|   159k|        UChar32 cp = patternString.char32At(offset);
  286|   159k|        int32_t count = U16_LENGTH(cp);
  ------------------
  |  |  141|   159k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 159k, False: 43]
  |  |  ------------------
  ------------------
  287|       |
  288|   159k|        switch (state) {
  289|   158k|            case STATE_BASE:
  ------------------
  |  Branch (289:13): [True: 158k, False: 504]
  ------------------
  290|   158k|                switch (cp) {
  291|    466|                    case u'\'':
  ------------------
  |  Branch (291:21): [True: 466, False: 158k]
  ------------------
  292|    466|                        state = STATE_FIRST_QUOTE;
  293|    466|                        offset += count;
  294|       |                        // continue to the next code point
  295|    466|                        break;
  296|  3.12k|                    case u'-':
  ------------------
  |  Branch (296:21): [True: 3.12k, False: 155k]
  ------------------
  297|  3.12k|                        return makeTag(offset + count, TYPE_MINUS_SIGN, STATE_BASE, 0);
  298|     21|                    case u'+':
  ------------------
  |  Branch (298:21): [True: 21, False: 158k]
  ------------------
  299|     21|                        return makeTag(offset + count, TYPE_PLUS_SIGN, STATE_BASE, 0);
  300|      0|                    case u'~':
  ------------------
  |  Branch (300:21): [True: 0, False: 158k]
  ------------------
  301|      0|                        return makeTag(offset + count, TYPE_APPROXIMATELY_SIGN, STATE_BASE, 0);
  302|    278|                    case u'%':
  ------------------
  |  Branch (302:21): [True: 278, False: 158k]
  ------------------
  303|    278|                        return makeTag(offset + count, TYPE_PERCENT, STATE_BASE, 0);
  304|      0|                    case u'‰':
  ------------------
  |  Branch (304:21): [True: 0, False: 158k]
  ------------------
  305|      0|                        return makeTag(offset + count, TYPE_PERMILLE, STATE_BASE, 0);
  306|      0|                    case u'¤':
  ------------------
  |  Branch (306:21): [True: 0, False: 158k]
  ------------------
  307|      0|                        state = STATE_FIRST_CURR;
  308|      0|                        offset += count;
  309|       |                        // continue to the next code point
  310|      0|                        break;
  311|   155k|                    default:
  ------------------
  |  Branch (311:21): [True: 155k, False: 3.88k]
  ------------------
  312|   155k|                        return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
  313|   158k|                }
  314|    466|                break;
  315|    466|            case STATE_FIRST_QUOTE:
  ------------------
  |  Branch (315:13): [True: 466, False: 158k]
  ------------------
  316|    466|                if (cp == u'\'') {
  ------------------
  |  Branch (316:21): [True: 0, False: 466]
  ------------------
  317|      0|                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
  318|    466|                } else {
  319|    466|                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
  320|    466|                }
  321|     19|            case STATE_INSIDE_QUOTE:
  ------------------
  |  Branch (321:13): [True: 19, False: 159k]
  ------------------
  322|     19|                if (cp == u'\'') {
  ------------------
  |  Branch (322:21): [True: 19, False: 0]
  ------------------
  323|     19|                    state = STATE_AFTER_QUOTE;
  324|     19|                    offset += count;
  325|       |                    // continue to the next code point
  326|     19|                    break;
  327|     19|                } else {
  328|      0|                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
  329|      0|                }
  330|     19|            case STATE_AFTER_QUOTE:
  ------------------
  |  Branch (330:13): [True: 19, False: 159k]
  ------------------
  331|     19|                if (cp == u'\'') {
  ------------------
  |  Branch (331:21): [True: 0, False: 19]
  ------------------
  332|      0|                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
  333|     19|                } else {
  334|     19|                    state = STATE_BASE;
  335|       |                    // re-evaluate this code point
  336|     19|                    break;
  337|     19|                }
  338|      0|            case STATE_FIRST_CURR:
  ------------------
  |  Branch (338:13): [True: 0, False: 159k]
  ------------------
  339|      0|                if (cp == u'¤') {
  ------------------
  |  Branch (339:21): [True: 0, False: 0]
  ------------------
  340|      0|                    state = STATE_SECOND_CURR;
  341|      0|                    offset += count;
  342|       |                    // continue to the next code point
  343|      0|                    break;
  344|      0|                } else {
  345|      0|                    return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0);
  346|      0|                }
  347|      0|            case STATE_SECOND_CURR:
  ------------------
  |  Branch (347:13): [True: 0, False: 159k]
  ------------------
  348|      0|                if (cp == u'¤') {
  ------------------
  |  Branch (348:21): [True: 0, False: 0]
  ------------------
  349|      0|                    state = STATE_THIRD_CURR;
  350|      0|                    offset += count;
  351|       |                    // continue to the next code point
  352|      0|                    break;
  353|      0|                } else {
  354|      0|                    return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0);
  355|      0|                }
  356|      0|            case STATE_THIRD_CURR:
  ------------------
  |  Branch (356:13): [True: 0, False: 159k]
  ------------------
  357|      0|                if (cp == u'¤') {
  ------------------
  |  Branch (357:21): [True: 0, False: 0]
  ------------------
  358|      0|                    state = STATE_FOURTH_CURR;
  359|      0|                    offset += count;
  360|       |                    // continue to the next code point
  361|      0|                    break;
  362|      0|                } else {
  363|      0|                    return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0);
  364|      0|                }
  365|      0|            case STATE_FOURTH_CURR:
  ------------------
  |  Branch (365:13): [True: 0, False: 159k]
  ------------------
  366|      0|                if (cp == u'¤') {
  ------------------
  |  Branch (366:21): [True: 0, False: 0]
  ------------------
  367|      0|                    state = STATE_FIFTH_CURR;
  368|      0|                    offset += count;
  369|       |                    // continue to the next code point
  370|      0|                    break;
  371|      0|                } else {
  372|      0|                    return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0);
  373|      0|                }
  374|      0|            case STATE_FIFTH_CURR:
  ------------------
  |  Branch (374:13): [True: 0, False: 159k]
  ------------------
  375|      0|                if (cp == u'¤') {
  ------------------
  |  Branch (375:21): [True: 0, False: 0]
  ------------------
  376|      0|                    state = STATE_OVERFLOW_CURR;
  377|      0|                    offset += count;
  378|       |                    // continue to the next code point
  379|      0|                    break;
  380|      0|                } else {
  381|      0|                    return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0);
  382|      0|                }
  383|      0|            case STATE_OVERFLOW_CURR:
  ------------------
  |  Branch (383:13): [True: 0, False: 159k]
  ------------------
  384|      0|                if (cp == u'¤') {
  ------------------
  |  Branch (384:21): [True: 0, False: 0]
  ------------------
  385|      0|                    offset += count;
  386|       |                    // continue to the next code point and loop back to this state
  387|      0|                    break;
  388|      0|                } else {
  389|      0|                    return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
  390|      0|                }
  391|      0|            default:
  ------------------
  |  Branch (391:13): [True: 0, False: 159k]
  ------------------
  392|      0|                UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  393|   159k|        }
  394|   159k|    }
  395|       |    // End of string
  396|      0|    switch (state) {
  397|      0|        case STATE_BASE:
  ------------------
  |  Branch (397:9): [True: 0, False: 0]
  ------------------
  398|       |            // No more tokens in string.
  399|      0|            return {-1};
  400|      0|        case STATE_FIRST_QUOTE:
  ------------------
  |  Branch (400:9): [True: 0, False: 0]
  ------------------
  401|      0|        case STATE_INSIDE_QUOTE:
  ------------------
  |  Branch (401:9): [True: 0, False: 0]
  ------------------
  402|       |            // For consistent behavior with the JDK and ICU 58, set an error here.
  403|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  404|      0|            return {-1};
  405|      0|        case STATE_AFTER_QUOTE:
  ------------------
  |  Branch (405:9): [True: 0, False: 0]
  ------------------
  406|       |            // No more tokens in string.
  407|      0|            return {-1};
  408|      0|        case STATE_FIRST_CURR:
  ------------------
  |  Branch (408:9): [True: 0, False: 0]
  ------------------
  409|      0|            return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0);
  410|      0|        case STATE_SECOND_CURR:
  ------------------
  |  Branch (410:9): [True: 0, False: 0]
  ------------------
  411|      0|            return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0);
  412|      0|        case STATE_THIRD_CURR:
  ------------------
  |  Branch (412:9): [True: 0, False: 0]
  ------------------
  413|      0|            return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0);
  414|      0|        case STATE_FOURTH_CURR:
  ------------------
  |  Branch (414:9): [True: 0, False: 0]
  ------------------
  415|      0|            return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0);
  416|      0|        case STATE_FIFTH_CURR:
  ------------------
  |  Branch (416:9): [True: 0, False: 0]
  ------------------
  417|      0|            return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0);
  418|      0|        case STATE_OVERFLOW_CURR:
  ------------------
  |  Branch (418:9): [True: 0, False: 0]
  ------------------
  419|      0|            return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
  420|      0|        default:
  ------------------
  |  Branch (420:9): [True: 0, False: 0]
  ------------------
  421|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  422|      0|    }
  423|      0|}
_ZN6icu_786number4impl10AffixUtils7hasNextERKNS1_8AffixTagERKNS_13UnicodeStringE:
  425|   193k|bool AffixUtils::hasNext(const AffixTag &tag, const UnicodeString &string) {
  426|       |    // First check for the {-1} and default initializer syntax.
  427|   193k|    if (tag.offset < 0) {
  ------------------
  |  Branch (427:9): [True: 0, False: 193k]
  ------------------
  428|      0|        return false;
  429|   193k|    } else if (tag.offset == 0) {
  ------------------
  |  Branch (429:16): [True: 34.8k, False: 158k]
  ------------------
  430|  34.8k|        return string.length() > 0;
  431|  34.8k|    }
  432|       |    // The rest of the fields are safe to use now.
  433|       |    // Special case: the last character in string is an end quote.
  434|   158k|    if (tag.state == STATE_INSIDE_QUOTE && tag.offset == string.length() - 1 &&
  ------------------
  |  Branch (434:9): [True: 466, False: 158k]
  |  Branch (434:44): [True: 447, False: 19]
  ------------------
  435|   158k|        string.charAt(tag.offset) == u'\'') {
  ------------------
  |  Branch (435:9): [True: 447, False: 0]
  ------------------
  436|    447|        return false;
  437|   158k|    } else if (tag.state != STATE_BASE) {
  ------------------
  |  Branch (437:16): [True: 19, False: 158k]
  ------------------
  438|     19|        return true;
  439|   158k|    } else {
  440|   158k|        return tag.offset < string.length();
  441|   158k|    }
  442|   158k|}

_ZN6icu_786number4impl8AffixTagC2Ev:
   42|  34.8k|            : offset(0), state(STATE_BASE) {}
_ZN6icu_786number4impl8AffixTagC2EiiNS1_17AffixPatternStateENS1_16AffixPatternTypeE:
   48|   158k|            : offset(offset), codePoint(codePoint), state(state), type(type) {}
_ZN6icu_786number4impl10AffixUtils7makeTagEiNS1_16AffixPatternTypeENS1_17AffixPatternStateEi:
  232|   158k|                                   UChar32 cp) {
  233|   158k|        return {offset, cp, state, type};
  234|   158k|    }

_ZN6icu_786number4impl11CompactDataC2Ev:
   58|  3.37k|CompactData::CompactData() : patterns(), multipliers(), largestMagnitude(0), isEmpty(true) {
   59|  3.37k|}
_ZN6icu_786number4impl11CompactData8populateERKNS_6LocaleEPKc19UNumberCompactStyleNS1_11CompactTypeER10UErrorCode:
   62|  3.37k|                           CompactType compactType, UErrorCode &status) {
   63|  3.37k|    CompactDataSink sink(*this);
   64|  3.37k|    LocalUResourceBundlePointer rb(ures_open(nullptr, locale.getName(), &status));
  ------------------
  |  | 1691|  3.37k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  3.37k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.37k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.37k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   65|  3.37k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (65:9): [True: 0, False: 3.37k]
  ------------------
   66|       |
   67|  3.37k|    bool nsIsLatn = strcmp(nsName, "latn") == 0;
   68|  3.37k|    bool compactIsShort = compactStyle == CompactStyle::UNUM_SHORT;
   69|       |
   70|       |    // Fall back to latn numbering system and/or short compact style.
   71|  3.37k|    CharString resourceKey;
   72|  3.37k|    getResourceBundleKey(nsName, compactStyle, compactType, resourceKey, status);
   73|  3.37k|    UErrorCode localStatus = U_ZERO_ERROR;
   74|  3.37k|    ures_getAllItemsWithFallback(rb.getAlias(), resourceKey.data(), sink, localStatus);
  ------------------
  |  | 1658|  3.37k|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|  3.37k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.37k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.37k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|  3.37k|    if (isEmpty && !nsIsLatn) {
  ------------------
  |  Branch (75:9): [True: 24, False: 3.35k]
  |  Branch (75:20): [True: 22, False: 2]
  ------------------
   76|     22|        getResourceBundleKey("latn", compactStyle, compactType, resourceKey, status);
   77|     22|        localStatus = U_ZERO_ERROR;
   78|     22|        ures_getAllItemsWithFallback(rb.getAlias(), resourceKey.data(), sink, localStatus);
  ------------------
  |  | 1658|     22|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|     22|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     22|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     22|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   79|     22|    }
   80|  3.37k|    if (isEmpty && !compactIsShort) {
  ------------------
  |  Branch (80:9): [True: 10, False: 3.36k]
  |  Branch (80:20): [True: 10, False: 0]
  ------------------
   81|     10|        getResourceBundleKey(nsName, CompactStyle::UNUM_SHORT, compactType, resourceKey, status);
   82|     10|        localStatus = U_ZERO_ERROR;
   83|     10|        ures_getAllItemsWithFallback(rb.getAlias(), resourceKey.data(), sink, localStatus);
  ------------------
  |  | 1658|     10|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|     10|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     10|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     10|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   84|     10|    }
   85|  3.37k|    if (isEmpty && !nsIsLatn && !compactIsShort) {
  ------------------
  |  Branch (85:9): [True: 0, False: 3.37k]
  |  Branch (85:20): [True: 0, False: 0]
  |  Branch (85:33): [True: 0, False: 0]
  ------------------
   86|      0|        getResourceBundleKey("latn", CompactStyle::UNUM_SHORT, compactType, resourceKey, status);
   87|      0|        localStatus = U_ZERO_ERROR;
   88|      0|        ures_getAllItemsWithFallback(rb.getAlias(), resourceKey.data(), sink, localStatus);
  ------------------
  |  | 1658|      0|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   89|      0|    }
   90|       |
   91|       |    // The last fallback should be guaranteed to return data.
   92|  3.37k|    if (isEmpty) {
  ------------------
  |  Branch (92:9): [True: 0, False: 3.37k]
  ------------------
   93|      0|        status = U_INTERNAL_PROGRAM_ERROR;
   94|      0|    }
   95|  3.37k|}
_ZNK6icu_786number4impl11CompactData13getMultiplierEi:
   97|  3.41k|int32_t CompactData::getMultiplier(int32_t magnitude) const {
   98|  3.41k|    if (magnitude < 0) {
  ------------------
  |  Branch (98:9): [True: 771, False: 2.64k]
  ------------------
   99|    771|        return 0;
  100|    771|    }
  101|  2.64k|    if (magnitude > largestMagnitude) {
  ------------------
  |  Branch (101:9): [True: 2.00k, False: 642]
  ------------------
  102|  2.00k|        magnitude = largestMagnitude;
  103|  2.00k|    }
  104|  2.64k|    return multipliers[magnitude];
  105|  3.41k|}
_ZNK6icu_786number4impl11CompactData10getPatternEiPKNS_11PluralRulesERKNS1_15DecimalQuantityE:
  110|  3.37k|        const DecimalQuantity &dq) const {
  111|  3.37k|    if (magnitude < 0) {
  ------------------
  |  Branch (111:9): [True: 694, False: 2.68k]
  ------------------
  112|    694|        return nullptr;
  113|    694|    }
  114|  2.68k|    if (magnitude > largestMagnitude) {
  ------------------
  |  Branch (114:9): [True: 1.98k, False: 699]
  ------------------
  115|  1.98k|        magnitude = largestMagnitude;
  116|  1.98k|    }
  117|  2.68k|    const char16_t *patternString = nullptr;
  118|  2.68k|    if (dq.hasIntegerValue()) {
  ------------------
  |  Branch (118:9): [True: 2.23k, False: 450]
  ------------------
  119|  2.23k|        int64_t i = dq.toLong(true);
  120|  2.23k|        if (i == 0) {
  ------------------
  |  Branch (120:13): [True: 808, False: 1.42k]
  ------------------
  121|    808|            patternString = patterns[getIndex(magnitude, StandardPlural::Form::EQ_0)];
  122|  1.42k|        } else if (i == 1) {
  ------------------
  |  Branch (122:20): [True: 46, False: 1.37k]
  ------------------
  123|     46|            patternString = patterns[getIndex(magnitude, StandardPlural::Form::EQ_1)];
  124|     46|        }
  125|  2.23k|        if (patternString != nullptr) {
  ------------------
  |  Branch (125:13): [True: 15, False: 2.21k]
  ------------------
  126|     15|            return patternString;
  127|     15|        }
  128|  2.23k|    }
  129|  2.66k|    StandardPlural::Form plural = utils::getStandardPlural(rules, dq);
  130|  2.66k|    patternString = patterns[getIndex(magnitude, plural)];
  131|  2.66k|    if (patternString == nullptr && plural != StandardPlural::OTHER) {
  ------------------
  |  Branch (131:9): [True: 581, False: 2.08k]
  |  Branch (131:37): [True: 431, False: 150]
  ------------------
  132|       |        // Fall back to "other" plural variant
  133|    431|        patternString = patterns[getIndex(magnitude, StandardPlural::OTHER)];
  134|    431|    }
  135|  2.66k|    if (patternString == USE_FALLBACK) { // == is intended
  ------------------
  |  Branch (135:9): [True: 4, False: 2.66k]
  ------------------
  136|       |        // Return null if USE_FALLBACK is present
  137|      4|        patternString = nullptr;
  138|      4|    }
  139|  2.66k|    return patternString;
  140|  2.68k|}
_ZN6icu_786number4impl11CompactData15CompactDataSink3putEPKcRNS_13ResourceValueEaR10UErrorCode:
  169|  5.72k|                                       UErrorCode &status) {
  170|       |    // traverse into the table of powers of ten
  171|  5.72k|    ResourceTable powersOfTenTable = value.getTable(status);
  172|  5.72k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (172:9): [True: 0, False: 5.72k]
  ------------------
  173|  71.3k|    for (int i3 = 0; powersOfTenTable.getKeyAndValue(i3, key, value); ++i3) {
  ------------------
  |  Branch (173:22): [True: 65.6k, False: 5.72k]
  ------------------
  174|       |
  175|       |        // Assumes that the keys are always of the form "10000" where the magnitude is the
  176|       |        // length of the key minus one.  We only support magnitudes less than COMPACT_MAX_DIGITS;
  177|       |        // ignore entries that have greater magnitude.
  178|  65.6k|        auto magnitude = static_cast<int8_t> (strlen(key) - 1);
  179|  65.6k|        U_ASSERT(magnitude < COMPACT_MAX_DIGITS); // debug assert
  ------------------
  |  |   35|  65.6k|#   define U_ASSERT(exp) (void)0
  ------------------
  180|  65.6k|        if (magnitude >= COMPACT_MAX_DIGITS) { // skip in production
  ------------------
  |  Branch (180:13): [True: 0, False: 65.6k]
  ------------------
  181|      0|            continue;
  182|      0|        }
  183|  65.6k|        int8_t multiplier = data.multipliers[magnitude];
  184|       |
  185|       |        // Iterate over the plural variants ("one", "other", etc)
  186|  65.6k|        ResourceTable pluralVariantsTable = value.getTable(status);
  187|  65.6k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (187:13): [True: 0, False: 65.6k]
  ------------------
  188|   160k|        for (int i4 = 0; pluralVariantsTable.getKeyAndValue(i4, key, value); ++i4) {
  ------------------
  |  Branch (188:26): [True: 94.6k, False: 65.6k]
  ------------------
  189|       |            // Skip this magnitude/plural if we already have it from a child locale.
  190|       |            // Note: This also skips USE_FALLBACK entries.
  191|  94.6k|            StandardPlural::Form plural = StandardPlural::fromString(key, status);
  192|  94.6k|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (192:17): [True: 0, False: 94.6k]
  ------------------
  193|  94.6k|            if (data.patterns[getIndex(magnitude, plural)] != nullptr) {
  ------------------
  |  Branch (193:17): [True: 26.1k, False: 68.5k]
  ------------------
  194|  26.1k|                continue;
  195|  26.1k|            }
  196|       |
  197|       |            // The value "0" means that we need to use the default pattern and not fall back
  198|       |            // to parent locales. Example locale where this is relevant: 'it'.
  199|  68.5k|            int32_t patternLength;
  200|  68.5k|            const char16_t *patternString = value.getString(patternLength, status);
  201|  68.5k|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (201:17): [True: 0, False: 68.5k]
  ------------------
  202|  68.5k|            if (u_strcmp(patternString, u"0") == 0) {
  ------------------
  |  |  387|  68.5k|#define u_strcmp U_ICU_ENTRY_POINT_RENAME(u_strcmp)
  |  |  ------------------
  |  |  |  |  123|  68.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  68.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  68.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (202:17): [True: 362, False: 68.2k]
  ------------------
  203|    362|                patternString = USE_FALLBACK;
  204|    362|                patternLength = 0;
  205|    362|            }
  206|       |
  207|       |            // Save the pattern string. We will parse it lazily.
  208|  68.5k|            data.patterns[getIndex(magnitude, plural)] = patternString;
  209|       |
  210|       |            // If necessary, compute the multiplier: the difference between the magnitude
  211|       |            // and the number of zeros in the pattern.
  212|  68.5k|            if (multiplier == 0) {
  ------------------
  |  Branch (212:17): [True: 40.7k, False: 27.8k]
  ------------------
  213|  40.7k|                int32_t numZeros = countZeros(patternString, patternLength);
  214|  40.7k|                if (numZeros > 0) { // numZeros==0 in certain cases, like Somali "Kun"
  ------------------
  |  Branch (214:21): [True: 40.3k, False: 388]
  ------------------
  215|  40.3k|                    multiplier = static_cast<int8_t> (numZeros - magnitude - 1);
  216|  40.3k|                }
  217|  40.7k|            }
  218|  68.5k|        }
  219|       |
  220|       |        // Save the multiplier.
  221|  65.6k|        if (data.multipliers[magnitude] == 0) {
  ------------------
  |  Branch (221:13): [True: 40.7k, False: 24.9k]
  ------------------
  222|  40.7k|            data.multipliers[magnitude] = multiplier;
  223|  40.7k|            if (magnitude > data.largestMagnitude) {
  ------------------
  |  Branch (223:17): [True: 39.4k, False: 1.23k]
  ------------------
  224|  39.4k|                data.largestMagnitude = magnitude;
  225|  39.4k|            }
  226|  40.7k|            data.isEmpty = false;
  227|  40.7k|        } else {
  228|  24.9k|            U_ASSERT(data.multipliers[magnitude] == multiplier);
  ------------------
  |  |   35|  24.9k|#   define U_ASSERT(exp) (void)0
  ------------------
  229|  24.9k|        }
  230|  65.6k|    }
  231|  5.72k|}
_ZN6icu_786number4impl14CompactHandlerC2E19UNumberCompactStyleRKNS_6LocaleEPKcNS1_11CompactTypeEPKNS_11PluralRulesEPNS1_22MutablePatternModifierEbPKNS1_19MicroPropsGeneratorER10UErrorCode:
  247|  3.37k|        : rules(rules), parent(parent), safe(safe) {
  248|  3.37k|    data.populate(locale, nsName, compactStyle, compactType, status);
  249|  3.37k|    if (safe) {
  ------------------
  |  Branch (249:9): [True: 0, False: 3.37k]
  ------------------
  250|       |        // Safe code path
  251|      0|        precomputeAllModifiers(*buildReference, status);
  252|  3.37k|    } else {
  253|       |        // Unsafe code path
  254|       |        // Store the MutablePatternModifier reference.
  255|  3.37k|        unsafePatternModifier = buildReference;
  256|  3.37k|    }
  257|  3.37k|}
_ZN6icu_786number4impl14CompactHandlerD2Ev:
  259|  3.37k|CompactHandler::~CompactHandler() {
  260|  3.37k|    for (int32_t i = 0; i < precomputedModsLength; i++) {
  ------------------
  |  Branch (260:25): [True: 0, False: 3.37k]
  ------------------
  261|      0|        delete precomputedMods[i].mod;
  262|      0|    }
  263|  3.37k|}
_ZNK6icu_786number4impl14CompactHandler15processQuantityERNS1_15DecimalQuantityERNS1_10MicroPropsER10UErrorCode:
  296|  3.37k|                                     UErrorCode &status) const {
  297|  3.37k|    parent->processQuantity(quantity, micros, status);
  298|  3.37k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (298:9): [True: 0, False: 3.37k]
  ------------------
  299|       |
  300|       |    // Treat zero, NaN, and infinity as if they had magnitude 0
  301|  3.37k|    int32_t magnitude;
  302|  3.37k|    int32_t multiplier = 0;
  303|  3.37k|    if (quantity.isZeroish()) {
  ------------------
  |  Branch (303:9): [True: 72, False: 3.30k]
  ------------------
  304|     72|        magnitude = 0;
  305|     72|        micros.rounder.apply(quantity, status);
  306|  3.30k|    } else {
  307|       |        // TODO: Revisit chooseMultiplierAndApply
  308|  3.30k|        multiplier = micros.rounder.chooseMultiplierAndApply(quantity, data, status);
  309|  3.30k|        magnitude = quantity.isZeroish() ? 0 : quantity.getMagnitude();
  ------------------
  |  Branch (309:21): [True: 29, False: 3.27k]
  ------------------
  310|  3.30k|        magnitude -= multiplier;
  311|  3.30k|    }
  312|       |
  313|  3.37k|    const char16_t *patternString = data.getPattern(magnitude, rules, quantity);
  314|  3.37k|    if (patternString == nullptr) {
  ------------------
  |  Branch (314:9): [True: 922, False: 2.45k]
  ------------------
  315|       |        // Use the default (non-compact) modifier.
  316|       |        // No need to take any action.
  317|  2.45k|    } else if (safe) {
  ------------------
  |  Branch (317:16): [True: 0, False: 2.45k]
  ------------------
  318|       |        // Safe code path.
  319|       |        // Java uses a hash set here for O(1) lookup.  C++ uses a linear search.
  320|       |        // TODO: Benchmark this and maybe change to a binary search or hash table.
  321|      0|        int32_t i = 0;
  322|      0|        for (; i < precomputedModsLength; i++) {
  ------------------
  |  Branch (322:16): [True: 0, False: 0]
  ------------------
  323|      0|            const CompactModInfo &info = precomputedMods[i];
  324|      0|            if (u_strcmp(patternString, info.patternString) == 0) {
  ------------------
  |  |  387|      0|#define u_strcmp U_ICU_ENTRY_POINT_RENAME(u_strcmp)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (324:17): [True: 0, False: 0]
  ------------------
  325|      0|                info.mod->applyToMicros(micros, quantity, status);
  326|      0|                break;
  327|      0|            }
  328|      0|        }
  329|       |        // It should be guaranteed that we found the entry.
  330|      0|        U_ASSERT(i < precomputedModsLength);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  331|  2.45k|    } else {
  332|       |        // Unsafe code path.
  333|       |        // Overwrite the PatternInfo in the existing modMiddle.
  334|       |        // C++ Note: Use unsafePatternInfo for proper lifecycle.
  335|  2.45k|        ParsedPatternInfo &patternInfo = const_cast<CompactHandler *>(this)->unsafePatternInfo;
  336|  2.45k|        PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status);
  337|  2.45k|        unsafePatternModifier->setPatternInfo(
  338|  2.45k|            &unsafePatternInfo,
  339|  2.45k|            {UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD});
  340|  2.45k|        unsafePatternModifier->setNumberProperties(quantity.signum(), StandardPlural::Form::COUNT);
  341|  2.45k|        micros.modMiddle = unsafePatternModifier;
  342|  2.45k|    }
  343|       |
  344|       |    // Change the exponent only after we select appropriate plural form
  345|       |    // for formatting purposes so that we preserve expected formatted
  346|       |    // string behavior.
  347|  3.37k|    quantity.adjustExponent(-1 * multiplier);
  348|       |
  349|       |    // We already performed rounding. Do not perform it again.
  350|  3.37k|    micros.rounder = RoundingImpl::passThrough();
  351|  3.37k|}
number_compact.cpp:_ZN12_GLOBAL__N_120getResourceBundleKeyEPKc19UNumberCompactStyleN6icu_786number4impl11CompactTypeERNS3_10CharStringER10UErrorCode:
   29|  3.40k|                                 CharString &sb, UErrorCode &status) {
   30|  3.40k|    sb.clear();
   31|  3.40k|    sb.append("NumberElements/", status);
   32|  3.40k|    sb.append(nsName, status);
   33|  3.40k|    sb.append(compactStyle == CompactStyle::UNUM_SHORT ? "/patternsShort" : "/patternsLong", status);
  ------------------
  |  Branch (33:15): [True: 3.28k, False: 120]
  ------------------
   34|  3.40k|    sb.append(compactType == CompactType::TYPE_DECIMAL ? "/decimalFormat" : "/currencyFormat", status);
  ------------------
  |  Branch (34:15): [True: 3.40k, False: 0]
  ------------------
   35|  3.40k|}
number_compact.cpp:_ZN12_GLOBAL__N_18getIndexEiN6icu_7814StandardPlural4FormE:
   37|   167k|int32_t getIndex(int32_t magnitude, StandardPlural::Form plural) {
   38|   167k|    return magnitude * StandardPlural::COUNT + plural;
   39|   167k|}
number_compact.cpp:_ZN12_GLOBAL__N_110countZerosEPKDsi:
   41|  40.7k|int32_t countZeros(const char16_t *patternString, int32_t patternLength) {
   42|       |    // NOTE: This strategy for computing the number of zeros is a hack for efficiency.
   43|       |    // It could break if there are any 0s that aren't part of the main pattern.
   44|  40.7k|    int32_t numZeros = 0;
   45|   125k|    for (int32_t i = 0; i < patternLength; i++) {
  ------------------
  |  Branch (45:25): [True: 124k, False: 986]
  ------------------
   46|   124k|        if (patternString[i] == u'0') {
  ------------------
  |  Branch (46:13): [True: 80.9k, False: 43.2k]
  ------------------
   47|  80.9k|            numZeros++;
   48|  80.9k|        } else if (numZeros > 0) {
  ------------------
  |  Branch (48:20): [True: 39.7k, False: 3.50k]
  ------------------
   49|  39.7k|            break; // zeros should always be contiguous
   50|  39.7k|        }
   51|   124k|    }
   52|  40.7k|    return numZeros;
   53|  40.7k|}

_ZN6icu_786number4impl11CompactData15CompactDataSinkC2ERS2_:
   46|  3.37k|        explicit CompactDataSink(CompactData &data) : data(data) {}

_ZN6icu_786number4impl15CurrencySymbolsC2ENS_12CurrencyUnitERKNS_6LocaleER10UErrorCode:
   21|  9.33k|        : fCurrency(currency), fLocaleName(locale.getName(), status) {
   22|  9.33k|    fCurrencySymbol.setToBogus();
   23|  9.33k|    fIntlCurrencySymbol.setToBogus();
   24|  9.33k|}
_ZN6icu_786number4impl15CurrencySymbolsC2ENS_12CurrencyUnitERKNS_6LocaleERKNS_20DecimalFormatSymbolsER10UErrorCode:
   28|  9.33k|        : CurrencySymbols(currency, locale, status) {
   29|       |    // If either of the overrides is present, save it in the local UnicodeString.
   30|  9.33k|    if (symbols.isCustomCurrencySymbol()) {
  ------------------
  |  Branch (30:9): [True: 0, False: 9.33k]
  ------------------
   31|      0|        fCurrencySymbol = symbols.getConstSymbol(DecimalFormatSymbols::kCurrencySymbol);
   32|      0|    }
   33|  9.33k|    if (symbols.isCustomIntlCurrencySymbol()) {
  ------------------
  |  Branch (33:9): [True: 0, False: 9.33k]
  ------------------
   34|      0|        fIntlCurrencySymbol = symbols.getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol);
   35|      0|    }
   36|  9.33k|}

_ZN6icu_786number4impl15CurrencySymbolsC2Ev:
   20|  9.33k|    CurrencySymbols() = default; // default constructor: leaves class in valid but undefined state

_ZN6icu_7813IFixedDecimalD2Ev:
   73|  36.3k|icu::IFixedDecimal::~IFixedDecimal() = default;
_ZN6icu_786number4impl15DecimalQuantityC2Ev:
   75|  34.8k|DecimalQuantity::DecimalQuantity() {
   76|  34.8k|    setBcdToZero();
   77|  34.8k|    flags = 0;
   78|  34.8k|}
_ZN6icu_786number4impl15DecimalQuantityD2Ev:
   80|  36.3k|DecimalQuantity::~DecimalQuantity() {
   81|  36.3k|    if (usingBytes) {
  ------------------
  |  Branch (81:9): [True: 3.69k, False: 32.7k]
  ------------------
   82|  3.69k|        uprv_free(fBCD.bcdBytes.ptr);
  ------------------
  |  | 1503|  3.69k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  3.69k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.69k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.69k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   83|  3.69k|        fBCD.bcdBytes.ptr = nullptr;
   84|  3.69k|        usingBytes = false;
   85|  3.69k|    }
   86|  36.3k|}
_ZN6icu_786number4impl15DecimalQuantityC2ERKS2_:
   88|  1.52k|DecimalQuantity::DecimalQuantity(const DecimalQuantity &other) {
   89|  1.52k|    *this = other;
   90|  1.52k|}
_ZN6icu_786number4impl15DecimalQuantityaSERKS2_:
   96|  1.52k|DecimalQuantity &DecimalQuantity::operator=(const DecimalQuantity &other) {
   97|  1.52k|    if (this == &other) {
  ------------------
  |  Branch (97:9): [True: 0, False: 1.52k]
  ------------------
   98|      0|        return *this;
   99|      0|    }
  100|  1.52k|    copyBcdFrom(other);
  101|  1.52k|    copyFieldsFrom(other);
  102|  1.52k|    return *this;
  103|  1.52k|}
_ZN6icu_786number4impl15DecimalQuantity14copyFieldsFromERKS2_:
  114|  1.52k|void DecimalQuantity::copyFieldsFrom(const DecimalQuantity& other) {
  115|  1.52k|    bogus = other.bogus;
  116|  1.52k|    lReqPos = other.lReqPos;
  117|  1.52k|    rReqPos = other.rReqPos;
  118|  1.52k|    scale = other.scale;
  119|  1.52k|    precision = other.precision;
  120|  1.52k|    flags = other.flags;
  121|  1.52k|    origDouble = other.origDouble;
  122|  1.52k|    origDelta = other.origDelta;
  123|  1.52k|    isApproximate = other.isApproximate;
  124|  1.52k|    exponent = other.exponent;
  125|  1.52k|}
_ZN6icu_786number4impl15DecimalQuantity20increaseMinIntegerToEi:
  143|  9.35k|void DecimalQuantity::increaseMinIntegerTo(int32_t minInt) {
  144|       |    // Validation should happen outside of DecimalQuantity, e.g., in the Precision class.
  145|  9.35k|    U_ASSERT(minInt >= 0);
  ------------------
  |  |   35|  9.35k|#   define U_ASSERT(exp) (void)0
  ------------------
  146|       |
  147|       |    // Special behavior: do not set minInt to be less than what is already set.
  148|       |    // This is so significant digits rounding can set the integer length.
  149|  9.35k|    if (lReqPos < minInt) {
  ------------------
  |  Branch (149:9): [True: 9.34k, False: 17]
  ------------------
  150|  9.34k|        lReqPos = minInt;
  151|  9.34k|    }
  152|  9.35k|}
_ZN6icu_786number4impl15DecimalQuantity14setMinFractionEi:
  154|  10.8k|void DecimalQuantity::setMinFraction(int32_t minFrac) {
  155|       |    // Validation should happen outside of DecimalQuantity, e.g., in the Precision class.
  156|  10.8k|    U_ASSERT(minFrac >= 0);
  ------------------
  |  |   35|  10.8k|#   define U_ASSERT(exp) (void)0
  ------------------
  157|       |
  158|       |    // Save values into internal state
  159|       |    // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE
  160|  10.8k|    rReqPos = -minFrac;
  161|  10.8k|}
_ZN6icu_786number4impl15DecimalQuantity10multiplyByERKNS1_6DecNumER10UErrorCode:
  217|  2.05k|void DecimalQuantity::multiplyBy(const DecNum& multiplicand, UErrorCode& status) {
  218|  2.05k|    if (isZeroish()) {
  ------------------
  |  Branch (218:9): [True: 36, False: 2.02k]
  ------------------
  219|     36|        return;
  220|     36|    }
  221|       |    // Convert to DecNum, multiply, and convert back.
  222|  2.02k|    DecNum decnum;
  223|  2.02k|    toDecNum(decnum, status);
  224|  2.02k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (224:9): [True: 0, False: 2.02k]
  ------------------
  225|  2.02k|    decnum.multiplyBy(multiplicand, status);
  226|  2.02k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (226:9): [True: 507, False: 1.51k]
  ------------------
  227|  1.51k|    setToDecNum(decnum, status);
  228|  1.51k|}
_ZNK6icu_786number4impl15DecimalQuantity12getMagnitudeEv:
  247|  27.1k|int32_t DecimalQuantity::getMagnitude() const {
  248|  27.1k|    U_ASSERT(precision != 0);
  ------------------
  |  |   35|  27.1k|#   define U_ASSERT(exp) (void)0
  ------------------
  249|  27.1k|    return scale + precision - 1;
  250|  27.1k|}
_ZN6icu_786number4impl15DecimalQuantity15adjustMagnitudeEi:
  252|  6.15k|bool DecimalQuantity::adjustMagnitude(int32_t delta) {
  253|  6.15k|    if (precision != 0) {
  ------------------
  |  Branch (253:9): [True: 6.10k, False: 48]
  ------------------
  254|       |        // i.e., scale += delta; origDelta += delta
  255|  6.10k|        bool overflow = uprv_add32_overflow(scale, delta, &scale);
  ------------------
  |  | 1394|  6.10k|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|  6.10k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.10k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.10k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|  6.10k|        overflow = uprv_add32_overflow(origDelta, delta, &origDelta) || overflow;
  ------------------
  |  | 1394|  6.10k|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|  6.10k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.10k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.10k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (256:20): [True: 0, False: 6.10k]
  |  Branch (256:73): [True: 0, False: 6.10k]
  ------------------
  257|       |        // Make sure that precision + scale won't overflow, either
  258|  6.10k|        int32_t dummy;
  259|  6.10k|        overflow = overflow || uprv_add32_overflow(scale, precision, &dummy);
  ------------------
  |  | 1394|  6.10k|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|  6.10k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.10k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.10k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (259:20): [True: 0, False: 6.10k]
  |  Branch (259:32): [True: 0, False: 6.10k]
  ------------------
  260|  6.10k|        return overflow;
  261|  6.10k|    }
  262|     48|    return false;
  263|  6.15k|}
_ZNK6icu_786number4impl15DecimalQuantity16getPluralOperandENS_13PluralOperandE:
  271|  13.2k|double DecimalQuantity::getPluralOperand(PluralOperand operand) const {
  272|       |    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
  273|       |    // See the comment at the top of this file explaining the "isApproximate" field.
  274|  13.2k|    U_ASSERT(!isApproximate);
  ------------------
  |  |   35|  13.2k|#   define U_ASSERT(exp) (void)0
  ------------------
  275|       |
  276|  13.2k|    switch (operand) {
  277|  1.82k|        case PLURAL_OPERAND_I:
  ------------------
  |  Branch (277:9): [True: 1.82k, False: 11.3k]
  ------------------
  278|       |            // Invert the negative sign if necessary
  279|  1.82k|            return static_cast<double>(isNegative() ? -toLong(true) : toLong(true));
  ------------------
  |  Branch (279:40): [True: 619, False: 1.21k]
  ------------------
  280|    882|        case PLURAL_OPERAND_F:
  ------------------
  |  Branch (280:9): [True: 882, False: 12.3k]
  ------------------
  281|    882|            return static_cast<double>(toFractionLong(true));
  282|    368|        case PLURAL_OPERAND_T:
  ------------------
  |  Branch (282:9): [True: 368, False: 12.8k]
  ------------------
  283|    368|            return static_cast<double>(toFractionLong(false));
  284|  1.48k|        case PLURAL_OPERAND_V:
  ------------------
  |  Branch (284:9): [True: 1.48k, False: 11.7k]
  ------------------
  285|  1.48k|            return fractionCount();
  286|      0|        case PLURAL_OPERAND_W:
  ------------------
  |  Branch (286:9): [True: 0, False: 13.2k]
  ------------------
  287|      0|            return fractionCountWithoutTrailingZeros();
  288|    496|        case PLURAL_OPERAND_E:
  ------------------
  |  Branch (288:9): [True: 496, False: 12.7k]
  ------------------
  289|    496|            return static_cast<double>(getExponent());
  290|      0|        case PLURAL_OPERAND_C:
  ------------------
  |  Branch (290:9): [True: 0, False: 13.2k]
  ------------------
  291|       |            // Plural operand `c` is currently an alias for `e`.
  292|      0|            return static_cast<double>(getExponent());
  293|  8.16k|        default:
  ------------------
  |  Branch (293:9): [True: 8.16k, False: 5.05k]
  ------------------
  294|  8.16k|            return std::abs(toDouble());
  295|  13.2k|    }
  296|  13.2k|}
_ZNK6icu_786number4impl15DecimalQuantity11getExponentEv:
  298|    496|int32_t DecimalQuantity::getExponent() const {
  299|    496|    return exponent;
  300|    496|}
_ZN6icu_786number4impl15DecimalQuantity14adjustExponentEi:
  302|  3.55k|void DecimalQuantity::adjustExponent(int delta) {
  303|  3.55k|    exponent = exponent + delta;
  304|  3.55k|}
_ZNK6icu_786number4impl15DecimalQuantity15hasIntegerValueEv:
  311|  2.68k|bool DecimalQuantity::hasIntegerValue() const {
  312|  2.68k|    return scale >= 0;
  313|  2.68k|}
_ZNK6icu_786number4impl15DecimalQuantity24getUpperDisplayMagnitudeEv:
  315|   241M|int32_t DecimalQuantity::getUpperDisplayMagnitude() const {
  316|       |    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
  317|       |    // See the comment in the header file explaining the "isApproximate" field.
  318|   241M|    U_ASSERT(!isApproximate);
  ------------------
  |  |   35|   241M|#   define U_ASSERT(exp) (void)0
  ------------------
  319|       |
  320|   241M|    int32_t magnitude = scale + precision;
  321|   241M|    int32_t result = (lReqPos > magnitude) ? lReqPos : magnitude;
  ------------------
  |  Branch (321:22): [True: 7.06k, False: 241M]
  ------------------
  322|   241M|    return result - 1;
  323|   241M|}
_ZNK6icu_786number4impl15DecimalQuantity24getLowerDisplayMagnitudeEv:
  325|  19.9k|int32_t DecimalQuantity::getLowerDisplayMagnitude() const {
  326|       |    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
  327|       |    // See the comment in the header file explaining the "isApproximate" field.
  328|  19.9k|    U_ASSERT(!isApproximate);
  ------------------
  |  |   35|  19.9k|#   define U_ASSERT(exp) (void)0
  ------------------
  329|       |
  330|  19.9k|    int32_t magnitude = scale;
  331|  19.9k|    int32_t result = (rReqPos < magnitude) ? rReqPos : magnitude;
  ------------------
  |  Branch (331:22): [True: 5.88k, False: 14.0k]
  ------------------
  332|  19.9k|    return result;
  333|  19.9k|}
_ZNK6icu_786number4impl15DecimalQuantity8getDigitEi:
  335|  1.29G|int8_t DecimalQuantity::getDigit(int32_t magnitude) const {
  336|       |    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
  337|       |    // See the comment at the top of this file explaining the "isApproximate" field.
  338|  1.29G|    U_ASSERT(!isApproximate);
  ------------------
  |  |   35|  1.29G|#   define U_ASSERT(exp) (void)0
  ------------------
  339|       |
  340|  1.29G|    return getDigitPos(magnitude - scale);
  341|  1.29G|}
_ZNK6icu_786number4impl15DecimalQuantity13fractionCountEv:
  343|  1.48k|int32_t DecimalQuantity::fractionCount() const {
  344|  1.48k|    int32_t fractionCountWithExponent = -getLowerDisplayMagnitude() - exponent;
  345|  1.48k|    return fractionCountWithExponent > 0 ? fractionCountWithExponent : 0;
  ------------------
  |  Branch (345:12): [True: 760, False: 722]
  ------------------
  346|  1.48k|}
_ZNK6icu_786number4impl15DecimalQuantity10isNegativeEv:
  353|  29.9k|bool DecimalQuantity::isNegative() const {
  354|  29.9k|    return (flags & NEGATIVE_FLAG) != 0;
  355|  29.9k|}
_ZNK6icu_786number4impl15DecimalQuantity6signumEv:
  357|  9.33k|Signum DecimalQuantity::signum() const {
  358|  9.33k|    bool isZero = (isZeroish() && !isInfinite());
  ------------------
  |  Branch (358:20): [True: 2.07k, False: 7.26k]
  |  Branch (358:35): [True: 2.06k, False: 5]
  ------------------
  359|  9.33k|    bool isNeg = isNegative();
  360|  9.33k|    if (isZero && isNeg) {
  ------------------
  |  Branch (360:9): [True: 2.06k, False: 7.26k]
  |  Branch (360:19): [True: 363, False: 1.70k]
  ------------------
  361|    363|        return SIGNUM_NEG_ZERO;
  362|  8.97k|    } else if (isZero) {
  ------------------
  |  Branch (362:16): [True: 1.70k, False: 7.26k]
  ------------------
  363|  1.70k|        return SIGNUM_POS_ZERO;
  364|  7.26k|    } else if (isNeg) {
  ------------------
  |  Branch (364:16): [True: 2.73k, False: 4.52k]
  ------------------
  365|  2.73k|        return SIGNUM_NEG;
  366|  4.52k|    } else {
  367|  4.52k|        return SIGNUM_POS;
  368|  4.52k|    }
  369|  9.33k|}
_ZNK6icu_786number4impl15DecimalQuantity10isInfiniteEv:
  371|  23.9k|bool DecimalQuantity::isInfinite() const {
  372|  23.9k|    return (flags & INFINITY_FLAG) != 0;
  373|  23.9k|}
_ZNK6icu_786number4impl15DecimalQuantity5isNaNEv:
  375|  21.8k|bool DecimalQuantity::isNaN() const {
  376|  21.8k|    return (flags & NAN_FLAG) != 0;
  377|  21.8k|}
_ZNK6icu_786number4impl15DecimalQuantity9isZeroishEv:
  379|  55.7k|bool DecimalQuantity::isZeroish() const {
  380|  55.7k|    return precision == 0;
  381|  55.7k|}
_ZN6icu_786number4impl15DecimalQuantity9setToLongEl:
  408|  4.72k|DecimalQuantity &DecimalQuantity::setToLong(int64_t n) {
  409|  4.72k|    setBcdToZero();
  410|  4.72k|    flags = 0;
  411|  4.72k|    if (n < 0 && n > INT64_MIN) {
  ------------------
  |  Branch (411:9): [True: 1.77k, False: 2.95k]
  |  Branch (411:18): [True: 1.73k, False: 35]
  ------------------
  412|  1.73k|        flags |= NEGATIVE_FLAG;
  413|  1.73k|        n = -n;
  414|  1.73k|    }
  415|  4.72k|    if (n != 0) {
  ------------------
  |  Branch (415:9): [True: 4.63k, False: 88]
  ------------------
  416|  4.63k|        _setToLong(n);
  417|  4.63k|        compact();
  418|  4.63k|    }
  419|  4.72k|    return *this;
  420|  4.72k|}
_ZN6icu_786number4impl15DecimalQuantity10_setToLongEl:
  422|  8.16k|void DecimalQuantity::_setToLong(int64_t n) {
  423|  8.16k|    if (n == INT64_MIN) {
  ------------------
  |  Branch (423:9): [True: 35, False: 8.13k]
  ------------------
  424|     35|        DecNum decnum;
  425|     35|        UErrorCode localStatus = U_ZERO_ERROR;
  426|     35|        decnum.setTo("9.223372036854775808E+18", localStatus);
  427|     35|        if (U_FAILURE(localStatus)) { return; } // unexpected
  ------------------
  |  Branch (427:13): [True: 0, False: 35]
  ------------------
  428|     35|        flags |= NEGATIVE_FLAG;
  429|     35|        readDecNumberToBcd(decnum);
  430|  8.13k|    } else if (n <= INT32_MAX) {
  ------------------
  |  Branch (430:16): [True: 518, False: 7.61k]
  ------------------
  431|    518|        readIntToBcd(static_cast<int32_t>(n));
  432|  7.61k|    } else {
  433|  7.61k|        readLongToBcd(n);
  434|  7.61k|    }
  435|  8.16k|}
_ZN6icu_786number4impl15DecimalQuantity11setToDoubleEd:
  437|  4.72k|DecimalQuantity &DecimalQuantity::setToDouble(double n) {
  438|  4.72k|    setBcdToZero();
  439|  4.72k|    flags = 0;
  440|       |    // signbit() from <math.h> handles +0.0 vs -0.0
  441|  4.72k|    if (std::signbit(n)) {
  ------------------
  |  Branch (441:9): [True: 1.33k, False: 3.38k]
  ------------------
  442|  1.33k|        flags |= NEGATIVE_FLAG;
  443|  1.33k|        n = -n;
  444|  1.33k|    }
  445|  4.72k|    if (std::isnan(n) != 0) {
  ------------------
  |  Branch (445:9): [True: 114, False: 4.61k]
  ------------------
  446|    114|        flags |= NAN_FLAG;
  447|  4.61k|    } else if (std::isfinite(n) == 0) {
  ------------------
  |  Branch (447:16): [True: 5, False: 4.60k]
  ------------------
  448|      5|        flags |= INFINITY_FLAG;
  449|  4.60k|    } else if (n != 0) {
  ------------------
  |  Branch (449:16): [True: 4.57k, False: 28]
  ------------------
  450|  4.57k|        _setToDoubleFast(n);
  451|  4.57k|        compact();
  452|  4.57k|    }
  453|  4.72k|    return *this;
  454|  4.72k|}
_ZN6icu_786number4impl15DecimalQuantity16_setToDoubleFastEd:
  456|  4.57k|void DecimalQuantity::_setToDoubleFast(double n) {
  457|  4.57k|    isApproximate = true;
  458|  4.57k|    origDouble = n;
  459|  4.57k|    origDelta = 0;
  460|       |
  461|       |    // Make sure the double is an IEEE 754 double.  If not, fall back to the slow path right now.
  462|       |    // TODO: Make a fast path for other types of doubles.
  463|  4.57k|    if (!std::numeric_limits<double>::is_iec559) {
  ------------------
  |  Branch (463:9): [Folded - Ignored]
  ------------------
  464|      0|        convertToAccurateDouble();
  465|      0|        return;
  466|      0|    }
  467|       |
  468|       |    // To get the bits from the double, use memcpy, which takes care of endianness.
  469|  4.57k|    uint64_t ieeeBits;
  470|  4.57k|    uprv_memcpy(&ieeeBits, &n, sizeof(n));
  ------------------
  |  |   42|  4.57k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  4.57k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  4.57k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  4.57k|    _Pragma("clang diagnostic push") \
  |  |   45|  4.57k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  4.57k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  4.57k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  4.57k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  4.57k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  4.57k|    _Pragma("clang diagnostic pop") \
  |  |   49|  4.57k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  4.57k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  4.57k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  4.57k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  471|  4.57k|    int32_t exponent = static_cast<int32_t>((ieeeBits & 0x7ff0000000000000L) >> 52) - 0x3ff;
  472|       |
  473|       |    // Not all integers can be represented exactly for exponent > 52
  474|  4.57k|    if (exponent <= 52 && static_cast<int64_t>(n) == n) {
  ------------------
  |  Branch (474:9): [True: 2.85k, False: 1.72k]
  |  Branch (474:27): [True: 63, False: 2.79k]
  ------------------
  475|     63|        _setToLong(static_cast<int64_t>(n));
  476|     63|        return;
  477|     63|    }
  478|       |
  479|  4.51k|    if (exponent == -1023 || exponent == 1024) {
  ------------------
  |  Branch (479:9): [True: 1.04k, False: 3.46k]
  |  Branch (479:30): [True: 0, False: 3.46k]
  ------------------
  480|       |        // The extreme values of exponent are special; use slow path.
  481|  1.04k|        convertToAccurateDouble();
  482|  1.04k|        return;
  483|  1.04k|    }
  484|       |
  485|       |    // 3.3219... is log2(10)
  486|  3.46k|    auto fracLength = static_cast<int32_t> ((52 - exponent) / 3.32192809488736234787031942948939017586);
  487|  3.46k|    if (fracLength >= 0) {
  ------------------
  |  Branch (487:9): [True: 1.81k, False: 1.65k]
  ------------------
  488|  1.81k|        int32_t i = fracLength;
  489|       |        // 1e22 is the largest exact double.
  490|  14.4k|        for (; i >= 22; i -= 22) n *= 1e22;
  ------------------
  |  Branch (490:16): [True: 12.6k, False: 1.81k]
  ------------------
  491|  1.81k|        n *= DOUBLE_MULTIPLIERS[i];
  492|  1.81k|    } else {
  493|  1.65k|        int32_t i = fracLength;
  494|       |        // 1e22 is the largest exact double.
  495|  11.5k|        for (; i <= -22; i += 22) n /= 1e22;
  ------------------
  |  Branch (495:16): [True: 9.86k, False: 1.65k]
  ------------------
  496|  1.65k|        n /= DOUBLE_MULTIPLIERS[-i];
  497|  1.65k|    }
  498|  3.46k|    auto result = static_cast<int64_t>(uprv_round(n));
  ------------------
  |  | 1537|  3.46k|#define uprv_round U_ICU_ENTRY_POINT_RENAME(uprv_round)
  |  |  ------------------
  |  |  |  |  123|  3.46k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.46k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.46k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  499|  3.46k|    if (result != 0) {
  ------------------
  |  Branch (499:9): [True: 3.46k, False: 0]
  ------------------
  500|  3.46k|        _setToLong(result);
  501|  3.46k|        scale -= fracLength;
  502|  3.46k|    }
  503|  3.46k|}
_ZN6icu_786number4impl15DecimalQuantity23convertToAccurateDoubleEv:
  505|  2.97k|void DecimalQuantity::convertToAccurateDouble() {
  506|  2.97k|    U_ASSERT(origDouble != 0);
  ------------------
  |  |   35|  2.97k|#   define U_ASSERT(exp) (void)0
  ------------------
  507|  2.97k|    int32_t delta = origDelta;
  508|       |
  509|       |    // Call the slow oracle function (Double.toString in Java, DoubleToAscii in C++).
  510|  2.97k|    char buffer[DoubleToStringConverter::kBase10MaximalLength + 1];
  511|  2.97k|    bool sign; // unused; always positive
  512|  2.97k|    int32_t length;
  513|  2.97k|    int32_t point;
  514|  2.97k|    DoubleToStringConverter::DoubleToAscii(
  515|  2.97k|        origDouble,
  516|  2.97k|        DoubleToStringConverter::DtoaMode::SHORTEST,
  517|  2.97k|        0,
  518|  2.97k|        buffer,
  519|  2.97k|        sizeof(buffer),
  520|  2.97k|        &sign,
  521|  2.97k|        &length,
  522|  2.97k|        &point
  523|  2.97k|    );
  524|       |
  525|  2.97k|    setBcdToZero();
  526|  2.97k|    readDoubleConversionToBcd(buffer, length, point);
  527|  2.97k|    scale += delta;
  528|  2.97k|    explicitExactDouble = true;
  529|  2.97k|}
_ZN6icu_786number4impl15DecimalQuantity11setToDecNumERKNS1_6DecNumER10UErrorCode:
  543|  1.51k|DecimalQuantity& DecimalQuantity::setToDecNum(const DecNum& decnum, UErrorCode& status) {
  544|  1.51k|    setBcdToZero();
  545|  1.51k|    flags = 0;
  546|       |
  547|  1.51k|    _setToDecNum(decnum, status);
  548|  1.51k|    return *this;
  549|  1.51k|}
_ZN6icu_786number4impl15DecimalQuantity12_setToDecNumERKNS1_6DecNumER10UErrorCode:
  551|  1.51k|void DecimalQuantity::_setToDecNum(const DecNum& decnum, UErrorCode& status) {
  552|  1.51k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (552:9): [True: 0, False: 1.51k]
  ------------------
  553|  1.51k|    if (decnum.isNegative()) {
  ------------------
  |  Branch (553:9): [True: 501, False: 1.01k]
  ------------------
  554|    501|        flags |= NEGATIVE_FLAG;
  555|    501|    }
  556|  1.51k|    if (decnum.isNaN()) {
  ------------------
  |  Branch (556:9): [True: 0, False: 1.51k]
  ------------------
  557|      0|        flags |= NAN_FLAG;
  558|  1.51k|    } else if (decnum.isInfinity()) {
  ------------------
  |  Branch (558:16): [True: 0, False: 1.51k]
  ------------------
  559|      0|        flags |= INFINITY_FLAG;
  560|  1.51k|    } else if (!decnum.isZero()) {
  ------------------
  |  Branch (560:16): [True: 1.42k, False: 91]
  ------------------
  561|  1.42k|        readDecNumberToBcd(decnum);
  562|  1.42k|        compact();
  563|  1.42k|    }
  564|  1.51k|}
_ZNK6icu_786number4impl15DecimalQuantity6toLongEb:
  625|  4.06k|int64_t DecimalQuantity::toLong(bool truncateIfOverflow) const {
  626|       |    // NOTE: Call sites should be guarded by fitsInLong(), like this:
  627|       |    // if (dq.fitsInLong()) { /* use dq.toLong() */ } else { /* use some fallback */ }
  628|       |    // Fallback behavior upon truncateIfOverflow is to truncate at 17 digits.
  629|  4.06k|    uint64_t result = 0L;
  630|  4.06k|    int32_t upperMagnitude = exponent + scale + precision - 1;
  631|  4.06k|    if (truncateIfOverflow) {
  ------------------
  |  Branch (631:9): [True: 4.06k, False: 0]
  ------------------
  632|  4.06k|        upperMagnitude = std::min(upperMagnitude, 17);
  633|  4.06k|    }
  634|  45.3k|    for (int32_t magnitude = upperMagnitude; magnitude >= 0; magnitude--) {
  ------------------
  |  Branch (634:46): [True: 41.2k, False: 4.06k]
  ------------------
  635|  41.2k|        result = result * 10 + getDigitPos(magnitude - scale - exponent);
  636|  41.2k|    }
  637|  4.06k|    if (isNegative()) {
  ------------------
  |  Branch (637:9): [True: 1.54k, False: 2.51k]
  ------------------
  638|  1.54k|        return static_cast<int64_t>(0LL - result); // i.e., -result
  639|  1.54k|    }
  640|  2.51k|    return static_cast<int64_t>(result);
  641|  4.06k|}
_ZNK6icu_786number4impl15DecimalQuantity14toFractionLongEb:
  643|  1.25k|uint64_t DecimalQuantity::toFractionLong(bool includeTrailingZeros) const {
  644|  1.25k|    uint64_t result = 0L;
  645|  1.25k|    int32_t magnitude = -1 - exponent;
  646|  1.25k|    int32_t lowerMagnitude = scale;
  647|  1.25k|    if (includeTrailingZeros) {
  ------------------
  |  Branch (647:9): [True: 882, False: 368]
  ------------------
  648|    882|        lowerMagnitude = std::min(lowerMagnitude, rReqPos);
  649|    882|    }
  650|   290M|    for (; magnitude >= lowerMagnitude && result <= 1e18L; magnitude--) {
  ------------------
  |  Branch (650:12): [True: 290M, False: 1.22k]
  |  Branch (650:43): [True: 290M, False: 30]
  ------------------
  651|   290M|        result = result * 10 + getDigitPos(magnitude - scale);
  652|   290M|    }
  653|       |    // Remove trailing zeros; this can happen during integer overflow cases.
  654|  1.25k|    if (!includeTrailingZeros) {
  ------------------
  |  Branch (654:9): [True: 368, False: 882]
  ------------------
  655|    388|        while (result > 0 && (result % 10) == 0) {
  ------------------
  |  Branch (655:16): [True: 250, False: 138]
  |  Branch (655:30): [True: 20, False: 230]
  ------------------
  656|     20|            result /= 10;
  657|     20|        }
  658|    368|    }
  659|  1.25k|    return result;
  660|  1.25k|}
_ZNK6icu_786number4impl15DecimalQuantity8toDoubleEv:
  694|  8.16k|double DecimalQuantity::toDouble() const {
  695|       |    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
  696|       |    // See the comment in the header file explaining the "isApproximate" field.
  697|  8.16k|    U_ASSERT(!isApproximate);
  ------------------
  |  |   35|  8.16k|#   define U_ASSERT(exp) (void)0
  ------------------
  698|       |
  699|  8.16k|    if (isNaN()) {
  ------------------
  |  Branch (699:9): [True: 0, False: 8.16k]
  ------------------
  700|      0|        return NAN;
  701|  8.16k|    } else if (isInfinite()) {
  ------------------
  |  Branch (701:16): [True: 0, False: 8.16k]
  ------------------
  702|      0|        return isNegative() ? -INFINITY : INFINITY;
  ------------------
  |  Branch (702:16): [True: 0, False: 0]
  ------------------
  703|      0|    }
  704|       |
  705|       |    // We are processing well-formed input, so we don't need any special options to StringToDoubleConverter.
  706|  8.16k|    StringToDoubleConverter converter(0, 0, 0, "", "");
  707|  8.16k|    UnicodeString numberString = this->toScientificString();
  708|  8.16k|    int32_t count;
  709|  8.16k|    return converter.StringToDouble(
  710|  8.16k|            reinterpret_cast<const uint16_t*>(numberString.getBuffer()),
  711|  8.16k|            numberString.length(),
  712|  8.16k|            &count);
  713|  8.16k|}
_ZNK6icu_786number4impl15DecimalQuantity8toDecNumERNS1_6DecNumER10UErrorCode:
  715|  2.02k|DecNum& DecimalQuantity::toDecNum(DecNum& output, UErrorCode& status) const {
  716|       |    // Special handling for zero
  717|  2.02k|    if (precision == 0) {
  ------------------
  |  Branch (717:9): [True: 0, False: 2.02k]
  ------------------
  718|      0|        output.setTo("0", status);
  719|      0|        return output;
  720|      0|    }
  721|       |
  722|       |    // Use the BCD constructor. We need to do a little bit of work to convert, though.
  723|       |    // The decNumber constructor expects most-significant first, but we store least-significant first.
  724|  2.02k|    MaybeStackArray<uint8_t, 20> ubcd(precision, status);
  725|  2.02k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (725:9): [True: 0, False: 2.02k]
  ------------------
  726|      0|        return output;
  727|      0|    }
  728|  32.4k|    for (int32_t m = 0; m < precision; m++) {
  ------------------
  |  Branch (728:25): [True: 30.4k, False: 2.02k]
  ------------------
  729|  30.4k|        ubcd[precision - m - 1] = static_cast<uint8_t>(getDigitPos(m));
  730|  30.4k|    }
  731|  2.02k|    output.setTo(ubcd.getAlias(), precision, scale, isNegative(), status);
  732|  2.02k|    return output;
  733|  2.02k|}
_ZN6icu_786number4impl15DecimalQuantity16roundToMagnitudeEi25UNumberFormatRoundingModeR10UErrorCode:
  747|  10.2k|void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status) {
  748|  10.2k|    roundToMagnitude(magnitude, roundingMode, false, status);
  749|  10.2k|}
_ZN6icu_786number4impl15DecimalQuantity16roundToMagnitudeEi25UNumberFormatRoundingModebR10UErrorCode:
  751|  12.0k|void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, bool nickel, UErrorCode& status) {
  752|       |    // The position in the BCD at which rounding will be performed; digits to the right of position
  753|       |    // will be rounded away.
  754|  12.0k|    int position = safeSubtract(magnitude, scale);
  755|       |
  756|       |    // "trailing" = least significant digit to the left of rounding
  757|  12.0k|    int8_t trailingDigit = getDigitPos(position);
  758|       |
  759|  12.0k|    if (position <= 0 && !isApproximate && (!nickel || trailingDigit == 0 || trailingDigit == 5)) {
  ------------------
  |  Branch (759:9): [True: 7.36k, False: 4.68k]
  |  Branch (759:26): [True: 5.72k, False: 1.64k]
  |  Branch (759:45): [True: 5.72k, False: 0]
  |  Branch (759:56): [True: 0, False: 0]
  |  Branch (759:78): [True: 0, False: 0]
  ------------------
  760|       |        // All digits are to the left of the rounding magnitude.
  761|  6.32k|    } else if (precision == 0) {
  ------------------
  |  Branch (761:16): [True: 0, False: 6.32k]
  ------------------
  762|       |        // No rounding for zero.
  763|  6.32k|    } else {
  764|       |        // Perform rounding logic.
  765|       |        // "leading" = most significant digit to the right of rounding
  766|  6.32k|        int8_t leadingDigit = getDigitPos(safeSubtract(position, 1));
  767|       |
  768|       |        // Compute which section of the number we are in.
  769|       |        // EDGE means we are at the bottom or top edge, like 1.000 or 1.999 (used by doubles)
  770|       |        // LOWER means we are between the bottom edge and the midpoint, like 1.391
  771|       |        // MIDPOINT means we are exactly in the middle, like 1.500
  772|       |        // UPPER means we are between the midpoint and the top edge, like 1.916
  773|  6.32k|        roundingutils::Section section;
  774|  6.32k|        if (!isApproximate) {
  ------------------
  |  Branch (774:13): [True: 3.23k, False: 3.09k]
  ------------------
  775|  3.23k|            if (nickel && trailingDigit != 2 && trailingDigit != 7) {
  ------------------
  |  Branch (775:17): [True: 0, False: 3.23k]
  |  Branch (775:27): [True: 0, False: 0]
  |  Branch (775:49): [True: 0, False: 0]
  ------------------
  776|       |                // Nickel rounding, and not at .02x or .07x
  777|      0|                if (trailingDigit < 2) {
  ------------------
  |  Branch (777:21): [True: 0, False: 0]
  ------------------
  778|       |                    // .00, .01 => down to .00
  779|      0|                    section = roundingutils::SECTION_LOWER;
  780|      0|                } else if (trailingDigit < 5) {
  ------------------
  |  Branch (780:28): [True: 0, False: 0]
  ------------------
  781|       |                    // .03, .04 => up to .05
  782|      0|                    section = roundingutils::SECTION_UPPER;
  783|      0|                } else if (trailingDigit < 7) {
  ------------------
  |  Branch (783:28): [True: 0, False: 0]
  ------------------
  784|       |                    // .05, .06 => down to .05
  785|      0|                    section = roundingutils::SECTION_LOWER;
  786|      0|                } else {
  787|       |                    // .08, .09 => up to .10
  788|      0|                    section = roundingutils::SECTION_UPPER;
  789|      0|                }
  790|  3.23k|            } else if (leadingDigit < 5) {
  ------------------
  |  Branch (790:24): [True: 2.10k, False: 1.12k]
  ------------------
  791|       |                // Includes nickel rounding .020-.024 and .070-.074
  792|  2.10k|                section = roundingutils::SECTION_LOWER;
  793|  2.10k|            } else if (leadingDigit > 5) {
  ------------------
  |  Branch (793:24): [True: 852, False: 276]
  ------------------
  794|       |                // Includes nickel rounding .026-.029 and .076-.079
  795|    852|                section = roundingutils::SECTION_UPPER;
  796|    852|            } else {
  797|       |                // Includes nickel rounding .025 and .075
  798|    276|                section = roundingutils::SECTION_MIDPOINT;
  799|    552|                for (int p = safeSubtract(position, 2); p >= 0; p--) {
  ------------------
  |  Branch (799:57): [True: 519, False: 33]
  ------------------
  800|    519|                    if (getDigitPos(p) != 0) {
  ------------------
  |  Branch (800:25): [True: 243, False: 276]
  ------------------
  801|    243|                        section = roundingutils::SECTION_UPPER;
  802|    243|                        break;
  803|    243|                    }
  804|    519|                }
  805|    276|            }
  806|  3.23k|        } else {
  807|  3.09k|            int32_t p = safeSubtract(position, 2);
  808|  3.09k|            int32_t minP = uprv_max(0, precision - 14);
  ------------------
  |  | 1526|  3.09k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|  3.09k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.09k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.09k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  809|  3.09k|            if (leadingDigit == 0 && (!nickel || trailingDigit == 0 || trailingDigit == 5)) {
  ------------------
  |  Branch (809:17): [True: 2.42k, False: 668]
  |  Branch (809:39): [True: 2.42k, False: 0]
  |  Branch (809:50): [True: 0, False: 0]
  |  Branch (809:72): [True: 0, False: 0]
  ------------------
  810|  2.42k|                section = roundingutils::SECTION_LOWER_EDGE;
  811|  1.19G|                for (; p >= minP; p--) {
  ------------------
  |  Branch (811:24): [True: 1.19G, False: 1.66k]
  ------------------
  812|  1.19G|                    if (getDigitPos(p) != 0) {
  ------------------
  |  Branch (812:25): [True: 769, False: 1.19G]
  ------------------
  813|    769|                        section = roundingutils::SECTION_LOWER;
  814|    769|                        break;
  815|    769|                    }
  816|  1.19G|                }
  817|  2.42k|            } else if (leadingDigit == 4 && (!nickel || trailingDigit == 2 || trailingDigit == 7)) {
  ------------------
  |  Branch (817:24): [True: 107, False: 561]
  |  Branch (817:46): [True: 107, False: 0]
  |  Branch (817:57): [True: 0, False: 0]
  |  Branch (817:79): [True: 0, False: 0]
  ------------------
  818|    107|                section = roundingutils::SECTION_MIDPOINT;
  819|    307|                for (; p >= minP; p--) {
  ------------------
  |  Branch (819:24): [True: 275, False: 32]
  ------------------
  820|    275|                    if (getDigitPos(p) != 9) {
  ------------------
  |  Branch (820:25): [True: 75, False: 200]
  ------------------
  821|     75|                        section = roundingutils::SECTION_LOWER;
  822|     75|                        break;
  823|     75|                    }
  824|    275|                }
  825|    561|            } else if (leadingDigit == 5 && (!nickel || trailingDigit == 2 || trailingDigit == 7)) {
  ------------------
  |  Branch (825:24): [True: 135, False: 426]
  |  Branch (825:46): [True: 135, False: 0]
  |  Branch (825:57): [True: 0, False: 0]
  |  Branch (825:79): [True: 0, False: 0]
  ------------------
  826|    135|                section = roundingutils::SECTION_MIDPOINT;
  827|    386|                for (; p >= minP; p--) {
  ------------------
  |  Branch (827:24): [True: 323, False: 63]
  ------------------
  828|    323|                    if (getDigitPos(p) != 0) {
  ------------------
  |  Branch (828:25): [True: 72, False: 251]
  ------------------
  829|     72|                        section = roundingutils::SECTION_UPPER;
  830|     72|                        break;
  831|     72|                    }
  832|    323|                }
  833|    426|            } else if (leadingDigit == 9 && (!nickel || trailingDigit == 4 || trailingDigit == 9)) {
  ------------------
  |  Branch (833:24): [True: 102, False: 324]
  |  Branch (833:46): [True: 102, False: 0]
  |  Branch (833:57): [True: 0, False: 0]
  |  Branch (833:79): [True: 0, False: 0]
  ------------------
  834|    102|                section = roundingutils::SECTION_UPPER_EDGE;
  835|    230|                for (; p >= minP; p--) {
  ------------------
  |  Branch (835:24): [True: 212, False: 18]
  ------------------
  836|    212|                    if (getDigitPos(p) != 9) {
  ------------------
  |  Branch (836:25): [True: 84, False: 128]
  ------------------
  837|     84|                        section = roundingutils::SECTION_UPPER;
  838|     84|                        break;
  839|     84|                    }
  840|    212|                }
  841|    324|            } else if (nickel && trailingDigit != 2 && trailingDigit != 7) {
  ------------------
  |  Branch (841:24): [True: 0, False: 324]
  |  Branch (841:34): [True: 0, False: 0]
  |  Branch (841:56): [True: 0, False: 0]
  ------------------
  842|       |                // Nickel rounding, and not at .02x or .07x
  843|      0|                if (trailingDigit < 2) {
  ------------------
  |  Branch (843:21): [True: 0, False: 0]
  ------------------
  844|       |                    // .00, .01 => down to .00
  845|      0|                    section = roundingutils::SECTION_LOWER;
  846|      0|                } else if (trailingDigit < 5) {
  ------------------
  |  Branch (846:28): [True: 0, False: 0]
  ------------------
  847|       |                    // .03, .04 => up to .05
  848|      0|                    section = roundingutils::SECTION_UPPER;
  849|      0|                } else if (trailingDigit < 7) {
  ------------------
  |  Branch (849:28): [True: 0, False: 0]
  ------------------
  850|       |                    // .05, .06 => down to .05
  851|      0|                    section = roundingutils::SECTION_LOWER;
  852|      0|                } else {
  853|       |                    // .08, .09 => up to .10
  854|      0|                    section = roundingutils::SECTION_UPPER;
  855|      0|                }
  856|    324|            } else if (leadingDigit < 5) {
  ------------------
  |  Branch (856:24): [True: 129, False: 195]
  ------------------
  857|       |                // Includes nickel rounding .020-.024 and .070-.074
  858|    129|                section = roundingutils::SECTION_LOWER;
  859|    195|            } else {
  860|       |                // Includes nickel rounding .026-.029 and .076-.079
  861|    195|                section = roundingutils::SECTION_UPPER;
  862|    195|            }
  863|       |
  864|  3.09k|            bool roundsAtMidpoint = roundingutils::roundsAtMidpoint(roundingMode);
  865|  3.09k|            if (safeSubtract(position, 1) < precision - 14 ||
  ------------------
  |  Branch (865:17): [True: 1.67k, False: 1.41k]
  ------------------
  866|  3.09k|                (roundsAtMidpoint && section == roundingutils::SECTION_MIDPOINT) ||
  ------------------
  |  Branch (866:18): [True: 1.41k, False: 0]
  |  Branch (866:38): [True: 83, False: 1.33k]
  ------------------
  867|  3.09k|                (!roundsAtMidpoint && section < 0 /* i.e. at upper or lower edge */)) {
  ------------------
  |  Branch (867:18): [True: 0, False: 1.33k]
  |  Branch (867:39): [True: 0, False: 0]
  ------------------
  868|       |                // Oops! This means that we have to get the exact representation of the double,
  869|       |                // because the zone of uncertainty is along the rounding boundary.
  870|  1.76k|                convertToAccurateDouble();
  871|  1.76k|                roundToMagnitude(magnitude, roundingMode, nickel, status); // start over
  872|  1.76k|                return;
  873|  1.76k|            }
  874|       |
  875|       |            // Turn off the approximate double flag, since the value is now confirmed to be exact.
  876|  1.33k|            isApproximate = false;
  877|  1.33k|            origDouble = 0.0;
  878|  1.33k|            origDelta = 0;
  879|       |
  880|  1.33k|            if (position <= 0 && (!nickel || trailingDigit == 0 || trailingDigit == 5)) {
  ------------------
  |  Branch (880:17): [True: 23, False: 1.31k]
  |  Branch (880:35): [True: 23, False: 0]
  |  Branch (880:46): [True: 0, False: 0]
  |  Branch (880:68): [True: 0, False: 0]
  ------------------
  881|       |                // All digits are to the left of the rounding magnitude.
  882|     23|                return;
  883|     23|            }
  884|       |
  885|       |            // Good to continue rounding.
  886|  1.31k|            if (section == -1) { section = roundingutils::SECTION_LOWER; }
  ------------------
  |  Branch (886:17): [True: 10, False: 1.30k]
  ------------------
  887|  1.31k|            if (section == -2) { section = roundingutils::SECTION_UPPER; }
  ------------------
  |  Branch (887:17): [True: 11, False: 1.30k]
  ------------------
  888|  1.31k|        }
  889|       |
  890|       |        // Nickel rounding "half even" goes to the nearest whole (away from the 5).
  891|  4.54k|        bool isEven = nickel
  ------------------
  |  Branch (891:23): [True: 0, False: 4.54k]
  ------------------
  892|  4.54k|                ? (trailingDigit < 2 || trailingDigit > 7
  ------------------
  |  Branch (892:20): [True: 0, False: 0]
  |  Branch (892:41): [True: 0, False: 0]
  ------------------
  893|      0|                        || (trailingDigit == 2 && section != roundingutils::SECTION_UPPER)
  ------------------
  |  Branch (893:29): [True: 0, False: 0]
  |  Branch (893:51): [True: 0, False: 0]
  ------------------
  894|      0|                        || (trailingDigit == 7 && section == roundingutils::SECTION_UPPER))
  ------------------
  |  Branch (894:29): [True: 0, False: 0]
  |  Branch (894:51): [True: 0, False: 0]
  ------------------
  895|  4.54k|                : (trailingDigit % 2) == 0;
  896|       |
  897|  4.54k|        bool roundDown = roundingutils::getRoundingDirection(isEven,
  898|  4.54k|                isNegative(),
  899|  4.54k|                section,
  900|  4.54k|                roundingMode,
  901|  4.54k|                status);
  902|  4.54k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (902:13): [True: 0, False: 4.54k]
  ------------------
  903|      0|            return;
  904|      0|        }
  905|       |
  906|       |        // Perform truncation
  907|  4.54k|        if (position >= precision) {
  ------------------
  |  Branch (907:13): [True: 1.76k, False: 2.77k]
  ------------------
  908|  1.76k|            U_ASSERT(trailingDigit == 0);
  ------------------
  |  |   35|  1.76k|#   define U_ASSERT(exp) (void)0
  ------------------
  909|  1.76k|            setBcdToZero();
  910|  1.76k|            scale = magnitude;
  911|  2.77k|        } else {
  912|  2.77k|            shiftRight(position);
  913|  2.77k|        }
  914|       |
  915|  4.54k|        if (nickel) {
  ------------------
  |  Branch (915:13): [True: 0, False: 4.54k]
  ------------------
  916|      0|            if (trailingDigit < 5 && roundDown) {
  ------------------
  |  Branch (916:17): [True: 0, False: 0]
  |  Branch (916:38): [True: 0, False: 0]
  ------------------
  917|      0|                setDigitPos(0, 0);
  918|      0|                compact();
  919|      0|                return;
  920|      0|            } else if (trailingDigit >= 5 && !roundDown) {
  ------------------
  |  Branch (920:24): [True: 0, False: 0]
  |  Branch (920:46): [True: 0, False: 0]
  ------------------
  921|      0|                setDigitPos(0, 9);
  922|      0|                trailingDigit = 9;
  923|       |                // do not return: use the bubbling logic below
  924|      0|            } else {
  925|      0|                setDigitPos(0, 5);
  926|       |                // If the quantity was set to 0, we may need to restore a digit.
  927|      0|                if (precision == 0) {
  ------------------
  |  Branch (927:21): [True: 0, False: 0]
  ------------------
  928|      0|                    precision = 1;
  929|      0|                }
  930|       |                // compact not necessary: digit at position 0 is nonzero
  931|      0|                return;
  932|      0|            }
  933|      0|        }
  934|       |
  935|       |        // Bubble the result to the higher digits
  936|  4.54k|        if (!roundDown) {
  ------------------
  |  Branch (936:13): [True: 1.45k, False: 3.08k]
  ------------------
  937|  1.45k|            if (trailingDigit == 9) {
  ------------------
  |  Branch (937:17): [True: 383, False: 1.07k]
  ------------------
  938|    383|                int bubblePos = 0;
  939|       |                // Note: in the long implementation, the most digits BCD can have at this point is
  940|       |                // 15, so bubblePos <= 15 and getDigitPos(bubblePos) is safe.
  941|  1.18k|                for (; getDigitPos(bubblePos) == 9; bubblePos++) {}
  ------------------
  |  Branch (941:24): [True: 804, False: 383]
  ------------------
  942|    383|                shiftRight(bubblePos); // shift off the trailing 9s
  943|    383|            }
  944|  1.45k|            int8_t digit0 = getDigitPos(0);
  945|  1.45k|            U_ASSERT(digit0 != 9);
  ------------------
  |  |   35|  1.45k|#   define U_ASSERT(exp) (void)0
  ------------------
  946|  1.45k|            setDigitPos(0, static_cast<int8_t>(digit0 + 1));
  947|  1.45k|            precision += 1; // in case an extra digit got added
  948|  1.45k|        }
  949|       |
  950|  4.54k|        compact();
  951|  4.54k|    }
  952|  12.0k|}
_ZN6icu_786number4impl15DecimalQuantity15roundToInfinityEv:
  954|    520|void DecimalQuantity::roundToInfinity() {
  955|    520|    if (isApproximate) {
  ------------------
  |  Branch (955:9): [True: 163, False: 357]
  ------------------
  956|    163|        convertToAccurateDouble();
  957|    163|    }
  958|    520|}
_ZNK6icu_786number4impl15DecimalQuantity18toScientificStringEv:
 1062|  8.16k|UnicodeString DecimalQuantity::toScientificString() const {
 1063|  8.16k|    U_ASSERT(!isApproximate);
  ------------------
  |  |   35|  8.16k|#   define U_ASSERT(exp) (void)0
  ------------------
 1064|  8.16k|    UnicodeString result;
 1065|  8.16k|    if (isNegative()) {
  ------------------
  |  Branch (1065:9): [True: 3.00k, False: 5.16k]
  ------------------
 1066|  3.00k|        result.append(u'-');
 1067|  3.00k|    }
 1068|  8.16k|    if (precision == 0) {
  ------------------
  |  Branch (1068:9): [True: 242, False: 7.92k]
  ------------------
 1069|    242|        result.append(u"0E+0", -1);
 1070|    242|        return result;
 1071|    242|    }
 1072|  7.92k|    int32_t upperPos = precision - 1;
 1073|  7.92k|    int32_t lowerPos = 0;
 1074|  7.92k|    int32_t p = upperPos;
 1075|  7.92k|    result.append(u'0' + getDigitPos(p));
 1076|  7.92k|    if ((--p) >= lowerPos) {
  ------------------
  |  Branch (1076:9): [True: 7.23k, False: 693]
  ------------------
 1077|  7.23k|        result.append(u'.');
 1078|  91.9k|        for (; p >= lowerPos; p--) {
  ------------------
  |  Branch (1078:16): [True: 84.7k, False: 7.23k]
  ------------------
 1079|  84.7k|            result.append(u'0' + getDigitPos(p));
 1080|  84.7k|        }
 1081|  7.23k|    }
 1082|  7.92k|    result.append(u'E');
 1083|  7.92k|    int32_t _scale = upperPos + scale + exponent;
 1084|  7.92k|    if (_scale == INT32_MIN) {
  ------------------
  |  Branch (1084:9): [True: 0, False: 7.92k]
  ------------------
 1085|      0|        result.append(u"-2147483648");
 1086|      0|        return result;
 1087|  7.92k|    } else if (_scale < 0) {
  ------------------
  |  Branch (1087:16): [True: 1.00k, False: 6.92k]
  ------------------
 1088|  1.00k|        _scale *= -1;
 1089|  1.00k|        result.append(u'-');
 1090|  6.92k|    } else {
 1091|  6.92k|        result.append(u'+');
 1092|  6.92k|    }
 1093|  7.92k|    if (_scale == 0) {
  ------------------
  |  Branch (1093:9): [True: 390, False: 7.53k]
  ------------------
 1094|    390|        result.append(u'0');
 1095|    390|    }
 1096|  7.92k|    int32_t insertIndex = result.length();
 1097|  25.7k|    while (_scale > 0) {
  ------------------
  |  Branch (1097:12): [True: 17.8k, False: 7.92k]
  ------------------
 1098|  17.8k|        std::div_t res = std::div(_scale, 10);
 1099|  17.8k|        result.insert(insertIndex, u'0' + res.rem);
 1100|  17.8k|        _scale = res.quot;
 1101|  17.8k|    }
 1102|  7.92k|    return result;
 1103|  7.92k|}
_ZNK6icu_786number4impl15DecimalQuantity11getDigitPosEi:
 1110|  2.78G|int8_t DecimalQuantity::getDigitPos(int32_t position) const {
 1111|  2.78G|    if (usingBytes) {
  ------------------
  |  Branch (1111:9): [True: 932M, False: 1.84G]
  ------------------
 1112|   932M|        if (position < 0 || position >= precision) { return 0; }
  ------------------
  |  Branch (1112:13): [True: 359M, False: 572M]
  |  Branch (1112:29): [True: 572M, False: 144k]
  ------------------
 1113|   144k|        return fBCD.bcdBytes.ptr[position];
 1114|  1.84G|    } else {
 1115|  1.84G|        if (position < 0 || position >= 16) { return 0; }
  ------------------
  |  Branch (1115:13): [True: 351M, False: 1.49G]
  |  Branch (1115:29): [True: 1.49G, False: 138k]
  ------------------
 1116|   138k|        return static_cast<int8_t>((fBCD.bcdLong >> (position * 4)) & 0xf);
 1117|  1.84G|    }
 1118|  2.78G|}
_ZN6icu_786number4impl15DecimalQuantity11setDigitPosEia:
 1120|  1.45k|void DecimalQuantity::setDigitPos(int32_t position, int8_t value) {
 1121|  1.45k|    U_ASSERT(position >= 0);
  ------------------
  |  |   35|  1.45k|#   define U_ASSERT(exp) (void)0
  ------------------
 1122|  1.45k|    if (usingBytes) {
  ------------------
  |  Branch (1122:9): [True: 656, False: 801]
  ------------------
 1123|    656|        ensureCapacity(position + 1);
 1124|    656|        fBCD.bcdBytes.ptr[position] = value;
 1125|    801|    } else if (position >= 16) {
  ------------------
  |  Branch (1125:16): [True: 0, False: 801]
  ------------------
 1126|      0|        switchStorage();
 1127|      0|        ensureCapacity(position + 1);
 1128|      0|        fBCD.bcdBytes.ptr[position] = value;
 1129|    801|    } else {
 1130|    801|        int shift = position * 4;
 1131|    801|        fBCD.bcdLong = (fBCD.bcdLong & ~(0xfL << shift)) | (static_cast<long>(value) << shift);
 1132|    801|    }
 1133|  1.45k|}
_ZN6icu_786number4impl15DecimalQuantity10shiftRightEi:
 1150|  10.2k|void DecimalQuantity::shiftRight(int32_t numDigits) {
 1151|  10.2k|    if (usingBytes) {
  ------------------
  |  Branch (1151:9): [True: 8.57k, False: 1.70k]
  ------------------
 1152|  8.57k|        int i = 0;
 1153|   131k|        for (; i < precision - numDigits; i++) {
  ------------------
  |  Branch (1153:16): [True: 123k, False: 8.57k]
  ------------------
 1154|   123k|            fBCD.bcdBytes.ptr[i] = fBCD.bcdBytes.ptr[i + numDigits];
 1155|   123k|        }
 1156|  26.1k|        for (; i < precision; i++) {
  ------------------
  |  Branch (1156:16): [True: 17.5k, False: 8.57k]
  ------------------
 1157|  17.5k|            fBCD.bcdBytes.ptr[i] = 0;
 1158|  17.5k|        }
 1159|  8.57k|    } else {
 1160|  1.70k|        fBCD.bcdLong >>= (numDigits * 4);
 1161|  1.70k|    }
 1162|  10.2k|    scale += numDigits;
 1163|  10.2k|    precision -= numDigits;
 1164|  10.2k|}
_ZN6icu_786number4impl15DecimalQuantity12setBcdToZeroEv:
 1179|  53.8k|void DecimalQuantity::setBcdToZero() {
 1180|  53.8k|    if (usingBytes) {
  ------------------
  |  Branch (1180:9): [True: 2.09k, False: 51.7k]
  ------------------
 1181|  2.09k|        uprv_free(fBCD.bcdBytes.ptr);
  ------------------
  |  | 1503|  2.09k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  2.09k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.09k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.09k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1182|  2.09k|        fBCD.bcdBytes.ptr = nullptr;
 1183|  2.09k|        usingBytes = false;
 1184|  2.09k|    }
 1185|  53.8k|    fBCD.bcdLong = 0L;
 1186|  53.8k|    scale = 0;
 1187|  53.8k|    precision = 0;
 1188|  53.8k|    isApproximate = false;
 1189|  53.8k|    origDouble = 0;
 1190|  53.8k|    origDelta = 0;
 1191|  53.8k|    exponent = 0;
 1192|  53.8k|}
_ZN6icu_786number4impl15DecimalQuantity12readIntToBcdEi:
 1194|    518|void DecimalQuantity::readIntToBcd(int32_t n) {
 1195|    518|    U_ASSERT(n != 0);
  ------------------
  |  |   35|    518|#   define U_ASSERT(exp) (void)0
  ------------------
 1196|       |    // ints always fit inside the long implementation.
 1197|    518|    uint64_t result = 0L;
 1198|    518|    int i = 16;
 1199|  3.17k|    for (; n != 0; n /= 10, i--) {
  ------------------
  |  Branch (1199:12): [True: 2.66k, False: 518]
  ------------------
 1200|  2.66k|        result = (result >> 4) + ((static_cast<uint64_t>(n) % 10) << 60);
 1201|  2.66k|    }
 1202|    518|    U_ASSERT(!usingBytes);
  ------------------
  |  |   35|    518|#   define U_ASSERT(exp) (void)0
  ------------------
 1203|    518|    fBCD.bcdLong = result >> (i * 4);
 1204|    518|    scale = 0;
 1205|    518|    precision = 16 - i;
 1206|    518|}
_ZN6icu_786number4impl15DecimalQuantity13readLongToBcdEl:
 1208|  7.61k|void DecimalQuantity::readLongToBcd(int64_t n) {
 1209|  7.61k|    U_ASSERT(n != 0);
  ------------------
  |  |   35|  7.61k|#   define U_ASSERT(exp) (void)0
  ------------------
 1210|  7.61k|    if (n >= 10000000000000000L) {
  ------------------
  |  Branch (1210:9): [True: 4.59k, False: 3.02k]
  ------------------
 1211|  4.59k|        ensureCapacity();
 1212|  4.59k|        int i = 0;
 1213|  87.0k|        for (; n != 0L; n /= 10L, i++) {
  ------------------
  |  Branch (1213:16): [True: 82.4k, False: 4.59k]
  ------------------
 1214|  82.4k|            fBCD.bcdBytes.ptr[i] = static_cast<int8_t>(n % 10);
 1215|  82.4k|        }
 1216|  4.59k|        U_ASSERT(usingBytes);
  ------------------
  |  |   35|  4.59k|#   define U_ASSERT(exp) (void)0
  ------------------
 1217|  4.59k|        scale = 0;
 1218|  4.59k|        precision = i;
 1219|  4.59k|    } else {
 1220|  3.02k|        uint64_t result = 0L;
 1221|  3.02k|        int i = 16;
 1222|  48.6k|        for (; n != 0L; n /= 10L, i--) {
  ------------------
  |  Branch (1222:16): [True: 45.6k, False: 3.02k]
  ------------------
 1223|  45.6k|            result = (result >> 4) + ((n % 10) << 60);
 1224|  45.6k|        }
 1225|  3.02k|        U_ASSERT(i >= 0);
  ------------------
  |  |   35|  3.02k|#   define U_ASSERT(exp) (void)0
  ------------------
 1226|  3.02k|        U_ASSERT(!usingBytes);
  ------------------
  |  |   35|  3.02k|#   define U_ASSERT(exp) (void)0
  ------------------
 1227|  3.02k|        fBCD.bcdLong = result >> (i * 4);
 1228|  3.02k|        scale = 0;
 1229|  3.02k|        precision = 16 - i;
 1230|  3.02k|    }
 1231|  7.61k|}
_ZN6icu_786number4impl15DecimalQuantity18readDecNumberToBcdERKNS1_6DecNumE:
 1233|  1.45k|void DecimalQuantity::readDecNumberToBcd(const DecNum& decnum) {
 1234|  1.45k|    const decNumber* dn = decnum.getRawDecNumber();
 1235|  1.45k|    if (dn->digits > 16) {
  ------------------
  |  Branch (1235:9): [True: 979, False: 480]
  ------------------
 1236|    979|        ensureCapacity(dn->digits);
 1237|  20.9k|        for (int32_t i = 0; i < dn->digits; i++) {
  ------------------
  |  Branch (1237:29): [True: 19.9k, False: 979]
  ------------------
 1238|  19.9k|            fBCD.bcdBytes.ptr[i] = dn->lsu[i];
 1239|  19.9k|        }
 1240|    979|    } else {
 1241|    480|        uint64_t result = 0L;
 1242|  6.20k|        for (int32_t i = 0; i < dn->digits; i++) {
  ------------------
  |  Branch (1242:29): [True: 5.72k, False: 480]
  ------------------
 1243|  5.72k|            result |= static_cast<uint64_t>(dn->lsu[i]) << (4 * i);
 1244|  5.72k|        }
 1245|    480|        fBCD.bcdLong = result;
 1246|    480|    }
 1247|  1.45k|    scale = dn->exponent;
 1248|  1.45k|    precision = dn->digits;
 1249|  1.45k|}
_ZN6icu_786number4impl15DecimalQuantity25readDoubleConversionToBcdEPKcii:
 1252|  2.97k|        const char* buffer, int32_t length, int32_t point) {
 1253|       |    // NOTE: Despite the fact that double-conversion's API is called
 1254|       |    // "DoubleToAscii", they actually use '0' (as opposed to u8'0').
 1255|  2.97k|    if (length > 16) {
  ------------------
  |  Branch (1255:9): [True: 1.22k, False: 1.74k]
  ------------------
 1256|  1.22k|        ensureCapacity(length);
 1257|  22.1k|        for (int32_t i = 0; i < length; i++) {
  ------------------
  |  Branch (1257:29): [True: 20.8k, False: 1.22k]
  ------------------
 1258|  20.8k|            fBCD.bcdBytes.ptr[i] = buffer[length-i-1] - '0';
 1259|  20.8k|        }
 1260|  1.74k|    } else {
 1261|  1.74k|        uint64_t result = 0L;
 1262|  24.1k|        for (int32_t i = 0; i < length; i++) {
  ------------------
  |  Branch (1262:29): [True: 22.3k, False: 1.74k]
  ------------------
 1263|  22.3k|            result |= static_cast<uint64_t>(buffer[length-i-1] - '0') << (4 * i);
 1264|  22.3k|        }
 1265|  1.74k|        fBCD.bcdLong = result;
 1266|  1.74k|    }
 1267|  2.97k|    scale = point - length;
 1268|  2.97k|    precision = length;
 1269|  2.97k|}
_ZN6icu_786number4impl15DecimalQuantity7compactEv:
 1271|  15.1k|void DecimalQuantity::compact() {
 1272|  15.1k|    if (usingBytes) {
  ------------------
  |  Branch (1272:9): [True: 7.11k, False: 8.06k]
  ------------------
 1273|  7.11k|        int32_t delta = 0;
 1274|  8.56k|        for (; delta < precision && fBCD.bcdBytes.ptr[delta] == 0; delta++);
  ------------------
  |  Branch (1274:16): [True: 8.56k, False: 0]
  |  Branch (1274:37): [True: 1.44k, False: 7.11k]
  ------------------
 1275|  7.11k|        if (delta == precision) {
  ------------------
  |  Branch (1275:13): [True: 0, False: 7.11k]
  ------------------
 1276|       |            // Number is zero
 1277|      0|            setBcdToZero();
 1278|      0|            return;
 1279|  7.11k|        } else {
 1280|       |            // Remove trailing zeros
 1281|  7.11k|            shiftRight(delta);
 1282|  7.11k|        }
 1283|       |
 1284|       |        // Compute precision
 1285|  7.11k|        int32_t leading = precision - 1;
 1286|  7.75k|        for (; leading >= 0 && fBCD.bcdBytes.ptr[leading] == 0; leading--);
  ------------------
  |  Branch (1286:16): [True: 7.75k, False: 0]
  |  Branch (1286:32): [True: 638, False: 7.11k]
  ------------------
 1287|  7.11k|        precision = leading + 1;
 1288|       |
 1289|       |        // Switch storage mechanism if possible
 1290|  7.11k|        if (precision <= 16) {
  ------------------
  |  Branch (1290:13): [True: 1.79k, False: 5.32k]
  ------------------
 1291|  1.79k|            switchStorage();
 1292|  1.79k|        }
 1293|       |
 1294|  8.06k|    } else {
 1295|  8.06k|        if (fBCD.bcdLong == 0L) {
  ------------------
  |  Branch (1295:13): [True: 1.76k, False: 6.29k]
  ------------------
 1296|       |            // Number is zero
 1297|  1.76k|            setBcdToZero();
 1298|  1.76k|            return;
 1299|  1.76k|        }
 1300|       |
 1301|       |        // Compact the number (remove trailing zeros)
 1302|       |        // TODO: Use a more efficient algorithm here and below. There is a logarithmic one.
 1303|  6.29k|        int32_t delta = 0;
 1304|  8.14k|        for (; delta < precision && getDigitPos(delta) == 0; delta++);
  ------------------
  |  Branch (1304:16): [True: 8.14k, False: 0]
  |  Branch (1304:37): [True: 1.84k, False: 6.29k]
  ------------------
 1305|  6.29k|        fBCD.bcdLong >>= delta * 4;
 1306|  6.29k|        scale += delta;
 1307|       |
 1308|       |        // Compute precision
 1309|  6.29k|        int32_t leading = precision - 1;
 1310|  8.81k|        for (; leading >= 0 && getDigitPos(leading) == 0; leading--);
  ------------------
  |  Branch (1310:16): [True: 8.81k, False: 0]
  |  Branch (1310:32): [True: 2.51k, False: 6.29k]
  ------------------
 1311|  6.29k|        precision = leading + 1;
 1312|  6.29k|    }
 1313|  15.1k|}
_ZN6icu_786number4impl15DecimalQuantity14ensureCapacityEv:
 1315|  4.59k|void DecimalQuantity::ensureCapacity() {
 1316|  4.59k|    ensureCapacity(40);
 1317|  4.59k|}
_ZN6icu_786number4impl15DecimalQuantity14ensureCapacityEi:
 1319|  8.23k|void DecimalQuantity::ensureCapacity(int32_t capacity) {
 1320|  8.23k|    if (capacity == 0) { return; }
  ------------------
  |  Branch (1320:9): [True: 0, False: 8.23k]
  ------------------
 1321|  8.23k|    int32_t oldCapacity = usingBytes ? fBCD.bcdBytes.len : 0;
  ------------------
  |  Branch (1321:27): [True: 656, False: 7.57k]
  ------------------
 1322|  8.23k|    if (!usingBytes) {
  ------------------
  |  Branch (1322:9): [True: 7.57k, False: 656]
  ------------------
 1323|       |        // TODO: There is nothing being done to check for memory allocation failures.
 1324|       |        // TODO: Consider indexing by nybbles instead of bytes in C++, so that we can
 1325|       |        // make these arrays half the size.
 1326|  7.57k|        fBCD.bcdBytes.ptr = static_cast<int8_t*>(uprv_malloc(capacity * sizeof(int8_t)));
  ------------------
  |  | 1524|  7.57k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  7.57k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.57k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.57k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1327|  7.57k|        fBCD.bcdBytes.len = capacity;
 1328|       |        // Initialize the byte array to zeros (this is done automatically in Java)
 1329|  7.57k|        uprv_memset(fBCD.bcdBytes.ptr, 0, capacity * sizeof(int8_t));
  ------------------
  |  |  100|  7.57k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  7.57k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1330|  7.57k|    } else if (oldCapacity < capacity) {
  ------------------
  |  Branch (1330:16): [True: 0, False: 656]
  ------------------
 1331|      0|        auto* bcd1 = static_cast<int8_t*>(uprv_malloc(capacity * 2 * sizeof(int8_t)));
  ------------------
  |  | 1524|      0|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1332|      0|        uprv_memcpy(bcd1, fBCD.bcdBytes.ptr, oldCapacity * sizeof(int8_t));
  ------------------
  |  |   42|      0|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      0|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      0|    _Pragma("clang diagnostic push") \
  |  |   45|      0|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      0|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      0|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      0|    _Pragma("clang diagnostic pop") \
  |  |   49|      0|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1333|       |        // Initialize the rest of the byte array to zeros (this is done automatically in Java)
 1334|      0|        uprv_memset(bcd1 + oldCapacity, 0, (capacity - oldCapacity) * sizeof(int8_t));
  ------------------
  |  |  100|      0|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1335|      0|        uprv_free(fBCD.bcdBytes.ptr);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1336|      0|        fBCD.bcdBytes.ptr = bcd1;
 1337|      0|        fBCD.bcdBytes.len = capacity * 2;
 1338|      0|    }
 1339|  8.23k|    usingBytes = true;
 1340|  8.23k|}
_ZN6icu_786number4impl15DecimalQuantity13switchStorageEv:
 1342|  1.79k|void DecimalQuantity::switchStorage() {
 1343|  1.79k|    if (usingBytes) {
  ------------------
  |  Branch (1343:9): [True: 1.79k, False: 0]
  ------------------
 1344|       |        // Change from bytes to long
 1345|  1.79k|        uint64_t bcdLong = 0L;
 1346|  17.2k|        for (int i = precision - 1; i >= 0; i--) {
  ------------------
  |  Branch (1346:37): [True: 15.4k, False: 1.79k]
  ------------------
 1347|  15.4k|            bcdLong <<= 4;
 1348|  15.4k|            bcdLong |= fBCD.bcdBytes.ptr[i];
 1349|  15.4k|        }
 1350|  1.79k|        uprv_free(fBCD.bcdBytes.ptr);
  ------------------
  |  | 1503|  1.79k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  1.79k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.79k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.79k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1351|  1.79k|        fBCD.bcdBytes.ptr = nullptr;
 1352|  1.79k|        fBCD.bcdLong = bcdLong;
 1353|  1.79k|        usingBytes = false;
 1354|  1.79k|    } else {
 1355|       |        // Change from long to bytes
 1356|       |        // Copy the long into a local variable since it will get munged when we allocate the bytes
 1357|      0|        uint64_t bcdLong = fBCD.bcdLong;
 1358|      0|        ensureCapacity();
 1359|      0|        for (int i = 0; i < precision; i++) {
  ------------------
  |  Branch (1359:25): [True: 0, False: 0]
  ------------------
 1360|      0|            fBCD.bcdBytes.ptr[i] = static_cast<int8_t>(bcdLong & 0xf);
 1361|      0|            bcdLong >>= 4;
 1362|      0|        }
 1363|      0|        U_ASSERT(usingBytes);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1364|      0|    }
 1365|  1.79k|}
_ZN6icu_786number4impl15DecimalQuantity11copyBcdFromERKS2_:
 1367|  1.52k|void DecimalQuantity::copyBcdFrom(const DecimalQuantity &other) {
 1368|  1.52k|    setBcdToZero();
 1369|  1.52k|    if (other.usingBytes) {
  ------------------
  |  Branch (1369:9): [True: 777, False: 747]
  ------------------
 1370|    777|        ensureCapacity(other.precision);
 1371|    777|        uprv_memcpy(fBCD.bcdBytes.ptr, other.fBCD.bcdBytes.ptr, other.precision * sizeof(int8_t));
  ------------------
  |  |   42|    777|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    777|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|    777|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|    777|    _Pragma("clang diagnostic push") \
  |  |   45|    777|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|    777|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|    777|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|    777|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|    777|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|    777|    _Pragma("clang diagnostic pop") \
  |  |   49|    777|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|    777|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|    777|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    777|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1372|    777|    } else {
 1373|    747|        fBCD.bcdLong = other.fBCD.bcdLong;
 1374|    747|    }
 1375|  1.52k|}
number_decimalquantity.cpp:_ZN12_GLOBAL__N_112safeSubtractEii:
   39|  24.8k|inline int32_t safeSubtract(int32_t a, int32_t b) {
   40|       |    // Note: In C++, signed integer subtraction is undefined behavior.
   41|  24.8k|    int32_t diff = static_cast<int32_t>(static_cast<uint32_t>(a) - static_cast<uint32_t>(b));
   42|  24.8k|    if (b < 0 && diff < a) { return INT32_MAX; }
  ------------------
  |  Branch (42:9): [True: 5.13k, False: 19.7k]
  |  Branch (42:18): [True: 0, False: 5.13k]
  ------------------
   43|  24.8k|    if (b > 0 && diff > a) { return INT32_MIN; }
  ------------------
  |  Branch (43:9): [True: 16.5k, False: 8.26k]
  |  Branch (43:18): [True: 105, False: 16.4k]
  ------------------
   44|  24.7k|    return diff;
   45|  24.8k|}

_ZNK6icu_786number4impl6DecNum15getRawDecNumberEv:
   74|  3.95k|    inline const decNumber* getRawDecNumber() const {
   75|  3.95k|        return fData.getAlias();
   76|  3.95k|    }

_ZNO6icu_786number23NumberFormatterSettingsINS0_26UnlocalizedNumberFormatterEE6macrosERKNS0_4impl10MacroPropsE:
  369|  3.80k|Derived NumberFormatterSettings<Derived>::macros(const impl::MacroProps& macros)&& {
  370|  3.80k|    Derived move(std::move(*this));
  371|  3.80k|    move.fMacros = macros;
  372|  3.80k|    return move;
  373|  3.80k|}
_ZN6icu_786number15NumberFormatter4withEv:
  409|  3.80k|UnlocalizedNumberFormatter NumberFormatter::with() {
  410|  3.80k|    UnlocalizedNumberFormatter result;
  411|  3.80k|    return result;
  412|  3.80k|}
_ZN6icu_786number26UnlocalizedNumberFormatterC2EONS0_23NumberFormatterSettingsIS1_EE:
  446|  3.80k|        : NFS<UNF>(std::move(src)) {
  447|       |    // No additional fields to assign
  448|  3.80k|}
_ZN6icu_786number24LocalizedNumberFormatterD2Ev:
  551|  4.72k|LocalizedNumberFormatter::~LocalizedNumberFormatter() {
  552|  4.72k|    delete fCompiled;
  553|  4.72k|    delete fWarehouse;
  554|  4.72k|}
_ZN6icu_786number24LocalizedNumberFormatterC2ERKNS0_4impl10MacroPropsERKNS_6LocaleE:
  556|  4.72k|LocalizedNumberFormatter::LocalizedNumberFormatter(const MacroProps& macros, const Locale& locale) {
  557|  4.72k|    fMacros = macros;
  558|  4.72k|    fMacros.locale = locale;
  559|  4.72k|}
_ZNKR6icu_786number26UnlocalizedNumberFormatter6localeERKNS_6LocaleE:
  566|  4.72k|LocalizedNumberFormatter UnlocalizedNumberFormatter::locale(const Locale& locale) const& {
  567|  4.72k|    return LocalizedNumberFormatter(fMacros, locale);
  568|  4.72k|}
_ZNK6icu_786number24LocalizedNumberFormatter9formatIntElR10UErrorCode:
  574|  4.72k|FormattedNumber LocalizedNumberFormatter::formatInt(int64_t value, UErrorCode& status) const {
  575|  4.72k|    if (U_FAILURE(status)) { return FormattedNumber(U_ILLEGAL_ARGUMENT_ERROR); }
  ------------------
  |  Branch (575:9): [True: 0, False: 4.72k]
  ------------------
  576|  4.72k|    auto* results = new UFormattedNumberData();
  577|  4.72k|    if (results == nullptr) {
  ------------------
  |  Branch (577:9): [True: 0, False: 4.72k]
  ------------------
  578|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  579|      0|        return FormattedNumber(status);
  580|      0|    }
  581|  4.72k|    results->quantity.setToLong(value);
  582|  4.72k|    formatImpl(results, status);
  583|       |
  584|       |    // Do not save the results object if we encountered a failure.
  585|  4.72k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (585:9): [True: 4.66k, False: 58]
  ------------------
  586|  4.66k|        return FormattedNumber(results);
  587|  4.66k|    } else {
  588|     58|        delete results;
  589|     58|        return FormattedNumber(status);
  590|     58|    }
  591|  4.72k|}
_ZNK6icu_786number24LocalizedNumberFormatter12formatDoubleEdR10UErrorCode:
  593|  4.72k|FormattedNumber LocalizedNumberFormatter::formatDouble(double value, UErrorCode& status) const {
  594|  4.72k|    if (U_FAILURE(status)) { return FormattedNumber(U_ILLEGAL_ARGUMENT_ERROR); }
  ------------------
  |  Branch (594:9): [True: 0, False: 4.72k]
  ------------------
  595|  4.72k|    auto* results = new UFormattedNumberData();
  596|  4.72k|    if (results == nullptr) {
  ------------------
  |  Branch (596:9): [True: 0, False: 4.72k]
  ------------------
  597|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  598|      0|        return FormattedNumber(status);
  599|      0|    }
  600|  4.72k|    results->quantity.setToDouble(value);
  601|  4.72k|    formatImpl(results, status);
  602|       |
  603|       |    // Do not save the results object if we encountered a failure.
  604|  4.72k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (604:9): [True: 4.66k, False: 58]
  ------------------
  605|  4.66k|        return FormattedNumber(results);
  606|  4.66k|    } else {
  607|     58|        delete results;
  608|     58|        return FormattedNumber(status);
  609|     58|    }
  610|  4.72k|}
_ZNK6icu_786number24LocalizedNumberFormatter10formatImplEPNS0_4impl20UFormattedNumberDataER10UErrorCode:
  651|  9.45k|void LocalizedNumberFormatter::formatImpl(impl::UFormattedNumberData* results, UErrorCode& status) const {
  652|  9.45k|    if (computeCompiled(status)) {
  ------------------
  |  Branch (652:9): [True: 0, False: 9.45k]
  ------------------
  653|      0|        fCompiled->format(results, status);
  654|  9.45k|    } else {
  655|  9.45k|        NumberFormatterImpl::formatStatic(fMacros, results, status);
  656|  9.45k|    }
  657|  9.45k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (657:9): [True: 116, False: 9.33k]
  ------------------
  658|    116|        return;
  659|    116|    }
  660|  9.33k|    results->getStringRef().writeTerminator(status);
  661|  9.33k|}
_ZNK6icu_786number24LocalizedNumberFormatter15computeCompiledER10UErrorCode:
  683|  9.45k|bool LocalizedNumberFormatter::computeCompiled(UErrorCode& status) const {
  684|       |    // fUnsafeCallCount contains memory to be interpreted as an atomic int, most commonly
  685|       |    // std::atomic<int32_t>.  Since the type of atomic int is platform-dependent, we cast the
  686|       |    // bytes in fUnsafeCallCount to u_atomic_int32_t, a typedef for the platform-dependent
  687|       |    // atomic int type defined in umutex.h.
  688|  9.45k|    static_assert(
  689|  9.45k|            sizeof(u_atomic_int32_t) <= sizeof(fUnsafeCallCount),
  690|  9.45k|            "Atomic integer size on this platform exceeds the size allocated by fUnsafeCallCount");
  691|  9.45k|    auto* callCount = reinterpret_cast<u_atomic_int32_t*>(
  692|  9.45k|            const_cast<LocalizedNumberFormatter*>(this)->fUnsafeCallCount);
  693|       |
  694|       |    // A positive value in the atomic int indicates that the data structure is not yet ready;
  695|       |    // a negative value indicates that it is ready. If, after the increment, the atomic int
  696|       |    // is exactly threshold, then it is the current thread's job to build the data structure.
  697|       |    // Note: We set the callCount to INT32_MIN so that if another thread proceeds to increment
  698|       |    // the atomic int, the value remains below zero.
  699|  9.45k|    int32_t currentCount = umtx_loadAcquire(*callCount);
  700|  9.45k|    if (0 <= currentCount && currentCount <= fMacros.threshold && fMacros.threshold > 0) {
  ------------------
  |  Branch (700:9): [True: 9.45k, False: 0]
  |  Branch (700:30): [True: 9.45k, False: 0]
  |  Branch (700:67): [True: 9.45k, False: 0]
  ------------------
  701|  9.45k|        currentCount = umtx_atomic_inc(callCount);
  702|  9.45k|    }
  703|       |
  704|  9.45k|    if (currentCount == fMacros.threshold && fMacros.threshold > 0) {
  ------------------
  |  Branch (704:9): [True: 0, False: 9.45k]
  |  Branch (704:46): [True: 0, False: 0]
  ------------------
  705|       |        // Build the data structure and then use it (slow to fast path).
  706|      0|        const NumberFormatterImpl* compiled = new NumberFormatterImpl(fMacros, status);
  707|      0|        if (compiled == nullptr) {
  ------------------
  |  Branch (707:13): [True: 0, False: 0]
  ------------------
  708|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  709|      0|            return false;
  710|      0|        }
  711|      0|        U_ASSERT(fCompiled == nullptr);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  712|      0|        const_cast<LocalizedNumberFormatter*>(this)->fCompiled = compiled;
  713|      0|        umtx_storeRelease(*callCount, INT32_MIN);
  714|      0|        return true;
  715|  9.45k|    } else if (currentCount < 0) {
  ------------------
  |  Branch (715:16): [True: 0, False: 9.45k]
  ------------------
  716|       |        // The data structure is already built; use it (fast path).
  717|      0|        U_ASSERT(fCompiled != nullptr);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  718|      0|        return true;
  719|  9.45k|    } else {
  720|       |        // Format the number without building the data structure (slow path).
  721|  9.45k|        return false;
  722|  9.45k|    }
  723|  9.45k|}

_ZN6icu_786number4impl19NumberFormatterImpl12formatStaticERKNS1_10MacroPropsEPNS1_20UFormattedNumberDataER10UErrorCode:
   33|  9.45k|                                          UErrorCode &status) {
   34|  9.45k|    DecimalQuantity &inValue = results->quantity;
   35|  9.45k|    FormattedStringBuilder &outString = results->getStringRef();
   36|  9.45k|    NumberFormatterImpl impl(macros, false, status);
   37|  9.45k|    MicroProps& micros = impl.preProcessUnsafe(inValue, status);
   38|  9.45k|    if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (38:9): [True: 116, False: 9.33k]
  ------------------
   39|  9.33k|    int32_t length = writeNumber(micros.simple, inValue, outString, 0, status);
   40|  9.33k|    length += writeAffixes(micros, outString, 0, length, status);
   41|  9.33k|    results->outputUnit = std::move(micros.outputUnit);
   42|  9.33k|    results->gender = micros.gender;
   43|  9.33k|    return length;
   44|  9.45k|}
_ZN6icu_786number4impl19NumberFormatterImpl16preProcessUnsafeERNS1_15DecimalQuantityER10UErrorCode:
   82|  9.45k|MicroProps& NumberFormatterImpl::preProcessUnsafe(DecimalQuantity& inValue, UErrorCode& status) {
   83|  9.45k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (83:9): [True: 116, False: 9.33k]
  ------------------
   84|    116|        return fMicros; // must always return a value
   85|    116|    }
   86|  9.33k|    if (fMicroPropsGenerator == nullptr) {
  ------------------
  |  Branch (86:9): [True: 0, False: 9.33k]
  ------------------
   87|      0|        status = U_INTERNAL_PROGRAM_ERROR;
   88|      0|        return fMicros; // must always return a value
   89|      0|    }
   90|  9.33k|    fMicroPropsGenerator->processQuantity(inValue, fMicros, status);
   91|  9.33k|    fMicros.integerWidth.apply(inValue, status);
   92|  9.33k|    return fMicros;
   93|  9.33k|}
_ZN6icu_786number4impl19NumberFormatterImplC2ERKNS1_10MacroPropsEbR10UErrorCode:
  117|  9.45k|NumberFormatterImpl::NumberFormatterImpl(const MacroProps& macros, bool safe, UErrorCode& status) {
  118|  9.45k|    fMicroPropsGenerator = macrosToMicroGenerator(macros, safe, status);
  119|  9.45k|}
_ZN6icu_786number4impl19NumberFormatterImpl22macrosToMicroGeneratorERKNS1_10MacroPropsEbR10UErrorCode:
  124|  9.45k|NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, UErrorCode& status) {
  125|  9.45k|    if (U_FAILURE(status)) { return nullptr; }
  ------------------
  |  Branch (125:9): [True: 0, False: 9.45k]
  ------------------
  126|  9.45k|    const MicroPropsGenerator* chain = &fMicros;
  127|       |
  128|       |    // Check that macros is error-free before continuing.
  129|  9.45k|    if (macros.copyErrorTo(status)) {
  ------------------
  |  Branch (129:9): [True: 116, False: 9.33k]
  ------------------
  130|    116|        return nullptr;
  131|    116|    }
  132|       |
  133|       |    // TODO: Accept currency symbols from DecimalFormatSymbols?
  134|       |
  135|       |    // Pre-compute a few values for efficiency.
  136|  9.33k|    bool isCurrency = utils::unitIsCurrency(macros.unit);
  137|  9.33k|    bool isBaseUnit = utils::unitIsBaseUnit(macros.unit);
  138|  9.33k|    bool isPercent = utils::unitIsPercent(macros.unit);
  139|  9.33k|    bool isPermille = utils::unitIsPermille(macros.unit);
  140|  9.33k|    bool isCompactNotation = macros.notation.fType == Notation::NTN_COMPACT;
  141|  9.33k|    bool isAccounting =
  142|  9.33k|            macros.sign == UNUM_SIGN_ACCOUNTING ||
  ------------------
  |  Branch (142:13): [True: 2, False: 9.33k]
  ------------------
  143|  9.33k|            macros.sign == UNUM_SIGN_ACCOUNTING_ALWAYS ||
  ------------------
  |  Branch (143:13): [True: 2, False: 9.33k]
  ------------------
  144|  9.33k|            macros.sign == UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO ||
  ------------------
  |  Branch (144:13): [True: 2, False: 9.32k]
  ------------------
  145|  9.33k|            macros.sign == UNUM_SIGN_ACCOUNTING_NEGATIVE;
  ------------------
  |  Branch (145:13): [True: 2, False: 9.32k]
  ------------------
  146|  9.33k|    CurrencyUnit currency(u"", status);
  147|  9.33k|    if (isCurrency) {
  ------------------
  |  Branch (147:9): [True: 0, False: 9.33k]
  ------------------
  148|      0|        currency = CurrencyUnit(macros.unit, status); // Restore CurrencyUnit from MeasureUnit
  149|      0|    }
  150|  9.33k|    UNumberUnitWidth unitWidth = UNUM_UNIT_WIDTH_SHORT;
  151|  9.33k|    if (macros.unitWidth != UNUM_UNIT_WIDTH_COUNT) {
  ------------------
  |  Branch (151:9): [True: 0, False: 9.33k]
  ------------------
  152|      0|        unitWidth = macros.unitWidth;
  153|      0|    }
  154|       |    // Use CLDR unit data for all MeasureUnits (not currency and not
  155|       |    // no-unit), except use the dedicated percent pattern for percent and
  156|       |    // permille. However, use the CLDR unit data for percent/permille if a
  157|       |    // long name was requested OR if compact notation is being used, since
  158|       |    // compact notation overrides the middle modifier (micros.modMiddle)
  159|       |    // normally used for the percent pattern.
  160|  9.33k|    bool isCldrUnit = !isCurrency
  ------------------
  |  Branch (160:23): [True: 9.33k, False: 0]
  ------------------
  161|  9.33k|        && !isBaseUnit
  ------------------
  |  Branch (161:12): [True: 1.61k, False: 7.72k]
  ------------------
  162|  9.33k|        && (unitWidth == UNUM_UNIT_WIDTH_FULL_NAME
  ------------------
  |  Branch (162:13): [True: 0, False: 1.61k]
  ------------------
  163|  1.61k|            || !(isPercent || isPermille)
  ------------------
  |  Branch (163:18): [True: 1.61k, False: 0]
  |  Branch (163:31): [True: 0, False: 0]
  ------------------
  164|  1.61k|            || isCompactNotation
  ------------------
  |  Branch (164:16): [True: 1.52k, False: 86]
  ------------------
  165|  1.61k|        );
  166|  9.33k|    bool isMixedUnit = isCldrUnit && (uprv_strcmp(macros.unit.getType(), "") == 0) &&
  ------------------
  |  |   38|  1.52k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.52k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (166:24): [True: 1.52k, False: 7.81k]
  |  Branch (166:38): [True: 0, False: 1.52k]
  ------------------
  167|  9.33k|                       macros.unit.getComplexity(status) == UMEASURE_UNIT_MIXED;
  ------------------
  |  Branch (167:24): [True: 0, False: 0]
  ------------------
  168|       |
  169|       |    // Select the numbering system.
  170|  9.33k|    LocalPointer<const NumberingSystem> nsLocal;
  171|  9.33k|    const NumberingSystem* ns;
  172|  9.33k|    if (macros.symbols.isNumberingSystem()) {
  ------------------
  |  Branch (172:9): [True: 0, False: 9.33k]
  ------------------
  173|      0|        ns = macros.symbols.getNumberingSystem();
  174|  9.33k|    } else {
  175|       |        // TODO: Is there a way to avoid creating the NumberingSystem object?
  176|  9.33k|        ns = NumberingSystem::createInstance(macros.locale, status);
  177|       |        // Give ownership to the function scope.
  178|  9.33k|        nsLocal.adoptInstead(ns);
  179|  9.33k|    }
  180|  9.33k|    const char* nsName = U_SUCCESS(status) ? ns->getName() : "latn";
  ------------------
  |  Branch (180:26): [True: 9.33k, False: 0]
  ------------------
  181|  9.33k|    uprv_strncpy(fMicros.nsName, nsName, 8);
  ------------------
  |  |   43|  9.33k|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  182|  9.33k|    fMicros.nsName[8] = 0; // guarantee NUL-terminated
  183|       |
  184|       |    // Default gender: none.
  185|  9.33k|    fMicros.gender = "";
  186|       |
  187|       |    // Resolve the symbols. Do this here because currency may need to customize them.
  188|  9.33k|    if (macros.symbols.isDecimalFormatSymbols()) {
  ------------------
  |  Branch (188:9): [True: 0, False: 9.33k]
  ------------------
  189|      0|        fMicros.simple.symbols = macros.symbols.getDecimalFormatSymbols();
  190|  9.33k|    } else {
  191|  9.33k|        LocalPointer<DecimalFormatSymbols> newSymbols(
  192|  9.33k|            new DecimalFormatSymbols(macros.locale, *ns, status), status);
  193|  9.33k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (193:13): [True: 0, False: 9.33k]
  ------------------
  194|      0|            return nullptr;
  195|      0|        }
  196|  9.33k|        if (isCurrency) {
  ------------------
  |  Branch (196:13): [True: 0, False: 9.33k]
  ------------------
  197|      0|            newSymbols->setCurrency(currency.getISOCurrency(), status);
  198|      0|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (198:17): [True: 0, False: 0]
  ------------------
  199|      0|                return nullptr;
  200|      0|            }
  201|      0|        }
  202|  9.33k|        fMicros.simple.symbols = newSymbols.getAlias();
  203|  9.33k|        fSymbols.adoptInstead(newSymbols.orphan());
  204|  9.33k|    }
  205|       |
  206|       |    // Load and parse the pattern string. It is used for grouping sizes and affixes only.
  207|       |    // If we are formatting currency, check for a currency-specific pattern.
  208|  9.33k|    const char16_t* pattern = nullptr;
  209|  9.33k|    if (isCurrency && fMicros.simple.symbols->getCurrencyPattern() != nullptr) {
  ------------------
  |  Branch (209:9): [True: 0, False: 9.33k]
  |  Branch (209:23): [True: 0, False: 0]
  ------------------
  210|      0|        pattern = fMicros.simple.symbols->getCurrencyPattern();
  211|      0|    }
  212|  9.33k|    if (pattern == nullptr) {
  ------------------
  |  Branch (212:9): [True: 9.33k, False: 0]
  ------------------
  213|  9.33k|        CldrPatternStyle patternStyle;
  214|  9.33k|        if (isCldrUnit) {
  ------------------
  |  Branch (214:13): [True: 1.52k, False: 7.81k]
  ------------------
  215|  1.52k|            patternStyle = CLDR_PATTERN_STYLE_DECIMAL;
  216|  7.81k|        } else if (isPercent || isPermille) {
  ------------------
  |  Branch (216:20): [True: 86, False: 7.72k]
  |  Branch (216:33): [True: 0, False: 7.72k]
  ------------------
  217|     86|            patternStyle = CLDR_PATTERN_STYLE_PERCENT;
  218|  7.72k|        } else if (!isCurrency || unitWidth == UNUM_UNIT_WIDTH_FULL_NAME) {
  ------------------
  |  Branch (218:20): [True: 7.72k, False: 0]
  |  Branch (218:35): [True: 0, False: 0]
  ------------------
  219|  7.72k|            patternStyle = CLDR_PATTERN_STYLE_DECIMAL;
  220|  7.72k|        } else if (isAccounting) {
  ------------------
  |  Branch (220:20): [True: 0, False: 0]
  ------------------
  221|       |            // NOTE: Although ACCOUNTING and ACCOUNTING_ALWAYS are only supported in currencies right now,
  222|       |            // the API contract allows us to add support to other units in the future.
  223|      0|            patternStyle = CLDR_PATTERN_STYLE_ACCOUNTING;
  224|      0|        } else {
  225|      0|            patternStyle = CLDR_PATTERN_STYLE_CURRENCY;
  226|      0|        }
  227|  9.33k|        pattern = utils::getPatternForStyle(macros.locale, nsName, patternStyle, status);
  228|  9.33k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (228:13): [True: 0, False: 9.33k]
  ------------------
  229|      0|            return nullptr;
  230|      0|        }
  231|  9.33k|    }
  232|  9.33k|    auto* patternInfo = new ParsedPatternInfo();
  233|  9.33k|    if (patternInfo == nullptr) {
  ------------------
  |  Branch (233:9): [True: 0, False: 9.33k]
  ------------------
  234|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  235|      0|        return nullptr;
  236|      0|    }
  237|  9.33k|    fPatternInfo.adoptInstead(patternInfo);
  238|  9.33k|    PatternParser::parseToPatternInfo(UnicodeString(pattern), *patternInfo, status);
  239|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (239:9): [True: 0, False: 9.33k]
  ------------------
  240|      0|        return nullptr;
  241|      0|    }
  242|       |
  243|       |    /////////////////////////////////////////////////////////////////////////////////////
  244|       |    /// START POPULATING THE DEFAULT MICROPROPS AND BUILDING THE MICROPROPS GENERATOR ///
  245|       |    /////////////////////////////////////////////////////////////////////////////////////
  246|       |
  247|       |    // Unit Preferences and Conversions as our first step
  248|  9.33k|    if (macros.usage.isSet()) {
  ------------------
  |  Branch (248:9): [True: 0, False: 9.33k]
  ------------------
  249|      0|        if (!isCldrUnit) {
  ------------------
  |  Branch (249:13): [True: 0, False: 0]
  ------------------
  250|       |            // We only support "usage" when the input unit is specified, and is
  251|       |            // a CLDR Unit.
  252|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  253|      0|            return nullptr;
  254|      0|        }
  255|      0|        auto* usagePrefsHandler =
  256|      0|            new UsagePrefsHandler(macros.locale, macros.unit, macros.usage.fValue, chain, status);
  257|      0|        fUsagePrefsHandler.adoptInsteadAndCheckErrorCode(usagePrefsHandler, status);
  258|      0|        chain = fUsagePrefsHandler.getAlias();
  259|  9.33k|    } else if (isMixedUnit) {
  ------------------
  |  Branch (259:16): [True: 0, False: 9.33k]
  ------------------
  260|      0|        auto* unitConversionHandler = new UnitConversionHandler(macros.unit, chain, status);
  261|      0|        fUnitConversionHandler.adoptInsteadAndCheckErrorCode(unitConversionHandler, status);
  262|      0|        chain = fUnitConversionHandler.getAlias();
  263|      0|    }
  264|       |
  265|       |    // Multiplier
  266|  9.33k|    if (macros.scale.isValid()) {
  ------------------
  |  Branch (266:9): [True: 2.63k, False: 6.70k]
  ------------------
  267|  2.63k|        fMicros.helpers.multiplier.setAndChain(macros.scale, chain);
  268|  2.63k|        chain = &fMicros.helpers.multiplier;
  269|  2.63k|    }
  270|       |
  271|       |    // Rounding strategy
  272|  9.33k|    Precision precision;
  273|  9.33k|    if (!macros.precision.isBogus()) {
  ------------------
  |  Branch (273:9): [True: 1.21k, False: 8.12k]
  ------------------
  274|  1.21k|        precision = macros.precision;
  275|  8.12k|    } else if (isCompactNotation) {
  ------------------
  |  Branch (275:16): [True: 2.67k, False: 5.44k]
  ------------------
  276|  2.67k|        precision = Precision::integer().withMinDigits(2);
  277|  5.44k|    } else if (isCurrency) {
  ------------------
  |  Branch (277:16): [True: 0, False: 5.44k]
  ------------------
  278|      0|        precision = Precision::currency(UCURR_USAGE_STANDARD);
  279|  5.44k|    } else if (macros.usage.isSet()) {
  ------------------
  |  Branch (279:16): [True: 0, False: 5.44k]
  ------------------
  280|       |        // Bogus Precision - it will get set in the UsagePrefsHandler instead
  281|      0|        precision = Precision();
  282|  5.44k|    } else {
  283|  5.44k|        precision = Precision::maxFraction(6);
  284|  5.44k|    }
  285|  9.33k|    UNumberFormatRoundingMode roundingMode;
  286|  9.33k|    roundingMode = macros.roundingMode;
  287|  9.33k|    fMicros.rounder = {precision, roundingMode, currency, status};
  288|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (288:9): [True: 0, False: 9.33k]
  ------------------
  289|      0|        return nullptr;
  290|      0|    }
  291|       |
  292|       |    // Grouping strategy
  293|  9.33k|    if (!macros.grouper.isBogus()) {
  ------------------
  |  Branch (293:9): [True: 32, False: 9.30k]
  ------------------
  294|     32|        fMicros.simple.grouping = macros.grouper;
  295|  9.30k|    } else if (isCompactNotation) {
  ------------------
  |  Branch (295:16): [True: 3.36k, False: 5.93k]
  ------------------
  296|       |        // Compact notation uses minGrouping by default since ICU 59
  297|  3.36k|        fMicros.simple.grouping = Grouper::forStrategy(UNUM_GROUPING_MIN2);
  298|  5.93k|    } else {
  299|  5.93k|        fMicros.simple.grouping = Grouper::forStrategy(UNUM_GROUPING_AUTO);
  300|  5.93k|    }
  301|  9.33k|    fMicros.simple.grouping.setLocaleData(*fPatternInfo, macros.locale);
  302|       |
  303|       |    // Padding strategy
  304|  9.33k|    if (!macros.padder.isBogus()) {
  ------------------
  |  Branch (304:9): [True: 0, False: 9.33k]
  ------------------
  305|      0|        fMicros.padding = macros.padder;
  306|  9.33k|    } else {
  307|  9.33k|        fMicros.padding = Padder::none();
  308|  9.33k|    }
  309|       |
  310|       |    // Integer width
  311|  9.33k|    if (!macros.integerWidth.isBogus()) {
  ------------------
  |  Branch (311:9): [True: 104, False: 9.23k]
  ------------------
  312|    104|        fMicros.integerWidth = macros.integerWidth;
  313|  9.23k|    } else {
  314|  9.23k|        fMicros.integerWidth = IntegerWidth::standard();
  315|  9.23k|    }
  316|       |
  317|       |    // Sign display
  318|  9.33k|    if (macros.sign != UNUM_SIGN_COUNT) {
  ------------------
  |  Branch (318:9): [True: 34, False: 9.30k]
  ------------------
  319|     34|        fMicros.sign = macros.sign;
  320|  9.30k|    } else {
  321|  9.30k|        fMicros.sign = UNUM_SIGN_AUTO;
  322|  9.30k|    }
  323|       |
  324|       |    // Decimal mark display
  325|  9.33k|    if (macros.decimal != UNUM_DECIMAL_SEPARATOR_COUNT) {
  ------------------
  |  Branch (325:9): [True: 0, False: 9.33k]
  ------------------
  326|      0|        fMicros.simple.decimal = macros.decimal;
  327|  9.33k|    } else {
  328|  9.33k|        fMicros.simple.decimal = UNUM_DECIMAL_SEPARATOR_AUTO;
  329|  9.33k|    }
  330|       |
  331|       |    // Use monetary separator symbols
  332|  9.33k|    fMicros.simple.useCurrency = isCurrency;
  333|       |
  334|       |    // Inner modifier (scientific notation)
  335|  9.33k|    if (macros.notation.fType == Notation::NTN_SCIENTIFIC) {
  ------------------
  |  Branch (335:9): [True: 192, False: 9.14k]
  ------------------
  336|    192|        auto* newScientificHandler =
  337|    192|            new ScientificHandler(&macros.notation, fMicros.simple.symbols, chain);
  338|    192|        if (newScientificHandler == nullptr) {
  ------------------
  |  Branch (338:13): [True: 0, False: 192]
  ------------------
  339|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  340|      0|            return nullptr;
  341|      0|        }
  342|    192|        fScientificHandler.adoptInstead(newScientificHandler);
  343|    192|        chain = fScientificHandler.getAlias();
  344|  9.14k|    } else {
  345|       |        // No inner modifier required
  346|  9.14k|        fMicros.modInner = &fMicros.helpers.emptyStrongModifier;
  347|  9.14k|    }
  348|       |
  349|       |    // Middle modifier (patterns, positive/negative, currency symbols, percent)
  350|  9.33k|    auto* patternModifier = new MutablePatternModifier(false);
  351|  9.33k|    if (patternModifier == nullptr) {
  ------------------
  |  Branch (351:9): [True: 0, False: 9.33k]
  ------------------
  352|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  353|      0|        return nullptr;
  354|      0|    }
  355|  9.33k|    fPatternModifier.adoptInstead(patternModifier);
  356|  9.33k|    const AffixPatternProvider* affixProvider =
  357|  9.33k|        macros.affixProvider != nullptr && (
  ------------------
  |  Branch (357:9): [True: 0, False: 9.33k]
  ------------------
  358|       |                // For more information on this condition, see ICU-22073
  359|      0|                !isCompactNotation || isCurrency == macros.affixProvider->hasCurrencySign())
  ------------------
  |  Branch (359:17): [True: 0, False: 0]
  |  Branch (359:39): [True: 0, False: 0]
  ------------------
  360|  9.33k|            ? macros.affixProvider
  361|  9.33k|            : static_cast<const AffixPatternProvider*>(fPatternInfo.getAlias());
  362|  9.33k|    patternModifier->setPatternInfo(affixProvider, kUndefinedField);
  363|  9.33k|    patternModifier->setPatternAttributes(fMicros.sign, isPermille, macros.approximately);
  364|  9.33k|    if (patternModifier->needsPlurals()) {
  ------------------
  |  Branch (364:9): [True: 0, False: 9.33k]
  ------------------
  365|      0|        patternModifier->setSymbols(
  366|      0|                fMicros.simple.symbols,
  367|      0|                currency,
  368|      0|                unitWidth,
  369|      0|                resolvePluralRules(macros.rules, macros.locale, status),
  370|      0|                status);
  371|  9.33k|    } else {
  372|  9.33k|        patternModifier->setSymbols(fMicros.simple.symbols, currency, unitWidth, nullptr, status);
  373|  9.33k|    }
  374|  9.33k|    if (safe) {
  ------------------
  |  Branch (374:9): [True: 0, False: 9.33k]
  ------------------
  375|      0|        fImmutablePatternModifier.adoptInsteadAndCheckErrorCode(patternModifier->createImmutable(status),
  376|      0|                                                                status);
  377|      0|    }
  378|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (378:9): [True: 0, False: 9.33k]
  ------------------
  379|      0|        return nullptr;
  380|      0|    }
  381|       |
  382|       |    // currencyAsDecimal
  383|  9.33k|    if (affixProvider->currencyAsDecimal()) {
  ------------------
  |  Branch (383:9): [True: 0, False: 9.33k]
  ------------------
  384|      0|        fMicros.simple.currencyAsDecimal = patternModifier->getCurrencySymbolForUnitWidth(status);
  385|      0|    }
  386|       |
  387|       |    // Outer modifier (CLDR units and currency long names)
  388|  9.33k|    if (isCldrUnit) {
  ------------------
  |  Branch (388:9): [True: 1.52k, False: 7.81k]
  ------------------
  389|  1.52k|        const char *unitDisplayCase = "";
  390|  1.52k|        if (macros.unitDisplayCase.isSet()) {
  ------------------
  |  Branch (390:13): [True: 0, False: 1.52k]
  ------------------
  391|      0|            unitDisplayCase = macros.unitDisplayCase.fValue;
  392|      0|        }
  393|  1.52k|        if (macros.usage.isSet()) {
  ------------------
  |  Branch (393:13): [True: 0, False: 1.52k]
  ------------------
  394|      0|            fLongNameMultiplexer.adoptInsteadAndCheckErrorCode(
  395|      0|                LongNameMultiplexer::forMeasureUnits(
  396|      0|                    macros.locale, *fUsagePrefsHandler->getOutputUnits(), unitWidth, unitDisplayCase,
  397|      0|                    resolvePluralRules(macros.rules, macros.locale, status), chain, status),
  398|      0|                status);
  399|      0|            chain = fLongNameMultiplexer.getAlias();
  400|  1.52k|        } else if (isMixedUnit) {
  ------------------
  |  Branch (400:20): [True: 0, False: 1.52k]
  ------------------
  401|      0|            fMixedUnitLongNameHandler.adoptInsteadAndCheckErrorCode(new MixedUnitLongNameHandler(),
  402|      0|                                                                    status);
  403|      0|            MixedUnitLongNameHandler::forMeasureUnit(
  404|      0|                macros.locale, macros.unit, unitWidth, unitDisplayCase,
  405|      0|                resolvePluralRules(macros.rules, macros.locale, status), chain,
  406|      0|                fMixedUnitLongNameHandler.getAlias(), status);
  407|      0|            chain = fMixedUnitLongNameHandler.getAlias();
  408|  1.52k|        } else {
  409|  1.52k|            MeasureUnit unit = macros.unit;
  410|  1.52k|            if (!utils::unitIsBaseUnit(macros.perUnit)) {
  ------------------
  |  Branch (410:17): [True: 0, False: 1.52k]
  ------------------
  411|      0|                unit = unit.product(macros.perUnit.reciprocal(status), status);
  412|       |                // This isn't strictly necessary, but was what we specced out
  413|       |                // when perUnit became a backward-compatibility thing:
  414|       |                // unit/perUnit use case is only valid if both units are
  415|       |                // built-ins, or the product is a built-in.
  416|      0|                if (uprv_strcmp(unit.getType(), "") == 0 &&
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (416:21): [True: 0, False: 0]
  ------------------
  417|      0|                    (uprv_strcmp(macros.unit.getType(), "") == 0 ||
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (417:22): [True: 0, False: 0]
  ------------------
  418|      0|                     uprv_strcmp(macros.perUnit.getType(), "") == 0)) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (418:22): [True: 0, False: 0]
  ------------------
  419|      0|                    status = U_UNSUPPORTED_ERROR;
  420|      0|                    return nullptr;
  421|      0|                }
  422|      0|            }
  423|  1.52k|            fLongNameHandler.adoptInsteadAndCheckErrorCode(new LongNameHandler(), status);
  424|  1.52k|            LongNameHandler::forMeasureUnit(macros.locale, unit, unitWidth, unitDisplayCase,
  425|  1.52k|                                            resolvePluralRules(macros.rules, macros.locale, status),
  426|  1.52k|                                            chain, fLongNameHandler.getAlias(), status);
  427|  1.52k|            chain = fLongNameHandler.getAlias();
  428|  1.52k|        }
  429|  7.81k|    } else if (isCurrency && unitWidth == UNUM_UNIT_WIDTH_FULL_NAME) {
  ------------------
  |  Branch (429:16): [True: 0, False: 7.81k]
  |  Branch (429:30): [True: 0, False: 0]
  ------------------
  430|      0|        fLongNameHandler.adoptInsteadAndCheckErrorCode(
  431|      0|            LongNameHandler::forCurrencyLongNames(
  432|      0|                macros.locale, currency, resolvePluralRules(macros.rules, macros.locale, status), chain,
  433|      0|                status),
  434|      0|            status);
  435|      0|        chain = fLongNameHandler.getAlias();
  436|  7.81k|    } else {
  437|       |        // No outer modifier required
  438|  7.81k|        fMicros.modOuter = &fMicros.helpers.emptyWeakModifier;
  439|  7.81k|    }
  440|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (440:9): [True: 0, False: 9.33k]
  ------------------
  441|      0|        return nullptr;
  442|      0|    }
  443|       |
  444|       |    // Compact notation
  445|  9.33k|    if (isCompactNotation) {
  ------------------
  |  Branch (445:9): [True: 3.37k, False: 5.95k]
  ------------------
  446|  3.37k|        CompactType compactType = (isCurrency && unitWidth != UNUM_UNIT_WIDTH_FULL_NAME)
  ------------------
  |  Branch (446:36): [True: 0, False: 3.37k]
  |  Branch (446:50): [True: 0, False: 0]
  ------------------
  447|  3.37k|                                  ? CompactType::TYPE_CURRENCY : CompactType::TYPE_DECIMAL;
  448|  3.37k|        auto* newCompactHandler = new CompactHandler(
  449|  3.37k|            macros.notation.fUnion.compactStyle,
  450|  3.37k|            macros.locale,
  451|  3.37k|            nsName,
  452|  3.37k|            compactType,
  453|  3.37k|            resolvePluralRules(macros.rules, macros.locale, status),
  454|  3.37k|            patternModifier,
  455|  3.37k|            safe,
  456|  3.37k|            chain,
  457|  3.37k|            status);
  458|  3.37k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (458:13): [True: 0, False: 3.37k]
  ------------------
  459|      0|            return nullptr;
  460|      0|        }
  461|  3.37k|        if (newCompactHandler == nullptr) {
  ------------------
  |  Branch (461:13): [True: 0, False: 3.37k]
  ------------------
  462|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  463|      0|            return nullptr;
  464|      0|        }
  465|  3.37k|        fCompactHandler.adoptInstead(newCompactHandler);
  466|  3.37k|        chain = fCompactHandler.getAlias();
  467|  3.37k|    }
  468|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (468:9): [True: 0, False: 9.33k]
  ------------------
  469|      0|        return nullptr;
  470|      0|    }
  471|       |
  472|       |    // Always add the pattern modifier as the last element of the chain.
  473|  9.33k|    if (safe) {
  ------------------
  |  Branch (473:9): [True: 0, False: 9.33k]
  ------------------
  474|      0|        fImmutablePatternModifier->addToChain(chain);
  475|      0|        chain = fImmutablePatternModifier.getAlias();
  476|  9.33k|    } else {
  477|  9.33k|        patternModifier->addToChain(chain);
  478|  9.33k|        chain = patternModifier;
  479|  9.33k|    }
  480|       |
  481|  9.33k|    return chain;
  482|  9.33k|}
_ZN6icu_786number4impl19NumberFormatterImpl18resolvePluralRulesEPKNS_11PluralRulesERKNS_6LocaleER10UErrorCode:
  488|  4.90k|        UErrorCode& status) {
  489|  4.90k|    if (rulesPtr != nullptr) {
  ------------------
  |  Branch (489:9): [True: 0, False: 4.90k]
  ------------------
  490|      0|        return rulesPtr;
  491|      0|    }
  492|       |    // Lazily create PluralRules
  493|  4.90k|    if (fRules.isNull()) {
  ------------------
  |  Branch (493:9): [True: 3.37k, False: 1.52k]
  ------------------
  494|  3.37k|        fRules.adoptInstead(PluralRules::forLocale(locale, status));
  495|  3.37k|    }
  496|  4.90k|    return fRules.getAlias();
  497|  4.90k|}
_ZN6icu_786number4impl19NumberFormatterImpl12writeAffixesERKNS1_10MicroPropsERNS_22FormattedStringBuilderEiiR10UErrorCode:
  504|  9.33k|        UErrorCode& status) {
  505|  9.33k|    U_ASSERT(micros.modOuter != nullptr);
  ------------------
  |  |   35|  9.33k|#   define U_ASSERT(exp) (void)0
  ------------------
  506|       |    // Always apply the inner modifier (which is "strong").
  507|  9.33k|    int32_t length = micros.modInner->apply(string, start, end, status);
  508|  9.33k|    if (micros.padding.isValid()) {
  ------------------
  |  Branch (508:9): [True: 0, False: 9.33k]
  ------------------
  509|      0|        length += micros.padding
  510|      0|                .padAndApply(*micros.modMiddle, *micros.modOuter, string, start, length + end, status);
  511|  9.33k|    } else {
  512|  9.33k|        length += micros.modMiddle->apply(string, start, length + end, status);
  513|  9.33k|        length += micros.modOuter->apply(string, start, length + end, status);
  514|  9.33k|    }
  515|  9.33k|    return length;
  516|  9.33k|}
_ZN6icu_786number4impl19NumberFormatterImpl11writeNumberERKNS1_16SimpleMicroPropsERNS1_15DecimalQuantityERNS_22FormattedStringBuilderEiR10UErrorCode:
  523|  9.33k|        UErrorCode& status) {
  524|  9.33k|    int32_t length = 0;
  525|  9.33k|    if (quantity.isInfinite()) {
  ------------------
  |  Branch (525:9): [True: 5, False: 9.32k]
  ------------------
  526|      5|        length += string.insert(
  527|      5|                length + index,
  528|      5|                micros.symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kInfinitySymbol),
  529|      5|                {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD},
  530|      5|                status);
  531|       |
  532|  9.32k|    } else if (quantity.isNaN()) {
  ------------------
  |  Branch (532:16): [True: 114, False: 9.21k]
  ------------------
  533|    114|        length += string.insert(
  534|    114|                length + index,
  535|    114|                micros.symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kNaNSymbol),
  536|    114|                {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD},
  537|    114|                status);
  538|       |
  539|  9.21k|    } else {
  540|       |        // Add the integer digits
  541|  9.21k|        length += writeIntegerDigits(
  542|  9.21k|            micros,
  543|  9.21k|            quantity,
  544|  9.21k|            string,
  545|  9.21k|            length + index,
  546|  9.21k|            status);
  547|       |
  548|       |        // Add the decimal point
  549|  9.21k|        if (quantity.getLowerDisplayMagnitude() < 0 || micros.decimal == UNUM_DECIMAL_SEPARATOR_ALWAYS) {
  ------------------
  |  Branch (549:13): [True: 1.76k, False: 7.44k]
  |  Branch (549:56): [True: 0, False: 7.44k]
  ------------------
  550|  1.76k|            if (!micros.currencyAsDecimal.isBogus()) {
  ------------------
  |  Branch (550:17): [True: 0, False: 1.76k]
  ------------------
  551|      0|                length += string.insert(
  552|      0|                    length + index,
  553|      0|                    micros.currencyAsDecimal,
  554|      0|                    {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD},
  555|      0|                    status);
  556|  1.76k|            } else if (micros.useCurrency) {
  ------------------
  |  Branch (556:24): [True: 0, False: 1.76k]
  ------------------
  557|      0|                length += string.insert(
  558|      0|                    length + index,
  559|      0|                    micros.symbols->getSymbol(
  560|      0|                        DecimalFormatSymbols::ENumberFormatSymbol::kMonetarySeparatorSymbol),
  561|      0|                    {UFIELD_CATEGORY_NUMBER, UNUM_DECIMAL_SEPARATOR_FIELD},
  562|      0|                    status);
  563|  1.76k|            } else {
  564|  1.76k|                length += string.insert(
  565|  1.76k|                    length + index,
  566|  1.76k|                    micros.symbols->getSymbol(
  567|  1.76k|                        DecimalFormatSymbols::ENumberFormatSymbol::kDecimalSeparatorSymbol),
  568|  1.76k|                    {UFIELD_CATEGORY_NUMBER, UNUM_DECIMAL_SEPARATOR_FIELD},
  569|  1.76k|                    status);
  570|  1.76k|            }
  571|  1.76k|        }
  572|       |
  573|       |        // Add the fraction digits
  574|  9.21k|        length += writeFractionDigits(micros, quantity, string, length + index, status);
  575|       |
  576|  9.21k|        if (length == 0) {
  ------------------
  |  Branch (576:13): [True: 0, False: 9.21k]
  ------------------
  577|       |            // Force output of the digit for value 0
  578|      0|            length += utils::insertDigitFromSymbols(
  579|      0|                    string,
  580|      0|                    index,
  581|      0|                    0,
  582|      0|                    *micros.symbols,
  583|      0|                    {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD},
  584|      0|                    status);
  585|      0|        }
  586|  9.21k|    }
  587|       |
  588|  9.33k|    return length;
  589|  9.33k|}
_ZN6icu_786number4impl19NumberFormatterImpl18writeIntegerDigitsERKNS1_16SimpleMicroPropsERNS1_15DecimalQuantityERNS_22FormattedStringBuilderEiR10UErrorCode:
  596|  9.21k|        UErrorCode& status) {
  597|  9.21k|    int length = 0;
  598|  9.21k|    int integerCount = quantity.getUpperDisplayMagnitude() + 1;
  599|   711M|    for (int i = 0; i < integerCount; i++) {
  ------------------
  |  Branch (599:21): [True: 711M, False: 9.21k]
  ------------------
  600|       |        // Add grouping separator
  601|   711M|        if (micros.grouping.groupAtPosition(i, quantity)) {
  ------------------
  |  Branch (601:13): [True: 241M, False: 469M]
  ------------------
  602|   241M|            length += string.insert(
  603|   241M|                    index,
  604|   241M|                    micros.useCurrency ? micros.symbols->getSymbol(
  ------------------
  |  Branch (604:21): [True: 0, False: 241M]
  ------------------
  605|      0|                            DecimalFormatSymbols::ENumberFormatSymbol::kMonetaryGroupingSeparatorSymbol)
  606|   241M|                                       : micros.symbols->getSymbol(
  607|   241M|                            DecimalFormatSymbols::ENumberFormatSymbol::kGroupingSeparatorSymbol),
  608|   241M|                    {UFIELD_CATEGORY_NUMBER, UNUM_GROUPING_SEPARATOR_FIELD},
  609|   241M|                    status);
  610|   241M|        }
  611|       |
  612|       |        // Get and append the next digit value
  613|   711M|        int8_t nextDigit = quantity.getDigit(i);
  614|   711M|        length += utils::insertDigitFromSymbols(
  615|   711M|                string,
  616|   711M|                index,
  617|   711M|                nextDigit,
  618|   711M|                *micros.symbols,
  619|   711M|                {UFIELD_CATEGORY_NUMBER,
  620|   711M|                UNUM_INTEGER_FIELD},
  621|   711M|                status);
  622|   711M|    }
  623|  9.21k|    return length;
  624|  9.21k|}
_ZN6icu_786number4impl19NumberFormatterImpl19writeFractionDigitsERKNS1_16SimpleMicroPropsERNS1_15DecimalQuantityERNS_22FormattedStringBuilderEiR10UErrorCode:
  631|  9.21k|        UErrorCode& status) {
  632|  9.21k|    int length = 0;
  633|  9.21k|    int fractionCount = -quantity.getLowerDisplayMagnitude();
  634|   582M|    for (int i = 0; i < fractionCount; i++) {
  ------------------
  |  Branch (634:21): [True: 582M, False: 9.21k]
  ------------------
  635|       |        // Get and append the next digit value
  636|   582M|        int8_t nextDigit = quantity.getDigit(-i - 1);
  637|   582M|        length += utils::insertDigitFromSymbols(
  638|   582M|                string,
  639|   582M|                length + index,
  640|   582M|                nextDigit,
  641|   582M|                *micros.symbols,
  642|   582M|                {UFIELD_CATEGORY_NUMBER, UNUM_FRACTION_FIELD},
  643|   582M|                status);
  644|   582M|    }
  645|  9.21k|    return length;
  646|  9.21k|}

_ZN6icu_786number4impl7Grouper11forStrategyE23UNumberGroupingStrategy:
   37|  9.33k|Grouper Grouper::forStrategy(UNumberGroupingStrategy grouping) {
   38|  9.33k|    switch (grouping) {
   39|     10|    case UNUM_GROUPING_OFF:
  ------------------
  |  Branch (39:5): [True: 10, False: 9.32k]
  ------------------
   40|     10|        return {-1, -1, -2, grouping};
   41|  5.93k|    case UNUM_GROUPING_AUTO:
  ------------------
  |  Branch (41:5): [True: 5.93k, False: 3.39k]
  ------------------
   42|  5.93k|        return {-2, -2, -2, grouping};
   43|  3.37k|    case UNUM_GROUPING_MIN2:
  ------------------
  |  Branch (43:5): [True: 3.37k, False: 5.96k]
  ------------------
   44|  3.37k|        return {-2, -2, -3, grouping};
   45|     17|    case UNUM_GROUPING_ON_ALIGNED:
  ------------------
  |  Branch (45:5): [True: 17, False: 9.31k]
  ------------------
   46|     17|        return {-4, -4, 1, grouping};
   47|      0|    case UNUM_GROUPING_THOUSANDS:
  ------------------
  |  Branch (47:5): [True: 0, False: 9.33k]
  ------------------
   48|      0|        return {3, 3, 1, grouping};
   49|      0|    default:
  ------------------
  |  Branch (49:5): [True: 0, False: 9.33k]
  ------------------
   50|      0|        UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
   51|  9.33k|    }
   52|  9.33k|}
_ZN6icu_786number4impl7Grouper13setLocaleDataERKNS1_17ParsedPatternInfoERKNS_6LocaleE:
   66|  9.33k|void Grouper::setLocaleData(const impl::ParsedPatternInfo &patternInfo, const Locale& locale) {
   67|  9.33k|    if (fMinGrouping == -2) {
  ------------------
  |  Branch (67:9): [True: 5.93k, False: 3.39k]
  ------------------
   68|  5.93k|        fMinGrouping = getMinGroupingForLocale(locale);
   69|  5.93k|    } else if (fMinGrouping == -3) {
  ------------------
  |  Branch (69:16): [True: 3.37k, False: 26]
  ------------------
   70|  3.37k|        fMinGrouping = static_cast<int16_t>(uprv_max(2, getMinGroupingForLocale(locale)));
  ------------------
  |  | 1526|  3.37k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|  3.37k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.37k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.37k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   71|  3.37k|    } else {
   72|       |        // leave fMinGrouping alone
   73|     26|    }
   74|  9.33k|    if (fGrouping1 != -2 && fGrouping2 != -4) {
  ------------------
  |  Branch (74:9): [True: 30, False: 9.30k]
  |  Branch (74:29): [True: 4, False: 26]
  ------------------
   75|      4|        return;
   76|      4|    }
   77|  9.33k|    auto grouping1 = static_cast<int16_t> (patternInfo.positive.groupingSizes & 0xffff);
   78|  9.33k|    auto grouping2 = static_cast<int16_t> ((patternInfo.positive.groupingSizes >> 16) & 0xffff);
   79|  9.33k|    auto grouping3 = static_cast<int16_t> ((patternInfo.positive.groupingSizes >> 32) & 0xffff);
   80|  9.33k|    if (grouping2 == -1) {
  ------------------
  |  Branch (80:9): [True: 50, False: 9.28k]
  ------------------
   81|     50|        grouping1 = fGrouping1 == -4 ? static_cast<short>(3) : static_cast<short>(-1);
  ------------------
  |  Branch (81:21): [True: 4, False: 46]
  ------------------
   82|     50|    }
   83|  9.33k|    if (grouping3 == -1) {
  ------------------
  |  Branch (83:9): [True: 8.86k, False: 468]
  ------------------
   84|  8.86k|        grouping2 = grouping1;
   85|  8.86k|    }
   86|  9.33k|    fGrouping1 = grouping1;
   87|  9.33k|    fGrouping2 = grouping2;
   88|  9.33k|}
_ZNK6icu_786number4impl7Grouper15groupAtPositionEiRKNS1_15DecimalQuantityE:
   90|   711M|bool Grouper::groupAtPosition(int32_t position, const impl::DecimalQuantity &value) const {
   91|   711M|    U_ASSERT(fGrouping1 > -2);
  ------------------
  |  |   35|   711M|#   define U_ASSERT(exp) (void)0
  ------------------
   92|   711M|    if (fGrouping1 == -1 || fGrouping1 == 0) {
  ------------------
  |  Branch (92:9): [True: 1.46k, False: 711M]
  |  Branch (92:29): [True: 0, False: 711M]
  ------------------
   93|       |        // Either -1 or 0 means "no grouping"
   94|  1.46k|        return false;
   95|  1.46k|    }
   96|   711M|    position -= fGrouping1;
   97|   711M|    return position >= 0 && (position % fGrouping2) == 0
  ------------------
  |  Branch (97:12): [True: 711M, False: 20.7k]
  |  Branch (97:29): [True: 241M, False: 469M]
  ------------------
   98|   711M|           && value.getUpperDisplayMagnitude() - fGrouping1 + 1 >= fMinGrouping;
  ------------------
  |  Branch (98:15): [True: 241M, False: 67]
  ------------------
   99|   711M|}
number_grouping.cpp:_ZN12_GLOBAL__N_123getMinGroupingForLocaleERKN6icu_786LocaleE:
   18|  9.30k|int16_t getMinGroupingForLocale(const Locale& locale) {
   19|       |    // TODO: Cache this?
   20|  9.30k|    UErrorCode localStatus = U_ZERO_ERROR;
   21|  9.30k|    LocalUResourceBundlePointer bundle(ures_open(nullptr, locale.getName(), &localStatus));
  ------------------
  |  | 1691|  9.30k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  9.30k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.30k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.30k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   22|  9.30k|    int32_t resultLen = 0;
   23|  9.30k|    const char16_t* result = ures_getStringByKeyWithFallback(
  ------------------
  |  | 1678|  9.30k|#define ures_getStringByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getStringByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  9.30k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.30k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.30k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   24|  9.30k|        bundle.getAlias(),
   25|  9.30k|        "NumberElements/minimumGroupingDigits",
   26|  9.30k|        &resultLen,
   27|  9.30k|        &localStatus);
   28|       |    // TODO: Is it safe to assume resultLen == 1? Would locales set minGrouping >= 10?
   29|  9.30k|    if (U_FAILURE(localStatus) || resultLen != 1) {
  ------------------
  |  Branch (29:9): [True: 0, False: 9.30k]
  |  Branch (29:35): [True: 0, False: 9.30k]
  ------------------
   30|      0|        return 1;
   31|      0|    }
   32|  9.30k|    return result[0] - u'0';
   33|  9.30k|}

_ZN6icu_786number12IntegerWidthC2Essb:
   16|  9.30k|IntegerWidth::IntegerWidth(digits_t minInt, digits_t maxInt, bool formatFailIfMoreThanMaxDigits) {
   17|  9.30k|    fUnion.minMaxInt.fMinInt = minInt;
   18|  9.30k|    fUnion.minMaxInt.fMaxInt = maxInt;
   19|  9.30k|    fUnion.minMaxInt.fFormatFailIfMoreThanMaxDigits = formatFailIfMoreThanMaxDigits;
   20|  9.30k|}
_ZN6icu_786number12IntegerWidth10zeroFillToEi:
   22|  9.31k|IntegerWidth IntegerWidth::zeroFillTo(int32_t minInt) {
   23|  9.31k|    if (minInt >= 0 && minInt <= kMaxIntFracSig) {
  ------------------
  |  Branch (23:9): [True: 9.31k, False: 0]
  |  Branch (23:24): [True: 9.30k, False: 7]
  ------------------
   24|  9.30k|        return {static_cast<digits_t>(minInt), -1, false};
   25|  9.30k|    } else {
   26|      7|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
   27|      7|    }
   28|  9.31k|}
_ZNK6icu_786number12IntegerWidth5applyERNS0_4impl15DecimalQuantityER10UErrorCode:
   42|  9.33k|void IntegerWidth::apply(impl::DecimalQuantity& quantity, UErrorCode& status) const {
   43|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (43:9): [True: 0, False: 9.33k]
  ------------------
   44|      0|        return;
   45|      0|    }
   46|  9.33k|    if (fHasError) {
  ------------------
  |  Branch (46:9): [True: 0, False: 9.33k]
  ------------------
   47|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
   48|  9.33k|    } else if (fUnion.minMaxInt.fMaxInt == -1) {
  ------------------
  |  Branch (48:16): [True: 9.33k, False: 0]
  ------------------
   49|  9.33k|        quantity.increaseMinIntegerTo(fUnion.minMaxInt.fMinInt);
   50|  9.33k|    } else {
   51|       |        // Enforce the backwards-compatibility feature "FormatFailIfMoreThanMaxDigits"
   52|      0|        if (fUnion.minMaxInt.fFormatFailIfMoreThanMaxDigits &&
  ------------------
  |  Branch (52:13): [True: 0, False: 0]
  ------------------
   53|      0|            fUnion.minMaxInt.fMaxInt < quantity.getMagnitude()) {
  ------------------
  |  Branch (53:13): [True: 0, False: 0]
  ------------------
   54|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
   55|      0|        }
   56|      0|        quantity.increaseMinIntegerTo(fUnion.minMaxInt.fMinInt);
   57|      0|        quantity.applyMaxInteger(fUnion.minMaxInt.fMaxInt);
   58|      0|    }
   59|  9.33k|}

_ZN6icu_786number4impl15LongNameHandler14forMeasureUnitERKNS_6LocaleERKNS_11MeasureUnitERK16UNumberUnitWidthPKcPKNS_11PluralRulesEPKNS1_19MicroPropsGeneratorEPS2_R10UErrorCode:
  949|  1.52k|                                     UErrorCode &status) {
  950|       |    // From https://unicode.org/reports/tr35/tr35-general.html#compound-units -
  951|       |    // Points 1 and 2 are mostly handled by MeasureUnit:
  952|       |    //
  953|       |    // 1. If the unitId is empty or invalid, fail
  954|       |    // 2. Put the unitId into normalized order
  955|  1.52k|    U_ASSERT(fillIn != nullptr);
  ------------------
  |  |   35|  1.52k|#   define U_ASSERT(exp) (void)0
  ------------------
  956|       |
  957|  1.52k|    if (uprv_strcmp(unitRef.getType(), "") != 0) {
  ------------------
  |  |   38|  1.52k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.52k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (957:9): [True: 1.52k, False: 0]
  ------------------
  958|       |        // Handling built-in units:
  959|       |        //
  960|       |        // 3. Set result to be getValue(unitId with length, pluralCategory, caseVariant)
  961|       |        //    - If result is not empty, return it
  962|  1.52k|        UnicodeString simpleFormats[ARRAY_LENGTH];
  963|  1.52k|        getMeasureData(loc, unitRef, width, unitDisplayCase, simpleFormats, status);
  964|  1.52k|        maybeCalculateGender(loc, unitRef, simpleFormats, status);
  965|  1.52k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (965:13): [True: 0, False: 1.52k]
  ------------------
  966|      0|            return;
  967|      0|        }
  968|  1.52k|        fillIn->rules = rules;
  969|  1.52k|        fillIn->parent = parent;
  970|  1.52k|        fillIn->simpleFormatsToModifiers(simpleFormats,
  971|  1.52k|                                         {UFIELD_CATEGORY_NUMBER, UNUM_MEASURE_UNIT_FIELD}, status);
  972|  1.52k|        if (!simpleFormats[GENDER_INDEX].isBogus()) {
  ------------------
  |  Branch (972:13): [True: 456, False: 1.06k]
  ------------------
  973|    456|            fillIn->gender = getGenderString(simpleFormats[GENDER_INDEX], status);
  974|    456|        }
  975|  1.52k|        return;
  976|       |
  977|       |        // TODO(icu-units#145): figure out why this causes a failure in
  978|       |        // format/MeasureFormatTest/TestIndividualPluralFallback and other
  979|       |        // tests, when it should have been an alternative for the lines above:
  980|       |
  981|       |        // forArbitraryUnit(loc, unitRef, width, unitDisplayCase, fillIn, status);
  982|       |        // fillIn->rules = rules;
  983|       |        // fillIn->parent = parent;
  984|       |        // return;
  985|  1.52k|    } else {
  986|       |        // Check if it is a MeasureUnit this constructor handles: this
  987|       |        // constructor does not handle mixed units
  988|      0|        U_ASSERT(unitRef.getComplexity(status) != UMEASURE_UNIT_MIXED);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  989|      0|        forArbitraryUnit(loc, unitRef, width, unitDisplayCase, fillIn, status);
  990|      0|        fillIn->rules = rules;
  991|      0|        fillIn->parent = parent;
  992|      0|        return;
  993|      0|    }
  994|  1.52k|}
_ZN6icu_786number4impl15LongNameHandler24simpleFormatsToModifiersEPKNS_13UnicodeStringENS_22FormattedStringBuilder5FieldER10UErrorCode:
 1573|  1.52k|                                               UErrorCode &status) {
 1574|  13.7k|    for (int32_t i = 0; i < StandardPlural::Form::COUNT; i++) {
  ------------------
  |  Branch (1574:25): [True: 12.1k, False: 1.52k]
  ------------------
 1575|  12.1k|        StandardPlural::Form plural = static_cast<StandardPlural::Form>(i);
 1576|  12.1k|        UnicodeString simpleFormat = getWithPlural(simpleFormats, plural, status);
 1577|  12.1k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1577:13): [True: 0, False: 12.1k]
  ------------------
 1578|  12.1k|        SimpleFormatter compiledFormatter(simpleFormat, 0, 1, status);
 1579|  12.1k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1579:13): [True: 0, False: 12.1k]
  ------------------
 1580|  12.1k|        fModifiers[i] = SimpleModifier(compiledFormatter, field, false, {this, SIGNUM_POS_ZERO, plural});
 1581|  12.1k|    }
 1582|  1.52k|}
_ZNK6icu_786number4impl15LongNameHandler15processQuantityERNS1_15DecimalQuantityERNS1_10MicroPropsER10UErrorCode:
 1606|  1.52k|                                      UErrorCode &status) const {
 1607|  1.52k|    if (parent != nullptr) {
  ------------------
  |  Branch (1607:9): [True: 1.52k, False: 0]
  ------------------
 1608|  1.52k|        parent->processQuantity(quantity, micros, status);
 1609|  1.52k|    }
 1610|  1.52k|    StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, rules, quantity, status);
 1611|  1.52k|    micros.modOuter = &fModifiers[pluralForm];
 1612|  1.52k|    micros.gender = gender;
 1613|  1.52k|}
number_longnames.cpp:_ZN12_GLOBAL__N_114getMeasureDataERKN6icu_786LocaleERKNS0_11MeasureUnitERK16UNumberUnitWidthPKcPNS0_13UnicodeStringER10UErrorCode:
  431|  1.52k|                    UErrorCode &status) {
  432|  1.52k|    PluralTableSink sink(outArray);
  433|  1.52k|    LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_UNIT, locale.getName(), &status));
  ------------------
  |  | 1691|  1.52k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  1.52k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.52k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.52k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_UNIT, locale.getName(), &status));
  ------------------
  |  |   23|  1.52k|#define U_ICUDATA_UNIT U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "unit"
  |  |  ------------------
  |  |  |  |  154|  1.52k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  434|  1.52k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (434:9): [True: 0, False: 1.52k]
  ------------------
  435|       |
  436|  1.52k|    CharString subKey;
  437|  1.52k|    subKey.append("/", status);
  438|  1.52k|    subKey.append(unit.getType(), status);
  439|  1.52k|    subKey.append("/", status);
  440|       |
  441|       |    // Check if unitSubType is an alias or not.
  442|  1.52k|    LocalUResourceBundlePointer aliasBundle(ures_open(U_ICUDATA_ALIAS, "metadata", &status));
  ------------------
  |  | 1691|  1.52k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  1.52k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.52k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.52k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  LocalUResourceBundlePointer aliasBundle(ures_open(U_ICUDATA_ALIAS, "metadata", &status));
  ------------------
  |  |   74|  1.52k|#define U_ICUDATA_ALIAS "ICUDATA"
  ------------------
  443|       |
  444|  1.52k|    UErrorCode aliasStatus = status;
  445|  1.52k|    StackUResourceBundle aliasFillIn;
  446|  1.52k|    CharString aliasKey;
  447|  1.52k|    aliasKey.append("alias/unit/", aliasStatus);
  448|  1.52k|    aliasKey.append(unit.getSubtype(), aliasStatus);
  449|  1.52k|    aliasKey.append("/replacement", aliasStatus);
  450|  1.52k|    ures_getByKeyWithFallback(aliasBundle.getAlias(), aliasKey.data(), aliasFillIn.getAlias(),
  ------------------
  |  | 1662|  1.52k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  1.52k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.52k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.52k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  451|  1.52k|                              &aliasStatus);
  452|  1.52k|    CharString unitSubType;
  453|  1.52k|    if (!U_FAILURE(aliasStatus)) {
  ------------------
  |  Branch (453:9): [True: 0, False: 1.52k]
  ------------------
  454|       |        // This means the subType is an alias. Then, replace unitSubType with the replacement.
  455|      0|        auto replacement = ures_getUnicodeString(aliasFillIn.getAlias(), &status);
  456|      0|        unitSubType.appendInvariantChars(replacement, status);
  457|  1.52k|    } else {
  458|  1.52k|        unitSubType.append(unit.getSubtype(), status);
  459|  1.52k|    }
  460|       |
  461|       |    // Map duration-year-person, duration-week-person, etc. to duration-year, duration-week, ...
  462|       |    // TODO(ICU-20400): Get duration-*-person data properly with aliases.
  463|  1.52k|    int32_t subtypeLen = static_cast<int32_t>(uprv_strlen(unitSubType.data()));
  ------------------
  |  |   37|  1.52k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.52k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  464|  1.52k|    if (subtypeLen > 7 && uprv_strcmp(unitSubType.data() + subtypeLen - 7, "-person") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (464:9): [True: 0, False: 1.52k]
  |  Branch (464:27): [True: 0, False: 0]
  ------------------
  465|      0|        subKey.append({unitSubType.data(), subtypeLen - 7}, status);
  466|  1.52k|    } else {
  467|  1.52k|        subKey.append({unitSubType.data(), subtypeLen}, status);
  468|  1.52k|    }
  469|       |
  470|  1.52k|    if (width != UNUM_UNIT_WIDTH_FULL_NAME) {
  ------------------
  |  Branch (470:9): [True: 1.52k, False: 0]
  ------------------
  471|  1.52k|        UErrorCode localStatus = status;
  472|  1.52k|        CharString genderKey;
  473|  1.52k|        genderKey.append("units", localStatus);
  474|  1.52k|        genderKey.append(subKey, localStatus);
  475|  1.52k|        genderKey.append("/gender", localStatus);
  476|  1.52k|        StackUResourceBundle fillIn;
  477|  1.52k|        ures_getByKeyWithFallback(unitsBundle.getAlias(), genderKey.data(), fillIn.getAlias(),
  ------------------
  |  | 1662|  1.52k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  1.52k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.52k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.52k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  478|  1.52k|                                  &localStatus);
  479|  1.52k|        outArray[GENDER_INDEX] = ures_getUnicodeString(fillIn.getAlias(), &localStatus);
  480|  1.52k|    }
  481|       |
  482|  1.52k|    CharString key;
  483|  1.52k|    key.append("units", status);
  484|  1.52k|    if (width == UNUM_UNIT_WIDTH_NARROW) {
  ------------------
  |  Branch (484:9): [True: 0, False: 1.52k]
  ------------------
  485|      0|        key.append("Narrow", status);
  486|  1.52k|    } else if (width == UNUM_UNIT_WIDTH_SHORT) {
  ------------------
  |  Branch (486:16): [True: 1.52k, False: 0]
  ------------------
  487|  1.52k|        key.append("Short", status);
  488|  1.52k|    }
  489|  1.52k|    key.append(subKey, status);
  490|       |
  491|       |    // Grab desired case first, if available. Then grab no-case data to fill in
  492|       |    // the gaps.
  493|  1.52k|    if (width == UNUM_UNIT_WIDTH_FULL_NAME && unitDisplayCase[0] != 0) {
  ------------------
  |  Branch (493:9): [True: 0, False: 1.52k]
  |  Branch (493:47): [True: 0, False: 0]
  ------------------
  494|      0|        CharString caseKey;
  495|      0|        caseKey.append(key, status);
  496|      0|        caseKey.append("/case/", status);
  497|      0|        caseKey.append(unitDisplayCase, status);
  498|       |
  499|      0|        UErrorCode localStatus = U_ZERO_ERROR;
  500|       |        // TODO(icu-units#138): our fallback logic is not spec-compliant:
  501|       |        // lateral fallback should happen before locale fallback. Switch to
  502|       |        // getInflectedMeasureData after homogenizing data format? Find a unit
  503|       |        // test case that demonstrates the incorrect fallback logic (via
  504|       |        // regional variant of an inflected language?)
  505|      0|        ures_getAllChildrenWithFallback(unitsBundle.getAlias(), caseKey.data(), sink, localStatus);
  ------------------
  |  | 1657|      0|#define ures_getAllChildrenWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllChildrenWithFallback)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  506|      0|    }
  507|       |
  508|       |    // TODO(icu-units#138): our fallback logic is not spec-compliant: we
  509|       |    // check the given case, then go straight to the no-case data. The spec
  510|       |    // states we should first look for case="nominative". As part of #138,
  511|       |    // either get the spec changed, or add unit tests that warn us if
  512|       |    // case="nominative" data differs from no-case data?
  513|  1.52k|    UErrorCode localStatus = U_ZERO_ERROR;
  514|  1.52k|    ures_getAllChildrenWithFallback(unitsBundle.getAlias(), key.data(), sink, localStatus);
  ------------------
  |  | 1657|  1.52k|#define ures_getAllChildrenWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllChildrenWithFallback)
  |  |  ------------------
  |  |  |  |  123|  1.52k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.52k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.52k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  515|  1.52k|    if (width == UNUM_UNIT_WIDTH_SHORT) {
  ------------------
  |  Branch (515:9): [True: 1.52k, False: 0]
  ------------------
  516|  1.52k|        if (U_FAILURE(localStatus)) {
  ------------------
  |  Branch (516:13): [True: 0, False: 1.52k]
  ------------------
  517|      0|            status = localStatus;
  518|      0|        }
  519|  1.52k|        return;
  520|  1.52k|    }
  521|  1.52k|}
number_longnames.cpp:_ZN12_GLOBAL__N_115PluralTableSinkC2EPN6icu_7813UnicodeStringE:
  387|  1.52k|    explicit PluralTableSink(UnicodeString *outArray) : outArray(outArray) {
  388|       |        // Initialize the array to bogus strings.
  389|  19.8k|        for (int32_t i = 0; i < ARRAY_LENGTH; i++) {
  ------------------
  |  Branch (389:29): [True: 18.2k, False: 1.52k]
  ------------------
  390|  18.2k|            outArray[i].setToBogus();
  391|  18.2k|        }
  392|  1.52k|    }
number_longnames.cpp:_ZN12_GLOBAL__N_115PluralTableSink3putEPKcRN6icu_7813ResourceValueEaR10UErrorCode:
  394|  5.59k|    void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) override {
  395|  5.59k|        if (uprv_strcmp(key, "case") == 0) {
  ------------------
  |  |   38|  5.59k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  5.59k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (395:13): [True: 0, False: 5.59k]
  ------------------
  396|      0|            return;
  397|      0|        }
  398|  5.59k|        int32_t index = getIndex(key, status);
  399|  5.59k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (399:13): [True: 0, False: 5.59k]
  ------------------
  400|  5.59k|        if (!outArray[index].isBogus()) {
  ------------------
  |  Branch (400:13): [True: 1.28k, False: 4.30k]
  ------------------
  401|  1.28k|            return;
  402|  1.28k|        }
  403|  4.30k|        outArray[index] = value.getUnicodeString(status);
  404|  4.30k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (404:13): [True: 0, False: 4.30k]
  ------------------
  405|  4.30k|    }
number_longnames.cpp:_ZN12_GLOBAL__N_120maybeCalculateGenderERKN6icu_786LocaleERKNS0_11MeasureUnitEPNS0_13UnicodeStringER10UErrorCode:
  928|  1.52k|                          UErrorCode &status) {
  929|  1.52k|    if (outArray[GENDER_INDEX].isBogus()) {
  ------------------
  |  Branch (929:9): [True: 1.06k, False: 456]
  ------------------
  930|  1.06k|        UnicodeString meterGender = getGenderForBuiltin(locale, MeasureUnit::getMeter(), status);
  931|  1.06k|        if (meterGender.isEmpty()) {
  ------------------
  |  Branch (931:13): [True: 1.06k, False: 0]
  ------------------
  932|       |            // No gender for meter: assume ungendered language
  933|  1.06k|            return;
  934|  1.06k|        }
  935|       |        // We have a gendered language, but are lacking gender for unitRef.
  936|      0|        outArray[GENDER_INDEX] = calculateGenderForUnit(locale, unitRef, status);
  937|      0|    }
  938|  1.52k|}
number_longnames.cpp:_ZN12_GLOBAL__N_115getGenderStringEN6icu_7813UnicodeStringE10UErrorCode:
   67|    456|const char *getGenderString(UnicodeString uGender, UErrorCode status) {
   68|    456|    if (uGender.length() == 0) {
  ------------------
  |  Branch (68:9): [True: 0, False: 456]
  ------------------
   69|      0|        return "";
   70|      0|    }
   71|    456|    CharString gender;
   72|    456|    gender.appendInvariantChars(uGender, status);
   73|    456|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (73:9): [True: 0, False: 456]
  ------------------
   74|      0|        return "";
   75|      0|    }
   76|    456|    int32_t first = 0;
   77|    456|    int32_t last = GENDER_COUNT;
   78|  1.17k|    while (first < last) {
  ------------------
  |  Branch (78:12): [True: 1.17k, False: 0]
  ------------------
   79|  1.17k|        int32_t mid = (first + last) / 2;
   80|  1.17k|        int32_t cmp = uprv_strcmp(gender.data(), gGenders[mid]);
  ------------------
  |  |   38|  1.17k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.17k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   81|  1.17k|        if (cmp == 0) {
  ------------------
  |  Branch (81:13): [True: 456, False: 714]
  ------------------
   82|    456|            return gGenders[mid];
   83|    714|        } else if (cmp > 0) {
  ------------------
  |  Branch (83:20): [True: 338, False: 376]
  ------------------
   84|    338|            first = mid + 1;
   85|    376|        } else if (cmp < 0) {
  ------------------
  |  Branch (85:20): [True: 376, False: 0]
  ------------------
   86|    376|            last = mid;
   87|    376|        }
   88|  1.17k|    }
   89|       |    // We don't return an error in case our gGenders list is incomplete in
   90|       |    // production.
   91|       |    //
   92|       |    // TODO(icu-units#28): a unit test checking all locales' genders are covered
   93|       |    // by gGenders? Else load a complete list of genders found in
   94|       |    // grammaticalFeatures in an initOnce.
   95|      0|    return "";
   96|    456|}
number_longnames.cpp:_ZN12_GLOBAL__N_113getWithPluralEPKN6icu_7813UnicodeStringENS0_14StandardPlural4FormER10UErrorCode:
  132|  12.1k|        UErrorCode& status) {
  133|  12.1k|    UnicodeString result = strings[plural];
  134|  12.1k|    if (result.isBogus()) {
  ------------------
  |  Branch (134:9): [True: 9.41k, False: 2.78k]
  ------------------
  135|  9.41k|        result = strings[StandardPlural::Form::OTHER];
  136|  9.41k|    }
  137|  12.1k|    if (result.isBogus()) {
  ------------------
  |  Branch (137:9): [True: 0, False: 12.1k]
  ------------------
  138|       |        // There should always be data in the "other" plural variant.
  139|      0|        status = U_INTERNAL_PROGRAM_ERROR;
  140|      0|    }
  141|  12.1k|    return result;
  142|  12.1k|}
number_longnames.cpp:_ZN12_GLOBAL__N_119getGenderForBuiltinERKN6icu_786LocaleERKNS0_11MeasureUnitER10UErrorCode:
  196|  1.06k|getGenderForBuiltin(const Locale &locale, const MeasureUnit &builtinUnit, UErrorCode &status) {
  197|  1.06k|    LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_UNIT, locale.getName(), &status));
  ------------------
  |  | 1691|  1.06k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  1.06k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.06k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.06k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_UNIT, locale.getName(), &status));
  ------------------
  |  |   23|  1.06k|#define U_ICUDATA_UNIT U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "unit"
  |  |  ------------------
  |  |  |  |  154|  1.06k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  198|  1.06k|    if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (198:9): [True: 0, False: 1.06k]
  ------------------
  199|       |
  200|       |    // Map duration-year-person, duration-week-person, etc. to duration-year, duration-week, ...
  201|       |    // TODO(ICU-20400): Get duration-*-person data properly with aliases.
  202|  1.06k|    StringPiece subtypeForResource;
  203|  1.06k|    int32_t subtypeLen = static_cast<int32_t>(uprv_strlen(builtinUnit.getSubtype()));
  ------------------
  |  |   37|  1.06k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.06k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  204|  1.06k|    if (subtypeLen > 7 && uprv_strcmp(builtinUnit.getSubtype() + subtypeLen - 7, "-person") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (204:9): [True: 0, False: 1.06k]
  |  Branch (204:27): [True: 0, False: 0]
  ------------------
  205|      0|        subtypeForResource = {builtinUnit.getSubtype(), subtypeLen - 7};
  206|  1.06k|    } else {
  207|  1.06k|        subtypeForResource = builtinUnit.getSubtype();
  208|  1.06k|    }
  209|       |
  210|  1.06k|    CharString key;
  211|  1.06k|    key.append("units/", status);
  212|  1.06k|    key.append(builtinUnit.getType(), status);
  213|  1.06k|    key.append("/", status);
  214|  1.06k|    key.append(subtypeForResource, status);
  215|  1.06k|    key.append("/gender", status);
  216|       |
  217|  1.06k|    UErrorCode localStatus = status;
  218|  1.06k|    int32_t resultLen = 0;
  219|  1.06k|    const char16_t *result =
  220|  1.06k|        ures_getStringByKeyWithFallback(unitsBundle.getAlias(), key.data(), &resultLen, &localStatus);
  ------------------
  |  | 1678|  1.06k|#define ures_getStringByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getStringByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  1.06k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.06k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.06k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  221|  1.06k|    if (U_SUCCESS(localStatus)) {
  ------------------
  |  Branch (221:9): [True: 0, False: 1.06k]
  ------------------
  222|      0|        status = localStatus;
  223|      0|        return UnicodeString(true, result, resultLen);
  224|  1.06k|    } else {
  225|       |        // TODO(icu-units#28): "$unitRes/gender" does not exist. Do we want to
  226|       |        // check whether the parent "$unitRes" exists? Then we could return
  227|       |        // U_MISSING_RESOURCE_ERROR for incorrect usage (e.g. builtinUnit not
  228|       |        // being a builtin).
  229|  1.06k|        return {};
  230|  1.06k|    }
  231|  1.06k|}
number_longnames.cpp:_ZN12_GLOBAL__N_18getIndexEPKcR10UErrorCode:
   99|  5.59k|int32_t getIndex(const char* pluralKeyword, UErrorCode& status) {
  100|       |    // pluralKeyword can also be "dnam", "per", or "gender"
  101|  5.59k|    switch (*pluralKeyword) {
  102|  2.27k|    case 'd':
  ------------------
  |  Branch (102:5): [True: 2.27k, False: 3.31k]
  ------------------
  103|  2.27k|        if (uprv_strcmp(pluralKeyword + 1, "nam") == 0) {
  ------------------
  |  |   38|  2.27k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  2.27k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (103:13): [True: 2.27k, False: 0]
  ------------------
  104|  2.27k|            return DNAM_INDEX;
  105|  2.27k|        }
  106|      0|        break;
  107|      0|    case 'g':
  ------------------
  |  Branch (107:5): [True: 0, False: 5.59k]
  ------------------
  108|      0|        if (uprv_strcmp(pluralKeyword + 1, "ender") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (108:13): [True: 0, False: 0]
  ------------------
  109|      0|            return GENDER_INDEX;
  110|      0|        }
  111|      0|        break;
  112|      0|    case 'p':
  ------------------
  |  Branch (112:5): [True: 0, False: 5.59k]
  ------------------
  113|      0|        if (uprv_strcmp(pluralKeyword + 1, "er") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (113:13): [True: 0, False: 0]
  ------------------
  114|      0|            return PER_INDEX;
  115|      0|        }
  116|      0|        break;
  117|  3.31k|    default:
  ------------------
  |  Branch (117:5): [True: 3.31k, False: 2.27k]
  ------------------
  118|  3.31k|        break;
  119|  5.59k|    }
  120|  3.31k|    StandardPlural::Form plural = StandardPlural::fromString(pluralKeyword, status);
  121|  3.31k|    return plural;
  122|  5.59k|}

_ZN6icu_786number4impl15LongNameHandlerC2Ev:
   93|  1.52k|    LongNameHandler() : rules(nullptr), parent(nullptr) {
   94|  1.52k|    }

_ZNK6icu_786number4impl10MicroProps15processQuantityERNS1_15DecimalQuantityERS2_R10UErrorCode:
  171|  9.33k|                         UErrorCode &status) const override {
  172|  9.33k|        (void) quantity;
  173|  9.33k|        (void) status;
  174|  9.33k|        if (this == &micros) {
  ------------------
  |  Branch (174:13): [True: 9.33k, False: 0]
  ------------------
  175|       |            // Unsafe path: no need to perform a copy.
  176|  9.33k|            U_ASSERT(!exhausted);
  ------------------
  |  |   35|  9.33k|#   define U_ASSERT(exp) (void)0
  ------------------
  177|  9.33k|            micros.exhausted = true;
  178|  9.33k|            U_ASSERT(exhausted);
  ------------------
  |  |   35|  9.33k|#   define U_ASSERT(exp) (void)0
  ------------------
  179|  9.33k|        } else {
  180|       |            // Safe path: copy self into the output micros.
  181|      0|            U_ASSERT(!exhausted);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  182|      0|            micros = *this;
  183|      0|        }
  184|  9.33k|    }
_ZN6icu_786number4impl11IntMeasuresC2Ev:
   40|  9.45k|    IntMeasures() : MaybeStackArray<int64_t, 2>() {}
_ZN6icu_786number4impl10MicroPropsC2Ev:
  150|  9.45k|    MicroProps() = default;

_ZN6icu_786number4impl8ModifierD2Ev:
   54|  71.5k|Modifier::~Modifier() = default;
_ZN6icu_786number4impl8Modifier10ParametersC2Ev:
   57|  21.6k|        : obj(nullptr) {}
_ZN6icu_786number4impl8Modifier10ParametersC2EPKNS1_13ModifierStoreENS1_6SignumENS_14StandardPlural4FormE:
   61|  12.1k|        : obj(_obj), signum(_signum), plural(_plural) {}
_ZN6icu_786number4impl13ModifierStoreD2Ev:
   98|  1.52k|ModifierStore::~ModifierStore() = default;
_ZN6icu_786number4impl14SimpleModifierC2ERKNS_15SimpleFormatterENS_22FormattedStringBuilder5FieldEbNS1_8Modifier10ParametersE:
  165|  12.1k|        : fCompiledPattern(simpleFormatter.compiledPattern), fField(field), fStrong(strong),
  166|  12.1k|          fParameters(parameters) {
  167|  12.1k|    int32_t argLimit = SimpleFormatter::getArgumentLimit(
  168|  12.1k|            fCompiledPattern.getBuffer(), fCompiledPattern.length());
  169|  12.1k|    if (argLimit == 0) {
  ------------------
  |  Branch (169:9): [True: 0, False: 12.1k]
  ------------------
  170|       |        // No arguments in compiled pattern
  171|      0|        fPrefixLength = fCompiledPattern.charAt(1) - ARG_NUM_LIMIT;
  172|      0|        U_ASSERT(2 + fPrefixLength == fCompiledPattern.length());
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  173|       |        // Set suffixOffset = -1 to indicate no arguments in compiled pattern.
  174|      0|        fSuffixOffset = -1;
  175|      0|        fSuffixLength = 0;
  176|  12.1k|    } else {
  177|  12.1k|        U_ASSERT(argLimit == 1);
  ------------------
  |  |   35|  12.1k|#   define U_ASSERT(exp) (void)0
  ------------------
  178|  12.1k|        if (fCompiledPattern.charAt(1) != 0) {
  ------------------
  |  Branch (178:13): [True: 256, False: 11.9k]
  ------------------
  179|       |            // Found prefix
  180|    256|            fPrefixLength = fCompiledPattern.charAt(1) - ARG_NUM_LIMIT;
  181|    256|            fSuffixOffset = 3 + fPrefixLength;
  182|  11.9k|        } else {
  183|       |            // No prefix
  184|  11.9k|            fPrefixLength = 0;
  185|  11.9k|            fSuffixOffset = 2;
  186|  11.9k|        }
  187|  12.1k|        if (3 + fPrefixLength < fCompiledPattern.length()) {
  ------------------
  |  Branch (187:13): [True: 11.9k, False: 256]
  ------------------
  188|       |            // Found suffix
  189|  11.9k|            fSuffixLength = fCompiledPattern.charAt(fSuffixOffset) - ARG_NUM_LIMIT;
  190|  11.9k|        } else {
  191|       |            // No suffix
  192|    256|            fSuffixLength = 0;
  193|    256|        }
  194|  12.1k|    }
  195|  12.1k|}
_ZN6icu_786number4impl14SimpleModifierC2Ev:
  198|  21.6k|        : fField(kUndefinedField), fStrong(false), fPrefixLength(0), fSuffixLength(0) {
  199|  21.6k|}
_ZNK6icu_786number4impl14SimpleModifier5applyERNS_22FormattedStringBuilderEiiR10UErrorCode:
  202|  1.52k|                              UErrorCode &status) const {
  203|  1.52k|    return formatAsPrefixSuffix(output, leftIndex, rightIndex, status);
  204|  1.52k|}
_ZNK6icu_786number4impl14SimpleModifier20formatAsPrefixSuffixERNS_22FormattedStringBuilderEiiR10UErrorCode:
  248|  1.52k|                                     UErrorCode &status) const {
  249|  1.52k|    if (fSuffixOffset == -1 && fPrefixLength + fSuffixLength > 0) {
  ------------------
  |  Branch (249:9): [True: 0, False: 1.52k]
  |  Branch (249:32): [True: 0, False: 0]
  ------------------
  250|       |        // There is no argument for the inner number; overwrite the entire segment with our string.
  251|      0|        return result.splice(startIndex, endIndex, fCompiledPattern, 2, 2 + fPrefixLength, fField, status);
  252|  1.52k|    } else {
  253|  1.52k|        if (fPrefixLength > 0) {
  ------------------
  |  Branch (253:13): [True: 32, False: 1.49k]
  ------------------
  254|     32|            result.insert(startIndex, fCompiledPattern, 2, 2 + fPrefixLength, fField, status);
  255|     32|        }
  256|  1.52k|        if (fSuffixLength > 0) {
  ------------------
  |  Branch (256:13): [True: 1.49k, False: 32]
  ------------------
  257|  1.49k|            result.insert(
  258|  1.49k|                    endIndex + fPrefixLength,
  259|  1.49k|                    fCompiledPattern,
  260|  1.49k|                    1 + fSuffixOffset,
  261|  1.49k|                    1 + fSuffixOffset + fSuffixLength,
  262|  1.49k|                    fField,
  263|  1.49k|                    status);
  264|  1.49k|        }
  265|  1.52k|        return fPrefixLength + fSuffixLength;
  266|  1.52k|    }
  267|  1.52k|}
_ZN6icu_786number4impl30CurrencySpacingEnabledModifier20applyCurrencySpacingERNS_22FormattedStringBuilderEiiiiRKNS_20DecimalFormatSymbolsER10UErrorCode:
  448|  9.33k|                                                     UErrorCode &status) {
  449|  9.33k|    int length = 0;
  450|  9.33k|    bool hasPrefix = (prefixLen > 0);
  451|  9.33k|    bool hasSuffix = (suffixLen > 0);
  452|  9.33k|    bool hasNumber = (suffixStart - prefixStart - prefixLen > 0); // could be empty string
  453|  9.33k|    if (hasPrefix && hasNumber) {
  ------------------
  |  Branch (453:9): [True: 3.16k, False: 6.17k]
  |  Branch (453:22): [True: 3.14k, False: 15]
  ------------------
  454|  3.14k|        length += applyCurrencySpacingAffix(output, prefixStart + prefixLen, PREFIX, symbols, status);
  455|  3.14k|    }
  456|  9.33k|    if (hasSuffix && hasNumber) {
  ------------------
  |  Branch (456:9): [True: 2.46k, False: 6.87k]
  |  Branch (456:22): [True: 2.46k, False: 0]
  ------------------
  457|  2.46k|        length += applyCurrencySpacingAffix(output, suffixStart + length, SUFFIX, symbols, status);
  458|  2.46k|    }
  459|  9.33k|    return length;
  460|  9.33k|}
_ZN6icu_786number4impl30CurrencySpacingEnabledModifier25applyCurrencySpacingAffixERNS_22FormattedStringBuilderEiNS2_6EAffixERKNS_20DecimalFormatSymbolsER10UErrorCode:
  466|  5.60k|                                                          UErrorCode &status) {
  467|       |    // NOTE: For prefix, output.fieldAt(index-1) gets the last field type in the prefix.
  468|       |    // This works even if the last code point in the prefix is 2 code units because the
  469|       |    // field value gets populated to both indices in the field array.
  470|  5.60k|    Field affixField = (affix == PREFIX) ? output.fieldAt(index - 1) : output.fieldAt(index);
  ------------------
  |  Branch (470:24): [True: 3.14k, False: 2.46k]
  ------------------
  471|  5.60k|    if (affixField != Field(UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD)) {
  ------------------
  |  Branch (471:9): [True: 5.60k, False: 0]
  ------------------
  472|  5.60k|        return 0;
  473|  5.60k|    }
  474|      0|    int affixCp = (affix == PREFIX) ? output.codePointBefore(index) : output.codePointAt(index);
  ------------------
  |  Branch (474:19): [True: 0, False: 0]
  ------------------
  475|      0|    UnicodeSet affixUniset = getUnicodeSet(symbols, IN_CURRENCY, affix, status);
  476|      0|    if (!affixUniset.contains(affixCp)) {
  ------------------
  |  Branch (476:9): [True: 0, False: 0]
  ------------------
  477|      0|        return 0;
  478|      0|    }
  479|      0|    int numberCp = (affix == PREFIX) ? output.codePointAt(index) : output.codePointBefore(index);
  ------------------
  |  Branch (479:20): [True: 0, False: 0]
  ------------------
  480|      0|    UnicodeSet numberUniset = getUnicodeSet(symbols, IN_NUMBER, affix, status);
  481|      0|    if (!numberUniset.contains(numberCp)) {
  ------------------
  |  Branch (481:9): [True: 0, False: 0]
  ------------------
  482|      0|        return 0;
  483|      0|    }
  484|      0|    UnicodeString spacingString = getInsertString(symbols, affix, status);
  485|       |
  486|       |    // NOTE: This next line *inserts* the spacing string, triggering an arraycopy.
  487|       |    // It would be more efficient if this could be done before affixes were attached,
  488|       |    // so that it could be prepended/appended instead of inserted.
  489|       |    // However, the build code path is more efficient, and this is the most natural
  490|       |    // place to put currency spacing in the non-build code path.
  491|       |    // TODO: Should we use the CURRENCY field here?
  492|      0|    return output.insert(index, spacingString, kUndefinedField, status);
  493|      0|}

_ZN6icu_786number4impl13EmptyModifierC2Eb:
  235|  18.9k|    explicit EmptyModifier(bool isStrong) : fStrong(isStrong) {}
_ZNK6icu_786number4impl13EmptyModifier5applyERNS_22FormattedStringBuilderEiiR10UErrorCode:
  238|  16.9k|                  UErrorCode &status) const override {
  239|  16.9k|        (void)output;
  240|  16.9k|        (void)leftIndex;
  241|  16.9k|        (void)rightIndex;
  242|  16.9k|        (void)status;
  243|  16.9k|        return 0;
  244|  16.9k|    }

_ZN6icu_786number5ScaleC2EiPNS0_4impl6DecNumE:
   26|  1.35k|        : fMagnitude(magnitude), fArbitrary(arbitraryToAdopt), fError(U_ZERO_ERROR) {
   27|  1.35k|    if (fArbitrary != nullptr) {
  ------------------
  |  Branch (27:9): [True: 1.33k, False: 19]
  ------------------
   28|       |        // Attempt to convert the DecNum to a magnitude multiplier.
   29|  1.33k|        fArbitrary->normalize();
   30|  1.33k|        if (fArbitrary->getRawDecNumber()->digits == 1 && fArbitrary->getRawDecNumber()->lsu[0] == 1 &&
  ------------------
  |  Branch (30:13): [True: 876, False: 459]
  |  Branch (30:59): [True: 291, False: 585]
  ------------------
   31|  1.33k|            !fArbitrary->isNegative()) {
  ------------------
  |  Branch (31:13): [True: 289, False: 2]
  ------------------
   32|       |            // Success!
   33|    289|            fMagnitude += fArbitrary->getRawDecNumber()->exponent;
   34|    289|            delete fArbitrary;
   35|    289|            fArbitrary = nullptr;
   36|    289|        }
   37|  1.33k|    }
   38|  1.35k|}
_ZN6icu_786number5ScaleaSERKS1_:
   48|  11.1k|Scale& Scale::operator=(const Scale& other) {
   49|  11.1k|    if (this == &other) { return *this; }  // self-assignment: no-op
  ------------------
  |  Branch (49:9): [True: 0, False: 11.1k]
  ------------------
   50|  11.1k|    fMagnitude = other.fMagnitude;
   51|  11.1k|    if (other.fArbitrary != nullptr) {
  ------------------
  |  Branch (51:9): [True: 4.12k, False: 7.04k]
  ------------------
   52|  4.12k|        UErrorCode localStatus = U_ZERO_ERROR;
   53|  4.12k|        fArbitrary = new DecNum(*other.fArbitrary, localStatus);
   54|  7.04k|    } else {
   55|  7.04k|        fArbitrary = nullptr;
   56|  7.04k|    }
   57|  11.1k|    fError = other.fError;
   58|  11.1k|    return *this;
   59|  11.1k|}
_ZN6icu_786number5ScaleC2EOS1_:
   62|  3.80k|        : fMagnitude(src.fMagnitude), fArbitrary(src.fArbitrary), fError(src.fError) {
   63|       |    // Take ownership away from src if necessary
   64|  3.80k|    src.fArbitrary = nullptr;
   65|  3.80k|}
_ZN6icu_786number5ScaleaSEOS1_:
   67|  1.35k|Scale& Scale::operator=(Scale&& src) noexcept {
   68|  1.35k|    fMagnitude = src.fMagnitude;
   69|  1.35k|    delete fArbitrary;
   70|  1.35k|    fArbitrary = src.fArbitrary;
   71|  1.35k|    fError = src.fError;
   72|       |    // Take ownership away from src if necessary
   73|  1.35k|    src.fArbitrary = nullptr;
   74|  1.35k|    return *this;
   75|  1.35k|}
_ZN6icu_786number5ScaleD2Ev:
   77|  28.7k|Scale::~Scale() {
   78|  28.7k|    delete fArbitrary;
   79|  28.7k|}
_ZN6icu_786number5Scale10powerOfTenEi:
   86|     19|Scale Scale::powerOfTen(int32_t power) {
   87|     19|    return {power, nullptr};
   88|     19|}
_ZNK6icu_786number5Scale7applyToERNS0_4impl15DecimalQuantityE:
  129|  2.63k|void Scale::applyTo(impl::DecimalQuantity& quantity) const {
  130|  2.63k|    quantity.adjustMagnitude(fMagnitude);
  131|  2.63k|    if (fArbitrary != nullptr) {
  ------------------
  |  Branch (131:9): [True: 2.05k, False: 576]
  ------------------
  132|  2.05k|        UErrorCode localStatus = U_ZERO_ERROR;
  133|  2.05k|        quantity.multiplyBy(*fArbitrary, localStatus);
  134|  2.05k|    }
  135|  2.63k|}
_ZN6icu_786number4impl23MultiplierFormatHandler11setAndChainERKNS0_5ScaleEPKNS1_19MicroPropsGeneratorE:
  147|  2.63k|MultiplierFormatHandler::setAndChain(const Scale& multiplier, const MicroPropsGenerator* parent) {
  148|  2.63k|    fMultiplier = multiplier;
  149|  2.63k|    fParent = parent;
  150|  2.63k|}
_ZNK6icu_786number4impl23MultiplierFormatHandler15processQuantityERNS1_15DecimalQuantityERNS1_10MicroPropsER10UErrorCode:
  153|  2.63k|                                              UErrorCode& status) const {
  154|  2.63k|    fParent->processQuantity(quantity, micros, status);
  155|  2.63k|    fMultiplier.applyTo(quantity);
  156|  2.63k|}

_ZN6icu_786number4impl23MultiplierFormatHandlerC2Ev:
   22|  9.45k|    MultiplierFormatHandler() = default; // WARNING: Leaves object in an unusable state; call setAndChain()

_ZN6icu_786number8Notation10scientificEv:
   16|     99|ScientificNotation Notation::scientific() {
   17|       |    // NOTE: ISO C++ does not allow C99 designated initializers.
   18|     99|    ScientificSettings settings;
   19|     99|    settings.fEngineeringInterval = 1;
   20|     99|    settings.fRequireMinInt = false;
   21|     99|    settings.fMinExponentDigits = 1;
   22|     99|    settings.fExponentSignDisplay = UNUM_SIGN_AUTO;
   23|     99|    NotationUnion union_;
   24|     99|    union_.scientific = settings;
   25|     99|    return {NTN_SCIENTIFIC, union_};
   26|     99|}
_ZN6icu_786number8Notation11engineeringEv:
   28|      5|ScientificNotation Notation::engineering() {
   29|      5|    ScientificSettings settings;
   30|      5|    settings.fEngineeringInterval = 3;
   31|      5|    settings.fRequireMinInt = false;
   32|      5|    settings.fMinExponentDigits = 1;
   33|      5|    settings.fExponentSignDisplay = UNUM_SIGN_AUTO;
   34|      5|    NotationUnion union_;
   35|      5|    union_.scientific = settings;
   36|      5|    return {NTN_SCIENTIFIC, union_};
   37|      5|}
_ZN6icu_786number8Notation12compactShortEv:
   52|  1.66k|Notation Notation::compactShort() {
   53|  1.66k|    NotationUnion union_;
   54|  1.66k|    union_.compactStyle = CompactStyle::UNUM_SHORT;
   55|  1.66k|    return {NTN_COMPACT, union_};
   56|  1.66k|}
_ZN6icu_786number8Notation11compactLongEv:
   58|     58|Notation Notation::compactLong() {
   59|     58|    NotationUnion union_;
   60|     58|    union_.compactStyle = CompactStyle::UNUM_LONG;
   61|     58|    return {NTN_COMPACT, union_};
   62|     58|}
_ZNK6icu_786number18ScientificNotation21withMinExponentDigitsEi:
   69|    104|ScientificNotation::withMinExponentDigits(int32_t minExponentDigits) const {
   70|    104|    if (minExponentDigits >= 1 && minExponentDigits <= kMaxIntFracSig) {
  ------------------
  |  Branch (70:9): [True: 104, False: 0]
  |  Branch (70:35): [True: 101, False: 3]
  ------------------
   71|    101|        ScientificSettings settings = fUnion.scientific;
   72|    101|        settings.fMinExponentDigits = static_cast<digits_t>(minExponentDigits);
   73|    101|        NotationUnion union_ = {settings};
   74|    101|        return {NTN_SCIENTIFIC, union_};
   75|    101|    } else {
   76|      3|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
   77|      3|    }
   78|    104|}
_ZNK6icu_786number18ScientificNotation23withExponentSignDisplayE18UNumberSignDisplay:
   81|    104|ScientificNotation::withExponentSignDisplay(UNumberSignDisplay exponentSignDisplay) const {
   82|    104|    ScientificSettings settings = fUnion.scientific;
   83|    104|    settings.fExponentSignDisplay = exponentSignDisplay;
   84|    104|    NotationUnion union_ = {settings};
   85|    104|    return {NTN_SCIENTIFIC, union_};
   86|    104|}

_ZN6icu_786number4impl20UFormattedNumberDataD2Ev:
   54|  9.45k|impl::UFormattedNumberData::~UFormattedNumberData() = default;

_ZN6icu_786number4impl6PadderC2Ei:
   37|  9.33k|Padder::Padder(int32_t width) : fWidth(width) {}
_ZN6icu_786number4impl6Padder4noneEv:
   39|  9.33k|Padder Padder::none() {
   40|  9.33k|    return {-1};
   41|  9.33k|}

_ZN6icu_786number4impl20AffixPatternProviderD2Ev:
   20|  12.7k|AffixPatternProvider::~AffixPatternProvider() = default;
_ZN6icu_786number4impl22MutablePatternModifierC2Eb:
   24|  9.33k|        : fStrong(isStrong) {}
_ZN6icu_786number4impl22MutablePatternModifier14setPatternInfoEPKNS1_20AffixPatternProviderENS_22FormattedStringBuilder5FieldE:
   26|  11.7k|void MutablePatternModifier::setPatternInfo(const AffixPatternProvider* patternInfo, Field field) {
   27|  11.7k|    fPatternInfo = patternInfo;
   28|  11.7k|    fField = field;
   29|  11.7k|}
_ZN6icu_786number4impl22MutablePatternModifier20setPatternAttributesE18UNumberSignDisplaybb:
   34|  9.33k|        bool approximately) {
   35|  9.33k|    fSignDisplay = signDisplay;
   36|  9.33k|    fPerMilleReplacesPercent = perMille;
   37|  9.33k|    fApproximately = approximately;
   38|  9.33k|}
_ZN6icu_786number4impl22MutablePatternModifier10setSymbolsEPKNS_20DecimalFormatSymbolsERKNS_12CurrencyUnitE16UNumberUnitWidthPKNS_11PluralRulesER10UErrorCode:
   44|  9.33k|                                        UErrorCode& status) {
   45|  9.33k|    U_ASSERT((rules != nullptr) == needsPlurals());
  ------------------
  |  |   35|  9.33k|#   define U_ASSERT(exp) (void)0
  ------------------
   46|  9.33k|    fSymbols = symbols;
   47|  9.33k|    fCurrencySymbols = {currency, symbols->getLocale(), *symbols, status};
   48|  9.33k|    fUnitWidth = unitWidth;
   49|  9.33k|    fRules = rules;
   50|  9.33k|}
_ZN6icu_786number4impl22MutablePatternModifier19setNumberPropertiesENS1_6SignumENS_14StandardPlural4FormE:
   52|  9.33k|void MutablePatternModifier::setNumberProperties(Signum signum, StandardPlural::Form plural) {
   53|  9.33k|    fSignum = signum;
   54|  9.33k|    fPlural = plural;
   55|  9.33k|}
_ZNK6icu_786number4impl22MutablePatternModifier12needsPluralsEv:
   57|  16.2k|bool MutablePatternModifier::needsPlurals() const {
   58|  16.2k|    UErrorCode statusLocal = U_ZERO_ERROR;
   59|  16.2k|    return fPatternInfo->containsSymbolType(AffixPatternType::TYPE_CURRENCY_TRIPLE, statusLocal);
   60|       |    // Silently ignore any error codes.
   61|  16.2k|}
_ZN6icu_786number4impl22MutablePatternModifier10addToChainEPKNS1_19MicroPropsGeneratorE:
  165|  9.33k|MicroPropsGenerator& MutablePatternModifier::addToChain(const MicroPropsGenerator* parent) {
  166|  9.33k|    fParent = parent;
  167|  9.33k|    return *this;
  168|  9.33k|}
_ZNK6icu_786number4impl22MutablePatternModifier15processQuantityERNS1_15DecimalQuantityERNS1_10MicroPropsER10UErrorCode:
  171|  9.33k|                                             UErrorCode& status) const {
  172|  9.33k|    fParent->processQuantity(fq, micros, status);
  173|  9.33k|    micros.rounder.apply(fq, status);
  174|  9.33k|    if (micros.modMiddle != nullptr) {
  ------------------
  |  Branch (174:9): [True: 2.45k, False: 6.88k]
  ------------------
  175|  2.45k|        return;
  176|  2.45k|    }
  177|       |    // The unsafe code path performs self-mutation, so we need a const_cast.
  178|       |    // This method needs to be const because it overrides a const method in the parent class.
  179|  6.88k|    auto* nonConstThis = const_cast<MutablePatternModifier*>(this);
  180|  6.88k|    if (needsPlurals()) {
  ------------------
  |  Branch (180:9): [True: 0, False: 6.88k]
  ------------------
  181|      0|        StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, fRules, fq, status);
  182|      0|        nonConstThis->setNumberProperties(fq.signum(), pluralForm);
  183|  6.88k|    } else {
  184|  6.88k|        nonConstThis->setNumberProperties(fq.signum(), StandardPlural::Form::COUNT);
  185|  6.88k|    }
  186|  6.88k|    micros.modMiddle = this;
  187|  6.88k|}
_ZNK6icu_786number4impl22MutablePatternModifier5applyERNS_22FormattedStringBuilderEiiR10UErrorCode:
  190|  9.33k|                                      UErrorCode& status) const {
  191|       |    // The unsafe code path performs self-mutation, so we need a const_cast.
  192|       |    // This method needs to be const because it overrides a const method in the parent class.
  193|  9.33k|    auto* nonConstThis = const_cast<MutablePatternModifier*>(this);
  194|  9.33k|    int32_t prefixLen = nonConstThis->insertPrefix(output, leftIndex, status);
  195|  9.33k|    int32_t suffixLen = nonConstThis->insertSuffix(output, rightIndex + prefixLen, status);
  196|       |    // If the pattern had no decimal stem body (like #,##0.00), overwrite the value.
  197|  9.33k|    int32_t overwriteLen = 0;
  198|  9.33k|    if (!fPatternInfo->hasBody()) {
  ------------------
  |  Branch (198:9): [True: 15, False: 9.31k]
  ------------------
  199|     15|        overwriteLen = output.splice(
  200|     15|                leftIndex + prefixLen,
  201|     15|                rightIndex + prefixLen,
  202|     15|                UnicodeString(),
  203|     15|                0,
  204|     15|                0,
  205|     15|                kUndefinedField,
  206|     15|                status);
  207|     15|    }
  208|  9.33k|    CurrencySpacingEnabledModifier::applyCurrencySpacing(
  209|  9.33k|            output,
  210|  9.33k|            leftIndex,
  211|  9.33k|            prefixLen,
  212|  9.33k|            rightIndex + overwriteLen + prefixLen,
  213|  9.33k|            suffixLen,
  214|  9.33k|            *fSymbols,
  215|  9.33k|            status);
  216|  9.33k|    return prefixLen + overwriteLen + suffixLen;
  217|  9.33k|}
_ZN6icu_786number4impl22MutablePatternModifier12insertPrefixERNS_22FormattedStringBuilderEiR10UErrorCode:
  267|  9.33k|int32_t MutablePatternModifier::insertPrefix(FormattedStringBuilder& sb, int position, UErrorCode& status) {
  268|  9.33k|    prepareAffix(true);
  269|  9.33k|    int32_t length = AffixUtils::unescape(currentAffix, sb, position, *this, fField, status);
  270|  9.33k|    return length;
  271|  9.33k|}
_ZN6icu_786number4impl22MutablePatternModifier12insertSuffixERNS_22FormattedStringBuilderEiR10UErrorCode:
  273|  9.33k|int32_t MutablePatternModifier::insertSuffix(FormattedStringBuilder& sb, int position, UErrorCode& status) {
  274|  9.33k|    prepareAffix(false);
  275|  9.33k|    int32_t length = AffixUtils::unescape(currentAffix, sb, position, *this, fField, status);
  276|  9.33k|    return length;
  277|  9.33k|}
_ZN6icu_786number4impl22MutablePatternModifier12prepareAffixEb:
  280|  18.6k|void MutablePatternModifier::prepareAffix(bool isPrefix) {
  281|  18.6k|    PatternStringUtils::patternInfoToStringBuilder(
  282|  18.6k|            *fPatternInfo,
  283|  18.6k|            isPrefix,
  284|  18.6k|            PatternStringUtils::resolveSignDisplay(fSignDisplay, fSignum),
  285|  18.6k|            fApproximately,
  286|  18.6k|            fPlural,
  287|  18.6k|            fPerMilleReplacesPercent,
  288|  18.6k|            false, // dropCurrencySymbols
  289|  18.6k|            currentAffix);
  290|  18.6k|}
_ZNK6icu_786number4impl22MutablePatternModifier9getSymbolENS1_16AffixPatternTypeE:
  292|  3.21k|UnicodeString MutablePatternModifier::getSymbol(AffixPatternType type) const {
  293|  3.21k|    UErrorCode localStatus = U_ZERO_ERROR;
  294|  3.21k|    switch (type) {
  295|  3.10k|        case AffixPatternType::TYPE_MINUS_SIGN:
  ------------------
  |  Branch (295:9): [True: 3.10k, False: 107]
  ------------------
  296|  3.10k|            return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kMinusSignSymbol);
  297|     21|        case AffixPatternType::TYPE_PLUS_SIGN:
  ------------------
  |  Branch (297:9): [True: 21, False: 3.18k]
  ------------------
  298|     21|            return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPlusSignSymbol);
  299|      0|        case AffixPatternType::TYPE_APPROXIMATELY_SIGN:
  ------------------
  |  Branch (299:9): [True: 0, False: 3.21k]
  ------------------
  300|      0|            return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kApproximatelySignSymbol);
  301|     86|        case AffixPatternType::TYPE_PERCENT:
  ------------------
  |  Branch (301:9): [True: 86, False: 3.12k]
  ------------------
  302|     86|            return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPercentSymbol);
  303|      0|        case AffixPatternType::TYPE_PERMILLE:
  ------------------
  |  Branch (303:9): [True: 0, False: 3.21k]
  ------------------
  304|      0|            return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPerMillSymbol);
  305|      0|        case AffixPatternType::TYPE_CURRENCY_SINGLE:
  ------------------
  |  Branch (305:9): [True: 0, False: 3.21k]
  ------------------
  306|      0|            return getCurrencySymbolForUnitWidth(localStatus);
  307|      0|        case AffixPatternType::TYPE_CURRENCY_DOUBLE:
  ------------------
  |  Branch (307:9): [True: 0, False: 3.21k]
  ------------------
  308|      0|            return fCurrencySymbols.getIntlCurrencySymbol(localStatus);
  309|      0|        case AffixPatternType::TYPE_CURRENCY_TRIPLE:
  ------------------
  |  Branch (309:9): [True: 0, False: 3.21k]
  ------------------
  310|       |            // NOTE: This is the code path only for patterns containing "¤¤¤".
  311|       |            // Plural currencies set via the API are formatted in LongNameHandler.
  312|       |            // This code path is used by DecimalFormat via CurrencyPluralInfo.
  313|      0|            U_ASSERT(fPlural != StandardPlural::Form::COUNT);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  314|      0|            return fCurrencySymbols.getPluralName(fPlural, localStatus);
  315|      0|        case AffixPatternType::TYPE_CURRENCY_QUAD:
  ------------------
  |  Branch (315:9): [True: 0, False: 3.21k]
  ------------------
  316|      0|            return UnicodeString(u"\uFFFD");
  317|      0|        case AffixPatternType::TYPE_CURRENCY_QUINT:
  ------------------
  |  Branch (317:9): [True: 0, False: 3.21k]
  ------------------
  318|      0|            return UnicodeString(u"\uFFFD");
  319|      0|        default:
  ------------------
  |  Branch (319:9): [True: 0, False: 3.21k]
  ------------------
  320|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  321|  3.21k|    }
  322|  3.21k|}

_ZN6icu_786number4impl22MutablePatternModifierD2Ev:
   83|  9.33k|    ~MutablePatternModifier() override = default;

_ZN6icu_786number4impl13PatternParser18parseToPatternInfoERKNS_13UnicodeStringERNS1_17ParsedPatternInfoER10UErrorCode:
   26|  11.7k|                                       UErrorCode& status) {
   27|  11.7k|    patternInfo.consumePattern(patternString, status);
   28|  11.7k|}
_ZNK6icu_786number4impl17ParsedPatternInfo6charAtEii:
   50|  8.95k|char16_t ParsedPatternInfo::charAt(int32_t flags, int32_t index) const {
   51|  8.95k|    const Endpoints& endpoints = getEndpoints(flags);
   52|  8.95k|    if (index < 0 || index >= endpoints.end - endpoints.start) {
  ------------------
  |  Branch (52:9): [True: 0, False: 8.95k]
  |  Branch (52:22): [True: 0, False: 8.95k]
  ------------------
   53|      0|        UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
   54|      0|    }
   55|  8.95k|    return pattern.charAt(endpoints.start + index);
   56|  8.95k|}
_ZNK6icu_786number4impl17ParsedPatternInfo6lengthEi:
   58|  18.6k|int32_t ParsedPatternInfo::length(int32_t flags) const {
   59|  18.6k|    return getLengthFromEndpoints(getEndpoints(flags));
   60|  18.6k|}
_ZN6icu_786number4impl17ParsedPatternInfo22getLengthFromEndpointsERKNS1_9EndpointsE:
   62|  18.6k|int32_t ParsedPatternInfo::getLengthFromEndpoints(const Endpoints& endpoints) {
   63|  18.6k|    return endpoints.end - endpoints.start;
   64|  18.6k|}
_ZNK6icu_786number4impl17ParsedPatternInfo12getEndpointsEi:
   75|  27.6k|const Endpoints& ParsedPatternInfo::getEndpoints(int32_t flags) const {
   76|  27.6k|    bool prefix = (flags & AFFIX_PREFIX) != 0;
   77|  27.6k|    bool isNegative = (flags & AFFIX_NEGATIVE_SUBPATTERN) != 0;
   78|  27.6k|    bool padding = (flags & AFFIX_PADDING) != 0;
   79|  27.6k|    if (isNegative && padding) {
  ------------------
  |  Branch (79:9): [True: 109, False: 27.5k]
  |  Branch (79:23): [True: 0, False: 109]
  ------------------
   80|      0|        return negative.paddingEndpoints;
   81|  27.6k|    } else if (padding) {
  ------------------
  |  Branch (81:16): [True: 0, False: 27.6k]
  ------------------
   82|      0|        return positive.paddingEndpoints;
   83|  27.6k|    } else if (prefix && isNegative) {
  ------------------
  |  Branch (83:16): [True: 9.78k, False: 17.8k]
  |  Branch (83:26): [True: 89, False: 9.69k]
  ------------------
   84|     89|        return negative.prefixEndpoints;
   85|  27.5k|    } else if (prefix) {
  ------------------
  |  Branch (85:16): [True: 9.69k, False: 17.8k]
  ------------------
   86|  9.69k|        return positive.prefixEndpoints;
   87|  17.8k|    } else if (isNegative) {
  ------------------
  |  Branch (87:16): [True: 20, False: 17.8k]
  ------------------
   88|     20|        return negative.suffixEndpoints;
   89|  17.8k|    } else {
   90|  17.8k|        return positive.suffixEndpoints;
   91|  17.8k|    }
   92|  27.6k|}
_ZNK6icu_786number4impl17ParsedPatternInfo19positiveHasPlusSignEv:
   94|     36|bool ParsedPatternInfo::positiveHasPlusSign() const {
   95|     36|    return positive.hasPlusSign;
   96|     36|}
_ZNK6icu_786number4impl17ParsedPatternInfo21hasNegativeSubpatternEv:
   98|  18.6k|bool ParsedPatternInfo::hasNegativeSubpattern() const {
   99|  18.6k|    return fHasNegativeSubpattern;
  100|  18.6k|}
_ZNK6icu_786number4impl17ParsedPatternInfo20negativeHasMinusSignEv:
  102|     30|bool ParsedPatternInfo::negativeHasMinusSign() const {
  103|     30|    return negative.hasMinusSign;
  104|     30|}
_ZNK6icu_786number4impl17ParsedPatternInfo18containsSymbolTypeENS1_16AffixPatternTypeER10UErrorCode:
  110|  16.2k|bool ParsedPatternInfo::containsSymbolType(AffixPatternType type, UErrorCode& status) const {
  111|  16.2k|    return AffixUtils::containsType(pattern, type, status);
  112|  16.2k|}
_ZNK6icu_786number4impl17ParsedPatternInfo7hasBodyEv:
  114|  9.33k|bool ParsedPatternInfo::hasBody() const {
  115|  9.33k|    return positive.integerTotal > 0;
  116|  9.33k|}
_ZNK6icu_786number4impl17ParsedPatternInfo17currencyAsDecimalEv:
  118|  9.33k|bool ParsedPatternInfo::currencyAsDecimal() const {
  119|  9.33k|    return positive.hasCurrencyDecimal;
  120|  9.33k|}
_ZN6icu_786number4impl17ParsedPatternInfo11ParserState4peekEv:
  126|   367k|UChar32 ParsedPatternInfo::ParserState::peek() {
  127|   367k|    if (offset == pattern.length()) {
  ------------------
  |  Branch (127:9): [True: 75.2k, False: 291k]
  ------------------
  128|  75.2k|        return -1;
  129|   291k|    } else {
  130|   291k|        return pattern.char32At(offset);
  131|   291k|    }
  132|   367k|}
_ZN6icu_786number4impl17ParsedPatternInfo11ParserState4nextEv:
  146|   100k|UChar32 ParsedPatternInfo::ParserState::next() {
  147|   100k|    int32_t codePoint = peek();
  148|   100k|    offset += U16_LENGTH(codePoint);
  ------------------
  |  |  141|   100k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 100k, False: 43]
  |  |  ------------------
  ------------------
  149|   100k|    return codePoint;
  150|   100k|}
_ZN6icu_786number4impl17ParsedPatternInfo14consumePatternERKNS_13UnicodeStringER10UErrorCode:
  152|  11.7k|void ParsedPatternInfo::consumePattern(const UnicodeString& patternString, UErrorCode& status) {
  153|  11.7k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (153:9): [True: 0, False: 11.7k]
  ------------------
  154|  11.7k|    this->pattern = patternString;
  155|       |
  156|       |    // This class is not intended for writing twice!
  157|       |    // Use move assignment to overwrite instead.
  158|  11.7k|    U_ASSERT(state.offset == 0);
  ------------------
  |  |   35|  11.7k|#   define U_ASSERT(exp) (void)0
  ------------------
  159|       |
  160|       |    // pattern := subpattern (';' subpattern)?
  161|  11.7k|    currentSubpattern = &positive;
  162|  11.7k|    consumeSubpattern(status);
  163|  11.7k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (163:9): [True: 0, False: 11.7k]
  ------------------
  164|  11.7k|    if (state.peek() == u';') {
  ------------------
  |  Branch (164:9): [True: 28, False: 11.7k]
  ------------------
  165|     28|        state.next(); // consume the ';'
  166|       |        // Don't consume the negative subpattern if it is empty (trailing ';')
  167|     28|        if (state.peek() != -1) {
  ------------------
  |  Branch (167:13): [True: 28, False: 0]
  ------------------
  168|     28|            fHasNegativeSubpattern = true;
  169|     28|            currentSubpattern = &negative;
  170|     28|            consumeSubpattern(status);
  171|     28|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (171:17): [True: 0, False: 28]
  ------------------
  172|     28|        }
  173|     28|    }
  174|  11.7k|    if (state.peek() != -1) {
  ------------------
  |  Branch (174:9): [True: 0, False: 11.7k]
  ------------------
  175|      0|        state.toParseException(u"Found unquoted special character");
  176|      0|        status = U_UNQUOTED_SPECIAL;
  177|      0|    }
  178|  11.7k|}
_ZN6icu_786number4impl17ParsedPatternInfo17consumeSubpatternER10UErrorCode:
  180|  11.8k|void ParsedPatternInfo::consumeSubpattern(UErrorCode& status) {
  181|       |    // subpattern := literals? number exponent? literals?
  182|  11.8k|    consumePadding(PadPosition::UNUM_PAD_BEFORE_PREFIX, status);
  183|  11.8k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (183:9): [True: 0, False: 11.8k]
  ------------------
  184|  11.8k|    consumeAffix(currentSubpattern->prefixEndpoints, status);
  185|  11.8k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (185:9): [True: 0, False: 11.8k]
  ------------------
  186|  11.8k|    consumePadding(PadPosition::UNUM_PAD_AFTER_PREFIX, status);
  187|  11.8k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (187:9): [True: 0, False: 11.8k]
  ------------------
  188|  11.8k|    consumeFormat(status);
  189|  11.8k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (189:9): [True: 0, False: 11.8k]
  ------------------
  190|  11.8k|    consumeExponent(status);
  191|  11.8k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (191:9): [True: 0, False: 11.8k]
  ------------------
  192|  11.8k|    consumePadding(PadPosition::UNUM_PAD_BEFORE_SUFFIX, status);
  193|  11.8k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (193:9): [True: 0, False: 11.8k]
  ------------------
  194|  11.8k|    consumeAffix(currentSubpattern->suffixEndpoints, status);
  195|  11.8k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (195:9): [True: 0, False: 11.8k]
  ------------------
  196|  11.8k|    consumePadding(PadPosition::UNUM_PAD_AFTER_SUFFIX, status);
  197|  11.8k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (197:9): [True: 0, False: 11.8k]
  ------------------
  198|  11.8k|}
_ZN6icu_786number4impl17ParsedPatternInfo14consumePaddingE24UNumberFormatPadPositionR10UErrorCode:
  200|  47.2k|void ParsedPatternInfo::consumePadding(PadPosition paddingLocation, UErrorCode& status) {
  201|  47.2k|    if (state.peek() != u'*') {
  ------------------
  |  Branch (201:9): [True: 47.2k, False: 0]
  ------------------
  202|  47.2k|        return;
  203|  47.2k|    }
  204|      0|    if (currentSubpattern->hasPadding) {
  ------------------
  |  Branch (204:9): [True: 0, False: 0]
  ------------------
  205|      0|        state.toParseException(u"Cannot have multiple pad specifiers");
  206|      0|        status = U_MULTIPLE_PAD_SPECIFIERS;
  207|      0|        return;
  208|      0|    }
  209|      0|    currentSubpattern->paddingLocation = paddingLocation;
  210|      0|    currentSubpattern->hasPadding = true;
  211|      0|    state.next(); // consume the '*'
  212|      0|    currentSubpattern->paddingEndpoints.start = state.offset;
  213|      0|    consumeLiteral(status);
  214|      0|    currentSubpattern->paddingEndpoints.end = state.offset;
  215|      0|}
_ZN6icu_786number4impl17ParsedPatternInfo12consumeAffixERNS1_9EndpointsER10UErrorCode:
  217|  23.6k|void ParsedPatternInfo::consumeAffix(Endpoints& endpoints, UErrorCode& status) {
  218|       |    // literals := { literal }
  219|  23.6k|    endpoints.start = state.offset;
  220|  31.7k|    while (true) {
  ------------------
  |  Branch (220:12): [Folded - Ignored]
  ------------------
  221|  31.7k|        switch (state.peek()) {
  222|  9.29k|            case u'#':
  ------------------
  |  Branch (222:13): [True: 9.29k, False: 22.4k]
  ------------------
  223|  9.29k|            case u'@':
  ------------------
  |  Branch (223:13): [True: 0, False: 31.7k]
  ------------------
  224|  9.32k|            case u';':
  ------------------
  |  Branch (224:13): [True: 28, False: 31.7k]
  ------------------
  225|  9.32k|            case u'*':
  ------------------
  |  Branch (225:13): [True: 0, False: 31.7k]
  ------------------
  226|  9.32k|            case u'.':
  ------------------
  |  Branch (226:13): [True: 0, False: 31.7k]
  ------------------
  227|  9.32k|            case u',':
  ------------------
  |  Branch (227:13): [True: 0, False: 31.7k]
  ------------------
  228|  11.8k|            case u'0':
  ------------------
  |  Branch (228:13): [True: 2.50k, False: 29.2k]
  ------------------
  229|  11.8k|            case u'1':
  ------------------
  |  Branch (229:13): [True: 0, False: 31.7k]
  ------------------
  230|  11.8k|            case u'2':
  ------------------
  |  Branch (230:13): [True: 0, False: 31.7k]
  ------------------
  231|  11.8k|            case u'3':
  ------------------
  |  Branch (231:13): [True: 0, False: 31.7k]
  ------------------
  232|  11.8k|            case u'4':
  ------------------
  |  Branch (232:13): [True: 0, False: 31.7k]
  ------------------
  233|  11.8k|            case u'5':
  ------------------
  |  Branch (233:13): [True: 0, False: 31.7k]
  ------------------
  234|  11.8k|            case u'6':
  ------------------
  |  Branch (234:13): [True: 0, False: 31.7k]
  ------------------
  235|  11.8k|            case u'7':
  ------------------
  |  Branch (235:13): [True: 0, False: 31.7k]
  ------------------
  236|  11.8k|            case u'8':
  ------------------
  |  Branch (236:13): [True: 0, False: 31.7k]
  ------------------
  237|  11.8k|            case u'9':
  ------------------
  |  Branch (237:13): [True: 0, False: 31.7k]
  ------------------
  238|  23.6k|            case -1:
  ------------------
  |  Branch (238:13): [True: 11.8k, False: 19.9k]
  ------------------
  239|       |                // Characters that cannot appear unquoted in a literal
  240|       |                // break outer;
  241|  23.6k|                goto after_outer;
  242|       |
  243|     96|            case u'%':
  ------------------
  |  Branch (243:13): [True: 96, False: 31.6k]
  ------------------
  244|     96|                currentSubpattern->hasPercentSign = true;
  245|     96|                break;
  246|       |
  247|      0|            case u'‰':
  ------------------
  |  Branch (247:13): [True: 0, False: 31.7k]
  ------------------
  248|      0|                currentSubpattern->hasPerMilleSign = true;
  249|      0|                break;
  250|       |
  251|      0|            case u'¤':
  ------------------
  |  Branch (251:13): [True: 0, False: 31.7k]
  ------------------
  252|      0|                currentSubpattern->hasCurrencySign = true;
  253|      0|                break;
  254|       |
  255|     35|            case u'-':
  ------------------
  |  Branch (255:13): [True: 35, False: 31.7k]
  ------------------
  256|     35|                currentSubpattern->hasMinusSign = true;
  257|     35|                break;
  258|       |
  259|      0|            case u'+':
  ------------------
  |  Branch (259:13): [True: 0, False: 31.7k]
  ------------------
  260|      0|                currentSubpattern->hasPlusSign = true;
  261|      0|                break;
  262|       |
  263|  7.97k|            default:
  ------------------
  |  Branch (263:13): [True: 7.97k, False: 23.7k]
  ------------------
  264|  7.97k|                break;
  265|  31.7k|        }
  266|  8.10k|        consumeLiteral(status);
  267|  8.10k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (267:13): [True: 0, False: 8.10k]
  ------------------
  268|  8.10k|    }
  269|  23.6k|    after_outer:
  270|  23.6k|    endpoints.end = state.offset;
  271|  23.6k|}
_ZN6icu_786number4impl17ParsedPatternInfo14consumeLiteralER10UErrorCode:
  273|  8.10k|void ParsedPatternInfo::consumeLiteral(UErrorCode& status) {
  274|  8.10k|    if (state.peek() == -1) {
  ------------------
  |  Branch (274:9): [True: 0, False: 8.10k]
  ------------------
  275|      0|        state.toParseException(u"Expected unquoted literal but found EOL");
  276|      0|        status = U_PATTERN_SYNTAX_ERROR;
  277|      0|        return;
  278|  8.10k|    } else if (state.peek() == u'\'') {
  ------------------
  |  Branch (278:16): [True: 466, False: 7.64k]
  ------------------
  279|    466|        state.next(); // consume the starting quote
  280|    932|        while (state.peek() != u'\'') {
  ------------------
  |  Branch (280:16): [True: 466, False: 466]
  ------------------
  281|    466|            if (state.peek() == -1) {
  ------------------
  |  Branch (281:17): [True: 0, False: 466]
  ------------------
  282|      0|                state.toParseException(u"Expected quoted literal but found EOL");
  283|      0|                status = U_PATTERN_SYNTAX_ERROR;
  284|      0|                return;
  285|    466|            } else {
  286|    466|                state.next(); // consume a quoted character
  287|    466|            }
  288|    466|        }
  289|    466|        state.next(); // consume the ending quote
  290|  7.64k|    } else {
  291|       |        // consume a non-quoted literal character
  292|  7.64k|        state.next();
  293|  7.64k|    }
  294|  8.10k|}
_ZN6icu_786number4impl17ParsedPatternInfo13consumeFormatER10UErrorCode:
  296|  11.8k|void ParsedPatternInfo::consumeFormat(UErrorCode& status) {
  297|  11.8k|    consumeIntegerFormat(status);
  298|  11.8k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (298:9): [True: 0, False: 11.8k]
  ------------------
  299|  11.8k|    if (state.peek() == u'.') {
  ------------------
  |  Branch (299:9): [True: 9.24k, False: 2.56k]
  ------------------
  300|  9.24k|        state.next(); // consume the decimal point
  301|  9.24k|        currentSubpattern->hasDecimal = true;
  302|  9.24k|        currentSubpattern->widthExceptAffixes += 1;
  303|  9.24k|        consumeFractionFormat(status);
  304|  9.24k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (304:13): [True: 0, False: 9.24k]
  ------------------
  305|  9.24k|    } else if (state.peek() == u'¤') {
  ------------------
  |  Branch (305:16): [True: 0, False: 2.56k]
  ------------------
  306|       |        // Check if currency is a decimal separator
  307|      0|        switch (state.peek2()) {
  308|      0|            case u'#':
  ------------------
  |  Branch (308:13): [True: 0, False: 0]
  ------------------
  309|      0|            case u'0':
  ------------------
  |  Branch (309:13): [True: 0, False: 0]
  ------------------
  310|      0|            case u'1':
  ------------------
  |  Branch (310:13): [True: 0, False: 0]
  ------------------
  311|      0|            case u'2':
  ------------------
  |  Branch (311:13): [True: 0, False: 0]
  ------------------
  312|      0|            case u'3':
  ------------------
  |  Branch (312:13): [True: 0, False: 0]
  ------------------
  313|      0|            case u'4':
  ------------------
  |  Branch (313:13): [True: 0, False: 0]
  ------------------
  314|      0|            case u'5':
  ------------------
  |  Branch (314:13): [True: 0, False: 0]
  ------------------
  315|      0|            case u'6':
  ------------------
  |  Branch (315:13): [True: 0, False: 0]
  ------------------
  316|      0|            case u'7':
  ------------------
  |  Branch (316:13): [True: 0, False: 0]
  ------------------
  317|      0|            case u'8':
  ------------------
  |  Branch (317:13): [True: 0, False: 0]
  ------------------
  318|      0|            case u'9':
  ------------------
  |  Branch (318:13): [True: 0, False: 0]
  ------------------
  319|      0|                break;
  320|      0|            default:
  ------------------
  |  Branch (320:13): [True: 0, False: 0]
  ------------------
  321|       |                // Currency symbol followed by a non-numeric character;
  322|       |                // treat as a normal affix.
  323|      0|                return;
  324|      0|        }
  325|       |        // Currency symbol is followed by a numeric character;
  326|       |        // treat as a decimal separator.
  327|      0|        currentSubpattern->hasCurrencySign = true;
  328|      0|        currentSubpattern->hasCurrencyDecimal = true;
  329|      0|        currentSubpattern->hasDecimal = true;
  330|      0|        currentSubpattern->widthExceptAffixes += 1;
  331|      0|        state.next(); // consume the symbol
  332|      0|        consumeFractionFormat(status);
  333|      0|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (333:13): [True: 0, False: 0]
  ------------------
  334|      0|    }
  335|  11.8k|}
_ZN6icu_786number4impl17ParsedPatternInfo20consumeIntegerFormatER10UErrorCode:
  337|  11.8k|void ParsedPatternInfo::consumeIntegerFormat(UErrorCode& status) {
  338|       |    // Convenience reference:
  339|  11.8k|    ParsedSubpatternInfo& result = *currentSubpattern;
  340|       |
  341|  66.4k|    while (true) {
  ------------------
  |  Branch (341:12): [Folded - Ignored]
  ------------------
  342|  66.4k|        switch (state.peek()) {
  343|  9.76k|            case u',':
  ------------------
  |  Branch (343:13): [True: 9.76k, False: 56.7k]
  ------------------
  344|  9.76k|                result.widthExceptAffixes += 1;
  345|  9.76k|                result.groupingSizes <<= 16;
  346|  9.76k|                break;
  347|       |
  348|  28.7k|            case u'#':
  ------------------
  |  Branch (348:13): [True: 28.7k, False: 37.7k]
  ------------------
  349|  28.7k|                if (result.integerNumerals > 0) {
  ------------------
  |  Branch (349:21): [True: 0, False: 28.7k]
  ------------------
  350|      0|                    state.toParseException(u"# cannot follow 0 before decimal point");
  351|      0|                    status = U_UNEXPECTED_TOKEN;
  352|      0|                    return;
  353|      0|                }
  354|  28.7k|                result.widthExceptAffixes += 1;
  355|  28.7k|                result.groupingSizes += 1;
  356|  28.7k|                if (result.integerAtSigns > 0) {
  ------------------
  |  Branch (356:21): [True: 0, False: 28.7k]
  ------------------
  357|      0|                    result.integerTrailingHashSigns += 1;
  358|  28.7k|                } else {
  359|  28.7k|                    result.integerLeadingHashSigns += 1;
  360|  28.7k|                }
  361|  28.7k|                result.integerTotal += 1;
  362|  28.7k|                break;
  363|       |
  364|      0|            case u'@':
  ------------------
  |  Branch (364:13): [True: 0, False: 66.4k]
  ------------------
  365|      0|                if (result.integerNumerals > 0) {
  ------------------
  |  Branch (365:21): [True: 0, False: 0]
  ------------------
  366|      0|                    state.toParseException(u"Cannot mix 0 and @");
  367|      0|                    status = U_UNEXPECTED_TOKEN;
  368|      0|                    return;
  369|      0|                }
  370|      0|                if (result.integerTrailingHashSigns > 0) {
  ------------------
  |  Branch (370:21): [True: 0, False: 0]
  ------------------
  371|      0|                    state.toParseException(u"Cannot nest # inside of a run of @");
  372|      0|                    status = U_UNEXPECTED_TOKEN;
  373|      0|                    return;
  374|      0|                }
  375|      0|                result.widthExceptAffixes += 1;
  376|      0|                result.groupingSizes += 1;
  377|      0|                result.integerAtSigns += 1;
  378|      0|                result.integerTotal += 1;
  379|      0|                break;
  380|       |
  381|  16.1k|            case u'0':
  ------------------
  |  Branch (381:13): [True: 16.1k, False: 50.3k]
  ------------------
  382|  16.1k|            case u'1':
  ------------------
  |  Branch (382:13): [True: 0, False: 66.4k]
  ------------------
  383|  16.1k|            case u'2':
  ------------------
  |  Branch (383:13): [True: 0, False: 66.4k]
  ------------------
  384|  16.1k|            case u'3':
  ------------------
  |  Branch (384:13): [True: 0, False: 66.4k]
  ------------------
  385|  16.1k|            case u'4':
  ------------------
  |  Branch (385:13): [True: 0, False: 66.4k]
  ------------------
  386|  16.1k|            case u'5':
  ------------------
  |  Branch (386:13): [True: 0, False: 66.4k]
  ------------------
  387|  16.1k|            case u'6':
  ------------------
  |  Branch (387:13): [True: 0, False: 66.4k]
  ------------------
  388|  16.1k|            case u'7':
  ------------------
  |  Branch (388:13): [True: 0, False: 66.4k]
  ------------------
  389|  16.1k|            case u'8':
  ------------------
  |  Branch (389:13): [True: 0, False: 66.4k]
  ------------------
  390|  16.1k|            case u'9':
  ------------------
  |  Branch (390:13): [True: 0, False: 66.4k]
  ------------------
  391|  16.1k|                if (result.integerAtSigns > 0) {
  ------------------
  |  Branch (391:21): [True: 0, False: 16.1k]
  ------------------
  392|      0|                    state.toParseException(u"Cannot mix @ and 0");
  393|      0|                    status = U_UNEXPECTED_TOKEN;
  394|      0|                    return;
  395|      0|                }
  396|  16.1k|                result.widthExceptAffixes += 1;
  397|  16.1k|                result.groupingSizes += 1;
  398|  16.1k|                result.integerNumerals += 1;
  399|  16.1k|                result.integerTotal += 1;
  400|  16.1k|                if (!result.rounding.isZeroish() || state.peek() != u'0') {
  ------------------
  |  Branch (400:21): [True: 0, False: 16.1k]
  |  Branch (400:53): [True: 0, False: 16.1k]
  ------------------
  401|      0|                    result.rounding.appendDigit(static_cast<int8_t>(state.peek() - u'0'), 0, true);
  402|      0|                }
  403|  16.1k|                break;
  404|       |
  405|  11.8k|            default:
  ------------------
  |  Branch (405:13): [True: 11.8k, False: 54.6k]
  ------------------
  406|  11.8k|                goto after_outer;
  407|  66.4k|        }
  408|  54.6k|        state.next(); // consume the symbol
  409|  54.6k|    }
  410|       |
  411|  11.8k|    after_outer:
  412|       |    // Disallow patterns with a trailing ',' or with two ',' next to each other
  413|  11.8k|    auto grouping1 = static_cast<int16_t> (result.groupingSizes & 0xffff);
  414|  11.8k|    auto grouping2 = static_cast<int16_t> ((result.groupingSizes >> 16) & 0xffff);
  415|  11.8k|    auto grouping3 = static_cast<int16_t> ((result.groupingSizes >> 32) & 0xffff);
  416|  11.8k|    if (grouping1 == 0 && grouping2 != -1) {
  ------------------
  |  Branch (416:9): [True: 15, False: 11.8k]
  |  Branch (416:27): [True: 0, False: 15]
  ------------------
  417|      0|        state.toParseException(u"Trailing grouping separator is invalid");
  418|      0|        status = U_UNEXPECTED_TOKEN;
  419|      0|        return;
  420|      0|    }
  421|  11.8k|    if (grouping2 == 0 && grouping3 != -1) {
  ------------------
  |  Branch (421:9): [True: 0, False: 11.8k]
  |  Branch (421:27): [True: 0, False: 0]
  ------------------
  422|      0|        state.toParseException(u"Grouping width of zero is invalid");
  423|      0|        status = U_PATTERN_SYNTAX_ERROR;
  424|      0|        return;
  425|      0|    }
  426|  11.8k|}
_ZN6icu_786number4impl17ParsedPatternInfo21consumeFractionFormatER10UErrorCode:
  428|  9.24k|void ParsedPatternInfo::consumeFractionFormat(UErrorCode& status) {
  429|       |    // Convenience reference:
  430|  9.24k|    ParsedSubpatternInfo& result = *currentSubpattern;
  431|       |
  432|  9.24k|    int32_t zeroCounter = 0;
  433|  37.1k|    while (true) {
  ------------------
  |  Branch (433:12): [Folded - Ignored]
  ------------------
  434|  37.1k|        switch (state.peek()) {
  435|  27.8k|            case u'#':
  ------------------
  |  Branch (435:13): [True: 27.8k, False: 9.24k]
  ------------------
  436|  27.8k|                result.widthExceptAffixes += 1;
  437|  27.8k|                result.fractionHashSigns += 1;
  438|  27.8k|                result.fractionTotal += 1;
  439|  27.8k|                zeroCounter++;
  440|  27.8k|                break;
  441|       |
  442|      0|            case u'0':
  ------------------
  |  Branch (442:13): [True: 0, False: 37.1k]
  ------------------
  443|      0|            case u'1':
  ------------------
  |  Branch (443:13): [True: 0, False: 37.1k]
  ------------------
  444|      0|            case u'2':
  ------------------
  |  Branch (444:13): [True: 0, False: 37.1k]
  ------------------
  445|      0|            case u'3':
  ------------------
  |  Branch (445:13): [True: 0, False: 37.1k]
  ------------------
  446|      0|            case u'4':
  ------------------
  |  Branch (446:13): [True: 0, False: 37.1k]
  ------------------
  447|      0|            case u'5':
  ------------------
  |  Branch (447:13): [True: 0, False: 37.1k]
  ------------------
  448|      0|            case u'6':
  ------------------
  |  Branch (448:13): [True: 0, False: 37.1k]
  ------------------
  449|      0|            case u'7':
  ------------------
  |  Branch (449:13): [True: 0, False: 37.1k]
  ------------------
  450|      0|            case u'8':
  ------------------
  |  Branch (450:13): [True: 0, False: 37.1k]
  ------------------
  451|      0|            case u'9':
  ------------------
  |  Branch (451:13): [True: 0, False: 37.1k]
  ------------------
  452|      0|                if (result.fractionHashSigns > 0) {
  ------------------
  |  Branch (452:21): [True: 0, False: 0]
  ------------------
  453|      0|                    state.toParseException(u"0 cannot follow # after decimal point");
  454|      0|                    status = U_UNEXPECTED_TOKEN;
  455|      0|                    return;
  456|      0|                }
  457|      0|                result.widthExceptAffixes += 1;
  458|      0|                result.fractionNumerals += 1;
  459|      0|                result.fractionTotal += 1;
  460|      0|                if (state.peek() == u'0') {
  ------------------
  |  Branch (460:21): [True: 0, False: 0]
  ------------------
  461|      0|                    zeroCounter++;
  462|      0|                } else {
  463|      0|                    result.rounding
  464|      0|                            .appendDigit(static_cast<int8_t>(state.peek() - u'0'), zeroCounter, false);
  465|      0|                    zeroCounter = 0;
  466|      0|                }
  467|      0|                break;
  468|       |
  469|  9.24k|            default:
  ------------------
  |  Branch (469:13): [True: 9.24k, False: 27.8k]
  ------------------
  470|  9.24k|                return;
  471|  37.1k|        }
  472|  27.8k|        state.next(); // consume the symbol
  473|  27.8k|    }
  474|  9.24k|}
_ZN6icu_786number4impl17ParsedPatternInfo15consumeExponentER10UErrorCode:
  476|  11.8k|void ParsedPatternInfo::consumeExponent(UErrorCode& status) {
  477|       |    // Convenience reference:
  478|  11.8k|    ParsedSubpatternInfo& result = *currentSubpattern;
  479|       |
  480|  11.8k|    if (state.peek() != u'E') {
  ------------------
  |  Branch (480:9): [True: 11.8k, False: 0]
  ------------------
  481|  11.8k|        return;
  482|  11.8k|    }
  483|      0|    if ((result.groupingSizes & 0xffff0000L) != 0xffff0000L) {
  ------------------
  |  Branch (483:9): [True: 0, False: 0]
  ------------------
  484|      0|        state.toParseException(u"Cannot have grouping separator in scientific notation");
  485|      0|        status = U_MALFORMED_EXPONENTIAL_PATTERN;
  486|      0|        return;
  487|      0|    }
  488|      0|    state.next(); // consume the E
  489|      0|    result.widthExceptAffixes++;
  490|      0|    if (state.peek() == u'+') {
  ------------------
  |  Branch (490:9): [True: 0, False: 0]
  ------------------
  491|      0|        state.next(); // consume the +
  492|      0|        result.exponentHasPlusSign = true;
  493|      0|        result.widthExceptAffixes++;
  494|      0|    }
  495|      0|    while (state.peek() == u'0') {
  ------------------
  |  Branch (495:12): [True: 0, False: 0]
  ------------------
  496|      0|        state.next(); // consume the 0
  497|      0|        result.exponentZeros += 1;
  498|      0|        result.widthExceptAffixes++;
  499|      0|    }
  500|      0|}
_ZN6icu_786number4impl18PatternStringUtils26patternInfoToStringBuilderERKNS1_20AffixPatternProviderEbNS1_15PatternSignTypeEbNS_14StandardPlural4FormEbbRNS_13UnicodeStringE:
 1061|  18.6k|                                                    UnicodeString& output) {
 1062|       |
 1063|       |    // Should the output render '+' where '-' would normally appear in the pattern?
 1064|  18.6k|    bool plusReplacesMinusSign = (patternSignType == PATTERN_SIGN_TYPE_POS_SIGN)
  ------------------
  |  Branch (1064:34): [True: 36, False: 18.6k]
  ------------------
 1065|  18.6k|        && !patternInfo.positiveHasPlusSign();
  ------------------
  |  Branch (1065:12): [True: 36, False: 0]
  ------------------
 1066|       |
 1067|       |    // Should we use the affix from the negative subpattern?
 1068|       |    // (If not, we will use the positive subpattern.)
 1069|  18.6k|    bool useNegativeAffixPattern = patternInfo.hasNegativeSubpattern()
  ------------------
  |  Branch (1069:36): [True: 56, False: 18.6k]
  ------------------
 1070|  18.6k|        && (patternSignType == PATTERN_SIGN_TYPE_NEG
  ------------------
  |  Branch (1070:13): [True: 26, False: 30]
  ------------------
 1071|     56|            || (patternInfo.negativeHasMinusSign() && (plusReplacesMinusSign || approximately)));
  ------------------
  |  Branch (1071:17): [True: 30, False: 0]
  |  Branch (1071:56): [True: 6, False: 24]
  |  Branch (1071:81): [True: 0, False: 24]
  ------------------
 1072|       |
 1073|       |    // Resolve the flags for the affix pattern.
 1074|  18.6k|    int flags = 0;
 1075|  18.6k|    if (useNegativeAffixPattern) {
  ------------------
  |  Branch (1075:9): [True: 32, False: 18.6k]
  ------------------
 1076|     32|        flags |= AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN;
 1077|     32|    }
 1078|  18.6k|    if (isPrefix) {
  ------------------
  |  Branch (1078:9): [True: 9.33k, False: 9.33k]
  ------------------
 1079|  9.33k|        flags |= AffixPatternProvider::AFFIX_PREFIX;
 1080|  9.33k|    }
 1081|  18.6k|    if (plural != StandardPlural::Form::COUNT) {
  ------------------
  |  Branch (1081:9): [True: 0, False: 18.6k]
  ------------------
 1082|      0|        U_ASSERT(plural == (AffixPatternProvider::AFFIX_PLURAL_MASK & plural));
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1083|      0|        flags |= plural;
 1084|      0|    }
 1085|       |
 1086|       |    // Should we prepend a sign to the pattern?
 1087|  18.6k|    bool prependSign;
 1088|  18.6k|    if (!isPrefix || useNegativeAffixPattern) {
  ------------------
  |  Branch (1088:9): [True: 9.33k, False: 9.33k]
  |  Branch (1088:22): [True: 16, False: 9.31k]
  ------------------
 1089|  9.35k|        prependSign = false;
 1090|  9.35k|    } else if (patternSignType == PATTERN_SIGN_TYPE_NEG) {
  ------------------
  |  Branch (1090:16): [True: 3.08k, False: 6.23k]
  ------------------
 1091|  3.08k|        prependSign = true;
 1092|  6.23k|    } else {
 1093|  6.23k|        prependSign = plusReplacesMinusSign || approximately;
  ------------------
  |  Branch (1093:23): [True: 15, False: 6.21k]
  |  Branch (1093:48): [True: 0, False: 6.21k]
  ------------------
 1094|  6.23k|    }
 1095|       |
 1096|       |    // What symbols should take the place of the sign placeholder?
 1097|  18.6k|    const char16_t* signSymbols = u"-";
 1098|  18.6k|    if (approximately) {
  ------------------
  |  Branch (1098:9): [True: 0, False: 18.6k]
  ------------------
 1099|      0|        if (plusReplacesMinusSign) {
  ------------------
  |  Branch (1099:13): [True: 0, False: 0]
  ------------------
 1100|      0|            signSymbols = u"~+";
 1101|      0|        } else if (patternSignType == PATTERN_SIGN_TYPE_NEG) {
  ------------------
  |  Branch (1101:20): [True: 0, False: 0]
  ------------------
 1102|      0|            signSymbols = u"~-";
 1103|      0|        } else {
 1104|      0|            signSymbols = u"~";
 1105|      0|        }
 1106|  18.6k|    } else if (plusReplacesMinusSign) {
  ------------------
  |  Branch (1106:16): [True: 36, False: 18.6k]
  ------------------
 1107|     36|        signSymbols = u"+";
 1108|     36|    }
 1109|       |
 1110|       |    // Compute the number of tokens in the affix pattern (signSymbols is considered one token).
 1111|  18.6k|    int length = patternInfo.length(flags) + (prependSign ? 1 : 0);
  ------------------
  |  Branch (1111:47): [True: 3.10k, False: 15.5k]
  ------------------
 1112|       |
 1113|       |    // Finally, set the result into the StringBuilder.
 1114|  18.6k|    output.remove();
 1115|  30.7k|    for (int index = 0; index < length; index++) {
  ------------------
  |  Branch (1115:25): [True: 12.0k, False: 18.6k]
  ------------------
 1116|  12.0k|        char16_t candidate;
 1117|  12.0k|        if (prependSign && index == 0) {
  ------------------
  |  Branch (1117:13): [True: 3.22k, False: 8.83k]
  |  Branch (1117:28): [True: 3.10k, False: 124]
  ------------------
 1118|  3.10k|            candidate = u'-';
 1119|  8.95k|        } else if (prependSign) {
  ------------------
  |  Branch (1119:20): [True: 124, False: 8.83k]
  ------------------
 1120|    124|            candidate = patternInfo.charAt(flags, index - 1);
 1121|  8.83k|        } else {
 1122|  8.83k|            candidate = patternInfo.charAt(flags, index);
 1123|  8.83k|        }
 1124|  12.0k|        if (candidate == u'-') {
  ------------------
  |  Branch (1124:13): [True: 3.12k, False: 8.93k]
  ------------------
 1125|  3.12k|            if (u_strlen(signSymbols) == 1) {
  ------------------
  |  |  393|  3.12k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|  3.12k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.12k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.12k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1125:17): [True: 3.12k, False: 0]
  ------------------
 1126|  3.12k|                candidate = signSymbols[0];
 1127|  3.12k|            } else {
 1128|      0|                output.append(signSymbols[0]);
 1129|      0|                candidate = signSymbols[1];
 1130|      0|            }
 1131|  3.12k|        }
 1132|  12.0k|        if (perMilleReplacesPercent && candidate == u'%') {
  ------------------
  |  Branch (1132:13): [True: 0, False: 12.0k]
  |  Branch (1132:40): [True: 0, False: 0]
  ------------------
 1133|      0|            candidate = u'‰';
 1134|      0|        }
 1135|  12.0k|        if (dropCurrencySymbols && candidate == u'\u00A4') {
  ------------------
  |  Branch (1135:13): [True: 0, False: 12.0k]
  |  Branch (1135:36): [True: 0, False: 0]
  ------------------
 1136|      0|            continue;
 1137|      0|        }
 1138|  12.0k|        output.append(candidate);
 1139|  12.0k|    }
 1140|  18.6k|}
_ZN6icu_786number4impl18PatternStringUtils18resolveSignDisplayE18UNumberSignDisplayNS1_6SignumE:
 1142|  18.6k|PatternSignType PatternStringUtils::resolveSignDisplay(UNumberSignDisplay signDisplay, Signum signum) {
 1143|  18.6k|    switch (signDisplay) {
 1144|  18.6k|        case UNUM_SIGN_AUTO:
  ------------------
  |  Branch (1144:9): [True: 18.6k, False: 68]
  ------------------
 1145|  18.6k|        case UNUM_SIGN_ACCOUNTING:
  ------------------
  |  Branch (1145:9): [True: 4, False: 18.6k]
  ------------------
 1146|  18.6k|            switch (signum) {
 1147|  5.46k|                case SIGNUM_NEG:
  ------------------
  |  Branch (1147:17): [True: 5.46k, False: 13.1k]
  ------------------
 1148|  6.18k|                case SIGNUM_NEG_ZERO:
  ------------------
  |  Branch (1148:17): [True: 722, False: 17.8k]
  ------------------
 1149|  6.18k|                    return PATTERN_SIGN_TYPE_NEG;
 1150|  3.39k|                case SIGNUM_POS_ZERO:
  ------------------
  |  Branch (1150:17): [True: 3.39k, False: 15.2k]
  ------------------
 1151|  12.4k|                case SIGNUM_POS:
  ------------------
  |  Branch (1151:17): [True: 9.02k, False: 9.58k]
  ------------------
 1152|  12.4k|                    return PATTERN_SIGN_TYPE_POS;
 1153|      0|                default:
  ------------------
  |  Branch (1153:17): [True: 0, False: 18.6k]
  ------------------
 1154|      0|                    break;
 1155|  18.6k|            }
 1156|      0|            break;
 1157|       |
 1158|     24|        case UNUM_SIGN_ALWAYS:
  ------------------
  |  Branch (1158:9): [True: 24, False: 18.6k]
  ------------------
 1159|     28|        case UNUM_SIGN_ACCOUNTING_ALWAYS:
  ------------------
  |  Branch (1159:9): [True: 4, False: 18.6k]
  ------------------
 1160|     28|            switch (signum) {
 1161|      4|                case SIGNUM_NEG:
  ------------------
  |  Branch (1161:17): [True: 4, False: 24]
  ------------------
 1162|      4|                case SIGNUM_NEG_ZERO:
  ------------------
  |  Branch (1162:17): [True: 0, False: 28]
  ------------------
 1163|      4|                    return PATTERN_SIGN_TYPE_NEG;
 1164|     10|                case SIGNUM_POS_ZERO:
  ------------------
  |  Branch (1164:17): [True: 10, False: 18]
  ------------------
 1165|     24|                case SIGNUM_POS:
  ------------------
  |  Branch (1165:17): [True: 14, False: 14]
  ------------------
 1166|     24|                    return PATTERN_SIGN_TYPE_POS_SIGN;
 1167|      0|                default:
  ------------------
  |  Branch (1167:17): [True: 0, False: 28]
  ------------------
 1168|      0|                    break;
 1169|     28|            }
 1170|      0|            break;
 1171|       |
 1172|     16|        case UNUM_SIGN_EXCEPT_ZERO:
  ------------------
  |  Branch (1172:9): [True: 16, False: 18.6k]
  ------------------
 1173|     20|        case UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO:
  ------------------
  |  Branch (1173:9): [True: 4, False: 18.6k]
  ------------------
 1174|     20|            switch (signum) {
 1175|      4|                case SIGNUM_NEG:
  ------------------
  |  Branch (1175:17): [True: 4, False: 16]
  ------------------
 1176|      4|                    return PATTERN_SIGN_TYPE_NEG;
 1177|      2|                case SIGNUM_NEG_ZERO:
  ------------------
  |  Branch (1177:17): [True: 2, False: 18]
  ------------------
 1178|      4|                case SIGNUM_POS_ZERO:
  ------------------
  |  Branch (1178:17): [True: 2, False: 18]
  ------------------
 1179|      4|                    return PATTERN_SIGN_TYPE_POS;
 1180|     12|                case SIGNUM_POS:
  ------------------
  |  Branch (1180:17): [True: 12, False: 8]
  ------------------
 1181|     12|                    return PATTERN_SIGN_TYPE_POS_SIGN;
 1182|      0|                default:
  ------------------
  |  Branch (1182:17): [True: 0, False: 20]
  ------------------
 1183|      0|                    break;
 1184|     20|            }
 1185|      0|            break;
 1186|       |
 1187|      4|        case UNUM_SIGN_NEGATIVE:
  ------------------
  |  Branch (1187:9): [True: 4, False: 18.6k]
  ------------------
 1188|      8|        case UNUM_SIGN_ACCOUNTING_NEGATIVE:
  ------------------
  |  Branch (1188:9): [True: 4, False: 18.6k]
  ------------------
 1189|      8|            switch (signum) {
 1190|      2|                case SIGNUM_NEG:
  ------------------
  |  Branch (1190:17): [True: 2, False: 6]
  ------------------
 1191|      2|                    return PATTERN_SIGN_TYPE_NEG;
 1192|      2|                case SIGNUM_NEG_ZERO:
  ------------------
  |  Branch (1192:17): [True: 2, False: 6]
  ------------------
 1193|      6|                case SIGNUM_POS_ZERO:
  ------------------
  |  Branch (1193:17): [True: 4, False: 4]
  ------------------
 1194|      6|                case SIGNUM_POS:
  ------------------
  |  Branch (1194:17): [True: 0, False: 8]
  ------------------
 1195|      6|                    return PATTERN_SIGN_TYPE_POS;
 1196|      0|                default:
  ------------------
  |  Branch (1196:17): [True: 0, False: 8]
  ------------------
 1197|      0|                    break;
 1198|      8|            }
 1199|      0|            break;
 1200|       |
 1201|      8|        case UNUM_SIGN_NEVER:
  ------------------
  |  Branch (1201:9): [True: 8, False: 18.6k]
  ------------------
 1202|      8|            return PATTERN_SIGN_TYPE_POS;
 1203|       |
 1204|      0|        default:
  ------------------
  |  Branch (1204:9): [True: 0, False: 18.6k]
  ------------------
 1205|      0|            break;
 1206|  18.6k|    }
 1207|       |
 1208|  18.6k|    UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
 1209|      0|    return PATTERN_SIGN_TYPE_POS;
 1210|  18.6k|}

_ZN6icu_786number4impl17ParsedPatternInfoC2Ev:
   81|  12.7k|            : state(this->pattern), currentSubpattern(nullptr) {}
_ZN6icu_786number4impl17ParsedPatternInfo11ParserStateC2ERKNS_13UnicodeStringE:
  116|  12.7k|                : pattern(_pattern) {}
_ZN6icu_786number4impl17ParsedPatternInfoD2Ev:
   83|  12.7k|    ~ParsedPatternInfo() override = default;

_ZN6icu_786number4impl18MultiplierProducerD2Ev:
   91|  3.56k|MultiplierProducer::~MultiplierProducer() = default;
_ZN6icu_786number9Precision9unlimitedEv:
   94|    192|Precision Precision::unlimited() {
   95|    192|    return Precision(RND_NONE, {});
   96|    192|}
_ZN6icu_786number9Precision7integerEv:
   98|  2.67k|FractionPrecision Precision::integer() {
   99|  2.67k|    return constructFraction(0, 0);
  100|  2.67k|}
_ZN6icu_786number9Precision11minFractionEi:
  110|     37|FractionPrecision Precision::minFraction(int32_t minFractionPlaces) {
  111|     37|    if (minFractionPlaces >= 0 && minFractionPlaces <= kMaxIntFracSig) {
  ------------------
  |  Branch (111:9): [True: 37, False: 0]
  |  Branch (111:35): [True: 32, False: 5]
  ------------------
  112|     32|        return constructFraction(minFractionPlaces, -1);
  113|     32|    } else {
  114|      5|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
  115|      5|    }
  116|     37|}
_ZN6icu_786number9Precision11maxFractionEi:
  118|  5.44k|FractionPrecision Precision::maxFraction(int32_t maxFractionPlaces) {
  119|  5.44k|    if (maxFractionPlaces >= 0 && maxFractionPlaces <= kMaxIntFracSig) {
  ------------------
  |  Branch (119:9): [True: 5.44k, False: 0]
  |  Branch (119:35): [True: 5.44k, False: 0]
  ------------------
  120|  5.44k|        return constructFraction(0, maxFractionPlaces);
  121|  5.44k|    } else {
  122|      0|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
  123|      0|    }
  124|  5.44k|}
_ZN6icu_786number9Precision14minMaxFractionEii:
  126|    379|FractionPrecision Precision::minMaxFraction(int32_t minFractionPlaces, int32_t maxFractionPlaces) {
  127|    379|    if (minFractionPlaces >= 0 && maxFractionPlaces <= kMaxIntFracSig &&
  ------------------
  |  Branch (127:9): [True: 379, False: 0]
  |  Branch (127:35): [True: 368, False: 11]
  ------------------
  128|    379|        minFractionPlaces <= maxFractionPlaces) {
  ------------------
  |  Branch (128:9): [True: 368, False: 0]
  ------------------
  129|    368|        return constructFraction(minFractionPlaces, maxFractionPlaces);
  130|    368|    } else {
  131|     11|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
  132|     11|    }
  133|    379|}
_ZN6icu_786number9Precision20minSignificantDigitsEi:
  143|     85|Precision Precision::minSignificantDigits(int32_t minSignificantDigits) {
  144|     85|    if (minSignificantDigits >= 1 && minSignificantDigits <= kMaxIntFracSig) {
  ------------------
  |  Branch (144:9): [True: 85, False: 0]
  |  Branch (144:38): [True: 83, False: 2]
  ------------------
  145|     83|        return constructSignificant(minSignificantDigits, -1);
  146|     83|    } else {
  147|      2|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
  148|      2|    }
  149|     85|}
_ZN6icu_786number9Precision23minMaxSignificantDigitsEii:
  159|    132|Precision Precision::minMaxSignificantDigits(int32_t minSignificantDigits, int32_t maxSignificantDigits) {
  160|    132|    if (minSignificantDigits >= 1 && maxSignificantDigits <= kMaxIntFracSig &&
  ------------------
  |  Branch (160:9): [True: 132, False: 0]
  |  Branch (160:38): [True: 124, False: 8]
  ------------------
  161|    132|        minSignificantDigits <= maxSignificantDigits) {
  ------------------
  |  Branch (161:9): [True: 124, False: 0]
  ------------------
  162|    124|        return constructSignificant(minSignificantDigits, maxSignificantDigits);
  163|    124|    } else {
  164|      8|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
  165|      8|    }
  166|    132|}
_ZNK6icu_786number9Precision19trailingZeroDisplayE26UNumberTrailingZeroDisplay:
  168|     19|Precision Precision::trailingZeroDisplay(UNumberTrailingZeroDisplay trailingZeroDisplay) const {
  169|     19|    Precision result(*this); // copy constructor
  170|     19|    result.fTrailingZeroDisplay = trailingZeroDisplay;
  171|     19|    return result;
  172|     19|}
_ZNK6icu_786number17FractionPrecision21withSignificantDigitsEii23UNumberRoundingPriority:
  201|     89|        UNumberRoundingPriority priority) const {
  202|     89|    if (fType == RND_ERROR) { return *this; } // no-op in error state
  ------------------
  |  Branch (202:9): [True: 1, False: 88]
  ------------------
  203|     88|    if (minSignificantDigits >= 1 &&
  ------------------
  |  Branch (203:9): [True: 88, False: 0]
  ------------------
  204|     88|            maxSignificantDigits >= minSignificantDigits &&
  ------------------
  |  Branch (204:13): [True: 88, False: 0]
  ------------------
  205|     88|            maxSignificantDigits <= kMaxIntFracSig) {
  ------------------
  |  Branch (205:13): [True: 73, False: 15]
  ------------------
  206|     73|        return constructFractionSignificant(
  207|     73|            *this,
  208|     73|            minSignificantDigits,
  209|     73|            maxSignificantDigits,
  210|     73|            priority,
  211|     73|            false);
  212|     73|    } else {
  213|     15|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
  214|     15|    }
  215|     88|}
_ZNK6icu_786number17FractionPrecision13withMinDigitsEi:
  217|  2.68k|Precision FractionPrecision::withMinDigits(int32_t minSignificantDigits) const {
  218|  2.68k|    if (fType == RND_ERROR) { return *this; } // no-op in error state
  ------------------
  |  Branch (218:9): [True: 1, False: 2.68k]
  ------------------
  219|  2.68k|    if (minSignificantDigits >= 1 && minSignificantDigits <= kMaxIntFracSig) {
  ------------------
  |  Branch (219:9): [True: 2.68k, False: 0]
  |  Branch (219:38): [True: 2.68k, False: 1]
  ------------------
  220|  2.68k|        return constructFractionSignificant(
  221|  2.68k|            *this,
  222|  2.68k|            1,
  223|  2.68k|            minSignificantDigits,
  224|  2.68k|            UNUM_ROUNDING_PRIORITY_RELAXED,
  225|  2.68k|            true);
  226|  2.68k|    } else {
  227|      1|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
  228|      1|    }
  229|  2.68k|}
_ZNK6icu_786number17FractionPrecision13withMaxDigitsEi:
  231|     70|Precision FractionPrecision::withMaxDigits(int32_t maxSignificantDigits) const {
  232|     70|    if (fType == RND_ERROR) { return *this; } // no-op in error state
  ------------------
  |  Branch (232:9): [True: 6, False: 64]
  ------------------
  233|     64|    if (maxSignificantDigits >= 1 && maxSignificantDigits <= kMaxIntFracSig) {
  ------------------
  |  Branch (233:9): [True: 64, False: 0]
  |  Branch (233:38): [True: 52, False: 12]
  ------------------
  234|     52|        return constructFractionSignificant(*this,
  235|     52|            1,
  236|     52|            maxSignificantDigits,
  237|     52|            UNUM_ROUNDING_PRIORITY_STRICT,
  238|     52|            true);
  239|     52|    } else {
  240|     12|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
  241|     12|    }
  242|     64|}
_ZN6icu_786number9Precision17constructFractionEii:
  280|  8.52k|FractionPrecision Precision::constructFraction(int32_t minFrac, int32_t maxFrac) {
  281|  8.52k|    FractionSignificantSettings settings{};
  282|  8.52k|    settings.fMinFrac = static_cast<digits_t>(minFrac);
  283|  8.52k|    settings.fMaxFrac = static_cast<digits_t>(maxFrac);
  284|  8.52k|    settings.fMinSig = -1;
  285|  8.52k|    settings.fMaxSig = -1;
  286|  8.52k|    PrecisionUnion union_{};
  287|  8.52k|    union_.fracSig = settings;
  288|  8.52k|    return {RND_FRACTION, union_};
  289|  8.52k|}
_ZN6icu_786number9Precision20constructSignificantEii:
  291|    207|Precision Precision::constructSignificant(int32_t minSig, int32_t maxSig) {
  292|    207|    FractionSignificantSettings settings{};
  293|    207|    settings.fMinFrac = -1;
  294|    207|    settings.fMaxFrac = -1;
  295|    207|    settings.fMinSig = static_cast<digits_t>(minSig);
  296|    207|    settings.fMaxSig = static_cast<digits_t>(maxSig);
  297|    207|    PrecisionUnion union_{};
  298|    207|    union_.fracSig = settings;
  299|    207|    return {RND_SIGNIFICANT, union_};
  300|    207|}
_ZN6icu_786number9Precision28constructFractionSignificantERKNS0_17FractionPrecisionEii23UNumberRoundingPriorityb:
  308|  2.81k|        bool retain) {
  309|  2.81k|    FractionSignificantSettings settings = base.fUnion.fracSig;
  310|  2.81k|    settings.fMinSig = static_cast<digits_t>(minSig);
  311|  2.81k|    settings.fMaxSig = static_cast<digits_t>(maxSig);
  312|  2.81k|    settings.fPriority = priority;
  313|  2.81k|    settings.fRetain = retain;
  314|  2.81k|    PrecisionUnion union_{};
  315|  2.81k|    union_.fracSig = settings;
  316|  2.81k|    return {RND_FRACTION_SIGNIFICANT, union_};
  317|  2.81k|}
_ZN6icu_786number4impl12RoundingImplC2ERKNS0_9PrecisionE25UNumberFormatRoundingModeRKNS_12CurrencyUnitER10UErrorCode:
  350|  9.33k|        : fPrecision(precision), fRoundingMode(roundingMode), fPassThrough(false) {
  351|  9.33k|    if (precision.fType == Precision::RND_CURRENCY) {
  ------------------
  |  Branch (351:9): [True: 0, False: 9.33k]
  ------------------
  352|      0|        fPrecision = precision.withCurrency(currency, status);
  353|      0|    }
  354|  9.33k|}
_ZN6icu_786number4impl12RoundingImpl11passThroughEv:
  356|  3.55k|RoundingImpl RoundingImpl::passThrough() {
  357|  3.55k|    return {};
  358|  3.55k|}
_ZN6icu_786number4impl12RoundingImpl24chooseMultiplierAndApplyERNS1_15DecimalQuantityERKNS1_18MultiplierProducerER10UErrorCode:
  366|  3.47k|                                  UErrorCode &status) {
  367|       |    // Do not call this method with zero, NaN, or infinity.
  368|  3.47k|    U_ASSERT(!input.isZeroish());
  ------------------
  |  |   35|  3.47k|#   define U_ASSERT(exp) (void)0
  ------------------
  369|       |
  370|       |    // Perform the first attempt at rounding.
  371|  3.47k|    int magnitude = input.getMagnitude();
  372|  3.47k|    int multiplier = producer.getMultiplier(magnitude);
  373|  3.47k|    input.adjustMagnitude(multiplier);
  374|  3.47k|    apply(input, status);
  375|       |
  376|       |    // If the number rounded to zero, exit.
  377|  3.47k|    if (input.isZeroish() || U_FAILURE(status)) {
  ------------------
  |  Branch (377:9): [True: 29, False: 3.44k]
  |  Branch (377:30): [True: 0, False: 3.44k]
  ------------------
  378|     29|        return multiplier;
  379|     29|    }
  380|       |
  381|       |    // If the new magnitude after rounding is the same as it was before rounding, then we are done.
  382|       |    // This case applies to most numbers.
  383|  3.44k|    if (input.getMagnitude() == magnitude + multiplier) {
  ------------------
  |  Branch (383:9): [True: 3.32k, False: 122]
  ------------------
  384|  3.32k|        return multiplier;
  385|  3.32k|    }
  386|       |
  387|       |    // If the above case DIDN'T apply, then we have a case like 99.9 -> 100 or 999.9 -> 1000:
  388|       |    // The number rounded up to the next magnitude. Check if the multiplier changes; if it doesn't,
  389|       |    // we do not need to make any more adjustments.
  390|    122|    int _multiplier = producer.getMultiplier(magnitude + 1);
  391|    122|    if (multiplier == _multiplier) {
  ------------------
  |  Branch (391:9): [True: 84, False: 38]
  ------------------
  392|     84|        return multiplier;
  393|     84|    }
  394|       |
  395|       |    // We have a case like 999.9 -> 1000, where the correct output is "1K", not "1000".
  396|       |    // Fix the magnitude and re-apply the rounding strategy.
  397|     38|    input.adjustMagnitude(_multiplier - multiplier);
  398|     38|    apply(input, status);
  399|     38|    return _multiplier;
  400|    122|}
_ZNK6icu_786number4impl12RoundingImpl5applyERNS1_15DecimalQuantityER10UErrorCode:
  403|  14.4k|void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const {
  404|  14.4k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (404:9): [True: 0, False: 14.4k]
  ------------------
  405|      0|        return;
  406|      0|    }
  407|  14.4k|    if (fPassThrough) {
  ------------------
  |  Branch (407:9): [True: 3.55k, False: 10.8k]
  ------------------
  408|  3.55k|        return;
  409|  3.55k|    }
  410|  10.8k|    int32_t resolvedMinFraction = 0;
  411|  10.8k|    switch (fPrecision.fType) {
  412|      0|        case Precision::RND_BOGUS:
  ------------------
  |  Branch (412:9): [True: 0, False: 10.8k]
  ------------------
  413|      0|        case Precision::RND_ERROR:
  ------------------
  |  Branch (413:9): [True: 0, False: 10.8k]
  ------------------
  414|       |            // Errors should be caught before the apply() method is called
  415|      0|            status = U_INTERNAL_PROGRAM_ERROR;
  416|      0|            break;
  417|       |
  418|    520|        case Precision::RND_NONE:
  ------------------
  |  Branch (418:9): [True: 520, False: 10.3k]
  ------------------
  419|    520|            value.roundToInfinity();
  420|    520|            break;
  421|       |
  422|  5.67k|        case Precision::RND_FRACTION:
  ------------------
  |  Branch (422:9): [True: 5.67k, False: 5.21k]
  ------------------
  423|  5.67k|            value.roundToMagnitude(
  424|  5.67k|                    getRoundingMagnitudeFraction(fPrecision.fUnion.fracSig.fMaxFrac),
  425|  5.67k|                    fRoundingMode,
  426|  5.67k|                    status);
  427|  5.67k|            resolvedMinFraction =
  428|  5.67k|                    uprv_max(0, -getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac));
  ------------------
  |  | 1526|  5.67k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|  5.67k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.67k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.67k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  429|  5.67k|            break;
  430|       |
  431|    554|        case Precision::RND_SIGNIFICANT:
  ------------------
  |  Branch (431:9): [True: 554, False: 10.3k]
  ------------------
  432|    554|            value.roundToMagnitude(
  433|    554|                    getRoundingMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMaxSig),
  434|    554|                    fRoundingMode,
  435|    554|                    status);
  436|    554|            resolvedMinFraction =
  437|    554|                    uprv_max(0, -getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig));
  ------------------
  |  | 1526|    554|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|    554|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    554|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    554|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  438|       |            // Make sure that digits are displayed on zero.
  439|    554|            if (value.isZeroish() && fPrecision.fUnion.fracSig.fMinSig > 0) {
  ------------------
  |  Branch (439:17): [True: 25, False: 529]
  |  Branch (439:38): [True: 25, False: 0]
  ------------------
  440|     25|                value.increaseMinIntegerTo(1);
  441|     25|            }
  442|    554|            break;
  443|       |
  444|  4.14k|        case Precision::RND_FRACTION_SIGNIFICANT: {
  ------------------
  |  Branch (444:9): [True: 4.14k, False: 6.75k]
  ------------------
  445|       |            // From ECMA-402:
  446|       |            /*
  447|       |            Let sResult be ToRawPrecision(...).
  448|       |            Let fResult be ToRawFixed(...).
  449|       |            If intlObj.[[RoundingType]] is morePrecision, then
  450|       |                If sResult.[[RoundingMagnitude]] ≤ fResult.[[RoundingMagnitude]], then
  451|       |                    Let result be sResult.
  452|       |                Else,
  453|       |                    Let result be fResult.
  454|       |            Else,
  455|       |                Assert: intlObj.[[RoundingType]] is lessPrecision.
  456|       |                If sResult.[[RoundingMagnitude]] ≤ fResult.[[RoundingMagnitude]], then
  457|       |                    Let result be fResult.
  458|       |                Else,
  459|       |                    Let result be sResult.
  460|       |            */
  461|       |
  462|  4.14k|            int32_t roundingMag1 = getRoundingMagnitudeFraction(fPrecision.fUnion.fracSig.fMaxFrac);
  463|  4.14k|            int32_t roundingMag2 = getRoundingMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMaxSig);
  464|  4.14k|            int32_t roundingMag;
  465|  4.14k|            if (fPrecision.fUnion.fracSig.fPriority == UNUM_ROUNDING_PRIORITY_RELAXED) {
  ------------------
  |  Branch (465:17): [True: 3.92k, False: 221]
  ------------------
  466|  3.92k|                roundingMag = uprv_min(roundingMag1, roundingMag2);
  ------------------
  |  | 1529|  3.92k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|  3.92k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.92k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.92k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  467|  3.92k|            } else {
  468|    221|                roundingMag = uprv_max(roundingMag1, roundingMag2);
  ------------------
  |  | 1526|    221|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|    221|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    221|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    221|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  469|    221|            }
  470|  4.14k|            if (!value.isZeroish()) {
  ------------------
  |  Branch (470:17): [True: 4.05k, False: 88]
  ------------------
  471|  4.05k|                int32_t upperMag = value.getMagnitude();
  472|  4.05k|                value.roundToMagnitude(roundingMag, fRoundingMode, status);
  473|  4.05k|                if (!value.isZeroish() && value.getMagnitude() != upperMag && roundingMag1 == roundingMag2) {
  ------------------
  |  Branch (473:21): [True: 4.01k, False: 43]
  |  Branch (473:43): [True: 109, False: 3.90k]
  |  Branch (473:79): [True: 10, False: 99]
  ------------------
  474|       |                    // roundingMag2 needs to be the magnitude after rounding
  475|     10|                    roundingMag2 += 1;
  476|     10|                }
  477|  4.05k|            }
  478|       |
  479|  4.14k|            int32_t displayMag1 = getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac);
  480|  4.14k|            int32_t displayMag2 = getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig);
  481|  4.14k|            int32_t displayMag;
  482|  4.14k|            if (fPrecision.fUnion.fracSig.fRetain) {
  ------------------
  |  Branch (482:17): [True: 3.98k, False: 162]
  ------------------
  483|       |                // withMinDigits + withMaxDigits
  484|  3.98k|                displayMag = uprv_min(displayMag1, displayMag2);
  ------------------
  |  | 1529|  3.98k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|  3.98k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.98k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.98k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  485|  3.98k|            } else if (fPrecision.fUnion.fracSig.fPriority == UNUM_ROUNDING_PRIORITY_RELAXED) {
  ------------------
  |  Branch (485:24): [True: 50, False: 112]
  ------------------
  486|     50|                if (roundingMag2 <= roundingMag1) {
  ------------------
  |  Branch (486:21): [True: 19, False: 31]
  ------------------
  487|     19|                    displayMag = displayMag2;
  488|     31|                } else {
  489|     31|                    displayMag = displayMag1;
  490|     31|                }
  491|    112|            } else {
  492|    112|                U_ASSERT(fPrecision.fUnion.fracSig.fPriority == UNUM_ROUNDING_PRIORITY_STRICT);
  ------------------
  |  |   35|    112|#   define U_ASSERT(exp) (void)0
  ------------------
  493|    112|                if (roundingMag2 <= roundingMag1) {
  ------------------
  |  Branch (493:21): [True: 60, False: 52]
  ------------------
  494|     60|                    displayMag = displayMag1;
  495|     60|                } else {
  496|     52|                    displayMag = displayMag2;
  497|     52|                }
  498|    112|            }
  499|  4.14k|            resolvedMinFraction = uprv_max(0, -displayMag);
  ------------------
  |  | 1526|  4.14k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|  4.14k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.14k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.14k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  500|       |
  501|  4.14k|            break;
  502|      0|        }
  503|       |
  504|      0|        case Precision::RND_INCREMENT:
  ------------------
  |  Branch (504:9): [True: 0, False: 10.8k]
  ------------------
  505|      0|            value.roundToIncrement(
  506|      0|                    fPrecision.fUnion.increment.fIncrement,
  507|      0|                    fPrecision.fUnion.increment.fIncrementMagnitude,
  508|      0|                    fRoundingMode,
  509|      0|                    status);
  510|      0|            resolvedMinFraction = fPrecision.fUnion.increment.fMinFrac;
  511|      0|            break;
  512|       |
  513|      0|        case Precision::RND_INCREMENT_ONE:
  ------------------
  |  Branch (513:9): [True: 0, False: 10.8k]
  ------------------
  514|      0|            value.roundToMagnitude(
  515|      0|                    fPrecision.fUnion.increment.fIncrementMagnitude,
  516|      0|                    fRoundingMode,
  517|      0|                    status);
  518|      0|            resolvedMinFraction = fPrecision.fUnion.increment.fMinFrac;
  519|      0|            break;
  520|       |
  521|      0|        case Precision::RND_INCREMENT_FIVE:
  ------------------
  |  Branch (521:9): [True: 0, False: 10.8k]
  ------------------
  522|      0|            value.roundToNickel(
  523|      0|                    fPrecision.fUnion.increment.fIncrementMagnitude,
  524|      0|                    fRoundingMode,
  525|      0|                    status);
  526|      0|            resolvedMinFraction = fPrecision.fUnion.increment.fMinFrac;
  527|      0|            break;
  528|       |
  529|      0|        case Precision::RND_CURRENCY:
  ------------------
  |  Branch (529:9): [True: 0, False: 10.8k]
  ------------------
  530|       |            // Call .withCurrency() before .apply()!
  531|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  532|       |
  533|      0|        default:
  ------------------
  |  Branch (533:9): [True: 0, False: 10.8k]
  ------------------
  534|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  535|  10.8k|    }
  536|       |
  537|  10.8k|    if (fPrecision.fTrailingZeroDisplay == UNUM_TRAILING_ZERO_AUTO ||
  ------------------
  |  Branch (537:9): [True: 10.8k, False: 48]
  ------------------
  538|       |            // PLURAL_OPERAND_T returns fraction digits as an integer
  539|  10.8k|            value.getPluralOperand(PLURAL_OPERAND_T) != 0) {
  ------------------
  |  Branch (539:13): [True: 26, False: 22]
  ------------------
  540|  10.8k|        value.setMinFraction(resolvedMinFraction);
  541|  10.8k|    }
  542|  10.8k|}
number_rounding.cpp:_ZN12_GLOBAL__N_128getRoundingMagnitudeFractionEi:
   61|  9.82k|int32_t getRoundingMagnitudeFraction(int maxFrac) {
   62|  9.82k|    if (maxFrac == -1) {
  ------------------
  |  Branch (62:9): [True: 64, False: 9.75k]
  ------------------
   63|     64|        return INT32_MIN;
   64|     64|    }
   65|  9.75k|    return -maxFrac;
   66|  9.82k|}
number_rounding.cpp:_ZN12_GLOBAL__N_127getDisplayMagnitudeFractionEi:
   76|  9.82k|int32_t getDisplayMagnitudeFraction(int minFrac) {
   77|  9.82k|    if (minFrac == 0) {
  ------------------
  |  Branch (77:9): [True: 9.60k, False: 214]
  ------------------
   78|  9.60k|        return INT32_MAX;
   79|  9.60k|    }
   80|    214|    return -minFrac;
   81|  9.82k|}
number_rounding.cpp:_ZN12_GLOBAL__N_131getRoundingMagnitudeSignificantERKN6icu_786number4impl15DecimalQuantityEi:
   68|  4.69k|int32_t getRoundingMagnitudeSignificant(const DecimalQuantity &value, int maxSig) {
   69|  4.69k|    if (maxSig == -1) {
  ------------------
  |  Branch (69:9): [True: 273, False: 4.42k]
  ------------------
   70|    273|        return INT32_MIN;
   71|    273|    }
   72|  4.42k|    int magnitude = value.isZeroish() ? 0 : value.getMagnitude();
  ------------------
  |  Branch (72:21): [True: 109, False: 4.31k]
  ------------------
   73|  4.42k|    return magnitude - maxSig + 1;
   74|  4.69k|}
number_rounding.cpp:_ZN12_GLOBAL__N_130getDisplayMagnitudeSignificantERKN6icu_786number4impl15DecimalQuantityEi:
   83|  4.69k|int32_t getDisplayMagnitudeSignificant(const DecimalQuantity &value, int minSig) {
   84|  4.69k|    int magnitude = value.isZeroish() ? 0 : value.getMagnitude();
  ------------------
  |  Branch (84:21): [True: 156, False: 4.54k]
  ------------------
   85|  4.69k|    return magnitude - minSig + 1;
   86|  4.69k|}

_ZN6icu_786number4impl13roundingutils20getRoundingDirectionEbbNS2_7SectionE25UNumberFormatRoundingModeR10UErrorCode:
   46|  4.54k|                     UErrorCode &status) {
   47|  4.54k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (47:9): [True: 0, False: 4.54k]
  ------------------
   48|      0|        return false;
   49|      0|    }
   50|  4.54k|    switch (roundingMode) {
   51|      0|        case RoundingMode::UNUM_ROUND_UP:
  ------------------
  |  Branch (51:9): [True: 0, False: 4.54k]
  ------------------
   52|       |            // round away from zero
   53|      0|            return false;
   54|       |
   55|      0|        case RoundingMode::UNUM_ROUND_DOWN:
  ------------------
  |  Branch (55:9): [True: 0, False: 4.54k]
  ------------------
   56|       |            // round toward zero
   57|      0|            return true;
   58|       |
   59|      0|        case RoundingMode::UNUM_ROUND_CEILING:
  ------------------
  |  Branch (59:9): [True: 0, False: 4.54k]
  ------------------
   60|       |            // round toward positive infinity
   61|      0|            return isNegative;
   62|       |
   63|      0|        case RoundingMode::UNUM_ROUND_FLOOR:
  ------------------
  |  Branch (63:9): [True: 0, False: 4.54k]
  ------------------
   64|       |            // round toward negative infinity
   65|      0|            return !isNegative;
   66|       |
   67|      0|        case RoundingMode::UNUM_ROUND_HALFUP:
  ------------------
  |  Branch (67:9): [True: 0, False: 4.54k]
  ------------------
   68|      0|            switch (section) {
   69|      0|                case SECTION_MIDPOINT:
  ------------------
  |  Branch (69:17): [True: 0, False: 0]
  ------------------
   70|      0|                    return false;
   71|      0|                case SECTION_LOWER:
  ------------------
  |  Branch (71:17): [True: 0, False: 0]
  ------------------
   72|      0|                    return true;
   73|      0|                case SECTION_UPPER:
  ------------------
  |  Branch (73:17): [True: 0, False: 0]
  ------------------
   74|      0|                    return false;
   75|      0|                default:
  ------------------
  |  Branch (75:17): [True: 0, False: 0]
  ------------------
   76|      0|                    break;
   77|      0|            }
   78|      0|            break;
   79|       |
   80|      0|        case RoundingMode::UNUM_ROUND_HALFDOWN:
  ------------------
  |  Branch (80:9): [True: 0, False: 4.54k]
  ------------------
   81|      0|            switch (section) {
   82|      0|                case SECTION_MIDPOINT:
  ------------------
  |  Branch (82:17): [True: 0, False: 0]
  ------------------
   83|      0|                    return true;
   84|      0|                case SECTION_LOWER:
  ------------------
  |  Branch (84:17): [True: 0, False: 0]
  ------------------
   85|      0|                    return true;
   86|      0|                case SECTION_UPPER:
  ------------------
  |  Branch (86:17): [True: 0, False: 0]
  ------------------
   87|      0|                    return false;
   88|      0|                default:
  ------------------
  |  Branch (88:17): [True: 0, False: 0]
  ------------------
   89|      0|                    break;
   90|      0|            }
   91|      0|            break;
   92|       |
   93|  4.54k|        case RoundingMode::UNUM_ROUND_HALFEVEN:
  ------------------
  |  Branch (93:9): [True: 4.54k, False: 0]
  ------------------
   94|  4.54k|            switch (section) {
   95|     33|                case SECTION_MIDPOINT:
  ------------------
  |  Branch (95:17): [True: 33, False: 4.51k]
  ------------------
   96|     33|                    return isEven;
   97|  3.07k|                case SECTION_LOWER:
  ------------------
  |  Branch (97:17): [True: 3.07k, False: 1.47k]
  ------------------
   98|  3.07k|                    return true;
   99|  1.43k|                case SECTION_UPPER:
  ------------------
  |  Branch (99:17): [True: 1.43k, False: 3.10k]
  ------------------
  100|  1.43k|                    return false;
  101|      0|                default:
  ------------------
  |  Branch (101:17): [True: 0, False: 4.54k]
  ------------------
  102|      0|                    break;
  103|  4.54k|            }
  104|      0|            break;
  105|       |
  106|      0|        case RoundingMode::UNUM_ROUND_HALF_ODD:
  ------------------
  |  Branch (106:9): [True: 0, False: 4.54k]
  ------------------
  107|      0|            switch (section) {
  108|      0|                case SECTION_MIDPOINT:
  ------------------
  |  Branch (108:17): [True: 0, False: 0]
  ------------------
  109|      0|                    return !isEven;
  110|      0|                case SECTION_LOWER:
  ------------------
  |  Branch (110:17): [True: 0, False: 0]
  ------------------
  111|      0|                    return true;
  112|      0|                case SECTION_UPPER:
  ------------------
  |  Branch (112:17): [True: 0, False: 0]
  ------------------
  113|      0|                    return false;
  114|      0|                default:
  ------------------
  |  Branch (114:17): [True: 0, False: 0]
  ------------------
  115|      0|                    break;
  116|      0|            }
  117|      0|            break;
  118|       |
  119|      0|        case RoundingMode::UNUM_ROUND_HALF_CEILING:
  ------------------
  |  Branch (119:9): [True: 0, False: 4.54k]
  ------------------
  120|      0|            switch (section) {
  121|      0|                case SECTION_MIDPOINT:
  ------------------
  |  Branch (121:17): [True: 0, False: 0]
  ------------------
  122|      0|                    return isNegative;
  123|      0|                case SECTION_LOWER:
  ------------------
  |  Branch (123:17): [True: 0, False: 0]
  ------------------
  124|      0|                    return true;
  125|      0|                case SECTION_UPPER:
  ------------------
  |  Branch (125:17): [True: 0, False: 0]
  ------------------
  126|      0|                    return false;
  127|      0|                default:
  ------------------
  |  Branch (127:17): [True: 0, False: 0]
  ------------------
  128|      0|                    break;
  129|      0|            }
  130|      0|            break;
  131|       |
  132|      0|        case RoundingMode::UNUM_ROUND_HALF_FLOOR:
  ------------------
  |  Branch (132:9): [True: 0, False: 4.54k]
  ------------------
  133|      0|            switch (section) {
  134|      0|                case SECTION_MIDPOINT:
  ------------------
  |  Branch (134:17): [True: 0, False: 0]
  ------------------
  135|      0|                    return !isNegative;
  136|      0|                case SECTION_LOWER:
  ------------------
  |  Branch (136:17): [True: 0, False: 0]
  ------------------
  137|      0|                    return true;
  138|      0|                case SECTION_UPPER:
  ------------------
  |  Branch (138:17): [True: 0, False: 0]
  ------------------
  139|      0|                    return false;
  140|      0|                default:
  ------------------
  |  Branch (140:17): [True: 0, False: 0]
  ------------------
  141|      0|                    break;
  142|      0|            }
  143|      0|            break;
  144|       |
  145|      0|        default:
  ------------------
  |  Branch (145:9): [True: 0, False: 4.54k]
  ------------------
  146|      0|            break;
  147|  4.54k|    }
  148|       |
  149|      0|    status = U_FORMAT_INEXACT_ERROR;
  150|      0|    return false;
  151|  4.54k|}
_ZN6icu_786number4impl13roundingutils16roundsAtMidpointEi:
  163|  3.09k|inline bool roundsAtMidpoint(int roundingMode) {
  164|  3.09k|    switch (roundingMode) {
  165|      0|        case RoundingMode::UNUM_ROUND_UP:
  ------------------
  |  Branch (165:9): [True: 0, False: 3.09k]
  ------------------
  166|      0|        case RoundingMode::UNUM_ROUND_DOWN:
  ------------------
  |  Branch (166:9): [True: 0, False: 3.09k]
  ------------------
  167|      0|        case RoundingMode::UNUM_ROUND_CEILING:
  ------------------
  |  Branch (167:9): [True: 0, False: 3.09k]
  ------------------
  168|      0|        case RoundingMode::UNUM_ROUND_FLOOR:
  ------------------
  |  Branch (168:9): [True: 0, False: 3.09k]
  ------------------
  169|      0|            return false;
  170|       |
  171|  3.09k|        default:
  ------------------
  |  Branch (171:9): [True: 3.09k, False: 0]
  ------------------
  172|  3.09k|            return true;
  173|  3.09k|    }
  174|  3.09k|}
_ZN6icu_786number4impl12RoundingImplC2Ev:
  186|  13.0k|    RoundingImpl() = default;  // defaults to pass-through rounder

_ZN6icu_786number4impl18ScientificModifierC2Ev:
   30|  9.45k|ScientificModifier::ScientificModifier() : fExponent(0), fHandler(nullptr) {}
_ZN6icu_786number4impl18ScientificModifier3setEiPKNS1_17ScientificHandlerE:
   32|    182|void ScientificModifier::set(int32_t exponent, const ScientificHandler *handler) {
   33|       |    // ScientificModifier should be set only once.
   34|    182|    U_ASSERT(fHandler == nullptr);
  ------------------
  |  |   35|    182|#   define U_ASSERT(exp) (void)0
  ------------------
   35|    182|    fExponent = exponent;
   36|    182|    fHandler = handler;
   37|    182|}
_ZNK6icu_786number4impl18ScientificModifier5applyERNS_22FormattedStringBuilderEiiR10UErrorCode:
   40|    182|                                  UErrorCode &status) const {
   41|       |    // FIXME: Localized exponent separator location.
   42|    182|    int i = rightIndex;
   43|       |    // Append the exponent separator and sign
   44|    182|    i += output.insert(
   45|    182|            i,
   46|    182|            fHandler->fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kExponentialSymbol),
   47|    182|            {UFIELD_CATEGORY_NUMBER, UNUM_EXPONENT_SYMBOL_FIELD},
   48|    182|            status);
   49|    182|    if (fExponent < 0 && fHandler->fSettings.fExponentSignDisplay != UNUM_SIGN_NEVER) {
  ------------------
  |  Branch (49:9): [True: 65, False: 117]
  |  Branch (49:26): [True: 65, False: 0]
  ------------------
   50|     65|        i += output.insert(
   51|     65|                i,
   52|     65|                fHandler->fSymbols
   53|     65|                        ->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kMinusSignSymbol),
   54|     65|                {UFIELD_CATEGORY_NUMBER, UNUM_EXPONENT_SIGN_FIELD},
   55|     65|                status);
   56|    117|    } else if (fExponent >= 0 && fHandler->fSettings.fExponentSignDisplay == UNUM_SIGN_ALWAYS) {
  ------------------
  |  Branch (56:16): [True: 117, False: 0]
  |  Branch (56:34): [True: 13, False: 104]
  ------------------
   57|     13|        i += output.insert(
   58|     13|                i,
   59|     13|                fHandler->fSymbols
   60|     13|                        ->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPlusSignSymbol),
   61|     13|                {UFIELD_CATEGORY_NUMBER, UNUM_EXPONENT_SIGN_FIELD},
   62|     13|                status);
   63|     13|    }
   64|       |    // Append the exponent digits (using a simple inline algorithm)
   65|    182|    int32_t disp = std::abs(fExponent);
   66|  13.3k|    for (int j = 0; j < fHandler->fSettings.fMinExponentDigits || disp > 0; j++, disp /= 10) {
  ------------------
  |  Branch (66:21): [True: 12.7k, False: 573]
  |  Branch (66:67): [True: 391, False: 182]
  ------------------
   67|  13.1k|        auto d = static_cast<int8_t>(disp % 10);
   68|  13.1k|        i += utils::insertDigitFromSymbols(
   69|  13.1k|                output,
   70|  13.1k|                i - j,
   71|  13.1k|                d,
   72|  13.1k|                *fHandler->fSymbols,
   73|  13.1k|                {UFIELD_CATEGORY_NUMBER, UNUM_EXPONENT_FIELD},
   74|  13.1k|                status);
   75|  13.1k|    }
   76|    182|    return i - rightIndex;
   77|    182|}
_ZN6icu_786number4impl17ScientificHandlerC2EPKNS0_8NotationEPKNS_20DecimalFormatSymbolsEPKNS1_19MicroPropsGeneratorE:
  119|    192|	fSettings(notation->fUnion.scientific), fSymbols(symbols), fParent(parent) {}
_ZNK6icu_786number4impl17ScientificHandler15processQuantityERNS1_15DecimalQuantityERNS1_10MicroPropsER10UErrorCode:
  122|    192|                                        UErrorCode &status) const {
  123|    192|    fParent->processQuantity(quantity, micros, status);
  124|    192|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (124:9): [True: 0, False: 192]
  ------------------
  125|       |
  126|       |    // Do not apply scientific notation to special doubles
  127|    192|    if (quantity.isInfinite() || quantity.isNaN()) {
  ------------------
  |  Branch (127:9): [True: 2, False: 190]
  |  Branch (127:34): [True: 8, False: 182]
  ------------------
  128|     10|        micros.modInner = &micros.helpers.emptyStrongModifier;
  129|     10|        return;
  130|     10|    }
  131|       |
  132|       |    // Treat zero as if it had magnitude 0
  133|    182|    int32_t exponent;
  134|    182|    if (quantity.isZeroish()) {
  ------------------
  |  Branch (134:9): [True: 8, False: 174]
  ------------------
  135|      8|        if (fSettings.fRequireMinInt && micros.rounder.isSignificantDigits()) {
  ------------------
  |  Branch (135:13): [True: 0, False: 8]
  |  Branch (135:41): [True: 0, False: 0]
  ------------------
  136|       |            // Show "00.000E0" on pattern "00.000E0"
  137|      0|            micros.rounder.apply(quantity, fSettings.fEngineeringInterval, status);
  138|      0|            exponent = 0;
  139|      8|        } else {
  140|      8|            micros.rounder.apply(quantity, status);
  141|      8|            exponent = 0;
  142|      8|        }
  143|    174|    } else {
  144|    174|        exponent = -micros.rounder.chooseMultiplierAndApply(quantity, *this, status);
  145|    174|    }
  146|       |
  147|       |    // Use MicroProps's helper ScientificModifier and save it as the modInner.
  148|    182|    ScientificModifier &mod = micros.helpers.scientificModifier;
  149|    182|    mod.set(exponent, this);
  150|    182|    micros.modInner = &mod;
  151|       |
  152|       |    // Change the exponent only after we select appropriate plural form
  153|       |    // for formatting purposes so that we preserve expected formatted
  154|       |    // string behavior.
  155|    182|    quantity.adjustExponent(exponent);
  156|       |
  157|       |    // We already performed rounding. Do not perform it again.
  158|    182|    micros.rounder = RoundingImpl::passThrough();
  159|    182|}
_ZNK6icu_786number4impl17ScientificHandler13getMultiplierEi:
  161|    181|int32_t ScientificHandler::getMultiplier(int32_t magnitude) const {
  162|    181|    int32_t interval = fSettings.fEngineeringInterval;
  163|    181|    int32_t digitsShown;
  164|    181|    if (fSettings.fRequireMinInt) {
  ------------------
  |  Branch (164:9): [True: 0, False: 181]
  ------------------
  165|       |        // For patterns like "000.00E0" and ".00E0"
  166|      0|        digitsShown = interval;
  167|    181|    } else if (interval <= 1) {
  ------------------
  |  Branch (167:16): [True: 170, False: 11]
  ------------------
  168|       |        // For patterns like "0.00E0" and "@@@E0"
  169|    170|        digitsShown = 1;
  170|    170|    } else {
  171|       |        // For patterns like "##0.00"
  172|     11|        digitsShown = ((magnitude % interval + interval) % interval) + 1;
  173|     11|    }
  174|    181|    return digitsShown - magnitude - 1;
  175|    181|}

_ZN6icu_786number4impl14stem_to_object8notationENS1_8skeleton8StemEnumE:
  167|  1.72k|Notation stem_to_object::notation(skeleton::StemEnum stem) {
  168|  1.72k|    switch (stem) {
  169|  1.66k|        case STEM_COMPACT_SHORT:
  ------------------
  |  Branch (169:9): [True: 1.66k, False: 58]
  ------------------
  170|  1.66k|            return Notation::compactShort();
  171|     58|        case STEM_COMPACT_LONG:
  ------------------
  |  Branch (171:9): [True: 58, False: 1.66k]
  ------------------
  172|     58|            return Notation::compactLong();
  173|      0|        case STEM_SCIENTIFIC:
  ------------------
  |  Branch (173:9): [True: 0, False: 1.72k]
  ------------------
  174|      0|            return Notation::scientific();
  175|      0|        case STEM_ENGINEERING:
  ------------------
  |  Branch (175:9): [True: 0, False: 1.72k]
  ------------------
  176|      0|            return Notation::engineering();
  177|      0|        case STEM_NOTATION_SIMPLE:
  ------------------
  |  Branch (177:9): [True: 0, False: 1.72k]
  ------------------
  178|      0|            return Notation::simple();
  179|      0|        default:
  ------------------
  |  Branch (179:9): [True: 0, False: 1.72k]
  ------------------
  180|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  181|  1.72k|    }
  182|  1.72k|}
_ZN6icu_786number4impl14stem_to_object4unitENS1_8skeleton8StemEnumE:
  184|    811|MeasureUnit stem_to_object::unit(skeleton::StemEnum stem) {
  185|    811|    switch (stem) {
  186|      0|        case STEM_BASE_UNIT:
  ------------------
  |  Branch (186:9): [True: 0, False: 811]
  ------------------
  187|      0|            return {};
  188|    811|        case STEM_PERCENT:
  ------------------
  |  Branch (188:9): [True: 811, False: 0]
  ------------------
  189|    811|            return MeasureUnit::getPercent();
  190|      0|        case STEM_PERMILLE:
  ------------------
  |  Branch (190:9): [True: 0, False: 811]
  ------------------
  191|      0|            return MeasureUnit::getPermille();
  192|      0|        default:
  ------------------
  |  Branch (192:9): [True: 0, False: 811]
  ------------------
  193|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  194|    811|    }
  195|    811|}
_ZN6icu_786number4impl14stem_to_object16groupingStrategyENS1_8skeleton8StemEnumE:
  241|     29|UNumberGroupingStrategy stem_to_object::groupingStrategy(skeleton::StemEnum stem) {
  242|     29|    switch (stem) {
  243|     10|        case STEM_GROUP_OFF:
  ------------------
  |  Branch (243:9): [True: 10, False: 19]
  ------------------
  244|     10|            return UNUM_GROUPING_OFF;
  245|      2|        case STEM_GROUP_MIN2:
  ------------------
  |  Branch (245:9): [True: 2, False: 27]
  ------------------
  246|      2|            return UNUM_GROUPING_MIN2;
  247|      0|        case STEM_GROUP_AUTO:
  ------------------
  |  Branch (247:9): [True: 0, False: 29]
  ------------------
  248|      0|            return UNUM_GROUPING_AUTO;
  249|     17|        case STEM_GROUP_ON_ALIGNED:
  ------------------
  |  Branch (249:9): [True: 17, False: 12]
  ------------------
  250|     17|            return UNUM_GROUPING_ON_ALIGNED;
  251|      0|        case STEM_GROUP_THOUSANDS:
  ------------------
  |  Branch (251:9): [True: 0, False: 29]
  ------------------
  252|      0|            return UNUM_GROUPING_THOUSANDS;
  253|      0|        default:
  ------------------
  |  Branch (253:9): [True: 0, False: 29]
  ------------------
  254|      0|            return UNUM_GROUPING_COUNT; // for objects, throw; for enums, return COUNT
  255|     29|    }
  256|     29|}
_ZN6icu_786number4impl14stem_to_object11signDisplayENS1_8skeleton8StemEnumE:
  279|     40|UNumberSignDisplay stem_to_object::signDisplay(skeleton::StemEnum stem) {
  280|     40|    switch (stem) {
  281|      0|        case STEM_SIGN_AUTO:
  ------------------
  |  Branch (281:9): [True: 0, False: 40]
  ------------------
  282|      0|            return UNUM_SIGN_AUTO;
  283|      9|        case STEM_SIGN_ALWAYS:
  ------------------
  |  Branch (283:9): [True: 9, False: 31]
  ------------------
  284|      9|            return UNUM_SIGN_ALWAYS;
  285|     10|        case STEM_SIGN_NEVER:
  ------------------
  |  Branch (285:9): [True: 10, False: 30]
  ------------------
  286|     10|            return UNUM_SIGN_NEVER;
  287|      5|        case STEM_SIGN_ACCOUNTING:
  ------------------
  |  Branch (287:9): [True: 5, False: 35]
  ------------------
  288|      5|            return UNUM_SIGN_ACCOUNTING;
  289|      2|        case STEM_SIGN_ACCOUNTING_ALWAYS:
  ------------------
  |  Branch (289:9): [True: 2, False: 38]
  ------------------
  290|      2|            return UNUM_SIGN_ACCOUNTING_ALWAYS;
  291|      5|        case STEM_SIGN_EXCEPT_ZERO:
  ------------------
  |  Branch (291:9): [True: 5, False: 35]
  ------------------
  292|      5|            return UNUM_SIGN_EXCEPT_ZERO;
  293|      4|        case STEM_SIGN_ACCOUNTING_EXCEPT_ZERO:
  ------------------
  |  Branch (293:9): [True: 4, False: 36]
  ------------------
  294|      4|            return UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO;
  295|      3|        case STEM_SIGN_NEGATIVE:
  ------------------
  |  Branch (295:9): [True: 3, False: 37]
  ------------------
  296|      3|            return UNUM_SIGN_NEGATIVE;
  297|      2|        case STEM_SIGN_ACCOUNTING_NEGATIVE:
  ------------------
  |  Branch (297:9): [True: 2, False: 38]
  ------------------
  298|      2|            return UNUM_SIGN_ACCOUNTING_NEGATIVE;
  299|      0|        default:
  ------------------
  |  Branch (299:9): [True: 0, False: 40]
  ------------------
  300|      0|            return UNUM_SIGN_COUNT; // for objects, throw; for enums, return COUNT
  301|     40|    }
  302|     40|}
_ZN6icu_786number4impl8skeleton6createERKNS_13UnicodeStringEP11UParseErrorR10UErrorCode:
  456|  4.72k|        const UnicodeString& skeletonString, UParseError* perror, UErrorCode& status) {
  457|       |
  458|       |    // Initialize perror
  459|  4.72k|    if (perror != nullptr) {
  ------------------
  |  Branch (459:9): [True: 0, False: 4.72k]
  ------------------
  460|      0|        perror->line = 0;
  461|      0|        perror->offset = -1;
  462|      0|        perror->preContext[0] = 0;
  463|      0|        perror->postContext[0] = 0;
  464|      0|    }
  465|       |
  466|  4.72k|    umtx_initOnce(gNumberSkeletonsInitOnce, &initNumberSkeletons, status);
  467|  4.72k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (467:9): [True: 0, False: 4.72k]
  ------------------
  468|      0|        return {};
  469|      0|    }
  470|       |
  471|  4.72k|    int32_t errOffset;
  472|  4.72k|    MacroProps macros = parseSkeleton(skeletonString, errOffset, status);
  473|  4.72k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (473:9): [True: 3.80k, False: 916]
  ------------------
  474|  3.80k|        return NumberFormatter::with().macros(macros);
  475|  3.80k|    }
  476|       |
  477|    916|    if (perror == nullptr) {
  ------------------
  |  Branch (477:9): [True: 916, False: 0]
  ------------------
  478|    916|        return {};
  479|    916|    }
  480|       |
  481|       |    // Populate the UParseError with the error location
  482|      0|    perror->offset = errOffset;
  483|      0|    int32_t contextStart = uprv_max(0, errOffset - U_PARSE_CONTEXT_LEN + 1);
  ------------------
  |  | 1526|      0|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  484|      0|    int32_t contextEnd = uprv_min(skeletonString.length(), errOffset + U_PARSE_CONTEXT_LEN - 1);
  ------------------
  |  | 1529|      0|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  485|      0|    skeletonString.extract(contextStart, errOffset - contextStart, perror->preContext, 0);
  486|      0|    perror->preContext[errOffset - contextStart] = 0;
  487|      0|    skeletonString.extract(errOffset, contextEnd - errOffset, perror->postContext, 0);
  488|      0|    perror->postContext[contextEnd - errOffset] = 0;
  489|      0|    return {};
  490|    916|}
_ZN6icu_786number4impl8skeleton13parseSkeletonERKNS_13UnicodeStringERiR10UErrorCode:
  500|  4.72k|        const UnicodeString& skeletonString, int32_t& errOffset, UErrorCode& status) {
  501|  4.72k|    U_ASSERT(U_SUCCESS(status));
  ------------------
  |  |   35|  4.72k|#   define U_ASSERT(exp) (void)0
  ------------------
  502|  4.72k|    U_ASSERT(kSerializedStemTrie != nullptr);
  ------------------
  |  |   35|  4.72k|#   define U_ASSERT(exp) (void)0
  ------------------
  503|       |
  504|       |    // Add a trailing whitespace to the end of the skeleton string to make code cleaner.
  505|  4.72k|    UnicodeString tempSkeletonString(skeletonString);
  506|  4.72k|    tempSkeletonString.append(u' ');
  507|       |
  508|  4.72k|    SeenMacroProps seen;
  509|  4.72k|    MacroProps macros;
  510|  4.72k|    StringSegment segment(tempSkeletonString, false);
  511|  4.72k|    UCharsTrie stemTrie(kSerializedStemTrie);
  512|  4.72k|    ParseState stem = STATE_NULL;
  513|  4.72k|    int32_t offset = 0;
  514|       |
  515|       |    // Primary skeleton parse loop:
  516|  21.9M|    while (offset < segment.length()) {
  ------------------
  |  Branch (516:12): [True: 21.9M, False: 3.80k]
  ------------------
  517|  21.9M|        UChar32 cp = segment.codePointAt(offset);
  518|  21.9M|        bool isTokenSeparator = PatternProps::isWhiteSpace(cp);
  519|  21.9M|        bool isOptionSeparator = (cp == u'/');
  520|       |
  521|  21.9M|        if (!isTokenSeparator && !isOptionSeparator) {
  ------------------
  |  Branch (521:13): [True: 21.9M, False: 7.07k]
  |  Branch (521:34): [True: 21.9M, False: 1.95k]
  ------------------
  522|       |            // Non-separator token; consume it.
  523|  21.9M|            offset += U16_LENGTH(cp);
  ------------------
  |  |  141|  21.9M|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 21.9M, False: 770]
  |  |  ------------------
  ------------------
  524|  21.9M|            if (stem == STATE_NULL) {
  ------------------
  |  Branch (524:17): [True: 11.0M, False: 10.8M]
  ------------------
  525|       |                // We are currently consuming a stem.
  526|       |                // Go to the next state in the stem trie.
  527|  11.0M|                stemTrie.nextForCodePoint(cp);
  528|  11.0M|            }
  529|  21.9M|            continue;
  530|  21.9M|        }
  531|       |
  532|       |        // We are looking at a token or option separator.
  533|       |        // If the segment is nonempty, parse it and reset the segment.
  534|       |        // Otherwise, make sure it is a valid repeating separator.
  535|  9.03k|        if (offset != 0) {
  ------------------
  |  Branch (535:13): [True: 7.63k, False: 1.39k]
  ------------------
  536|  7.63k|            segment.setLength(offset);
  537|  7.63k|            if (stem == STATE_NULL) {
  ------------------
  |  Branch (537:17): [True: 5.72k, False: 1.91k]
  ------------------
  538|       |                // The first separator after the start of a token. Parse it as a stem.
  539|  5.72k|                stem = parseStem(segment, stemTrie, seen, macros, status);
  540|  5.72k|                stemTrie.reset();
  541|  5.72k|            } else {
  542|       |                // A separator after the first separator of a token. Parse it as an option.
  543|  1.91k|                stem = parseOption(stem, segment, macros, status);
  544|  1.91k|            }
  545|  7.63k|            segment.resetLength();
  546|  7.63k|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (546:17): [True: 900, False: 6.73k]
  ------------------
  547|    900|                errOffset = segment.getOffset();
  548|    900|                return macros;
  549|    900|            }
  550|       |
  551|       |            // Consume the segment:
  552|  6.73k|            segment.adjustOffset(offset);
  553|  6.73k|            offset = 0;
  554|       |
  555|  6.73k|        } else if (stem != STATE_NULL) {
  ------------------
  |  Branch (555:20): [True: 6, False: 1.38k]
  ------------------
  556|       |            // A separator ('/' or whitespace) following an option separator ('/')
  557|       |            // segment.setLength(U16_LENGTH(cp)); // for error message
  558|       |            // throw new SkeletonSyntaxException("Unexpected separator character", segment);
  559|      6|            status = U_NUMBER_SKELETON_SYNTAX_ERROR;
  560|      6|            errOffset = segment.getOffset();
  561|      6|            return macros;
  562|       |
  563|  1.38k|        } else {
  564|       |            // Two spaces in a row; this is OK.
  565|  1.38k|        }
  566|       |
  567|       |        // Does the current stem forbid options?
  568|  8.12k|        if (isOptionSeparator && stem == STATE_NULL) {
  ------------------
  |  Branch (568:13): [True: 1.92k, False: 6.19k]
  |  Branch (568:34): [True: 9, False: 1.92k]
  ------------------
  569|       |            // segment.setLength(U16_LENGTH(cp)); // for error message
  570|       |            // throw new SkeletonSyntaxException("Unexpected option separator", segment);
  571|      9|            status = U_NUMBER_SKELETON_SYNTAX_ERROR;
  572|      9|            errOffset = segment.getOffset();
  573|      9|            return macros;
  574|      9|        }
  575|       |
  576|       |        // Does the current stem require an option?
  577|  8.11k|        if (isTokenSeparator && stem != STATE_NULL) {
  ------------------
  |  Branch (577:13): [True: 6.19k, False: 1.92k]
  |  Branch (577:33): [True: 652, False: 5.54k]
  ------------------
  578|    652|            switch (stem) {
  579|      0|                case STATE_INCREMENT_PRECISION:
  ------------------
  |  Branch (579:17): [True: 0, False: 652]
  ------------------
  580|      0|                case STATE_MEASURE_UNIT:
  ------------------
  |  Branch (580:17): [True: 0, False: 652]
  ------------------
  581|      0|                case STATE_PER_MEASURE_UNIT:
  ------------------
  |  Branch (581:17): [True: 0, False: 652]
  ------------------
  582|      0|                case STATE_IDENTIFIER_UNIT:
  ------------------
  |  Branch (582:17): [True: 0, False: 652]
  ------------------
  583|      0|                case STATE_UNIT_USAGE:
  ------------------
  |  Branch (583:17): [True: 0, False: 652]
  ------------------
  584|      0|                case STATE_CURRENCY_UNIT:
  ------------------
  |  Branch (584:17): [True: 0, False: 652]
  ------------------
  585|      0|                case STATE_INTEGER_WIDTH:
  ------------------
  |  Branch (585:17): [True: 0, False: 652]
  ------------------
  586|      0|                case STATE_NUMBERING_SYSTEM:
  ------------------
  |  Branch (586:17): [True: 0, False: 652]
  ------------------
  587|      1|                case STATE_SCALE:
  ------------------
  |  Branch (587:17): [True: 1, False: 651]
  ------------------
  588|       |                    // segment.setLength(U16_LENGTH(cp)); // for error message
  589|       |                    // throw new SkeletonSyntaxException("Stem requires an option", segment);
  590|      1|                    status = U_NUMBER_SKELETON_SYNTAX_ERROR;
  591|      1|                    errOffset = segment.getOffset();
  592|      1|                    return macros;
  593|    651|                default:
  ------------------
  |  Branch (593:17): [True: 651, False: 1]
  ------------------
  594|    651|                    break;
  595|    652|            }
  596|    651|            stem = STATE_NULL;
  597|    651|        }
  598|       |
  599|       |        // Consume the separator:
  600|  8.11k|        segment.adjustOffset(U16_LENGTH(cp));
  ------------------
  |  |  141|  8.11k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 8.11k, False: 0]
  |  |  ------------------
  ------------------
  601|  8.11k|    }
  602|  3.80k|    U_ASSERT(stem == STATE_NULL);
  ------------------
  |  |   35|  3.80k|#   define U_ASSERT(exp) (void)0
  ------------------
  603|  3.80k|    return macros;
  604|  4.72k|}
_ZN6icu_786number4impl8skeleton9parseStemERKNS_13StringSegmentERKNS_10UCharsTrieERNS1_14SeenMacroPropsERNS1_10MacroPropsER10UErrorCode:
  608|  5.72k|                    MacroProps& macros, UErrorCode& status) {
  609|  5.72k|    U_ASSERT(U_SUCCESS(status));
  ------------------
  |  |   35|  5.72k|#   define U_ASSERT(exp) (void)0
  ------------------
  610|       |
  611|       |    // First check for "blueprint" stems, which start with a "signal char"
  612|  5.72k|    switch (segment.charAt(0)) {
  613|    664|        case u'.':
  ------------------
  |  Branch (613:9): [True: 664, False: 5.05k]
  ------------------
  614|    664|            CHECK_NULL(seen, precision, status);
  ------------------
  |  |  154|    664|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|    664|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|    664|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|    664|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 2, False: 662]
  |  |  ------------------
  |  |  157|      2|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      2|        return STATE_NULL; \
  |  |  159|      2|    } \
  |  |  160|    664|    (seen).field = true; \
  |  |  161|    664|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    664|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  615|    662|            blueprint_helpers::parseFractionStem(segment, macros, status);
  616|    662|            return STATE_FRACTION_PRECISION;
  617|    271|        case u'@':
  ------------------
  |  Branch (617:9): [True: 271, False: 5.45k]
  ------------------
  618|    271|            CHECK_NULL(seen, precision, status);
  ------------------
  |  |  154|    271|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|    271|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|    271|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|    271|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 1, False: 270]
  |  |  ------------------
  |  |  157|      1|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      1|        return STATE_NULL; \
  |  |  159|      1|    } \
  |  |  160|    271|    (seen).field = true; \
  |  |  161|    271|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    271|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  619|    270|            blueprint_helpers::parseDigitsStem(segment, macros, status);
  620|    270|            return STATE_PRECISION;
  621|    222|        case u'E':
  ------------------
  |  Branch (621:9): [True: 222, False: 5.50k]
  ------------------
  622|    222|            CHECK_NULL(seen, notation, status);
  ------------------
  |  |  154|    222|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|    222|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|    222|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|    222|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 1, False: 221]
  |  |  ------------------
  |  |  157|      1|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      1|        return STATE_NULL; \
  |  |  159|      1|    } \
  |  |  160|    222|    (seen).field = true; \
  |  |  161|    222|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    222|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  623|    221|            blueprint_helpers::parseScientificStem(segment, macros, status);
  624|    221|            return STATE_NULL;
  625|    141|        case u'0':
  ------------------
  |  Branch (625:9): [True: 141, False: 5.58k]
  ------------------
  626|    141|            CHECK_NULL(seen, integerWidth, status);
  ------------------
  |  |  154|    141|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|    141|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|    141|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|    141|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 6, False: 135]
  |  |  ------------------
  |  |  157|      6|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      6|        return STATE_NULL; \
  |  |  159|      6|    } \
  |  |  160|    141|    (seen).field = true; \
  |  |  161|    141|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    141|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  627|    135|            blueprint_helpers::parseIntegerStem(segment, macros, status);
  628|    135|            return STATE_NULL;
  629|  4.42k|        default:
  ------------------
  |  Branch (629:9): [True: 4.42k, False: 1.29k]
  ------------------
  630|  4.42k|            break;
  631|  5.72k|    }
  632|       |
  633|       |    // Now look at the stemsTrie, which is already be pointing at our stem.
  634|  4.42k|    UStringTrieResult stemResult = stemTrie.current();
  635|       |
  636|  4.42k|    if (stemResult != USTRINGTRIE_INTERMEDIATE_VALUE && stemResult != USTRINGTRIE_FINAL_VALUE) {
  ------------------
  |  Branch (636:9): [True: 1.93k, False: 2.48k]
  |  Branch (636:57): [True: 201, False: 1.73k]
  ------------------
  637|       |        // throw new SkeletonSyntaxException("Unknown stem", segment);
  638|    201|        status = U_NUMBER_SKELETON_SYNTAX_ERROR;
  639|    201|        return STATE_NULL;
  640|    201|    }
  641|       |
  642|  4.22k|    auto stem = static_cast<StemEnum>(stemTrie.getValue());
  643|  4.22k|    switch (stem) {
  644|       |
  645|       |        // Stems with meaning on their own, not requiring an option:
  646|       |
  647|  1.66k|        case STEM_COMPACT_SHORT:
  ------------------
  |  Branch (647:9): [True: 1.66k, False: 2.55k]
  ------------------
  648|  1.72k|        case STEM_COMPACT_LONG:
  ------------------
  |  Branch (648:9): [True: 60, False: 4.16k]
  ------------------
  649|  1.72k|        case STEM_SCIENTIFIC:
  ------------------
  |  Branch (649:9): [True: 0, False: 4.22k]
  ------------------
  650|  1.72k|        case STEM_ENGINEERING:
  ------------------
  |  Branch (650:9): [True: 0, False: 4.22k]
  ------------------
  651|  1.72k|        case STEM_NOTATION_SIMPLE:
  ------------------
  |  Branch (651:9): [True: 0, False: 4.22k]
  ------------------
  652|  1.72k|            CHECK_NULL(seen, notation, status);
  ------------------
  |  |  154|  1.72k|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|  1.72k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|  1.72k|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|  1.72k|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 3, False: 1.72k]
  |  |  ------------------
  |  |  157|      3|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      3|        return STATE_NULL; \
  |  |  159|      3|    } \
  |  |  160|  1.72k|    (seen).field = true; \
  |  |  161|  1.72k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.72k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  653|  1.72k|            macros.notation = stem_to_object::notation(stem);
  654|  1.72k|            switch (stem) {
  655|      0|                case STEM_SCIENTIFIC:
  ------------------
  |  Branch (655:17): [True: 0, False: 1.72k]
  ------------------
  656|      0|                case STEM_ENGINEERING:
  ------------------
  |  Branch (656:17): [True: 0, False: 1.72k]
  ------------------
  657|      0|                    return STATE_SCIENTIFIC; // allows for scientific options
  658|  1.72k|                default:
  ------------------
  |  Branch (658:17): [True: 1.72k, False: 0]
  ------------------
  659|  1.72k|                    return STATE_NULL;
  660|  1.72k|            }
  661|       |
  662|      0|        case STEM_BASE_UNIT:
  ------------------
  |  Branch (662:9): [True: 0, False: 4.22k]
  ------------------
  663|    814|        case STEM_PERCENT:
  ------------------
  |  Branch (663:9): [True: 814, False: 3.40k]
  ------------------
  664|    814|        case STEM_PERMILLE:
  ------------------
  |  Branch (664:9): [True: 0, False: 4.22k]
  ------------------
  665|    814|            CHECK_NULL(seen, unit, status);
  ------------------
  |  |  154|    814|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|    814|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|    814|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|    814|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 3, False: 811]
  |  |  ------------------
  |  |  157|      3|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      3|        return STATE_NULL; \
  |  |  159|      3|    } \
  |  |  160|    814|    (seen).field = true; \
  |  |  161|    814|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    814|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  666|    811|            macros.unit = stem_to_object::unit(stem);
  667|    811|            return STATE_NULL;
  668|       |
  669|     21|        case STEM_PERCENT_100:
  ------------------
  |  Branch (669:9): [True: 21, False: 4.20k]
  ------------------
  670|     21|            CHECK_NULL(seen, scale, status);
  ------------------
  |  |  154|     21|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|     21|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|     21|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|     21|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 1, False: 20]
  |  |  ------------------
  |  |  157|      1|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      1|        return STATE_NULL; \
  |  |  159|      1|    } \
  |  |  160|     21|    (seen).field = true; \
  |  |  161|     21|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     21|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  671|     20|            CHECK_NULL(seen, unit, status);
  ------------------
  |  |  154|     20|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|     20|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|     20|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|     20|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 1, False: 19]
  |  |  ------------------
  |  |  157|      1|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      1|        return STATE_NULL; \
  |  |  159|      1|    } \
  |  |  160|     20|    (seen).field = true; \
  |  |  161|     21|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     21|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  672|     19|            macros.scale = Scale::powerOfTen(2);
  673|     19|            macros.unit = NoUnit::percent();
  674|     19|            return STATE_NULL;
  675|       |
  676|      0|        case STEM_PRECISION_INTEGER:
  ------------------
  |  Branch (676:9): [True: 0, False: 4.22k]
  ------------------
  677|      0|        case STEM_PRECISION_UNLIMITED:
  ------------------
  |  Branch (677:9): [True: 0, False: 4.22k]
  ------------------
  678|      0|        case STEM_PRECISION_CURRENCY_STANDARD:
  ------------------
  |  Branch (678:9): [True: 0, False: 4.22k]
  ------------------
  679|      0|        case STEM_PRECISION_CURRENCY_CASH:
  ------------------
  |  Branch (679:9): [True: 0, False: 4.22k]
  ------------------
  680|      0|            CHECK_NULL(seen, precision, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  681|      0|            macros.precision = stem_to_object::precision(stem);
  682|      0|            switch (stem) {
  683|      0|                case STEM_PRECISION_INTEGER:
  ------------------
  |  Branch (683:17): [True: 0, False: 0]
  ------------------
  684|      0|                    return STATE_FRACTION_PRECISION; // allows for "precision-integer/@##"
  685|      0|                default:
  ------------------
  |  Branch (685:17): [True: 0, False: 0]
  ------------------
  686|      0|                    return STATE_PRECISION;
  687|      0|            }
  688|       |
  689|      0|        case STEM_ROUNDING_MODE_CEILING:
  ------------------
  |  Branch (689:9): [True: 0, False: 4.22k]
  ------------------
  690|      0|        case STEM_ROUNDING_MODE_FLOOR:
  ------------------
  |  Branch (690:9): [True: 0, False: 4.22k]
  ------------------
  691|      0|        case STEM_ROUNDING_MODE_DOWN:
  ------------------
  |  Branch (691:9): [True: 0, False: 4.22k]
  ------------------
  692|      0|        case STEM_ROUNDING_MODE_UP:
  ------------------
  |  Branch (692:9): [True: 0, False: 4.22k]
  ------------------
  693|      0|        case STEM_ROUNDING_MODE_HALF_EVEN:
  ------------------
  |  Branch (693:9): [True: 0, False: 4.22k]
  ------------------
  694|      0|        case STEM_ROUNDING_MODE_HALF_ODD:
  ------------------
  |  Branch (694:9): [True: 0, False: 4.22k]
  ------------------
  695|      0|        case STEM_ROUNDING_MODE_HALF_CEILING:
  ------------------
  |  Branch (695:9): [True: 0, False: 4.22k]
  ------------------
  696|      0|        case STEM_ROUNDING_MODE_HALF_FLOOR:
  ------------------
  |  Branch (696:9): [True: 0, False: 4.22k]
  ------------------
  697|      0|        case STEM_ROUNDING_MODE_HALF_DOWN:
  ------------------
  |  Branch (697:9): [True: 0, False: 4.22k]
  ------------------
  698|      0|        case STEM_ROUNDING_MODE_HALF_UP:
  ------------------
  |  Branch (698:9): [True: 0, False: 4.22k]
  ------------------
  699|      0|        case STEM_ROUNDING_MODE_UNNECESSARY:
  ------------------
  |  Branch (699:9): [True: 0, False: 4.22k]
  ------------------
  700|      0|            CHECK_NULL(seen, roundingMode, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  701|      0|            macros.roundingMode = stem_to_object::roundingMode(stem);
  702|      0|            return STATE_NULL;
  703|       |
  704|      0|        case STEM_INTEGER_WIDTH_TRUNC:
  ------------------
  |  Branch (704:9): [True: 0, False: 4.22k]
  ------------------
  705|      0|            CHECK_NULL(seen, integerWidth, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  706|      0|            macros.integerWidth = IntegerWidth::zeroFillTo(0).truncateAt(0);
  707|      0|            return STATE_NULL;
  708|       |
  709|     11|        case STEM_GROUP_OFF:
  ------------------
  |  Branch (709:9): [True: 11, False: 4.21k]
  ------------------
  710|     14|        case STEM_GROUP_MIN2:
  ------------------
  |  Branch (710:9): [True: 3, False: 4.22k]
  ------------------
  711|     14|        case STEM_GROUP_AUTO:
  ------------------
  |  Branch (711:9): [True: 0, False: 4.22k]
  ------------------
  712|     34|        case STEM_GROUP_ON_ALIGNED:
  ------------------
  |  Branch (712:9): [True: 20, False: 4.20k]
  ------------------
  713|     34|        case STEM_GROUP_THOUSANDS:
  ------------------
  |  Branch (713:9): [True: 0, False: 4.22k]
  ------------------
  714|     34|            CHECK_NULL(seen, grouper, status);
  ------------------
  |  |  154|     34|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|     34|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|     34|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|     34|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 5, False: 29]
  |  |  ------------------
  |  |  157|      5|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      5|        return STATE_NULL; \
  |  |  159|      5|    } \
  |  |  160|     34|    (seen).field = true; \
  |  |  161|     34|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     34|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  715|     29|            macros.grouper = Grouper::forStrategy(stem_to_object::groupingStrategy(stem));
  716|     29|            return STATE_NULL;
  717|       |
  718|      0|        case STEM_LATIN:
  ------------------
  |  Branch (718:9): [True: 0, False: 4.22k]
  ------------------
  719|      0|            CHECK_NULL(seen, symbols, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  720|      0|            macros.symbols.setTo(NumberingSystem::createInstanceByName("latn", status));
  721|      0|            return STATE_NULL;
  722|       |
  723|      0|        case STEM_UNIT_WIDTH_NARROW:
  ------------------
  |  Branch (723:9): [True: 0, False: 4.22k]
  ------------------
  724|      0|        case STEM_UNIT_WIDTH_SHORT:
  ------------------
  |  Branch (724:9): [True: 0, False: 4.22k]
  ------------------
  725|      0|        case STEM_UNIT_WIDTH_FULL_NAME:
  ------------------
  |  Branch (725:9): [True: 0, False: 4.22k]
  ------------------
  726|      0|        case STEM_UNIT_WIDTH_ISO_CODE:
  ------------------
  |  Branch (726:9): [True: 0, False: 4.22k]
  ------------------
  727|      0|        case STEM_UNIT_WIDTH_FORMAL:
  ------------------
  |  Branch (727:9): [True: 0, False: 4.22k]
  ------------------
  728|      0|        case STEM_UNIT_WIDTH_VARIANT:
  ------------------
  |  Branch (728:9): [True: 0, False: 4.22k]
  ------------------
  729|      0|        case STEM_UNIT_WIDTH_HIDDEN:
  ------------------
  |  Branch (729:9): [True: 0, False: 4.22k]
  ------------------
  730|      0|            CHECK_NULL(seen, unitWidth, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  731|      0|            macros.unitWidth = stem_to_object::unitWidth(stem);
  732|      0|            return STATE_NULL;
  733|       |
  734|      0|        case STEM_SIGN_AUTO:
  ------------------
  |  Branch (734:9): [True: 0, False: 4.22k]
  ------------------
  735|     10|        case STEM_SIGN_ALWAYS:
  ------------------
  |  Branch (735:9): [True: 10, False: 4.21k]
  ------------------
  736|     22|        case STEM_SIGN_NEVER:
  ------------------
  |  Branch (736:9): [True: 12, False: 4.21k]
  ------------------
  737|     30|        case STEM_SIGN_ACCOUNTING:
  ------------------
  |  Branch (737:9): [True: 8, False: 4.21k]
  ------------------
  738|     33|        case STEM_SIGN_ACCOUNTING_ALWAYS:
  ------------------
  |  Branch (738:9): [True: 3, False: 4.22k]
  ------------------
  739|     39|        case STEM_SIGN_EXCEPT_ZERO:
  ------------------
  |  Branch (739:9): [True: 6, False: 4.21k]
  ------------------
  740|     44|        case STEM_SIGN_ACCOUNTING_EXCEPT_ZERO:
  ------------------
  |  Branch (740:9): [True: 5, False: 4.21k]
  ------------------
  741|     48|        case STEM_SIGN_NEGATIVE:
  ------------------
  |  Branch (741:9): [True: 4, False: 4.21k]
  ------------------
  742|     51|        case STEM_SIGN_ACCOUNTING_NEGATIVE:
  ------------------
  |  Branch (742:9): [True: 3, False: 4.22k]
  ------------------
  743|     51|            CHECK_NULL(seen, sign, status);
  ------------------
  |  |  154|     51|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|     51|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|     51|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|     51|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 11, False: 40]
  |  |  ------------------
  |  |  157|     11|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|     11|        return STATE_NULL; \
  |  |  159|     11|    } \
  |  |  160|     51|    (seen).field = true; \
  |  |  161|     51|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     51|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  744|     40|            macros.sign = stem_to_object::signDisplay(stem);
  745|     40|            return STATE_NULL;
  746|       |
  747|      0|        case STEM_DECIMAL_AUTO:
  ------------------
  |  Branch (747:9): [True: 0, False: 4.22k]
  ------------------
  748|      0|        case STEM_DECIMAL_ALWAYS:
  ------------------
  |  Branch (748:9): [True: 0, False: 4.22k]
  ------------------
  749|      0|            CHECK_NULL(seen, decimal, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  750|      0|            macros.decimal = stem_to_object::decimalSeparatorDisplay(stem);
  751|      0|            return STATE_NULL;
  752|       |
  753|       |        // Stems requiring an option:
  754|       |
  755|      0|        case STEM_PRECISION_INCREMENT:
  ------------------
  |  Branch (755:9): [True: 0, False: 4.22k]
  ------------------
  756|      0|            CHECK_NULL(seen, precision, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  757|      0|            return STATE_INCREMENT_PRECISION;
  758|       |
  759|      0|        case STEM_MEASURE_UNIT:
  ------------------
  |  Branch (759:9): [True: 0, False: 4.22k]
  ------------------
  760|      0|            CHECK_NULL(seen, unit, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  761|      0|            return STATE_MEASURE_UNIT;
  762|       |
  763|      0|        case STEM_PER_MEASURE_UNIT:
  ------------------
  |  Branch (763:9): [True: 0, False: 4.22k]
  ------------------
  764|      0|            CHECK_NULL(seen, perUnit, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  765|      0|            return STATE_PER_MEASURE_UNIT;
  766|       |
  767|      0|        case STEM_UNIT:
  ------------------
  |  Branch (767:9): [True: 0, False: 4.22k]
  ------------------
  768|      0|            CHECK_NULL(seen, unit, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  769|      0|            CHECK_NULL(seen, perUnit, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  770|      0|            return STATE_IDENTIFIER_UNIT;
  771|       |
  772|      0|        case STEM_UNIT_USAGE:
  ------------------
  |  Branch (772:9): [True: 0, False: 4.22k]
  ------------------
  773|      0|            CHECK_NULL(seen, usage, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  774|      0|            return STATE_UNIT_USAGE;
  775|       |
  776|      0|        case STEM_CURRENCY:
  ------------------
  |  Branch (776:9): [True: 0, False: 4.22k]
  ------------------
  777|      0|            CHECK_NULL(seen, unit, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  778|      0|            CHECK_NULL(seen, perUnit, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  779|      0|            return STATE_CURRENCY_UNIT;
  780|       |
  781|      0|        case STEM_INTEGER_WIDTH:
  ------------------
  |  Branch (781:9): [True: 0, False: 4.22k]
  ------------------
  782|      0|            CHECK_NULL(seen, integerWidth, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  783|      0|            return STATE_INTEGER_WIDTH;
  784|       |
  785|      0|        case STEM_NUMBERING_SYSTEM:
  ------------------
  |  Branch (785:9): [True: 0, False: 4.22k]
  ------------------
  786|      0|            CHECK_NULL(seen, symbols, status);
  ------------------
  |  |  154|      0|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|      0|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|      0|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  157|      0|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      0|        return STATE_NULL; \
  |  |  159|      0|    } \
  |  |  160|      0|    (seen).field = true; \
  |  |  161|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  787|      0|            return STATE_NUMBERING_SYSTEM;
  788|       |
  789|  1.57k|        case STEM_SCALE:
  ------------------
  |  Branch (789:9): [True: 1.57k, False: 2.64k]
  ------------------
  790|  1.57k|            CHECK_NULL(seen, scale, status);
  ------------------
  |  |  154|  1.57k|#define CHECK_NULL(seen, field, status) (void)(seen); /* for auto-format line wrapping */ \
  |  |  ------------------
  |  |  |  |  169|  1.57k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  155|  1.57k|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  156|  1.57k|    if ((seen).field) { \
  |  |  ------------------
  |  |  |  Branch (156:9): [True: 1, False: 1.57k]
  |  |  ------------------
  |  |  157|      1|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  158|      1|        return STATE_NULL; \
  |  |  159|      1|    } \
  |  |  160|  1.57k|    (seen).field = true; \
  |  |  161|  1.57k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.57k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  791|  1.57k|            return STATE_SCALE;
  792|       |
  793|      0|        default:
  ------------------
  |  Branch (793:9): [True: 0, False: 4.22k]
  ------------------
  794|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  795|  4.22k|    }
  796|  4.22k|}
_ZN6icu_786number4impl8skeleton11parseOptionENS2_10ParseStateERKNS_13StringSegmentERNS1_10MacroPropsER10UErrorCode:
  799|  1.91k|                                 UErrorCode& status) {
  800|  1.91k|    U_ASSERT(U_SUCCESS(status));
  ------------------
  |  |   35|  1.91k|#   define U_ASSERT(exp) (void)0
  ------------------
  801|       |
  802|       |    ///// Required options: /////
  803|       |
  804|  1.91k|    switch (stem) {
  805|      0|        case STATE_CURRENCY_UNIT:
  ------------------
  |  Branch (805:9): [True: 0, False: 1.91k]
  ------------------
  806|      0|            blueprint_helpers::parseCurrencyOption(segment, macros, status);
  807|      0|            return STATE_NULL;
  808|      0|        case STATE_MEASURE_UNIT:
  ------------------
  |  Branch (808:9): [True: 0, False: 1.91k]
  ------------------
  809|      0|            blueprint_helpers::parseMeasureUnitOption(segment, macros, status);
  810|      0|            return STATE_NULL;
  811|      0|        case STATE_PER_MEASURE_UNIT:
  ------------------
  |  Branch (811:9): [True: 0, False: 1.91k]
  ------------------
  812|      0|            blueprint_helpers::parseMeasurePerUnitOption(segment, macros, status);
  813|      0|            return STATE_NULL;
  814|      0|        case STATE_IDENTIFIER_UNIT:
  ------------------
  |  Branch (814:9): [True: 0, False: 1.91k]
  ------------------
  815|      0|            blueprint_helpers::parseIdentifierUnitOption(segment, macros, status);
  816|      0|            return STATE_NULL;
  817|      0|        case STATE_UNIT_USAGE:
  ------------------
  |  Branch (817:9): [True: 0, False: 1.91k]
  ------------------
  818|      0|            blueprint_helpers::parseUnitUsageOption(segment, macros, status);
  819|      0|            return STATE_NULL;
  820|      0|        case STATE_INCREMENT_PRECISION:
  ------------------
  |  Branch (820:9): [True: 0, False: 1.91k]
  ------------------
  821|      0|            blueprint_helpers::parseIncrementOption(segment, macros, status);
  822|      0|            return STATE_PRECISION;
  823|      0|        case STATE_INTEGER_WIDTH:
  ------------------
  |  Branch (823:9): [True: 0, False: 1.91k]
  ------------------
  824|      0|            blueprint_helpers::parseIntegerWidthOption(segment, macros, status);
  825|      0|            return STATE_NULL;
  826|      0|        case STATE_NUMBERING_SYSTEM:
  ------------------
  |  Branch (826:9): [True: 0, False: 1.91k]
  ------------------
  827|      0|            blueprint_helpers::parseNumberingSystemOption(segment, macros, status);
  828|      0|            return STATE_NULL;
  829|  1.57k|        case STATE_SCALE:
  ------------------
  |  Branch (829:9): [True: 1.57k, False: 338]
  ------------------
  830|  1.57k|            blueprint_helpers::parseScaleOption(segment, macros, status);
  831|  1.57k|            return STATE_NULL;
  832|    338|        default:
  ------------------
  |  Branch (832:9): [True: 338, False: 1.57k]
  ------------------
  833|    338|            break;
  834|  1.91k|    }
  835|       |
  836|       |    ///// Non-required options: /////
  837|       |
  838|       |    // Scientific options
  839|    338|    switch (stem) {
  840|      0|        case STATE_SCIENTIFIC:
  ------------------
  |  Branch (840:9): [True: 0, False: 338]
  ------------------
  841|      0|            if (blueprint_helpers::parseExponentWidthOption(segment, macros, status)) {
  ------------------
  |  Branch (841:17): [True: 0, False: 0]
  ------------------
  842|      0|                return STATE_SCIENTIFIC;
  843|      0|            }
  844|      0|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (844:17): [True: 0, False: 0]
  ------------------
  845|      0|                return {};
  846|      0|            }
  847|      0|            if (blueprint_helpers::parseExponentSignOption(segment, macros, status)) {
  ------------------
  |  Branch (847:17): [True: 0, False: 0]
  ------------------
  848|      0|                return STATE_SCIENTIFIC;
  849|      0|            }
  850|      0|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (850:17): [True: 0, False: 0]
  ------------------
  851|      0|                return {};
  852|      0|            }
  853|      0|            break;
  854|    338|        default:
  ------------------
  |  Branch (854:9): [True: 338, False: 0]
  ------------------
  855|    338|            break;
  856|    338|    }
  857|       |
  858|       |    // Frac-sig option
  859|    338|    switch (stem) {
  860|    324|        case STATE_FRACTION_PRECISION:
  ------------------
  |  Branch (860:9): [True: 324, False: 14]
  ------------------
  861|    324|            if (blueprint_helpers::parseFracSigOption(segment, macros, status)) {
  ------------------
  |  Branch (861:17): [True: 170, False: 154]
  ------------------
  862|    170|                return STATE_PRECISION;
  863|    170|            }
  864|    154|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (864:17): [True: 80, False: 74]
  ------------------
  865|     80|                return {};
  866|     80|            }
  867|       |            // If the fracSig option was not found, try normal precision options.
  868|     74|            stem = STATE_PRECISION;
  869|     74|            break;
  870|     14|        default:
  ------------------
  |  Branch (870:9): [True: 14, False: 324]
  ------------------
  871|     14|            break;
  872|    338|    }
  873|       |
  874|       |    // Trailing zeros option
  875|     88|    switch (stem) {
  876|     88|        case STATE_PRECISION:
  ------------------
  |  Branch (876:9): [True: 88, False: 0]
  ------------------
  877|     88|            if (blueprint_helpers::parseTrailingZeroOption(segment, macros, status)) {
  ------------------
  |  Branch (877:17): [True: 19, False: 69]
  ------------------
  878|     19|                return STATE_NULL;
  879|     19|            }
  880|     69|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (880:17): [True: 0, False: 69]
  ------------------
  881|      0|                return {};
  882|      0|            }
  883|     69|            break;
  884|     69|        default:
  ------------------
  |  Branch (884:9): [True: 0, False: 88]
  ------------------
  885|      0|            break;
  886|     88|    }
  887|       |
  888|       |    // Unknown option
  889|       |    // throw new SkeletonSyntaxException("Invalid option", segment);
  890|     69|    status = U_NUMBER_SKELETON_SYNTAX_ERROR;
  891|     69|    return STATE_NULL;
  892|     88|}
_ZN6icu_786number4impl17blueprint_helpers17parseFractionStemERKNS_13StringSegmentERNS1_10MacroPropsER10UErrorCode:
 1136|    662|                                          UErrorCode& status) {
 1137|    662|    U_ASSERT(segment.charAt(0) == u'.');
  ------------------
  |  |   35|    662|#   define U_ASSERT(exp) (void)0
  ------------------
 1138|    662|    int32_t offset = 1;
 1139|    662|    int32_t minFrac = 0;
 1140|    662|    int32_t maxFrac;
 1141|   110k|    for (; offset < segment.length(); offset++) {
  ------------------
  |  Branch (1141:12): [True: 109k, False: 360]
  ------------------
 1142|   109k|        if (segment.charAt(offset) == u'0') {
  ------------------
  |  Branch (1142:13): [True: 109k, False: 302]
  ------------------
 1143|   109k|            minFrac++;
 1144|   109k|        } else {
 1145|    302|            break;
 1146|    302|        }
 1147|   109k|    }
 1148|    662|    if (offset < segment.length()) {
  ------------------
  |  Branch (1148:9): [True: 302, False: 360]
  ------------------
 1149|    302|        if (isWildcardChar(segment.charAt(offset))) {
  ------------------
  |  Branch (1149:13): [True: 229, False: 73]
  ------------------
 1150|    229|            maxFrac = -1;
 1151|    229|            offset++;
 1152|    229|        } else {
 1153|     73|            maxFrac = minFrac;
 1154|  1.54k|            for (; offset < segment.length(); offset++) {
  ------------------
  |  Branch (1154:20): [True: 1.52k, False: 19]
  ------------------
 1155|  1.52k|                if (segment.charAt(offset) == u'#') {
  ------------------
  |  Branch (1155:21): [True: 1.46k, False: 54]
  ------------------
 1156|  1.46k|                    maxFrac++;
 1157|  1.46k|                } else {
 1158|     54|                    break;
 1159|     54|                }
 1160|  1.52k|            }
 1161|     73|        }
 1162|    360|    } else {
 1163|    360|        maxFrac = minFrac;
 1164|    360|    }
 1165|    662|    if (offset < segment.length()) {
  ------------------
  |  Branch (1165:9): [True: 54, False: 608]
  ------------------
 1166|       |        // throw new SkeletonSyntaxException("Invalid fraction stem", segment);
 1167|     54|        status = U_NUMBER_SKELETON_SYNTAX_ERROR;
 1168|     54|        return;
 1169|     54|    }
 1170|       |    // Use the public APIs to enforce bounds checking
 1171|    608|    if (maxFrac == -1) {
  ------------------
  |  Branch (1171:9): [True: 229, False: 379]
  ------------------
 1172|    229|        if (minFrac == 0) {
  ------------------
  |  Branch (1172:13): [True: 192, False: 37]
  ------------------
 1173|    192|            macros.precision = Precision::unlimited();
 1174|    192|        } else {
 1175|     37|            macros.precision = Precision::minFraction(minFrac);
 1176|     37|        }
 1177|    379|    } else {
 1178|    379|        macros.precision = Precision::minMaxFraction(minFrac, maxFrac);
 1179|    379|    }
 1180|    608|}
_ZN6icu_786number4impl17blueprint_helpers15parseDigitsStemERKNS_13StringSegmentERNS1_10MacroPropsER10UErrorCode:
 1198|    270|blueprint_helpers::parseDigitsStem(const StringSegment& segment, MacroProps& macros, UErrorCode& status) {
 1199|    270|    U_ASSERT(segment.charAt(0) == u'@');
  ------------------
  |  |   35|    270|#   define U_ASSERT(exp) (void)0
  ------------------
 1200|    270|    int32_t offset = 0;
 1201|    270|    int32_t minSig = 0;
 1202|    270|    int32_t maxSig;
 1203|  23.3k|    for (; offset < segment.length(); offset++) {
  ------------------
  |  Branch (1203:12): [True: 23.2k, False: 117]
  ------------------
 1204|  23.2k|        if (segment.charAt(offset) == u'@') {
  ------------------
  |  Branch (1204:13): [True: 23.1k, False: 153]
  ------------------
 1205|  23.1k|            minSig++;
 1206|  23.1k|        } else {
 1207|    153|            break;
 1208|    153|        }
 1209|  23.2k|    }
 1210|    270|    if (offset < segment.length()) {
  ------------------
  |  Branch (1210:9): [True: 153, False: 117]
  ------------------
 1211|    153|        if (isWildcardChar(segment.charAt(offset))) {
  ------------------
  |  Branch (1211:13): [True: 85, False: 68]
  ------------------
 1212|     85|            maxSig = -1;
 1213|     85|            offset++;
 1214|     85|        } else {
 1215|     68|            maxSig = minSig;
 1216|  95.4k|            for (; offset < segment.length(); offset++) {
  ------------------
  |  Branch (1216:20): [True: 95.4k, False: 15]
  ------------------
 1217|  95.4k|                if (segment.charAt(offset) == u'#') {
  ------------------
  |  Branch (1217:21): [True: 95.4k, False: 53]
  ------------------
 1218|  95.4k|                    maxSig++;
 1219|  95.4k|                } else {
 1220|     53|                    break;
 1221|     53|                }
 1222|  95.4k|            }
 1223|     68|        }
 1224|    153|    } else {
 1225|    117|        maxSig = minSig;
 1226|    117|    }
 1227|    270|    if (offset < segment.length()) {
  ------------------
  |  Branch (1227:9): [True: 53, False: 217]
  ------------------
 1228|       |        // throw new SkeletonSyntaxException("Invalid significant digits stem", segment);
 1229|     53|        status = U_NUMBER_SKELETON_SYNTAX_ERROR;
 1230|     53|        return;
 1231|     53|    }
 1232|       |    // Use the public APIs to enforce bounds checking
 1233|    217|    if (maxSig == -1) {
  ------------------
  |  Branch (1233:9): [True: 85, False: 132]
  ------------------
 1234|     85|        macros.precision = Precision::minSignificantDigits(minSig);
 1235|    132|    } else {
 1236|    132|        macros.precision = Precision::minMaxSignificantDigits(minSig, maxSig);
 1237|    132|    }
 1238|    217|}
_ZN6icu_786number4impl17blueprint_helpers19parseScientificStemERKNS_13StringSegmentERNS1_10MacroPropsER10UErrorCode:
 1250|    221|void blueprint_helpers::parseScientificStem(const StringSegment& segment, MacroProps& macros, UErrorCode& status) {
 1251|    221|    U_ASSERT(segment.charAt(0) == u'E');
  ------------------
  |  |   35|    221|#   define U_ASSERT(exp) (void)0
  ------------------
 1252|    221|    {
 1253|    221|        int32_t offset = 1;
 1254|    221|        if (segment.length() == offset) {
  ------------------
  |  Branch (1254:13): [True: 1, False: 220]
  ------------------
 1255|      1|            goto fail;
 1256|      1|        }
 1257|    220|        bool isEngineering = false;
 1258|    220|        if (segment.charAt(offset) == u'E') {
  ------------------
  |  Branch (1258:13): [True: 65, False: 155]
  ------------------
 1259|     65|            isEngineering = true;
 1260|     65|            offset++;
 1261|     65|            if (segment.length() == offset) {
  ------------------
  |  Branch (1261:17): [True: 1, False: 64]
  ------------------
 1262|      1|                goto fail;
 1263|      1|            }
 1264|     65|        }
 1265|    219|        UNumberSignDisplay signDisplay = UNUM_SIGN_AUTO;
 1266|    219|        if (segment.charAt(offset) == u'+') {
  ------------------
  |  Branch (1266:13): [True: 98, False: 121]
  ------------------
 1267|     98|            offset++;
 1268|     98|            if (segment.length() == offset) {
  ------------------
  |  Branch (1268:17): [True: 1, False: 97]
  ------------------
 1269|      1|                goto fail;
 1270|      1|            }
 1271|     97|            if (segment.charAt(offset) == u'!') {
  ------------------
  |  Branch (1271:17): [True: 22, False: 75]
  ------------------
 1272|     22|                signDisplay = UNUM_SIGN_ALWAYS;
 1273|     75|            } else if (segment.charAt(offset) == u'?') {
  ------------------
  |  Branch (1273:24): [True: 51, False: 24]
  ------------------
 1274|     51|                signDisplay = UNUM_SIGN_EXCEPT_ZERO;
 1275|     51|            } else {
 1276|       |                // NOTE: Other sign displays are not included because they aren't useful in this context
 1277|     24|                goto fail;
 1278|     24|            }
 1279|     73|            offset++;
 1280|     73|            if (segment.length() == offset) {
  ------------------
  |  Branch (1280:17): [True: 2, False: 71]
  ------------------
 1281|      2|                goto fail;
 1282|      2|            }
 1283|     73|        }
 1284|    192|        int32_t minDigits = 0;
 1285|  11.7k|        for (; offset < segment.length(); offset++) {
  ------------------
  |  Branch (1285:16): [True: 11.6k, False: 104]
  ------------------
 1286|  11.6k|            if (segment.charAt(offset) != u'0') {
  ------------------
  |  Branch (1286:17): [True: 88, False: 11.5k]
  ------------------
 1287|     88|                goto fail;
 1288|     88|            }
 1289|  11.5k|            minDigits++;
 1290|  11.5k|        }
 1291|    104|        macros.notation = (isEngineering ? Notation::engineering() : Notation::scientific())
  ------------------
  |  Branch (1291:28): [True: 5, False: 99]
  ------------------
 1292|    104|            .withExponentSignDisplay(signDisplay)
 1293|    104|            .withMinExponentDigits(minDigits);
 1294|    104|        return;
 1295|    192|    }
 1296|    117|    fail: void();
 1297|       |    // throw new SkeletonSyntaxException("Invalid scientific stem", segment);
 1298|    117|    status = U_NUMBER_SKELETON_SYNTAX_ERROR;
 1299|    117|}
_ZN6icu_786number4impl17blueprint_helpers16parseIntegerStemERKNS_13StringSegmentERNS1_10MacroPropsER10UErrorCode:
 1301|    135|void blueprint_helpers::parseIntegerStem(const StringSegment& segment, MacroProps& macros, UErrorCode& status) {
 1302|    135|    U_ASSERT(segment.charAt(0) == u'0');
  ------------------
  |  |   35|    135|#   define U_ASSERT(exp) (void)0
  ------------------
 1303|    135|    int32_t offset = 1;
 1304|  36.2k|    for (; offset < segment.length(); offset++) {
  ------------------
  |  Branch (1304:12): [True: 36.1k, False: 85]
  ------------------
 1305|  36.1k|        if (segment.charAt(offset) != u'0') {
  ------------------
  |  Branch (1305:13): [True: 50, False: 36.1k]
  ------------------
 1306|     50|            offset--;
 1307|     50|            break;
 1308|     50|        }
 1309|  36.1k|    }
 1310|    135|    if (offset < segment.length()) {
  ------------------
  |  Branch (1310:9): [True: 50, False: 85]
  ------------------
 1311|       |        // throw new SkeletonSyntaxException("Invalid integer stem", segment);
 1312|     50|        status = U_NUMBER_SKELETON_SYNTAX_ERROR;
 1313|     50|        return;
 1314|     50|    }
 1315|     85|    macros.integerWidth = IntegerWidth::zeroFillTo(offset);
 1316|     85|}
_ZN6icu_786number4impl17blueprint_helpers18parseFracSigOptionERKNS_13StringSegmentERNS1_10MacroPropsER10UErrorCode:
 1319|    324|                                           UErrorCode& status) {
 1320|    324|    if (segment.charAt(0) != u'@') {
  ------------------
  |  Branch (1320:9): [True: 74, False: 250]
  ------------------
 1321|     74|        return false;
 1322|     74|    }
 1323|    250|    int offset = 0;
 1324|    250|    int minSig = 0;
 1325|    250|    int maxSig;
 1326|  14.2k|    for (; offset < segment.length(); offset++) {
  ------------------
  |  Branch (1326:12): [True: 14.2k, False: 54]
  ------------------
 1327|  14.2k|        if (segment.charAt(offset) == u'@') {
  ------------------
  |  Branch (1327:13): [True: 14.0k, False: 196]
  ------------------
 1328|  14.0k|            minSig++;
 1329|  14.0k|        } else {
 1330|    196|            break;
 1331|    196|        }
 1332|  14.2k|    }
 1333|    250|    if (offset < segment.length()) {
  ------------------
  |  Branch (1333:9): [True: 196, False: 54]
  ------------------
 1334|    196|        if (isWildcardChar(segment.charAt(offset))) {
  ------------------
  |  Branch (1334:13): [True: 12, False: 184]
  ------------------
 1335|       |            // @+, @@+, @@@+
 1336|     12|            maxSig = -1;
 1337|     12|            offset++;
 1338|    184|        } else {
 1339|       |            // @#, @##, @###
 1340|       |            // @@#, @@##, @@@#
 1341|    184|            maxSig = minSig;
 1342|   703k|            for (; offset < segment.length(); offset++) {
  ------------------
  |  Branch (1342:20): [True: 703k, False: 26]
  ------------------
 1343|   703k|                if (segment.charAt(offset) == u'#') {
  ------------------
  |  Branch (1343:21): [True: 703k, False: 158]
  ------------------
 1344|   703k|                    maxSig++;
 1345|   703k|                } else {
 1346|    158|                    break;
 1347|    158|                }
 1348|   703k|            }
 1349|    184|        }
 1350|    196|    } else {
 1351|       |        // @, @@, @@@
 1352|     54|        maxSig = minSig;
 1353|     54|    }
 1354|    250|    const auto& oldPrecision = static_cast<const FractionPrecision&>(macros.precision);
 1355|    250|    if (offset < segment.length()) {
  ------------------
  |  Branch (1355:9): [True: 159, False: 91]
  ------------------
 1356|    159|        UNumberRoundingPriority priority;
 1357|    159|        if (maxSig == -1) {
  ------------------
  |  Branch (1357:13): [True: 1, False: 158]
  ------------------
 1358|       |            // The wildcard character is not allowed with the priority annotation
 1359|      1|            status = U_NUMBER_SKELETON_SYNTAX_ERROR;
 1360|      1|            return false;
 1361|      1|        }
 1362|    158|        if (segment.codePointAt(offset) == u'r') {
  ------------------
  |  Branch (1362:13): [True: 30, False: 128]
  ------------------
 1363|     30|            priority = UNUM_ROUNDING_PRIORITY_RELAXED;
 1364|     30|            offset++;
 1365|    128|        } else if (segment.codePointAt(offset) == u's') {
  ------------------
  |  Branch (1365:20): [True: 83, False: 45]
  ------------------
 1366|     83|            priority = UNUM_ROUNDING_PRIORITY_STRICT;
 1367|     83|            offset++;
 1368|     83|        } else {
 1369|       |            // Invalid digits option for fraction rounder
 1370|     45|            status = U_NUMBER_SKELETON_SYNTAX_ERROR;
 1371|     45|            return false;
 1372|     45|        }
 1373|    113|        if (offset < segment.length()) {
  ------------------
  |  Branch (1373:13): [True: 24, False: 89]
  ------------------
 1374|       |            // Invalid digits option for fraction rounder
 1375|     24|            status = U_NUMBER_SKELETON_SYNTAX_ERROR;
 1376|     24|            return false;
 1377|     24|        }
 1378|     89|        macros.precision = oldPrecision.withSignificantDigits(minSig, maxSig, priority);
 1379|     91|    } else if (maxSig == -1) {
  ------------------
  |  Branch (1379:16): [True: 11, False: 80]
  ------------------
 1380|       |        // withMinDigits
 1381|     11|        macros.precision = oldPrecision.withMinDigits(minSig);
 1382|     80|    } else if (minSig == 1) {
  ------------------
  |  Branch (1382:16): [True: 70, False: 10]
  ------------------
 1383|       |        // withMaxDigits
 1384|     70|        macros.precision = oldPrecision.withMaxDigits(maxSig);
 1385|     70|    } else {
 1386|       |        // Digits options with both min and max sig require the priority option
 1387|     10|        status = U_NUMBER_SKELETON_SYNTAX_ERROR;
 1388|     10|        return false;
 1389|     10|    }
 1390|       |
 1391|    170|    return true;
 1392|    250|}
_ZN6icu_786number4impl17blueprint_helpers23parseTrailingZeroOptionERKNS_13StringSegmentERNS1_10MacroPropsER10UErrorCode:
 1394|     88|bool blueprint_helpers::parseTrailingZeroOption(const StringSegment& segment, MacroProps& macros, UErrorCode&) {
 1395|     88|    if (segment == u"w") {
  ------------------
  |  Branch (1395:9): [True: 19, False: 69]
  ------------------
 1396|     19|        macros.precision = macros.precision.trailingZeroDisplay(UNUM_TRAILING_ZERO_HIDE_IF_WHOLE);
 1397|     19|        return true;
 1398|     19|    }
 1399|     69|    return false;
 1400|     88|}
_ZN6icu_786number4impl17blueprint_helpers16parseScaleOptionERKNS_13StringSegmentERNS1_10MacroPropsER10UErrorCode:
 1498|  1.57k|                                              UErrorCode& status) {
 1499|       |    // Need to do char <-> char16_t conversion...
 1500|  1.57k|    U_ASSERT(U_SUCCESS(status));
  ------------------
  |  |   35|  1.57k|#   define U_ASSERT(exp) (void)0
  ------------------
 1501|  1.57k|    CharString buffer;
 1502|  1.57k|    SKELETON_UCHAR_TO_CHAR(buffer, segment.toTempUnicodeString(), 0, segment.length(), status);
  ------------------
  |  |  371|  1.57k|#define SKELETON_UCHAR_TO_CHAR(dest, src, start, end, status) (void)(dest); \
  |  |  ------------------
  |  |  |  |  169|  1.57k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  372|  1.57k|UPRV_BLOCK_MACRO_BEGIN { \
  |  |  373|  1.57k|    UErrorCode conversionStatus = U_ZERO_ERROR; \
  |  |  374|  1.57k|    (dest).appendInvariantChars({false, (src).getBuffer() + (start), (end) - (start)}, conversionStatus); \
  |  |  375|  1.57k|    if (conversionStatus == U_INVARIANT_CONVERSION_ERROR) { \
  |  |  ------------------
  |  |  |  Branch (375:9): [True: 20, False: 1.55k]
  |  |  ------------------
  |  |  376|     20|        /* Don't propagate the invariant conversion error; it is a skeleton syntax error */ \
  |  |  377|     20|        (status) = U_NUMBER_SKELETON_SYNTAX_ERROR; \
  |  |  378|     20|        return; \
  |  |  379|  1.55k|    } else if (U_FAILURE(conversionStatus)) { \
  |  |  ------------------
  |  |  |  Branch (379:16): [True: 0, False: 1.55k]
  |  |  ------------------
  |  |  380|      0|        (status) = conversionStatus; \
  |  |  381|      0|        return; \
  |  |  382|      0|    } \
  |  |  383|  1.57k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.57k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1503|       |
 1504|  1.55k|    LocalPointer<DecNum> decnum(new DecNum(), status);
 1505|  1.55k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1505:9): [True: 0, False: 1.55k]
  ------------------
 1506|  1.55k|    decnum->setTo({buffer.data(), buffer.length()}, status);
 1507|  1.55k|    if (U_FAILURE(status) || decnum->isSpecial()) {
  ------------------
  |  Branch (1507:9): [True: 197, False: 1.35k]
  |  Branch (1507:30): [True: 24, False: 1.33k]
  ------------------
 1508|       |        // This is a skeleton syntax error; don't let the low-level decnum error bubble up
 1509|    221|        status = U_NUMBER_SKELETON_SYNTAX_ERROR;
 1510|    221|        return;
 1511|    221|    }
 1512|       |
 1513|       |    // NOTE: The constructor will optimize the decnum for us if possible.
 1514|  1.33k|    macros.scale = {0, decnum.orphan()};
 1515|  1.33k|}
_ZN6icu_786number15NumberFormatter11forSkeletonERKNS_13UnicodeStringER10UErrorCode:
 1806|  4.72k|NumberFormatter::forSkeleton(const UnicodeString& skeleton, UErrorCode& status) {
 1807|  4.72k|    return skeleton::create(skeleton, nullptr, status);
 1808|  4.72k|}
number_skeletons.cpp:_ZN12_GLOBAL__N_119initNumberSkeletonsER10UErrorCode:
   47|      1|void U_CALLCONV initNumberSkeletons(UErrorCode& status) {
   48|      1|    ucln_i18n_registerCleanup(UCLN_I18N_NUMBER_SKELETONS, cleanupNumberSkeletons);
  ------------------
  |  |  618|      1|#define ucln_i18n_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_i18n_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   49|       |
   50|      1|    UCharsTrieBuilder b(status);
   51|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (51:9): [True: 0, False: 1]
  ------------------
   52|       |
   53|       |    // Section 1:
   54|      1|    b.add(u"compact-short", STEM_COMPACT_SHORT, status);
   55|      1|    b.add(u"compact-long", STEM_COMPACT_LONG, status);
   56|      1|    b.add(u"scientific", STEM_SCIENTIFIC, status);
   57|      1|    b.add(u"engineering", STEM_ENGINEERING, status);
   58|      1|    b.add(u"notation-simple", STEM_NOTATION_SIMPLE, status);
   59|      1|    b.add(u"base-unit", STEM_BASE_UNIT, status);
   60|      1|    b.add(u"percent", STEM_PERCENT, status);
   61|      1|    b.add(u"permille", STEM_PERMILLE, status);
   62|      1|    b.add(u"precision-integer", STEM_PRECISION_INTEGER, status);
   63|      1|    b.add(u"precision-unlimited", STEM_PRECISION_UNLIMITED, status);
   64|      1|    b.add(u"precision-currency-standard", STEM_PRECISION_CURRENCY_STANDARD, status);
   65|      1|    b.add(u"precision-currency-cash", STEM_PRECISION_CURRENCY_CASH, status);
   66|      1|    b.add(u"rounding-mode-ceiling", STEM_ROUNDING_MODE_CEILING, status);
   67|      1|    b.add(u"rounding-mode-floor", STEM_ROUNDING_MODE_FLOOR, status);
   68|      1|    b.add(u"rounding-mode-down", STEM_ROUNDING_MODE_DOWN, status);
   69|      1|    b.add(u"rounding-mode-up", STEM_ROUNDING_MODE_UP, status);
   70|      1|    b.add(u"rounding-mode-half-even", STEM_ROUNDING_MODE_HALF_EVEN, status);
   71|      1|    b.add(u"rounding-mode-half-odd", STEM_ROUNDING_MODE_HALF_ODD, status);
   72|      1|    b.add(u"rounding-mode-half-ceiling", STEM_ROUNDING_MODE_HALF_CEILING, status);
   73|      1|    b.add(u"rounding-mode-half-floor", STEM_ROUNDING_MODE_HALF_FLOOR, status);
   74|      1|    b.add(u"rounding-mode-half-down", STEM_ROUNDING_MODE_HALF_DOWN, status);
   75|      1|    b.add(u"rounding-mode-half-up", STEM_ROUNDING_MODE_HALF_UP, status);
   76|      1|    b.add(u"rounding-mode-unnecessary", STEM_ROUNDING_MODE_UNNECESSARY, status);
   77|      1|    b.add(u"integer-width-trunc", STEM_INTEGER_WIDTH_TRUNC, status);
   78|      1|    b.add(u"group-off", STEM_GROUP_OFF, status);
   79|      1|    b.add(u"group-min2", STEM_GROUP_MIN2, status);
   80|      1|    b.add(u"group-auto", STEM_GROUP_AUTO, status);
   81|      1|    b.add(u"group-on-aligned", STEM_GROUP_ON_ALIGNED, status);
   82|      1|    b.add(u"group-thousands", STEM_GROUP_THOUSANDS, status);
   83|      1|    b.add(u"latin", STEM_LATIN, status);
   84|      1|    b.add(u"unit-width-narrow", STEM_UNIT_WIDTH_NARROW, status);
   85|      1|    b.add(u"unit-width-short", STEM_UNIT_WIDTH_SHORT, status);
   86|      1|    b.add(u"unit-width-full-name", STEM_UNIT_WIDTH_FULL_NAME, status);
   87|      1|    b.add(u"unit-width-iso-code", STEM_UNIT_WIDTH_ISO_CODE, status);
   88|      1|    b.add(u"unit-width-formal", STEM_UNIT_WIDTH_FORMAL, status);
   89|      1|    b.add(u"unit-width-variant", STEM_UNIT_WIDTH_VARIANT, status);
   90|      1|    b.add(u"unit-width-hidden", STEM_UNIT_WIDTH_HIDDEN, status);
   91|      1|    b.add(u"sign-auto", STEM_SIGN_AUTO, status);
   92|      1|    b.add(u"sign-always", STEM_SIGN_ALWAYS, status);
   93|      1|    b.add(u"sign-never", STEM_SIGN_NEVER, status);
   94|      1|    b.add(u"sign-accounting", STEM_SIGN_ACCOUNTING, status);
   95|      1|    b.add(u"sign-accounting-always", STEM_SIGN_ACCOUNTING_ALWAYS, status);
   96|      1|    b.add(u"sign-except-zero", STEM_SIGN_EXCEPT_ZERO, status);
   97|      1|    b.add(u"sign-accounting-except-zero", STEM_SIGN_ACCOUNTING_EXCEPT_ZERO, status);
   98|      1|    b.add(u"sign-negative", STEM_SIGN_NEGATIVE, status);
   99|      1|    b.add(u"sign-accounting-negative", STEM_SIGN_ACCOUNTING_NEGATIVE, status);
  100|      1|    b.add(u"decimal-auto", STEM_DECIMAL_AUTO, status);
  101|      1|    b.add(u"decimal-always", STEM_DECIMAL_ALWAYS, status);
  102|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (102:9): [True: 0, False: 1]
  ------------------
  103|       |
  104|       |    // Section 2:
  105|      1|    b.add(u"precision-increment", STEM_PRECISION_INCREMENT, status);
  106|      1|    b.add(u"measure-unit", STEM_MEASURE_UNIT, status);
  107|      1|    b.add(u"per-measure-unit", STEM_PER_MEASURE_UNIT, status);
  108|      1|    b.add(u"unit", STEM_UNIT, status);
  109|      1|    b.add(u"usage", STEM_UNIT_USAGE, status);
  110|      1|    b.add(u"currency", STEM_CURRENCY, status);
  111|      1|    b.add(u"integer-width", STEM_INTEGER_WIDTH, status);
  112|      1|    b.add(u"numbering-system", STEM_NUMBERING_SYSTEM, status);
  113|      1|    b.add(u"scale", STEM_SCALE, status);
  114|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (114:9): [True: 0, False: 1]
  ------------------
  115|       |
  116|       |    // Section 3 (concise tokens):
  117|      1|    b.add(u"K", STEM_COMPACT_SHORT, status);
  118|      1|    b.add(u"KK", STEM_COMPACT_LONG, status);
  119|      1|    b.add(u"%", STEM_PERCENT, status);
  120|      1|    b.add(u"%x100", STEM_PERCENT_100, status);
  121|      1|    b.add(u",_", STEM_GROUP_OFF, status);
  122|      1|    b.add(u",?", STEM_GROUP_MIN2, status);
  123|      1|    b.add(u",!", STEM_GROUP_ON_ALIGNED, status);
  124|      1|    b.add(u"+!", STEM_SIGN_ALWAYS, status);
  125|      1|    b.add(u"+_", STEM_SIGN_NEVER, status);
  126|      1|    b.add(u"()", STEM_SIGN_ACCOUNTING, status);
  127|      1|    b.add(u"()!", STEM_SIGN_ACCOUNTING_ALWAYS, status);
  128|      1|    b.add(u"+?", STEM_SIGN_EXCEPT_ZERO, status);
  129|      1|    b.add(u"()?", STEM_SIGN_ACCOUNTING_EXCEPT_ZERO, status);
  130|      1|    b.add(u"+-", STEM_SIGN_NEGATIVE, status);
  131|      1|    b.add(u"()-", STEM_SIGN_ACCOUNTING_NEGATIVE, status);
  132|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (132:9): [True: 0, False: 1]
  ------------------
  133|       |
  134|       |    // Build the CharsTrie
  135|       |    // TODO: Use SLOW or FAST here?
  136|      1|    UnicodeString result;
  137|      1|    b.buildUnicodeString(USTRINGTRIE_BUILD_FAST, result, status);
  138|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (138:9): [True: 0, False: 1]
  ------------------
  139|       |
  140|       |    // Copy the result into the global constant pointer
  141|      1|    size_t numBytes = result.length() * sizeof(char16_t);
  142|      1|    kSerializedStemTrie = static_cast<char16_t*>(uprv_malloc(numBytes));
  ------------------
  |  | 1524|      1|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  143|      1|    uprv_memcpy(kSerializedStemTrie, result.getBuffer(), numBytes);
  ------------------
  |  |   42|      1|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      1|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      1|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      1|    _Pragma("clang diagnostic push") \
  |  |   45|      1|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      1|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      1|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      1|    _Pragma("clang diagnostic pop") \
  |  |   49|      1|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      1|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      1|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|      1|}

_ZN6icu_786number4impl8skeleton14isWildcardCharEDs:
  140|    651|inline bool isWildcardChar(char16_t c) {
  141|    651|    return c == kWildcardChar || c == kAltWildcardChar;
  ------------------
  |  Branch (141:12): [True: 220, False: 431]
  |  Branch (141:34): [True: 106, False: 325]
  ------------------
  142|    651|}

_ZN6icu_786number4impl14SymbolsWrapperC2EOS2_:
   19|  3.80k|SymbolsWrapper::SymbolsWrapper(SymbolsWrapper &&src) noexcept {
   20|  3.80k|    doMoveFrom(std::move(src));
   21|  3.80k|}
_ZN6icu_786number4impl14SymbolsWrapperaSERKS2_:
   23|  8.53k|SymbolsWrapper &SymbolsWrapper::operator=(const SymbolsWrapper &other) {
   24|  8.53k|    if (this == &other) {
  ------------------
  |  Branch (24:9): [True: 0, False: 8.53k]
  ------------------
   25|      0|        return *this;
   26|      0|    }
   27|  8.53k|    doCleanup();
   28|  8.53k|    doCopyFrom(other);
   29|  8.53k|    return *this;
   30|  8.53k|}
_ZN6icu_786number4impl14SymbolsWrapperD2Ev:
   41|  17.9k|SymbolsWrapper::~SymbolsWrapper() {
   42|  17.9k|    doCleanup();
   43|  17.9k|}
_ZN6icu_786number4impl14SymbolsWrapper10doCopyFromERKS2_:
   57|  8.53k|void SymbolsWrapper::doCopyFrom(const SymbolsWrapper &other) {
   58|  8.53k|    fType = other.fType;
   59|  8.53k|    switch (fType) {
  ------------------
  |  Branch (59:13): [True: 0, False: 8.53k]
  ------------------
   60|  8.53k|    case SYMPTR_NONE:
  ------------------
  |  Branch (60:5): [True: 8.53k, False: 0]
  ------------------
   61|       |        // No action necessary
   62|  8.53k|        break;
   63|      0|    case SYMPTR_DFS:
  ------------------
  |  Branch (63:5): [True: 0, False: 8.53k]
  ------------------
   64|       |        // Memory allocation failures are exposed in copyErrorTo()
   65|      0|        if (other.fPtr.dfs != nullptr) {
  ------------------
  |  Branch (65:13): [True: 0, False: 0]
  ------------------
   66|      0|            fPtr.dfs = new DecimalFormatSymbols(*other.fPtr.dfs);
   67|      0|        } else {
   68|      0|            fPtr.dfs = nullptr;
   69|      0|        }
   70|      0|        break;
   71|      0|    case SYMPTR_NS:
  ------------------
  |  Branch (71:5): [True: 0, False: 8.53k]
  ------------------
   72|       |        // Memory allocation failures are exposed in copyErrorTo()
   73|      0|        if (other.fPtr.ns != nullptr) {
  ------------------
  |  Branch (73:13): [True: 0, False: 0]
  ------------------
   74|      0|            fPtr.ns = new NumberingSystem(*other.fPtr.ns);
   75|      0|        } else {
   76|      0|            fPtr.ns = nullptr;
   77|      0|        }
   78|      0|        break;
   79|  8.53k|    }
   80|  8.53k|}
_ZN6icu_786number4impl14SymbolsWrapper10doMoveFromEOS2_:
   82|  3.80k|void SymbolsWrapper::doMoveFrom(SymbolsWrapper &&src) {
   83|  3.80k|    fType = src.fType;
   84|  3.80k|    switch (fType) {
  ------------------
  |  Branch (84:13): [True: 0, False: 3.80k]
  ------------------
   85|  3.80k|    case SYMPTR_NONE:
  ------------------
  |  Branch (85:5): [True: 3.80k, False: 0]
  ------------------
   86|       |        // No action necessary
   87|  3.80k|        break;
   88|      0|    case SYMPTR_DFS:
  ------------------
  |  Branch (88:5): [True: 0, False: 3.80k]
  ------------------
   89|      0|        fPtr.dfs = src.fPtr.dfs;
   90|      0|        src.fPtr.dfs = nullptr;
   91|      0|        break;
   92|      0|    case SYMPTR_NS:
  ------------------
  |  Branch (92:5): [True: 0, False: 3.80k]
  ------------------
   93|      0|        fPtr.ns = src.fPtr.ns;
   94|      0|        src.fPtr.ns = nullptr;
   95|      0|        break;
   96|  3.80k|    }
   97|  3.80k|}
_ZN6icu_786number4impl14SymbolsWrapper9doCleanupEv:
   99|  26.5k|void SymbolsWrapper::doCleanup() {
  100|  26.5k|    switch (fType) {
  ------------------
  |  Branch (100:13): [True: 0, False: 26.5k]
  ------------------
  101|  26.5k|    case SYMPTR_NONE:
  ------------------
  |  Branch (101:5): [True: 26.5k, False: 0]
  ------------------
  102|       |        // No action necessary
  103|  26.5k|        break;
  104|      0|    case SYMPTR_DFS:
  ------------------
  |  Branch (104:5): [True: 0, False: 26.5k]
  ------------------
  105|      0|        delete fPtr.dfs;
  106|      0|        break;
  107|      0|    case SYMPTR_NS:
  ------------------
  |  Branch (107:5): [True: 0, False: 26.5k]
  ------------------
  108|      0|        delete fPtr.ns;
  109|      0|        break;
  110|  26.5k|    }
  111|  26.5k|}
_ZNK6icu_786number4impl14SymbolsWrapper22isDecimalFormatSymbolsEv:
  113|  9.33k|bool SymbolsWrapper::isDecimalFormatSymbols() const {
  114|  9.33k|    return fType == SYMPTR_DFS;
  115|  9.33k|}
_ZNK6icu_786number4impl14SymbolsWrapper17isNumberingSystemEv:
  117|  9.33k|bool SymbolsWrapper::isNumberingSystem() const {
  118|  9.33k|    return fType == SYMPTR_NS;
  119|  9.33k|}

_ZN6icu_786number4impl19MicroPropsGeneratorD2Ev:
  277|  33.3k|    virtual ~MicroPropsGenerator() = default;

_ZN6icu_786number4impl10StringPropaSERKS2_:
   36|  17.0k|StringProp &StringProp::operator=(const StringProp &other) {
   37|  17.0k|    if (this == &other) { return *this; }  // self-assignment: no-op
  ------------------
  |  Branch (37:9): [True: 0, False: 17.0k]
  ------------------
   38|  17.0k|    fLength = 0;
   39|  17.0k|    fError = other.fError;
   40|  17.0k|    if (fValue != nullptr) {
  ------------------
  |  Branch (40:9): [True: 0, False: 17.0k]
  ------------------
   41|      0|        uprv_free(fValue);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   42|      0|        fValue = nullptr;
   43|      0|    }
   44|  17.0k|    if (other.fValue == nullptr) {
  ------------------
  |  Branch (44:9): [True: 17.0k, False: 0]
  ------------------
   45|  17.0k|        return *this;
   46|  17.0k|    }
   47|      0|    if (U_FAILURE(other.fError)) {
  ------------------
  |  Branch (47:9): [True: 0, False: 0]
  ------------------
   48|       |        // We don't bother trying to allocating memory if we're in any case busy
   49|       |        // copying an errored StringProp.
   50|      0|        return *this;
   51|      0|    }
   52|      0|    fValue = static_cast<char*>(uprv_malloc(other.fLength + 1));
  ------------------
  |  | 1524|      0|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   53|      0|    if (fValue == nullptr) {
  ------------------
  |  Branch (53:9): [True: 0, False: 0]
  ------------------
   54|      0|        fError = U_MEMORY_ALLOCATION_ERROR;
   55|      0|        return *this;
   56|      0|    }
   57|      0|    fLength = other.fLength;
   58|      0|    uprv_strncpy(fValue, other.fValue, fLength + 1);
  ------------------
  |  |   43|      0|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   59|      0|    return *this;
   60|      0|}
_ZN6icu_786number4impl10StringPropC2EOS2_:
   63|  7.61k|StringProp::StringProp(StringProp &&src) noexcept : fValue(src.fValue),
   64|  7.61k|                                                      fLength(src.fLength),
   65|  7.61k|                                                      fError(src.fError) {
   66|       |    // Take ownership away from src if necessary
   67|  7.61k|    src.fValue = nullptr;
   68|  7.61k|}
_ZN6icu_786number4impl10StringPropD2Ev:
   86|  35.9k|StringProp::~StringProp() {
   87|  35.9k|    if (fValue != nullptr) {
  ------------------
  |  Branch (87:9): [True: 0, False: 35.9k]
  ------------------
   88|      0|        uprv_free(fValue);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   89|      0|        fValue = nullptr;
   90|      0|    }
   91|  35.9k|}

_ZN6icu_786number4impl5utils18getPatternForStyleERKNS_6LocaleEPKcNS1_16CldrPatternStyleER10UErrorCode:
   53|  9.33k|                                          UErrorCode& status) {
   54|  9.33k|    const char* patternKey;
   55|  9.33k|    switch (style) {
   56|  9.24k|        case CLDR_PATTERN_STYLE_DECIMAL:
  ------------------
  |  Branch (56:9): [True: 9.24k, False: 86]
  ------------------
   57|  9.24k|            patternKey = "decimalFormat";
   58|  9.24k|            break;
   59|      0|        case CLDR_PATTERN_STYLE_CURRENCY:
  ------------------
  |  Branch (59:9): [True: 0, False: 9.33k]
  ------------------
   60|      0|            patternKey = "currencyFormat";
   61|      0|            break;
   62|      0|        case CLDR_PATTERN_STYLE_ACCOUNTING:
  ------------------
  |  Branch (62:9): [True: 0, False: 9.33k]
  ------------------
   63|      0|            patternKey = "accountingFormat";
   64|      0|            break;
   65|     86|        case CLDR_PATTERN_STYLE_PERCENT:
  ------------------
  |  Branch (65:9): [True: 86, False: 9.24k]
  ------------------
   66|     86|            patternKey = "percentFormat";
   67|     86|            break;
   68|      0|        case CLDR_PATTERN_STYLE_SCIENTIFIC:
  ------------------
  |  Branch (68:9): [True: 0, False: 9.33k]
  ------------------
   69|      0|            patternKey = "scientificFormat";
   70|      0|            break;
   71|      0|        default:
  ------------------
  |  Branch (71:9): [True: 0, False: 9.33k]
  ------------------
   72|      0|            patternKey = "decimalFormat"; // silence compiler error
   73|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
   74|  9.33k|    }
   75|  9.33k|    LocalUResourceBundlePointer res(ures_open(nullptr, locale.getName(), &status));
  ------------------
  |  | 1691|  9.33k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   76|  9.33k|    if (U_FAILURE(status)) { return u""; }
  ------------------
  |  Branch (76:9): [True: 0, False: 9.33k]
  ------------------
   77|       |
   78|       |    // Attempt to get the pattern with the native numbering system.
   79|  9.33k|    UErrorCode localStatus = U_ZERO_ERROR;
   80|  9.33k|    const char16_t* pattern;
   81|  9.33k|    pattern = doGetPattern(res.getAlias(), nsName, patternKey, status, localStatus);
   82|  9.33k|    if (U_FAILURE(status)) { return u""; }
  ------------------
  |  Branch (82:9): [True: 0, False: 9.33k]
  ------------------
   83|       |
   84|       |    // Fall back to latn if native numbering system does not have the right pattern
   85|  9.33k|    if (U_FAILURE(localStatus) && uprv_strcmp("latn", nsName) != 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (85:9): [True: 0, False: 9.33k]
  |  Branch (85:35): [True: 0, False: 0]
  ------------------
   86|      0|        localStatus = U_ZERO_ERROR;
   87|      0|        pattern = doGetPattern(res.getAlias(), "latn", patternKey, status, localStatus);
   88|      0|        if (U_FAILURE(status)) { return u""; }
  ------------------
  |  Branch (88:13): [True: 0, False: 0]
  ------------------
   89|      0|    }
   90|       |
   91|  9.33k|    return pattern;
   92|  9.33k|}
_ZN6icu_786number4impl6DecNumC2Ev:
   95|  3.61k|DecNum::DecNum() {
   96|  3.61k|    uprv_decContextDefault(&fContext, DEC_INIT_BASE);
  ------------------
  |  | 1412|  3.61k|#define uprv_decContextDefault U_ICU_ENTRY_POINT_RENAME(uprv_decContextDefault)
  |  |  ------------------
  |  |  |  |  123|  3.61k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.61k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.61k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  uprv_decContextDefault(&fContext, DEC_INIT_BASE);
  ------------------
  |  |  243|  3.61k|  #define DEC_INIT_BASE         0
  ------------------
   97|  3.61k|    uprv_decContextSetRounding(&fContext, DEC_ROUND_HALF_EVEN);
  ------------------
  |  | 1417|  3.61k|#define uprv_decContextSetRounding U_ICU_ENTRY_POINT_RENAME(uprv_decContextSetRounding)
  |  |  ------------------
  |  |  |  |  123|  3.61k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.61k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.61k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|  3.61k|    fContext.traps = 0; // no traps, thank you (what does this even mean?)
   99|  3.61k|}
_ZN6icu_786number4impl6DecNumC2ERKS2_R10UErrorCode:
  102|  4.12k|        : fContext(other.fContext) {
  103|       |    // Allocate memory for the new DecNum.
  104|  4.12k|    U_ASSERT(fContext.digits == other.fData.getCapacity());
  ------------------
  |  |   35|  4.12k|#   define U_ASSERT(exp) (void)0
  ------------------
  105|  4.12k|    if (fContext.digits > kDefaultDigits) {
  ------------------
  |  Branch (105:9): [True: 914, False: 3.20k]
  ------------------
  106|    914|        void* p = fData.resize(fContext.digits, 0);
  107|    914|        if (p == nullptr) {
  ------------------
  |  Branch (107:13): [True: 0, False: 914]
  ------------------
  108|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  109|      0|            return;
  110|      0|        }
  111|    914|    }
  112|       |
  113|       |    // Copy the data from the old DecNum to the new one.
  114|  4.12k|    uprv_memcpy(fData.getAlias(), other.fData.getAlias(), sizeof(decNumber));
  ------------------
  |  |   42|  4.12k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  4.12k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  4.12k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  4.12k|    _Pragma("clang diagnostic push") \
  |  |   45|  4.12k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  4.12k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  4.12k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  4.12k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  4.12k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  4.12k|    _Pragma("clang diagnostic pop") \
  |  |   49|  4.12k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  4.12k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  4.12k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  4.12k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  115|  4.12k|    uprv_memcpy(fData.getArrayStart(),
  ------------------
  |  |   42|  4.12k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  4.12k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  4.12k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  4.12k|    _Pragma("clang diagnostic push") \
  |  |   45|  4.12k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  4.12k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  4.12k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  4.12k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  4.12k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  4.12k|    _Pragma("clang diagnostic pop") \
  |  |   49|  4.12k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  4.12k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  4.12k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  4.12k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  116|  4.12k|            other.fData.getArrayStart(),
  117|  4.12k|            other.fData.getArrayLimit() - other.fData.getArrayStart());
  118|  4.12k|}
_ZN6icu_786number4impl6DecNum5setToENS_11StringPieceER10UErrorCode:
  120|  1.55k|void DecNum::setTo(StringPiece str, UErrorCode& status) {
  121|       |    // We need NUL-terminated for decNumber; CharString guarantees this, but not StringPiece.
  122|  1.55k|    CharString cstr(str, status);
  123|  1.55k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (123:9): [True: 0, False: 1.55k]
  ------------------
  124|  1.55k|    _setTo(cstr.data(), str.length(), status);
  125|  1.55k|}
_ZN6icu_786number4impl6DecNum5setToEPKcR10UErrorCode:
  127|     35|void DecNum::setTo(const char* str, UErrorCode& status) {
  128|     35|    _setTo(str, static_cast<int32_t>(uprv_strlen(str)), status);
  ------------------
  |  |   37|     35|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|     35|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  129|     35|}
_ZN6icu_786number4impl6DecNum6_setToEPKciR10UErrorCode:
  163|  1.59k|void DecNum::_setTo(const char* str, int32_t maxDigits, UErrorCode& status) {
  164|  1.59k|    if (maxDigits > kDefaultDigits) {
  ------------------
  |  Branch (164:9): [True: 304, False: 1.28k]
  ------------------
  165|    304|        fData.resize(maxDigits, 0);
  166|    304|        fContext.digits = maxDigits;
  167|  1.28k|    } else {
  168|  1.28k|        fContext.digits = kDefaultDigits;
  169|  1.28k|    }
  170|       |
  171|  1.59k|    static_assert(DECDPUN == 1, "Assumes that DECDPUN is set to 1");
  172|  1.59k|    uprv_decNumberFromString(fData.getAlias(), str, &fContext);
  ------------------
  |  | 1444|  1.59k|#define uprv_decNumberFromString U_ICU_ENTRY_POINT_RENAME(uprv_decNumberFromString)
  |  |  ------------------
  |  |  |  |  123|  1.59k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.59k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.59k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  173|       |
  174|       |    // Check for invalid syntax and set the corresponding error code.
  175|  1.59k|    if ((fContext.status & DEC_Conversion_syntax) != 0) {
  ------------------
  |  |  144|  1.59k|    #define DEC_Conversion_syntax    0x00000001
  ------------------
  |  Branch (175:9): [True: 72, False: 1.51k]
  ------------------
  176|     72|        status = U_DECIMAL_NUMBER_SYNTAX_ERROR;
  177|     72|        return;
  178|  1.51k|    } else if (fContext.status != 0) {
  ------------------
  |  Branch (178:16): [True: 125, False: 1.39k]
  ------------------
  179|       |        // Not a syntax error, but some other error, like an exponent that is too large.
  180|    125|        status = U_UNSUPPORTED_ERROR;
  181|    125|        return;
  182|    125|    }
  183|  1.59k|}
_ZN6icu_786number4impl6DecNum5setToEPKhiibR10UErrorCode:
  186|  2.02k|DecNum::setTo(const uint8_t* bcd, int32_t length, int32_t scale, bool isNegative, UErrorCode& status) {
  187|  2.02k|    if (length > kDefaultDigits) {
  ------------------
  |  Branch (187:9): [True: 0, False: 2.02k]
  ------------------
  188|      0|        fData.resize(length, 0);
  189|      0|        fContext.digits = length;
  190|  2.02k|    } else {
  191|  2.02k|        fContext.digits = kDefaultDigits;
  192|  2.02k|    }
  193|       |
  194|       |    // "digits is of type int32_t, and must have a value in the range 1 through 999,999,999."
  195|  2.02k|    if (length < 1 || length > 999999999) {
  ------------------
  |  Branch (195:9): [True: 0, False: 2.02k]
  |  Branch (195:23): [True: 0, False: 2.02k]
  ------------------
  196|       |        // Too large for decNumber
  197|      0|        status = U_UNSUPPORTED_ERROR;
  198|      0|        return;
  199|      0|    }
  200|       |    // "The exponent field holds the exponent of the number. Its range is limited by the requirement that
  201|       |    // "the range of the adjusted exponent of the number be balanced and fit within a whole number of
  202|       |    // "decimal digits (in this implementation, be –999,999,999 through +999,999,999). The adjusted
  203|       |    // "exponent is the exponent that would result if the number were expressed with a single digit before
  204|       |    // "the decimal point, and is therefore given by exponent+digits-1."
  205|  2.02k|    if (scale > 999999999 - length + 1 || scale < -999999999 - length + 1) {
  ------------------
  |  Branch (205:9): [True: 0, False: 2.02k]
  |  Branch (205:43): [True: 0, False: 2.02k]
  ------------------
  206|       |        // Too large for decNumber
  207|      0|        status = U_UNSUPPORTED_ERROR;
  208|      0|        return;
  209|      0|    }
  210|       |
  211|  2.02k|    fData.getAlias()->digits = length;
  212|  2.02k|    fData.getAlias()->exponent = scale;
  213|  2.02k|    fData.getAlias()->bits = static_cast<uint8_t>(isNegative ? DECNEG : 0);
  ------------------
  |  |   44|    649|  #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
  ------------------
  |  Branch (213:51): [True: 649, False: 1.37k]
  ------------------
  214|  2.02k|    uprv_decNumberSetBCD(fData, bcd, static_cast<uint32_t>(length));
  ------------------
  |  | 1474|  2.02k|#define uprv_decNumberSetBCD U_ICU_ENTRY_POINT_RENAME(uprv_decNumberSetBCD)
  |  |  ------------------
  |  |  |  |  123|  2.02k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.02k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.02k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  215|  2.02k|    if (fContext.status != 0) {
  ------------------
  |  Branch (215:9): [True: 0, False: 2.02k]
  ------------------
  216|       |        // Some error occurred while constructing the decNumber.
  217|      0|        status = U_INTERNAL_PROGRAM_ERROR;
  218|      0|    }
  219|  2.02k|}
_ZN6icu_786number4impl6DecNum9normalizeEv:
  221|  1.33k|void DecNum::normalize() {
  222|  1.33k|    uprv_decNumberReduce(fData, fData, &fContext);
  ------------------
  |  | 1467|  1.33k|#define uprv_decNumberReduce U_ICU_ENTRY_POINT_RENAME(uprv_decNumberReduce)
  |  |  ------------------
  |  |  |  |  123|  1.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|  1.33k|}
_ZN6icu_786number4impl6DecNum10multiplyByERKS2_R10UErrorCode:
  225|  2.02k|void DecNum::multiplyBy(const DecNum& rhs, UErrorCode& status) {
  226|  2.02k|    uprv_decNumberMultiply(fData, fData, rhs.fData, &fContext);
  ------------------
  |  | 1458|  2.02k|#define uprv_decNumberMultiply U_ICU_ENTRY_POINT_RENAME(uprv_decNumberMultiply)
  |  |  ------------------
  |  |  |  |  123|  2.02k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.02k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.02k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  227|  2.02k|    if (fContext.status != 0) {
  ------------------
  |  Branch (227:9): [True: 507, False: 1.51k]
  ------------------
  228|    507|        status = U_INTERNAL_PROGRAM_ERROR;
  229|    507|    }
  230|  2.02k|}
_ZNK6icu_786number4impl6DecNum10isNegativeEv:
  241|  1.80k|bool DecNum::isNegative() const {
  242|  1.80k|    return decNumberIsNegative(fData.getAlias());
  ------------------
  |  |  189|  1.80k|  #define decNumberIsNegative(dn)  (((dn)->bits&DECNEG)!=0)
  |  |  ------------------
  |  |  |  |   44|  1.80k|  #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
  |  |  ------------------
  ------------------
  243|  1.80k|}
_ZNK6icu_786number4impl6DecNum6isZeroEv:
  245|  1.51k|bool DecNum::isZero() const {
  246|  1.51k|    return decNumberIsZero(fData.getAlias());
  ------------------
  |  |  193|  1.51k|  #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
  |  |  ------------------
  |  |  |  Branch (193:37): [True: 313, False: 1.20k]
  |  |  ------------------
  |  |  194|  1.51k|                                    && (dn)->digits==1 \
  |  |  ------------------
  |  |  |  Branch (194:40): [True: 91, False: 222]
  |  |  ------------------
  |  |  195|  1.51k|                                    && (((dn)->bits&DECSPECIAL)==0))
  |  |  ------------------
  |  |  |  |   49|     91|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  ------------------
  |  |  |  |  |  |   45|     91|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  ------------------
  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  ------------------
  |  |  |  |  |  |   46|     91|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  ------------------
  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  ------------------
  |  |  |  |  |  |   47|     91|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (195:40): [True: 91, False: 0]
  |  |  ------------------
  ------------------
  247|  1.51k|}
_ZNK6icu_786number4impl6DecNum9isSpecialEv:
  249|  1.35k|bool DecNum::isSpecial() const {
  250|  1.35k|    return decNumberIsSpecial(fData.getAlias());
  ------------------
  |  |  192|  1.35k|  #define decNumberIsSpecial(dn)   (((dn)->bits&DECSPECIAL)!=0)
  |  |  ------------------
  |  |  |  |   49|  1.35k|  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  1.35k|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  |  |  ------------------
  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  ------------------
  |  |  |  |  |  |   46|  1.35k|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  |  |  ------------------
  |  |  |  |                 #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
  |  |  |  |  ------------------
  |  |  |  |  |  |   47|  1.35k|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  251|  1.35k|}
_ZNK6icu_786number4impl6DecNum10isInfinityEv:
  253|  1.51k|bool DecNum::isInfinity() const {
  254|  1.51k|    return decNumberIsInfinite(fData.getAlias());
  ------------------
  |  |  187|  1.51k|  #define decNumberIsInfinite(dn)  (((dn)->bits&DECINF)!=0)
  |  |  ------------------
  |  |  |  |   45|  1.51k|  #define DECINF    0x40      /* 1=Infinity                           */
  |  |  ------------------
  ------------------
  255|  1.51k|}
_ZNK6icu_786number4impl6DecNum5isNaNEv:
  257|  1.51k|bool DecNum::isNaN() const {
  258|  1.51k|    return decNumberIsNaN(fData.getAlias());
  ------------------
  |  |  188|  1.51k|  #define decNumberIsNaN(dn)       (((dn)->bits&(DECNAN|DECSNAN))!=0)
  |  |  ------------------
  |  |  |  |   46|  1.51k|  #define DECNAN    0x20      /* 1=NaN                                */
  |  |  ------------------
  |  |                 #define decNumberIsNaN(dn)       (((dn)->bits&(DECNAN|DECSNAN))!=0)
  |  |  ------------------
  |  |  |  |   47|  1.51k|  #define DECSNAN   0x10      /* 1=sNaN                               */
  |  |  ------------------
  ------------------
  259|  1.51k|}
number_utils.cpp:_ZN12_GLOBAL__N_112doGetPatternEP15UResourceBundlePKcS3_R10UErrorCodeS5_:
   36|  9.33k|             UErrorCode& localStatus) {
   37|       |    // Construct the path into the resource bundle
   38|  9.33k|    CharString key;
   39|  9.33k|    key.append("NumberElements/", publicStatus);
   40|  9.33k|    key.append(nsName, publicStatus);
   41|  9.33k|    key.append("/patterns/", publicStatus);
   42|  9.33k|    key.append(patternKey, publicStatus);
   43|  9.33k|    if (U_FAILURE(publicStatus)) {
  ------------------
  |  Branch (43:9): [True: 0, False: 9.33k]
  ------------------
   44|      0|        return u"";
   45|      0|    }
   46|  9.33k|    return ures_getStringByKeyWithFallback(res, key.data(), nullptr, &localStatus);
  ------------------
  |  | 1678|  9.33k|#define ures_getStringByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getStringByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   47|  9.33k|}

_ZN6icu_786number4impl5utils22insertDigitFromSymbolsERNS_22FormattedStringBuilderEiaRKNS_20DecimalFormatSymbolsENS3_5FieldER10UErrorCode:
   40|  1.29G|                                      UErrorCode& status) {
   41|  1.29G|    if (symbols.getCodePointZero() != -1) {
  ------------------
  |  Branch (41:9): [True: 1.29G, False: 0]
  ------------------
   42|  1.29G|        return output.insertCodePoint(index, symbols.getCodePointZero() + digit, field, status);
   43|  1.29G|    }
   44|      0|    return output.insert(index, symbols.getConstDigitSymbol(digit), field, status);
   45|  1.29G|}
_ZN6icu_786number4impl5utils14unitIsCurrencyERKNS_11MeasureUnitE:
   47|  9.33k|inline bool unitIsCurrency(const MeasureUnit& unit) {
   48|  9.33k|    return uprv_strcmp("currency", unit.getType()) == 0;
  ------------------
  |  |   38|  9.33k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   49|  9.33k|}
_ZN6icu_786number4impl5utils14unitIsBaseUnitERKNS_11MeasureUnitE:
   51|  10.8k|inline bool unitIsBaseUnit(const MeasureUnit& unit) {
   52|  10.8k|    return unit == MeasureUnit();
   53|  10.8k|}
_ZN6icu_786number4impl5utils13unitIsPercentERKNS_11MeasureUnitE:
   55|  9.33k|inline bool unitIsPercent(const MeasureUnit& unit) {
   56|  9.33k|    return uprv_strcmp("percent", unit.getSubtype()) == 0;
  ------------------
  |  |   38|  9.33k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   57|  9.33k|}
_ZN6icu_786number4impl5utils14unitIsPermilleERKNS_11MeasureUnitE:
   59|  9.33k|inline bool unitIsPermille(const MeasureUnit& unit) {
   60|  9.33k|    return uprv_strcmp("permille", unit.getSubtype()) == 0;
  ------------------
  |  |   38|  9.33k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   61|  9.33k|}
_ZN6icu_786number4impl5utils17getStandardPluralEPKNS_11PluralRulesERKNS_13IFixedDecimalE:
   75|  4.19k|                                              const IFixedDecimal &fdec) {
   76|  4.19k|    if (rules == nullptr) {
  ------------------
  |  Branch (76:9): [True: 0, False: 4.19k]
  ------------------
   77|       |        // Fail gracefully if the user didn't provide a PluralRules
   78|      0|        return StandardPlural::Form::OTHER;
   79|  4.19k|    } else {
   80|  4.19k|        UnicodeString ruleString = rules->select(fdec);
   81|  4.19k|        return StandardPlural::orOtherFromString(ruleString);
   82|  4.19k|    }
   83|  4.19k|}
_ZN6icu_786number4impl5utils13getPluralSafeERKNS1_12RoundingImplEPKNS_11PluralRulesERKNS1_15DecimalQuantityER10UErrorCode:
   92|  1.52k|        UErrorCode& status) {
   93|       |    // TODO(ICU-20500): Avoid the copy?
   94|  1.52k|    DecimalQuantity copy(dq);
   95|  1.52k|    rounder.apply(copy, status);
   96|  1.52k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (96:9): [True: 0, False: 1.52k]
  ------------------
   97|      0|        return StandardPlural::Form::OTHER;
   98|      0|    }
   99|  1.52k|    return getStandardPlural(rules, copy);
  100|  1.52k|}

_ZN6icu_786number4impl20UFormattedNumberDataC2Ev:
   34|  9.45k|    UFormattedNumberData() : FormattedValueStringBuilderImpl(kUndefinedField) {}

_ZN6icu_7815NumberingSystemC2Ev:
   62|  9.33k|NumberingSystem::NumberingSystem() {
   63|  9.33k|     radix = 10;
   64|  9.33k|     algorithmic = false;
   65|  9.33k|     UnicodeString defaultDigits = DEFAULT_DIGITS;
  ------------------
  |  |   40|  9.33k|#define DEFAULT_DIGITS UNICODE_STRING_SIMPLE("0123456789")
  |  |  ------------------
  |  |  |  |  135|  9.33k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  |  |  ------------------
  |  |  |  |  |  |  121|  9.33k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   66|  9.33k|     desc.setTo(defaultDigits);
   67|  9.33k|     uprv_strcpy(name,gLatn);
  ------------------
  |  |   36|  9.33k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   68|  9.33k|}
_ZN6icu_7815NumberingSystem14createInstanceEiaRKNS_13UnicodeStringER10UErrorCode:
   81|  9.33k|NumberingSystem::createInstance(int32_t radix_in, UBool isAlgorithmic_in, const UnicodeString & desc_in, UErrorCode &status) {
   82|       |
   83|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (83:9): [True: 0, False: 9.33k]
  ------------------
   84|      0|        return nullptr;
   85|      0|    }
   86|       |
   87|  9.33k|    if ( radix_in < 2 ) {
  ------------------
  |  Branch (87:10): [True: 0, False: 9.33k]
  ------------------
   88|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
   89|      0|        return nullptr;
   90|      0|    }
   91|       |
   92|  9.33k|    if ( !isAlgorithmic_in ) {
  ------------------
  |  Branch (92:10): [True: 9.33k, False: 0]
  ------------------
   93|  9.33k|       if ( desc_in.countChar32() != radix_in ) {
  ------------------
  |  Branch (93:13): [True: 0, False: 9.33k]
  ------------------
   94|      0|           status = U_ILLEGAL_ARGUMENT_ERROR;
   95|      0|           return nullptr;
   96|      0|       }
   97|  9.33k|    }
   98|       |
   99|  9.33k|    LocalPointer<NumberingSystem> ns(new NumberingSystem(), status);
  100|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (100:9): [True: 0, False: 9.33k]
  ------------------
  101|      0|        return nullptr;
  102|      0|    }
  103|       |
  104|  9.33k|    ns->setRadix(radix_in);
  105|  9.33k|    ns->setDesc(desc_in);
  106|  9.33k|    ns->setAlgorithmic(isAlgorithmic_in);
  107|  9.33k|    ns->setName(nullptr);
  108|       |
  109|  9.33k|    return ns.orphan();
  110|  9.33k|}
_ZN6icu_7815NumberingSystem14createInstanceERKNS_6LocaleER10UErrorCode:
  113|  9.33k|NumberingSystem::createInstance(const Locale & inLocale, UErrorCode& status) {
  114|       |
  115|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (115:9): [True: 0, False: 9.33k]
  ------------------
  116|      0|        return nullptr;
  117|      0|    }
  118|       |
  119|  9.33k|    UBool nsResolved = true;
  120|  9.33k|    UBool usingFallback = false;
  121|  9.33k|    char buffer[ULOC_KEYWORDS_CAPACITY] = "";
  122|  9.33k|    int32_t count = inLocale.getKeywordValue("numbers", buffer, sizeof(buffer), status);
  123|  9.33k|    if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) {
  ------------------
  |  Branch (123:9): [True: 0, False: 9.33k]
  |  Branch (123:30): [True: 0, False: 9.33k]
  ------------------
  124|       |        // the "numbers" keyword exceeds ULOC_KEYWORDS_CAPACITY; ignore and use default.
  125|      0|        count = 0;
  126|      0|        status = U_ZERO_ERROR;
  127|      0|    }
  128|  9.33k|    if ( count > 0 ) { // @numbers keyword was specified in the locale
  ------------------
  |  Branch (128:10): [True: 0, False: 9.33k]
  ------------------
  129|      0|        U_ASSERT(count < ULOC_KEYWORDS_CAPACITY);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  130|      0|        buffer[count] = '\0'; // Make sure it is null terminated.
  131|      0|        if ( !uprv_strcmp(buffer,gDefault) || !uprv_strcmp(buffer,gNative) || 
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                      if ( !uprv_strcmp(buffer,gDefault) || !uprv_strcmp(buffer,gNative) || 
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (131:14): [True: 0, False: 0]
  |  Branch (131:47): [True: 0, False: 0]
  ------------------
  132|      0|             !uprv_strcmp(buffer,gTraditional) || !uprv_strcmp(buffer,gFinance)) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                           !uprv_strcmp(buffer,gTraditional) || !uprv_strcmp(buffer,gFinance)) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (132:14): [True: 0, False: 0]
  |  Branch (132:51): [True: 0, False: 0]
  ------------------
  133|      0|            nsResolved = false;
  134|      0|        }
  135|  9.33k|    } else {
  136|  9.33k|        uprv_strcpy(buffer, gDefault);
  ------------------
  |  |   36|  9.33k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  137|  9.33k|        nsResolved = false;
  138|  9.33k|    }
  139|       |
  140|  9.33k|    if (!nsResolved) { // Resolve the numbering system ( default, native, traditional or finance ) into a "real" numbering system
  ------------------
  |  Branch (140:9): [True: 9.33k, False: 0]
  ------------------
  141|  9.33k|        UErrorCode localStatus = U_ZERO_ERROR;
  142|  9.33k|        LocalUResourceBundlePointer resource(ures_open(nullptr, inLocale.getName(), &localStatus));
  ------------------
  |  | 1691|  9.33k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  143|  9.33k|        LocalUResourceBundlePointer numberElementsRes(ures_getByKey(resource.getAlias(), gNumberElements, nullptr, &localStatus));
  ------------------
  |  | 1661|  9.33k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|       |        // Don't stomp on the catastrophic failure of OOM.
  145|  9.33k|        if (localStatus == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (145:13): [True: 0, False: 9.33k]
  ------------------
  146|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  147|      0|            return nullptr;
  148|      0|        }
  149|  18.6k|        while (!nsResolved) {
  ------------------
  |  Branch (149:16): [True: 9.33k, False: 9.33k]
  ------------------
  150|  9.33k|            localStatus = U_ZERO_ERROR;
  151|  9.33k|            count = 0;
  152|  9.33k|            const char16_t *nsName = ures_getStringByKeyWithFallback(numberElementsRes.getAlias(), buffer, &count, &localStatus);
  ------------------
  |  | 1678|  9.33k|#define ures_getStringByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getStringByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  153|       |            // Don't stomp on the catastrophic failure of OOM.
  154|  9.33k|            if (localStatus == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (154:17): [True: 0, False: 9.33k]
  ------------------
  155|      0|                status = U_MEMORY_ALLOCATION_ERROR;
  156|      0|                return nullptr;
  157|      0|            }
  158|  9.33k|            if ( count > 0 && count < ULOC_KEYWORDS_CAPACITY ) { // numbering system found
  ------------------
  |  |  277|  9.33k|#define ULOC_KEYWORDS_CAPACITY 96
  ------------------
  |  Branch (158:18): [True: 9.33k, False: 0]
  |  Branch (158:31): [True: 9.33k, False: 0]
  ------------------
  159|  9.33k|                u_UCharsToChars(nsName, buffer, count);
  ------------------
  |  |  211|  9.33k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  160|  9.33k|                buffer[count] = '\0'; // Make sure it is null terminated.
  161|  9.33k|                nsResolved = true;
  162|  9.33k|            } 
  163|       |
  164|  9.33k|            if (!nsResolved) { // Fallback behavior per TR35 - traditional falls back to native, finance and native fall back to default
  ------------------
  |  Branch (164:17): [True: 0, False: 9.33k]
  ------------------
  165|      0|                if (!uprv_strcmp(buffer,gNative) || !uprv_strcmp(buffer,gFinance)) { 
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                              if (!uprv_strcmp(buffer,gNative) || !uprv_strcmp(buffer,gFinance)) { 
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (165:21): [True: 0, False: 0]
  |  Branch (165:53): [True: 0, False: 0]
  ------------------
  166|      0|                    uprv_strcpy(buffer,gDefault);
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  167|      0|                } else if (!uprv_strcmp(buffer,gTraditional)) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (167:28): [True: 0, False: 0]
  ------------------
  168|      0|                    uprv_strcpy(buffer,gNative);
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  169|      0|                } else { // If we get here we couldn't find even the default numbering system
  170|      0|                    usingFallback = true;
  171|      0|                    nsResolved = true;
  172|      0|                }
  173|      0|            }
  174|  9.33k|        }
  175|  9.33k|    }
  176|       |
  177|  9.33k|    if (usingFallback) {
  ------------------
  |  Branch (177:9): [True: 0, False: 9.33k]
  ------------------
  178|      0|        status = U_USING_FALLBACK_WARNING;
  179|      0|        NumberingSystem *ns = new NumberingSystem();
  180|      0|        if (ns == nullptr) {
  ------------------
  |  Branch (180:13): [True: 0, False: 0]
  ------------------
  181|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  182|      0|        }
  183|      0|        return ns;
  184|  9.33k|    } else {
  185|  9.33k|        return NumberingSystem::createInstanceByName(buffer, status);
  186|  9.33k|    }
  187|  9.33k| }
_ZN6icu_7815NumberingSystem20createInstanceByNameEPKcR10UErrorCode:
  195|  9.33k|NumberingSystem::createInstanceByName(const char *name, UErrorCode& status) {
  196|  9.33k|    int32_t radix = 10;
  197|  9.33k|    int32_t algorithmic = 0;
  198|       |
  199|  9.33k|    LocalUResourceBundlePointer numberingSystemsInfo(ures_openDirect(nullptr, gNumberingSystems, &status));
  ------------------
  |  | 1693|  9.33k|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  200|  9.33k|    LocalUResourceBundlePointer nsCurrent(ures_getByKey(numberingSystemsInfo.getAlias(), gNumberingSystems, nullptr, &status));
  ------------------
  |  | 1661|  9.33k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  201|  9.33k|    LocalUResourceBundlePointer nsTop(ures_getByKey(nsCurrent.getAlias(), name, nullptr, &status));
  ------------------
  |  | 1661|  9.33k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  202|       |
  203|  9.33k|    UnicodeString nsd = ures_getUnicodeStringByKey(nsTop.getAlias(), gDesc, &status);
  204|       |
  205|  9.33k|    ures_getByKey(nsTop.getAlias(), gRadix, nsCurrent.getAlias(), &status);
  ------------------
  |  | 1661|  9.33k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  206|  9.33k|    radix = ures_getInt(nsCurrent.getAlias(), &status);
  ------------------
  |  | 1664|  9.33k|#define ures_getInt U_ICU_ENTRY_POINT_RENAME(ures_getInt)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  207|       |
  208|  9.33k|    ures_getByKey(nsTop.getAlias(), gAlgorithmic, nsCurrent.getAlias(), &status);
  ------------------
  |  | 1661|  9.33k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  209|  9.33k|    algorithmic = ures_getInt(nsCurrent.getAlias(), &status);
  ------------------
  |  | 1664|  9.33k|#define ures_getInt U_ICU_ENTRY_POINT_RENAME(ures_getInt)
  |  |  ------------------
  |  |  |  |  123|  9.33k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.33k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.33k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  210|       |
  211|  9.33k|    UBool isAlgorithmic = ( algorithmic == 1 );
  212|       |
  213|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (213:9): [True: 0, False: 9.33k]
  ------------------
  214|       |        // Don't stomp on the catastrophic failure of OOM.
  215|      0|        if (status != U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (215:13): [True: 0, False: 0]
  ------------------
  216|      0|            status = U_UNSUPPORTED_ERROR;
  217|      0|        }
  218|      0|        return nullptr;
  219|      0|    }
  220|       |
  221|  9.33k|    LocalPointer<NumberingSystem> ns(NumberingSystem::createInstance(radix, isAlgorithmic, nsd, status), status);
  222|  9.33k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (222:9): [True: 0, False: 9.33k]
  ------------------
  223|      0|        return nullptr;
  224|      0|    }
  225|  9.33k|    ns->setName(name);
  226|  9.33k|    return ns.orphan();
  227|  9.33k|}
_ZN6icu_7815NumberingSystemD2Ev:
  233|  9.33k|NumberingSystem::~NumberingSystem() {
  234|  9.33k|}
_ZNK6icu_7815NumberingSystem8getRadixEv:
  236|  9.33k|int32_t NumberingSystem::getRadix() const {
  237|  9.33k|    return radix;
  238|  9.33k|}
_ZNK6icu_7815NumberingSystem14getDescriptionEv:
  240|  9.33k|UnicodeString NumberingSystem::getDescription() const {
  241|  9.33k|    return desc;
  242|  9.33k|}
_ZNK6icu_7815NumberingSystem7getNameEv:
  244|  18.6k|const char * NumberingSystem::getName() const {
  245|  18.6k|    return name;
  246|  18.6k|}
_ZN6icu_7815NumberingSystem8setRadixEi:
  248|  9.33k|void NumberingSystem::setRadix(int32_t r) {
  249|  9.33k|    radix = r;
  250|  9.33k|}
_ZN6icu_7815NumberingSystem14setAlgorithmicEa:
  252|  9.33k|void NumberingSystem::setAlgorithmic(UBool c) {
  253|  9.33k|    algorithmic = c;
  254|  9.33k|}
_ZN6icu_7815NumberingSystem7setDescERKNS_13UnicodeStringE:
  256|  9.33k|void NumberingSystem::setDesc(const UnicodeString &d) {
  257|  9.33k|    desc.setTo(d);
  258|  9.33k|}
_ZN6icu_7815NumberingSystem7setNameEPKc:
  259|  18.6k|void NumberingSystem::setName(const char *n) {
  260|  18.6k|    if ( n == nullptr ) {
  ------------------
  |  Branch (260:10): [True: 9.33k, False: 9.33k]
  ------------------
  261|  9.33k|        name[0] = static_cast<char>(0);
  262|  9.33k|    } else {
  263|  9.33k|        uprv_strncpy(name,n,kInternalNumSysNameCapacity);
  ------------------
  |  |   43|  9.33k|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|  9.33k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  264|  9.33k|        name[kInternalNumSysNameCapacity] = '\0'; // Make sure it is null terminated.
  265|  9.33k|    }
  266|  18.6k|}
_ZNK6icu_7815NumberingSystem13isAlgorithmicEv:
  267|  9.33k|UBool NumberingSystem::isAlgorithmic() const {
  268|  9.33k|    return ( algorithmic );
  269|  9.33k|}

_ZN6icu_7820StandardPluralRanges9forLocaleERKNS_6LocaleER10UErrorCode:
   84|    516|StandardPluralRanges::forLocale(const Locale& locale, UErrorCode& status) {
   85|    516|    StandardPluralRanges result;
   86|    516|    getPluralRangesData(locale, result, status);
   87|    516|    return result;
   88|    516|}
_ZNK6icu_7820StandardPluralRanges4copyER10UErrorCode:
   91|  3.37k|StandardPluralRanges::copy(UErrorCode& status) const {
   92|  3.37k|    StandardPluralRanges result;
   93|  3.37k|    if (fTriplesLen > result.fTriples.getCapacity()) {
  ------------------
  |  Branch (93:9): [True: 1.12k, False: 2.25k]
  ------------------
   94|  1.12k|        if (result.fTriples.resize(fTriplesLen) == nullptr) {
  ------------------
  |  Branch (94:13): [True: 0, False: 1.12k]
  ------------------
   95|      0|            status = U_MEMORY_ALLOCATION_ERROR;
   96|      0|            return result;
   97|      0|        }
   98|  1.12k|    }
   99|  3.37k|    uprv_memcpy(result.fTriples.getAlias(),
  ------------------
  |  |   42|  3.37k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  3.37k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  3.37k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  3.37k|    _Pragma("clang diagnostic push") \
  |  |   45|  3.37k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  3.37k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  3.37k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  3.37k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  3.37k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  3.37k|    _Pragma("clang diagnostic pop") \
  |  |   49|  3.37k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  3.37k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  3.37k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  3.37k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  100|  3.37k|        fTriples.getAlias(),
  101|  3.37k|        fTriplesLen * sizeof(fTriples[0]));
  102|  3.37k|    result.fTriplesLen = fTriplesLen;
  103|  3.37k|    return result;
  104|  3.37k|}
_ZNO6icu_7820StandardPluralRanges9toPointerER10UErrorCode:
  107|  3.89k|StandardPluralRanges::toPointer(UErrorCode& status) && noexcept {
  108|  3.89k|    return LocalPointer<StandardPluralRanges>(new StandardPluralRanges(std::move(*this)), status);
  109|  3.89k|}
_ZN6icu_7820StandardPluralRanges14addPluralRangeENS_14StandardPlural4FormES2_S2_:
  114|  1.81k|        StandardPlural::Form result) {
  115|  1.81k|    U_ASSERT(fTriplesLen < fTriples.getCapacity());
  ------------------
  |  |   35|  1.81k|#   define U_ASSERT(exp) (void)0
  ------------------
  116|  1.81k|    fTriples[fTriplesLen] = {first, second, result};
  117|  1.81k|    fTriplesLen++;
  118|  1.81k|}
_ZN6icu_7820StandardPluralRanges11setCapacityEiR10UErrorCode:
  120|    284|void StandardPluralRanges::setCapacity(int32_t length, UErrorCode& status) {
  121|    284|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (121:9): [True: 0, False: 284]
  ------------------
  122|    284|    if (length > fTriples.getCapacity()) {
  ------------------
  |  Branch (122:9): [True: 93, False: 191]
  ------------------
  123|     93|        if (fTriples.resize(length, 0) == nullptr) {
  ------------------
  |  Branch (123:13): [True: 0, False: 93]
  ------------------
  124|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  125|      0|        }
  126|     93|    }
  127|    284|}
pluralranges.cpp:_ZN6icu_7812_GLOBAL__N_119getPluralRangesDataERKNS_6LocaleERNS_20StandardPluralRangesER10UErrorCode:
   58|    516|void getPluralRangesData(const Locale& locale, StandardPluralRanges& output, UErrorCode& status) {
   59|    516|    LocalUResourceBundlePointer rb(ures_openDirect(nullptr, "pluralRanges", &status));
  ------------------
  |  | 1693|    516|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|    516|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    516|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    516|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   60|    516|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (60:9): [True: 0, False: 516]
  ------------------
   61|       |
   62|    516|    CharString dataPath;
   63|    516|    dataPath.append("locales/", -1, status);
   64|    516|    dataPath.append(locale.getLanguage(), -1, status);
   65|    516|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (65:9): [True: 0, False: 516]
  ------------------
   66|    516|    int32_t setLen;
   67|       |    // Not all languages are covered: fail gracefully
   68|    516|    UErrorCode internalStatus = U_ZERO_ERROR;
   69|    516|    const char16_t* set = ures_getStringByKeyWithFallback(rb.getAlias(), dataPath.data(), &setLen, &internalStatus);
  ------------------
  |  | 1678|    516|#define ures_getStringByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getStringByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|    516|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    516|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    516|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   70|    516|    if (U_FAILURE(internalStatus)) { return; }
  ------------------
  |  Branch (70:9): [True: 232, False: 284]
  ------------------
   71|       |
   72|    284|    dataPath.clear();
   73|    284|    dataPath.append("rules/", -1, status);
   74|    284|    dataPath.appendInvariantChars(set, setLen, status);
   75|    284|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (75:9): [True: 0, False: 284]
  ------------------
   76|    284|    PluralRangesDataSink sink(output);
   77|    284|    ures_getAllItemsWithFallback(rb.getAlias(), dataPath.data(), sink, status);
  ------------------
  |  | 1658|    284|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|    284|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    284|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    284|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   78|    284|}
pluralranges.cpp:_ZN6icu_7812_GLOBAL__N_120PluralRangesDataSinkC2ERNS_20StandardPluralRangesE:
   27|    284|    PluralRangesDataSink(StandardPluralRanges& output) : fOutput(output) {}
pluralranges.cpp:_ZN6icu_7812_GLOBAL__N_120PluralRangesDataSink3putEPKcRNS_13ResourceValueEaR10UErrorCode:
   29|    284|    void put(const char* /*key*/, ResourceValue& value, UBool /*noFallback*/, UErrorCode& status) override {
   30|    284|        ResourceArray entriesArray = value.getArray(status);
   31|    284|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (31:13): [True: 0, False: 284]
  ------------------
   32|    284|        fOutput.setCapacity(entriesArray.getSize(), status);
   33|    284|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (33:13): [True: 0, False: 284]
  ------------------
   34|  2.09k|        for (int i = 0; entriesArray.getValue(i, value); i++) {
  ------------------
  |  Branch (34:25): [True: 1.81k, False: 284]
  ------------------
   35|  1.81k|            ResourceArray pluralFormsArray = value.getArray(status);
   36|  1.81k|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (36:17): [True: 0, False: 1.81k]
  ------------------
   37|  1.81k|            if (pluralFormsArray.getSize() != 3) {
  ------------------
  |  Branch (37:17): [True: 0, False: 1.81k]
  ------------------
   38|      0|                status = U_RESOURCE_TYPE_MISMATCH;
   39|      0|                return;
   40|      0|            }
   41|  1.81k|            pluralFormsArray.getValue(0, value);
   42|  1.81k|            StandardPlural::Form first = StandardPlural::fromString(value.getUnicodeString(status), status);
   43|  1.81k|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (43:17): [True: 0, False: 1.81k]
  ------------------
   44|  1.81k|            pluralFormsArray.getValue(1, value);
   45|  1.81k|            StandardPlural::Form second = StandardPlural::fromString(value.getUnicodeString(status), status);
   46|  1.81k|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (46:17): [True: 0, False: 1.81k]
  ------------------
   47|  1.81k|            pluralFormsArray.getValue(2, value);
   48|  1.81k|            StandardPlural::Form result = StandardPlural::fromString(value.getUnicodeString(status), status);
   49|  1.81k|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (49:17): [True: 0, False: 1.81k]
  ------------------
   50|  1.81k|            fOutput.addPluralRange(first, second, result);
   51|  1.81k|        }
   52|    284|    }

_ZN6icu_7811PluralRulesC2ER10UErrorCode:
   79|    516|:   UObject(),
   80|    516|    mRules(nullptr),
   81|    516|    mStandardPluralRanges(nullptr),
   82|    516|    mInternalStatus(U_ZERO_ERROR)
   83|    516|{
   84|    516|}
_ZN6icu_7811PluralRulesC2ERKS0_:
   87|  3.37k|: UObject(other),
   88|  3.37k|    mRules(nullptr),
   89|  3.37k|    mStandardPluralRanges(nullptr),
   90|  3.37k|    mInternalStatus(U_ZERO_ERROR)
   91|  3.37k|{
   92|  3.37k|    *this=other;
   93|  3.37k|}
_ZN6icu_7811PluralRulesD2Ev:
   95|  3.37k|PluralRules::~PluralRules() {
   96|  3.37k|    delete mRules;
   97|  3.37k|    delete mStandardPluralRanges;
   98|  3.37k|}
_ZNK6icu_7811PluralRules5cloneER10UErrorCode:
  113|  3.37k|PluralRules::clone(UErrorCode& status) const {
  114|  3.37k|    LocalPointer<PluralRules> newObj(new PluralRules(*this), status);
  115|  3.37k|    if (U_SUCCESS(status) && U_FAILURE(newObj->mInternalStatus)) {
  ------------------
  |  Branch (115:9): [True: 3.37k, False: 0]
  |  Branch (115:30): [True: 0, False: 3.37k]
  ------------------
  116|      0|        status = newObj->mInternalStatus;
  117|      0|        newObj.adoptInstead(nullptr);
  118|      0|    }
  119|  3.37k|    return newObj.orphan();
  120|  3.37k|}
_ZN6icu_7811PluralRulesaSERKS0_:
  123|  3.37k|PluralRules::operator=(const PluralRules& other) {
  124|  3.37k|    if (this != &other) {
  ------------------
  |  Branch (124:9): [True: 3.37k, False: 0]
  ------------------
  125|  3.37k|        delete mRules;
  126|  3.37k|        mRules = nullptr;
  127|  3.37k|        delete mStandardPluralRanges;
  128|  3.37k|        mStandardPluralRanges = nullptr;
  129|  3.37k|        mInternalStatus = other.mInternalStatus;
  130|  3.37k|        if (U_FAILURE(mInternalStatus)) {
  ------------------
  |  Branch (130:13): [True: 0, False: 3.37k]
  ------------------
  131|       |            // bail out early if the object we were copying from was already 'invalid'.
  132|      0|            return *this;
  133|      0|        }
  134|  3.37k|        if (other.mRules != nullptr) {
  ------------------
  |  Branch (134:13): [True: 3.37k, False: 0]
  ------------------
  135|  3.37k|            mRules = new RuleChain(*other.mRules);
  136|  3.37k|            if (mRules == nullptr) {
  ------------------
  |  Branch (136:17): [True: 0, False: 3.37k]
  ------------------
  137|      0|                mInternalStatus = U_MEMORY_ALLOCATION_ERROR;
  138|      0|            }
  139|  3.37k|            else if (U_FAILURE(mRules->fInternalStatus)) {
  ------------------
  |  Branch (139:22): [True: 0, False: 3.37k]
  ------------------
  140|       |                // If the RuleChain wasn't fully copied, then set our status to failure as well.
  141|      0|                mInternalStatus = mRules->fInternalStatus;
  142|      0|            }
  143|  3.37k|        }
  144|  3.37k|        if (other.mStandardPluralRanges != nullptr) {
  ------------------
  |  Branch (144:13): [True: 3.37k, False: 0]
  ------------------
  145|  3.37k|            mStandardPluralRanges = other.mStandardPluralRanges->copy(mInternalStatus)
  146|  3.37k|                .toPointer(mInternalStatus)
  147|  3.37k|                .orphan();
  148|  3.37k|        }
  149|  3.37k|    }
  150|  3.37k|    return *this;
  151|  3.37k|}
_ZNK6icu_7814LocaleCacheKeyINS_17SharedPluralRulesEE12createObjectEPKvR10UErrorCode:
  193|    516|        const void * /*unused*/, UErrorCode &status) const {
  194|    516|    const char *localeId = fLoc.getName();
  195|    516|    LocalPointer<PluralRules> pr(PluralRules::internalForLocale(localeId, UPLURAL_TYPE_CARDINAL, status), status);
  196|    516|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (196:9): [True: 0, False: 516]
  ------------------
  197|      0|        return nullptr;
  198|      0|    }
  199|    516|    LocalPointer<SharedPluralRules> result(new SharedPluralRules(pr.getAlias()), status);
  200|    516|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (200:9): [True: 0, False: 516]
  ------------------
  201|      0|        return nullptr;
  202|      0|    }
  203|    516|    pr.orphan(); // result was successfully created so it nows pr.
  204|    516|    result->addRef();
  205|    516|    return result.orphan();
  206|    516|}
_ZN6icu_7811PluralRules20createSharedInstanceERKNS_6LocaleE11UPluralTypeR10UErrorCode:
  213|  3.37k|        const Locale& locale, UPluralType type, UErrorCode& status) {
  214|  3.37k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (214:9): [True: 0, False: 3.37k]
  ------------------
  215|      0|        return nullptr;
  216|      0|    }
  217|  3.37k|    if (type != UPLURAL_TYPE_CARDINAL) {
  ------------------
  |  Branch (217:9): [True: 0, False: 3.37k]
  ------------------
  218|      0|        status = U_UNSUPPORTED_ERROR;
  219|      0|        return nullptr;
  220|      0|    }
  221|  3.37k|    const SharedPluralRules *result = nullptr;
  222|  3.37k|    UnifiedCache::getByLocale(locale, result, status);
  223|  3.37k|    return result;
  224|  3.37k|}
_ZN6icu_7811PluralRules9forLocaleERKNS_6LocaleER10UErrorCode:
  227|  3.37k|PluralRules::forLocale(const Locale& locale, UErrorCode& status) {
  228|  3.37k|    return forLocale(locale, UPLURAL_TYPE_CARDINAL, status);
  229|  3.37k|}
_ZN6icu_7811PluralRules9forLocaleERKNS_6LocaleE11UPluralTypeR10UErrorCode:
  232|  3.37k|PluralRules::forLocale(const Locale& locale, UPluralType type, UErrorCode& status) {
  233|  3.37k|    if (type != UPLURAL_TYPE_CARDINAL) {
  ------------------
  |  Branch (233:9): [True: 0, False: 3.37k]
  ------------------
  234|      0|        return internalForLocale(locale, type, status);
  235|      0|    }
  236|  3.37k|    const SharedPluralRules *shared = createSharedInstance(
  237|  3.37k|            locale, type, status);
  238|  3.37k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (238:9): [True: 0, False: 3.37k]
  ------------------
  239|      0|        return nullptr;
  240|      0|    }
  241|  3.37k|    PluralRules *result = (*shared)->clone(status);
  242|  3.37k|    shared->removeRef();
  243|  3.37k|    return result;
  244|  3.37k|}
_ZN6icu_7811PluralRules17internalForLocaleERKNS_6LocaleE11UPluralTypeR10UErrorCode:
  247|    516|PluralRules::internalForLocale(const Locale& locale, UPluralType type, UErrorCode& status) {
  248|    516|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (248:9): [True: 0, False: 516]
  ------------------
  249|      0|        return nullptr;
  250|      0|    }
  251|    516|    if (type >= UPLURAL_TYPE_COUNT) {
  ------------------
  |  Branch (251:9): [True: 0, False: 516]
  ------------------
  252|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  253|      0|        return nullptr;
  254|      0|    }
  255|    516|    LocalPointer<PluralRules> newObj(new PluralRules(status), status);
  256|    516|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (256:9): [True: 0, False: 516]
  ------------------
  257|      0|        return nullptr;
  258|      0|    }
  259|    516|    UnicodeString locRule = newObj->getRuleFromResource(locale, type, status);
  260|       |    // TODO: which other errors, if any, should be returned?
  261|    516|    if (locRule.length() == 0) {
  ------------------
  |  Branch (261:9): [True: 77, False: 439]
  ------------------
  262|       |        // If an out-of-memory error occurred, then stop and report the failure.
  263|     77|        if (status == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (263:13): [True: 0, False: 77]
  ------------------
  264|      0|            return nullptr;
  265|      0|        }
  266|       |        // Locales with no specific rules (all numbers have the "other" category
  267|       |        //   will return a U_MISSING_RESOURCE_ERROR at this point. This is not
  268|       |        //   an error.
  269|     77|        locRule =  UnicodeString(PLURAL_DEFAULT_RULE);
  270|     77|        status = U_ZERO_ERROR;
  271|     77|    }
  272|    516|    PluralRuleParser parser;
  273|    516|    parser.parse(locRule, newObj.getAlias(), status);
  274|       |        //  TODO: should rule parse errors be returned, or
  275|       |        //        should we silently use default rules?
  276|       |        //        Original impl used default rules.
  277|       |        //        Ask the question to ICU Core.
  278|       |
  279|    516|    newObj->mStandardPluralRanges = StandardPluralRanges::forLocale(locale, status)
  280|    516|        .toPointer(status)
  281|    516|        .orphan();
  282|       |
  283|    516|    return newObj.orphan();
  284|    516|}
_ZNK6icu_7811PluralRules6selectERKNS_13IFixedDecimalE:
  311|  4.19k|PluralRules::select(const IFixedDecimal &number) const {
  312|  4.19k|    if (mRules == nullptr) {
  ------------------
  |  Branch (312:9): [True: 0, False: 4.19k]
  ------------------
  313|      0|        return UnicodeString(true, PLURAL_DEFAULT_RULE, -1);
  314|      0|    }
  315|  4.19k|    else {
  316|  4.19k|        return mRules->select(number);
  317|  4.19k|    }
  318|  4.19k|}
_ZN6icu_7816PluralRuleParser5parseERKNS_13UnicodeStringEPNS_11PluralRulesER10UErrorCode:
  602|    516|{
  603|    516|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (603:9): [True: 0, False: 516]
  ------------------
  604|      0|        return;
  605|      0|    }
  606|    516|    U_ASSERT(ruleIndex == 0);    // Parsers are good for a single use only!
  ------------------
  |  |   35|    516|#   define U_ASSERT(exp) (void)0
  ------------------
  607|    516|    ruleSrc = &ruleData;
  608|       |
  609|  12.7k|    while (ruleIndex< ruleSrc->length()) {
  ------------------
  |  Branch (609:12): [True: 12.2k, False: 516]
  ------------------
  610|  12.2k|        getNextToken(status);
  611|  12.2k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (611:13): [True: 0, False: 12.2k]
  ------------------
  612|      0|            return;
  613|      0|        }
  614|  12.2k|        checkSyntax(status);
  615|  12.2k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (615:13): [True: 0, False: 12.2k]
  ------------------
  616|      0|            return;
  617|      0|        }
  618|  12.2k|        switch (type) {
  619|    478|        case tAnd:
  ------------------
  |  Branch (619:9): [True: 478, False: 11.7k]
  ------------------
  620|    478|            U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|    478|#   define U_ASSERT(exp) (void)0
  ------------------
  621|    478|            curAndConstraint = curAndConstraint->add(status);
  622|    478|            break;
  623|    183|        case tOr:
  ------------------
  |  Branch (623:9): [True: 183, False: 12.0k]
  ------------------
  624|    183|            {
  625|    183|                U_ASSERT(currentChain != nullptr);
  ------------------
  |  |   35|    183|#   define U_ASSERT(exp) (void)0
  ------------------
  626|    183|                OrConstraint *orNode=currentChain->ruleHeader;
  627|    210|                while (orNode->next != nullptr) {
  ------------------
  |  Branch (627:24): [True: 27, False: 183]
  ------------------
  628|     27|                    orNode = orNode->next;
  629|     27|                }
  630|    183|                orNode->next= new OrConstraint();
  631|    183|                if (orNode->next == nullptr) {
  ------------------
  |  Branch (631:21): [True: 0, False: 183]
  ------------------
  632|      0|                    status = U_MEMORY_ALLOCATION_ERROR;
  633|      0|                    break;
  634|      0|                }
  635|    183|                orNode=orNode->next;
  636|    183|                orNode->next=nullptr;
  637|    183|                curAndConstraint = orNode->add(status);
  638|    183|            }
  639|      0|            break;
  640|      0|        case tIs:
  ------------------
  |  Branch (640:9): [True: 0, False: 12.2k]
  ------------------
  641|      0|            U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  642|      0|            U_ASSERT(curAndConstraint->value == -1);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  643|      0|            U_ASSERT(curAndConstraint->rangeList == nullptr);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  644|      0|            break;
  645|      0|        case tNot:
  ------------------
  |  Branch (645:9): [True: 0, False: 12.2k]
  ------------------
  646|      0|            U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  647|      0|            curAndConstraint->negated=true;
  648|      0|            break;
  649|       |
  650|    245|        case tNotEqual:
  ------------------
  |  Branch (650:9): [True: 245, False: 11.9k]
  ------------------
  651|    245|            curAndConstraint->negated=true;
  652|    245|            U_FALLTHROUGH;
  ------------------
  |  |  511|    245|#       define U_FALLTHROUGH [[clang::fallthrough]]
  ------------------
  653|    245|        case tIn:
  ------------------
  |  Branch (653:9): [True: 0, False: 12.2k]
  ------------------
  654|    245|        case tWithin:
  ------------------
  |  Branch (654:9): [True: 0, False: 12.2k]
  ------------------
  655|  1.36k|        case tEqual:
  ------------------
  |  Branch (655:9): [True: 1.12k, False: 11.1k]
  ------------------
  656|  1.36k|            {
  657|  1.36k|                U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|  1.36k|#   define U_ASSERT(exp) (void)0
  ------------------
  658|  1.36k|                if (curAndConstraint->rangeList != nullptr) {
  ------------------
  |  Branch (658:21): [True: 0, False: 1.36k]
  ------------------
  659|       |                    // Already get a '='.
  660|      0|                    status = U_UNEXPECTED_TOKEN;
  661|      0|                    break;
  662|      0|                }
  663|  1.36k|                LocalPointer<UVector32> newRangeList(new UVector32(status), status);
  664|  1.36k|                if (U_FAILURE(status)) {
  ------------------
  |  Branch (664:21): [True: 0, False: 1.36k]
  ------------------
  665|      0|                    break;
  666|      0|                }
  667|  1.36k|                curAndConstraint->rangeList = newRangeList.orphan();
  668|  1.36k|                curAndConstraint->rangeList->addElement(-1, status);  // range Low
  669|  1.36k|                curAndConstraint->rangeList->addElement(-1, status);  // range Hi
  670|  1.36k|                rangeLowIdx = 0;
  671|  1.36k|                rangeHiIdx  = 1;
  672|  1.36k|                curAndConstraint->value=PLURAL_RANGE_HIGH;
  673|  1.36k|                curAndConstraint->integerOnly = (type != tWithin);
  674|  1.36k|            }
  675|      0|            break;
  676|  2.19k|        case tNumber:
  ------------------
  |  Branch (676:9): [True: 2.19k, False: 10.0k]
  ------------------
  677|  2.19k|            U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|  2.19k|#   define U_ASSERT(exp) (void)0
  ------------------
  678|  2.19k|            if ( (curAndConstraint->op==AndConstraint::MOD)&&
  ------------------
  |  Branch (678:18): [True: 1.08k, False: 1.11k]
  ------------------
  679|  2.19k|                 (curAndConstraint->opNum == -1 ) ) {
  ------------------
  |  Branch (679:18): [True: 413, False: 670]
  ------------------
  680|    413|                int32_t num = getNumberValue(token);
  681|    413|                if (num == -1) {
  ------------------
  |  Branch (681:21): [True: 0, False: 413]
  ------------------
  682|      0|                    status = U_UNEXPECTED_TOKEN;
  683|      0|                    break;
  684|      0|                }
  685|    413|                curAndConstraint->opNum=num;
  686|    413|            }
  687|  1.78k|            else {
  688|  1.78k|                if (curAndConstraint->rangeList == nullptr) {
  ------------------
  |  Branch (688:21): [True: 0, False: 1.78k]
  ------------------
  689|       |                    // this is for an 'is' rule
  690|      0|                    int32_t num = getNumberValue(token);
  691|      0|                    if (num == -1) {
  ------------------
  |  Branch (691:25): [True: 0, False: 0]
  ------------------
  692|      0|                        status = U_UNEXPECTED_TOKEN;
  693|      0|                        break;
  694|      0|                    }
  695|      0|                    curAndConstraint->value = num;
  696|  1.78k|                } else {
  697|       |                    // this is for an 'in' or 'within' rule
  698|  1.78k|                    if (curAndConstraint->rangeList->elementAti(rangeLowIdx) == -1) {
  ------------------
  |  Branch (698:25): [True: 1.48k, False: 295]
  ------------------
  699|  1.48k|                        int32_t num = getNumberValue(token);
  700|  1.48k|                        if (num == -1) {
  ------------------
  |  Branch (700:29): [True: 0, False: 1.48k]
  ------------------
  701|      0|                            status = U_UNEXPECTED_TOKEN;
  702|      0|                            break;
  703|      0|                        }
  704|  1.48k|                        curAndConstraint->rangeList->setElementAt(num, rangeLowIdx);
  705|  1.48k|                        curAndConstraint->rangeList->setElementAt(num, rangeHiIdx);
  706|  1.48k|                    }
  707|    295|                    else {
  708|    295|                        int32_t num = getNumberValue(token);
  709|    295|                        if (num == -1) {
  ------------------
  |  Branch (709:29): [True: 0, False: 295]
  ------------------
  710|      0|                            status = U_UNEXPECTED_TOKEN;
  711|      0|                            break;
  712|      0|                        }
  713|    295|                        curAndConstraint->rangeList->setElementAt(num, rangeHiIdx);
  714|    295|                        if (curAndConstraint->rangeList->elementAti(rangeLowIdx) >
  ------------------
  |  Branch (714:29): [True: 0, False: 295]
  ------------------
  715|    295|                                curAndConstraint->rangeList->elementAti(rangeHiIdx)) {
  716|       |                            // Range Lower bound > Range Upper bound.
  717|       |                            // U_UNEXPECTED_TOKEN seems a little funny, but it is consistently
  718|       |                            // used for all plural rule parse errors.
  719|      0|                            status = U_UNEXPECTED_TOKEN;
  720|      0|                            break;
  721|      0|                        }
  722|    295|                    }
  723|  1.78k|                }
  724|  1.78k|            }
  725|  2.19k|            break;
  726|  2.19k|        case tComma:
  ------------------
  |  Branch (726:9): [True: 117, False: 12.1k]
  ------------------
  727|       |            // TODO: rule syntax checking is inadequate, can happen with badly formed rules.
  728|       |            //       Catch cases like "n mod 10, is 1" here instead.
  729|    117|            if (curAndConstraint == nullptr || curAndConstraint->rangeList == nullptr) {
  ------------------
  |  Branch (729:17): [True: 0, False: 117]
  |  Branch (729:48): [True: 0, False: 117]
  ------------------
  730|      0|                status = U_UNEXPECTED_TOKEN;
  731|      0|                break;
  732|      0|            }
  733|    117|            U_ASSERT(curAndConstraint->rangeList->size() >= 2);
  ------------------
  |  |   35|    117|#   define U_ASSERT(exp) (void)0
  ------------------
  734|    117|            rangeLowIdx = curAndConstraint->rangeList->size();
  735|    117|            curAndConstraint->rangeList->addElement(-1, status);  // range Low
  736|    117|            rangeHiIdx = curAndConstraint->rangeList->size();
  737|    117|            curAndConstraint->rangeList->addElement(-1, status);  // range Hi
  738|    117|            break;
  739|    413|        case tMod:
  ------------------
  |  Branch (739:9): [True: 413, False: 11.8k]
  ------------------
  740|    413|            U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|    413|#   define U_ASSERT(exp) (void)0
  ------------------
  741|    413|            curAndConstraint->op=AndConstraint::MOD;
  742|    413|            break;
  743|    567|        case tVariableN:
  ------------------
  |  Branch (743:9): [True: 567, False: 11.6k]
  ------------------
  744|    977|        case tVariableI:
  ------------------
  |  Branch (744:9): [True: 410, False: 11.8k]
  ------------------
  745|  1.06k|        case tVariableF:
  ------------------
  |  Branch (745:9): [True: 87, False: 12.1k]
  ------------------
  746|  1.07k|        case tVariableT:
  ------------------
  |  Branch (746:9): [True: 9, False: 12.2k]
  ------------------
  747|  1.18k|        case tVariableE:
  ------------------
  |  Branch (747:9): [True: 110, False: 12.1k]
  ------------------
  748|  1.18k|        case tVariableC:
  ------------------
  |  Branch (748:9): [True: 0, False: 12.2k]
  ------------------
  749|  1.44k|        case tVariableV:
  ------------------
  |  Branch (749:9): [True: 262, False: 11.9k]
  ------------------
  750|  1.44k|            U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|  1.44k|#   define U_ASSERT(exp) (void)0
  ------------------
  751|  1.44k|            curAndConstraint->digitsType = type;
  752|  1.44k|            break;
  753|  1.22k|        case tKeyword:
  ------------------
  |  Branch (753:9): [True: 1.22k, False: 11.0k]
  ------------------
  754|  1.22k|            {
  755|  1.22k|            RuleChain *newChain = new RuleChain;
  756|  1.22k|            if (newChain == nullptr) {
  ------------------
  |  Branch (756:17): [True: 0, False: 1.22k]
  ------------------
  757|      0|                status = U_MEMORY_ALLOCATION_ERROR;
  758|      0|                break;
  759|      0|            }
  760|  1.22k|            newChain->fKeyword = token;
  761|  1.22k|            if (prules->mRules == nullptr) {
  ------------------
  |  Branch (761:17): [True: 516, False: 707]
  ------------------
  762|    516|                prules->mRules = newChain;
  763|    707|            } else {
  764|       |                // The new rule chain goes at the end of the linked list of rule chains,
  765|       |                //   unless there is an "other" keyword & chain. "other" must remain last.
  766|    707|                RuleChain *insertAfter = prules->mRules;
  767|  1.15k|                while (insertAfter->fNext!=nullptr &&
  ------------------
  |  Branch (767:24): [True: 546, False: 606]
  |  Branch (767:24): [True: 445, False: 707]
  ------------------
  768|  1.15k|                       insertAfter->fNext->fKeyword.compare(PLURAL_KEYWORD_OTHER, 5) != 0 ){
  ------------------
  |  Branch (768:24): [True: 445, False: 101]
  ------------------
  769|    445|                    insertAfter=insertAfter->fNext;
  770|    445|                }
  771|    707|                newChain->fNext = insertAfter->fNext;
  772|    707|                insertAfter->fNext = newChain;
  773|    707|            }
  774|  1.22k|            OrConstraint *orNode = new OrConstraint();
  775|  1.22k|            if (orNode == nullptr) {
  ------------------
  |  Branch (775:17): [True: 0, False: 1.22k]
  ------------------
  776|      0|                status = U_MEMORY_ALLOCATION_ERROR;
  777|      0|                break;
  778|      0|            }
  779|  1.22k|            newChain->ruleHeader = orNode;
  780|  1.22k|            curAndConstraint = orNode->add(status);
  781|  1.22k|            currentChain = newChain;
  782|  1.22k|            }
  783|      0|            break;
  784|       |
  785|  1.12k|        case tInteger:
  ------------------
  |  Branch (785:9): [True: 1.12k, False: 11.1k]
  ------------------
  786|  15.1k|            for (;;) {
  787|  15.1k|                getNextToken(status);
  788|  15.1k|                if (U_FAILURE(status) || type == tSemiColon || type == tEOF || type == tAt) {
  ------------------
  |  Branch (788:21): [True: 0, False: 15.1k]
  |  Branch (788:42): [True: 124, False: 15.0k]
  |  Branch (788:64): [True: 0, False: 15.0k]
  |  Branch (788:80): [True: 1.00k, False: 14.0k]
  ------------------
  789|  1.12k|                    break;
  790|  1.12k|                }
  791|  14.0k|                if (type == tEllipsis) {
  ------------------
  |  Branch (791:21): [True: 660, False: 13.3k]
  ------------------
  792|    660|                    currentChain->fIntegerSamplesUnbounded = true;
  793|    660|                    continue;
  794|    660|                }
  795|  13.3k|                currentChain->fIntegerSamples.append(token);
  796|  13.3k|            }
  797|  1.12k|            break;
  798|       |
  799|  1.02k|        case tDecimal:
  ------------------
  |  Branch (799:9): [True: 1.02k, False: 11.2k]
  ------------------
  800|  34.6k|            for (;;) {
  801|  34.6k|                getNextToken(status);
  802|  34.6k|                if (U_FAILURE(status) || type == tSemiColon || type == tEOF || type == tAt) {
  ------------------
  |  Branch (802:21): [True: 0, False: 34.6k]
  |  Branch (802:42): [True: 1.02k, False: 33.5k]
  |  Branch (802:64): [True: 0, False: 33.5k]
  |  Branch (802:80): [True: 0, False: 33.5k]
  ------------------
  803|  1.02k|                    break;
  804|  1.02k|                }
  805|  33.5k|                if (type == tEllipsis) {
  ------------------
  |  Branch (805:21): [True: 633, False: 32.9k]
  ------------------
  806|    633|                    currentChain->fDecimalSamplesUnbounded = true;
  807|    633|                    continue;
  808|    633|                }
  809|  32.9k|                currentChain->fDecimalSamples.append(token);
  810|  32.9k|            }
  811|  1.02k|            break;
  812|       |
  813|  2.66k|        default:
  ------------------
  |  Branch (813:9): [True: 2.66k, False: 9.57k]
  ------------------
  814|  2.66k|            break;
  815|  12.2k|        }
  816|  12.2k|        prevType=type;
  817|  12.2k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (817:13): [True: 0, False: 12.2k]
  ------------------
  818|      0|            break;
  819|      0|        }
  820|  12.2k|    }
  821|    516|}
_ZN6icu_7811PluralRules19getRuleFromResourceERKNS_6LocaleE11UPluralTypeR10UErrorCode:
  824|    516|PluralRules::getRuleFromResource(const Locale& locale, UPluralType type, UErrorCode& errCode) {
  825|    516|    UnicodeString emptyStr;
  826|       |
  827|    516|    if (U_FAILURE(errCode)) {
  ------------------
  |  Branch (827:9): [True: 0, False: 516]
  ------------------
  828|      0|        return emptyStr;
  829|      0|    }
  830|    516|    LocalUResourceBundlePointer rb(ures_openDirect(nullptr, "plurals", &errCode));
  ------------------
  |  | 1693|    516|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|    516|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    516|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    516|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  831|    516|    if(U_FAILURE(errCode)) {
  ------------------
  |  Branch (831:8): [True: 0, False: 516]
  ------------------
  832|      0|        return emptyStr;
  833|      0|    }
  834|    516|    const char *typeKey;
  835|    516|    switch (type) {
  836|    516|    case UPLURAL_TYPE_CARDINAL:
  ------------------
  |  Branch (836:5): [True: 516, False: 0]
  ------------------
  837|    516|        typeKey = "locales";
  838|    516|        break;
  839|      0|    case UPLURAL_TYPE_ORDINAL:
  ------------------
  |  Branch (839:5): [True: 0, False: 516]
  ------------------
  840|      0|        typeKey = "locales_ordinals";
  841|      0|        break;
  842|      0|    default:
  ------------------
  |  Branch (842:5): [True: 0, False: 516]
  ------------------
  843|       |        // Must not occur: The caller should have checked for valid types.
  844|      0|        errCode = U_ILLEGAL_ARGUMENT_ERROR;
  845|      0|        return emptyStr;
  846|    516|    }
  847|    516|    LocalUResourceBundlePointer locRes(ures_getByKey(rb.getAlias(), typeKey, nullptr, &errCode));
  ------------------
  |  | 1661|    516|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|    516|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    516|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    516|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  848|    516|    if(U_FAILURE(errCode)) {
  ------------------
  |  Branch (848:8): [True: 0, False: 516]
  ------------------
  849|      0|        return emptyStr;
  850|      0|    }
  851|    516|    int32_t resLen=0;
  852|    516|    const char *curLocaleName=locale.getBaseName();
  853|    516|    const char16_t* s = ures_getStringByKey(locRes.getAlias(), curLocaleName, &resLen, &errCode);
  ------------------
  |  | 1677|    516|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|    516|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    516|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    516|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  854|       |
  855|    516|    if (s == nullptr) {
  ------------------
  |  Branch (855:9): [True: 403, False: 113]
  ------------------
  856|       |        // Check parent locales.
  857|    403|        UErrorCode status = U_ZERO_ERROR;
  858|    403|        const char *curLocaleName2=locale.getBaseName();
  859|    403|        CharString parentLocaleName(curLocaleName2, status);
  860|       |
  861|    497|        for (;;) {
  862|    497|            {
  863|    497|                CharString tmp = ulocimp_getParent(parentLocaleName.data(), status);
  ------------------
  |  | 1205|    497|#define ulocimp_getParent U_ICU_ENTRY_POINT_RENAME(ulocimp_getParent)
  |  |  ------------------
  |  |  |  |  123|    497|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    497|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    497|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  864|    497|                if (tmp.isEmpty()) break;
  ------------------
  |  Branch (864:21): [True: 77, False: 420]
  ------------------
  865|    420|                parentLocaleName = std::move(tmp);
  866|    420|            }
  867|      0|            resLen=0;
  868|    420|            s = ures_getStringByKey(locRes.getAlias(), parentLocaleName.data(), &resLen, &status);
  ------------------
  |  | 1677|    420|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|    420|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    420|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    420|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  869|    420|            if (s != nullptr) {
  ------------------
  |  Branch (869:17): [True: 326, False: 94]
  ------------------
  870|    326|                errCode = U_ZERO_ERROR;
  871|    326|                break;
  872|    326|            }
  873|     94|            status = U_ZERO_ERROR;
  874|     94|        }
  875|    403|    }
  876|    516|    if (s==nullptr) {
  ------------------
  |  Branch (876:9): [True: 77, False: 439]
  ------------------
  877|     77|        return emptyStr;
  878|     77|    }
  879|       |
  880|    439|    char setKey[256];
  881|    439|    u_UCharsToChars(s, setKey, resLen + 1);
  ------------------
  |  |  211|    439|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|    439|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    439|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    439|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  882|       |    // printf("\n PluralRule: %s\n", setKey);
  883|       |
  884|    439|    LocalUResourceBundlePointer ruleRes(ures_getByKey(rb.getAlias(), "rules", nullptr, &errCode));
  ------------------
  |  | 1661|    439|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|    439|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    439|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    439|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  885|    439|    if(U_FAILURE(errCode)) {
  ------------------
  |  Branch (885:8): [True: 0, False: 439]
  ------------------
  886|      0|        return emptyStr;
  887|      0|    }
  888|    439|    LocalUResourceBundlePointer setRes(ures_getByKey(ruleRes.getAlias(), setKey, nullptr, &errCode));
  ------------------
  |  | 1661|    439|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|    439|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    439|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    439|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  889|    439|    if (U_FAILURE(errCode)) {
  ------------------
  |  Branch (889:9): [True: 0, False: 439]
  ------------------
  890|      0|        return emptyStr;
  891|      0|    }
  892|       |
  893|    439|    int32_t numberKeys = ures_getSize(setRes.getAlias());
  ------------------
  |  | 1674|    439|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  123|    439|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    439|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    439|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  894|    439|    UnicodeString result;
  895|    439|    const char *key=nullptr;
  896|  1.58k|    for(int32_t i=0; i<numberKeys; ++i) {   // Keys are zero, one, few, ...
  ------------------
  |  Branch (896:22): [True: 1.14k, False: 439]
  ------------------
  897|  1.14k|        UnicodeString rules = ures_getNextUnicodeString(setRes.getAlias(), &key, &errCode);
  898|  1.14k|        UnicodeString uKey(key, -1, US_INV);
  ------------------
  |  |   98|  1.14k|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  899|  1.14k|        result.append(uKey);
  900|  1.14k|        result.append(COLON);
  901|  1.14k|        result.append(rules);
  902|  1.14k|        result.append(SEMI_COLON);
  903|  1.14k|    }
  904|    439|    return result;
  905|    439|}
_ZN6icu_7813AndConstraintC2ERKS0_:
  917|  17.6k|AndConstraint::AndConstraint(const AndConstraint& other) {
  918|  17.6k|    this->fInternalStatus = other.fInternalStatus;
  919|  17.6k|    if (U_FAILURE(fInternalStatus)) {
  ------------------
  |  Branch (919:9): [True: 0, False: 17.6k]
  ------------------
  920|      0|        return; // stop early if the object we are copying from is invalid.
  921|      0|    }
  922|  17.6k|    this->op = other.op;
  923|  17.6k|    this->opNum=other.opNum;
  924|  17.6k|    this->value=other.value;
  925|  17.6k|    if (other.rangeList != nullptr) {
  ------------------
  |  Branch (925:9): [True: 14.2k, False: 3.37k]
  ------------------
  926|  14.2k|        LocalPointer<UVector32> newRangeList(new UVector32(fInternalStatus), fInternalStatus);
  927|  14.2k|        if (U_FAILURE(fInternalStatus)) {
  ------------------
  |  Branch (927:13): [True: 0, False: 14.2k]
  ------------------
  928|      0|            return;
  929|      0|        }
  930|  14.2k|        this->rangeList = newRangeList.orphan();
  931|  14.2k|        this->rangeList->assign(*other.rangeList, fInternalStatus);
  932|  14.2k|    }
  933|  17.6k|    this->integerOnly=other.integerOnly;
  934|  17.6k|    this->negated=other.negated;
  935|  17.6k|    this->digitsType = other.digitsType;
  936|  17.6k|    if (other.next != nullptr) {
  ------------------
  |  Branch (936:9): [True: 4.90k, False: 12.7k]
  ------------------
  937|  4.90k|        this->next = new AndConstraint(*other.next);
  938|  4.90k|        if (this->next == nullptr) {
  ------------------
  |  Branch (938:13): [True: 0, False: 4.90k]
  ------------------
  939|      0|            fInternalStatus = U_MEMORY_ALLOCATION_ERROR;
  940|      0|        }
  941|  4.90k|    }
  942|  17.6k|}
_ZN6icu_7813AndConstraintD2Ev:
  944|  17.6k|AndConstraint::~AndConstraint() {
  945|  17.6k|    delete rangeList;
  946|  17.6k|    rangeList = nullptr;
  947|  17.6k|    delete next;
  948|  17.6k|    next = nullptr;
  949|  17.6k|}
_ZN6icu_7813AndConstraint11isFulfilledERKNS_13IFixedDecimalE:
  952|  16.0k|AndConstraint::isFulfilled(const IFixedDecimal &number) {
  953|  16.0k|    UBool result = true;
  954|  16.0k|    if (digitsType == none) {
  ------------------
  |  Branch (954:9): [True: 2.91k, False: 13.1k]
  ------------------
  955|       |        // An empty AndConstraint, created by a rule with a keyword but no following expression.
  956|  2.91k|        return true;
  957|  2.91k|    }
  958|       |
  959|  13.1k|    PluralOperand operand = tokenTypeToPluralOperand(digitsType);
  960|  13.1k|    double n = number.getPluralOperand(operand);     // pulls n | i | v | f value for the number.
  961|       |                                                     // Will always be positive.
  962|       |                                                     // May be non-integer (n option only)
  963|  13.1k|    do {
  964|  13.1k|        if (integerOnly && n != uprv_floor(n)) {
  ------------------
  |  | 1499|  12.8k|#define uprv_floor U_ICU_ENTRY_POINT_RENAME(uprv_floor)
  |  |  ------------------
  |  |  |  |  123|  12.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  12.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  12.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (964:13): [True: 12.8k, False: 376]
  |  Branch (964:28): [True: 1.41k, False: 11.3k]
  ------------------
  965|  1.41k|            result = false;
  966|  1.41k|            break;
  967|  1.41k|        }
  968|       |
  969|  11.7k|        if (op == MOD) {
  ------------------
  |  Branch (969:13): [True: 4.55k, False: 7.21k]
  ------------------
  970|  4.55k|            n = fmod(n, opNum);
  971|  4.55k|        }
  972|  11.7k|        if (rangeList == nullptr) {
  ------------------
  |  Branch (972:13): [True: 376, False: 11.3k]
  ------------------
  973|    376|            result = value == -1 ||    // empty rule
  ------------------
  |  Branch (973:22): [True: 376, False: 0]
  ------------------
  974|    376|                     n == value;       //  'is' rule
  ------------------
  |  Branch (974:22): [True: 0, False: 0]
  ------------------
  975|    376|            break;
  976|    376|        }
  977|  11.3k|        result = false;                // 'in' or 'within' rule
  978|  25.4k|        for (int32_t r=0; r<rangeList->size(); r+=2) {
  ------------------
  |  Branch (978:27): [True: 16.2k, False: 9.17k]
  ------------------
  979|  16.2k|            if (rangeList->elementAti(r) <= n && n <= rangeList->elementAti(r+1)) {
  ------------------
  |  Branch (979:17): [True: 11.0k, False: 5.16k]
  |  Branch (979:50): [True: 2.21k, False: 8.87k]
  ------------------
  980|  2.21k|                result = true;
  981|  2.21k|                break;
  982|  2.21k|            }
  983|  16.2k|        }
  984|  11.3k|    } while (false);
  ------------------
  |  Branch (984:14): [Folded - Ignored]
  ------------------
  985|       |
  986|  13.1k|    if (negated) {
  ------------------
  |  Branch (986:9): [True: 2.07k, False: 11.1k]
  ------------------
  987|  2.07k|        result = !result;
  988|  2.07k|    }
  989|  13.1k|    return result;
  990|  16.0k|}
_ZN6icu_7813AndConstraint3addER10UErrorCode:
  993|    478|AndConstraint::add(UErrorCode& status) {
  994|    478|    if (U_FAILURE(fInternalStatus)) {
  ------------------
  |  Branch (994:9): [True: 0, False: 478]
  ------------------
  995|      0|        status = fInternalStatus;
  996|      0|        return nullptr;
  997|      0|    }
  998|    478|    this->next = new AndConstraint();
  999|    478|    if (this->next == nullptr) {
  ------------------
  |  Branch (999:9): [True: 0, False: 478]
  ------------------
 1000|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1001|      0|    }
 1002|    478|    return this->next;
 1003|    478|}
_ZN6icu_7812OrConstraintC2ERKS0_:
 1006|  12.7k|OrConstraint::OrConstraint(const OrConstraint& other) {
 1007|  12.7k|    this->fInternalStatus = other.fInternalStatus;
 1008|  12.7k|    if (U_FAILURE(fInternalStatus)) {
  ------------------
  |  Branch (1008:9): [True: 0, False: 12.7k]
  ------------------
 1009|      0|        return; // stop early if the object we are copying from is invalid.
 1010|      0|    }
 1011|  12.7k|    if ( other.childNode != nullptr ) {
  ------------------
  |  Branch (1011:10): [True: 12.7k, False: 0]
  ------------------
 1012|  12.7k|        this->childNode = new AndConstraint(*(other.childNode));
 1013|  12.7k|        if (this->childNode == nullptr) {
  ------------------
  |  Branch (1013:13): [True: 0, False: 12.7k]
  ------------------
 1014|      0|            fInternalStatus = U_MEMORY_ALLOCATION_ERROR;
 1015|      0|            return;
 1016|      0|        }
 1017|  12.7k|    }
 1018|  12.7k|    if (other.next != nullptr ) {
  ------------------
  |  Branch (1018:9): [True: 2.53k, False: 10.1k]
  ------------------
 1019|  2.53k|        this->next = new OrConstraint(*(other.next));
 1020|  2.53k|        if (this->next == nullptr) {
  ------------------
  |  Branch (1020:13): [True: 0, False: 2.53k]
  ------------------
 1021|      0|            fInternalStatus = U_MEMORY_ALLOCATION_ERROR;
 1022|      0|            return;
 1023|      0|        }
 1024|  2.53k|        if (U_FAILURE(this->next->fInternalStatus)) {
  ------------------
  |  Branch (1024:13): [True: 0, False: 2.53k]
  ------------------
 1025|      0|            this->fInternalStatus = this->next->fInternalStatus;
 1026|      0|        }
 1027|  2.53k|    }
 1028|  12.7k|}
_ZN6icu_7812OrConstraintD2Ev:
 1030|  12.7k|OrConstraint::~OrConstraint() {
 1031|  12.7k|    delete childNode;
 1032|  12.7k|    childNode = nullptr;
 1033|  12.7k|    delete next;
 1034|  12.7k|    next = nullptr;
 1035|  12.7k|}
_ZN6icu_7812OrConstraint3addER10UErrorCode:
 1038|  1.40k|OrConstraint::add(UErrorCode& status) {
 1039|  1.40k|    if (U_FAILURE(fInternalStatus)) {
  ------------------
  |  Branch (1039:9): [True: 0, False: 1.40k]
  ------------------
 1040|      0|        status = fInternalStatus;
 1041|      0|        return nullptr;
 1042|      0|    }
 1043|  1.40k|    OrConstraint *curOrConstraint=this;
 1044|  1.40k|    {
 1045|  1.40k|        while (curOrConstraint->next!=nullptr) {
  ------------------
  |  Branch (1045:16): [True: 0, False: 1.40k]
  ------------------
 1046|      0|            curOrConstraint = curOrConstraint->next;
 1047|      0|        }
 1048|  1.40k|        U_ASSERT(curOrConstraint->childNode == nullptr);
  ------------------
  |  |   35|  1.40k|#   define U_ASSERT(exp) (void)0
  ------------------
 1049|  1.40k|        curOrConstraint->childNode = new AndConstraint();
 1050|  1.40k|        if (curOrConstraint->childNode == nullptr) {
  ------------------
  |  Branch (1050:13): [True: 0, False: 1.40k]
  ------------------
 1051|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1052|      0|        }
 1053|  1.40k|    }
 1054|  1.40k|    return curOrConstraint->childNode;
 1055|  1.40k|}
_ZN6icu_7812OrConstraint11isFulfilledERKNS_13IFixedDecimalE:
 1058|  10.9k|OrConstraint::isFulfilled(const IFixedDecimal &number) {
 1059|  10.9k|    OrConstraint* orRule=this;
 1060|  10.9k|    UBool result=false;
 1061|       |
 1062|  24.7k|    while (orRule!=nullptr && !result) {
  ------------------
  |  Branch (1062:12): [True: 14.0k, False: 10.7k]
  |  Branch (1062:31): [True: 13.8k, False: 211]
  ------------------
 1063|  13.8k|        result=true;
 1064|  13.8k|        AndConstraint* andRule = orRule->childNode;
 1065|  29.8k|        while (andRule!=nullptr && result) {
  ------------------
  |  Branch (1065:16): [True: 18.8k, False: 11.0k]
  |  Branch (1065:36): [True: 16.0k, False: 2.71k]
  ------------------
 1066|  16.0k|            result = andRule->isFulfilled(number);
 1067|  16.0k|            andRule=andRule->next;
 1068|  16.0k|        }
 1069|  13.8k|        orRule = orRule->next;
 1070|  13.8k|    }
 1071|       |
 1072|  10.9k|    return result;
 1073|  10.9k|}
_ZN6icu_789RuleChainC2ERKS0_:
 1077|  10.1k|        fKeyword(other.fKeyword), fDecimalSamples(other.fDecimalSamples),
 1078|  10.1k|        fIntegerSamples(other.fIntegerSamples), fDecimalSamplesUnbounded(other.fDecimalSamplesUnbounded),
 1079|  10.1k|        fIntegerSamplesUnbounded(other.fIntegerSamplesUnbounded), fInternalStatus(other.fInternalStatus) {
 1080|  10.1k|    if (U_FAILURE(this->fInternalStatus)) {
  ------------------
  |  Branch (1080:9): [True: 0, False: 10.1k]
  ------------------
 1081|      0|        return; // stop early if the object we are copying from is invalid. 
 1082|      0|    }
 1083|  10.1k|    if (other.ruleHeader != nullptr) {
  ------------------
  |  Branch (1083:9): [True: 10.1k, False: 0]
  ------------------
 1084|  10.1k|        this->ruleHeader = new OrConstraint(*(other.ruleHeader));
 1085|  10.1k|        if (this->ruleHeader == nullptr) {
  ------------------
  |  Branch (1085:13): [True: 0, False: 10.1k]
  ------------------
 1086|      0|            this->fInternalStatus = U_MEMORY_ALLOCATION_ERROR;
 1087|      0|        }
 1088|  10.1k|        else if (U_FAILURE(this->ruleHeader->fInternalStatus)) {
  ------------------
  |  Branch (1088:18): [True: 0, False: 10.1k]
  ------------------
 1089|       |            // If the OrConstraint wasn't fully copied, then set our status to failure as well.
 1090|      0|            this->fInternalStatus = this->ruleHeader->fInternalStatus;
 1091|      0|            return; // exit early.
 1092|      0|        }
 1093|  10.1k|    }
 1094|  10.1k|    if (other.fNext != nullptr ) {
  ------------------
  |  Branch (1094:9): [True: 6.79k, False: 3.37k]
  ------------------
 1095|  6.79k|        this->fNext = new RuleChain(*other.fNext);
 1096|  6.79k|        if (this->fNext == nullptr) {
  ------------------
  |  Branch (1096:13): [True: 0, False: 6.79k]
  ------------------
 1097|      0|            this->fInternalStatus = U_MEMORY_ALLOCATION_ERROR;
 1098|      0|        }
 1099|  6.79k|        else if (U_FAILURE(this->fNext->fInternalStatus)) {
  ------------------
  |  Branch (1099:18): [True: 0, False: 6.79k]
  ------------------
 1100|       |            // If the RuleChain wasn't fully copied, then set our status to failure as well.
 1101|      0|            this->fInternalStatus = this->fNext->fInternalStatus;
 1102|      0|        }
 1103|  6.79k|    }
 1104|  10.1k|}
_ZN6icu_789RuleChainD2Ev:
 1106|  10.1k|RuleChain::~RuleChain() {
 1107|  10.1k|    delete fNext;
 1108|  10.1k|    delete ruleHeader;
 1109|  10.1k|}
_ZNK6icu_789RuleChain6selectERKNS_13IFixedDecimalE:
 1112|  4.19k|RuleChain::select(const IFixedDecimal &number) const {
 1113|  4.19k|    if (!number.isNaN() && !number.isInfinite()) {
  ------------------
  |  Branch (1113:9): [True: 4.16k, False: 23]
  |  Branch (1113:28): [True: 4.16k, False: 3]
  ------------------
 1114|  10.9k|        for (const RuleChain *rules = this; rules != nullptr; rules = rules->fNext) {
  ------------------
  |  Branch (1114:45): [True: 10.9k, False: 0]
  ------------------
 1115|  10.9k|             if (rules->ruleHeader->isFulfilled(number)) {
  ------------------
  |  Branch (1115:18): [True: 4.16k, False: 6.82k]
  ------------------
 1116|  4.16k|                 return rules->fKeyword;
 1117|  4.16k|             }
 1118|  10.9k|        }
 1119|  4.16k|    }
 1120|     26|    return UnicodeString(true, PLURAL_KEYWORD_OTHER, 5);
 1121|  4.19k|}
_ZN6icu_7816PluralRuleParserC2Ev:
 1272|    516|        ruleIndex(0), token(), type(none), prevType(none),
 1273|    516|        curAndConstraint(nullptr), currentChain(nullptr), rangeLowIdx(-1), rangeHiIdx(-1)
 1274|    516|{
 1275|    516|}
_ZN6icu_7816PluralRuleParserD2Ev:
 1277|    516|PluralRuleParser::~PluralRuleParser() {
 1278|    516|}
_ZN6icu_7816PluralRuleParser14getNumberValueERKNS_13UnicodeStringE:
 1282|  2.19k|PluralRuleParser::getNumberValue(const UnicodeString& token) {
 1283|  2.19k|    int32_t pos = 0;
 1284|  2.19k|    return ICU_Utility::parseNumber(token, pos, 10);
 1285|  2.19k|}
_ZN6icu_7816PluralRuleParser11checkSyntaxER10UErrorCode:
 1290|  12.2k|{
 1291|  12.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1291:9): [True: 0, False: 12.2k]
  ------------------
 1292|      0|        return;
 1293|      0|    }
 1294|  12.2k|    if (!(prevType==none || prevType==tSemiColon)) {
  ------------------
  |  Branch (1294:11): [True: 516, False: 11.7k]
  |  Branch (1294:29): [True: 707, False: 11.0k]
  ------------------
 1295|  11.0k|        type = getKeyType(token, type);  // Switch token type from tKeyword if we scanned a reserved word,
 1296|       |                                               //   and we are not at the start of a rule, where a
 1297|       |                                               //   keyword is expected.
 1298|  11.0k|    }
 1299|       |
 1300|  12.2k|    switch(prevType) {
 1301|    516|    case none:
  ------------------
  |  Branch (1301:5): [True: 516, False: 11.7k]
  ------------------
 1302|  1.22k|    case tSemiColon:
  ------------------
  |  Branch (1302:5): [True: 707, False: 11.5k]
  ------------------
 1303|  1.22k|        if (type!=tKeyword && type != tEOF) {
  ------------------
  |  Branch (1303:13): [True: 0, False: 1.22k]
  |  Branch (1303:31): [True: 0, False: 0]
  ------------------
 1304|      0|            status = U_UNEXPECTED_TOKEN;
 1305|      0|        }
 1306|  1.22k|        break;
 1307|    490|    case tVariableN:
  ------------------
  |  Branch (1307:5): [True: 490, False: 11.7k]
  ------------------
 1308|    900|    case tVariableI:
  ------------------
  |  Branch (1308:5): [True: 410, False: 11.8k]
  ------------------
 1309|    987|    case tVariableF:
  ------------------
  |  Branch (1309:5): [True: 87, False: 12.1k]
  ------------------
 1310|    996|    case tVariableT:
  ------------------
  |  Branch (1310:5): [True: 9, False: 12.2k]
  ------------------
 1311|  1.10k|    case tVariableE:
  ------------------
  |  Branch (1311:5): [True: 110, False: 12.1k]
  ------------------
 1312|  1.10k|    case tVariableC:
  ------------------
  |  Branch (1312:5): [True: 0, False: 12.2k]
  ------------------
 1313|  1.36k|    case tVariableV:
  ------------------
  |  Branch (1313:5): [True: 262, False: 11.9k]
  ------------------
 1314|  1.36k|        if (type != tIs && type != tMod && type != tIn &&
  ------------------
  |  Branch (1314:13): [True: 1.36k, False: 0]
  |  Branch (1314:28): [True: 955, False: 413]
  |  Branch (1314:44): [True: 955, False: 0]
  ------------------
 1315|  1.36k|            type != tNot && type != tWithin && type != tEqual && type != tNotEqual) {
  ------------------
  |  Branch (1315:13): [True: 955, False: 0]
  |  Branch (1315:29): [True: 955, False: 0]
  |  Branch (1315:48): [True: 145, False: 810]
  |  Branch (1315:66): [True: 0, False: 145]
  ------------------
 1316|      0|            status = U_UNEXPECTED_TOKEN;
 1317|      0|        }
 1318|  1.36k|        break;
 1319|  1.22k|    case tKeyword:
  ------------------
  |  Branch (1319:5): [True: 1.22k, False: 11.0k]
  ------------------
 1320|  1.22k|        if (type != tColon) {
  ------------------
  |  Branch (1320:13): [True: 0, False: 1.22k]
  ------------------
 1321|      0|            status = U_UNEXPECTED_TOKEN;
 1322|      0|        }
 1323|  1.22k|        break;
 1324|  1.22k|    case tColon:
  ------------------
  |  Branch (1324:5): [True: 1.22k, False: 11.0k]
  ------------------
 1325|  1.22k|        if (!(type == tVariableN ||
  ------------------
  |  Branch (1325:15): [True: 494, False: 729]
  ------------------
 1326|  1.22k|              type == tVariableI ||
  ------------------
  |  Branch (1326:15): [True: 146, False: 583]
  ------------------
 1327|  1.22k|              type == tVariableF ||
  ------------------
  |  Branch (1327:15): [True: 2, False: 581]
  ------------------
 1328|  1.22k|              type == tVariableT ||
  ------------------
  |  Branch (1328:15): [True: 2, False: 579]
  ------------------
 1329|  1.22k|              type == tVariableE ||
  ------------------
  |  Branch (1329:15): [True: 55, False: 524]
  ------------------
 1330|  1.22k|              type == tVariableC ||
  ------------------
  |  Branch (1330:15): [True: 0, False: 524]
  ------------------
 1331|  1.22k|              type == tVariableV ||
  ------------------
  |  Branch (1331:15): [True: 85, False: 439]
  ------------------
 1332|  1.22k|              type == tAt)) {
  ------------------
  |  Branch (1332:15): [True: 439, False: 0]
  ------------------
 1333|      0|            status = U_UNEXPECTED_TOKEN;
 1334|      0|        }
 1335|  1.22k|        break;
 1336|      0|    case tIs:
  ------------------
  |  Branch (1336:5): [True: 0, False: 12.2k]
  ------------------
 1337|      0|        if ( type != tNumber && type != tNot) {
  ------------------
  |  Branch (1337:14): [True: 0, False: 0]
  |  Branch (1337:33): [True: 0, False: 0]
  ------------------
 1338|      0|            status = U_UNEXPECTED_TOKEN;
 1339|      0|        }
 1340|      0|        break;
 1341|      0|    case tNot:
  ------------------
  |  Branch (1341:5): [True: 0, False: 12.2k]
  ------------------
 1342|      0|        if (type != tNumber && type != tIn && type != tWithin) {
  ------------------
  |  Branch (1342:13): [True: 0, False: 0]
  |  Branch (1342:32): [True: 0, False: 0]
  |  Branch (1342:47): [True: 0, False: 0]
  ------------------
 1343|      0|            status = U_UNEXPECTED_TOKEN;
 1344|      0|        }
 1345|      0|        break;
 1346|    413|    case tMod:
  ------------------
  |  Branch (1346:5): [True: 413, False: 11.8k]
  ------------------
 1347|    708|    case tDot2:
  ------------------
  |  Branch (1347:5): [True: 295, False: 11.9k]
  ------------------
 1348|    708|    case tIn:
  ------------------
  |  Branch (1348:5): [True: 0, False: 12.2k]
  ------------------
 1349|    708|    case tWithin:
  ------------------
  |  Branch (1349:5): [True: 0, False: 12.2k]
  ------------------
 1350|  1.83k|    case tEqual:
  ------------------
  |  Branch (1350:5): [True: 1.12k, False: 11.1k]
  ------------------
 1351|  2.07k|    case tNotEqual:
  ------------------
  |  Branch (1351:5): [True: 245, False: 11.9k]
  ------------------
 1352|  2.07k|        if (type != tNumber) {
  ------------------
  |  Branch (1352:13): [True: 0, False: 2.07k]
  ------------------
 1353|      0|            status = U_UNEXPECTED_TOKEN;
 1354|      0|        }
 1355|  2.07k|        break;
 1356|    478|    case tAnd:
  ------------------
  |  Branch (1356:5): [True: 478, False: 11.7k]
  ------------------
 1357|    661|    case tOr:
  ------------------
  |  Branch (1357:5): [True: 183, False: 12.0k]
  ------------------
 1358|    661|        if ( type != tVariableN &&
  ------------------
  |  Branch (1358:14): [True: 588, False: 73]
  ------------------
 1359|    661|             type != tVariableI &&
  ------------------
  |  Branch (1359:14): [True: 324, False: 264]
  ------------------
 1360|    661|             type != tVariableF &&
  ------------------
  |  Branch (1360:14): [True: 239, False: 85]
  ------------------
 1361|    661|             type != tVariableT &&
  ------------------
  |  Branch (1361:14): [True: 232, False: 7]
  ------------------
 1362|    661|             type != tVariableE &&
  ------------------
  |  Branch (1362:14): [True: 177, False: 55]
  ------------------
 1363|    661|             type != tVariableC &&
  ------------------
  |  Branch (1363:14): [True: 177, False: 0]
  ------------------
 1364|    661|             type != tVariableV) {
  ------------------
  |  Branch (1364:14): [True: 0, False: 177]
  ------------------
 1365|      0|            status = U_UNEXPECTED_TOKEN;
 1366|      0|        }
 1367|    661|        break;
 1368|    117|    case tComma:
  ------------------
  |  Branch (1368:5): [True: 117, False: 12.1k]
  ------------------
 1369|    117|        if (type != tNumber) {
  ------------------
  |  Branch (1369:13): [True: 0, False: 117]
  ------------------
 1370|      0|            status = U_UNEXPECTED_TOKEN;
 1371|      0|        }
 1372|    117|        break;
 1373|  2.19k|    case tNumber:
  ------------------
  |  Branch (1373:5): [True: 2.19k, False: 10.0k]
  ------------------
 1374|  2.19k|        if (type != tDot2  && type != tSemiColon && type != tIs       && type != tNot    &&
  ------------------
  |  Branch (1374:13): [True: 1.89k, False: 295]
  |  Branch (1374:31): [True: 1.89k, False: 0]
  |  Branch (1374:53): [True: 1.89k, False: 0]
  |  Branch (1374:74): [True: 1.89k, False: 0]
  ------------------
 1375|  2.19k|            type != tIn    && type != tEqual     && type != tNotEqual && type != tWithin &&
  ------------------
  |  Branch (1375:13): [True: 1.89k, False: 0]
  |  Branch (1375:31): [True: 1.58k, False: 313]
  |  Branch (1375:53): [True: 1.48k, False: 100]
  |  Branch (1375:74): [True: 1.48k, False: 0]
  ------------------
 1376|  2.19k|            type != tAnd   && type != tOr        && type != tComma    && type != tAt     &&
  ------------------
  |  Branch (1376:13): [True: 1.00k, False: 478]
  |  Branch (1376:31): [True: 824, False: 183]
  |  Branch (1376:53): [True: 707, False: 117]
  |  Branch (1376:74): [True: 0, False: 707]
  ------------------
 1377|  2.19k|            type != tEOF)
  ------------------
  |  Branch (1377:13): [True: 0, False: 0]
  ------------------
 1378|      0|        {
 1379|      0|            status = U_UNEXPECTED_TOKEN;
 1380|      0|        }
 1381|       |        // TODO: a comma following a number that is not part of a range will be allowed.
 1382|       |        //       It's not the only case of this sort of thing. Parser needs a re-write.
 1383|  2.19k|        break;
 1384|  2.15k|    case tAt:
  ------------------
  |  Branch (1384:5): [True: 2.15k, False: 10.0k]
  ------------------
 1385|  2.15k|        if (type != tDecimal && type != tInteger) {
  ------------------
  |  Branch (1385:13): [True: 1.12k, False: 1.02k]
  |  Branch (1385:33): [True: 0, False: 1.12k]
  ------------------
 1386|      0|            status = U_UNEXPECTED_TOKEN;
 1387|      0|        }
 1388|  2.15k|        break;
 1389|      0|    default:
  ------------------
  |  Branch (1389:5): [True: 0, False: 12.2k]
  ------------------
 1390|      0|        status = U_UNEXPECTED_TOKEN;
 1391|      0|        break;
 1392|  12.2k|    }
 1393|  12.2k|}
_ZN6icu_7816PluralRuleParser12getNextTokenER10UErrorCode:
 1402|  61.9k|{
 1403|  61.9k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1403:9): [True: 0, False: 61.9k]
  ------------------
 1404|      0|        return;
 1405|      0|    }
 1406|       |
 1407|  61.9k|    char16_t ch;
 1408|  83.0k|    while (ruleIndex < ruleSrc->length()) {
  ------------------
  |  Branch (1408:12): [True: 83.0k, False: 0]
  ------------------
 1409|  83.0k|        ch = ruleSrc->charAt(ruleIndex);
 1410|  83.0k|        type = charType(ch);
 1411|  83.0k|        if (type != tSpace) {
  ------------------
  |  Branch (1411:13): [True: 61.9k, False: 21.0k]
  ------------------
 1412|  61.9k|            break;
 1413|  61.9k|        }
 1414|  21.0k|        ++(ruleIndex);
 1415|  21.0k|    }
 1416|  61.9k|    if (ruleIndex >= ruleSrc->length()) {
  ------------------
  |  Branch (1416:9): [True: 0, False: 61.9k]
  ------------------
 1417|      0|        type = tEOF;
 1418|      0|        return;
 1419|      0|    }
 1420|  61.9k|    int32_t curIndex= ruleIndex;
 1421|       |
 1422|  61.9k|    switch (type) {
 1423|  1.22k|      case tColon:
  ------------------
  |  Branch (1423:7): [True: 1.22k, False: 60.7k]
  ------------------
 1424|  2.36k|      case tSemiColon:
  ------------------
  |  Branch (1424:7): [True: 1.14k, False: 60.8k]
  ------------------
 1425|  14.2k|      case tComma:
  ------------------
  |  Branch (1425:7): [True: 11.8k, False: 50.1k]
  ------------------
 1426|  15.5k|      case tEllipsis:
  ------------------
  |  Branch (1426:7): [True: 1.29k, False: 60.6k]
  ------------------
 1427|  17.1k|      case tTilde:   // scanned '~'
  ------------------
  |  Branch (1427:7): [True: 1.67k, False: 60.3k]
  ------------------
 1428|  19.3k|      case tAt:      // scanned '@'
  ------------------
  |  Branch (1428:7): [True: 2.15k, False: 59.8k]
  ------------------
 1429|  20.4k|      case tEqual:   // scanned '='
  ------------------
  |  Branch (1429:7): [True: 1.12k, False: 60.8k]
  ------------------
 1430|  20.8k|      case tMod:     // scanned '%'
  ------------------
  |  Branch (1430:7): [True: 413, False: 61.5k]
  ------------------
 1431|       |        // Single character tokens.
 1432|  20.8k|        ++curIndex;
 1433|  20.8k|        break;
 1434|       |
 1435|    245|      case tNotEqual:  // scanned '!'
  ------------------
  |  Branch (1435:7): [True: 245, False: 61.7k]
  ------------------
 1436|    245|        if (ruleSrc->charAt(curIndex+1) == EQUALS) {
  ------------------
  |  Branch (1436:13): [True: 245, False: 0]
  ------------------
 1437|    245|            curIndex += 2;
 1438|    245|        } else {
 1439|      0|            type = none;
 1440|      0|            curIndex += 1;
 1441|      0|        }
 1442|    245|        break;
 1443|       |
 1444|  6.80k|      case tKeyword:
  ------------------
  |  Branch (1444:7): [True: 6.80k, False: 55.1k]
  ------------------
 1445|  31.2k|         while (type == tKeyword && ++curIndex < ruleSrc->length()) {
  ------------------
  |  Branch (1445:17): [True: 24.4k, False: 6.72k]
  |  Branch (1445:37): [True: 24.4k, False: 77]
  ------------------
 1446|  24.4k|             ch = ruleSrc->charAt(curIndex);
 1447|  24.4k|             type = charType(ch);
 1448|  24.4k|         }
 1449|  6.80k|         type = tKeyword;
 1450|  6.80k|         break;
 1451|       |
 1452|  25.7k|      case tNumber:
  ------------------
  |  Branch (1452:7): [True: 25.7k, False: 36.2k]
  ------------------
 1453|  78.8k|         while (type == tNumber && ++curIndex < ruleSrc->length()) {
  ------------------
  |  Branch (1453:17): [True: 53.0k, False: 25.7k]
  |  Branch (1453:36): [True: 53.0k, False: 0]
  ------------------
 1454|  53.0k|             ch = ruleSrc->charAt(curIndex);
 1455|  53.0k|             type = charType(ch);
 1456|  53.0k|         }
 1457|  25.7k|         type = tNumber;
 1458|  25.7k|         break;
 1459|       |
 1460|  8.30k|       case tDot:
  ------------------
  |  Branch (1460:8): [True: 8.30k, False: 53.6k]
  ------------------
 1461|       |         // We could be looking at either ".." in a range, or "..." at the end of a sample.
 1462|  8.30k|         if (curIndex+1 >= ruleSrc->length() || ruleSrc->charAt(curIndex+1) != DOT) {
  ------------------
  |  Branch (1462:14): [True: 0, False: 8.30k]
  |  Branch (1462:49): [True: 8.00k, False: 295]
  ------------------
 1463|  8.00k|             ++curIndex;
 1464|  8.00k|             break; // Single dot
 1465|  8.00k|         }
 1466|    295|         if (curIndex+2 >= ruleSrc->length() || ruleSrc->charAt(curIndex+2) != DOT) {
  ------------------
  |  Branch (1466:14): [True: 0, False: 295]
  |  Branch (1466:49): [True: 295, False: 0]
  ------------------
 1467|    295|             curIndex += 2;
 1468|    295|             type = tDot2;
 1469|    295|             break; // double dot
 1470|    295|         }
 1471|      0|         type = tEllipsis;
 1472|      0|         curIndex += 3;
 1473|      0|         break;     // triple dot
 1474|       |
 1475|      0|       default:
  ------------------
  |  Branch (1475:8): [True: 0, False: 61.9k]
  ------------------
 1476|      0|         status = U_UNEXPECTED_TOKEN;
 1477|      0|         ++curIndex;
 1478|      0|         break;
 1479|  61.9k|    }
 1480|       |
 1481|  61.9k|    U_ASSERT(ruleIndex <= ruleSrc->length());
  ------------------
  |  |   35|  61.9k|#   define U_ASSERT(exp) (void)0
  ------------------
 1482|  61.9k|    U_ASSERT(curIndex <= ruleSrc->length());
  ------------------
  |  |   35|  61.9k|#   define U_ASSERT(exp) (void)0
  ------------------
 1483|  61.9k|    token=UnicodeString(*ruleSrc, ruleIndex, curIndex-ruleIndex);
 1484|  61.9k|    ruleIndex = curIndex;
 1485|  61.9k|}
_ZN6icu_7816PluralRuleParser8charTypeEDs:
 1488|   160k|PluralRuleParser::charType(char16_t ch) {
 1489|   160k|    if ((ch>=U_ZERO) && (ch<=U_NINE)) {
  ------------------
  |  Branch (1489:9): [True: 92.1k, False: 68.3k]
  |  Branch (1489:25): [True: 54.3k, False: 37.7k]
  ------------------
 1490|  54.3k|        return tNumber;
 1491|  54.3k|    }
 1492|   106k|    if (ch>=LOW_A && ch<=LOW_Z) {
  ------------------
  |  Branch (1492:9): [True: 30.4k, False: 75.6k]
  |  Branch (1492:22): [True: 25.7k, False: 4.63k]
  ------------------
 1493|  25.7k|        return tKeyword;
 1494|  25.7k|    }
 1495|  80.2k|    switch (ch) {
 1496|  2.44k|    case COLON:
  ------------------
  |  Branch (1496:5): [True: 2.44k, False: 77.8k]
  ------------------
 1497|  2.44k|        return tColon;
 1498|  27.3k|    case SPACE:
  ------------------
  |  Branch (1498:5): [True: 27.3k, False: 52.9k]
  ------------------
 1499|  27.3k|        return tSpace;
 1500|  1.61k|    case SEMI_COLON:
  ------------------
  |  Branch (1500:5): [True: 1.61k, False: 78.6k]
  ------------------
 1501|  1.61k|        return tSemiColon;
 1502|  16.6k|    case DOT:
  ------------------
  |  Branch (1502:5): [True: 16.6k, False: 63.6k]
  ------------------
 1503|  16.6k|        return tDot;
 1504|  23.6k|    case COMMA:
  ------------------
  |  Branch (1504:5): [True: 23.6k, False: 56.6k]
  ------------------
 1505|  23.6k|        return tComma;
 1506|    245|    case EXCLAMATION:
  ------------------
  |  Branch (1506:5): [True: 245, False: 80.0k]
  ------------------
 1507|    245|        return tNotEqual;
 1508|  1.12k|    case EQUALS:
  ------------------
  |  Branch (1508:5): [True: 1.12k, False: 79.1k]
  ------------------
 1509|  1.12k|        return tEqual;
 1510|    413|    case PERCENT_SIGN:
  ------------------
  |  Branch (1510:5): [True: 413, False: 79.8k]
  ------------------
 1511|    413|        return tMod;
 1512|  2.15k|    case AT:
  ------------------
  |  Branch (1512:5): [True: 2.15k, False: 78.1k]
  ------------------
 1513|  2.15k|        return tAt;
 1514|  1.29k|    case ELLIPSIS:
  ------------------
  |  Branch (1514:5): [True: 1.29k, False: 79.0k]
  ------------------
 1515|  1.29k|        return tEllipsis;
 1516|  3.34k|    case TILDE:
  ------------------
  |  Branch (1516:5): [True: 3.34k, False: 76.9k]
  ------------------
 1517|  3.34k|        return tTilde;
 1518|      0|    default :
  ------------------
  |  Branch (1518:5): [True: 0, False: 80.2k]
  ------------------
 1519|      0|        return none;
 1520|  80.2k|    }
 1521|  80.2k|}
_ZN6icu_7816PluralRuleParser10getKeyTypeERKNS_13UnicodeStringENS_9tokenTypeE:
 1528|  11.0k|{
 1529|  11.0k|    if (keyType != tKeyword) {
  ------------------
  |  Branch (1529:9): [True: 6.75k, False: 4.25k]
  ------------------
 1530|  6.75k|        return keyType;
 1531|  6.75k|    }
 1532|       |
 1533|  4.25k|    if (0 == token.compare(PK_VAR_N, 1)) {
  ------------------
  |  Branch (1533:9): [True: 567, False: 3.69k]
  ------------------
 1534|    567|        keyType = tVariableN;
 1535|  3.69k|    } else if (0 == token.compare(PK_VAR_I, 1)) {
  ------------------
  |  Branch (1535:16): [True: 410, False: 3.28k]
  ------------------
 1536|    410|        keyType = tVariableI;
 1537|  3.28k|    } else if (0 == token.compare(PK_VAR_F, 1)) {
  ------------------
  |  Branch (1537:16): [True: 87, False: 3.19k]
  ------------------
 1538|     87|        keyType = tVariableF;
 1539|  3.19k|    } else if (0 == token.compare(PK_VAR_T, 1)) {
  ------------------
  |  Branch (1539:16): [True: 9, False: 3.18k]
  ------------------
 1540|      9|        keyType = tVariableT;
 1541|  3.18k|    } else if (0 == token.compare(PK_VAR_E, 1)) {
  ------------------
  |  Branch (1541:16): [True: 110, False: 3.07k]
  ------------------
 1542|    110|        keyType = tVariableE;
 1543|  3.07k|    } else if (0 == token.compare(PK_VAR_C, 1)) {
  ------------------
  |  Branch (1543:16): [True: 0, False: 3.07k]
  ------------------
 1544|      0|        keyType = tVariableC;
 1545|  3.07k|    } else if (0 == token.compare(PK_VAR_V, 1)) {
  ------------------
  |  Branch (1545:16): [True: 262, False: 2.81k]
  ------------------
 1546|    262|        keyType = tVariableV;
 1547|  2.81k|    } else if (0 == token.compare(PK_IS, 2)) {
  ------------------
  |  Branch (1547:16): [True: 0, False: 2.81k]
  ------------------
 1548|      0|        keyType = tIs;
 1549|  2.81k|    } else if (0 == token.compare(PK_AND, 3)) {
  ------------------
  |  Branch (1549:16): [True: 478, False: 2.33k]
  ------------------
 1550|    478|        keyType = tAnd;
 1551|  2.33k|    } else if (0 == token.compare(PK_IN, 2)) {
  ------------------
  |  Branch (1551:16): [True: 0, False: 2.33k]
  ------------------
 1552|      0|        keyType = tIn;
 1553|  2.33k|    } else if (0 == token.compare(PK_WITHIN, 6)) {
  ------------------
  |  Branch (1553:16): [True: 0, False: 2.33k]
  ------------------
 1554|      0|        keyType = tWithin;
 1555|  2.33k|    } else if (0 == token.compare(PK_NOT, 3)) {
  ------------------
  |  Branch (1555:16): [True: 0, False: 2.33k]
  ------------------
 1556|      0|        keyType = tNot;
 1557|  2.33k|    } else if (0 == token.compare(PK_MOD, 3)) {
  ------------------
  |  Branch (1557:16): [True: 0, False: 2.33k]
  ------------------
 1558|      0|        keyType = tMod;
 1559|  2.33k|    } else if (0 == token.compare(PK_OR, 2)) {
  ------------------
  |  Branch (1559:16): [True: 183, False: 2.15k]
  ------------------
 1560|    183|        keyType = tOr;
 1561|  2.15k|    } else if (0 == token.compare(PK_DECIMAL, 7)) {
  ------------------
  |  Branch (1561:16): [True: 1.02k, False: 1.12k]
  ------------------
 1562|  1.02k|        keyType = tDecimal;
 1563|  1.12k|    } else if (0 == token.compare(PK_INTEGER, 7)) {
  ------------------
  |  Branch (1563:16): [True: 1.12k, False: 0]
  ------------------
 1564|  1.12k|        keyType = tInteger;
 1565|  1.12k|    }
 1566|  4.25k|    return keyType;
 1567|  11.0k|}
_ZN6icu_7824tokenTypeToPluralOperandENS_9tokenTypeE:
 1620|  13.1k|PluralOperand tokenTypeToPluralOperand(tokenType tt) {
 1621|  13.1k|    switch(tt) {
 1622|  8.16k|    case tVariableN:
  ------------------
  |  Branch (1622:5): [True: 8.16k, False: 5.00k]
  ------------------
 1623|  8.16k|        return PLURAL_OPERAND_N;
 1624|  1.82k|    case tVariableI:
  ------------------
  |  Branch (1624:5): [True: 1.82k, False: 11.3k]
  ------------------
 1625|  1.82k|        return PLURAL_OPERAND_I;
 1626|    882|    case tVariableF:
  ------------------
  |  Branch (1626:5): [True: 882, False: 12.2k]
  ------------------
 1627|    882|        return PLURAL_OPERAND_F;
 1628|  1.48k|    case tVariableV:
  ------------------
  |  Branch (1628:5): [True: 1.48k, False: 11.6k]
  ------------------
 1629|  1.48k|        return PLURAL_OPERAND_V;
 1630|    320|    case tVariableT:
  ------------------
  |  Branch (1630:5): [True: 320, False: 12.8k]
  ------------------
 1631|    320|        return PLURAL_OPERAND_T;
 1632|    496|    case tVariableE:
  ------------------
  |  Branch (1632:5): [True: 496, False: 12.6k]
  ------------------
 1633|    496|        return PLURAL_OPERAND_E;
 1634|      0|    case tVariableC:
  ------------------
  |  Branch (1634:5): [True: 0, False: 13.1k]
  ------------------
 1635|      0|        return PLURAL_OPERAND_E;
 1636|      0|    default:
  ------------------
  |  Branch (1636:5): [True: 0, False: 13.1k]
  ------------------
 1637|      0|        UPRV_UNREACHABLE_EXIT;  // unexpected.
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
 1638|  13.1k|    }
 1639|  13.1k|}

_ZN6icu_7812OrConstraintC2Ev:
  379|  1.40k|    OrConstraint() = default;
_ZN6icu_789RuleChainC2Ev:
  399|  1.22k|    RuleChain() = default;
_ZN6icu_7813AndConstraintC2Ev:
  364|  1.88k|    AndConstraint() = default;

_ZNK6icu_7817SharedPluralRulesptEv:
   26|  3.37k|    const PluralRules *operator->() const { return ptr; }
_ZN6icu_7817SharedPluralRulesC2EPNS_11PluralRulesE:
   24|    516|    SharedPluralRules(PluralRules *prToAdopt) : ptr(prToAdopt) { }

_ZN6icu_7814StandardPlural25indexOrNegativeFromStringEPKc:
   34|  97.9k|int32_t StandardPlural::indexOrNegativeFromString(const char *keyword) {
   35|  97.9k|    switch (*keyword++) {
   36|  1.22k|    case 'f':
  ------------------
  |  Branch (36:5): [True: 1.22k, False: 96.7k]
  ------------------
   37|  1.22k|        if (uprv_strcmp(keyword, "ew") == 0) {
  ------------------
  |  |   38|  1.22k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.22k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (37:13): [True: 1.22k, False: 0]
  ------------------
   38|  1.22k|            return FEW;
   39|  1.22k|        }
   40|      0|        break;
   41|  1.16k|    case 'm':
  ------------------
  |  Branch (41:5): [True: 1.16k, False: 96.8k]
  ------------------
   42|  1.16k|        if (uprv_strcmp(keyword, "any") == 0) {
  ------------------
  |  |   38|  1.16k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.16k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (42:13): [True: 1.16k, False: 0]
  ------------------
   43|  1.16k|            return MANY;
   44|  1.16k|        }
   45|      0|        break;
   46|  93.2k|    case 'o':
  ------------------
  |  Branch (46:5): [True: 93.2k, False: 4.78k]
  ------------------
   47|  93.2k|        if (uprv_strcmp(keyword, "ther") == 0) {
  ------------------
  |  |   38|  93.2k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  93.2k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (47:13): [True: 67.6k, False: 25.5k]
  ------------------
   48|  67.6k|            return OTHER;
   49|  67.6k|        } else if (uprv_strcmp(keyword, "ne") == 0) {
  ------------------
  |  |   38|  25.5k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  25.5k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (49:20): [True: 25.5k, False: 0]
  ------------------
   50|  25.5k|            return ONE;
   51|  25.5k|        }
   52|      0|        break;
   53|  1.26k|    case 't':
  ------------------
  |  Branch (53:5): [True: 1.26k, False: 96.7k]
  ------------------
   54|  1.26k|        if (uprv_strcmp(keyword, "wo") == 0) {
  ------------------
  |  |   38|  1.26k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.26k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (54:13): [True: 1.26k, False: 0]
  ------------------
   55|  1.26k|            return TWO;
   56|  1.26k|        }
   57|      0|        break;
   58|  1.10k|    case 'z':
  ------------------
  |  Branch (58:5): [True: 1.10k, False: 96.8k]
  ------------------
   59|  1.10k|        if (uprv_strcmp(keyword, "ero") == 0) {
  ------------------
  |  |   38|  1.10k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.10k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (59:13): [True: 1.10k, False: 0]
  ------------------
   60|  1.10k|            return ZERO;
   61|  1.10k|        }
   62|      0|        break;
   63|      0|    case '=':
  ------------------
  |  Branch (63:5): [True: 0, False: 97.9k]
  ------------------
   64|      0|        if (uprv_strcmp(keyword, "0") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (64:13): [True: 0, False: 0]
  ------------------
   65|      0|            return EQ_0;
   66|      0|        } else if (uprv_strcmp(keyword, "1") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (66:20): [True: 0, False: 0]
  ------------------
   67|      0|            return EQ_1;
   68|      0|        }
   69|      0|        break;
   70|       |    // Also allow "0" and "1"
   71|      0|    case '0':
  ------------------
  |  Branch (71:5): [True: 0, False: 97.9k]
  ------------------
   72|      0|        if (*keyword == 0) {
  ------------------
  |  Branch (72:13): [True: 0, False: 0]
  ------------------
   73|      0|            return EQ_0;
   74|      0|        }
   75|      0|        break;
   76|     30|    case '1':
  ------------------
  |  Branch (76:5): [True: 30, False: 97.9k]
  ------------------
   77|     30|        if (*keyword == 0) {
  ------------------
  |  Branch (77:13): [True: 30, False: 0]
  ------------------
   78|     30|            return EQ_1;
   79|     30|        }
   80|      0|        break;
   81|      0|    default:
  ------------------
  |  Branch (81:5): [True: 0, False: 97.9k]
  ------------------
   82|      0|        break;
   83|  97.9k|    }
   84|      0|    return -1;
   85|  97.9k|}
_ZN6icu_7814StandardPlural25indexOrNegativeFromStringERKNS_13UnicodeStringE:
   96|  9.62k|int32_t StandardPlural::indexOrNegativeFromString(const UnicodeString &keyword) {
   97|  9.62k|    switch (keyword.length()) {
   98|      0|    case 1:
  ------------------
  |  Branch (98:5): [True: 0, False: 9.62k]
  ------------------
   99|      0|        if (keyword.charAt(0) == '0') {
  ------------------
  |  Branch (99:13): [True: 0, False: 0]
  ------------------
  100|      0|            return EQ_0;
  101|      0|        } else if (keyword.charAt(0) == '1') {
  ------------------
  |  Branch (101:20): [True: 0, False: 0]
  ------------------
  102|      0|            return EQ_1;
  103|      0|        }
  104|      0|        break;
  105|      0|    case 2:
  ------------------
  |  Branch (105:5): [True: 0, False: 9.62k]
  ------------------
  106|      0|        if (keyword.compare(gEq0, 2) == 0) {
  ------------------
  |  Branch (106:13): [True: 0, False: 0]
  ------------------
  107|      0|            return EQ_0;
  108|      0|        } else if (keyword.compare(gEq1, 2) == 0) {
  ------------------
  |  Branch (108:20): [True: 0, False: 0]
  ------------------
  109|      0|            return EQ_1;
  110|      0|        }
  111|      0|        break;
  112|  2.71k|    case 3:
  ------------------
  |  Branch (112:5): [True: 2.71k, False: 6.91k]
  ------------------
  113|  2.71k|        if (keyword.compare(gOne, 3) == 0) {
  ------------------
  |  Branch (113:13): [True: 1.47k, False: 1.24k]
  ------------------
  114|  1.47k|            return ONE;
  115|  1.47k|        } else if (keyword.compare(gTwo, 3) == 0) {
  ------------------
  |  Branch (115:20): [True: 267, False: 973]
  ------------------
  116|    267|            return TWO;
  117|    973|        } else if (keyword.compare(gFew, 3) == 0) {
  ------------------
  |  Branch (117:20): [True: 973, False: 0]
  ------------------
  118|    973|            return FEW;
  119|    973|        }
  120|      0|        break;
  121|  1.27k|    case 4:
  ------------------
  |  Branch (121:5): [True: 1.27k, False: 8.35k]
  ------------------
  122|  1.27k|        if (keyword.compare(gMany, 4) == 0) {
  ------------------
  |  Branch (122:13): [True: 969, False: 304]
  ------------------
  123|    969|            return MANY;
  124|    969|        } else if (keyword.compare(gZero, 4) == 0) {
  ------------------
  |  Branch (124:20): [True: 304, False: 0]
  ------------------
  125|    304|            return ZERO;
  126|    304|        }
  127|      0|        break;
  128|  5.64k|    case 5:
  ------------------
  |  Branch (128:5): [True: 5.64k, False: 3.98k]
  ------------------
  129|  5.64k|        if (keyword.compare(gOther, 5) == 0) {
  ------------------
  |  Branch (129:13): [True: 5.64k, False: 0]
  ------------------
  130|  5.64k|            return OTHER;
  131|  5.64k|        }
  132|      0|        break;
  133|      0|    default:
  ------------------
  |  Branch (133:5): [True: 0, False: 9.62k]
  ------------------
  134|      0|        break;
  135|  9.62k|    }
  136|      0|    return -1;
  137|  9.62k|}
_ZN6icu_7814StandardPlural15indexFromStringEPKcR10UErrorCode:
  139|  97.9k|int32_t StandardPlural::indexFromString(const char *keyword, UErrorCode &errorCode) {
  140|  97.9k|    if (U_FAILURE(errorCode)) { return OTHER; }
  ------------------
  |  Branch (140:9): [True: 0, False: 97.9k]
  ------------------
  141|  97.9k|    int32_t i = indexOrNegativeFromString(keyword);
  142|  97.9k|    if (i >= 0) {
  ------------------
  |  Branch (142:9): [True: 97.9k, False: 0]
  ------------------
  143|  97.9k|        return i;
  144|  97.9k|    } else {
  145|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  146|      0|        return OTHER;
  147|      0|    }
  148|  97.9k|}
_ZN6icu_7814StandardPlural15indexFromStringERKNS_13UnicodeStringER10UErrorCode:
  150|  5.43k|int32_t StandardPlural::indexFromString(const UnicodeString &keyword, UErrorCode &errorCode) {
  151|  5.43k|    if (U_FAILURE(errorCode)) { return OTHER; }
  ------------------
  |  Branch (151:9): [True: 0, False: 5.43k]
  ------------------
  152|  5.43k|    int32_t i = indexOrNegativeFromString(keyword);
  153|  5.43k|    if (i >= 0) {
  ------------------
  |  Branch (153:9): [True: 5.43k, False: 0]
  ------------------
  154|  5.43k|        return i;
  155|  5.43k|    } else {
  156|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  157|      0|        return OTHER;
  158|      0|    }
  159|  5.43k|}

_ZN6icu_7814StandardPlural17orOtherFromStringERKNS_13UnicodeStringE:
   60|  4.19k|    static Form orOtherFromString(const UnicodeString &keyword) {
   61|  4.19k|        return static_cast<Form>(indexOrOtherIndexFromString(keyword));
   62|  4.19k|    }
_ZN6icu_7814StandardPlural10fromStringEPKcR10UErrorCode:
   70|  97.9k|    static Form fromString(const char *keyword, UErrorCode &errorCode) {
   71|  97.9k|        return static_cast<Form>(indexFromString(keyword, errorCode));
   72|  97.9k|    }
_ZN6icu_7814StandardPlural10fromStringERKNS_13UnicodeStringER10UErrorCode:
   80|  5.43k|    static Form fromString(const UnicodeString &keyword, UErrorCode &errorCode) {
   81|  5.43k|        return static_cast<Form>(indexFromString(keyword, errorCode));
   82|  5.43k|    }
_ZN6icu_7814StandardPlural27indexOrOtherIndexFromStringERKNS_13UnicodeStringE:
  109|  4.19k|    static int32_t indexOrOtherIndexFromString(const UnicodeString &keyword) {
  110|  4.19k|        int32_t i = indexOrNegativeFromString(keyword);
  111|  4.19k|        return i >= 0 ? i : OTHER;
  ------------------
  |  Branch (111:16): [True: 4.19k, False: 0]
  ------------------
  112|  4.19k|    }

_ZN6icu_7813StringSegmentC2ERKNS_13UnicodeStringEb:
   22|  4.72k|        : fStr(str), fStart(0), fEnd(str.length()),
   23|  4.72k|          fFoldCase(ignoreCase) {}
_ZNK6icu_7813StringSegment9getOffsetEv:
   25|    916|int32_t StringSegment::getOffset() const {
   26|    916|    return fStart;
   27|    916|}
_ZN6icu_7813StringSegment12adjustOffsetEi:
   33|  14.8k|void StringSegment::adjustOffset(int32_t delta) {
   34|  14.8k|    fStart += delta;
   35|  14.8k|}
_ZN6icu_7813StringSegment9setLengthEi:
   41|  7.63k|void StringSegment::setLength(int32_t length) {
   42|  7.63k|    fEnd = fStart + length;
   43|  7.63k|}
_ZN6icu_7813StringSegment11resetLengthEv:
   45|  7.63k|void StringSegment::resetLength() {
   46|  7.63k|    fEnd = fStr.length();
   47|  7.63k|}
_ZNK6icu_7813StringSegment6lengthEv:
   49|  22.9M|int32_t StringSegment::length() const {
   50|  22.9M|    return fEnd - fStart;
   51|  22.9M|}
_ZNK6icu_7813StringSegment6charAtEi:
   53|  1.00M|char16_t StringSegment::charAt(int32_t index) const {
   54|  1.00M|    return fStr.charAt(index + fStart);
   55|  1.00M|}
_ZNK6icu_7813StringSegment11codePointAtEi:
   57|  21.9M|UChar32 StringSegment::codePointAt(int32_t index) const {
   58|  21.9M|    return fStr.char32At(index + fStart);
   59|  21.9M|}
_ZNK6icu_7813StringSegment19toTempUnicodeStringEv:
   65|  1.66k|UnicodeString StringSegment::toTempUnicodeString() const {
   66|       |    // Use the readonly-aliasing constructor for efficiency.
   67|  1.66k|    return UnicodeString(false, fStr.getBuffer() + fStart, fEnd - fStart);
   68|  1.66k|}
_ZNK6icu_7813StringSegmenteqERKNS_13UnicodeStringE:
  139|     88|bool StringSegment::operator==(const UnicodeString& other) const {
  140|     88|    return toTempUnicodeString() == other;
  141|     88|}

ucln_i18n_registerCleanup_78:
   52|      1|                               cleanupFunc *func) {
   53|      1|    U_ASSERT(UCLN_I18N_START < type && type < UCLN_I18N_COUNT);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
   54|      1|    {
   55|      1|        icu::Mutex m;   // See ticket 10295 for discussion.
   56|      1|        ucln_registerCleanup(UCLN_I18N, i18n_cleanup);
  ------------------
  |  |  621|      1|#define ucln_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   57|      1|        if (UCLN_I18N_START < type && type < UCLN_I18N_COUNT) {
  ------------------
  |  Branch (57:13): [True: 1, False: 0]
  |  Branch (57:39): [True: 1, False: 0]
  ------------------
   58|      1|            gCleanupFunctions[type] = func;
   59|      1|        }
   60|      1|    }
   61|       |#if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
   62|       |    ucln_registerAutomaticCleanup();
   63|       |#endif
   64|      1|}

_ZNK6icu_7820DecimalFormatSymbols22isCustomCurrencySymbolEv:
  401|  9.33k|    inline UBool isCustomCurrencySymbol() const {
  402|  9.33k|        return fIsCustomCurrencySymbol;
  403|  9.33k|    }
_ZNK6icu_7820DecimalFormatSymbols26isCustomIntlCurrencySymbolEv:
  408|  9.33k|    inline UBool isCustomIntlCurrencySymbol() const {
  409|  9.33k|        return fIsCustomIntlCurrencySymbol;
  410|  9.33k|    }
_ZNK6icu_7820DecimalFormatSymbols16getCodePointZeroEv:
  415|  2.58G|    inline UChar32 getCodePointZero() const {
  416|  2.58G|        return fCodePointZero;
  417|  2.58G|    }
_ZNK6icu_7820DecimalFormatSymbols9getSymbolENS0_19ENumberFormatSymbolE:
  522|   241M|DecimalFormatSymbols::getSymbol(ENumberFormatSymbol symbol) const {
  523|   241M|    const UnicodeString *strPtr;
  524|   241M|    if(symbol < kFormatSymbolCount) {
  ------------------
  |  Branch (524:8): [True: 241M, False: 0]
  ------------------
  525|   241M|        strPtr = &fSymbols[symbol];
  526|   241M|    } else {
  527|      0|        strPtr = &fNoSymbol;
  528|      0|    }
  529|   241M|    return *strPtr;
  530|   241M|}
_ZNK6icu_7820DecimalFormatSymbols19getConstDigitSymbolEi:
  545|  93.3k|inline const UnicodeString& DecimalFormatSymbols::getConstDigitSymbol(int32_t digit) const {
  546|  93.3k|    if (digit < 0 || digit > 9) {
  ------------------
  |  Branch (546:9): [True: 0, False: 93.3k]
  |  Branch (546:22): [True: 0, False: 93.3k]
  ------------------
  547|      0|        digit = 0;
  548|      0|    }
  549|  93.3k|    if (digit == 0) {
  ------------------
  |  Branch (549:9): [True: 9.33k, False: 84.0k]
  ------------------
  550|  9.33k|        return fSymbols[kZeroDigitSymbol];
  551|  9.33k|    }
  552|  84.0k|    ENumberFormatSymbol key = static_cast<ENumberFormatSymbol>(kOneDigitSymbol + digit - 1);
  553|  84.0k|    return fSymbols[key];
  554|  93.3k|}
_ZN6icu_7820DecimalFormatSymbols9setSymbolENS0_19ENumberFormatSymbolERKNS_13UnicodeStringEa:
  560|   121k|DecimalFormatSymbols::setSymbol(ENumberFormatSymbol symbol, const UnicodeString &value, const UBool propagateDigits = true) {
  561|   121k|    if (symbol == kCurrencySymbol) {
  ------------------
  |  Branch (561:9): [True: 0, False: 121k]
  ------------------
  562|      0|        fIsCustomCurrencySymbol = true;
  563|      0|    }
  564|   121k|    else if (symbol == kIntlCurrencySymbol) {
  ------------------
  |  Branch (564:14): [True: 0, False: 121k]
  ------------------
  565|      0|        fIsCustomIntlCurrencySymbol = true;
  566|      0|    }
  567|   121k|    if(symbol<kFormatSymbolCount) {
  ------------------
  |  Branch (567:8): [True: 121k, False: 0]
  ------------------
  568|   121k|        fSymbols[symbol]=value;
  569|   121k|    }
  570|       |
  571|       |    // If the zero digit is being set to a known zero digit according to Unicode,
  572|       |    // then we automatically set the corresponding 1-9 digits
  573|       |    // Also record updates to fCodePointZero. Be conservative if in doubt.
  574|   121k|    if (symbol == kZeroDigitSymbol) {
  ------------------
  |  Branch (574:9): [True: 0, False: 121k]
  ------------------
  575|      0|        UChar32 sym = value.char32At(0);
  576|      0|        if ( propagateDigits && u_charDigitValue(sym) == 0 && value.countChar32() == 1 ) {
  ------------------
  |  |  220|      0|#define u_charDigitValue U_ICU_ENTRY_POINT_RENAME(u_charDigitValue)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (576:14): [True: 0, False: 0]
  |  Branch (576:33): [True: 0, False: 0]
  |  Branch (576:63): [True: 0, False: 0]
  ------------------
  577|      0|            fCodePointZero = sym;
  578|      0|            for ( int8_t i = 1 ; i<= 9 ; i++ ) {
  ------------------
  |  Branch (578:34): [True: 0, False: 0]
  ------------------
  579|      0|                sym++;
  580|      0|                fSymbols[static_cast<int>(kOneDigitSymbol) + i - 1] = UnicodeString(sym);
  581|      0|            }
  582|      0|        } else {
  583|      0|            fCodePointZero = -1;
  584|      0|        }
  585|   121k|    } else if (symbol >= kOneDigitSymbol && symbol <= kNineDigitSymbol) {
  ------------------
  |  Branch (585:16): [True: 18.6k, False: 102k]
  |  Branch (585:45): [True: 0, False: 18.6k]
  ------------------
  586|      0|        fCodePointZero = -1;
  587|      0|    }
  588|   121k|}
_ZNK6icu_7820DecimalFormatSymbols9getLocaleEv:
  593|  9.33k|DecimalFormatSymbols::getLocale() const {
  594|  9.33k|    return locale;
  595|  9.33k|}

_ZN6icu_786number15FormattedNumberC2EPNS0_4impl20UFormattedNumberDataE:
  181|  9.33k|        : fData(results), fErrorCode(U_ZERO_ERROR) {}
_ZN6icu_786number15FormattedNumberC2E10UErrorCode:
  184|    116|        : fData(nullptr), fErrorCode(errorCode) {}

number_skeletons.cpp:_ZN6icu_786NoUnitL7percentEv:
   59|     19|    static inline MeasureUnit U_EXPORT2 percent() {
   60|     19|        return MeasureUnit::getPercent();
   61|     19|    }

_ZN6icu_786number8NotationC2ERKNS1_12NotationTypeERKNS1_13NotationUnionE:
  376|  2.03k|    Notation(const NotationType &type, const NotationUnion &union_) : fType(type), fUnion(union_) {}
_ZN6icu_786number8NotationC2E10UErrorCode:
  378|      3|    Notation(UErrorCode errorCode) : fType(NTN_ERROR) {
  379|      3|        fUnion.errorCode = errorCode;
  380|      3|    }
_ZN6icu_786number8NotationC2Ev:
  382|  14.1k|    Notation() : fType(NTN_SIMPLE), fUnion() {}
_ZNK6icu_786number8Notation11copyErrorToER10UErrorCode:
  384|  9.45k|    UBool copyErrorTo(UErrorCode &status) const {
  385|  9.45k|        if (fType == NTN_ERROR) {
  ------------------
  |  Branch (385:13): [True: 6, False: 9.44k]
  ------------------
  386|      6|            status = fUnion.errorCode;
  387|      6|            return true;
  388|      6|        }
  389|  9.44k|        return false;
  390|  9.45k|    }
_ZN6icu_786number9PrecisionC2ERKNS1_13PrecisionTypeERKNS1_14PrecisionUnionE:
  767|  11.7k|            : fType(type), fUnion(union_) {}
_ZN6icu_786number9PrecisionC2E10UErrorCode:
  769|     54|    Precision(UErrorCode errorCode) : fType(RND_ERROR) {
  770|     54|        fUnion.errorCode = errorCode;
  771|     54|    }
_ZN6icu_786number9PrecisionC2Ev:
  773|  36.5k|    Precision() : fType(RND_BOGUS) {}
_ZNK6icu_786number9Precision7isBogusEv:
  775|  9.33k|    bool isBogus() const {
  776|  9.33k|        return fType == RND_BOGUS;
  777|  9.33k|    }
_ZNK6icu_786number9Precision11copyErrorToER10UErrorCode:
  779|  9.44k|    UBool copyErrorTo(UErrorCode &status) const {
  780|  9.44k|        if (fType == RND_ERROR) {
  ------------------
  |  Branch (780:13): [True: 96, False: 9.34k]
  ------------------
  781|     96|            status = fUnion.errorCode;
  782|     96|            return true;
  783|     96|        }
  784|  9.34k|        return false;
  785|  9.44k|    }
_ZN6icu_786number12IntegerWidthC2E10UErrorCode:
 1030|      7|    IntegerWidth(UErrorCode errorCode) { // NOLINT
 1031|      7|        fUnion.errorCode = errorCode;
 1032|      7|        fHasError = true;
 1033|      7|    }
_ZN6icu_786number12IntegerWidthC2Ev:
 1035|  23.6k|    IntegerWidth() { // NOLINT
 1036|  23.6k|        fUnion.minMaxInt.fMinInt = -1;
 1037|  23.6k|    }
_ZN6icu_786number12IntegerWidth8standardEv:
 1040|  9.23k|    static IntegerWidth standard() {
 1041|  9.23k|        return IntegerWidth::zeroFillTo(1);
 1042|  9.23k|    }
_ZNK6icu_786number12IntegerWidth7isBogusEv:
 1044|  9.33k|    bool isBogus() const {
 1045|  9.33k|        return !fHasError && fUnion.minMaxInt.fMinInt == -1;
  ------------------
  |  Branch (1045:16): [True: 9.33k, False: 0]
  |  Branch (1045:30): [True: 9.23k, False: 104]
  ------------------
 1046|  9.33k|    }
_ZNK6icu_786number12IntegerWidth11copyErrorToER10UErrorCode:
 1048|  9.34k|    UBool copyErrorTo(UErrorCode &status) const {
 1049|  9.34k|        if (fHasError) {
  ------------------
  |  Branch (1049:13): [True: 14, False: 9.33k]
  ------------------
 1050|     14|            status = fUnion.errorCode;
 1051|     14|            return true;
 1052|     14|        }
 1053|  9.33k|        return false;
 1054|  9.34k|    }
_ZN6icu_786number5ScaleC2Ev:
 1170|  23.6k|    Scale() : fMagnitude(0), fArbitrary(nullptr), fError(U_ZERO_ERROR) {}
_ZNK6icu_786number5Scale7isValidEv:
 1172|  9.33k|    bool isValid() const {
 1173|  9.33k|        return fMagnitude != 0 || fArbitrary != nullptr;
  ------------------
  |  Branch (1173:16): [True: 576, False: 8.75k]
  |  Branch (1173:35): [True: 2.05k, False: 6.70k]
  ------------------
 1174|  9.33k|    }
_ZNK6icu_786number5Scale11copyErrorToER10UErrorCode:
 1176|  9.33k|    UBool copyErrorTo(UErrorCode &status) const {
 1177|  9.33k|        if (U_FAILURE(fError)) {
  ------------------
  |  Branch (1177:13): [True: 0, False: 9.33k]
  ------------------
 1178|      0|            status = fError;
 1179|      0|            return true;
 1180|      0|        }
 1181|  9.33k|        return false;
 1182|  9.33k|    }
_ZNK6icu_786number4impl10StringProp5isSetEv:
 1245|  17.8k|    bool isSet() const {
 1246|  17.8k|        return fLength > 0;
 1247|  17.8k|    }
_ZN6icu_786number4impl10StringPropC2Ev:
 1256|  28.3k|    StringProp() : fValue(nullptr), fLength(0), fError(U_ZERO_ERROR) {
 1257|  28.3k|    }
_ZNK6icu_786number4impl10StringProp11copyErrorToER10UErrorCode:
 1260|  18.6k|    UBool copyErrorTo(UErrorCode &status) const {
 1261|  18.6k|        if (U_FAILURE(fError)) {
  ------------------
  |  Branch (1261:13): [True: 0, False: 18.6k]
  ------------------
 1262|      0|            status = fError;
 1263|      0|            return true;
 1264|      0|        }
 1265|  18.6k|        return false;
 1266|  18.6k|    }
_ZN6icu_786number4impl14SymbolsWrapperC2Ev:
 1284|  14.1k|    SymbolsWrapper() : fType(SYMPTR_NONE), fPtr{nullptr} {}
_ZNK6icu_786number4impl14SymbolsWrapper11copyErrorToER10UErrorCode:
 1342|  9.33k|    UBool copyErrorTo(UErrorCode &status) const {
 1343|  9.33k|        if (fType == SYMPTR_DFS && fPtr.dfs == nullptr) {
  ------------------
  |  Branch (1343:13): [True: 0, False: 9.33k]
  |  Branch (1343:36): [True: 0, False: 0]
  ------------------
 1344|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1345|      0|            return true;
 1346|  9.33k|        } else if (fType == SYMPTR_NS && fPtr.ns == nullptr) {
  ------------------
  |  Branch (1346:20): [True: 0, False: 9.33k]
  |  Branch (1346:42): [True: 0, False: 0]
  ------------------
 1347|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1348|      0|            return true;
 1349|      0|        }
 1350|  9.33k|        return false;
 1351|  9.33k|    }
_ZN6icu_786number4impl7GrouperC2Esss23UNumberGroupingStrategy:
 1388|  9.33k|            : fGrouping1(grouping1),
 1389|  9.33k|              fGrouping2(grouping2),
 1390|  9.33k|              fMinGrouping(minGrouping),
 1391|  9.33k|              fStrategy(strategy) {}
_ZN6icu_786number4impl7GrouperC2Ev:
 1427|  23.6k|    Grouper() : fGrouping1(-3) {}
_ZNK6icu_786number4impl7Grouper7isBogusEv:
 1429|  9.33k|    bool isBogus() const {
 1430|  9.33k|        return fGrouping1 == -3;
 1431|  9.33k|    }
_ZN6icu_786number4impl6PadderC2Ev:
 1487|  23.6k|    Padder() : fWidth(-2) {} // NOLINT
_ZNK6icu_786number4impl6Padder7isBogusEv:
 1489|  9.33k|    bool isBogus() const {
 1490|  9.33k|        return fWidth == -2;
 1491|  9.33k|    }
_ZNK6icu_786number4impl6Padder11copyErrorToER10UErrorCode:
 1493|  9.34k|    UBool copyErrorTo(UErrorCode &status) const {
 1494|  9.34k|        if (fWidth == -3) {
  ------------------
  |  Branch (1494:13): [True: 0, False: 9.34k]
  ------------------
 1495|      0|            status = fUnion.errorCode;
 1496|      0|            return true;
 1497|      0|        }
 1498|  9.34k|        return false;
 1499|  9.34k|    }
_ZNK6icu_786number4impl6Padder7isValidEv:
 1501|  9.33k|    bool isValid() const {
 1502|  9.33k|        return fWidth > 0;
 1503|  9.33k|    }
_ZNK6icu_786number4impl10MacroProps11copyErrorToER10UErrorCode:
 1591|  9.45k|    bool copyErrorTo(UErrorCode &status) const {
 1592|  9.45k|        return notation.copyErrorTo(status) || precision.copyErrorTo(status) ||
  ------------------
  |  Branch (1592:16): [True: 6, False: 9.44k]
  |  Branch (1592:48): [True: 96, False: 9.34k]
  ------------------
 1593|  9.45k|               padder.copyErrorTo(status) || integerWidth.copyErrorTo(status) ||
  ------------------
  |  Branch (1593:16): [True: 0, False: 9.34k]
  |  Branch (1593:46): [True: 14, False: 9.33k]
  ------------------
 1594|  9.45k|               symbols.copyErrorTo(status) || scale.copyErrorTo(status) || usage.copyErrorTo(status) ||
  ------------------
  |  Branch (1594:16): [True: 0, False: 9.33k]
  |  Branch (1594:47): [True: 0, False: 9.33k]
  |  Branch (1594:76): [True: 0, False: 9.33k]
  ------------------
 1595|  9.45k|               unitDisplayCase.copyErrorTo(status);
  ------------------
  |  Branch (1595:16): [True: 0, False: 9.33k]
  ------------------
 1596|  9.45k|    }
_ZN6icu_786number26UnlocalizedNumberFormatterC2Ev:
 2464|  4.72k|    UnlocalizedNumberFormatter() = default;
_ZN6icu_786number23NumberFormatterSettingsINS0_26UnlocalizedNumberFormatterEEC2Ev:
 2408|  4.72k|    NumberFormatterSettings() = default;
_ZN6icu_786number23NumberFormatterSettingsINS0_24LocalizedNumberFormatterEEC2Ev:
 2408|  4.72k|    NumberFormatterSettings() = default;

_Z15GetRandomLocalet:
   19|  4.72k|const icu::Locale& GetRandomLocale(uint16_t rnd) {
   20|  4.72k|  int32_t num_locales = 0;
   21|  4.72k|  const icu::Locale* locales = icu::Locale::getAvailableLocales(num_locales);
   22|  4.72k|  assert(num_locales > 0);
   23|  4.72k|  return locales[rnd % num_locales];
   24|  4.72k|}
_ZN14IcuEnvironmentC2Ev:
   14|      2|  IcuEnvironment() {
   15|       |    // nothing to initialize yet;
   16|      2|  }

LLVMFuzzerTestOneInput:
   12|  4.73k|extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   13|  4.73k|  UErrorCode status = U_ZERO_ERROR;
   14|       |
   15|  4.73k|  int16_t rnd;
   16|  4.73k|  int64_t value;
   17|  4.73k|  double doubleValue;
   18|  4.73k|  if (size < sizeof(rnd) + sizeof(value) + sizeof(doubleValue)) return 0;
  ------------------
  |  Branch (18:7): [True: 8, False: 4.72k]
  ------------------
   19|  4.72k|  icu::StringPiece fuzzData(reinterpret_cast<const char *>(data), size);
   20|       |
   21|  4.72k|  std::memcpy(&rnd, fuzzData.data(), sizeof(rnd));
   22|  4.72k|  icu::Locale locale = GetRandomLocale(rnd);
   23|  4.72k|  fuzzData.remove_prefix(sizeof(rnd));
   24|       |
   25|  4.72k|  std::memcpy(&value, fuzzData.data(), sizeof(value));
   26|  4.72k|  fuzzData.remove_prefix(sizeof(value));
   27|       |
   28|  4.72k|  std::memcpy(&doubleValue, fuzzData.data(), sizeof(doubleValue));
   29|  4.72k|  fuzzData.remove_prefix(sizeof(doubleValue));
   30|       |
   31|  4.72k|  size_t len = fuzzData.size() / sizeof(char16_t);
   32|  4.72k|  icu::UnicodeString fuzzstr(false, reinterpret_cast<const char16_t*>(fuzzData.data()), len);
   33|       |
   34|  4.72k|  icu::number::UnlocalizedNumberFormatter unf = icu::number::NumberFormatter::forSkeleton(
   35|  4.72k|      fuzzstr, status);
   36|       |
   37|  4.72k|  icu::number::LocalizedNumberFormatter nf = unf.locale(locale);
   38|       |
   39|  4.72k|  status = U_ZERO_ERROR;
   40|  4.72k|  nf.formatInt(value, status);
   41|       |
   42|  4.72k|  status = U_ZERO_ERROR;
   43|  4.72k|  nf.formatDouble(doubleValue, status);
   44|  4.72k|  return 0;
   45|  4.73k|}

