_ZN6icu_786BMPSetC2EPKii:
   30|     10|        list(parentList), listLength(parentListLength) {
   31|     10|    uprv_memset(latin1Contains, 0, sizeof(latin1Contains));
  ------------------
  |  |  100|     10|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|     10|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   32|     10|    uprv_memset(table7FF, 0, sizeof(table7FF));
  ------------------
  |  |  100|     10|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|     10|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   33|     10|    uprv_memset(bmpBlockBits, 0, sizeof(bmpBlockBits));
  ------------------
  |  |  100|     10|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|     10|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   34|       |
   35|       |    /*
   36|       |     * Set the list indexes for binary searches for
   37|       |     * U+0800, U+1000, U+2000, .., U+F000, U+10000.
   38|       |     * U+0800 is the first 3-byte-UTF-8 code point. Lower code points are
   39|       |     * looked up in the bit tables.
   40|       |     * The last pair of indexes is for finding supplementary code points.
   41|       |     */
   42|     10|    list4kStarts[0]=findCodePoint(0x800, 0, listLength-1);
   43|     10|    int32_t i;
   44|    170|    for(i=1; i<=0x10; ++i) {
  ------------------
  |  Branch (44:14): [True: 160, False: 10]
  ------------------
   45|    160|        list4kStarts[i]=findCodePoint(i<<12, list4kStarts[i-1], listLength-1);
   46|    160|    }
   47|     10|    list4kStarts[0x11]=listLength-1;
   48|     10|    containsFFFD=containsSlow(0xfffd, list4kStarts[0xf], list4kStarts[0x10]);
   49|       |
   50|     10|    initBits();
   51|     10|    overrideIllegal();
   52|     10|}
_ZN6icu_786BMPSet8initBitsEv:
  121|     10|void BMPSet::initBits() {
  122|     10|    UChar32 start, limit;
  123|     10|    int32_t listIndex=0;
  124|       |
  125|       |    // Set latin1Contains[].
  126|     48|    do {
  127|     48|        start=list[listIndex++];
  128|     48|        if(listIndex<listLength) {
  ------------------
  |  Branch (128:12): [True: 47, False: 1]
  ------------------
  129|     47|            limit=list[listIndex++];
  130|     47|        } else {
  131|      1|            limit=0x110000;
  132|      1|        }
  133|     48|        if(start>=0x100) {
  ------------------
  |  Branch (133:12): [True: 4, False: 44]
  ------------------
  134|      4|            break;
  135|      4|        }
  136|  1.20k|        do {
  137|  1.20k|            latin1Contains[start++]=1;
  138|  1.20k|        } while(start<limit && start<0x100);
  ------------------
  |  Branch (138:17): [True: 1.16k, False: 38]
  |  Branch (138:32): [True: 1.15k, False: 6]
  ------------------
  139|     44|    } while(limit<=0x100);
  ------------------
  |  Branch (139:13): [True: 38, False: 6]
  ------------------
  140|       |
  141|       |    // Find the first range overlapping with (or after) 80..FF again,
  142|       |    // to include them in table7FF as well.
  143|     40|    for(listIndex=0;;) {
  144|     40|        start=list[listIndex++];
  145|     40|        if(listIndex<listLength) {
  ------------------
  |  Branch (145:12): [True: 39, False: 1]
  ------------------
  146|     39|            limit=list[listIndex++];
  147|     39|        } else {
  148|      1|            limit=0x110000;
  149|      1|        }
  150|     40|        if(limit>0x80) {
  ------------------
  |  Branch (150:12): [True: 10, False: 30]
  ------------------
  151|     10|            if(start<0x80) {
  ------------------
  |  Branch (151:16): [True: 3, False: 7]
  ------------------
  152|      3|                start=0x80;
  153|      3|            }
  154|     10|            break;
  155|     10|        }
  156|     40|    }
  157|       |
  158|       |    // Set table7FF[].
  159|     60|    while(start<0x800) {
  ------------------
  |  Branch (159:11): [True: 55, False: 5]
  ------------------
  160|     55|        set32x64Bits(table7FF, start, limit<=0x800 ? limit : 0x800);
  ------------------
  |  Branch (160:39): [True: 50, False: 5]
  ------------------
  161|     55|        if(limit>0x800) {
  ------------------
  |  Branch (161:12): [True: 5, False: 50]
  ------------------
  162|      5|            start=0x800;
  163|      5|            break;
  164|      5|        }
  165|       |
  166|     50|        start=list[listIndex++];
  167|     50|        if(listIndex<listLength) {
  ------------------
  |  Branch (167:12): [True: 50, False: 0]
  ------------------
  168|     50|            limit=list[listIndex++];
  169|     50|        } else {
  170|      0|            limit=0x110000;
  171|      0|        }
  172|     50|    }
  173|       |
  174|       |    // Set bmpBlockBits[].
  175|     10|    int32_t minStart=0x800;
  176|    429|    while(start<0x10000) {
  ------------------
  |  Branch (176:11): [True: 424, False: 5]
  ------------------
  177|    424|        if(limit>0x10000) {
  ------------------
  |  Branch (177:12): [True: 3, False: 421]
  ------------------
  178|      3|            limit=0x10000;
  179|      3|        }
  180|       |
  181|    424|        if(start<minStart) {
  ------------------
  |  Branch (181:12): [True: 265, False: 159]
  ------------------
  182|    265|            start=minStart;
  183|    265|        }
  184|    424|        if(start<limit) {  // Else: Another range entirely in a known mixed-value block.
  ------------------
  |  Branch (184:12): [True: 199, False: 225]
  ------------------
  185|    199|            if(start&0x3f) {
  ------------------
  |  Branch (185:16): [True: 106, False: 93]
  ------------------
  186|       |                // Mixed-value block of 64 code points.
  187|    106|                start>>=6;
  188|    106|                bmpBlockBits[start&0x3f]|=0x10001<<(start>>6);
  189|    106|                start=(start+1)<<6;  // Round up to the next block boundary.
  190|    106|                minStart=start;      // Ignore further ranges in this block.
  191|    106|            }
  192|    199|            if(start<limit) {
  ------------------
  |  Branch (192:16): [True: 106, False: 93]
  ------------------
  193|    106|                if(start<(limit&~0x3f)) {
  ------------------
  |  Branch (193:20): [True: 32, False: 74]
  ------------------
  194|       |                    // Multiple all-ones blocks of 64 code points each.
  195|     32|                    set32x64Bits(bmpBlockBits, start>>6, limit>>6);
  196|     32|                }
  197|       |
  198|    106|                if(limit&0x3f) {
  ------------------
  |  Branch (198:20): [True: 92, False: 14]
  ------------------
  199|       |                    // Mixed-value block of 64 code points.
  200|     92|                    limit>>=6;
  201|     92|                    bmpBlockBits[limit&0x3f]|=0x10001<<(limit>>6);
  202|     92|                    limit=(limit+1)<<6;  // Round up to the next block boundary.
  203|     92|                    minStart=limit;      // Ignore further ranges in this block.
  204|     92|                }
  205|    106|            }
  206|    199|        }
  207|       |
  208|    424|        if(limit==0x10000) {
  ------------------
  |  Branch (208:12): [True: 5, False: 419]
  ------------------
  209|      5|            break;
  210|      5|        }
  211|       |
  212|    419|        start=list[listIndex++];
  213|    419|        if(listIndex<listLength) {
  ------------------
  |  Branch (213:12): [True: 417, False: 2]
  ------------------
  214|    417|            limit=list[listIndex++];
  215|    417|        } else {
  216|      2|            limit=0x110000;
  217|      2|        }
  218|    419|    }
  219|     10|}
_ZN6icu_786BMPSet15overrideIllegalEv:
  229|     10|void BMPSet::overrideIllegal() {
  230|     10|    uint32_t bits, mask;
  231|     10|    int32_t i;
  232|       |
  233|     10|    if(containsFFFD) {
  ------------------
  |  Branch (233:8): [True: 5, False: 5]
  ------------------
  234|      5|        bits=3;                 // Lead bytes 0xC0 and 0xC1.
  235|    325|        for(i=0; i<64; ++i) {
  ------------------
  |  Branch (235:18): [True: 320, False: 5]
  ------------------
  236|    320|            table7FF[i]|=bits;
  237|    320|        }
  238|       |
  239|      5|        bits=1;                 // Lead byte 0xE0.
  240|    165|        for(i=0; i<32; ++i) {   // First half of 4k block.
  ------------------
  |  Branch (240:18): [True: 160, False: 5]
  ------------------
  241|    160|            bmpBlockBits[i]|=bits;
  242|    160|        }
  243|       |
  244|      5|        mask= static_cast<uint32_t>(~(0x10001<<0xd));   // Lead byte 0xED.
  245|      5|        bits=1<<0xd;
  246|    165|        for(i=32; i<64; ++i) {  // Second half of 4k block.
  ------------------
  |  Branch (246:19): [True: 160, False: 5]
  ------------------
  247|    160|            bmpBlockBits[i]=(bmpBlockBits[i]&mask)|bits;
  248|    160|        }
  249|      5|    } else {
  250|      5|        mask= static_cast<uint32_t>(~(0x10001<<0xd));   // Lead byte 0xED.
  251|    165|        for(i=32; i<64; ++i) {  // Second half of 4k block.
  ------------------
  |  Branch (251:19): [True: 160, False: 5]
  ------------------
  252|    160|            bmpBlockBits[i]&=mask;
  253|    160|        }
  254|      5|    }
  255|     10|}
_ZNK6icu_786BMPSet13findCodePointEiii:
  257|   793k|int32_t BMPSet::findCodePoint(UChar32 c, int32_t lo, int32_t hi) const {
  258|       |    /* Examples:
  259|       |                                       findCodePoint(c)
  260|       |       set              list[]         c=0 1 3 4 7 8
  261|       |       ===              ==============   ===========
  262|       |       []               [110000]         0 0 0 0 0 0
  263|       |       [\u0000-\u0003]  [0, 4, 110000]   1 1 1 2 2 2
  264|       |       [\u0004-\u0007]  [4, 8, 110000]   0 0 0 1 1 2
  265|       |       [:Any:]          [0, 110000]      1 1 1 1 1 1
  266|       |     */
  267|       |
  268|       |    // Return the smallest i such that c < list[i].  Assume
  269|       |    // list[len - 1] == HIGH and that c is legal (0..HIGH-1).
  270|   793k|    if (c < list[lo])
  ------------------
  |  Branch (270:9): [True: 311k, False: 481k]
  ------------------
  271|   311k|        return lo;
  272|       |    // High runner test.  c is often after the last range, so an
  273|       |    // initial check for this condition pays off.
  274|   481k|    if (lo >= hi || c >= list[hi-1])
  ------------------
  |  Branch (274:9): [True: 0, False: 481k]
  |  Branch (274:21): [True: 22.6k, False: 459k]
  ------------------
  275|  22.6k|        return hi;
  276|       |    // invariant: c >= list[lo]
  277|       |    // invariant: c < list[hi]
  278|  1.56M|    for (;;) {
  279|  1.56M|        int32_t i = (lo + hi) >> 1;
  280|  1.56M|        if (i == lo) {
  ------------------
  |  Branch (280:13): [True: 459k, False: 1.10M]
  ------------------
  281|   459k|            break; // Found!
  282|  1.10M|        } else if (c < list[i]) {
  ------------------
  |  Branch (282:20): [True: 640k, False: 467k]
  ------------------
  283|   640k|            hi = i;
  284|   640k|        } else {
  285|   467k|            lo = i;
  286|   467k|        }
  287|  1.56M|    }
  288|   459k|    return hi;
  289|   481k|}
_ZNK6icu_786BMPSet8containsEi:
  292|  51.8M|BMPSet::contains(UChar32 c) const {
  293|  51.8M|    if (static_cast<uint32_t>(c) <= 0xff) {
  ------------------
  |  Branch (293:9): [True: 7.72M, False: 44.1M]
  ------------------
  294|  7.72M|        return latin1Contains[c];
  295|  44.1M|    } else if (static_cast<uint32_t>(c) <= 0x7ff) {
  ------------------
  |  Branch (295:16): [True: 230k, False: 43.9M]
  ------------------
  296|   230k|        return (table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0;
  297|  43.9M|    } else if (static_cast<uint32_t>(c) < 0xd800 || (c >= 0xe000 && c <= 0xffff)) {
  ------------------
  |  Branch (297:16): [True: 40.0M, False: 3.90M]
  |  Branch (297:54): [True: 3.62M, False: 286k]
  |  Branch (297:69): [True: 3.60M, False: 22.8k]
  ------------------
  298|  43.6M|        int lead=c>>12;
  299|  43.6M|        uint32_t twoBits=(bmpBlockBits[(c>>6)&0x3f]>>lead)&0x10001;
  300|  43.6M|        if(twoBits<=1) {
  ------------------
  |  Branch (300:12): [True: 43.1M, False: 484k]
  ------------------
  301|       |            // All 64 code points with the same bits 15..6
  302|       |            // are either in the set or not.
  303|  43.1M|            return twoBits;
  304|  43.1M|        } else {
  305|       |            // Look up the code point in its 4k block of code points.
  306|   484k|            return containsSlow(c, list4kStarts[lead], list4kStarts[lead+1]);
  307|   484k|        }
  308|  43.6M|    } else if (static_cast<uint32_t>(c) <= 0x10ffff) {
  ------------------
  |  Branch (308:16): [True: 308k, False: 0]
  ------------------
  309|       |        // surrogate or supplementary code point
  310|   308k|        return containsSlow(c, list4kStarts[0xd], list4kStarts[0x11]);
  311|   308k|    } else {
  312|       |        // Out-of-range code points get false, consistent with long-standing
  313|       |        // behavior of UnicodeSet::contains(c).
  314|      0|        return false;
  315|      0|    }
  316|  51.8M|}
bmpset.cpp:_ZN6icu_78L12set32x64BitsEPjii:
   70|     87|static void set32x64Bits(uint32_t table[64], int32_t start, int32_t limit) {
   71|     87|    U_ASSERT(start<limit);
  ------------------
  |  |   35|     87|#   define U_ASSERT(exp) (void)0
  ------------------
   72|     87|    U_ASSERT(limit<=0x800);
  ------------------
  |  |   35|     87|#   define U_ASSERT(exp) (void)0
  ------------------
   73|       |
   74|     87|    int32_t lead=start>>6;  // Named for UTF-8 2-byte lead byte with upper 5 bits.
   75|     87|    int32_t trail=start&0x3f;  // Named for UTF-8 2-byte trail byte with lower 6 bits.
   76|       |
   77|       |    // Set one bit indicating an all-one block.
   78|     87|    uint32_t bits = static_cast<uint32_t>(1) << lead;
   79|     87|    if((start+1)==limit) {  // Single-character shortcut.
  ------------------
  |  Branch (79:8): [True: 21, False: 66]
  ------------------
   80|     21|        table[trail]|=bits;
   81|     21|        return;
   82|     21|    }
   83|       |
   84|     66|    int32_t limitLead=limit>>6;
   85|     66|    int32_t limitTrail=limit&0x3f;
   86|       |
   87|     66|    if(lead==limitLead) {
  ------------------
  |  Branch (87:8): [True: 33, False: 33]
  ------------------
   88|       |        // Partial vertical bit column.
   89|    328|        while(trail<limitTrail) {
  ------------------
  |  Branch (89:15): [True: 295, False: 33]
  ------------------
   90|    295|            table[trail++]|=bits;
   91|    295|        }
   92|     33|    } else {
   93|       |        // Partial vertical bit column,
   94|       |        // followed by a bit rectangle,
   95|       |        // followed by another partial vertical bit column.
   96|     33|        if(trail>0) {
  ------------------
  |  Branch (96:12): [True: 28, False: 5]
  ------------------
   97|    996|            do {
   98|    996|                table[trail++]|=bits;
   99|    996|            } while(trail<64);
  ------------------
  |  Branch (99:21): [True: 968, False: 28]
  ------------------
  100|     28|            ++lead;
  101|     28|        }
  102|     33|        if(lead<limitLead) {
  ------------------
  |  Branch (102:12): [True: 21, False: 12]
  ------------------
  103|     21|            bits = ~((static_cast<unsigned>(1) << lead) - 1);
  104|     21|            if(limitLead<0x20) {
  ------------------
  |  Branch (104:16): [True: 16, False: 5]
  ------------------
  105|     16|                bits &= (static_cast<unsigned>(1) << limitLead) - 1;
  106|     16|            }
  107|  1.36k|            for(trail=0; trail<64; ++trail) {
  ------------------
  |  Branch (107:26): [True: 1.34k, False: 21]
  ------------------
  108|  1.34k|                table[trail]|=bits;
  109|  1.34k|            }
  110|     21|        }
  111|       |        // limit<=0x800. If limit==0x800 then limitLead=32 and limitTrail=0.
  112|       |        // In that case, bits=1<<limitLead is undefined but the bits value
  113|       |        // is not used because trail<limitTrail is already false.
  114|     33|        bits = static_cast<uint32_t>(1) << ((limitLead == 0x20) ? (limitLead - 1) : limitLead);
  ------------------
  |  Branch (114:45): [True: 5, False: 28]
  ------------------
  115|    625|        for(trail=0; trail<limitTrail; ++trail) {
  ------------------
  |  Branch (115:22): [True: 592, False: 33]
  ------------------
  116|    592|            table[trail]|=bits;
  117|    592|        }
  118|     33|    }
  119|     66|}

_ZNK6icu_786BMPSet12containsSlowEiii:
  158|   793k|inline UBool BMPSet::containsSlow(UChar32 c, int32_t lo, int32_t hi) const {
  159|   793k|    return findCodePoint(c, lo, hi) & 1;
  160|   793k|}

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

locid.cpp:_ZN6icu_7812ByteSinkUtil28viaByteSinkToTerminatedCharsIZZNS_6Locale4initENS_11StringPieceEaENK3$_0clENSt3__117basic_string_viewIcNS5_11char_traitsIcEEEEPciR10UErrorCodeEUlRNS_8ByteSinkESC_E_vEEiSA_iOT_SC_:
  112|  90.0k|                                                UErrorCode& status) {
  113|  90.0k|        if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (113:13): [True: 0, False: 90.0k]
  ------------------
  114|  90.0k|        CheckedArrayByteSink sink(buffer, capacity);
  115|  90.0k|        lambda(sink, status);
  116|  90.0k|        if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (116:13): [True: 0, False: 90.0k]
  ------------------
  117|       |
  118|  90.0k|        int32_t reslen = sink.NumberOfBytesAppended();
  119|       |
  120|  90.0k|        if (sink.Overflowed()) {
  ------------------
  |  Branch (120:13): [True: 0, False: 90.0k]
  ------------------
  121|      0|            status = U_BUFFER_OVERFLOW_ERROR;
  122|      0|            return reslen;
  123|      0|        }
  124|       |
  125|  90.0k|        return u_terminateChars(buffer, capacity, reslen, &status);
  ------------------
  |  |  406|  90.0k|#define u_terminateChars U_ICU_ENTRY_POINT_RENAME(u_terminateChars)
  |  |  ------------------
  |  |  |  |  123|  90.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  90.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  90.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  126|  90.0k|    }
loclikely.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ27ulocimp_addLikelySubtags_78PKcR10UErrorCodeE3$_0vEENS_10CharStringEOT_S5_:
  141|      2|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|      2|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 2]
  ------------------
  143|      2|        CharString result;
  144|      2|        CharStringByteSink sink(&result);
  145|      2|        lambda(sink, status);
  146|      2|        return result;
  147|      2|    }
loclikely.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ26ulocimp_minimizeSubtags_78PKcbR10UErrorCodeE3$_0vEENS_10CharStringEOT_S5_:
  141|      3|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|      3|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 3]
  ------------------
  143|      3|        CharString result;
  144|      3|        CharStringByteSink sink(&result);
  145|      3|        lambda(sink, status);
  146|      3|        return result;
  147|      3|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil28viaByteSinkToTerminatedCharsIZ23uloc_getKeywordValue_78E3$_0vEEiPciOT_R10UErrorCode:
  112|   102k|                                                UErrorCode& status) {
  113|   102k|        if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (113:13): [True: 0, False: 102k]
  ------------------
  114|   102k|        CheckedArrayByteSink sink(buffer, capacity);
  115|   102k|        lambda(sink, status);
  116|   102k|        if (U_FAILURE(status)) { return 0; }
  ------------------
  |  Branch (116:13): [True: 0, False: 102k]
  ------------------
  117|       |
  118|   102k|        int32_t reslen = sink.NumberOfBytesAppended();
  119|       |
  120|   102k|        if (sink.Overflowed()) {
  ------------------
  |  Branch (120:13): [True: 0, False: 102k]
  ------------------
  121|      0|            status = U_BUFFER_OVERFLOW_ERROR;
  122|      0|            return reslen;
  123|      0|        }
  124|       |
  125|   102k|        return u_terminateChars(buffer, capacity, reslen, &status);
  ------------------
  |  |  406|   102k|#define u_terminateChars U_ICU_ENTRY_POINT_RENAME(u_terminateChars)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  126|   102k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ26ulocimp_getKeywordValue_78PKcNSt3__117basic_string_viewIcNS4_11char_traitsIcEEEER10UErrorCodeE3$_0vEENS_10CharStringEOT_SA_:
  141|  99.1k|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|  99.1k|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 99.1k]
  ------------------
  143|  99.1k|        CharString result;
  144|  99.1k|        CharStringByteSink sink(&result);
  145|  99.1k|        lambda(sink, status);
  146|  99.1k|        return result;
  147|  99.1k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ20ulocimp_getRegion_78NSt3__117basic_string_viewIcNS2_11char_traitsIcEEEER10UErrorCodeE3$_0vEENS_10CharStringEOT_S8_:
  141|  46.5k|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|  46.5k|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 46.5k]
  ------------------
  143|  46.5k|        CharString result;
  144|  46.5k|        CharStringByteSink sink(&result);
  145|  46.5k|        lambda(sink, status);
  146|  46.5k|        return result;
  147|  46.5k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ20ulocimp_getParent_78PKcR10UErrorCodeE3$_0vEENS_10CharStringEOT_S5_:
  141|  66.9k|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|  66.9k|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 66.9k]
  ------------------
  143|  66.9k|        CharString result;
  144|  66.9k|        CharStringByteSink sink(&result);
  145|  66.9k|        lambda(sink, status);
  146|  66.9k|        return result;
  147|  66.9k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ18ulocimp_getName_78NSt3__117basic_string_viewIcNS2_11char_traitsIcEEEER10UErrorCodeE3$_0vEENS_10CharStringEOT_S8_:
  141|  44.4k|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|  44.4k|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 44.4k]
  ------------------
  143|  44.4k|        CharString result;
  144|  44.4k|        CharStringByteSink sink(&result);
  145|  44.4k|        lambda(sink, status);
  146|  44.4k|        return result;
  147|  44.4k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS2_11char_traitsIcEEEER10UErrorCodeE3$_0vEENS_10CharStringEOT_S8_:
  141|   413k|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|   413k|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 413k]
  ------------------
  143|   413k|        CharString result;
  144|   413k|        CharStringByteSink sink(&result);
  145|   413k|        lambda(sink, status);
  146|   413k|        return result;
  147|   413k|    }
uloc.cpp:_ZN6icu_7812ByteSinkUtil23viaByteSinkToCharStringIZ23ulocimp_canonicalize_78NSt3__117basic_string_viewIcNS2_11char_traitsIcEEEER10UErrorCodeE3$_0vEENS_10CharStringEOT_S8_:
  141|      8|    static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) {
  142|      8|        if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (142:13): [True: 0, False: 8]
  ------------------
  143|      8|        CharString result;
  144|      8|        CharStringByteSink sink(&result);
  145|      8|        lambda(sink, status);
  146|      8|        return result;
  147|      8|    }

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

_ZN6icu_789BytesTrieD2Ev:
   26|     10|BytesTrie::~BytesTrie() {
   27|     10|    uprv_free(ownedArray_);
  ------------------
  |  | 1503|     10|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   28|     10|}
_ZN6icu_789BytesTrie9readValueEPKhi:
   32|     11|BytesTrie::readValue(const uint8_t *pos, int32_t leadByte) {
   33|     11|    int32_t value;
   34|     11|    if(leadByte<kMinTwoByteValueLead) {
  ------------------
  |  Branch (34:8): [True: 1, False: 10]
  ------------------
   35|      1|        value=leadByte-kMinOneByteValueLead;
   36|     10|    } else if(leadByte<kMinThreeByteValueLead) {
  ------------------
  |  Branch (36:15): [True: 10, False: 0]
  ------------------
   37|     10|        value=((leadByte-kMinTwoByteValueLead)<<8)|*pos;
   38|     10|    } else if(leadByte<kFourByteValueLead) {
  ------------------
  |  Branch (38:15): [True: 0, False: 0]
  ------------------
   39|      0|        value=((leadByte-kMinThreeByteValueLead)<<16)|(pos[0]<<8)|pos[1];
   40|      0|    } else if(leadByte==kFourByteValueLead) {
  ------------------
  |  Branch (40:15): [True: 0, False: 0]
  ------------------
   41|      0|        value=(pos[0]<<16)|(pos[1]<<8)|pos[2];
   42|      0|    } else {
   43|      0|        value=(pos[0]<<24)|(pos[1]<<16)|(pos[2]<<8)|pos[3];
   44|      0|    }
   45|     11|    return value;
   46|     11|}
_ZN6icu_789BytesTrie11jumpByDeltaEPKh:
   49|     79|BytesTrie::jumpByDelta(const uint8_t *pos) {
   50|     79|    int32_t delta=*pos++;
   51|     79|    if(delta<kMinTwoByteDeltaLead) {
  ------------------
  |  Branch (51:8): [True: 11, False: 68]
  ------------------
   52|       |        // nothing to do
   53|     68|    } else if(delta<kMinThreeByteDeltaLead) {
  ------------------
  |  Branch (53:15): [True: 52, False: 16]
  ------------------
   54|     52|        delta=((delta-kMinTwoByteDeltaLead)<<8)|*pos++;
   55|     52|    } else if(delta<kFourByteDeltaLead) {
  ------------------
  |  Branch (55:15): [True: 16, False: 0]
  ------------------
   56|     16|        delta=((delta-kMinThreeByteDeltaLead)<<16)|(pos[0]<<8)|pos[1];
   57|     16|        pos+=2;
   58|     16|    } else if(delta==kFourByteDeltaLead) {
  ------------------
  |  Branch (58:15): [True: 0, False: 0]
  ------------------
   59|      0|        delta=(pos[0]<<16)|(pos[1]<<8)|pos[2];
   60|      0|        pos+=3;
   61|      0|    } else {
   62|      0|        delta=(pos[0]<<24)|(pos[1]<<16)|(pos[2]<<8)|pos[3];
   63|      0|        pos+=4;
   64|      0|    }
   65|     79|    return pos+delta;
   66|     79|}
_ZN6icu_789BytesTrie10branchNextEPKhii:
   81|     52|BytesTrie::branchNext(const uint8_t *pos, int32_t length, int32_t inByte) {
   82|       |    // Branch according to the current byte.
   83|     52|    if(length==0) {
  ------------------
  |  Branch (83:8): [True: 43, False: 9]
  ------------------
   84|     43|        length=*pos++;
   85|     43|    }
   86|     52|    ++length;
   87|       |    // The length of the branch is the number of bytes to select from.
   88|       |    // The data structure encodes a binary search.
   89|    186|    while(length>kMaxBranchLinearSubNodeLength) {
  ------------------
  |  Branch (89:11): [True: 134, False: 52]
  ------------------
   90|    134|        if(inByte<*pos++) {
  ------------------
  |  Branch (90:12): [True: 79, False: 55]
  ------------------
   91|     79|            length>>=1;
   92|     79|            pos=jumpByDelta(pos);
   93|     79|        } else {
   94|     55|            length=length-(length>>1);
   95|     55|            pos=skipDelta(pos);
   96|     55|        }
   97|    134|    }
   98|       |    // Drop down to linear search for the last few bytes.
   99|       |    // length>=2 because the loop body above sees length>kMaxBranchLinearSubNodeLength>=3
  100|       |    // and divides length by 2.
  101|     92|    do {
  102|     92|        if(inByte==*pos++) {
  ------------------
  |  Branch (102:12): [True: 38, False: 54]
  ------------------
  103|     38|            UStringTrieResult result;
  104|     38|            int32_t node=*pos;
  105|     38|            U_ASSERT(node>=kMinValueLead);
  ------------------
  |  |   35|     38|#   define U_ASSERT(exp) (void)0
  ------------------
  106|     38|            if(node&kValueIsFinal) {
  ------------------
  |  Branch (106:16): [True: 9, False: 29]
  ------------------
  107|       |                // Leave the final value for getValue() to read.
  108|      9|                result=USTRINGTRIE_FINAL_VALUE;
  109|     29|            } else {
  110|       |                // Use the non-final value as the jump delta.
  111|     29|                ++pos;
  112|       |                // int32_t delta=readValue(pos, node>>1);
  113|     29|                node>>=1;
  114|     29|                int32_t delta;
  115|     29|                if(node<kMinTwoByteValueLead) {
  ------------------
  |  Branch (115:20): [True: 1, False: 28]
  ------------------
  116|      1|                    delta=node-kMinOneByteValueLead;
  117|     28|                } else if(node<kMinThreeByteValueLead) {
  ------------------
  |  Branch (117:27): [True: 28, False: 0]
  ------------------
  118|     28|                    delta=((node-kMinTwoByteValueLead)<<8)|*pos++;
  119|     28|                } else if(node<kFourByteValueLead) {
  ------------------
  |  Branch (119:27): [True: 0, False: 0]
  ------------------
  120|      0|                    delta=((node-kMinThreeByteValueLead)<<16)|(pos[0]<<8)|pos[1];
  121|      0|                    pos+=2;
  122|      0|                } else if(node==kFourByteValueLead) {
  ------------------
  |  Branch (122:27): [True: 0, False: 0]
  ------------------
  123|      0|                    delta=(pos[0]<<16)|(pos[1]<<8)|pos[2];
  124|      0|                    pos+=3;
  125|      0|                } else {
  126|      0|                    delta=(pos[0]<<24)|(pos[1]<<16)|(pos[2]<<8)|pos[3];
  127|      0|                    pos+=4;
  128|      0|                }
  129|       |                // end readValue()
  130|     29|                pos+=delta;
  131|     29|                node=*pos;
  132|     29|                result= node>=kMinValueLead ? valueResult(node) : USTRINGTRIE_NO_VALUE;
  ------------------
  |  Branch (132:25): [True: 2, False: 27]
  ------------------
  133|     29|            }
  134|     38|            pos_=pos;
  135|     38|            return result;
  136|     38|        }
  137|     54|        --length;
  138|     54|        pos=skipValue(pos);
  139|     54|    } while(length>1);
  ------------------
  |  Branch (139:13): [True: 40, False: 14]
  ------------------
  140|     14|    if(inByte==*pos++) {
  ------------------
  |  Branch (140:8): [True: 14, False: 0]
  ------------------
  141|     14|        pos_=pos;
  142|     14|        int32_t node=*pos;
  143|     14|        return node>=kMinValueLead ? valueResult(node) : USTRINGTRIE_NO_VALUE;
  ------------------
  |  Branch (143:16): [True: 0, False: 14]
  ------------------
  144|     14|    } else {
  145|      0|        stop();
  146|      0|        return USTRINGTRIE_NO_MATCH;
  147|      0|    }
  148|     14|}
_ZN6icu_789BytesTrie8nextImplEPKhi:
  151|     54|BytesTrie::nextImpl(const uint8_t *pos, int32_t inByte) {
  152|     56|    for(;;) {
  153|     56|        int32_t node=*pos++;
  154|     56|        if(node<kMinLinearMatch) {
  ------------------
  |  Branch (154:12): [True: 52, False: 4]
  ------------------
  155|     52|            return branchNext(pos, node, inByte);
  156|     52|        } else if(node<kMinValueLead) {
  ------------------
  |  Branch (156:19): [True: 2, False: 2]
  ------------------
  157|       |            // Match the first of length+1 bytes.
  158|      2|            int32_t length=node-kMinLinearMatch;  // Actual match length minus 1.
  159|      2|            if(inByte==*pos++) {
  ------------------
  |  Branch (159:16): [True: 2, False: 0]
  ------------------
  160|      2|                remainingMatchLength_=--length;
  161|      2|                pos_=pos;
  162|      2|                return (length<0 && (node=*pos)>=kMinValueLead) ?
  ------------------
  |  Branch (162:25): [True: 0, False: 2]
  |  Branch (162:37): [True: 0, False: 0]
  ------------------
  163|      2|                        valueResult(node) : USTRINGTRIE_NO_VALUE;
  164|      2|            } else {
  165|       |                // No match.
  166|      0|                break;
  167|      0|            }
  168|      2|        } else if(node&kValueIsFinal) {
  ------------------
  |  Branch (168:19): [True: 0, False: 2]
  ------------------
  169|       |            // No further matching bytes.
  170|      0|            break;
  171|      2|        } else {
  172|       |            // Skip intermediate value.
  173|      2|            pos=skipValue(pos, node);
  174|       |            // The next node must not also be a value node.
  175|      2|            U_ASSERT(*pos<kMinValueLead);
  ------------------
  |  |   35|      2|#   define U_ASSERT(exp) (void)0
  ------------------
  176|      2|        }
  177|     56|    }
  178|      0|    stop();
  179|      0|    return USTRINGTRIE_NO_MATCH;
  180|     54|}
_ZN6icu_789BytesTrie4nextEi:
  183|     60|BytesTrie::next(int32_t inByte) {
  184|     60|    const uint8_t *pos=pos_;
  185|     60|    if(pos==nullptr) {
  ------------------
  |  Branch (185:8): [True: 0, False: 60]
  ------------------
  186|      0|        return USTRINGTRIE_NO_MATCH;
  187|      0|    }
  188|     60|    if(inByte<0) {
  ------------------
  |  Branch (188:8): [True: 0, False: 60]
  ------------------
  189|      0|        inByte+=0x100;
  190|      0|    }
  191|     60|    int32_t length=remainingMatchLength_;  // Actual remaining match length minus 1.
  192|     60|    if(length>=0) {
  ------------------
  |  Branch (192:8): [True: 6, False: 54]
  ------------------
  193|       |        // Remaining part of a linear-match node.
  194|      6|        if(inByte==*pos++) {
  ------------------
  |  Branch (194:12): [True: 6, False: 0]
  ------------------
  195|      6|            remainingMatchLength_=--length;
  196|      6|            pos_=pos;
  197|      6|            int32_t node;
  198|      6|            return (length<0 && (node=*pos)>=kMinValueLead) ?
  ------------------
  |  Branch (198:21): [True: 2, False: 4]
  |  Branch (198:33): [True: 2, False: 0]
  ------------------
  199|      4|                    valueResult(node) : USTRINGTRIE_NO_VALUE;
  200|      6|        } else {
  201|      0|            stop();
  202|      0|            return USTRINGTRIE_NO_MATCH;
  203|      0|        }
  204|      6|    }
  205|     54|    return nextImpl(pos, inByte);
  206|     60|}

_ZN6icu_7819CharacterProperties24getInclusionsForPropertyE9UPropertyR10UErrorCode:
  267|      2|        UProperty prop, UErrorCode &errorCode) {
  268|      2|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (268:9): [True: 0, False: 2]
  ------------------
  269|      2|    if (UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT) {
  ------------------
  |  Branch (269:9): [True: 2, False: 0]
  |  Branch (269:36): [True: 0, False: 2]
  ------------------
  270|      0|        int32_t inclIndex = UPROPS_SRC_COUNT + (prop - UCHAR_INT_START);
  271|      0|        Inclusion &i = gInclusions[inclIndex];
  272|      0|        umtx_initOnce(i.fInitOnce, &initIntPropInclusion, prop, errorCode);
  273|      0|        return i.fSet;
  274|      2|    } else {
  275|      2|        UPropertySource src = uprops_getSource(prop);
  ------------------
  |  | 1392|      2|#define uprops_getSource U_ICU_ENTRY_POINT_RENAME(uprops_getSource)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  276|      2|        return getInclusionsForSource(src, errorCode);
  277|      2|    }
  278|      2|}
characterproperties.cpp:_ZN12_GLOBAL__N_122getInclusionsForSourceE15UPropertySourceR10UErrorCode:
  211|      2|const UnicodeSet *getInclusionsForSource(UPropertySource src, UErrorCode &errorCode) {
  212|      2|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (212:9): [True: 0, False: 2]
  ------------------
  213|      2|    if (src < 0 || UPROPS_SRC_COUNT <= src) {
  ------------------
  |  Branch (213:9): [True: 0, False: 2]
  |  Branch (213:20): [True: 0, False: 2]
  ------------------
  214|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  215|      0|        return nullptr;
  216|      0|    }
  217|      2|    Inclusion &i = gInclusions[src];
  218|      2|    umtx_initOnce(i.fInitOnce, &initInclusion, src, errorCode);
  219|      2|    return i.fSet;
  220|      2|}
characterproperties.cpp:_ZN12_GLOBAL__N_113initInclusionE15UPropertySourceR10UErrorCode:
   91|      1|void U_CALLCONV initInclusion(UPropertySource src, UErrorCode &errorCode) {
   92|       |    // This function is invoked only via umtx_initOnce().
   93|      1|    U_ASSERT(0 <= src && src < UPROPS_SRC_COUNT);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
   94|      1|    if (src == UPROPS_SRC_NONE) {
  ------------------
  |  Branch (94:9): [True: 0, False: 1]
  ------------------
   95|      0|        errorCode = U_INTERNAL_PROGRAM_ERROR;
   96|      0|        return;
   97|      0|    }
   98|      1|    U_ASSERT(gInclusions[src].fSet == nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
   99|       |
  100|      1|    LocalPointer<UnicodeSet> incl(new UnicodeSet());
  101|      1|    if (incl.isNull()) {
  ------------------
  |  Branch (101:9): [True: 0, False: 1]
  ------------------
  102|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
  103|      0|        return;
  104|      0|    }
  105|      1|    USetAdder sa = {
  106|      1|        reinterpret_cast<USet*>(incl.getAlias()),
  107|      1|        _set_add,
  108|      1|        _set_addRange,
  109|      1|        _set_addString,
  110|      1|        nullptr, // don't need remove()
  111|      1|        nullptr // don't need removeRange()
  112|      1|    };
  113|       |
  114|      1|    switch(src) {
  115|      1|    case UPROPS_SRC_CHAR:
  ------------------
  |  Branch (115:5): [True: 1, False: 0]
  ------------------
  116|      1|        uchar_addPropertyStarts(&sa, &errorCode);
  ------------------
  |  |  614|      1|#define uchar_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(uchar_addPropertyStarts)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  117|      1|        break;
  118|      0|    case UPROPS_SRC_PROPSVEC:
  ------------------
  |  Branch (118:5): [True: 0, False: 1]
  ------------------
  119|      0|        upropsvec_addPropertyStarts(&sa, &errorCode);
  ------------------
  |  | 1393|      0|#define upropsvec_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(upropsvec_addPropertyStarts)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  120|      0|        break;
  121|      0|    case UPROPS_SRC_CHAR_AND_PROPSVEC:
  ------------------
  |  Branch (121:5): [True: 0, False: 1]
  ------------------
  122|      0|        uchar_addPropertyStarts(&sa, &errorCode);
  ------------------
  |  |  614|      0|#define uchar_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(uchar_addPropertyStarts)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  123|      0|        upropsvec_addPropertyStarts(&sa, &errorCode);
  ------------------
  |  | 1393|      0|#define upropsvec_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(upropsvec_addPropertyStarts)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  124|      0|        break;
  125|      0|#if !UCONFIG_NO_NORMALIZATION
  126|      0|    case UPROPS_SRC_CASE_AND_NORM: {
  ------------------
  |  Branch (126:5): [True: 0, False: 1]
  ------------------
  127|      0|        const Normalizer2Impl *impl=Normalizer2Factory::getNFCImpl(errorCode);
  128|      0|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (128:12): [True: 0, False: 0]
  ------------------
  129|      0|            impl->addPropertyStarts(&sa, errorCode);
  130|      0|        }
  131|      0|        ucase_addPropertyStarts(&sa, &errorCode);
  ------------------
  |  |  568|      0|#define ucase_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(ucase_addPropertyStarts)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|      0|        break;
  133|      0|    }
  134|      0|    case UPROPS_SRC_NFC: {
  ------------------
  |  Branch (134:5): [True: 0, False: 1]
  ------------------
  135|      0|        const Normalizer2Impl *impl=Normalizer2Factory::getNFCImpl(errorCode);
  136|      0|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (136:12): [True: 0, False: 0]
  ------------------
  137|      0|            impl->addPropertyStarts(&sa, errorCode);
  138|      0|        }
  139|      0|        break;
  140|      0|    }
  141|      0|    case UPROPS_SRC_NFKC: {
  ------------------
  |  Branch (141:5): [True: 0, False: 1]
  ------------------
  142|      0|        const Normalizer2Impl *impl=Normalizer2Factory::getNFKCImpl(errorCode);
  143|      0|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (143:12): [True: 0, False: 0]
  ------------------
  144|      0|            impl->addPropertyStarts(&sa, errorCode);
  145|      0|        }
  146|      0|        break;
  147|      0|    }
  148|      0|    case UPROPS_SRC_NFKC_CF: {
  ------------------
  |  Branch (148:5): [True: 0, False: 1]
  ------------------
  149|      0|        const Normalizer2Impl *impl=Normalizer2Factory::getNFKC_CFImpl(errorCode);
  150|      0|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (150:12): [True: 0, False: 0]
  ------------------
  151|      0|            impl->addPropertyStarts(&sa, errorCode);
  152|      0|        }
  153|      0|        break;
  154|      0|    }
  155|      0|    case UPROPS_SRC_NFC_CANON_ITER: {
  ------------------
  |  Branch (155:5): [True: 0, False: 1]
  ------------------
  156|      0|        const Normalizer2Impl *impl=Normalizer2Factory::getNFCImpl(errorCode);
  157|      0|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (157:12): [True: 0, False: 0]
  ------------------
  158|      0|            impl->addCanonIterPropertyStarts(&sa, errorCode);
  159|      0|        }
  160|      0|        break;
  161|      0|    }
  162|      0|#endif
  163|      0|    case UPROPS_SRC_CASE:
  ------------------
  |  Branch (163:5): [True: 0, False: 1]
  ------------------
  164|      0|        ucase_addPropertyStarts(&sa, &errorCode);
  ------------------
  |  |  568|      0|#define ucase_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(ucase_addPropertyStarts)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  165|      0|        break;
  166|      0|    case UPROPS_SRC_BIDI:
  ------------------
  |  Branch (166:5): [True: 0, False: 1]
  ------------------
  167|      0|        ubidi_addPropertyStarts(&sa, &errorCode);
  ------------------
  |  |  435|      0|#define ubidi_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(ubidi_addPropertyStarts)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|      0|        break;
  169|      0|    case UPROPS_SRC_INPC:
  ------------------
  |  Branch (169:5): [True: 0, False: 1]
  ------------------
  170|      0|    case UPROPS_SRC_INSC:
  ------------------
  |  Branch (170:5): [True: 0, False: 1]
  ------------------
  171|      0|    case UPROPS_SRC_VO:
  ------------------
  |  Branch (171:5): [True: 0, False: 1]
  ------------------
  172|      0|        uprops_addPropertyStarts(src, &sa, &errorCode);
  ------------------
  |  | 1391|      0|#define uprops_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(uprops_addPropertyStarts)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  173|      0|        break;
  174|      0|    case UPROPS_SRC_EMOJI: {
  ------------------
  |  Branch (174:5): [True: 0, False: 1]
  ------------------
  175|      0|        const icu::EmojiProps *ep = icu::EmojiProps::getSingleton(errorCode);
  176|      0|        if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (176:13): [True: 0, False: 0]
  ------------------
  177|      0|            ep->addPropertyStarts(&sa, errorCode);
  178|      0|        }
  179|      0|        break;
  180|      0|    }
  181|      0|    case UPROPS_SRC_IDSU:
  ------------------
  |  Branch (181:5): [True: 0, False: 1]
  ------------------
  182|       |        // New in Unicode 15.1 for just two characters.
  183|      0|        sa.add(sa.set, 0x2FFE);
  184|      0|        sa.add(sa.set, 0x2FFF + 1);
  185|      0|        break;
  186|      0|    case UPROPS_SRC_ID_COMPAT_MATH:
  ------------------
  |  Branch (186:5): [True: 0, False: 1]
  ------------------
  187|      0|    case UPROPS_SRC_MCM:
  ------------------
  |  Branch (187:5): [True: 0, False: 1]
  ------------------
  188|      0|        uprops_addPropertyStarts(src, &sa, &errorCode);
  ------------------
  |  | 1391|      0|#define uprops_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(uprops_addPropertyStarts)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|      0|        break;
  190|      0|    case UPROPS_SRC_BLOCK:
  ------------------
  |  Branch (190:5): [True: 0, False: 1]
  ------------------
  191|      0|        ublock_addPropertyStarts(&sa, errorCode);
  ------------------
  |  |  493|      0|#define ublock_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(ublock_addPropertyStarts)
  |  |  ------------------
  |  |  |  |  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|        break;
  193|      0|    default:
  ------------------
  |  Branch (193:5): [True: 0, False: 1]
  ------------------
  194|      0|        errorCode = U_INTERNAL_PROGRAM_ERROR;
  195|      0|        break;
  196|      1|    }
  197|       |
  198|      1|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (198:9): [True: 0, False: 1]
  ------------------
  199|      0|        return;
  200|      0|    }
  201|      1|    if (incl->isBogus()) {
  ------------------
  |  Branch (201:9): [True: 0, False: 1]
  ------------------
  202|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
  203|      0|        return;
  204|      0|    }
  205|       |    // Compact for caching.
  206|      1|    incl->compact();
  207|      1|    gInclusions[src].fSet = incl.orphan();
  208|      1|    ucln_common_registerCleanup(UCLN_COMMON_CHARACTERPROPERTIES, characterproperties_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  209|      1|}
characterproperties.cpp:_ZN12_GLOBAL__N_18_set_addEP4USeti:
   60|  6.02k|_set_add(USet *set, UChar32 c) {
   61|  6.02k|    reinterpret_cast<UnicodeSet*>(set)->add(c);
   62|  6.02k|}

_ZN6icu_7810CharStringC2EOS0_:
   30|   201k|        : buffer(std::move(src.buffer)), len(src.len) {
   31|   201k|    src.len = 0;  // not strictly necessary because we make no guarantees on the source string
   32|   201k|}
_ZN6icu_7810CharStringaSEOS0_:
   34|   177k|CharString& CharString::operator=(CharString&& src) noexcept {
   35|   177k|    buffer = std::move(src.buffer);
   36|   177k|    len = src.len;
   37|   177k|    src.len = 0;  // not strictly necessary because we make no guarantees on the source string
   38|   177k|    return *this;
   39|   177k|}
_ZNK6icu_7810CharString9cloneDataER10UErrorCode:
   41|      8|char *CharString::cloneData(UErrorCode &errorCode) const {
   42|      8|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (42:9): [True: 0, False: 8]
  ------------------
   43|      8|    char *p = static_cast<char *>(uprv_malloc(len + 1));
  ------------------
  |  | 1524|      8|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      8|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      8|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      8|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   44|      8|    if (p == nullptr) {
  ------------------
  |  Branch (44:9): [True: 0, False: 8]
  ------------------
   45|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
   46|      0|        return nullptr;
   47|      0|    }
   48|      8|    uprv_memcpy(p, buffer.getAlias(), len + 1);
  ------------------
  |  |   42|      8|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      8|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      8|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      8|    _Pragma("clang diagnostic push") \
  |  |   45|      8|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      8|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      8|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      8|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      8|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      8|    _Pragma("clang diagnostic pop") \
  |  |   49|      8|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      8|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      8|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      8|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   49|      8|    return p;
   50|      8|}
_ZNK6icu_7810CharString7extractEPciR10UErrorCode:
   52|  4.08k|int32_t CharString::extract(char *dest, int32_t capacity, UErrorCode &errorCode) const {
   53|  4.08k|    if (U_FAILURE(errorCode)) { return len; }
  ------------------
  |  Branch (53:9): [True: 0, False: 4.08k]
  ------------------
   54|  4.08k|    if (capacity < 0 || (capacity > 0 && dest == nullptr)) {
  ------------------
  |  Branch (54:9): [True: 0, False: 4.08k]
  |  Branch (54:26): [True: 4.08k, False: 0]
  |  Branch (54:42): [True: 0, False: 4.08k]
  ------------------
   55|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
   56|      0|        return len;
   57|      0|    }
   58|  4.08k|    const char *src = buffer.getAlias();
   59|  4.08k|    if (0 < len && len <= capacity && src != dest) {
  ------------------
  |  Branch (59:9): [True: 4.08k, False: 0]
  |  Branch (59:20): [True: 4.08k, False: 0]
  |  Branch (59:39): [True: 4.08k, False: 0]
  ------------------
   60|  4.08k|        uprv_memcpy(dest, src, len);
  ------------------
  |  |   42|  4.08k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  4.08k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  4.08k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  4.08k|    _Pragma("clang diagnostic push") \
  |  |   45|  4.08k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  4.08k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  4.08k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  4.08k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  4.08k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  4.08k|    _Pragma("clang diagnostic pop") \
  |  |   49|  4.08k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  4.08k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  4.08k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  4.08k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   61|  4.08k|    }
   62|  4.08k|    return u_terminateChars(dest, capacity, len, &errorCode);
  ------------------
  |  |  406|  4.08k|#define u_terminateChars U_ICU_ENTRY_POINT_RENAME(u_terminateChars)
  |  |  ------------------
  |  |  |  |  123|  4.08k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.08k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.08k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   63|  4.08k|}
_ZN6icu_7810CharString8copyFromERKS0_R10UErrorCode:
   65|   334k|CharString &CharString::copyFrom(const CharString &s, UErrorCode &errorCode) {
   66|   334k|    if(U_SUCCESS(errorCode) && this!=&s && ensureCapacity(s.len+1, 0, errorCode)) {
  ------------------
  |  Branch (66:8): [True: 334k, False: 0]
  |  Branch (66:32): [True: 334k, False: 0]
  |  Branch (66:44): [True: 334k, False: 0]
  ------------------
   67|   334k|        len=s.len;
   68|   334k|        uprv_memcpy(buffer.getAlias(), s.buffer.getAlias(), len+1);
  ------------------
  |  |   42|   334k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   334k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   334k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   334k|    _Pragma("clang diagnostic push") \
  |  |   45|   334k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   334k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   334k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   334k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   334k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   334k|    _Pragma("clang diagnostic pop") \
  |  |   49|   334k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   334k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   334k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   334k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   69|   334k|    }
   70|   334k|    return *this;
   71|   334k|}
_ZN6icu_7810CharString6appendEcR10UErrorCode:
  113|  2.22M|CharString &CharString::append(char c, UErrorCode &errorCode) {
  114|  2.22M|    if(ensureCapacity(len+2, 0, errorCode)) {
  ------------------
  |  Branch (114:8): [True: 2.22M, False: 30]
  ------------------
  115|  2.22M|        buffer[len++]=c;
  116|  2.22M|        buffer[len]=0;
  117|  2.22M|    }
  118|  2.22M|    return *this;
  119|  2.22M|}
_ZN6icu_7810CharString6appendEPKciR10UErrorCode:
  121|  8.32M|CharString &CharString::append(const char *s, int32_t sLength, UErrorCode &errorCode) {
  122|  8.32M|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (122:8): [True: 44, False: 8.32M]
  ------------------
  123|     44|        return *this;
  124|     44|    }
  125|  8.32M|    if(sLength<-1 || (s==nullptr && sLength!=0)) {
  ------------------
  |  Branch (125:8): [True: 0, False: 8.32M]
  |  Branch (125:23): [True: 0, False: 8.32M]
  |  Branch (125:37): [True: 0, False: 0]
  ------------------
  126|      0|        errorCode=U_ILLEGAL_ARGUMENT_ERROR;
  127|      0|        return *this;
  128|      0|    }
  129|  8.32M|    if(sLength<0) {
  ------------------
  |  Branch (129:8): [True: 67.8k, False: 8.25M]
  ------------------
  130|  67.8k|        sLength= static_cast<int32_t>(uprv_strlen(s));
  ------------------
  |  |   37|  67.8k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  67.8k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  131|  67.8k|    }
  132|  8.32M|    if(sLength>0) {
  ------------------
  |  Branch (132:8): [True: 8.22M, False: 94.1k]
  ------------------
  133|  8.22M|        if(s==(buffer.getAlias()+len)) {
  ------------------
  |  Branch (133:12): [True: 2.15M, False: 6.07M]
  ------------------
  134|       |            // The caller wrote into the getAppendBuffer().
  135|  2.15M|            if(sLength>=(buffer.getCapacity()-len)) {
  ------------------
  |  Branch (135:16): [True: 0, False: 2.15M]
  ------------------
  136|       |                // The caller wrote too much.
  137|      0|                errorCode=U_INTERNAL_PROGRAM_ERROR;
  138|  2.15M|            } else {
  139|  2.15M|                buffer[len+=sLength]=0;
  140|  2.15M|            }
  141|  6.07M|        } else if(buffer.getAlias()<=s && s<(buffer.getAlias()+len) &&
  ------------------
  |  Branch (141:19): [True: 1.53M, False: 4.53M]
  |  Branch (141:43): [True: 0, False: 1.53M]
  ------------------
  142|  6.07M|                  sLength>=(buffer.getCapacity()-len)
  ------------------
  |  Branch (142:19): [True: 0, False: 0]
  ------------------
  143|  6.07M|        ) {
  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|  6.07M|        } else if(ensureCapacity(len+sLength+1, 0, errorCode)) {
  ------------------
  |  Branch (147:19): [True: 6.07M, False: 0]
  ------------------
  148|  6.07M|            uprv_memcpy(buffer.getAlias()+len, s, sLength);
  ------------------
  |  |   42|  6.07M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  6.07M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  6.07M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  6.07M|    _Pragma("clang diagnostic push") \
  |  |   45|  6.07M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  6.07M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  6.07M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  6.07M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  6.07M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  6.07M|    _Pragma("clang diagnostic pop") \
  |  |   49|  6.07M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  6.07M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  6.07M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  6.07M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  149|  6.07M|            buffer[len+=sLength]=0;
  150|  6.07M|        }
  151|  8.22M|    }
  152|  8.32M|    return *this;
  153|  8.32M|}
_ZN6icu_7810CharString15getAppendBufferEiiRiR10UErrorCode:
  190|  2.15M|                                  UErrorCode &errorCode) {
  191|  2.15M|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (191:8): [True: 0, False: 2.15M]
  ------------------
  192|      0|        resultCapacity=0;
  193|      0|        return nullptr;
  194|      0|    }
  195|  2.15M|    int32_t appendCapacity=buffer.getCapacity()-len-1;  // -1 for NUL
  196|  2.15M|    if(appendCapacity>=minCapacity) {
  ------------------
  |  Branch (196:8): [True: 2.15M, False: 0]
  ------------------
  197|  2.15M|        resultCapacity=appendCapacity;
  198|  2.15M|        return buffer.getAlias()+len;
  199|  2.15M|    }
  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|      6|CharString &CharString::appendInvariantChars(const UnicodeString &s, UErrorCode &errorCode) {
  209|      6|    return appendInvariantChars(s.getBuffer(), s.length(), errorCode);
  210|      6|}
_ZN6icu_7810CharString20appendInvariantCharsEPKDsiR10UErrorCode:
  212|   168k|CharString &CharString::appendInvariantChars(const char16_t* uchars, int32_t ucharsLen, UErrorCode &errorCode) {
  213|   168k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (213:8): [True: 0, False: 168k]
  ------------------
  214|      0|        return *this;
  215|      0|    }
  216|   168k|    if (!uprv_isInvariantUString(uchars, ucharsLen)) {
  ------------------
  |  | 1518|   168k|#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
  |  |  ------------------
  |  |  |  |  123|   168k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   168k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   168k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (216:9): [True: 0, False: 168k]
  ------------------
  217|      0|        errorCode = U_INVARIANT_CONVERSION_ERROR;
  218|      0|        return *this;
  219|      0|    }
  220|   168k|    if(ensureCapacity(len+ucharsLen+1, 0, errorCode)) {
  ------------------
  |  Branch (220:8): [True: 168k, False: 0]
  ------------------
  221|   168k|        u_UCharsToChars(uchars, buffer.getAlias()+len, ucharsLen);
  ------------------
  |  |  211|   168k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|   168k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   168k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   168k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  222|   168k|        len += ucharsLen;
  223|   168k|        buffer[len] = 0;
  224|   168k|    }
  225|   168k|    return *this;
  226|   168k|}
_ZN6icu_7810CharString14ensureCapacityEiiR10UErrorCode:
  230|  8.79M|                                 UErrorCode &errorCode) {
  231|  8.79M|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (231:8): [True: 30, False: 8.79M]
  ------------------
  232|     30|        return false;
  233|     30|    }
  234|  8.79M|    if(capacity>buffer.getCapacity()) {
  ------------------
  |  Branch (234:8): [True: 112k, False: 8.68M]
  ------------------
  235|   112k|        if(desiredCapacityHint==0) {
  ------------------
  |  Branch (235:12): [True: 112k, False: 0]
  ------------------
  236|   112k|            desiredCapacityHint=capacity+buffer.getCapacity();
  237|   112k|        }
  238|   112k|        if( (desiredCapacityHint<=capacity || buffer.resize(desiredCapacityHint, len+1)==nullptr) &&
  ------------------
  |  Branch (238:14): [True: 0, False: 112k]
  |  Branch (238:47): [True: 0, False: 112k]
  ------------------
  239|   112k|            buffer.resize(capacity, len+1)==nullptr
  ------------------
  |  Branch (239:13): [True: 0, False: 0]
  ------------------
  240|   112k|        ) {
  241|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  242|      0|            return false;
  243|      0|        }
  244|   112k|    }
  245|  8.79M|    return true;
  246|  8.79M|}

_ZN6icu_7810CharStringC2Ev:
   43|  7.65M|    CharString() : len(0) { buffer[0]=0; }
_ZN6icu_7810CharStringC2ENS_11StringPieceER10UErrorCode:
   44|   706k|    CharString(StringPiece s, UErrorCode &errorCode) : len(0) {
   45|   706k|        buffer[0]=0;
   46|   706k|        append(s, errorCode);
   47|   706k|    }
_ZN6icu_7810CharStringC2ERKS0_R10UErrorCode:
   48|   886k|    CharString(const CharString &s, UErrorCode &errorCode) : len(0) {
   49|   886k|        buffer[0]=0;
   50|   886k|        append(s, errorCode);
   51|   886k|    }
_ZN6icu_7810CharStringC2EPKciR10UErrorCode:
   52|  90.0k|    CharString(const char *s, int32_t sLength, UErrorCode &errorCode) : len(0) {
   53|  90.0k|        buffer[0]=0;
   54|  90.0k|        append(s, sLength, errorCode);
   55|  90.0k|    }
_ZN6icu_7810CharStringD2Ev:
   56|  9.53M|    ~CharString() {}
_ZNK6icu_7810CharString7isEmptyEv:
   79|  5.27M|    UBool isEmpty() const { return len==0; }
_ZNK6icu_7810CharString6lengthEv:
   80|  4.15M|    int32_t length() const { return len; }
_ZNK6icu_7810CharStringixEi:
   81|   134k|    char operator[](int32_t index) const { return buffer[index]; }
_ZNK6icu_7810CharString13toStringPieceEv:
   82|     10|    StringPiece toStringPiece() const { return StringPiece(buffer.getAlias(), len); }
_ZNK6icu_7810CharString4dataEv:
   84|  3.20M|    const char *data() const { return buffer.getAlias(); }
_ZN6icu_7810CharString4dataEv:
   85|  3.93M|    char *data() { return buffer.getAlias(); }
_ZNK6icu_7810CharStringeqERKS0_:
  108|   175k|    bool operator==(const CharString& other) const {
  109|   175k|        return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0);
  ------------------
  |  |  101|   170k|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|   170k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (109:16): [True: 170k, False: 4.08k]
  |  Branch (109:42): [True: 0, False: 170k]
  |  Branch (109:54): [True: 170k, False: 1]
  ------------------
  110|   175k|    }
_ZNK6icu_7810CharStringneERKS0_:
  111|  16.3k|    bool operator!=(const CharString& other) const {
  112|  16.3k|        return !operator==(other);
  113|  16.3k|    }
_ZNK6icu_7810CharStringeqENS_11StringPieceE:
  115|  16.4k|    bool operator==(StringPiece other) const {
  116|  16.4k|        return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0);
  ------------------
  |  |  101|     15|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|     15|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (116:16): [True: 15, False: 16.4k]
  |  Branch (116:42): [True: 0, False: 15]
  |  Branch (116:54): [True: 0, False: 15]
  ------------------
  117|  16.4k|    }
_ZNK6icu_7810CharStringneENS_11StringPieceE:
  118|  12.2k|    bool operator!=(StringPiece other) const {
  119|  12.2k|        return !operator==(other);
  120|  12.2k|    }
_ZN6icu_7810CharString5clearEv:
  127|   781k|    CharString &clear() { len=0; buffer[0]=0; return *this; }
_ZN6icu_7810CharString6appendENS_11StringPieceER10UErrorCode:
  131|  2.71M|    CharString &append(StringPiece s, UErrorCode &errorCode) {
  132|  2.71M|        return append(s.data(), s.length(), errorCode);
  133|  2.71M|    }
_ZN6icu_7810CharString6appendERKS0_R10UErrorCode:
  134|  2.55M|    CharString &append(const CharString &s, UErrorCode &errorCode) {
  135|  2.55M|        return append(s.data(), s.length(), errorCode);
  136|  2.55M|    }

_ZN6icu_7813CharStringMapD2Ev:
   33|      4|    ~CharStringMap() {
   34|      4|        uhash_close(map);
  ------------------
  |  |  991|      4|#define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close)
  |  |  ------------------
  |  |  |  |  123|      4|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      4|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      4|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   35|      4|    }
_ZN6icu_7813CharStringMapC2EiR10UErrorCode:
   25|      2|    CharStringMap(int32_t size, UErrorCode &errorCode) {
   26|      2|        map = uhash_openSize(uhash_hashChars, uhash_compareChars, uhash_compareChars,
  ------------------
  |  | 1031|      2|#define uhash_openSize U_ICU_ENTRY_POINT_RENAME(uhash_openSize)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      map = uhash_openSize(uhash_hashChars, uhash_compareChars, uhash_compareChars,
  ------------------
  |  | 1011|      2|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      map = uhash_openSize(uhash_hashChars, uhash_compareChars, uhash_compareChars,
  ------------------
  |  |  993|      2|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      map = uhash_openSize(uhash_hashChars, uhash_compareChars, uhash_compareChars,
  ------------------
  |  |  993|      2|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   27|      2|                             size, &errorCode);
   28|      2|    }
_ZN6icu_7813CharStringMap3putEPKcS2_R10UErrorCode:
   45|    281|    void put(const char *key, const char *value, UErrorCode &errorCode) {
   46|    281|        uhash_put(map, const_cast<char *>(key), const_cast<char *>(value), &errorCode);
  ------------------
  |  | 1032|    281|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|    281|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    281|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    281|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   47|    281|    }
_ZN6icu_7813CharStringMapC2EOS0_:
   29|      2|    CharStringMap(CharStringMap &&other) noexcept : map(other.map) {
   30|      2|        other.map = nullptr;
   31|      2|    }
_ZNK6icu_7813CharStringMap3getEPKc:
   44|      4|    const char *get(const char *key) const { return static_cast<const char *>(uhash_get(map, key)); }
  ------------------
  |  | 1007|      4|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|      4|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      4|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      4|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
_ZN6icu_7813CharStringMapC2Ev:
   24|      2|    CharStringMap() : map(nullptr) {}
_ZN6icu_7813CharStringMapaSEOS0_:
   37|      2|    CharStringMap &operator=(CharStringMap &&other) noexcept {
   38|      2|        map = other.map;
   39|      2|        other.map = nullptr;
   40|      2|        return *this;
   41|      2|    }

uprv_malloc_78:
   45|  20.9M|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|  20.9M|    if (s > 0) {
  ------------------
  |  Branch (54:9): [True: 20.9M, False: 0]
  ------------------
   55|  20.9M|        if (pAlloc) {
  ------------------
  |  Branch (55:13): [True: 0, False: 20.9M]
  ------------------
   56|      0|            return (*pAlloc)(pContext, s);
   57|  20.9M|        } else {
   58|  20.9M|            return uprv_default_malloc(s);
  ------------------
  |  |  615|  20.9M|# define uprv_default_malloc(x) malloc(x)
  ------------------
   59|  20.9M|        }
   60|  20.9M|    } else {
   61|      0|        return (void *)zeroMem;
   62|      0|    }
   63|  20.9M|}
uprv_realloc_78:
   66|  25.9k|uprv_realloc(void * buffer, size_t size) {
   67|       |#if U_DEBUG && defined(UPRV_MALLOC_COUNT)
   68|       |  putchar('~');
   69|       |  fflush(stdout);
   70|       |#endif
   71|  25.9k|    if (buffer == zeroMem) {
  ------------------
  |  Branch (71:9): [True: 0, False: 25.9k]
  ------------------
   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|  25.9k|    } else if (size == 0) {
  ------------------
  |  Branch (73:16): [True: 0, False: 25.9k]
  ------------------
   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|  25.9k|    } else {
   81|  25.9k|        if (pRealloc) {
  ------------------
  |  Branch (81:13): [True: 0, False: 25.9k]
  ------------------
   82|      0|            return (*pRealloc)(pContext, buffer, size);
   83|  25.9k|        } else {
   84|  25.9k|            return uprv_default_realloc(buffer, size);
  ------------------
  |  |  616|  25.9k|# define uprv_default_realloc(x,y) realloc(x,y)
  ------------------
   85|  25.9k|        }
   86|  25.9k|    }
   87|  25.9k|}
uprv_free_78:
   90|  22.6M|uprv_free(void *buffer) {
   91|       |#if U_DEBUG && defined(UPRV_MALLOC_COUNT)
   92|       |  putchar('<');
   93|       |  fflush(stdout);
   94|       |#endif
   95|  22.6M|    if (buffer != zeroMem) {
  ------------------
  |  Branch (95:9): [True: 22.6M, False: 0]
  ------------------
   96|  22.6M|        if (pFree) {
  ------------------
  |  Branch (96:13): [True: 0, False: 22.6M]
  ------------------
   97|      0|            (*pFree)(pContext, buffer);
   98|  22.6M|        } else {
   99|  22.6M|            uprv_default_free(buffer);
  ------------------
  |  |  617|  22.6M|# define uprv_default_free(x) free(x)
  ------------------
  100|  22.6M|        }
  101|  22.6M|    }
  102|  22.6M|}

_ZN6icu_7815MaybeStackArrayIcLi40EEC2Ev:
  344|  9.33M|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayIcLi40EED2Ev:
  363|  9.53M|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIcLi40EEC2EOS1_:
  479|   201k|        : ptr(src.ptr), capacity(src.capacity), needToRelease(src.needToRelease) {
  480|   201k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (480:9): [True: 201k, False: 0]
  ------------------
  481|   201k|        ptr = stackArray;
  482|   201k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|   201k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   201k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   201k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   201k|    _Pragma("clang diagnostic push") \
  |  |   45|   201k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   201k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   201k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   201k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   201k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   201k|    _Pragma("clang diagnostic pop") \
  |  |   49|   201k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   201k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   201k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   201k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  483|   201k|    } else {
  484|      0|        src.resetToStackArray();  // take ownership away from src
  485|      0|    }
  486|   201k|}
_ZN6icu_7815MaybeStackArrayIcLi40EEaSEOS1_:
  490|   177k|MaybeStackArray<T, stackCapacity>::operator=(MaybeStackArray <T, stackCapacity>&& src) noexcept {
  491|   177k|    releaseArray();  // in case this instance had its own memory allocated
  492|   177k|    capacity = src.capacity;
  493|   177k|    needToRelease = src.needToRelease;
  494|   177k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (494:9): [True: 177k, False: 0]
  ------------------
  495|   177k|        ptr = stackArray;
  496|   177k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|   177k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   177k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   177k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   177k|    _Pragma("clang diagnostic push") \
  |  |   45|   177k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   177k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   177k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   177k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   177k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   177k|    _Pragma("clang diagnostic pop") \
  |  |   49|   177k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   177k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   177k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   177k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  497|   177k|    } else {
  498|      0|        ptr = src.ptr;
  499|      0|        src.resetToStackArray();  // take ownership away from src
  500|      0|    }
  501|   177k|    return *this;
  502|   177k|}
_ZNK6icu_7815MaybeStackArrayIcLi40EE11getCapacityEv:
  376|  13.2M|    int32_t getCapacity() const { return capacity; }
_ZNK6icu_7815MaybeStackArrayIcLi40EE8getAliasEv:
  381|  32.0M|    T *getAlias() const { return ptr; }
_ZNK6icu_7815MaybeStackArrayIcLi40EEixEl:
  395|   134k|    const T &operator[](ptrdiff_t i) const { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIcLi40EEixEl:
  402|  22.9M|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIcLi40EE6resizeEii:
  505|   112k|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|   112k|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 112k, 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|   112k|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|   112k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|   112k|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 112k, False: 0]
  ------------------
  512|   112k|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 112k, False: 0]
  ------------------
  513|   112k|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 112k]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|   112k|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 112k]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|   112k|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|   112k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   112k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   112k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   112k|    _Pragma("clang diagnostic push") \
  |  |   45|   112k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   112k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   112k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   112k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   112k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   112k|    _Pragma("clang diagnostic pop") \
  |  |   49|   112k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   112k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   112k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   112k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|   112k|            }
  521|   112k|            releaseArray();
  522|   112k|            ptr=p;
  523|   112k|            capacity=newCapacity;
  524|   112k|            needToRelease=true;
  525|   112k|        }
  526|   112k|        return p;
  527|   112k|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|   112k|}
_ZN6icu_7815MaybeStackArrayIcLi40EE12releaseArrayEv:
  458|  9.82M|    void releaseArray() {
  459|  9.82M|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 112k, False: 9.71M]
  ------------------
  460|   112k|            uprv_free(ptr);
  ------------------
  |  | 1503|   112k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|   112k|        }
  462|  9.82M|    }
_ZN6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EED2Ev:
  363|  42.4k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EE12releaseArrayEv:
  458|  42.4k|    void releaseArray() {
  459|  42.4k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 0, False: 42.4k]
  ------------------
  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|  42.4k|    }
_ZN6icu_7810MemoryPoolINS_9HashtableELi8EEC2Ev:
  760|      2|    MemoryPool() : fCount(0), fPool() {}
_ZN6icu_7815MaybeStackArrayIPNS_9HashtableELi8EEC2Ev:
  344|      2|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7810MemoryPoolINS_9HashtableELi8EED2Ev:
  762|      2|    ~MemoryPool() {
  763|     14|        for (int32_t i = 0; i < fCount; ++i) {
  ------------------
  |  Branch (763:29): [True: 12, False: 2]
  ------------------
  764|     12|            delete fPool[i];
  765|     12|        }
  766|      2|    }
_ZN6icu_7815MaybeStackArrayIPNS_9HashtableELi8EEixEl:
  402|     24|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIPNS_9HashtableELi8EED2Ev:
  363|      2|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIPNS_9HashtableELi8EE12releaseArrayEv:
  458|      2|    void releaseArray() {
  459|      2|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 0, False: 2]
  ------------------
  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|    }
_ZN6icu_7810MemoryPoolINS_9HashtableELi8EE6createIJbR10UErrorCodeEEEPS1_DpOT_:
  796|     12|    T* create(Args&&... args) {
  797|     12|        int32_t capacity = fPool.getCapacity();
  798|     12|        if (fCount == capacity &&
  ------------------
  |  Branch (798:13): [True: 0, False: 12]
  ------------------
  799|     12|            fPool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity,
  ------------------
  |  Branch (799:13): [True: 0, False: 0]
  |  Branch (799:26): [True: 0, False: 0]
  ------------------
  800|      0|                         capacity) == nullptr) {
  801|      0|            return nullptr;
  802|      0|        }
  803|     12|        return fPool[fCount++] = new T(std::forward<Args>(args)...);
  804|     12|    }
_ZNK6icu_7815MaybeStackArrayIPNS_9HashtableELi8EE11getCapacityEv:
  376|     12|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7811LocalMemoryIiEC2EPi:
  195|    281|    explicit LocalMemory(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7811LocalMemoryIiE23allocateInsteadAndResetEi:
  278|    276|inline T *LocalMemory<T>::allocateInsteadAndReset(int32_t newCapacity) {
  279|    276|    if(newCapacity>0) {
  ------------------
  |  Branch (279:8): [True: 276, False: 0]
  ------------------
  280|    276|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|    276|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|    276|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    276|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    276|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  281|    276|        if(p!=nullptr) {
  ------------------
  |  Branch (281:12): [True: 276, False: 0]
  ------------------
  282|    276|            uprv_memset(p, 0, newCapacity*sizeof(T));
  ------------------
  |  |  100|    276|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|    276|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  283|    276|            uprv_free(LocalPointerBase<T>::ptr);
  ------------------
  |  | 1503|    276|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    276|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    276|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    276|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  284|    276|            LocalPointerBase<T>::ptr=p;
  285|    276|        }
  286|    276|        return p;
  287|    276|    } else {
  288|      0|        return nullptr;
  289|      0|    }
  290|    276|}
_ZNK6icu_7811LocalMemoryIiEixEl:
  274|  24.5k|    T &operator[](ptrdiff_t i) const { return LocalPointerBase<T>::ptr[i]; }
_ZN6icu_7811LocalMemoryIiED2Ev:
  206|    281|    ~LocalMemory() {
  207|    281|        uprv_free(LocalPointerBase<T>::ptr);
  ------------------
  |  | 1503|    281|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    281|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    281|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    281|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  208|    281|    }
_ZN6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EEC2Ev:
  344|  21.2k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EEC2EOS3_:
  479|  21.2k|        : ptr(src.ptr), capacity(src.capacity), needToRelease(src.needToRelease) {
  480|  21.2k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (480:9): [True: 21.2k, False: 0]
  ------------------
  481|  21.2k|        ptr = stackArray;
  482|  21.2k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|  21.2k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  21.2k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  21.2k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  21.2k|    _Pragma("clang diagnostic push") \
  |  |   45|  21.2k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  21.2k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  21.2k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  21.2k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  21.2k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  21.2k|    _Pragma("clang diagnostic pop") \
  |  |   49|  21.2k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  21.2k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  21.2k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  21.2k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  483|  21.2k|    } else {
  484|      0|        src.resetToStackArray();  // take ownership away from src
  485|      0|    }
  486|  21.2k|}
_ZNK6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EE11getCapacityEv:
  376|  21.2k|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayINS_20StandardPluralRanges25StandardPluralRangeTripleELi3EEixEl:
  402|  63.6k|    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|  7.36k|        for (int32_t i = 0; i < fCount; ++i) {
  ------------------
  |  Branch (763:29): [True: 7.36k, False: 1]
  ------------------
  764|  7.36k|            delete fPool[i];
  765|  7.36k|        }
  766|      1|    }
_ZN6icu_7815MaybeStackArrayIPNS_13UnicodeStringELi8EEixEl:
  402|  14.7k|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIPNS_13UnicodeStringELi8EED2Ev:
  363|      1|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIPNS_13UnicodeStringELi8EE12releaseArrayEv:
  458|     10|    void releaseArray() {
  459|     10|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 9, False: 1]
  ------------------
  460|      9|            uprv_free(ptr);
  ------------------
  |  | 1503|      9|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      9|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      9|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      9|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      9|        }
  462|     10|    }
_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|}
_ZN6icu_7810MemoryPoolINS_13UnicodeStringELi8EE6createIJRS1_EEEPS1_DpOT_:
  796|  7.36k|    T* create(Args&&... args) {
  797|  7.36k|        int32_t capacity = fPool.getCapacity();
  798|  7.36k|        if (fCount == capacity &&
  ------------------
  |  Branch (798:13): [True: 9, False: 7.35k]
  ------------------
  799|  7.36k|            fPool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity,
  ------------------
  |  Branch (799:13): [True: 0, False: 9]
  |  Branch (799:26): [True: 1, False: 8]
  ------------------
  800|      9|                         capacity) == nullptr) {
  801|      0|            return nullptr;
  802|      0|        }
  803|  7.36k|        return fPool[fCount++] = new T(std::forward<Args>(args)...);
  804|  7.36k|    }
_ZNK6icu_7815MaybeStackArrayIPNS_13UnicodeStringELi8EE11getCapacityEv:
  376|  7.36k|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayIPNS_13UnicodeStringELi8EE6resizeEii:
  505|      9|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|      9|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 9, 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|      9|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|      9|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      9|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      9|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      9|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|      9|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 9, False: 0]
  ------------------
  512|      9|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 9, False: 0]
  ------------------
  513|      9|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 9]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|      9|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 9]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|      9|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|      9|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      9|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      9|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      9|    _Pragma("clang diagnostic push") \
  |  |   45|      9|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      9|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      9|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      9|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      9|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      9|    _Pragma("clang diagnostic pop") \
  |  |   49|      9|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      9|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      9|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      9|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|      9|            }
  521|      9|            releaseArray();
  522|      9|            ptr=p;
  523|      9|            capacity=newCapacity;
  524|      9|            needToRelease=true;
  525|      9|        }
  526|      9|        return p;
  527|      9|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|      9|}
_ZN6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EEC2Ev:
  344|  36.3k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayIdLi8EEC2Ev:
  344|    500|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EED2Ev:
  363|  36.3k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EE12releaseArrayEv:
  458|  47.1k|    void releaseArray() {
  459|  47.1k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 10.7k, False: 36.3k]
  ------------------
  460|  10.7k|            uprv_free(ptr);
  ------------------
  |  | 1503|  10.7k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  10.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  10.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  10.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|  10.7k|        }
  462|  47.1k|    }
_ZN6icu_7815MaybeStackArrayIdLi8EED2Ev:
  363|    500|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIdLi8EE12releaseArrayEv:
  458|  1.61k|    void releaseArray() {
  459|  1.61k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 1.11k, False: 500]
  ------------------
  460|  1.11k|            uprv_free(ptr);
  ------------------
  |  | 1503|  1.11k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  1.11k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.11k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.11k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|  1.11k|        }
  462|  1.61k|    }
_ZNK6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EE8getAliasEv:
  381|  72.7k|    T *getAlias() const { return ptr; }
_ZNK6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EE11getCapacityEv:
  376|  6.47M|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EE6resizeEii:
  505|  10.7k|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|  10.7k|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 10.7k, 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|  10.7k|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|  10.7k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  10.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  10.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  10.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|  10.7k|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 10.7k, False: 0]
  ------------------
  512|  10.7k|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 10.7k, False: 0]
  ------------------
  513|  10.7k|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 10.7k]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|  10.7k|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 10.7k]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|  10.7k|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|  10.7k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  10.7k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  10.7k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  10.7k|    _Pragma("clang diagnostic push") \
  |  |   45|  10.7k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  10.7k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  10.7k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  10.7k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  10.7k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  10.7k|    _Pragma("clang diagnostic pop") \
  |  |   49|  10.7k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  10.7k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  10.7k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  10.7k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|  10.7k|            }
  521|  10.7k|            releaseArray();
  522|  10.7k|            ptr=p;
  523|  10.7k|            capacity=newCapacity;
  524|  10.7k|            needToRelease=true;
  525|  10.7k|        }
  526|  10.7k|        return p;
  527|  10.7k|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|  10.7k|}
_ZNK6icu_7815MaybeStackArrayIdLi8EE8getAliasEv:
  381|    500|    T *getAlias() const { return ptr; }
_ZNK6icu_7815MaybeStackArrayIdLi8EE11getCapacityEv:
  376|   434k|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayIdLi8EE6resizeEii:
  505|  1.11k|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|  1.11k|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 1.11k, 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.11k|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|  1.11k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.11k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.11k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.11k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|  1.11k|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 1.11k, False: 0]
  ------------------
  512|  1.11k|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 1.11k, False: 0]
  ------------------
  513|  1.11k|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 1.11k]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|  1.11k|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 1.11k]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|  1.11k|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|  1.11k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.11k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  1.11k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  1.11k|    _Pragma("clang diagnostic push") \
  |  |   45|  1.11k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  1.11k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.11k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  1.11k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.11k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  1.11k|    _Pragma("clang diagnostic pop") \
  |  |   49|  1.11k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  1.11k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  1.11k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.11k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|  1.11k|            }
  521|  1.11k|            releaseArray();
  522|  1.11k|            ptr=p;
  523|  1.11k|            capacity=newCapacity;
  524|  1.11k|            needToRelease=true;
  525|  1.11k|        }
  526|  1.11k|        return p;
  527|  1.11k|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|  1.11k|}
_ZN6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EEixEl:
  402|  8.04M|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIdLi8EEixEl:
  402|   434k|    T &operator[](ptrdiff_t i) { return ptr[i]; }
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();} ()

calendar.cpp:_ZL14uprv_arrayCopyPKiPii:
   56|  56.1k|{ uprv_memcpy(dst, src, (size_t)count * sizeof(*src)); }
  ------------------
  |  |   42|  56.1k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  56.1k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  56.1k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  56.1k|    _Pragma("clang diagnostic push") \
  |  |   45|  56.1k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  56.1k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  56.1k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  56.1k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  56.1k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  56.1k|    _Pragma("clang diagnostic pop") \
  |  |   49|  56.1k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  56.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  56.1k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  56.1k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
calendar.cpp:_ZL14uprv_arrayCopyPKaPai:
   38|  56.1k|    { uprv_memcpy(dst, src, (size_t)count * sizeof(*src)); }
  ------------------
  |  |   42|  56.1k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  56.1k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  56.1k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  56.1k|    _Pragma("clang diagnostic push") \
  |  |   45|  56.1k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  56.1k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  56.1k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  56.1k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  56.1k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  56.1k|    _Pragma("clang diagnostic pop") \
  |  |   49|  56.1k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  56.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  56.1k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  56.1k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
dtfmtsym.cpp:_ZL14uprv_arrayCopyPKN6icu_7813UnicodeStringEPS0_i:
   75|    128|{ while(count-- > 0) *dst++ = *src++; }
  ------------------
  |  Branch (75:9): [True: 112, False: 16]
  ------------------
dtfmtsym.cpp:_ZL14uprv_arrayCopyPKN6icu_7813UnicodeStringEiPS0_ii:
   84|     16|{ uprv_arrayCopy(src+srcStart, dst+dstStart, count); }

uprv_isASCIILetter_78:
   52|  4.81M|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|  4.81M|    return ('a'<=c && c<='z') || ('A'<=c && c<='Z');
  ------------------
  |  Branch (58:13): [True: 2.28M, False: 2.53M]
  |  Branch (58:23): [True: 2.28M, False: 0]
  |  Branch (58:35): [True: 2.53M, False: 0]
  |  Branch (58:45): [True: 2.53M, False: 0]
  ------------------
   59|  4.81M|#endif
   60|  4.81M|}
uprv_toupper_78:
   63|  4.58M|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|  4.58M|    if('a'<=c && c<='z') {
  ------------------
  |  Branch (69:8): [True: 0, False: 4.58M]
  |  Branch (69:18): [True: 0, False: 0]
  ------------------
   70|      0|        c=(char)(c+('A'-'a'));
   71|      0|    }
   72|  4.58M|#endif
   73|  4.58M|    return c;
   74|  4.58M|}
uprv_asciitolower_78:
  103|  6.57M|uprv_asciitolower(char c) {
  104|  6.57M|    if(0x41<=c && c<=0x5a) {
  ------------------
  |  Branch (104:8): [True: 6.57M, False: 10]
  |  Branch (104:19): [True: 0, False: 6.57M]
  ------------------
  105|      0|        c=(char)(c+0x20);
  106|      0|    }
  107|  6.57M|    return c;
  108|  6.57M|}
T_CString_toUpperCase_78:
  138|  44.4k|{
  139|  44.4k|    char* origPtr = str;
  140|       |
  141|  44.4k|    if (str) {
  ------------------
  |  Branch (141:9): [True: 44.4k, False: 0]
  ------------------
  142|  44.4k|        do
  143|   177k|            *str = uprv_toupper(*str);
  ------------------
  |  | 1547|   177k|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|   177k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   177k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   177k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|   177k|        while (*(str++));
  ------------------
  |  Branch (144:16): [True: 133k, False: 44.4k]
  ------------------
  145|  44.4k|    }
  146|       |
  147|  44.4k|    return origPtr;
  148|  44.4k|}
T_CString_integerToString_78:
  158|  80.0k|{
  159|  80.0k|    char      tbuf[30];
  160|  80.0k|    int32_t   tbx    = sizeof(tbuf);
  161|  80.0k|    uint8_t   digit;
  162|  80.0k|    int32_t   length = 0;
  163|  80.0k|    uint32_t  uval;
  164|       |    
  165|  80.0k|    U_ASSERT(radix>=2 && radix<=16);
  ------------------
  |  |   35|  80.0k|#   define U_ASSERT(exp) (void)0
  ------------------
  166|  80.0k|    uval = (uint32_t) v;
  167|  80.0k|    if(v<0 && radix == 10) {
  ------------------
  |  Branch (167:8): [True: 0, False: 80.0k]
  |  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|  80.0k|    tbx = sizeof(tbuf)-1;
  174|  80.0k|    tbuf[tbx] = 0;   /* We are generating the digits backwards.  Null term the end. */
  175|  80.0k|    do {
  176|  80.0k|        digit = (uint8_t)(uval % radix);
  177|  80.0k|        tbuf[--tbx] = (char)(T_CString_itosOffset(digit));
  ------------------
  |  |   81|  80.0k|#define T_CString_itosOffset(a) ((a)<=9?('0'+(a)):('A'+(a)-10))
  |  |  ------------------
  |  |  |  Branch (81:34): [True: 80.0k, False: 0]
  |  |  ------------------
  ------------------
  178|  80.0k|        uval  = uval / radix;
  179|  80.0k|    } while (uval != 0);
  ------------------
  |  Branch (179:14): [True: 2, False: 80.0k]
  ------------------
  180|       |    
  181|       |    /* copy converted number into user buffer  */
  182|  80.0k|    uprv_strcpy(buffer+length, tbuf+tbx);
  ------------------
  |  |   36|  80.0k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  80.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  183|  80.0k|    length += sizeof(tbuf) - tbx -1;
  184|  80.0k|    return length;
  185|  80.0k|}
uprv_stricmp_78:
  235|     38|uprv_stricmp(const char *str1, const char *str2) {
  236|     38|    if(str1==nullptr) {
  ------------------
  |  Branch (236:8): [True: 0, False: 38]
  ------------------
  237|      0|        if(str2==nullptr) {
  ------------------
  |  Branch (237:12): [True: 0, False: 0]
  ------------------
  238|      0|            return 0;
  239|      0|        } else {
  240|      0|            return -1;
  241|      0|        }
  242|     38|    } else if(str2==nullptr) {
  ------------------
  |  Branch (242:15): [True: 0, False: 38]
  ------------------
  243|      0|        return 1;
  244|     38|    } else {
  245|       |        /* compare non-nullptr strings lexically with lowercase */
  246|     38|        int rc;
  247|     38|        unsigned char c1, c2;
  248|       |
  249|     56|        for(;;) {
  250|     56|            c1=(unsigned char)*str1;
  251|     56|            c2=(unsigned char)*str2;
  252|     56|            if(c1==0) {
  ------------------
  |  Branch (252:16): [True: 38, False: 18]
  ------------------
  253|     38|                if(c2==0) {
  ------------------
  |  Branch (253:20): [True: 2, False: 36]
  ------------------
  254|      2|                    return 0;
  255|     36|                } else {
  256|     36|                    return -1;
  257|     36|                }
  258|     38|            } else if(c2==0) {
  ------------------
  |  Branch (258:23): [True: 0, False: 18]
  ------------------
  259|      0|                return 1;
  260|     18|            } else {
  261|       |                /* compare non-zero characters with lowercase */
  262|     18|                rc=(int)(unsigned char)uprv_tolower(c1)-(int)(unsigned char)uprv_tolower(c2);
  ------------------
  |  |   68|     18|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|     18|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|     18|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|     18|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|     18|#       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|     18|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|     18|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|     18|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|     18|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|     18|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  263|     18|                if(rc!=0) {
  ------------------
  |  Branch (263:20): [True: 0, False: 18]
  ------------------
  264|      0|                    return rc;
  265|      0|                }
  266|     18|            }
  267|     18|            ++str1;
  268|     18|            ++str2;
  269|     18|        }
  270|     38|    }
  271|     38|}
uprv_strnicmp_78:
  274|  1.47M|uprv_strnicmp(const char *str1, const char *str2, uint32_t n) {
  275|  1.47M|    if(str1==nullptr) {
  ------------------
  |  Branch (275:8): [True: 0, False: 1.47M]
  ------------------
  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|  1.47M|    } else if(str2==nullptr) {
  ------------------
  |  Branch (281:15): [True: 0, False: 1.47M]
  ------------------
  282|      0|        return 1;
  283|  1.47M|    } else {
  284|       |        /* compare non-nullptr strings lexically with lowercase */
  285|  1.47M|        int rc;
  286|  1.47M|        unsigned char c1, c2;
  287|       |
  288|  1.47M|        for(; n--;) {
  ------------------
  |  Branch (288:15): [True: 1.47M, False: 0]
  ------------------
  289|  1.47M|            c1=(unsigned char)*str1;
  290|  1.47M|            c2=(unsigned char)*str2;
  291|  1.47M|            if(c1==0) {
  ------------------
  |  Branch (291:16): [True: 0, False: 1.47M]
  ------------------
  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|  1.47M|            } else if(c2==0) {
  ------------------
  |  Branch (297:23): [True: 0, False: 1.47M]
  ------------------
  298|      0|                return 1;
  299|  1.47M|            } else {
  300|       |                /* compare non-zero characters with lowercase */
  301|  1.47M|                rc=(int)(unsigned char)uprv_tolower(c1)-(int)(unsigned char)uprv_tolower(c2);
  ------------------
  |  |   68|  1.47M|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  1.47M|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  1.47M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  1.47M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  1.47M|#       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|  1.47M|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  1.47M|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  1.47M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  1.47M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  1.47M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  302|  1.47M|                if(rc!=0) {
  ------------------
  |  Branch (302:20): [True: 1.47M, False: 0]
  ------------------
  303|  1.47M|                    return rc;
  304|  1.47M|                }
  305|  1.47M|            }
  306|      0|            ++str1;
  307|      0|            ++str2;
  308|      0|        }
  309|  1.47M|    }
  310|       |
  311|      0|    return 0;
  312|  1.47M|}
uprv_strdup_78:
  315|     14|uprv_strdup(const char *src) {
  316|     14|    size_t len = uprv_strlen(src) + 1;
  ------------------
  |  |   37|     14|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|     14|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  317|     14|    char *dup = (char *) uprv_malloc(len);
  ------------------
  |  | 1524|     14|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|     14|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     14|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     14|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  318|       |
  319|     14|    if (dup) {
  ------------------
  |  Branch (319:9): [True: 14, False: 0]
  ------------------
  320|     14|        uprv_memcpy(dup, src, len);
  ------------------
  |  |   42|     14|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     14|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|     14|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|     14|    _Pragma("clang diagnostic push") \
  |  |   45|     14|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|     14|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     14|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|     14|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     14|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|     14|    _Pragma("clang diagnostic pop") \
  |  |   49|     14|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     14|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|     14|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     14|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  321|     14|    }
  322|       |
  323|     14|    return dup;
  324|     14|}

_ZN6icu_785Edits12releaseArrayEv:
   38|  8.54k|void Edits::releaseArray() noexcept {
   39|  8.54k|    if (array != stackArray) {
  ------------------
  |  Branch (39:9): [True: 2.11k, False: 6.42k]
  ------------------
   40|  2.11k|        uprv_free(array);
  ------------------
  |  | 1503|  2.11k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  2.11k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.11k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.11k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   41|  2.11k|    }
   42|  8.54k|}
_ZN6icu_785EditsD2Ev:
  105|  6.42k|Edits::~Edits() {
  106|  6.42k|    releaseArray();
  107|  6.42k|}
_ZN6icu_785Edits12addUnchangedEi:
  114|   746k|void Edits::addUnchanged(int32_t unchangedLength) {
  115|   746k|    if(U_FAILURE(errorCode_) || unchangedLength == 0) { return; }
  ------------------
  |  Branch (115:8): [True: 0, False: 746k]
  |  Branch (115:33): [True: 0, False: 746k]
  ------------------
  116|   746k|    if(unchangedLength < 0) {
  ------------------
  |  Branch (116:8): [True: 0, False: 746k]
  ------------------
  117|      0|        errorCode_ = U_ILLEGAL_ARGUMENT_ERROR;
  118|      0|        return;
  119|      0|    }
  120|       |    // Merge into previous unchanged-text record, if any.
  121|   746k|    int32_t last = lastUnit();
  122|   746k|    if(last < MAX_UNCHANGED) {
  ------------------
  |  Branch (122:8): [True: 0, False: 746k]
  ------------------
  123|      0|        int32_t remaining = MAX_UNCHANGED - last;
  124|      0|        if (remaining >= unchangedLength) {
  ------------------
  |  Branch (124:13): [True: 0, False: 0]
  ------------------
  125|      0|            setLastUnit(last + unchangedLength);
  126|      0|            return;
  127|      0|        }
  128|      0|        setLastUnit(MAX_UNCHANGED);
  129|      0|        unchangedLength -= remaining;
  130|      0|    }
  131|       |    // Split large lengths into multiple units.
  132|   746k|    while(unchangedLength >= MAX_UNCHANGED_LENGTH) {
  ------------------
  |  Branch (132:11): [True: 565, False: 746k]
  ------------------
  133|    565|        append(MAX_UNCHANGED);
  134|    565|        unchangedLength -= MAX_UNCHANGED_LENGTH;
  135|    565|    }
  136|       |    // Write a small (remaining) length.
  137|   746k|    if(unchangedLength > 0) {
  ------------------
  |  Branch (137:8): [True: 746k, False: 72]
  ------------------
  138|   746k|        append(unchangedLength - 1);
  139|   746k|    }
  140|   746k|}
_ZN6icu_785Edits10addReplaceEii:
  142|  2.06M|void Edits::addReplace(int32_t oldLength, int32_t newLength) {
  143|  2.06M|    if(U_FAILURE(errorCode_)) { return; }
  ------------------
  |  Branch (143:8): [True: 0, False: 2.06M]
  ------------------
  144|  2.06M|    if(oldLength < 0 || newLength < 0) {
  ------------------
  |  Branch (144:8): [True: 0, False: 2.06M]
  |  Branch (144:25): [True: 0, False: 2.06M]
  ------------------
  145|      0|        errorCode_ = U_ILLEGAL_ARGUMENT_ERROR;
  146|      0|        return;
  147|      0|    }
  148|  2.06M|    if (oldLength == 0 && newLength == 0) {
  ------------------
  |  Branch (148:9): [True: 0, False: 2.06M]
  |  Branch (148:27): [True: 0, False: 0]
  ------------------
  149|      0|        return;
  150|      0|    }
  151|  2.06M|    ++numChanges;
  152|  2.06M|    int32_t newDelta = newLength - oldLength;
  153|  2.06M|    if (newDelta != 0) {
  ------------------
  |  Branch (153:9): [True: 865k, False: 1.20M]
  ------------------
  154|   865k|        if ((newDelta > 0 && delta >= 0 && newDelta > (INT32_MAX - delta)) ||
  ------------------
  |  Branch (154:14): [True: 865k, False: 0]
  |  Branch (154:30): [True: 865k, False: 0]
  |  Branch (154:44): [True: 0, False: 865k]
  ------------------
  155|   865k|                (newDelta < 0 && delta < 0 && newDelta < (INT32_MIN - delta))) {
  ------------------
  |  Branch (155:18): [True: 0, False: 865k]
  |  Branch (155:34): [True: 0, False: 0]
  |  Branch (155:47): [True: 0, False: 0]
  ------------------
  156|       |            // Integer overflow or underflow.
  157|      0|            errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR;
  158|      0|            return;
  159|      0|        }
  160|   865k|        delta += newDelta;
  161|   865k|    }
  162|       |
  163|  2.06M|    if(0 < oldLength && oldLength <= MAX_SHORT_CHANGE_OLD_LENGTH &&
  ------------------
  |  Branch (163:8): [True: 2.06M, False: 0]
  |  Branch (163:25): [True: 2.06M, False: 0]
  ------------------
  164|  2.06M|            newLength <= MAX_SHORT_CHANGE_NEW_LENGTH) {
  ------------------
  |  Branch (164:13): [True: 2.06M, False: 0]
  ------------------
  165|       |        // Merge into previous same-lengths short-replacement record, if any.
  166|  2.06M|        int32_t u = (oldLength << 12) | (newLength << 9);
  167|  2.06M|        int32_t last = lastUnit();
  168|  2.06M|        if(MAX_UNCHANGED < last && last < MAX_SHORT_CHANGE &&
  ------------------
  |  Branch (168:12): [True: 1.32M, False: 742k]
  |  Branch (168:36): [True: 1.32M, False: 584]
  ------------------
  169|  2.06M|                (last & ~SHORT_CHANGE_NUM_MASK) == u &&
  ------------------
  |  Branch (169:17): [True: 1.27M, False: 51.3k]
  ------------------
  170|  2.06M|                (last & SHORT_CHANGE_NUM_MASK) < SHORT_CHANGE_NUM_MASK) {
  ------------------
  |  Branch (170:17): [True: 1.27M, False: 219]
  ------------------
  171|  1.27M|            setLastUnit(last + 1);
  172|  1.27M|            return;
  173|  1.27M|        }
  174|   795k|        append(u);
  175|   795k|        return;
  176|  2.06M|    }
  177|       |
  178|      0|    int32_t head = 0x7000;
  179|      0|    if (oldLength < LENGTH_IN_1TRAIL && newLength < LENGTH_IN_1TRAIL) {
  ------------------
  |  Branch (179:9): [True: 0, False: 0]
  |  Branch (179:41): [True: 0, False: 0]
  ------------------
  180|      0|        head |= oldLength << 6;
  181|      0|        head |= newLength;
  182|      0|        append(head);
  183|      0|    } else if ((capacity - length) >= 5 || growArray()) {
  ------------------
  |  Branch (183:16): [True: 0, False: 0]
  |  Branch (183:44): [True: 0, False: 0]
  ------------------
  184|      0|        int32_t limit = length + 1;
  185|      0|        if(oldLength < LENGTH_IN_1TRAIL) {
  ------------------
  |  Branch (185:12): [True: 0, False: 0]
  ------------------
  186|      0|            head |= oldLength << 6;
  187|      0|        } else if(oldLength <= 0x7fff) {
  ------------------
  |  Branch (187:19): [True: 0, False: 0]
  ------------------
  188|      0|            head |= LENGTH_IN_1TRAIL << 6;
  189|      0|            array[limit++] = static_cast<uint16_t>(0x8000 | oldLength);
  190|      0|        } else {
  191|      0|            head |= (LENGTH_IN_2TRAIL + (oldLength >> 30)) << 6;
  192|      0|            array[limit++] = static_cast<uint16_t>(0x8000 | (oldLength >> 15));
  193|      0|            array[limit++] = static_cast<uint16_t>(0x8000 | oldLength);
  194|      0|        }
  195|      0|        if(newLength < LENGTH_IN_1TRAIL) {
  ------------------
  |  Branch (195:12): [True: 0, False: 0]
  ------------------
  196|      0|            head |= newLength;
  197|      0|        } else if(newLength <= 0x7fff) {
  ------------------
  |  Branch (197:19): [True: 0, False: 0]
  ------------------
  198|      0|            head |= LENGTH_IN_1TRAIL;
  199|      0|            array[limit++] = static_cast<uint16_t>(0x8000 | newLength);
  200|      0|        } else {
  201|      0|            head |= LENGTH_IN_2TRAIL + (newLength >> 30);
  202|      0|            array[limit++] = static_cast<uint16_t>(0x8000 | (newLength >> 15));
  203|      0|            array[limit++] = static_cast<uint16_t>(0x8000 | newLength);
  204|      0|        }
  205|      0|        array[length] = static_cast<uint16_t>(head);
  206|      0|        length = limit;
  207|      0|    }
  208|      0|}
_ZN6icu_785Edits6appendEi:
  210|  1.54M|void Edits::append(int32_t r) {
  211|  1.54M|    if(length < capacity || growArray()) {
  ------------------
  |  Branch (211:8): [True: 1.53M, False: 2.11k]
  |  Branch (211:29): [True: 2.11k, False: 0]
  ------------------
  212|  1.54M|        array[length++] = static_cast<uint16_t>(r);
  213|  1.54M|    }
  214|  1.54M|}
_ZN6icu_785Edits9growArrayEv:
  216|  2.11k|UBool Edits::growArray() {
  217|  2.11k|    int32_t newCapacity;
  218|  2.11k|    if (array == stackArray) {
  ------------------
  |  Branch (218:9): [True: 1.83k, False: 281]
  ------------------
  219|  1.83k|        newCapacity = 2000;
  220|  1.83k|    } else if (capacity == INT32_MAX) {
  ------------------
  |  Branch (220:16): [True: 0, False: 281]
  ------------------
  221|       |        // Not U_BUFFER_OVERFLOW_ERROR because that could be confused on a string transform API
  222|       |        // with a result-string-buffer overflow.
  223|      0|        errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR;
  224|      0|        return false;
  225|    281|    } else if (capacity >= (INT32_MAX / 2)) {
  ------------------
  |  Branch (225:16): [True: 0, False: 281]
  ------------------
  226|      0|        newCapacity = INT32_MAX;
  227|    281|    } else {
  228|    281|        newCapacity = 2 * capacity;
  229|    281|    }
  230|       |    // Grow by at least 5 units so that a maximal change record will fit.
  231|  2.11k|    if ((newCapacity - capacity) < 5) {
  ------------------
  |  Branch (231:9): [True: 0, False: 2.11k]
  ------------------
  232|      0|        errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR;
  233|      0|        return false;
  234|      0|    }
  235|  2.11k|    uint16_t* newArray = static_cast<uint16_t*>(uprv_malloc(static_cast<size_t>(newCapacity) * 2));
  ------------------
  |  | 1524|  2.11k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  2.11k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.11k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.11k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  236|  2.11k|    if (newArray == nullptr) {
  ------------------
  |  Branch (236:9): [True: 0, False: 2.11k]
  ------------------
  237|      0|        errorCode_ = U_MEMORY_ALLOCATION_ERROR;
  238|      0|        return false;
  239|      0|    }
  240|  2.11k|    uprv_memcpy(newArray, array, (size_t)length * 2);
  ------------------
  |  |   42|  2.11k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.11k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  2.11k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  2.11k|    _Pragma("clang diagnostic push") \
  |  |   45|  2.11k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  2.11k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.11k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  2.11k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.11k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  2.11k|    _Pragma("clang diagnostic pop") \
  |  |   49|  2.11k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  2.11k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  2.11k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.11k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  241|  2.11k|    releaseArray();
  242|  2.11k|    array = newArray;
  243|  2.11k|    capacity = newCapacity;
  244|  2.11k|    return true;
  245|  2.11k|}
_ZNK6icu_785Edits11copyErrorToER10UErrorCode:
  247|  4.64k|UBool Edits::copyErrorTo(UErrorCode &outErrorCode) const {
  248|  4.64k|    if (U_FAILURE(outErrorCode)) { return true; }
  ------------------
  |  Branch (248:9): [True: 0, False: 4.64k]
  ------------------
  249|  4.64k|    if (U_SUCCESS(errorCode_)) { return false; }
  ------------------
  |  Branch (249:9): [True: 4.64k, False: 0]
  ------------------
  250|      0|    outErrorCode = errorCode_;
  251|      0|    return true;
  252|  4.64k|}
_ZN6icu_785Edits8IteratorC2EPKtiaa:
  401|  4.64k|        array(a), index(0), length(len), remaining(0),
  402|  4.64k|        onlyChanges_(oc), coarse(crs),
  403|  4.64k|        dir(0), changed(false), oldLength_(0), newLength_(0),
  404|  4.64k|        srcIndex(0), replIndex(0), destIndex(0) {}
_ZN6icu_785Edits8Iterator17updateNextIndexesEv:
  425|   214k|void Edits::Iterator::updateNextIndexes() {
  426|   214k|    srcIndex += oldLength_;
  427|   214k|    if (changed) {
  ------------------
  |  Branch (427:9): [True: 106k, False: 108k]
  ------------------
  428|   106k|        replIndex += newLength_;
  429|   106k|    }
  430|   214k|    destIndex += newLength_;
  431|   214k|}
_ZN6icu_785Edits8Iterator6noNextEv:
  441|  4.64k|UBool Edits::Iterator::noNext() {
  442|       |    // No change before or beyond the string.
  443|  4.64k|    dir = 0;
  444|  4.64k|    changed = false;
  445|  4.64k|    oldLength_ = newLength_ = 0;
  446|  4.64k|    return false;
  447|  4.64k|}
_ZN6icu_785Edits8Iterator4nextEaR10UErrorCode:
  449|   111k|UBool Edits::Iterator::next(UBool onlyChanges, UErrorCode &errorCode) {
  450|       |    // Forward iteration: Update the string indexes to the limit of the current span,
  451|       |    // and post-increment-read array units to assemble a new span.
  452|       |    // Leaves the array index one after the last unit of that span.
  453|   111k|    if (U_FAILURE(errorCode)) { return false; }
  ------------------
  |  Branch (453:9): [True: 0, False: 111k]
  ------------------
  454|       |    // We have an errorCode in case we need to start guarding against integer overflows.
  455|       |    // It is also convenient for caller loops if we bail out when an error was set elsewhere.
  456|   111k|    if (dir > 0) {
  ------------------
  |  Branch (456:9): [True: 106k, False: 4.64k]
  ------------------
  457|   106k|        updateNextIndexes();
  458|   106k|    } else {
  459|  4.64k|        if (dir < 0) {
  ------------------
  |  Branch (459:13): [True: 0, False: 4.64k]
  ------------------
  460|       |            // Turn around from previous() to next().
  461|       |            // Post-increment-read the same span again.
  462|      0|            if (remaining > 0) {
  ------------------
  |  Branch (462:17): [True: 0, False: 0]
  ------------------
  463|       |                // Fine-grained iterator:
  464|       |                // Stay on the current one of a sequence of compressed changes.
  465|      0|                ++index;  // next() rests on the index after the sequence unit.
  466|      0|                dir = 1;
  467|      0|                return true;
  468|      0|            }
  469|      0|        }
  470|  4.64k|        dir = 1;
  471|  4.64k|    }
  472|   111k|    if (remaining >= 1) {
  ------------------
  |  Branch (472:9): [True: 0, False: 111k]
  ------------------
  473|       |        // Fine-grained iterator: Continue a sequence of compressed changes.
  474|      0|        if (remaining > 1) {
  ------------------
  |  Branch (474:13): [True: 0, False: 0]
  ------------------
  475|      0|            --remaining;
  476|      0|            return true;
  477|      0|        }
  478|      0|        remaining = 0;
  479|      0|    }
  480|   111k|    if (index >= length) {
  ------------------
  |  Branch (480:9): [True: 2.84k, False: 108k]
  ------------------
  481|  2.84k|        return noNext();
  482|  2.84k|    }
  483|   108k|    int32_t u = array[index++];
  484|   108k|    if (u <= MAX_UNCHANGED) {
  ------------------
  |  Branch (484:9): [True: 108k, False: 343]
  ------------------
  485|       |        // Combine adjacent unchanged ranges.
  486|   108k|        changed = false;
  487|   108k|        oldLength_ = u + 1;
  488|   108k|        while (index < length && (u = array[index]) <= MAX_UNCHANGED) {
  ------------------
  |  Branch (488:16): [True: 106k, False: 1.80k]
  |  Branch (488:34): [True: 469, False: 106k]
  ------------------
  489|    469|            ++index;
  490|    469|            oldLength_ += u + 1;
  491|    469|        }
  492|   108k|        newLength_ = oldLength_;
  493|   108k|        if (onlyChanges) {
  ------------------
  |  Branch (493:13): [True: 108k, False: 0]
  ------------------
  494|   108k|            updateNextIndexes();
  495|   108k|            if (index >= length) {
  ------------------
  |  Branch (495:17): [True: 1.80k, False: 106k]
  ------------------
  496|  1.80k|                return noNext();
  497|  1.80k|            }
  498|       |            // already fetched u > MAX_UNCHANGED at index
  499|   106k|            ++index;
  500|   106k|        } else {
  501|      0|            return true;
  502|      0|        }
  503|   108k|    }
  504|   106k|    changed = true;
  505|   106k|    if (u <= MAX_SHORT_CHANGE) {
  ------------------
  |  Branch (505:9): [True: 106k, False: 0]
  ------------------
  506|   106k|        int32_t oldLen = u >> 12;
  507|   106k|        int32_t newLen = (u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH;
  508|   106k|        int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1;
  509|   106k|        if (coarse) {
  ------------------
  |  Branch (509:13): [True: 106k, False: 0]
  ------------------
  510|   106k|            oldLength_ = num * oldLen;
  511|   106k|            newLength_ = num * newLen;
  512|   106k|        } else {
  513|       |            // Split a sequence of changes that was compressed into one unit.
  514|      0|            oldLength_ = oldLen;
  515|      0|            newLength_ = newLen;
  516|      0|            if (num > 1) {
  ------------------
  |  Branch (516:17): [True: 0, False: 0]
  ------------------
  517|      0|                remaining = num;  // This is the first of two or more changes.
  518|      0|            }
  519|      0|            return true;
  520|      0|        }
  521|   106k|    } else {
  522|      0|        U_ASSERT(u <= 0x7fff);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  523|      0|        oldLength_ = readLength((u >> 6) & 0x3f);
  524|      0|        newLength_ = readLength(u & 0x3f);
  525|      0|        if (!coarse) {
  ------------------
  |  Branch (525:13): [True: 0, False: 0]
  ------------------
  526|      0|            return true;
  527|      0|        }
  528|      0|    }
  529|       |    // Combine adjacent changes.
  530|   120k|    while (index < length && (u = array[index]) > MAX_UNCHANGED) {
  ------------------
  |  Branch (530:12): [True: 117k, False: 2.84k]
  |  Branch (530:30): [True: 13.7k, False: 103k]
  ------------------
  531|  13.7k|        ++index;
  532|  13.7k|        if (u <= MAX_SHORT_CHANGE) {
  ------------------
  |  Branch (532:13): [True: 13.7k, False: 0]
  ------------------
  533|  13.7k|            int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1;
  534|  13.7k|            oldLength_ += (u >> 12) * num;
  535|  13.7k|            newLength_ += ((u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH) * num;
  536|  13.7k|        } else {
  537|      0|            U_ASSERT(u <= 0x7fff);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  538|      0|            oldLength_ += readLength((u >> 6) & 0x3f);
  539|      0|            newLength_ += readLength(u & 0x3f);
  540|      0|        }
  541|  13.7k|    }
  542|   106k|    return true;
  543|   106k|}

_ZN6icu_789Hashtable4initEPFi8UElementEPFaS1_S1_ES5_R10UErrorCode:
  127|  3.57k|                            UValueComparator *valueComp, UErrorCode& status) {
  128|  3.57k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (128:9): [True: 0, False: 3.57k]
  ------------------
  129|      0|        return;
  130|      0|    }
  131|  3.57k|    uhash_init(&hashObj, keyHash, keyComp, valueComp, &status);
  ------------------
  |  | 1022|  3.57k|#define uhash_init U_ICU_ENTRY_POINT_RENAME(uhash_init)
  |  |  ------------------
  |  |  |  |  123|  3.57k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.57k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.57k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|  3.57k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (132:9): [True: 3.57k, False: 0]
  ------------------
  133|  3.57k|        hash = &hashObj;
  134|  3.57k|        uhash_setKeyDeleter(hash, uprv_deleteUObject);
  ------------------
  |  | 1040|  3.57k|#define uhash_setKeyDeleter U_ICU_ENTRY_POINT_RENAME(uhash_setKeyDeleter)
  |  |  ------------------
  |  |  |  |  123|  3.57k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.57k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.57k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      uhash_setKeyDeleter(hash, uprv_deleteUObject);
  ------------------
  |  | 1489|  3.57k|#define uprv_deleteUObject U_ICU_ENTRY_POINT_RENAME(uprv_deleteUObject)
  |  |  ------------------
  |  |  |  |  123|  3.57k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.57k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.57k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  135|  3.57k|    }
  136|  3.57k|}
_ZN6icu_789Hashtable15setValueDeleterEPFvPvE:
  196|  1.52k|inline UObjectDeleter *Hashtable::setValueDeleter(UObjectDeleter *fn) {
  197|  1.52k|    return uhash_setValueDeleter(hash, fn);
  ------------------
  |  | 1044|  1.52k|#define uhash_setValueDeleter U_ICU_ENTRY_POINT_RENAME(uhash_setValueDeleter)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  198|  1.52k|}
_ZN6icu_789Hashtable3putERKNS_13UnicodeStringEPvR10UErrorCode:
  204|  6.18k|inline void* Hashtable::put(const UnicodeString& key, void* value, UErrorCode& status) {
  205|  6.18k|    return uhash_put(hash, new UnicodeString(key), value, &status);
  ------------------
  |  | 1032|  6.18k|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|  6.18k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.18k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.18k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  206|  6.18k|}
_ZN6icu_789Hashtable4putiERKNS_13UnicodeStringEiR10UErrorCode:
  208|  96.0k|inline int32_t Hashtable::puti(const UnicodeString& key, int32_t value, UErrorCode& status) {
  209|  96.0k|    return uhash_puti(hash, new UnicodeString(key), value, &status);
  ------------------
  |  | 1033|  96.0k|#define uhash_puti U_ICU_ENTRY_POINT_RENAME(uhash_puti)
  |  |  ------------------
  |  |  |  |  123|  96.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  96.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  96.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  210|  96.0k|}
_ZNK6icu_789Hashtable3getERKNS_13UnicodeStringE:
  217|    416|inline void* Hashtable::get(const UnicodeString& key) const {
  218|    416|    return uhash_get(hash, &key);
  ------------------
  |  | 1007|    416|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|    416|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    416|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    416|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  219|    416|}
_ZNK6icu_789Hashtable4getiERKNS_13UnicodeStringE:
  221|   192k|inline int32_t Hashtable::geti(const UnicodeString& key) const {
  222|   192k|    return uhash_geti(hash, &key);
  ------------------
  |  | 1008|   192k|#define uhash_geti U_ICU_ENTRY_POINT_RENAME(uhash_geti)
  |  |  ------------------
  |  |  |  |  123|   192k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   192k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   192k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|   192k|}
_ZN6icu_789Hashtable6removeERKNS_13UnicodeStringE:
  229|     34|inline void* Hashtable::remove(const UnicodeString& key) {
  230|     34|    return uhash_remove(hash, &key);
  ------------------
  |  | 1035|     34|#define uhash_remove U_ICU_ENTRY_POINT_RENAME(uhash_remove)
  |  |  ------------------
  |  |  |  |  123|     34|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     34|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     34|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|     34|}
_ZN6icu_789HashtableC2Ev:
  184|  1.50k| : hash(nullptr)
  185|  1.50k|{
  186|  1.50k|    UErrorCode status = U_ZERO_ERROR;
  187|  1.50k|    init(uhash_hashUnicodeString, uhash_compareUnicodeString, nullptr, status);
  ------------------
  |  | 1017|  1.50k|#define uhash_hashUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_hashUnicodeString)
  |  |  ------------------
  |  |  |  |  123|  1.50k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.50k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.50k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  init(uhash_hashUnicodeString, uhash_compareUnicodeString, nullptr, status);
  ------------------
  |  |  999|  1.50k|#define uhash_compareUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_compareUnicodeString)
  |  |  ------------------
  |  |  |  |  123|  1.50k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.50k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.50k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  188|  1.50k|}
_ZN6icu_789HashtableD2Ev:
  190|  3.57k|inline Hashtable::~Hashtable() {
  191|  3.57k|    if (hash != nullptr) {
  ------------------
  |  Branch (191:9): [True: 3.57k, False: 0]
  ------------------
  192|  3.57k|        uhash_close(hash);
  ------------------
  |  |  991|  3.57k|#define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close)
  |  |  ------------------
  |  |  |  |  123|  3.57k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.57k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.57k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|  3.57k|    }
  194|  3.57k|}
_ZN6icu_789HashtableC2EaR10UErrorCode:
  156|  2.06k| : hash(nullptr)
  157|  2.06k|{
  158|  2.06k|    init(ignoreKeyCase ? uhash_hashCaselessUnicodeString
  ------------------
  |  | 1010|  2.06k|#define uhash_hashCaselessUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_hashCaselessUnicodeString)
  |  |  ------------------
  |  |  |  |  123|  2.06k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.06k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.06k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (158:10): [True: 0, False: 2.06k]
  ------------------
  159|  2.06k|                        : uhash_hashUnicodeString,
  ------------------
  |  | 1017|  2.06k|#define uhash_hashUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_hashUnicodeString)
  |  |  ------------------
  |  |  |  |  123|  2.06k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.06k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.06k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  160|  2.06k|            ignoreKeyCase ? uhash_compareCaselessUnicodeString
  ------------------
  |  |  992|  2.06k|#define uhash_compareCaselessUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_compareCaselessUnicodeString)
  |  |  ------------------
  |  |  |  |  123|  2.06k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.06k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.06k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (160:13): [True: 0, False: 2.06k]
  ------------------
  161|  2.06k|                        : uhash_compareUnicodeString,
  ------------------
  |  |  999|  2.06k|#define uhash_compareUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_compareUnicodeString)
  |  |  ------------------
  |  |  |  |  123|  2.06k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.06k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.06k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  162|  2.06k|            nullptr,
  163|  2.06k|            status);
  164|  2.06k|}

_ZN6icu_7811LocaleBased12setLocaleIDsEPKNS_10CharStringES3_R10UErrorCode:
   42|   520k|void LocaleBased::setLocaleIDs(const CharString* validID, const CharString* actualID, UErrorCode& status) {
   43|   520k|    setValidLocaleID(validID, status);
   44|   520k|    setActualLocaleID(actualID,status);
   45|   520k|}
_ZN6icu_7811LocaleBased12setLocaleIDsEPKcS2_R10UErrorCode:
   46|  92.5k|void LocaleBased::setLocaleIDs(const char* validID, const char* actualID, UErrorCode& status) {
   47|  92.5k|    setValidLocaleID(validID, status);
   48|  92.5k|    setActualLocaleID(actualID,status);
   49|  92.5k|}
_ZN6icu_7811LocaleBased11setLocaleIDEPKcRPNS_10CharStringER10UErrorCode:
   51|   185k|void LocaleBased::setLocaleID(const char* id, CharString*& dest, UErrorCode& status) {
   52|   185k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (52:9): [True: 0, False: 185k]
  ------------------
   53|   185k|    if (id == nullptr || *id == 0) {
  ------------------
  |  Branch (53:9): [True: 0, False: 185k]
  |  Branch (53:26): [True: 0, False: 185k]
  ------------------
   54|      0|        delete dest;
   55|      0|        dest = nullptr;
   56|   185k|    } else {
   57|   185k|        if (dest == nullptr) {
  ------------------
  |  Branch (57:13): [True: 185k, False: 0]
  ------------------
   58|   185k|            dest = new CharString(id, status);
   59|   185k|            if (dest == nullptr) {
  ------------------
  |  Branch (59:17): [True: 0, False: 185k]
  ------------------
   60|      0|                status = U_MEMORY_ALLOCATION_ERROR;
   61|      0|                return;
   62|      0|            }
   63|   185k|        } else {
   64|      0|            dest->copyFrom(id, status);
   65|      0|        }
   66|   185k|    }
   67|   185k|}
_ZN6icu_7811LocaleBased11setLocaleIDEPKNS_10CharStringERPS1_R10UErrorCode:
   69|  1.04M|void LocaleBased::setLocaleID(const CharString* id, CharString*& dest, UErrorCode& status) {
   70|  1.04M|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (70:9): [True: 0, False: 1.04M]
  ------------------
   71|  1.04M|    if (id == nullptr || id->isEmpty()) {
  ------------------
  |  Branch (71:9): [True: 0, False: 1.04M]
  |  Branch (71:26): [True: 0, False: 1.04M]
  ------------------
   72|      0|        delete dest;
   73|      0|        dest = nullptr;
   74|  1.04M|    } else {
   75|  1.04M|        if (dest == nullptr) {
  ------------------
  |  Branch (75:13): [True: 886k, False: 154k]
  ------------------
   76|   886k|            dest = new CharString(*id, status);
   77|   886k|            if (dest == nullptr) {
  ------------------
  |  Branch (77:17): [True: 0, False: 886k]
  ------------------
   78|      0|                status = U_MEMORY_ALLOCATION_ERROR;
   79|      0|                return;
   80|      0|            }
   81|   886k|        } else {
   82|   154k|            dest->copyFrom(*id, status);
   83|   154k|        }
   84|  1.04M|    }
   85|  1.04M|}

_ZN6icu_7811LocaleBasedC2ERPNS_10CharStringES3_:
  101|   612k|    valid(validAlias), actual(actualAlias) {
  102|   612k|}
_ZN6icu_7811LocaleBased16setValidLocaleIDEPKNS_10CharStringER10UErrorCode:
  104|   520k|inline void LocaleBased::setValidLocaleID(const CharString* id, UErrorCode& status) {
  105|   520k|    setLocaleID(id, valid, status);
  106|   520k|}
_ZN6icu_7811LocaleBased17setActualLocaleIDEPKNS_10CharStringER10UErrorCode:
  107|   520k|inline void LocaleBased::setActualLocaleID(const CharString* id, UErrorCode& status) {
  108|   520k|    setLocaleID(id, actual, status);
  109|   520k|}
_ZN6icu_7811LocaleBased16setValidLocaleIDEPKcR10UErrorCode:
  110|  92.5k|inline void LocaleBased::setValidLocaleID(const char* id, UErrorCode& status) {
  111|  92.5k|    setLocaleID(id, valid, status);
  112|  92.5k|}
_ZN6icu_7811LocaleBased17setActualLocaleIDEPKcR10UErrorCode:
  113|  92.5k|inline void LocaleBased::setActualLocaleID(const char* id, UErrorCode& status) {
  114|  92.5k|    setLocaleID(id, actual, status);
  115|  92.5k|}

_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|   645k|{
  231|   645k|    U_NAMESPACE_USE
  ------------------
  |  |  112|   645k|#   define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
  ------------------
  232|   645k|    return Locale::getDefault().getName();
  233|   645k|}
_ZN6icu_786LocaleD2Ev:
  247|  1.88M|{
  248|  1.88M|    if ((baseName != fullName) && (baseName != fullNameBuffer)) {
  ------------------
  |  Branch (248:9): [True: 5, False: 1.88M]
  |  Branch (248:35): [True: 5, False: 0]
  ------------------
  249|      5|        uprv_free(baseName);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|      5|    }
  251|  1.88M|    baseName = nullptr;
  252|       |    /*if fullName is on the heap, we free it*/
  253|  1.88M|    if (fullName != fullNameBuffer)
  ------------------
  |  Branch (253:9): [True: 0, False: 1.88M]
  ------------------
  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|  1.88M|}
_ZN6icu_786LocaleC2Ev:
  261|   897k|    : UObject(), fullName(fullNameBuffer), baseName(nullptr)
  262|   897k|{
  263|   897k|    init(nullptr, false);
  264|   897k|}
_ZN6icu_786LocaleC2ENS0_11ELocaleTypeE:
  272|      1|    : UObject(), fullName(fullNameBuffer), baseName(nullptr)
  273|      1|{
  274|      1|    setToBogus();
  275|      1|}
_ZN6icu_786LocaleC2EPKcS2_S2_S2_:
  282|  90.0k|    : UObject(), fullName(fullNameBuffer), baseName(nullptr)
  283|  90.0k|{
  284|  90.0k|    if( (newLanguage==nullptr) && (newCountry == nullptr) && (newVariant == nullptr) )
  ------------------
  |  Branch (284:9): [True: 0, False: 90.0k]
  |  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|  90.0k|    else
  289|  90.0k|    {
  290|  90.0k|        UErrorCode status = U_ZERO_ERROR;
  291|  90.0k|        int32_t lsize = 0;
  292|  90.0k|        int32_t csize = 0;
  293|  90.0k|        int32_t vsize = 0;
  294|  90.0k|        int32_t ksize = 0;
  295|       |
  296|       |        // Check the sizes of the input strings.
  297|       |
  298|       |        // Language
  299|  90.0k|        if ( newLanguage != nullptr )
  ------------------
  |  Branch (299:14): [True: 90.0k, False: 0]
  ------------------
  300|  90.0k|        {
  301|  90.0k|            lsize = static_cast<int32_t>(uprv_strlen(newLanguage));
  ------------------
  |  |   37|  90.0k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  90.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  302|  90.0k|            if ( lsize < 0 || lsize > ULOC_STRING_LIMIT ) { // int32 wrap
  ------------------
  |  |   76|  90.0k|#define ULOC_STRING_LIMIT 357913941
  ------------------
  |  Branch (302:18): [True: 0, False: 90.0k]
  |  Branch (302:31): [True: 0, False: 90.0k]
  ------------------
  303|      0|                setToBogus();
  304|      0|                return;
  305|      0|            }
  306|  90.0k|        }
  307|       |
  308|  90.0k|        CharString togo(newLanguage, lsize, status); // start with newLanguage
  309|       |
  310|       |        // _Country
  311|  90.0k|        if ( newCountry != nullptr )
  ------------------
  |  Branch (311:14): [True: 1, False: 90.0k]
  ------------------
  312|      1|        {
  313|      1|            csize = static_cast<int32_t>(uprv_strlen(newCountry));
  ------------------
  |  |   37|      1|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  314|      1|            if ( csize < 0 || csize > ULOC_STRING_LIMIT ) { // int32 wrap
  ------------------
  |  |   76|      1|#define ULOC_STRING_LIMIT 357913941
  ------------------
  |  Branch (314:18): [True: 0, False: 1]
  |  Branch (314:31): [True: 0, False: 1]
  ------------------
  315|      0|                setToBogus();
  316|      0|                return;
  317|      0|            }
  318|      1|        }
  319|       |
  320|       |        // _Variant
  321|  90.0k|        if ( newVariant != nullptr )
  ------------------
  |  Branch (321:14): [True: 0, False: 90.0k]
  ------------------
  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|  90.0k|        if ( newKeywords != nullptr)
  ------------------
  |  Branch (341:14): [True: 0, False: 90.0k]
  ------------------
  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|  90.0k|        if ( ( vsize != 0 ) || (csize != 0) )  // at least:  __v
  ------------------
  |  Branch (354:14): [True: 0, False: 90.0k]
  |  Branch (354:32): [True: 1, False: 90.0k]
  ------------------
  355|      1|        {                                      //            ^
  356|      1|            togo.append(SEP_CHAR, status);
  ------------------
  |  |  243|      1|#define SEP_CHAR '_'
  ------------------
  357|      1|        }
  358|       |
  359|  90.0k|        if ( csize != 0 )
  ------------------
  |  Branch (359:14): [True: 1, False: 90.0k]
  ------------------
  360|      1|        {
  361|      1|            togo.append(newCountry, status);
  362|      1|        }
  363|       |
  364|  90.0k|        if ( vsize != 0)
  ------------------
  |  Branch (364:14): [True: 0, False: 90.0k]
  ------------------
  365|      0|        {
  366|      0|            togo.append(SEP_CHAR, status)
  ------------------
  |  |  243|      0|#define SEP_CHAR '_'
  ------------------
  367|      0|                .append(newVariant, vsize, status);
  368|      0|        }
  369|       |
  370|  90.0k|        if ( ksize != 0)
  ------------------
  |  Branch (370:14): [True: 0, False: 90.0k]
  ------------------
  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|  90.0k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (384:13): [True: 0, False: 90.0k]
  ------------------
  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|  90.0k|        init(togo.data(), false);
  392|  90.0k|    }
  393|  90.0k|}
_ZN6icu_786LocaleC2ERKS0_:
  396|   740k|    : UObject(other), fullName(fullNameBuffer), baseName(nullptr)
  397|   740k|{
  398|   740k|    *this = other;
  399|   740k|}
_ZN6icu_786LocaleC2EOS0_:
  402|   154k|    : UObject(other), fullName(fullNameBuffer), baseName(fullName) {
  403|   154k|  *this = std::move(other);
  404|   154k|}
_ZN6icu_786LocaleaSERKS0_:
  406|  2.10M|Locale& Locale::operator=(const Locale& other) {
  407|  2.10M|    if (this == &other) {
  ------------------
  |  Branch (407:9): [True: 0, False: 2.10M]
  ------------------
  408|      0|        return *this;
  409|      0|    }
  410|       |
  411|  2.10M|    setToBogus();
  412|       |
  413|  2.10M|    if (other.fullName == other.fullNameBuffer) {
  ------------------
  |  Branch (413:9): [True: 2.10M, False: 0]
  ------------------
  414|  2.10M|        uprv_strcpy(fullNameBuffer, other.fullNameBuffer);
  ------------------
  |  |   36|  2.10M|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  2.10M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  415|  2.10M|    } 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|  2.10M|    if (other.baseName == other.fullName) {
  ------------------
  |  Branch (422:9): [True: 2.10M, False: 2]
  ------------------
  423|  2.10M|        baseName = fullName;
  424|  2.10M|    } else if (other.baseName != nullptr) {
  ------------------
  |  Branch (424:16): [True: 2, False: 0]
  ------------------
  425|      2|        baseName = uprv_strdup(other.baseName);
  ------------------
  |  | 1541|      2|#define uprv_strdup U_ICU_ENTRY_POINT_RENAME(uprv_strdup)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  426|      2|        if (baseName == nullptr) return *this;
  ------------------
  |  Branch (426:13): [True: 0, False: 2]
  ------------------
  427|      2|    }
  428|       |
  429|  2.10M|    uprv_strcpy(language, other.language);
  ------------------
  |  |   36|  2.10M|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  2.10M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  430|  2.10M|    uprv_strcpy(script, other.script);
  ------------------
  |  |   36|  2.10M|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  2.10M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  431|  2.10M|    uprv_strcpy(country, other.country);
  ------------------
  |  |   36|  2.10M|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  2.10M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  432|       |
  433|  2.10M|    variantBegin = other.variantBegin;
  434|  2.10M|    fIsBogus = other.fIsBogus;
  435|       |
  436|  2.10M|    return *this;
  437|  2.10M|}
_ZN6icu_786LocaleaSEOS0_:
  439|   618k|Locale& Locale::operator=(Locale&& other) noexcept {
  440|   618k|    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: 618k]
  |  Branch (440:35): [True: 0, False: 0]
  ------------------
  441|   618k|    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: 618k]
  ------------------
  442|       |
  443|   618k|    if (other.fullName == other.fullNameBuffer || other.baseName == other.fullNameBuffer) {
  ------------------
  |  Branch (443:9): [True: 618k, False: 0]
  |  Branch (443:51): [True: 0, False: 0]
  ------------------
  444|   618k|        uprv_strcpy(fullNameBuffer, other.fullNameBuffer);
  ------------------
  |  |   36|   618k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|   618k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  445|   618k|    }
  446|   618k|    if (other.fullName == other.fullNameBuffer) {
  ------------------
  |  Branch (446:9): [True: 618k, False: 0]
  ------------------
  447|   618k|        fullName = fullNameBuffer;
  448|   618k|    } else {
  449|      0|        fullName = other.fullName;
  450|      0|    }
  451|       |
  452|   618k|    if (other.baseName == other.fullNameBuffer) {
  ------------------
  |  Branch (452:9): [True: 618k, False: 0]
  ------------------
  453|   618k|        baseName = fullNameBuffer;
  454|   618k|    } 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|   618k|    uprv_strcpy(language, other.language);
  ------------------
  |  |   36|   618k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|   618k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  461|   618k|    uprv_strcpy(script, other.script);
  ------------------
  |  |   36|   618k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|   618k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  462|   618k|    uprv_strcpy(country, other.country);
  ------------------
  |  |   36|   618k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|   618k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  463|       |
  464|   618k|    variantBegin = other.variantBegin;
  465|   618k|    fIsBogus = other.fIsBogus;
  466|       |
  467|   618k|    other.baseName = other.fullName = other.fullNameBuffer;
  468|       |
  469|   618k|    return *this;
  470|   618k|}
_ZNK6icu_786LocaleeqERKS0_:
  479|   231k|{
  480|   231k|    return (uprv_strcmp(other.fullName, fullName) == 0);
  ------------------
  |  |   38|   231k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   231k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  481|   231k|}
_ZN6icu_786Locale4initEPKca:
 1832|   987k|{
 1833|   987k|    return localeID == nullptr ? *this = getDefault() : init(StringPiece{localeID}, canonicalize);
  ------------------
  |  Branch (1833:12): [True: 897k, False: 90.0k]
  ------------------
 1834|   987k|}
_ZN6icu_786Locale4initENS_11StringPieceEa:
 1838|  90.0k|{
 1839|  90.0k|    fIsBogus = false;
 1840|       |    /* Free our current storage */
 1841|  90.0k|    if ((baseName != fullName) && (baseName != fullNameBuffer)) {
  ------------------
  |  Branch (1841:9): [True: 90.0k, False: 4]
  |  Branch (1841:35): [True: 90.0k, False: 0]
  ------------------
 1842|  90.0k|        uprv_free(baseName);
  ------------------
  |  | 1503|  90.0k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  90.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  90.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  90.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1843|  90.0k|    }
 1844|  90.0k|    baseName = nullptr;
 1845|  90.0k|    if(fullName != fullNameBuffer) {
  ------------------
  |  Branch (1845:8): [True: 0, False: 90.0k]
  ------------------
 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|  90.0k|    do {
 1854|  90.0k|        char *separator;
 1855|  90.0k|        char *field[5] = {nullptr};
 1856|  90.0k|        int32_t fieldLen[5] = {0};
 1857|  90.0k|        int32_t fieldIdx;
 1858|  90.0k|        int32_t variantField;
 1859|  90.0k|        int32_t length;
 1860|  90.0k|        UErrorCode err;
 1861|       |
 1862|       |        /* preset all fields to empty */
 1863|  90.0k|        language[0] = script[0] = country[0] = 0;
 1864|       |
 1865|  90.0k|        const auto parse = [canonicalize](std::string_view localeID,
 1866|  90.0k|                                          char* name,
 1867|  90.0k|                                          int32_t nameCapacity,
 1868|  90.0k|                                          UErrorCode& status) {
 1869|  90.0k|            return ByteSinkUtil::viaByteSinkToTerminatedChars(
 1870|  90.0k|                name, nameCapacity,
 1871|  90.0k|                [&](ByteSink& sink, UErrorCode& status) {
 1872|  90.0k|                    if (canonicalize) {
 1873|  90.0k|                        ulocimp_canonicalize(localeID, sink, status);
 1874|  90.0k|                    } else {
 1875|  90.0k|                        ulocimp_getName(localeID, sink, status);
 1876|  90.0k|                    }
 1877|  90.0k|                },
 1878|  90.0k|                status);
 1879|  90.0k|        };
 1880|       |
 1881|       |        // "canonicalize" the locale ID to ICU/Java format
 1882|  90.0k|        err = U_ZERO_ERROR;
 1883|  90.0k|        length = parse(localeID, fullName, sizeof fullNameBuffer, err);
 1884|       |
 1885|  90.0k|        if (err == U_BUFFER_OVERFLOW_ERROR || length >= static_cast<int32_t>(sizeof(fullNameBuffer))) {
  ------------------
  |  Branch (1885:13): [True: 0, False: 90.0k]
  |  Branch (1885:47): [True: 0, False: 90.0k]
  ------------------
 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|  90.0k|        if(U_FAILURE(err) || err == U_STRING_NOT_TERMINATED_WARNING) {
  ------------------
  |  Branch (1896:12): [True: 0, False: 90.0k]
  |  Branch (1896:30): [True: 0, False: 90.0k]
  ------------------
 1897|       |            /* should never occur */
 1898|      0|            break;
 1899|      0|        }
 1900|       |
 1901|  90.0k|        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|  90.0k|        separator = field[0] = fullName;
 1906|  90.0k|        fieldIdx = 1;
 1907|  90.0k|        char* at = uprv_strchr(fullName, '@');
  ------------------
  |  |   40|  90.0k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  90.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1908|  90.1k|        while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != nullptr &&
  ------------------
  |  |   40|  90.1k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  90.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1908:16): [True: 13, False: 90.0k]
  ------------------
 1909|  90.1k|               fieldIdx < UPRV_LENGTHOF(field)-1 &&
  ------------------
  |  |   99|     13|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1909:16): [True: 13, False: 0]
  ------------------
 1910|  90.1k|               (at == nullptr || separator < at)) {
  ------------------
  |  Branch (1910:17): [True: 11, False: 2]
  |  Branch (1910:34): [True: 2, False: 0]
  ------------------
 1911|     13|            field[fieldIdx] = separator + 1;
 1912|     13|            fieldLen[fieldIdx - 1] = static_cast<int32_t>(separator - field[fieldIdx - 1]);
 1913|     13|            fieldIdx++;
 1914|     13|        }
 1915|       |        // variant may contain @foo or .foo POSIX cruft; remove it
 1916|  90.0k|        separator = uprv_strchr(field[fieldIdx-1], '@');
  ------------------
  |  |   40|  90.0k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  90.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1917|  90.0k|        char* sep2 = uprv_strchr(field[fieldIdx-1], '.');
  ------------------
  |  |   40|  90.0k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  90.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1918|  90.0k|        if (separator!=nullptr || sep2!=nullptr) {
  ------------------
  |  Branch (1918:13): [True: 5, False: 90.0k]
  |  Branch (1918:35): [True: 0, False: 90.0k]
  ------------------
 1919|      5|            if (separator==nullptr || (sep2!=nullptr && separator > sep2)) {
  ------------------
  |  Branch (1919:17): [True: 0, False: 5]
  |  Branch (1919:40): [True: 0, False: 5]
  |  Branch (1919:57): [True: 0, False: 0]
  ------------------
 1920|      0|                separator = sep2;
 1921|      0|            }
 1922|      5|            fieldLen[fieldIdx - 1] = static_cast<int32_t>(separator - field[fieldIdx - 1]);
 1923|  90.0k|        } else {
 1924|  90.0k|            fieldLen[fieldIdx - 1] = length - static_cast<int32_t>(field[fieldIdx - 1] - fullName);
 1925|  90.0k|        }
 1926|       |
 1927|  90.0k|        if (fieldLen[0] >= static_cast<int32_t>(sizeof(language)))
  ------------------
  |  Branch (1927:13): [True: 0, False: 90.0k]
  ------------------
 1928|      0|        {
 1929|      0|            break; // error: the language field is too long
 1930|      0|        }
 1931|       |
 1932|  90.0k|        variantField = 1; /* Usually the 2nd one, except when a script or country is also used. */
 1933|  90.0k|        if (fieldLen[0] > 0) {
  ------------------
  |  Branch (1933:13): [True: 8, False: 90.0k]
  ------------------
 1934|       |            /* We have a language */
 1935|      8|            uprv_memcpy(language, fullName, fieldLen[0]);
  ------------------
  |  |   42|      8|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      8|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      8|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      8|    _Pragma("clang diagnostic push") \
  |  |   45|      8|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      8|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      8|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      8|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      8|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      8|    _Pragma("clang diagnostic pop") \
  |  |   49|      8|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      8|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      8|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      8|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1936|      8|            language[fieldLen[0]] = 0;
 1937|      8|        }
 1938|  90.0k|        if (fieldLen[1] == 4 && uprv_isASCIILetter(field[1][0]) &&
  ------------------
  |  | 1514|      1|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  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 (1938:13): [True: 1, False: 90.0k]
  |  Branch (1938:33): [True: 1, False: 0]
  ------------------
 1939|  90.0k|                uprv_isASCIILetter(field[1][1]) && uprv_isASCIILetter(field[1][2]) &&
  ------------------
  |  | 1514|      1|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                              uprv_isASCIILetter(field[1][1]) && uprv_isASCIILetter(field[1][2]) &&
  ------------------
  |  | 1514|      1|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  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 (1939:17): [True: 1, False: 0]
  |  Branch (1939:52): [True: 1, False: 0]
  ------------------
 1940|  90.0k|                uprv_isASCIILetter(field[1][3])) {
  ------------------
  |  | 1514|      1|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  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 (1940:17): [True: 1, False: 0]
  ------------------
 1941|       |            /* We have at least a script */
 1942|      1|            uprv_memcpy(script, field[1], fieldLen[1]);
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1943|      1|            script[fieldLen[1]] = 0;
 1944|      1|            variantField++;
 1945|      1|        }
 1946|       |
 1947|  90.0k|        if (fieldLen[variantField] == 2 || fieldLen[variantField] == 3) {
  ------------------
  |  Branch (1947:13): [True: 5, False: 90.0k]
  |  Branch (1947:44): [True: 0, False: 90.0k]
  ------------------
 1948|       |            /* We have a country */
 1949|      5|            uprv_memcpy(country, field[variantField], fieldLen[variantField]);
  ------------------
  |  |   42|      5|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      5|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      5|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      5|    _Pragma("clang diagnostic push") \
  |  |   45|      5|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      5|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      5|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      5|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      5|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      5|    _Pragma("clang diagnostic pop") \
  |  |   49|      5|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      5|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      5|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      5|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1950|      5|            country[fieldLen[variantField]] = 0;
 1951|      5|            variantField++;
 1952|  90.0k|        } else if (fieldLen[variantField] == 0) {
  ------------------
  |  Branch (1952:20): [True: 90.0k, False: 0]
  ------------------
 1953|  90.0k|            variantField++; /* script or country empty but variant in next field (i.e. en__POSIX) */
 1954|  90.0k|        }
 1955|       |
 1956|  90.0k|        if (fieldLen[variantField] > 0) {
  ------------------
  |  Branch (1956:13): [True: 5, False: 90.0k]
  ------------------
 1957|       |            /* We have a variant */
 1958|      5|            variantBegin = static_cast<int32_t>(field[variantField] - fullName);
 1959|      5|        }
 1960|       |
 1961|  90.0k|        err = U_ZERO_ERROR;
 1962|  90.0k|        initBaseName(err);
 1963|  90.0k|        if (U_FAILURE(err)) {
  ------------------
  |  Branch (1963:13): [True: 0, False: 90.0k]
  ------------------
 1964|      0|            break;
 1965|      0|        }
 1966|       |
 1967|  90.0k|        if (canonicalize) {
  ------------------
  |  Branch (1967:13): [True: 0, False: 90.0k]
  ------------------
 1968|      0|            if (!isKnownCanonicalizedLocale(fullName, err)) {
  ------------------
  |  Branch (1968:17): [True: 0, False: 0]
  ------------------
 1969|      0|                CharString replaced;
 1970|       |                // Not sure it is already canonicalized
 1971|      0|                if (canonicalizeLocale(*this, replaced, err)) {
  ------------------
  |  Branch (1971:21): [True: 0, False: 0]
  ------------------
 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|      0|                if (U_FAILURE(err)) {
  ------------------
  |  Branch (1976:21): [True: 0, False: 0]
  ------------------
 1977|      0|                    break;
 1978|      0|                }
 1979|      0|            }
 1980|      0|        }   // if (canonicalize) {
 1981|       |
 1982|       |        // successful end of init()
 1983|  90.0k|        return *this;
 1984|  90.0k|    } 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|  90.0k|}
_ZN6icu_786Locale12initBaseNameER10UErrorCode:
 1999|  90.0k|Locale::initBaseName(UErrorCode &status) {
 2000|  90.0k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (2000:9): [True: 0, False: 90.0k]
  ------------------
 2001|      0|        return;
 2002|      0|    }
 2003|  90.0k|    U_ASSERT(baseName==nullptr || baseName==fullName);
  ------------------
  |  |   35|  90.0k|#   define U_ASSERT(exp) (void)0
  ------------------
 2004|  90.0k|    const char *atPtr = uprv_strchr(fullName, '@');
  ------------------
  |  |   40|  90.0k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  90.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2005|  90.0k|    const char *eqPtr = uprv_strchr(fullName, '=');
  ------------------
  |  |   40|  90.0k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  90.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2006|  90.0k|    if (atPtr && eqPtr && atPtr < eqPtr) {
  ------------------
  |  Branch (2006:9): [True: 5, False: 90.0k]
  |  Branch (2006:18): [True: 5, False: 0]
  |  Branch (2006:27): [True: 5, False: 0]
  ------------------
 2007|       |        // Key words exist.
 2008|      5|        int32_t baseNameLength = static_cast<int32_t>(atPtr - fullName);
 2009|      5|        char* newBaseName = static_cast<char*>(uprv_malloc(baseNameLength + 1));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2010|      5|        if (newBaseName == nullptr) {
  ------------------
  |  Branch (2010:13): [True: 0, False: 5]
  ------------------
 2011|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 2012|      0|            return;
 2013|      0|        }
 2014|      5|        baseName = newBaseName;
 2015|      5|        uprv_strncpy(baseName, fullName, baseNameLength);
  ------------------
  |  |   43|      5|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|      5|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2016|      5|        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|      5|        if (variantBegin > baseNameLength) {
  ------------------
  |  Branch (2021:13): [True: 5, False: 0]
  ------------------
 2022|      5|            variantBegin = baseNameLength;
 2023|      5|        }
 2024|  90.0k|    } else {
 2025|  90.0k|        baseName = fullName;
 2026|  90.0k|    }
 2027|  90.0k|}
_ZNK6icu_786Locale8hashCodeEv:
 2032|   232k|{
 2033|   232k|    return ustr_hashCharsN(fullName, static_cast<int32_t>(uprv_strlen(fullName)));
  ------------------
  |  | 1878|   232k|#define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return ustr_hashCharsN(fullName, static_cast<int32_t>(uprv_strlen(fullName)));
  ------------------
  |  |   37|   232k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   232k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2034|   232k|}
_ZN6icu_786Locale10setToBogusEv:
 2037|  2.10M|Locale::setToBogus() {
 2038|       |    /* Free our current storage */
 2039|  2.10M|    if((baseName != fullName) && (baseName != fullNameBuffer)) {
  ------------------
  |  Branch (2039:8): [True: 1.63M, False: 464k]
  |  Branch (2039:34): [True: 1.63M, False: 0]
  ------------------
 2040|  1.63M|        uprv_free(baseName);
  ------------------
  |  | 1503|  1.63M|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  1.63M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.63M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.63M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2041|  1.63M|    }
 2042|  2.10M|    baseName = nullptr;
 2043|  2.10M|    if(fullName != fullNameBuffer) {
  ------------------
  |  Branch (2043:8): [True: 0, False: 2.10M]
  ------------------
 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|  2.10M|    *fullNameBuffer = 0;
 2048|  2.10M|    *language = 0;
 2049|  2.10M|    *script = 0;
 2050|  2.10M|    *country = 0;
 2051|  2.10M|    fIsBogus = true;
 2052|  2.10M|    variantBegin = 0;
 2053|  2.10M|}
_ZN6icu_786Locale10getDefaultEv:
 2057|  1.55M|{
 2058|  1.55M|    {
 2059|  1.55M|        Mutex lock(&gDefaultLocaleMutex);
 2060|  1.55M|        if (gDefaultLocale != nullptr) {
  ------------------
  |  Branch (2060:13): [True: 1.55M, False: 1]
  ------------------
 2061|  1.55M|            return *gDefaultLocale;
 2062|  1.55M|        }
 2063|  1.55M|    }
 2064|      1|    UErrorCode status = U_ZERO_ERROR;
 2065|      1|    return *locale_set_default_internal(nullptr, status);
 2066|  1.55M|}
_ZN6icu_786Locale16addLikelySubtagsER10UErrorCode:
 2086|      1|Locale::addLikelySubtags(UErrorCode& status) {
 2087|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (2087:9): [True: 0, False: 1]
  ------------------
 2088|      0|        return;
 2089|      0|    }
 2090|       |
 2091|      1|    CharString maximizedLocaleID = ulocimp_addLikelySubtags(fullName, status);
  ------------------
  |  | 1196|      1|#define ulocimp_addLikelySubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_addLikelySubtags)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2092|       |
 2093|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (2093:9): [True: 0, False: 1]
  ------------------
 2094|      0|        return;
 2095|      0|    }
 2096|       |
 2097|      1|    init(maximizedLocaleID.data(), /*canonicalize=*/false);
 2098|      1|    if (isBogus()) {
  ------------------
  |  Branch (2098:9): [True: 0, False: 1]
  ------------------
 2099|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 2100|      0|    }
 2101|      1|}
_ZN6icu_786Locale15minimizeSubtagsER10UErrorCode:
 2104|      3|Locale::minimizeSubtags(UErrorCode& status) {
 2105|      3|    Locale::minimizeSubtags(false, status);
 2106|      3|}
_ZN6icu_786Locale15minimizeSubtagsEbR10UErrorCode:
 2108|      3|Locale::minimizeSubtags(bool favorScript, UErrorCode& status) {
 2109|      3|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (2109:9): [True: 0, False: 3]
  ------------------
 2110|      0|        return;
 2111|      0|    }
 2112|       |
 2113|      3|    CharString minimizedLocaleID = ulocimp_minimizeSubtags(fullName, favorScript, status);
  ------------------
  |  | 1212|      3|#define ulocimp_minimizeSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_minimizeSubtags)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2114|       |
 2115|      3|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (2115:9): [True: 0, False: 3]
  ------------------
 2116|      0|        return;
 2117|      0|    }
 2118|       |
 2119|      3|    init(minimizedLocaleID.data(), /*canonicalize=*/false);
 2120|      3|    if (isBogus()) {
  ------------------
  |  Branch (2120:9): [True: 0, False: 3]
  ------------------
 2121|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 2122|      0|    }
 2123|      3|}
_ZN6icu_786Locale14createFromNameEPKc:
 2204|      2|{
 2205|      2|    if (name) {
  ------------------
  |  Branch (2205:9): [True: 2, False: 0]
  ------------------
 2206|      2|        Locale l("");
 2207|      2|        l.init(name, false);
 2208|      2|        return l;
 2209|      2|    }
 2210|      0|    else {
 2211|      0|        return getDefault();
 2212|      0|    }
 2213|      2|}
_ZNK6icu_786Locale15getKeywordValueEPKcPciR10UErrorCode:
 2606|   102k|{
 2607|   102k|    return uloc_getKeywordValue(fullName, keywordName, buffer, bufLen, &status);
  ------------------
  |  | 1130|   102k|#define uloc_getKeywordValue U_ICU_ENTRY_POINT_RENAME(uloc_getKeywordValue)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2608|   102k|}
_ZNK6icu_786Locale11getBaseNameEv:
 2748|   157k|Locale::getBaseName() const {
 2749|   157k|    return baseName;
 2750|   157k|}
locid.cpp:_ZZN6icu_786Locale4initENS_11StringPieceEaENK3$_0clENSt3__117basic_string_viewIcNS3_11char_traitsIcEEEEPciR10UErrorCode:
 1868|  90.0k|                                          UErrorCode& status) {
 1869|  90.0k|            return ByteSinkUtil::viaByteSinkToTerminatedChars(
 1870|  90.0k|                name, nameCapacity,
 1871|  90.0k|                [&](ByteSink& sink, UErrorCode& status) {
 1872|  90.0k|                    if (canonicalize) {
 1873|  90.0k|                        ulocimp_canonicalize(localeID, sink, status);
 1874|  90.0k|                    } else {
 1875|  90.0k|                        ulocimp_getName(localeID, sink, status);
 1876|  90.0k|                    }
 1877|  90.0k|                },
 1878|  90.0k|                status);
 1879|  90.0k|        };
locid.cpp:_ZZZN6icu_786Locale4initENS_11StringPieceEaENK3$_0clENSt3__117basic_string_viewIcNS3_11char_traitsIcEEEEPciR10UErrorCodeENKUlRNS_8ByteSinkESA_E_clESC_SA_:
 1871|  90.0k|                [&](ByteSink& sink, UErrorCode& status) {
 1872|  90.0k|                    if (canonicalize) {
  ------------------
  |  Branch (1872:25): [True: 0, False: 90.0k]
  ------------------
 1873|      0|                        ulocimp_canonicalize(localeID, sink, status);
  ------------------
  |  | 1197|      0|#define ulocimp_canonicalize U_ICU_ENTRY_POINT_RENAME(ulocimp_canonicalize)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1874|  90.0k|                    } else {
 1875|  90.0k|                        ulocimp_getName(localeID, sink, status);
  ------------------
  |  | 1204|  90.0k|#define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName)
  |  |  ------------------
  |  |  |  |  123|  90.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  90.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  90.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1876|  90.0k|                    }
 1877|  90.0k|                },

_Z27ulocimp_addLikelySubtags_78PKcR10UErrorCode:
  290|      2|                         UErrorCode& status) {
  291|      2|    return icu::ByteSinkUtil::viaByteSinkToCharString(
  292|      2|        [&](icu::ByteSink& sink, UErrorCode& status) {
  293|      2|            ulocimp_addLikelySubtags(localeID, sink, status);
  294|      2|        },
  295|      2|        status);
  296|      2|}
_Z27ulocimp_addLikelySubtags_78PKcRN6icu_788ByteSinkER10UErrorCode:
  301|      2|                         UErrorCode& status) {
  302|      2|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (302:9): [True: 0, False: 2]
  ------------------
  303|      2|    if (localeID == nullptr) {
  ------------------
  |  Branch (303:9): [True: 0, False: 2]
  ------------------
  304|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  305|      0|    }
  306|      2|    icu::CharString localeBuffer = ulocimp_canonicalize(localeID, status);
  ------------------
  |  | 1197|      2|#define ulocimp_canonicalize U_ICU_ENTRY_POINT_RENAME(ulocimp_canonicalize)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  307|      2|    _uloc_addLikelySubtags(localeBuffer.data(), sink, status);
  308|      2|}
_Z26ulocimp_minimizeSubtags_78PKcbR10UErrorCode:
  326|      3|                        UErrorCode& status) {
  327|      3|    return icu::ByteSinkUtil::viaByteSinkToCharString(
  328|      3|        [&](icu::ByteSink& sink, UErrorCode& status) {
  329|      3|            ulocimp_minimizeSubtags(localeID, sink, favorScript, status);
  330|      3|        },
  331|      3|        status);
  332|      3|}
_Z26ulocimp_minimizeSubtags_78PKcRN6icu_788ByteSinkEbR10UErrorCode:
  338|      3|                        UErrorCode& status) {
  339|      3|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (339:9): [True: 0, False: 3]
  ------------------
  340|      3|    if (localeID == nullptr) {
  ------------------
  |  Branch (340:9): [True: 0, False: 3]
  ------------------
  341|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  342|      0|    }
  343|      3|    icu::CharString localeBuffer = ulocimp_canonicalize(localeID, status);
  ------------------
  |  | 1197|      3|#define ulocimp_canonicalize U_ICU_ENTRY_POINT_RENAME(ulocimp_canonicalize)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  344|      3|    _uloc_minimizeSubtags(localeBuffer.data(), sink, favorScript, status);
  345|      3|}
_Z39ulocimp_getRegionForSupplementalData_78PKcbR10UErrorCode:
  434|  46.5k|                                     UErrorCode& status) {
  435|  46.5k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (435:9): [True: 0, False: 46.5k]
  ------------------
  436|      0|        return {};
  437|      0|    }
  438|  46.5k|    icu::CharString rgBuf = GetRegionFromKey(localeID, "rg", status);
  439|  46.5k|    if (U_SUCCESS(status) && rgBuf.isEmpty()) {
  ------------------
  |  Branch (439:9): [True: 46.5k, False: 0]
  |  Branch (439:30): [True: 46.5k, False: 0]
  ------------------
  440|       |        // No valid rg keyword value, try for unicode_region_subtag
  441|  46.5k|        rgBuf = ulocimp_getRegion(localeID == nullptr ? uloc_getDefault() : localeID, status);
  ------------------
  |  | 1206|  46.5k|#define ulocimp_getRegion U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegion)
  |  |  ------------------
  |  |  |  |  123|  46.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  46.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  46.5k|#       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: 46.5k]
  ------------------
  442|  46.5k|        if (U_SUCCESS(status) && rgBuf.isEmpty() && inferRegion) {
  ------------------
  |  Branch (442:13): [True: 46.5k, False: 0]
  |  Branch (442:34): [True: 1, False: 46.5k]
  |  Branch (442:53): [True: 1, False: 0]
  ------------------
  443|       |            // Second check for sd keyword value
  444|      1|            rgBuf = GetRegionFromKey(localeID, "sd", status);
  445|      1|            if (U_SUCCESS(status) && rgBuf.isEmpty()) {
  ------------------
  |  Branch (445:17): [True: 1, False: 0]
  |  Branch (445:38): [True: 1, False: 0]
  ------------------
  446|       |                // no unicode_region_subtag but inferRegion true, try likely subtags
  447|      1|                UErrorCode rgStatus = U_ZERO_ERROR;
  448|      1|                icu::CharString locBuf = ulocimp_addLikelySubtags(localeID, rgStatus);
  ------------------
  |  | 1196|      1|#define ulocimp_addLikelySubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_addLikelySubtags)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  449|      1|                if (U_SUCCESS(rgStatus)) {
  ------------------
  |  Branch (449:21): [True: 1, False: 0]
  ------------------
  450|      1|                    rgBuf = ulocimp_getRegion(locBuf.toStringPiece(), status);
  ------------------
  |  | 1206|      1|#define ulocimp_getRegion U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegion)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  451|      1|                }
  452|      1|            }
  453|      1|        }
  454|  46.5k|    }
  455|       |
  456|  46.5k|    return rgBuf;
  457|  46.5k|}
loclikely.cpp:_ZN12_GLOBAL__N_122_uloc_addLikelySubtagsEPKcRN6icu_788ByteSinkER10UErrorCode:
  136|      2|                       UErrorCode& err) {
  137|      2|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (137:9): [True: 0, False: 2]
  ------------------
  138|      0|        return;
  139|      0|    }
  140|       |
  141|      2|    if (localeID == nullptr) {
  ------------------
  |  Branch (141:9): [True: 0, False: 2]
  ------------------
  142|      0|        err = U_ILLEGAL_ARGUMENT_ERROR;
  143|      0|        return;
  144|      0|    }
  145|       |
  146|      2|    icu::CharString lang;
  147|      2|    icu::CharString script;
  148|      2|    icu::CharString region;
  149|      2|    icu::CharString variant;
  150|      2|    const char* trailing = nullptr;
  151|      2|    ulocimp_getSubtags(localeID, &lang, &script, &region, &variant, &trailing, err);
  ------------------
  |  | 1209|      2|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  152|      2|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (152:9): [True: 0, False: 2]
  ------------------
  153|      0|        return;
  154|      0|    }
  155|       |
  156|      2|    if (!CHECK_TRAILING_VARIANT_SIZE(variant.data(), variant.length())) {
  ------------------
  |  Branch (156:9): [True: 0, False: 2]
  ------------------
  157|      0|        err = U_ILLEGAL_ARGUMENT_ERROR;
  158|      0|        return;
  159|      0|    }
  160|       |
  161|      2|    if (lang.length() == 4) {
  ------------------
  |  Branch (161:9): [True: 0, False: 2]
  ------------------
  162|      0|        if (script.isEmpty()) {
  ------------------
  |  Branch (162:13): [True: 0, False: 0]
  ------------------
  163|      0|            script = std::move(lang);
  164|      0|            lang.clear();
  165|      0|        } else {
  166|      0|            err = U_ILLEGAL_ARGUMENT_ERROR;
  167|      0|            return;
  168|      0|        }
  169|      2|    } else if (lang.length() > 8) {
  ------------------
  |  Branch (169:16): [True: 0, False: 2]
  ------------------
  170|      0|        err = U_ILLEGAL_ARGUMENT_ERROR;
  171|      0|        return;
  172|      0|    }
  173|       |
  174|      2|    int32_t trailingLength = static_cast<int32_t>(uprv_strlen(trailing));
  ------------------
  |  |   37|      2|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      2|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  175|       |
  176|      2|    const icu::LikelySubtags* likelySubtags = icu::LikelySubtags::getSingleton(err);
  177|      2|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (177:9): [True: 0, False: 2]
  ------------------
  178|      0|        return;
  179|      0|    }
  180|       |    // We need to keep l on the stack because lsr may point into internal
  181|       |    // memory of l.
  182|      2|    icu::Locale l = icu::Locale::createFromName(localeID);
  183|      2|    if (l.isBogus()) {
  ------------------
  |  Branch (183:9): [True: 0, False: 2]
  ------------------
  184|      0|        err = U_ILLEGAL_ARGUMENT_ERROR;
  185|      0|        return;
  186|      0|    }
  187|      2|    icu::LSR lsr = likelySubtags->makeMaximizedLsrFrom(l, true, err);
  188|      2|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (188:9): [True: 0, False: 2]
  ------------------
  189|      0|        return;
  190|      0|    }
  191|      2|    const char* language = lsr.language;
  192|      2|    if (uprv_strcmp(language, "und") == 0) {
  ------------------
  |  |   38|      2|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      2|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (192:9): [True: 0, False: 2]
  ------------------
  193|      0|        language = "";
  194|      0|    }
  195|      2|    createTagStringWithAlternates(
  196|      2|        language,
  197|      2|        static_cast<int32_t>(uprv_strlen(language)),
  ------------------
  |  |   37|      2|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      2|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  198|      2|        lsr.script,
  199|      2|        static_cast<int32_t>(uprv_strlen(lsr.script)),
  ------------------
  |  |   37|      2|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      2|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  200|      2|        lsr.region,
  201|      2|        static_cast<int32_t>(uprv_strlen(lsr.region)),
  ------------------
  |  |   37|      2|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      2|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  202|      2|        variant.data(),
  203|      2|        variant.length(),
  204|      2|        trailing,
  205|      2|        trailingLength,
  206|      2|        sink,
  207|      2|        err);
  208|      2|}
loclikely.cpp:_ZN12_GLOBAL__N_127CHECK_TRAILING_VARIANT_SIZEEPKci:
  119|      5|bool CHECK_TRAILING_VARIANT_SIZE(const char* variant, int32_t variantLength) {
  120|      5|    int32_t count = 0;
  121|     15|    for (int32_t i = 0; i < variantLength; i++) {
  ------------------
  |  Branch (121:25): [True: 10, False: 5]
  ------------------
  122|     10|        if (_isIDSeparator(variant[i])) {
  ------------------
  |  Branch (122:13): [True: 0, False: 10]
  ------------------
  123|      0|            count = 0;
  124|     10|        } else if (count == 8) {
  ------------------
  |  Branch (124:20): [True: 0, False: 10]
  ------------------
  125|      0|            return false;
  126|     10|        } else {
  127|     10|            count++;
  128|     10|        }
  129|     10|    }
  130|      5|    return true;
  131|      5|}
loclikely.cpp:_ZN12_GLOBAL__N_129createTagStringWithAlternatesEPKciS1_iS1_iS1_iS1_iRN6icu_788ByteSinkER10UErrorCode:
   76|      5|    UErrorCode& err) {
   77|      5|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (77:9): [True: 0, False: 5]
  ------------------
   78|      0|        return;
   79|      0|    }
   80|       |
   81|      5|    if (langLength >= ULOC_LANG_CAPACITY ||
  ------------------
  |  |  251|     10|#define ULOC_LANG_CAPACITY 12
  ------------------
  |  Branch (81:9): [True: 0, False: 5]
  ------------------
   82|      5|            scriptLength >= ULOC_SCRIPT_CAPACITY ||
  ------------------
  |  |  271|     10|#define ULOC_SCRIPT_CAPACITY 6
  ------------------
  |  Branch (82:13): [True: 0, False: 5]
  ------------------
   83|      5|            regionLength >= ULOC_COUNTRY_CAPACITY) {
  ------------------
  |  |  258|      5|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
  |  Branch (83:13): [True: 0, False: 5]
  ------------------
   84|      0|        err = U_ILLEGAL_ARGUMENT_ERROR;
   85|      0|        return;
   86|      0|    }
   87|       |
   88|      5|    if (langLength > 0) {
  ------------------
  |  Branch (88:9): [True: 5, False: 0]
  ------------------
   89|      5|        sink.Append(lang, langLength);
   90|      5|    }
   91|       |
   92|      5|    if (scriptLength > 0) {
  ------------------
  |  Branch (92:9): [True: 2, False: 3]
  ------------------
   93|      2|        sink.Append("_", 1);
   94|      2|        sink.Append(script, scriptLength);
   95|      2|    }
   96|       |
   97|      5|    if (regionLength > 0) {
  ------------------
  |  Branch (97:9): [True: 2, False: 3]
  ------------------
   98|      2|        sink.Append("_", 1);
   99|      2|        sink.Append(region, regionLength);
  100|      2|    }
  101|       |
  102|      5|    if (variantLength > 0) {
  ------------------
  |  Branch (102:9): [True: 2, False: 3]
  ------------------
  103|      2|        if (regionLength == 0) {
  ------------------
  |  Branch (103:13): [True: 2, False: 0]
  ------------------
  104|       |            /* extra separator is required */
  105|      2|            sink.Append("_", 1);
  106|      2|        }
  107|      2|        sink.Append("_", 1);
  108|      2|        sink.Append(variant, variantLength);
  109|      2|    }
  110|       |
  111|      5|    if (trailingLength > 0) {
  ------------------
  |  Branch (111:9): [True: 3, False: 2]
  ------------------
  112|       |        /*
  113|       |         * Copy the trailing data into the supplied buffer.
  114|       |         */
  115|      3|        sink.Append(trailing, trailingLength);
  116|      3|    }
  117|      5|}
loclikely.cpp:_ZN12_GLOBAL__N_121_uloc_minimizeSubtagsEPKcRN6icu_788ByteSinkEbR10UErrorCode:
  214|      3|                      UErrorCode& err) {
  215|      3|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (215:9): [True: 0, False: 3]
  ------------------
  216|      0|        return;
  217|      0|    }
  218|       |
  219|      3|    if (localeID == nullptr) {
  ------------------
  |  Branch (219:9): [True: 0, False: 3]
  ------------------
  220|      0|        err = U_ILLEGAL_ARGUMENT_ERROR;
  221|      0|        return;
  222|      0|    }
  223|       |
  224|      3|    icu::CharString lang;
  225|      3|    icu::CharString script;
  226|      3|    icu::CharString region;
  227|      3|    icu::CharString variant;
  228|      3|    const char* trailing = nullptr;
  229|      3|    ulocimp_getSubtags(localeID, &lang, &script, &region, &variant, &trailing, err);
  ------------------
  |  | 1209|      3|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  230|      3|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (230:9): [True: 0, False: 3]
  ------------------
  231|      0|        return;
  232|      0|    }
  233|       |
  234|      3|    if (!CHECK_TRAILING_VARIANT_SIZE(variant.data(), variant.length())) {
  ------------------
  |  Branch (234:9): [True: 0, False: 3]
  ------------------
  235|      0|        err = U_ILLEGAL_ARGUMENT_ERROR;
  236|      0|        return;
  237|      0|    }
  238|       |
  239|      3|    int32_t trailingLength = static_cast<int32_t>(uprv_strlen(trailing));
  ------------------
  |  |   37|      3|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  240|       |
  241|      3|    const icu::LikelySubtags* likelySubtags = icu::LikelySubtags::getSingleton(err);
  242|      3|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (242:9): [True: 0, False: 3]
  ------------------
  243|      0|        return;
  244|      0|    }
  245|      3|    icu::LSR lsr = likelySubtags->minimizeSubtags(
  246|      3|        lang.toStringPiece(),
  247|      3|        script.toStringPiece(),
  248|      3|        region.toStringPiece(),
  249|      3|        favorScript,
  250|      3|        err);
  251|      3|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (251:9): [True: 0, False: 3]
  ------------------
  252|      0|        return;
  253|      0|    }
  254|      3|    const char* language = lsr.language;
  255|      3|    if (uprv_strcmp(language, "und") == 0) {
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (255:9): [True: 0, False: 3]
  ------------------
  256|      0|        language = "";
  257|      0|    }
  258|      3|    createTagStringWithAlternates(
  259|      3|        language,
  260|      3|        static_cast<int32_t>(uprv_strlen(language)),
  ------------------
  |  |   37|      3|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  261|      3|        lsr.script,
  262|      3|        static_cast<int32_t>(uprv_strlen(lsr.script)),
  ------------------
  |  |   37|      3|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  263|      3|        lsr.region,
  264|      3|        static_cast<int32_t>(uprv_strlen(lsr.region)),
  ------------------
  |  |   37|      3|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  265|      3|        variant.data(),
  266|      3|        variant.length(),
  267|      3|        trailing,
  268|      3|        trailingLength,
  269|      3|        sink,
  270|      3|        err);
  271|      3|}
loclikely.cpp:_ZN12_GLOBAL__N_116GetRegionFromKeyEPKcNSt3__117basic_string_viewIcNS2_11char_traitsIcEEEER10UErrorCode:
  400|  46.5k|GetRegionFromKey(const char* localeID, std::string_view key, UErrorCode& status) {
  401|  46.5k|    icu::CharString result;
  402|       |    // First check for keyword value
  403|  46.5k|    icu::CharString kw = ulocimp_getKeywordValue(localeID, key, status);
  ------------------
  |  | 1200|  46.5k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  46.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  46.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  46.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  404|  46.5k|    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|  46.5k|    if (U_SUCCESS(status) && len >= 3 && len <= 6 &&
  ------------------
  |  Branch (418:9): [True: 46.5k, False: 0]
  |  Branch (418:30): [True: 0, False: 46.5k]
  |  Branch (418:42): [True: 0, False: 0]
  ------------------
  419|  46.5k|        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|  46.5k|    return result;
  429|  46.5k|}
loclikely.cpp:_ZZ27ulocimp_addLikelySubtags_78PKcR10UErrorCodeENK3$_0clERN6icu_788ByteSinkES2_:
  292|      2|        [&](icu::ByteSink& sink, UErrorCode& status) {
  293|      2|            ulocimp_addLikelySubtags(localeID, sink, status);
  ------------------
  |  | 1196|      2|#define ulocimp_addLikelySubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_addLikelySubtags)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  294|      2|        },
loclikely.cpp:_ZZ26ulocimp_minimizeSubtags_78PKcbR10UErrorCodeENK3$_0clERN6icu_788ByteSinkES2_:
  328|      3|        [&](icu::ByteSink& sink, UErrorCode& status) {
  329|      3|            ulocimp_minimizeSubtags(localeID, sink, favorScript, status);
  ------------------
  |  | 1212|      3|#define ulocimp_minimizeSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_minimizeSubtags)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|      3|        },

_ZN6icu_7818LocaleDistanceDataC2EOS0_:
   40|      1|        distanceTrieBytes(data.distanceTrieBytes),
   41|      1|        regionToPartitions(data.regionToPartitions),
   42|      1|        partitions(data.partitions),
   43|      1|        paradigms(data.paradigms), paradigmsLength(data.paradigmsLength),
   44|      1|        distances(data.distances) {
   45|      1|    data.partitions = nullptr;
   46|      1|    data.paradigms = nullptr;
   47|      1|}
_ZN6icu_7818LocaleDistanceDataD2Ev:
   49|      1|LocaleDistanceData::~LocaleDistanceData() {
   50|      1|    uprv_free(partitions);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   51|      1|    delete[] paradigms;
   52|      1|}
_ZN6icu_7813LikelySubtags17initLikelySubtagsER10UErrorCode:
  451|      1|void U_CALLCONV LikelySubtags::initLikelySubtags(UErrorCode &errorCode) {
  452|       |    // This function is invoked only via umtx_initOnce().
  453|      1|    U_ASSERT(gLikelySubtags == nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  454|      1|    LikelySubtagsData data(errorCode);
  455|      1|    data.load(errorCode);
  456|      1|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (456:9): [True: 0, False: 1]
  ------------------
  457|      1|    gLikelySubtags = new LikelySubtags(data);
  458|      1|    gMacroregions = getStaticMacroregions(errorCode);
  459|       |#if U_DEBUG
  460|       |    auto macroregionsFromData = loadMacroregions(errorCode);
  461|       |    U_ASSERT((*gMacroregions) == (*macroregionsFromData));
  462|       |    delete macroregionsFromData;
  463|       |#endif
  464|      1|    if (U_FAILURE(errorCode) || gLikelySubtags == nullptr || gMacroregions == nullptr) {
  ------------------
  |  Branch (464:9): [True: 0, False: 1]
  |  Branch (464:33): [True: 0, False: 1]
  |  Branch (464:62): [True: 0, False: 1]
  ------------------
  465|      0|        delete gLikelySubtags;
  466|      0|        delete gMacroregions;
  467|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
  468|      0|        return;
  469|      0|    }
  470|       |
  471|      1|    ucln_common_registerCleanup(UCLN_COMMON_LIKELY_SUBTAGS, 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  472|      1|}
_ZN6icu_7813LikelySubtags12getSingletonER10UErrorCode:
  474|      5|const LikelySubtags *LikelySubtags::getSingleton(UErrorCode &errorCode) {
  475|      5|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (475:9): [True: 0, False: 5]
  ------------------
  476|      5|    umtx_initOnce(gInitOnce, &LikelySubtags::initLikelySubtags, errorCode);
  477|      5|    return gLikelySubtags;
  478|      5|}
_ZN6icu_7813LikelySubtagsC2ERNS_17LikelySubtagsDataE:
  481|      1|        langInfoBundle(data.langInfoBundle),
  482|      1|        strings(data.strings.orphanCharStrings()),
  483|      1|        languageAliases(std::move(data.languageAliases)),
  484|      1|        regionAliases(std::move(data.regionAliases)),
  485|      1|        trie(data.trieBytes),
  486|      1|        lsrs(data.lsrs),
  487|       |#if U_DEBUG
  488|       |        lsrsLength(data.lsrsLength),
  489|       |#endif // U_DEBUG
  490|      1|        distanceData(std::move(data.distanceData)) {
  491|      1|    data.langInfoBundle = nullptr;
  492|      1|    data.lsrs = nullptr;
  493|       |
  494|       |    // Cache the result of looking up language="und" encoded as "*", and "und-Zzzz" ("**").
  495|      1|    UStringTrieResult result = trie.next(u'*');
  496|      1|    U_ASSERT(USTRINGTRIE_HAS_NEXT(result));
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  497|      1|    trieUndState = trie.getState64();
  498|      1|    result = trie.next(u'*');
  499|      1|    U_ASSERT(USTRINGTRIE_HAS_NEXT(result));
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  500|      1|    trieUndZzzzState = trie.getState64();
  501|      1|    result = trie.next(u'*');
  502|      1|    U_ASSERT(USTRINGTRIE_HAS_VALUE(result));
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  503|      1|    defaultLsrIndex = trie.getValue();
  504|      1|    trie.reset();
  505|       |
  506|     27|    for (char16_t c = u'a'; c <= u'z'; ++c) {
  ------------------
  |  Branch (506:29): [True: 26, False: 1]
  ------------------
  507|     26|        result = trie.next(c);
  508|     26|        if (result == USTRINGTRIE_NO_VALUE) {
  ------------------
  |  Branch (508:13): [True: 26, False: 0]
  ------------------
  509|     26|            trieFirstLetterStates[c - u'a'] = trie.getState64();
  510|     26|        }
  511|     26|        trie.reset();
  512|     26|    }
  513|      1|}
_ZNK6icu_7813LikelySubtags20makeMaximizedLsrFromERKNS_6LocaleEbR10UErrorCode:
  523|      2|                                         UErrorCode &errorCode) const {
  524|      2|    if (U_FAILURE(errorCode)) { return {}; }
  ------------------
  |  Branch (524:9): [True: 0, False: 2]
  ------------------
  525|      2|    if (locale.isBogus()) {
  ------------------
  |  Branch (525:9): [True: 0, False: 2]
  ------------------
  526|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  527|      0|        return {};
  528|      0|    }
  529|      2|    const char *name = locale.getName();
  530|      2|    if (!returnInputIfUnmatch && uprv_isAtSign(name[0]) && name[1] == 'x' && name[2] == '=') {  // name.startsWith("@x=")
  ------------------
  |  |  133|      2|#   define uprv_isAtSign(c) ((c)=='@')
  |  |  ------------------
  |  |  |  Branch (133:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (530:9): [True: 0, False: 2]
  |  Branch (530:60): [True: 0, False: 0]
  |  Branch (530:78): [True: 0, False: 0]
  ------------------
  531|       |        // Private use language tag x-subtag-subtag... which CLDR changes to
  532|       |        // und-x-subtag-subtag...
  533|      0|        return LSR(name, "", "", LSR::EXPLICIT_LSR);
  534|      0|    }
  535|      2|    LSR max = makeMaximizedLsr(locale.getLanguage(), locale.getScript(), locale.getCountry(),
  536|      2|                            locale.getVariant(), returnInputIfUnmatch, errorCode);
  537|       |
  538|      2|    if (uprv_strlen(max.language) == 0 &&
  ------------------
  |  |   37|      2|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      2|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (538:9): [True: 0, False: 2]
  ------------------
  539|      2|        uprv_strlen(max.script) == 0 &&
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (539:9): [True: 0, False: 0]
  ------------------
  540|      2|        uprv_strlen(max.region) == 0) {
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (540:9): [True: 0, False: 0]
  ------------------
  541|       |        // No match. ICU API mandate us to
  542|       |        // If the provided ULocale instance is already in the maximal form, or
  543|       |        // there is no data available available for maximization, it will be
  544|       |        // returned.
  545|      0|        return LSR(locale.getLanguage(), locale.getScript(), locale.getCountry(), LSR::EXPLICIT_LSR, errorCode);
  546|      0|    }
  547|      2|    return max;
  548|      2|}
_ZNK6icu_7813LikelySubtags16makeMaximizedLsrEPKcS2_S2_S2_bR10UErrorCode:
  562|      2|                                     UErrorCode &errorCode) const {
  563|      2|    if (U_FAILURE(errorCode)) { return {}; }
  ------------------
  |  Branch (563:9): [True: 0, False: 2]
  ------------------
  564|       |    // Handle pseudolocales like en-XA, ar-XB, fr-PSCRACK.
  565|       |    // They should match only themselves,
  566|       |    // not other locales with what looks like the same language and script subtags.
  567|      2|    if (!returnInputIfUnmatch) {
  ------------------
  |  Branch (567:9): [True: 0, False: 2]
  ------------------
  568|      0|        char c1;
  569|      0|        if (region[0] == 'X' && (c1 = region[1]) != 0 && region[2] == 0) {
  ------------------
  |  Branch (569:13): [True: 0, False: 0]
  |  Branch (569:33): [True: 0, False: 0]
  |  Branch (569:58): [True: 0, False: 0]
  ------------------
  570|      0|            switch (c1) {
  571|      0|            case 'A':
  ------------------
  |  Branch (571:13): [True: 0, False: 0]
  ------------------
  572|      0|                return LSR(PSEUDO_ACCENTS_PREFIX, language, script, region,
  573|      0|                           LSR::EXPLICIT_LSR, errorCode);
  574|      0|            case 'B':
  ------------------
  |  Branch (574:13): [True: 0, False: 0]
  ------------------
  575|      0|                return LSR(PSEUDO_BIDI_PREFIX, language, script, region,
  576|      0|                           LSR::EXPLICIT_LSR, errorCode);
  577|      0|            case 'C':
  ------------------
  |  Branch (577:13): [True: 0, False: 0]
  ------------------
  578|      0|                return LSR(PSEUDO_CRACKED_PREFIX, language, script, region,
  579|      0|                           LSR::EXPLICIT_LSR, errorCode);
  580|      0|            default:  // normal locale
  ------------------
  |  Branch (580:13): [True: 0, False: 0]
  ------------------
  581|      0|                break;
  582|      0|            }
  583|      0|        }
  584|       |
  585|      0|        if (variant[0] == 'P' && variant[1] == 'S') {
  ------------------
  |  Branch (585:13): [True: 0, False: 0]
  |  Branch (585:34): [True: 0, False: 0]
  ------------------
  586|      0|            int32_t lsrFlags = *region == 0 ?
  ------------------
  |  Branch (586:32): [True: 0, False: 0]
  ------------------
  587|      0|                LSR::EXPLICIT_LANGUAGE | LSR::EXPLICIT_SCRIPT : LSR::EXPLICIT_LSR;
  588|      0|            if (uprv_strcmp(variant, "PSACCENT") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (588:17): [True: 0, False: 0]
  ------------------
  589|      0|                return LSR(PSEUDO_ACCENTS_PREFIX, language, script,
  590|      0|                           *region == 0 ? "XA" : region, lsrFlags, errorCode);
  ------------------
  |  Branch (590:28): [True: 0, False: 0]
  ------------------
  591|      0|            } else if (uprv_strcmp(variant, "PSBIDI") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (591:24): [True: 0, False: 0]
  ------------------
  592|      0|                return LSR(PSEUDO_BIDI_PREFIX, language, script,
  593|      0|                           *region == 0 ? "XB" : region, lsrFlags, errorCode);
  ------------------
  |  Branch (593:28): [True: 0, False: 0]
  ------------------
  594|      0|            } else if (uprv_strcmp(variant, "PSCRACK") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (594:24): [True: 0, False: 0]
  ------------------
  595|      0|                return LSR(PSEUDO_CRACKED_PREFIX, language, script,
  596|      0|                           *region == 0 ? "XC" : region, lsrFlags, errorCode);
  ------------------
  |  Branch (596:28): [True: 0, False: 0]
  ------------------
  597|      0|            }
  598|       |            // else normal locale
  599|      0|        }
  600|      0|    } // end of if (!returnInputIfUnmatch)
  601|       |
  602|      2|    language = getCanonical(languageAliases, language);
  603|       |    // (We have no script mappings.)
  604|      2|    region = getCanonical(regionAliases, region);
  605|      2|    return maximize(language, script, region, returnInputIfUnmatch, errorCode);
  606|      2|}
_ZNK6icu_7813LikelySubtags8maximizeEPKcS2_S2_bR10UErrorCode:
  610|      5|                             UErrorCode &errorCode) const {
  611|      5|    if (U_FAILURE(errorCode)) { return {}; }
  ------------------
  |  Branch (611:9): [True: 0, False: 5]
  ------------------
  612|      5|    return maximize({language, static_cast<int32_t>(uprv_strlen(language))},
  ------------------
  |  |   37|      5|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      5|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  613|      5|                    {script, static_cast<int32_t>(uprv_strlen(script))},
  ------------------
  |  |   37|      5|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      5|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  614|      5|                    {region, static_cast<int32_t>(uprv_strlen(region))},
  ------------------
  |  |   37|      5|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      5|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  615|      5|                    returnInputIfUnmatch,
  616|      5|                    errorCode);
  617|      5|}
_ZNK6icu_7813LikelySubtags8maximizeENS_11StringPieceES1_S1_bR10UErrorCode:
  632|      8|                             UErrorCode &errorCode) const {
  633|      8|    if (U_FAILURE(errorCode)) { return {}; }
  ------------------
  |  Branch (633:9): [True: 0, False: 8]
  ------------------
  634|      8|    if (language.compare("und") == 0) {
  ------------------
  |  Branch (634:9): [True: 0, False: 8]
  ------------------
  635|      0|        language = "";
  636|      0|    }
  637|      8|    if (script.compare("Zzzz") == 0) {
  ------------------
  |  Branch (637:9): [True: 0, False: 8]
  ------------------
  638|      0|        script = "";
  639|      0|    }
  640|      8|    if (region.compare("ZZ") == 0) {
  ------------------
  |  Branch (640:9): [True: 0, False: 8]
  ------------------
  641|      0|        region = "";
  642|      0|    }
  643|      8|    if (!script.empty() && !region.empty() && !language.empty()) {
  ------------------
  |  Branch (643:9): [True: 0, False: 8]
  |  Branch (643:28): [True: 0, False: 0]
  |  Branch (643:47): [True: 0, False: 0]
  ------------------
  644|      0|        return LSR(language, script, region, LSR::EXPLICIT_LSR, errorCode);  // already maximized
  645|      0|    }
  646|      8|    bool retainLanguage = false;
  647|      8|    bool retainScript = false;
  648|      8|    bool retainRegion = false;
  649|       |
  650|      8|    BytesTrie iter(trie);
  651|      8|    uint64_t state;
  652|      8|    int32_t value;
  653|       |    // Small optimization: Array lookup for first language letter.
  654|      8|    int32_t c0;
  655|      8|    if (0 <= (c0 = uprv_lowerOrdinal(language.data()[0])) && c0 <= 25 &&
  ------------------
  |  Branch (655:9): [True: 5, False: 3]
  |  Branch (655:62): [True: 5, False: 0]
  ------------------
  656|      8|            language.length() >= 2 &&
  ------------------
  |  Branch (656:13): [True: 5, False: 0]
  ------------------
  657|      8|            (state = trieFirstLetterStates[c0]) != 0) {
  ------------------
  |  Branch (657:13): [True: 5, False: 0]
  ------------------
  658|      5|        value = trieNext(iter.resetToState64(state), language, 1);
  659|      5|    } else {
  660|      3|        value = trieNext(iter, language, 0);
  661|      3|    }
  662|      8|    bool matchLanguage = (value >= 0);
  663|      8|    bool matchScript = false;
  664|      8|    if (value >= 0) {
  ------------------
  |  Branch (664:9): [True: 8, False: 0]
  ------------------
  665|      8|        retainLanguage = !language.empty();
  666|      8|        state = iter.getState64();
  667|      8|    } else {
  668|      0|        retainLanguage = true;
  669|      0|        iter.resetToState64(trieUndState);  // "und" ("*")
  670|      0|        state = 0;
  671|      0|    }
  672|       |
  673|      8|    if (value >= 0 && !script.empty()) {
  ------------------
  |  Branch (673:9): [True: 8, False: 0]
  |  Branch (673:23): [True: 0, False: 8]
  ------------------
  674|      0|        matchScript = true;
  675|      0|    }
  676|      8|    if (value > 0) {
  ------------------
  |  Branch (676:9): [True: 0, False: 8]
  ------------------
  677|       |        // Intermediate or final value from just language.
  678|      0|        if (value == SKIP_SCRIPT) {
  ------------------
  |  Branch (678:13): [True: 0, False: 0]
  ------------------
  679|      0|            value = 0;
  680|      0|        }
  681|      0|        retainScript = !script.empty();
  682|      8|    } else {
  683|      8|        value = trieNext(iter, script, 0);
  684|      8|        if (value >= 0) {
  ------------------
  |  Branch (684:13): [True: 8, False: 0]
  ------------------
  685|      8|            retainScript = !script.empty();
  686|      8|            state = iter.getState64();
  687|      8|        } else {
  688|      0|            retainScript = true;
  689|      0|            if (state == 0) {
  ------------------
  |  Branch (689:17): [True: 0, False: 0]
  ------------------
  690|      0|                iter.resetToState64(trieUndZzzzState);  // "und-Zzzz" ("**")
  691|      0|            } else {
  692|      0|                iter.resetToState64(state);
  693|      0|                value = trieNext(iter, "", 0);
  694|      0|                U_ASSERT(value >= 0);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  695|      0|                state = iter.getState64();
  696|      0|            }
  697|      0|        }
  698|      8|    }
  699|       |
  700|      8|    bool matchRegion = false;
  701|      8|    if (value > 0) {
  ------------------
  |  Branch (701:9): [True: 5, False: 3]
  ------------------
  702|       |        // Final value from just language or language+script.
  703|      5|        retainRegion = !region.empty();
  704|      5|    } else {
  705|      3|        value = trieNext(iter, region, 0);
  706|      3|        if (value >= 0) {
  ------------------
  |  Branch (706:13): [True: 3, False: 0]
  ------------------
  707|      3|            if (!region.empty() && !isMacroregion(region, errorCode)) {
  ------------------
  |  Branch (707:17): [True: 0, False: 3]
  |  Branch (707:36): [True: 0, False: 0]
  ------------------
  708|      0|                retainRegion = true;
  709|      0|                matchRegion = true;
  710|      0|            }
  711|      3|        } else {
  712|      0|            retainRegion = true;
  713|      0|            if (state == 0) {
  ------------------
  |  Branch (713:17): [True: 0, False: 0]
  ------------------
  714|      0|                value = defaultLsrIndex;
  715|      0|            } else {
  716|      0|                iter.resetToState64(state);
  717|      0|                value = trieNext(iter, "", 0);
  718|      0|                U_ASSERT(value != 0);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  719|       |                // For the case of und_Latn
  720|      0|                if (value < 0) {
  ------------------
  |  Branch (720:21): [True: 0, False: 0]
  ------------------
  721|      0|                    retainLanguage = !language.empty();
  722|      0|                    retainScript = !script.empty();
  723|      0|                    retainRegion = !region.empty();
  724|       |                    // Fallback to und_$region =>
  725|      0|                    iter.resetToState64(trieUndState);  // "und" ("*")
  726|      0|                    value = trieNext(iter, "", 0);
  727|      0|                    U_ASSERT(value == 0);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  728|      0|                    int64_t trieUndEmptyState = iter.getState64();
  729|      0|                    value = trieNext(iter, region, 0);
  730|       |                    // Fallback to und =>
  731|      0|                    if (value < 0) {
  ------------------
  |  Branch (731:25): [True: 0, False: 0]
  ------------------
  732|      0|                        iter.resetToState64(trieUndEmptyState);
  733|      0|                        value = trieNext(iter, "", 0);
  734|      0|                        U_ASSERT(value > 0);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  735|      0|                    }
  736|      0|                }
  737|      0|            }
  738|      0|        }
  739|      3|    }
  740|      8|    U_ASSERT(value < lsrsLength);
  ------------------
  |  |   35|      8|#   define U_ASSERT(exp) (void)0
  ------------------
  741|      8|    if (returnInputIfUnmatch &&
  ------------------
  |  Branch (741:9): [True: 8, False: 0]
  ------------------
  742|      8|        (!(matchLanguage || matchScript || (matchRegion && language.empty())))) {
  ------------------
  |  Branch (742:12): [True: 8, False: 0]
  |  Branch (742:29): [True: 0, False: 0]
  |  Branch (742:45): [True: 0, False: 0]
  |  Branch (742:60): [True: 0, False: 0]
  ------------------
  743|      0|      return LSR("", "", "", LSR::EXPLICIT_LSR, errorCode);  // no matching.
  744|      0|    }
  745|      8|    if (language.empty()) {
  ------------------
  |  Branch (745:9): [True: 3, False: 5]
  ------------------
  746|      3|        language = StringPiece("und");
  747|      3|    }
  748|       |
  749|      8|    if (!(retainLanguage || retainScript || retainRegion)) {
  ------------------
  |  Branch (749:11): [True: 5, False: 3]
  |  Branch (749:29): [True: 0, False: 3]
  |  Branch (749:45): [True: 0, False: 3]
  ------------------
  750|      3|        U_ASSERT(value >= 0);
  ------------------
  |  |   35|      3|#   define U_ASSERT(exp) (void)0
  ------------------
  751|       |        // Quickly return a copy of the lookup-result LSR
  752|       |        // without new allocation of the subtags.
  753|      3|        const LSR &matched = lsrs[value];
  754|      3|        return LSR(matched.language, matched.script, matched.region, matched.flags);
  755|      3|    }
  756|      5|    if (!retainLanguage) {
  ------------------
  |  Branch (756:9): [True: 0, False: 5]
  ------------------
  757|      0|        U_ASSERT(value >= 0);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  758|      0|        language = lsrs[value].language;
  759|      0|    }
  760|      5|    if (!retainScript) {
  ------------------
  |  Branch (760:9): [True: 5, False: 0]
  ------------------
  761|      5|        U_ASSERT(value >= 0);
  ------------------
  |  |   35|      5|#   define U_ASSERT(exp) (void)0
  ------------------
  762|      5|        script = lsrs[value].script;
  763|      5|    }
  764|      5|    if (!retainRegion) {
  ------------------
  |  Branch (764:9): [True: 3, False: 2]
  ------------------
  765|      3|        U_ASSERT(value >= 0);
  ------------------
  |  |   35|      3|#   define U_ASSERT(exp) (void)0
  ------------------
  766|      3|        region = lsrs[value].region;
  767|      3|    }
  768|      5|    int32_t retainMask = (retainLanguage ? 4 : 0) + (retainScript ? 2 : 0) + (retainRegion ? 1 : 0);
  ------------------
  |  Branch (768:27): [True: 5, False: 0]
  |  Branch (768:54): [True: 0, False: 5]
  |  Branch (768:79): [True: 2, False: 3]
  ------------------
  769|       |    // retainOldMask flags = LSR explicit-subtag flags
  770|      5|    return LSR(language, script, region, retainMask, errorCode);
  771|      8|}
_ZN6icu_7813LikelySubtags8trieNextERNS_9BytesTrieENS_11StringPieceEi:
  906|     19|int32_t LikelySubtags::trieNext(BytesTrie &iter, StringPiece s, int32_t i) {
  907|     19|    UStringTrieResult result;
  908|     19|    uint8_t c;
  909|     19|    if (s.length() == i) {
  ------------------
  |  Branch (909:9): [True: 14, False: 5]
  ------------------
  910|     14|        result = iter.next(u'*');
  911|     14|    } else {
  912|      5|        c = s.data()[i];
  913|      5|        for (;;) {
  914|      5|            c = uprv_invCharToAscii(c);
  ------------------
  |  |  173|      5|#   define uprv_invCharToAscii(c) (c)
  ------------------
  915|       |            // EBCDIC: If s[i] is not an invariant character,
  916|       |            // then c is now 0 and will simply not match anything, which is harmless.
  917|      5|            if (i+1 != s.length()) {
  ------------------
  |  Branch (917:17): [True: 0, False: 5]
  ------------------
  918|      0|                if (!USTRINGTRIE_HAS_NEXT(iter.next(c))) {
  ------------------
  |  |   95|      0|#define USTRINGTRIE_HAS_NEXT(result) ((result)&1)
  ------------------
  |  Branch (918:21): [True: 0, False: 0]
  ------------------
  919|      0|                    return -1;
  920|      0|                }
  921|      0|                c = s.data()[++i];
  922|      5|            } else {
  923|       |                // last character of this subtag
  924|      5|                result = iter.next(c | 0x80);
  925|      5|                break;
  926|      5|            }
  927|      5|        }
  928|      5|    }
  929|     19|    switch (result) {
  930|      0|    case USTRINGTRIE_NO_MATCH: return -1;
  ------------------
  |  Branch (930:5): [True: 0, False: 19]
  ------------------
  931|     11|    case USTRINGTRIE_NO_VALUE: return 0;
  ------------------
  |  Branch (931:5): [True: 11, False: 8]
  ------------------
  932|      0|    case USTRINGTRIE_INTERMEDIATE_VALUE:
  ------------------
  |  Branch (932:5): [True: 0, False: 19]
  ------------------
  933|      0|        U_ASSERT(iter.getValue() == SKIP_SCRIPT);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  934|      0|        return SKIP_SCRIPT;
  935|      8|    case USTRINGTRIE_FINAL_VALUE: return iter.getValue();
  ------------------
  |  Branch (935:5): [True: 8, False: 11]
  ------------------
  936|      0|    default: return -1;
  ------------------
  |  Branch (936:5): [True: 0, False: 19]
  ------------------
  937|     19|    }
  938|     19|}
_ZNK6icu_7813LikelySubtags15minimizeSubtagsENS_11StringPieceES1_S1_bR10UErrorCode:
  943|      3|                                    UErrorCode &errorCode) const {
  944|      3|    if (U_FAILURE(errorCode)) { return {}; }
  ------------------
  |  Branch (944:9): [True: 0, False: 3]
  ------------------
  945|      3|    LSR max = maximize(language, script, region, true, errorCode);
  946|      3|    if (U_FAILURE(errorCode)) { return {}; }
  ------------------
  |  Branch (946:9): [True: 0, False: 3]
  ------------------
  947|       |    // If no match, return it.
  948|      3|    if (uprv_strlen(max.language) == 0 &&
  ------------------
  |  |   37|      3|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (948:9): [True: 0, False: 3]
  ------------------
  949|      3|        uprv_strlen(max.script) == 0 &&
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (949:9): [True: 0, False: 0]
  ------------------
  950|      3|        uprv_strlen(max.region) == 0) {
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (950:9): [True: 0, False: 0]
  ------------------
  951|       |        // No match. ICU API mandate us to
  952|       |        // "If this Locale is already in the minimal form, or not valid, or
  953|       |        // there is no data available for minimization, the Locale will be
  954|       |        // unchanged."
  955|      0|        return LSR(language, script, region, LSR::EXPLICIT_LSR, errorCode);
  956|      0|    }
  957|       |    // try language
  958|      3|    LSR test = maximize(max.language, "", "", true, errorCode);
  959|      3|    if (U_FAILURE(errorCode)) { return {}; }
  ------------------
  |  Branch (959:9): [True: 0, False: 3]
  ------------------
  960|      3|    if (test.isEquivalentTo(max)) {
  ------------------
  |  Branch (960:9): [True: 3, False: 0]
  ------------------
  961|      3|        return LSR(max.language, "", "", LSR::DONT_CARE_FLAGS, errorCode);
  962|      3|    }
  963|       |
  964|      0|    if (!favorScript) {
  ------------------
  |  Branch (964:9): [True: 0, False: 0]
  ------------------
  965|       |        // favor Region
  966|       |        // try language and region
  967|      0|        test = maximize(max.language, "", max.region, true, errorCode);
  968|      0|        if (U_FAILURE(errorCode)) { return {}; }
  ------------------
  |  Branch (968:13): [True: 0, False: 0]
  ------------------
  969|      0|        if (test.isEquivalentTo(max)) {
  ------------------
  |  Branch (969:13): [True: 0, False: 0]
  ------------------
  970|      0|            return LSR(max.language, "", max.region, LSR::DONT_CARE_FLAGS, errorCode);
  971|      0|        }
  972|      0|    }
  973|       |    // try language and script
  974|      0|    test = maximize(max.language, max.script, "", true, errorCode);
  975|      0|    if (U_FAILURE(errorCode)) { return {}; }
  ------------------
  |  Branch (975:9): [True: 0, False: 0]
  ------------------
  976|      0|    if (test.isEquivalentTo(max)) {
  ------------------
  |  Branch (976:9): [True: 0, False: 0]
  ------------------
  977|      0|        return LSR(max.language, max.script, "", LSR::DONT_CARE_FLAGS, errorCode);
  978|      0|    }
  979|      0|    if (favorScript) {
  ------------------
  |  Branch (979:9): [True: 0, False: 0]
  ------------------
  980|       |        // try language and region
  981|      0|        test = maximize(max.language, "", max.region, true, errorCode);
  982|      0|        if (U_FAILURE(errorCode)) { return {}; }
  ------------------
  |  Branch (982:13): [True: 0, False: 0]
  ------------------
  983|      0|        if (test.isEquivalentTo(max)) {
  ------------------
  |  Branch (983:13): [True: 0, False: 0]
  ------------------
  984|      0|            return LSR(max.language, "", max.region, LSR::DONT_CARE_FLAGS, errorCode);
  985|      0|        }
  986|      0|    }
  987|      0|    return LSR(max.language, max.script, max.region, LSR::DONT_CARE_FLAGS, errorCode);
  988|      0|}
_ZN6icu_7817LikelySubtagsDataC2ER10UErrorCode:
   65|      1|    LikelySubtagsData(UErrorCode &errorCode) : strings(errorCode) {}
_ZN6icu_7817LikelySubtagsData4loadER10UErrorCode:
   72|      1|    void load(UErrorCode &errorCode) {
   73|      1|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (73:13): [True: 0, False: 1]
  ------------------
   74|      1|        langInfoBundle = ures_openDirect(nullptr, "langInfo", &errorCode);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|      1|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (75:13): [True: 0, False: 1]
  ------------------
   76|      1|        StackUResourceBundle stackTempBundle;
   77|      1|        ResourceDataValue value;
   78|      1|        ures_getValueWithFallback(langInfoBundle, "likely", stackTempBundle.getAlias(),
  ------------------
  |  | 1684|      1|#define ures_getValueWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getValueWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   79|      1|                                  value, errorCode);
   80|      1|        ResourceTable likelyTable = value.getTable(errorCode);
   81|      1|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (81:13): [True: 0, False: 1]
  ------------------
   82|       |
   83|       |        // Read all strings in the resource bundle and convert them to invariant char *.
   84|      1|        LocalMemory<int32_t> languageIndexes, regionIndexes, lsrSubtagIndexes;
   85|      1|        int32_t languagesLength = 0, regionsLength = 0, lsrSubtagsLength = 0;
   86|      1|        ResourceArray m49Array;
   87|      1|        if (likelyTable.findValue("m49", value)) {
  ------------------
  |  Branch (87:13): [True: 1, False: 0]
  ------------------
   88|      1|            m49Array = value.getArray(errorCode);
   89|      1|        } else {
   90|      0|            errorCode = U_MISSING_RESOURCE_ERROR;
   91|      0|            return;
   92|      0|        }
   93|      1|        if (!readStrings(likelyTable, "languageAliases", value,
  ------------------
  |  Branch (93:13): [True: 0, False: 1]
  ------------------
   94|      1|                         languageIndexes, languagesLength, errorCode) ||
   95|      1|                !readStrings(likelyTable, "regionAliases", value,
  ------------------
  |  Branch (95:17): [True: 0, False: 1]
  ------------------
   96|      1|                             regionIndexes, regionsLength, errorCode) ||
   97|      1|                !readLSREncodedStrings(likelyTable, "lsrnum", value, m49Array,
  ------------------
  |  Branch (97:17): [True: 0, False: 1]
  ------------------
   98|      1|                             lsrSubtagIndexes,lsrSubtagsLength, errorCode)) {
   99|      0|            return;
  100|      0|        }
  101|      1|        if ((languagesLength & 1) != 0 ||
  ------------------
  |  Branch (101:13): [True: 0, False: 1]
  ------------------
  102|      1|                (regionsLength & 1) != 0 ||
  ------------------
  |  Branch (102:17): [True: 0, False: 1]
  ------------------
  103|      1|                (lsrSubtagsLength % 3) != 0) {
  ------------------
  |  Branch (103:17): [True: 0, False: 1]
  ------------------
  104|      0|            errorCode = U_INVALID_FORMAT_ERROR;
  105|      0|            return;
  106|      0|        }
  107|      1|        if (lsrSubtagsLength == 0) {
  ------------------
  |  Branch (107:13): [True: 0, False: 1]
  ------------------
  108|      0|            errorCode = U_MISSING_RESOURCE_ERROR;
  109|      0|            return;
  110|      0|        }
  111|       |
  112|      1|        if (!likelyTable.findValue("trie", value)) {
  ------------------
  |  Branch (112:13): [True: 0, False: 1]
  ------------------
  113|      0|            errorCode = U_MISSING_RESOURCE_ERROR;
  114|      0|            return;
  115|      0|        }
  116|      1|        int32_t length;
  117|      1|        trieBytes = value.getBinary(length, errorCode);
  118|      1|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (118:13): [True: 0, False: 1]
  ------------------
  119|       |
  120|       |        // Also read distance/matcher data if available,
  121|       |        // to open & keep only one resource bundle pointer
  122|       |        // and to use one single UniqueCharStrings.
  123|      1|        UErrorCode matchErrorCode = U_ZERO_ERROR;
  124|      1|        ures_getValueWithFallback(langInfoBundle, "match", stackTempBundle.getAlias(),
  ------------------
  |  | 1684|      1|#define ures_getValueWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getValueWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  125|      1|                                  value, matchErrorCode);
  126|      1|        LocalMemory<int32_t> partitionIndexes, paradigmSubtagIndexes;
  127|      1|        int32_t partitionsLength = 0, paradigmSubtagsLength = 0;
  128|      1|        if (U_SUCCESS(matchErrorCode)) {
  ------------------
  |  Branch (128:13): [True: 1, False: 0]
  ------------------
  129|      1|            ResourceTable matchTable = value.getTable(errorCode);
  130|      1|            if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (130:17): [True: 0, False: 1]
  ------------------
  131|       |
  132|      1|            if (matchTable.findValue("trie", value)) {
  ------------------
  |  Branch (132:17): [True: 1, False: 0]
  ------------------
  133|      1|                distanceData.distanceTrieBytes = value.getBinary(length, errorCode);
  134|      1|                if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (134:21): [True: 0, False: 1]
  ------------------
  135|      1|            }
  136|       |
  137|      1|            if (matchTable.findValue("regionToPartitions", value)) {
  ------------------
  |  Branch (137:17): [True: 1, False: 0]
  ------------------
  138|      1|                distanceData.regionToPartitions = value.getBinary(length, errorCode);
  139|      1|                if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (139:21): [True: 0, False: 1]
  ------------------
  140|      1|                if (length < LSR::REGION_INDEX_LIMIT) {
  ------------------
  |  Branch (140:21): [True: 0, False: 1]
  ------------------
  141|      0|                    errorCode = U_INVALID_FORMAT_ERROR;
  142|      0|                    return;
  143|      0|                }
  144|      1|            }
  145|       |
  146|      1|            if (!readStrings(matchTable, "partitions", value,
  ------------------
  |  Branch (146:17): [True: 0, False: 1]
  ------------------
  147|      1|                             partitionIndexes, partitionsLength, errorCode) ||
  148|      1|                    !readLSREncodedStrings(matchTable, "paradigmnum", value, m49Array,
  ------------------
  |  Branch (148:21): [True: 0, False: 1]
  ------------------
  149|      1|                                 paradigmSubtagIndexes, paradigmSubtagsLength, errorCode)) {
  150|      0|                return;
  151|      0|            }
  152|      1|            if ((paradigmSubtagsLength % 3) != 0) {
  ------------------
  |  Branch (152:17): [True: 0, False: 1]
  ------------------
  153|      0|                errorCode = U_INVALID_FORMAT_ERROR;
  154|      0|                return;
  155|      0|            }
  156|       |
  157|      1|            if (matchTable.findValue("distances", value)) {
  ------------------
  |  Branch (157:17): [True: 1, False: 0]
  ------------------
  158|      1|                distanceData.distances = value.getIntVector(length, errorCode);
  159|      1|                if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (159:21): [True: 0, False: 1]
  ------------------
  160|      1|                if (length < 4) {  // LocaleDistance IX_LIMIT
  ------------------
  |  Branch (160:21): [True: 0, False: 1]
  ------------------
  161|      0|                    errorCode = U_INVALID_FORMAT_ERROR;
  162|      0|                    return;
  163|      0|                }
  164|      1|            }
  165|      1|        } else if (matchErrorCode == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (165:20): [True: 0, False: 0]
  ------------------
  166|       |            // ok for likely subtags
  167|      0|        } else {  // error other than missing resource
  168|      0|            errorCode = matchErrorCode;
  169|      0|            return;
  170|      0|        }
  171|       |
  172|       |        // Fetch & store invariant-character versions of strings
  173|       |        // only after we have collected and de-duplicated all of them.
  174|      1|        strings.freeze();
  175|       |
  176|      1|        languageAliases = CharStringMap(languagesLength / 2, errorCode);
  177|    244|        for (int32_t i = 0; i < languagesLength; i += 2) {
  ------------------
  |  Branch (177:29): [True: 243, False: 1]
  ------------------
  178|    243|            languageAliases.put(strings.get(languageIndexes[i]),
  179|    243|                                strings.get(languageIndexes[i + 1]), errorCode);
  180|    243|        }
  181|       |
  182|      1|        regionAliases = CharStringMap(regionsLength / 2, errorCode);
  183|     39|        for (int32_t i = 0; i < regionsLength; i += 2) {
  ------------------
  |  Branch (183:29): [True: 38, False: 1]
  ------------------
  184|     38|            regionAliases.put(strings.get(regionIndexes[i]),
  185|     38|                              strings.get(regionIndexes[i + 1]), errorCode);
  186|     38|        }
  187|      1|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (187:13): [True: 0, False: 1]
  ------------------
  188|       |
  189|      1|        lsrsLength = lsrSubtagsLength / 3;
  190|      1|        lsrs = new LSR[lsrsLength];
  191|      1|        if (lsrs == nullptr) {
  ------------------
  |  Branch (191:13): [True: 0, False: 1]
  ------------------
  192|      0|            errorCode = U_MEMORY_ALLOCATION_ERROR;
  193|      0|            return;
  194|      0|        }
  195|  7.50k|        for (int32_t i = 0, j = 0; i < lsrSubtagsLength; i += 3, ++j) {
  ------------------
  |  Branch (195:36): [True: 7.49k, False: 1]
  ------------------
  196|  7.49k|            lsrs[j] = LSR(strings.get(lsrSubtagIndexes[i]),
  197|  7.49k|                          strings.get(lsrSubtagIndexes[i + 1]),
  198|  7.49k|                          strings.get(lsrSubtagIndexes[i + 2]),
  199|  7.49k|                          LSR::IMPLICIT_LSR);
  200|  7.49k|        }
  201|       |
  202|      1|        if (partitionsLength > 0) {
  ------------------
  |  Branch (202:13): [True: 1, False: 0]
  ------------------
  203|      1|            distanceData.partitions = static_cast<const char **>(
  204|      1|                uprv_malloc(partitionsLength * sizeof(const char *)));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|      1|            if (distanceData.partitions == nullptr) {
  ------------------
  |  Branch (205:17): [True: 0, False: 1]
  ------------------
  206|      0|                errorCode = U_MEMORY_ALLOCATION_ERROR;
  207|      0|                return;
  208|      0|            }
  209|     17|            for (int32_t i = 0; i < partitionsLength; ++i) {
  ------------------
  |  Branch (209:33): [True: 16, False: 1]
  ------------------
  210|     16|                distanceData.partitions[i] = strings.get(partitionIndexes[i]);
  211|     16|            }
  212|      1|        }
  213|       |
  214|      1|        if (paradigmSubtagsLength > 0) {
  ------------------
  |  Branch (214:13): [True: 1, False: 0]
  ------------------
  215|      1|            distanceData.paradigmsLength = paradigmSubtagsLength / 3;
  216|      1|            LSR *paradigms = new LSR[distanceData.paradigmsLength];
  217|      1|            if (paradigms == nullptr) {
  ------------------
  |  Branch (217:17): [True: 0, False: 1]
  ------------------
  218|      0|                errorCode = U_MEMORY_ALLOCATION_ERROR;
  219|      0|                return;
  220|      0|            }
  221|      7|            for (int32_t i = 0, j = 0; i < paradigmSubtagsLength; i += 3, ++j) {
  ------------------
  |  Branch (221:40): [True: 6, False: 1]
  ------------------
  222|      6|                paradigms[j] = LSR(strings.get(paradigmSubtagIndexes[i]),
  223|      6|                                   strings.get(paradigmSubtagIndexes[i + 1]),
  224|      6|                                   strings.get(paradigmSubtagIndexes[i + 2]),
  225|      6|                                   LSR::DONT_CARE_FLAGS);
  226|      6|            }
  227|      1|            distanceData.paradigms = paradigms;
  228|      1|        }
  229|      1|    }
_ZN6icu_7817LikelySubtagsData11readStringsERKNS_13ResourceTableEPKcRNS_13ResourceValueERNS_11LocalMemoryIiEERiR10UErrorCode:
  233|      3|                     LocalMemory<int32_t> &indexes, int32_t &length, UErrorCode &errorCode) {
  234|      3|        if (U_FAILURE(errorCode)) { return false; }
  ------------------
  |  Branch (234:13): [True: 0, False: 3]
  ------------------
  235|      3|        if (table.findValue(key, value)) {
  ------------------
  |  Branch (235:13): [True: 3, False: 0]
  ------------------
  236|      3|            ResourceArray stringArray = value.getArray(errorCode);
  237|      3|            if (U_FAILURE(errorCode)) { return false; }
  ------------------
  |  Branch (237:17): [True: 0, False: 3]
  ------------------
  238|      3|            length = stringArray.getSize();
  239|      3|            if (length == 0) { return true; }
  ------------------
  |  Branch (239:17): [True: 0, False: 3]
  ------------------
  240|      3|            int32_t *rawIndexes = indexes.allocateInsteadAndCopy(length);
  241|      3|            if (rawIndexes == nullptr) {
  ------------------
  |  Branch (241:17): [True: 0, False: 3]
  ------------------
  242|      0|                errorCode = U_MEMORY_ALLOCATION_ERROR;
  243|      0|                return false;
  244|      0|            }
  245|    581|            for (int i = 0; i < length; ++i) {
  ------------------
  |  Branch (245:29): [True: 578, False: 3]
  ------------------
  246|    578|                if (stringArray.getValue(i, value)) {  // returns true because i < length
  ------------------
  |  Branch (246:21): [True: 578, False: 0]
  ------------------
  247|    578|                    int32_t strLength = 0;
  248|    578|                    rawIndexes[i] = strings.add(value.getString(strLength, errorCode), errorCode);
  249|    578|                    if (U_FAILURE(errorCode)) { return false; }
  ------------------
  |  Branch (249:25): [True: 0, False: 578]
  ------------------
  250|    578|                }
  251|    578|            }
  252|      3|        }
  253|      3|        return true;
  254|      3|    }
_ZN6icu_7817LikelySubtagsData21readLSREncodedStringsERKNS_13ResourceTableEPKcRNS_13ResourceValueERKNS_13ResourceArrayERNS_11LocalMemoryIiEERiR10UErrorCode:
  318|      2|                     LocalMemory<int32_t> &indexes, int32_t &length, UErrorCode &errorCode) {
  319|      2|        if (U_FAILURE(errorCode)) { return false; }
  ------------------
  |  Branch (319:13): [True: 0, False: 2]
  ------------------
  320|      2|        if (table.findValue(key, value)) {
  ------------------
  |  Branch (320:13): [True: 2, False: 0]
  ------------------
  321|      2|            const int32_t* vectors = value.getIntVector(length, errorCode);
  322|      2|            if (U_FAILURE(errorCode)) { return false; }
  ------------------
  |  Branch (322:17): [True: 0, False: 2]
  ------------------
  323|      2|            if (length == 0) { return true; }
  ------------------
  |  Branch (323:17): [True: 0, False: 2]
  ------------------
  324|      2|            int32_t *rawIndexes = indexes.allocateInsteadAndCopy(length * 3);
  325|      2|            if (rawIndexes == nullptr) {
  ------------------
  |  Branch (325:17): [True: 0, False: 2]
  ------------------
  326|      0|                errorCode = U_MEMORY_ALLOCATION_ERROR;
  327|      0|                return false;
  328|      0|            }
  329|  7.50k|            for (int i = 0; i < length; ++i) {
  ------------------
  |  Branch (329:29): [True: 7.50k, False: 2]
  ------------------
  330|  7.50k|                rawIndexes[i*3] = strings.addByValue(toLanguage(vectors[i]), errorCode);
  331|  7.50k|                rawIndexes[i*3+1] = strings.addByValue(toScript(vectors[i]), errorCode);
  332|  7.50k|                rawIndexes[i*3+2] = strings.addByValue(
  333|  7.50k|                    toRegion(m49Array, value, vectors[i], errorCode), errorCode);
  334|  7.50k|                if (U_FAILURE(errorCode)) { return false; }
  ------------------
  |  Branch (334:21): [True: 0, False: 7.50k]
  ------------------
  335|  7.50k|            }
  336|      2|            length *= 3;
  337|      2|        }
  338|      2|        return true;
  339|      2|    }
_ZN6icu_7817LikelySubtagsData10toLanguageEi:
  255|  7.50k|    UnicodeString toLanguage(int encoded) {
  256|  7.50k|        if (encoded == 0) {
  ------------------
  |  Branch (256:13): [True: 1, False: 7.50k]
  ------------------
  257|      1|            return UNICODE_STRING_SIMPLE("");
  ------------------
  |  |  135|      1|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|      1|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  258|      1|        }
  259|  7.50k|        if (encoded == 1) {
  ------------------
  |  Branch (259:13): [True: 1, False: 7.50k]
  ------------------
  260|      1|            return UNICODE_STRING_SIMPLE("skip");
  ------------------
  |  |  135|      1|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|      1|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  261|      1|        }
  262|  7.50k|        encoded &= 0x00ffffff;
  263|  7.50k|        encoded %= 27*27*27;
  264|  7.50k|        char lang[3];
  265|  7.50k|        lang[0] = 'a' + ((encoded % 27) - 1);
  266|  7.50k|        lang[1] = 'a' + (((encoded / 27 ) % 27) - 1);
  267|  7.50k|        if (encoded / (27 * 27) == 0) {
  ------------------
  |  Branch (267:13): [True: 438, False: 7.06k]
  ------------------
  268|    438|            return UnicodeString(lang, 2, US_INV);
  ------------------
  |  |   98|    438|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  269|    438|        }
  270|  7.06k|        lang[2] = 'a' + ((encoded / (27 * 27)) - 1);
  271|  7.06k|        return UnicodeString(lang, 3, US_INV);
  ------------------
  |  |   98|  7.06k|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  272|  7.50k|    }
_ZN6icu_7817LikelySubtagsData8toScriptEi:
  273|  7.50k|    UnicodeString toScript(int encoded) {
  274|  7.50k|        if (encoded == 0) {
  ------------------
  |  Branch (274:13): [True: 1, False: 7.50k]
  ------------------
  275|      1|            return UNICODE_STRING_SIMPLE("");
  ------------------
  |  |  135|      1|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|      1|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  276|      1|        }
  277|  7.50k|        if (encoded == 1) {
  ------------------
  |  Branch (277:13): [True: 1, False: 7.50k]
  ------------------
  278|      1|            return UNICODE_STRING_SIMPLE("script");
  ------------------
  |  |  135|      1|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|      1|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  279|      1|        }
  280|  7.50k|        encoded = (encoded >> 24) & 0x000000ff;
  281|  7.50k|        const char* script = uscript_getShortName(static_cast<UScriptCode>(encoded));
  ------------------
  |  | 1708|  7.50k|#define uscript_getShortName U_ICU_ENTRY_POINT_RENAME(uscript_getShortName)
  |  |  ------------------
  |  |  |  |  123|  7.50k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.50k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.50k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  282|  7.50k|        if (script == nullptr) {
  ------------------
  |  Branch (282:13): [True: 0, False: 7.50k]
  ------------------
  283|      0|            return UNICODE_STRING_SIMPLE("");
  ------------------
  |  |  135|      0|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|      0|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  284|      0|        }
  285|  7.50k|        U_ASSERT(uprv_strlen(script) == 4);
  ------------------
  |  |   35|  7.50k|#   define U_ASSERT(exp) (void)0
  ------------------
  286|  7.50k|        return UnicodeString(script, 4, US_INV);
  ------------------
  |  |   98|  7.50k|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  287|  7.50k|    }
_ZN6icu_7817LikelySubtagsData8toRegionERKNS_13ResourceArrayERNS_13ResourceValueEiR10UErrorCode:
  300|  7.50k|    UnicodeString toRegion(const ResourceArray& m49Array, ResourceValue &value, int encoded, UErrorCode &errorCode) {
  301|  7.50k|        if (U_FAILURE(errorCode) || encoded == 0 || encoded == 1) {
  ------------------
  |  Branch (301:13): [True: 0, False: 7.50k]
  |  Branch (301:37): [True: 1, False: 7.50k]
  |  Branch (301:53): [True: 1, False: 7.50k]
  ------------------
  302|      2|            return UNICODE_STRING_SIMPLE("");
  ------------------
  |  |  135|      2|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|      2|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  303|      2|        }
  304|  7.50k|        encoded &= 0x00ffffff;
  305|  7.50k|        encoded /= 27 * 27 * 27;
  306|  7.50k|        encoded %= 27 * 27;
  307|  7.50k|        if (encoded < 27) {
  ------------------
  |  Branch (307:13): [True: 19, False: 7.48k]
  ------------------
  308|       |            // Selected M49 code index, find the code from "m49" resource.
  309|     19|            return  m49IndexToCode(m49Array, value, encoded, errorCode);
  310|     19|        }
  311|  7.48k|        char region[2];
  312|  7.48k|        region[0] = 'A' + ((encoded % 27) - 1);
  313|  7.48k|        region[1] = 'A' + (((encoded / 27) % 27) - 1);
  314|  7.48k|        return UnicodeString(region, 2, US_INV);
  ------------------
  |  |   98|  7.48k|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  315|  7.50k|    }
_ZN6icu_7817LikelySubtagsData14m49IndexToCodeERKNS_13ResourceArrayERNS_13ResourceValueEiR10UErrorCode:
  288|     19|    UnicodeString m49IndexToCode(const ResourceArray &m49Array, ResourceValue &value, int index, UErrorCode &errorCode) {
  289|     19|        if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (289:13): [True: 0, False: 19]
  ------------------
  290|      0|            return UNICODE_STRING_SIMPLE("");
  ------------------
  |  |  135|      0|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|      0|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  291|      0|        }
  292|     19|        if (m49Array.getValue(index, value)) {
  ------------------
  |  Branch (292:13): [True: 19, False: 0]
  ------------------
  293|     19|            return value.getUnicodeString(errorCode);
  294|     19|        }
  295|       |        // "m49" does not include the index.
  296|      0|        errorCode = U_MISSING_RESOURCE_ERROR;
  297|      0|        return UNICODE_STRING_SIMPLE("");
  ------------------
  |  |  135|      0|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|      0|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  298|     19|    }
loclikelysubtags.cpp:_ZN6icu_7812_GLOBAL__N_121getStaticMacroregionsER10UErrorCode:
  430|      1|UVector* getStaticMacroregions(UErrorCode &status) {
  431|      1|    if (U_FAILURE(status)) { return nullptr; }
  ------------------
  |  Branch (431:9): [True: 0, False: 1]
  ------------------
  432|      1|    LocalPointer<UVector> newMacroRegions(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status);
  ------------------
  |  | 1489|      1|#define uprv_deleteUObject U_ICU_ENTRY_POINT_RENAME(uprv_deleteUObject)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  LocalPointer<UVector> newMacroRegions(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status);
  ------------------
  |  |  999|      1|#define uhash_compareUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_compareUnicodeString)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  433|       |
  434|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (434:9): [True: 0, False: 1]
  ------------------
  435|      0|        return nullptr;
  436|      0|    }
  437|       |
  438|     24|    for (const auto *region : MACROREGION_HARDCODE) {
  ------------------
  |  Branch (438:29): [True: 24, False: 1]
  ------------------
  439|     24|        UnicodeString regionName(region);
  440|     24|        processMacroregionRange(regionName, newMacroRegions.getAlias(), status);
  441|     24|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (441:13): [True: 0, False: 24]
  ------------------
  442|      0|            return nullptr;
  443|      0|        }
  444|     24|    }
  445|       |
  446|      1|    return newMacroRegions.orphan();
  447|      1|}
loclikelysubtags.cpp:_ZN6icu_7812_GLOBAL__N_123processMacroregionRangeERKNS_13UnicodeStringEPNS_7UVectorER10UErrorCode:
  385|     24|void processMacroregionRange(const UnicodeString& regionName, UVector* newMacroRegions, UErrorCode& status) {
  386|     24|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (386:9): [True: 0, False: 24]
  ------------------
  387|     24|    int32_t rangeMarkerLocation = regionName.indexOf(RANGE_MARKER);
  388|     24|    char16_t buf[6];
  389|     24|    regionName.extract(buf,6,status);
  390|     24|    if ( rangeMarkerLocation > 0 ) {
  ------------------
  |  Branch (390:10): [True: 8, False: 16]
  ------------------
  391|      8|        char16_t endRange = regionName.charAt(rangeMarkerLocation+1);
  392|      8|        buf[rangeMarkerLocation] = 0;
  393|     27|        while ( buf[rangeMarkerLocation-1] <= endRange && U_SUCCESS(status)) {
  ------------------
  |  Branch (393:17): [True: 19, False: 8]
  |  Branch (393:59): [True: 19, False: 0]
  ------------------
  394|     19|            LocalPointer<UnicodeString> newRegion(new UnicodeString(buf), status);
  395|     19|            newMacroRegions->adoptElement(newRegion.orphan(),status);
  396|     19|            buf[rangeMarkerLocation-1]++;
  397|     19|        }
  398|     16|    } else {
  399|     16|        LocalPointer<UnicodeString> newRegion(new UnicodeString(regionName), status);
  400|     16|        newMacroRegions->adoptElement(newRegion.orphan(),status);
  401|     16|    }
  402|     24|}
_ZN6icu_7817LikelySubtagsDataD2Ev:
   67|      1|    ~LikelySubtagsData() {
   68|      1|        ures_close(langInfoBundle);
  ------------------
  |  | 1652|      1|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   69|      1|        delete[] lsrs;
   70|      1|    }
loclikelysubtags.cpp:_ZN6icu_7812_GLOBAL__N_112getCanonicalERKNS_13CharStringMapEPKc:
  552|      4|const char *getCanonical(const CharStringMap &aliases, const char *alias) {
  553|      4|    const char *canonical = aliases.get(alias);
  554|      4|    return canonical == nullptr ? alias : canonical;
  ------------------
  |  Branch (554:12): [True: 4, False: 0]
  ------------------
  555|      4|}

_ZN6icu_7818LocaleDistanceDataC2Ev:
   25|      1|    LocaleDistanceData() = default;

_ZN6icu_783LSRC2ENS_11StringPieceES1_S1_iR10UErrorCode:
   36|      8|        language(nullptr), script(nullptr), region(nullptr),
   37|      8|        regionIndex(indexForRegion(r.data())), flags(f) {
   38|      8|    if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (38:9): [True: 8, False: 0]
  ------------------
   39|      8|        CharString data;
   40|      8|        data.append(lang, errorCode).append('\0', errorCode);
   41|      8|        int32_t scriptOffset = data.length();
   42|      8|        data.append(scr, errorCode).append('\0', errorCode);
   43|      8|        int32_t regionOffset = data.length();
   44|      8|        data.append(r, errorCode);
   45|      8|        owned = data.cloneData(errorCode);
   46|      8|        if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (46:13): [True: 8, False: 0]
  ------------------
   47|      8|            language = owned;
   48|      8|            script = owned + scriptOffset;
   49|      8|            region = owned + regionOffset;
   50|      8|        }
   51|      8|    }
   52|      8|}
_ZN6icu_783LSRC2EOS0_:
   55|      2|        language(other.language), script(other.script), region(other.region), owned(other.owned),
   56|      2|        regionIndex(other.regionIndex), flags(other.flags),
   57|      2|        hashCode(other.hashCode) {
   58|      2|    if (owned != nullptr) {
  ------------------
  |  Branch (58:9): [True: 0, False: 2]
  ------------------
   59|      0|        other.language = other.script = "";
   60|      0|        other.owned = nullptr;
   61|      0|        other.hashCode = 0;
   62|      0|    }
   63|      2|}
_ZN6icu_783LSR11deleteOwnedEv:
   65|      8|void LSR::deleteOwned() {
   66|      8|    uprv_free(owned);
  ------------------
  |  | 1503|      8|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      8|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      8|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      8|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   67|      8|}
_ZN6icu_783LSRaSEOS0_:
   69|  7.50k|LSR &LSR::operator=(LSR &&other) noexcept {
   70|  7.50k|    this->~LSR();
   71|  7.50k|    language = other.language;
   72|  7.50k|    script = other.script;
   73|  7.50k|    region = other.region;
   74|  7.50k|    regionIndex = other.regionIndex;
   75|  7.50k|    flags = other.flags;
   76|  7.50k|    owned = other.owned;
   77|  7.50k|    hashCode = other.hashCode;
   78|  7.50k|    if (owned != nullptr) {
  ------------------
  |  Branch (78:9): [True: 0, False: 7.50k]
  ------------------
   79|      0|        other.language = other.script = "";
   80|      0|        other.owned = nullptr;
   81|      0|        other.hashCode = 0;
   82|      0|    }
   83|  7.50k|    return *this;
   84|  7.50k|}
_ZNK6icu_783LSR14isEquivalentToERKS0_:
   86|      3|UBool LSR::isEquivalentTo(const LSR &other) const {
   87|      3|    return
   88|      3|        uprv_strcmp(language, other.language) == 0 &&
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (88:9): [True: 3, False: 0]
  ------------------
   89|      3|        uprv_strcmp(script, other.script) == 0 &&
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (89:9): [True: 3, False: 0]
  ------------------
   90|      3|        regionIndex == other.regionIndex &&
  ------------------
  |  Branch (90:9): [True: 3, False: 0]
  ------------------
   91|       |        // Compare regions if both are ill-formed (and their indexes are 0).
   92|      3|        (regionIndex > 0 || uprv_strcmp(region, other.region) == 0);
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (92:10): [True: 3, False: 0]
  |  Branch (92:29): [True: 0, False: 0]
  ------------------
   93|      3|}
_ZN6icu_783LSR14indexForRegionEPKc:
  105|  7.51k|int32_t LSR::indexForRegion(const char *region) {
  106|  7.51k|    int32_t c = region[0];
  107|  7.51k|    int32_t a = c - '0';
  108|  7.51k|    if (0 <= a && a <= 9) {  // digits: "419"
  ------------------
  |  Branch (108:9): [True: 7.51k, False: 5]
  |  Branch (108:19): [True: 19, False: 7.49k]
  ------------------
  109|     19|        int32_t b = region[1] - '0';
  110|     19|        if (b < 0 || 9 < b) { return 0; }
  ------------------
  |  Branch (110:13): [True: 0, False: 19]
  |  Branch (110:22): [True: 0, False: 19]
  ------------------
  111|     19|        c = region[2] - '0';
  112|     19|        if (c < 0 || 9 < c || region[3] != 0) { return 0; }
  ------------------
  |  Branch (112:13): [True: 0, False: 19]
  |  Branch (112:22): [True: 0, False: 19]
  |  Branch (112:31): [True: 0, False: 19]
  ------------------
  113|     19|        return (10 * a + b) * 10 + c + 1;
  114|  7.49k|    } else {  // letters: "DE"
  115|  7.49k|        a = uprv_upperOrdinal(c);
  116|  7.49k|        if (a < 0 || 25 < a) { return 0; }
  ------------------
  |  Branch (116:13): [True: 5, False: 7.49k]
  |  Branch (116:22): [True: 0, False: 7.49k]
  ------------------
  117|  7.49k|        int32_t b = uprv_upperOrdinal(region[1]);
  118|  7.49k|        if (b < 0 || 25 < b || region[2] != 0) { return 0; }
  ------------------
  |  Branch (118:13): [True: 0, False: 7.49k]
  |  Branch (118:22): [True: 0, False: 7.49k]
  |  Branch (118:32): [True: 0, False: 7.49k]
  ------------------
  119|  7.49k|        return 26 * a + b + 1001;
  120|  7.49k|    }
  121|      0|    return 0;
  122|  7.51k|}

_ZN6icu_783LSRD2Ev:
   53|  15.0k|    inline ~LSR() {
   54|       |        // Pure inline code for almost all instances.
   55|  15.0k|        if (owned != nullptr) {
  ------------------
  |  Branch (55:13): [True: 8, False: 15.0k]
  ------------------
   56|      8|            deleteOwned();
   57|      8|        }
   58|  15.0k|    }
_ZN6icu_783LSRC2Ev:
   37|  7.50k|    LSR() : language("und"), script(""), region("") {}
_ZN6icu_783LSRC2EPKcS2_S2_i:
   41|  7.50k|            language(lang),  script(scr), region(r),
   42|  7.50k|            regionIndex(indexForRegion(region)), flags(f) {}

_ZN6icu_7814MessagePatternC2ER10UErrorCode:
  147|  28.8k|        : aposMode(UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE),
  ------------------
  |  |  379|  28.8k|#   define UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE UMSGPAT_APOS_DOUBLE_OPTIONAL
  ------------------
  148|  28.8k|          partsList(nullptr), parts(nullptr), partsLength(0),
  149|  28.8k|          numericValuesList(nullptr), numericValues(nullptr), numericValuesLength(0),
  150|  28.8k|          hasArgNames(false), hasArgNumbers(false), needsAutoQuoting(false) {
  151|  28.8k|    init(errorCode);
  152|  28.8k|}
_ZN6icu_7814MessagePatternC2ERKNS_13UnicodeStringEP11UParseErrorR10UErrorCode:
  163|  7.59k|        : aposMode(UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE),
  ------------------
  |  |  379|  7.59k|#   define UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE UMSGPAT_APOS_DOUBLE_OPTIONAL
  ------------------
  164|  7.59k|          partsList(nullptr), parts(nullptr), partsLength(0),
  165|  7.59k|          numericValuesList(nullptr), numericValues(nullptr), numericValuesLength(0),
  166|  7.59k|          hasArgNames(false), hasArgNumbers(false), needsAutoQuoting(false) {
  167|  7.59k|    if(init(errorCode)) {
  ------------------
  |  Branch (167:8): [True: 7.59k, False: 0]
  ------------------
  168|  7.59k|        parse(pattern, parseError, errorCode);
  169|  7.59k|    }
  170|  7.59k|}
_ZN6icu_7814MessagePattern4initER10UErrorCode:
  173|  36.3k|MessagePattern::init(UErrorCode &errorCode) {
  174|  36.3k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (174:8): [True: 0, False: 36.3k]
  ------------------
  175|      0|        return false;
  176|      0|    }
  177|  36.3k|    partsList=new MessagePatternPartsList();
  178|  36.3k|    if(partsList==nullptr) {
  ------------------
  |  Branch (178:8): [True: 0, False: 36.3k]
  ------------------
  179|      0|        errorCode=U_MEMORY_ALLOCATION_ERROR;
  180|      0|        return false;
  181|      0|    }
  182|  36.3k|    parts=partsList->a.getAlias();
  183|  36.3k|    return true;
  184|  36.3k|}
_ZN6icu_7814MessagePatternD2Ev:
  260|  36.3k|MessagePattern::~MessagePattern() {
  261|  36.3k|    delete partsList;
  262|  36.3k|    delete numericValuesList;
  263|  36.3k|}
_ZN6icu_7814MessagePattern5parseERKNS_13UnicodeStringEP11UParseErrorR10UErrorCode:
  268|  15.1k|MessagePattern::parse(const UnicodeString &pattern, UParseError *parseError, UErrorCode &errorCode) {
  269|  15.1k|    preParse(pattern, parseError, errorCode);
  270|  15.1k|    parseMessage(0, 0, 0, UMSGPAT_ARG_TYPE_NONE, parseError, errorCode);
  271|  15.1k|    postParse();
  272|  15.1k|    return *this;
  273|  15.1k|}
_ZN6icu_7814MessagePattern16parsePluralStyleERKNS_13UnicodeStringEP11UParseErrorR10UErrorCode:
  286|  21.2k|                                 UParseError *parseError, UErrorCode &errorCode) {
  287|  21.2k|    preParse(pattern, parseError, errorCode);
  288|  21.2k|    parsePluralOrSelectStyle(UMSGPAT_ARG_TYPE_PLURAL, 0, 0, parseError, errorCode);
  289|  21.2k|    postParse();
  290|  21.2k|    return *this;
  291|  21.2k|}
_ZN6icu_7814MessagePattern5clearEv:
  303|  3.64k|MessagePattern::clear() {
  304|       |    // Mostly the same as preParse().
  305|  3.64k|    msg.remove();
  306|  3.64k|    hasArgNames=hasArgNumbers=false;
  307|  3.64k|    needsAutoQuoting=false;
  308|  3.64k|    partsLength=0;
  309|  3.64k|    numericValuesLength=0;
  310|  3.64k|}
_ZNK6icu_7814MessagePattern15getPluralOffsetEi:
  379|  21.2k|MessagePattern::getPluralOffset(int32_t pluralStart) const {
  380|  21.2k|    const Part &part=getPart(pluralStart);
  381|  21.2k|    if(Part::hasNumericValue(part.type)) {
  ------------------
  |  Branch (381:8): [True: 0, False: 21.2k]
  ------------------
  382|      0|        return getNumericValue(part);
  383|  21.2k|    } else {
  384|  21.2k|        return 0;
  385|  21.2k|    }
  386|  21.2k|}
_ZN6icu_7814MessagePattern8preParseERKNS_13UnicodeStringEP11UParseErrorR10UErrorCode:
  406|  36.3k|MessagePattern::preParse(const UnicodeString &pattern, UParseError *parseError, UErrorCode &errorCode) {
  407|  36.3k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (407:8): [True: 0, False: 36.3k]
  ------------------
  408|      0|        return;
  409|      0|    }
  410|  36.3k|    if(parseError!=nullptr) {
  ------------------
  |  Branch (410:8): [True: 15.1k, False: 21.2k]
  ------------------
  411|  15.1k|        parseError->line=0;
  412|  15.1k|        parseError->offset=0;
  413|  15.1k|        parseError->preContext[0]=0;
  414|  15.1k|        parseError->postContext[0]=0;
  415|  15.1k|    }
  416|  36.3k|    msg=pattern;
  417|  36.3k|    hasArgNames=hasArgNumbers=false;
  418|  36.3k|    needsAutoQuoting=false;
  419|  36.3k|    partsLength=0;
  420|  36.3k|    numericValuesLength=0;
  421|  36.3k|}
_ZN6icu_7814MessagePattern9postParseEv:
  424|  36.3k|MessagePattern::postParse() {
  425|  36.3k|    if(partsList!=nullptr) {
  ------------------
  |  Branch (425:8): [True: 36.3k, False: 0]
  ------------------
  426|  36.3k|        parts=partsList->a.getAlias();
  427|  36.3k|    }
  428|  36.3k|    if(numericValuesList!=nullptr) {
  ------------------
  |  Branch (428:8): [True: 500, False: 35.8k]
  ------------------
  429|    500|        numericValues=numericValuesList->a.getAlias();
  430|    500|    }
  431|  36.3k|}
_ZN6icu_7814MessagePattern12parseMessageEiii22UMessagePatternArgTypeP11UParseErrorR10UErrorCode:
  436|   681k|                             UParseError *parseError, UErrorCode &errorCode) {
  437|   681k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (437:8): [True: 0, False: 681k]
  ------------------
  438|      0|        return 0;
  439|      0|    }
  440|   681k|    if(nestingLevel>Part::MAX_NESTED_LEVELS) {
  ------------------
  |  Branch (440:8): [True: 2, False: 681k]
  ------------------
  441|      2|        errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  442|      2|        return 0;
  443|      2|    }
  444|   681k|    int32_t msgStart=partsLength;
  445|   681k|    addPart(UMSGPAT_PART_TYPE_MSG_START, index, msgStartLength, nestingLevel, errorCode);
  446|   681k|    index+=msgStartLength;
  447|  94.5M|    for(;;) {  // while(index<msg.length()) with U_FAILURE(errorCode) check
  448|  94.5M|        if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (448:12): [True: 79.2k, False: 94.5M]
  ------------------
  449|  79.2k|            return 0;
  450|  79.2k|        }
  451|  94.5M|        if(index>=msg.length()) {
  ------------------
  |  Branch (451:12): [True: 8.93k, False: 94.4M]
  ------------------
  452|  8.93k|            break;
  453|  8.93k|        }
  454|  94.4M|        char16_t c=msg.charAt(index++);
  455|  94.4M|        if(c==u_apos) {
  ------------------
  |  Branch (455:12): [True: 1.62M, False: 92.8M]
  ------------------
  456|  1.62M|            if(index==msg.length()) {
  ------------------
  |  Branch (456:16): [True: 26, False: 1.62M]
  ------------------
  457|       |                // The apostrophe is the last character in the pattern. 
  458|       |                // Add a Part for auto-quoting.
  459|     26|                addPart(UMSGPAT_PART_TYPE_INSERT_CHAR, index, 0,
  460|     26|                        u_apos, errorCode);  // value=char to be inserted
  461|     26|                needsAutoQuoting=true;
  462|  1.62M|            } else {
  463|  1.62M|                c=msg.charAt(index);
  464|  1.62M|                if(c==u_apos) {
  ------------------
  |  Branch (464:20): [True: 82.3k, False: 1.53M]
  ------------------
  465|       |                    // double apostrophe, skip the second one
  466|  82.3k|                    addPart(UMSGPAT_PART_TYPE_SKIP_SYNTAX, index++, 1, 0, errorCode);
  467|  1.53M|                } else if(
  468|  1.53M|                    aposMode==UMSGPAT_APOS_DOUBLE_REQUIRED ||
  ------------------
  |  Branch (468:21): [True: 0, False: 1.53M]
  ------------------
  469|  1.53M|                    c==u_leftCurlyBrace || c==u_rightCurlyBrace ||
  ------------------
  |  Branch (469:21): [True: 360, False: 1.53M]
  |  Branch (469:44): [True: 93.3k, False: 1.44M]
  ------------------
  470|  1.53M|                    (parentType==UMSGPAT_ARG_TYPE_CHOICE && c==u_pipe) ||
  ------------------
  |  Branch (470:22): [True: 25.3k, False: 1.42M]
  |  Branch (470:61): [True: 336, False: 25.0k]
  ------------------
  471|  1.53M|                    (UMSGPAT_ARG_TYPE_HAS_PLURAL_STYLE(parentType) && c==u_pound)
  ------------------
  |  |  273|  2.89M|    ((argType)==UMSGPAT_ARG_TYPE_PLURAL || (argType)==UMSGPAT_ARG_TYPE_SELECTORDINAL)
  |  |  ------------------
  |  |  |  Branch (273:6): [True: 4.69k, False: 1.44M]
  |  |  |  Branch (273:44): [True: 6.66k, False: 1.43M]
  |  |  ------------------
  ------------------
  |  Branch (471:71): [True: 3.12k, False: 8.23k]
  ------------------
  472|  1.53M|                ) {
  473|       |                    // skip the quote-starting apostrophe
  474|  97.1k|                    addPart(UMSGPAT_PART_TYPE_SKIP_SYNTAX, index-1, 1, 0, errorCode);
  475|       |                    // find the end of the quoted literal text
  476|  99.0k|                    for(;;) {
  477|  99.0k|                        index=msg.indexOf(u_apos, index+1);
  478|  99.0k|                        if(index>=0) {
  ------------------
  |  Branch (478:28): [True: 98.8k, False: 196]
  ------------------
  479|  98.8k|                            if(/*(index+1)<msg.length() &&*/ msg.charAt(index+1)==u_apos) {
  ------------------
  |  Branch (479:62): [True: 1.89k, False: 96.9k]
  ------------------
  480|       |                                // double apostrophe inside quoted literal text
  481|       |                                // still encodes a single apostrophe, skip the second one
  482|  1.89k|                                addPart(UMSGPAT_PART_TYPE_SKIP_SYNTAX, ++index, 1, 0, errorCode);
  483|  96.9k|                            } else {
  484|       |                                // skip the quote-ending apostrophe
  485|  96.9k|                                addPart(UMSGPAT_PART_TYPE_SKIP_SYNTAX, index++, 1, 0, errorCode);
  486|  96.9k|                                break;
  487|  96.9k|                            }
  488|  98.8k|                        } else {
  489|       |                            // The quoted text reaches to the end of the of the message.
  490|    196|                            index=msg.length();
  491|       |                            // Add a Part for auto-quoting.
  492|    196|                            addPart(UMSGPAT_PART_TYPE_INSERT_CHAR, index, 0,
  493|    196|                                    u_apos, errorCode);  // value=char to be inserted
  494|    196|                            needsAutoQuoting=true;
  495|    196|                            break;
  496|    196|                        }
  497|  99.0k|                    }
  498|  1.44M|                } else {
  499|       |                    // Interpret the apostrophe as literal text.
  500|       |                    // Add a Part for auto-quoting.
  501|  1.44M|                    addPart(UMSGPAT_PART_TYPE_INSERT_CHAR, index, 0,
  502|  1.44M|                            u_apos, errorCode);  // value=char to be inserted
  503|  1.44M|                    needsAutoQuoting=true;
  504|  1.44M|                }
  505|  1.62M|            }
  506|  92.8M|        } else if(UMSGPAT_ARG_TYPE_HAS_PLURAL_STYLE(parentType) && c==u_pound) {
  ------------------
  |  |  273|   185M|    ((argType)==UMSGPAT_ARG_TYPE_PLURAL || (argType)==UMSGPAT_ARG_TYPE_SELECTORDINAL)
  |  |  ------------------
  |  |  |  Branch (273:6): [True: 623k, False: 92.2M]
  |  |  |  Branch (273:44): [True: 471k, False: 91.7M]
  |  |  ------------------
  ------------------
  |  Branch (506:68): [True: 6.51k, False: 1.08M]
  ------------------
  507|       |            // The unquoted # in a plural message fragment will be replaced
  508|       |            // with the (number-offset).
  509|  6.51k|            addPart(UMSGPAT_PART_TYPE_REPLACE_NUMBER, index-1, 1, 0, errorCode);
  510|  92.8M|        } else if(c==u_leftCurlyBrace) {
  ------------------
  |  Branch (510:19): [True: 676k, False: 92.1M]
  ------------------
  511|   676k|            index=parseArg(index-1, 1, nestingLevel, parseError, errorCode);
  512|  92.1M|        } else if((nestingLevel>0 && c==u_rightCurlyBrace) ||
  ------------------
  |  Branch (512:20): [True: 8.08M, False: 84.1M]
  |  Branch (512:38): [True: 90.8k, False: 7.99M]
  ------------------
  513|  92.1M|                  (parentType==UMSGPAT_ARG_TYPE_CHOICE && c==u_pipe)) {
  ------------------
  |  Branch (513:20): [True: 6.94M, False: 85.1M]
  |  Branch (513:59): [True: 502k, False: 6.43M]
  ------------------
  514|       |            // Finish the message before the terminator.
  515|       |            // In a choice style, report the "}" substring only for the following ARG_LIMIT,
  516|       |            // not for this MSG_LIMIT.
  517|   593k|            int32_t limitLength=(parentType==UMSGPAT_ARG_TYPE_CHOICE && c==u_rightCurlyBrace) ? 0 : 1;
  ------------------
  |  Branch (517:34): [True: 506k, False: 87.0k]
  |  Branch (517:73): [True: 3.81k, False: 502k]
  ------------------
  518|   593k|            addLimitPart(msgStart, UMSGPAT_PART_TYPE_MSG_LIMIT, index-1, limitLength,
  519|   593k|                         nestingLevel, errorCode);
  520|   593k|            if(parentType==UMSGPAT_ARG_TYPE_CHOICE) {
  ------------------
  |  Branch (520:16): [True: 506k, False: 87.0k]
  ------------------
  521|       |                // Let the choice style parser see the '}' or '|'.
  522|   506k|                return index-1;
  523|   506k|            } else {
  524|       |                // continue parsing after the '}'
  525|  87.0k|                return index;
  526|  87.0k|            }
  527|   593k|        }  // else: c is part of literal text
  528|  94.4M|    }
  529|  8.93k|    if(nestingLevel>0 && !inTopLevelChoiceMessage(nestingLevel, parentType)) {
  ------------------
  |  Branch (529:8): [True: 420, False: 8.51k]
  |  Branch (529:26): [True: 420, False: 0]
  ------------------
  530|    420|        setParseError(parseError, 0);  // Unmatched '{' braces in message.
  531|    420|        errorCode=U_UNMATCHED_BRACES;
  532|    420|        return 0;
  533|    420|    }
  534|  8.51k|    addLimitPart(msgStart, UMSGPAT_PART_TYPE_MSG_LIMIT, index, 0, nestingLevel, errorCode);
  535|  8.51k|    return index;
  536|  8.93k|}
_ZN6icu_7814MessagePattern8parseArgEiiiP11UParseErrorR10UErrorCode:
  540|   676k|                         UParseError *parseError, UErrorCode &errorCode) {
  541|   676k|    int32_t argStart=partsLength;
  542|   676k|    UMessagePatternArgType argType=UMSGPAT_ARG_TYPE_NONE;
  543|   676k|    addPart(UMSGPAT_PART_TYPE_ARG_START, index, argStartLength, argType, errorCode);
  544|   676k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (544:8): [True: 0, False: 676k]
  ------------------
  545|      0|        return 0;
  546|      0|    }
  547|   676k|    int32_t nameIndex=index=skipWhiteSpace(index+argStartLength);
  548|   676k|    if(index==msg.length()) {
  ------------------
  |  Branch (548:8): [True: 270, False: 676k]
  ------------------
  549|    270|        setParseError(parseError, 0);  // Unmatched '{' braces in message.
  550|    270|        errorCode=U_UNMATCHED_BRACES;
  551|    270|        return 0;
  552|    270|    }
  553|       |    // parse argument name or number
  554|   676k|    index=skipIdentifier(index);
  555|   676k|    int32_t number=parseArgNumber(nameIndex, index);
  556|   676k|    if(number>=0) {
  ------------------
  |  Branch (556:8): [True: 374k, False: 301k]
  ------------------
  557|   374k|        int32_t length=index-nameIndex;
  558|   374k|        if(length>Part::MAX_LENGTH || number>Part::MAX_VALUE) {
  ------------------
  |  Branch (558:12): [True: 0, False: 374k]
  |  Branch (558:39): [True: 98, False: 374k]
  ------------------
  559|     98|            setParseError(parseError, nameIndex);  // Argument number too large.
  560|     98|            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  561|     98|            return 0;
  562|     98|        }
  563|   374k|        hasArgNumbers=true;
  564|   374k|        addPart(UMSGPAT_PART_TYPE_ARG_NUMBER, nameIndex, length, number, errorCode);
  565|   374k|    } else if(number==UMSGPAT_ARG_NAME_NOT_NUMBER) {
  ------------------
  |  Branch (565:15): [True: 299k, False: 2.17k]
  ------------------
  566|   299k|        int32_t length=index-nameIndex;
  567|   299k|        if(length>Part::MAX_LENGTH) {
  ------------------
  |  Branch (567:12): [True: 2, False: 299k]
  ------------------
  568|      2|            setParseError(parseError, nameIndex);  // Argument name too long.
  569|      2|            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  570|      2|            return 0;
  571|      2|        }
  572|   299k|        hasArgNames=true;
  573|   299k|        addPart(UMSGPAT_PART_TYPE_ARG_NAME, nameIndex, length, 0, errorCode);
  574|   299k|    } else {  // number<-1 (ARG_NAME_NOT_VALID)
  575|  2.17k|        setParseError(parseError, nameIndex);  // Bad argument syntax.
  576|  2.17k|        errorCode=U_PATTERN_SYNTAX_ERROR;
  577|  2.17k|        return 0;
  578|  2.17k|    }
  579|   674k|    index=skipWhiteSpace(index);
  580|   674k|    if(index==msg.length()) {
  ------------------
  |  Branch (580:8): [True: 774, False: 673k]
  ------------------
  581|    774|        setParseError(parseError, 0);  // Unmatched '{' braces in message.
  582|    774|        errorCode=U_UNMATCHED_BRACES;
  583|    774|        return 0;
  584|    774|    }
  585|   673k|    char16_t c=msg.charAt(index);
  586|   673k|    if(c==u_rightCurlyBrace) {
  ------------------
  |  Branch (586:8): [True: 401k, False: 271k]
  ------------------
  587|       |        // all done
  588|   401k|    } else if(c!=u_comma) {
  ------------------
  |  Branch (588:15): [True: 368, False: 271k]
  ------------------
  589|    368|        setParseError(parseError, nameIndex);  // Bad argument syntax.
  590|    368|        errorCode=U_PATTERN_SYNTAX_ERROR;
  591|    368|        return 0;
  592|   271k|    } else /* ',' */ {
  593|       |        // parse argument type: case-sensitive a-zA-Z
  594|   271k|        int32_t typeIndex=index=skipWhiteSpace(index+1);
  595|  2.96M|        while(index<msg.length() && isArgTypeChar(msg.charAt(index))) {
  ------------------
  |  Branch (595:15): [True: 2.96M, False: 92]
  |  Branch (595:37): [True: 2.69M, False: 271k]
  ------------------
  596|  2.69M|            ++index;
  597|  2.69M|        }
  598|   271k|        int32_t length=index-typeIndex;
  599|   271k|        index=skipWhiteSpace(index);
  600|   271k|        if(index==msg.length()) {
  ------------------
  |  Branch (600:12): [True: 92, False: 271k]
  ------------------
  601|     92|            setParseError(parseError, 0);  // Unmatched '{' braces in message.
  602|     92|            errorCode=U_UNMATCHED_BRACES;
  603|     92|            return 0;
  604|     92|        }
  605|   271k|        if(length==0 || ((c=msg.charAt(index))!=u_comma && c!=u_rightCurlyBrace)) {
  ------------------
  |  Branch (605:12): [True: 108, False: 271k]
  |  Branch (605:26): [True: 71.2k, False: 200k]
  |  Branch (605:60): [True: 228, False: 71.0k]
  ------------------
  606|    336|            setParseError(parseError, nameIndex);  // Bad argument syntax.
  607|    336|            errorCode=U_PATTERN_SYNTAX_ERROR;
  608|    336|            return 0;
  609|    336|        }
  610|   271k|        if(length>Part::MAX_LENGTH) {
  ------------------
  |  Branch (610:12): [True: 2, False: 271k]
  ------------------
  611|      2|            setParseError(parseError, nameIndex);  // Argument type name too long.
  612|      2|            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  613|      2|            return 0;
  614|      2|        }
  615|   271k|        argType=UMSGPAT_ARG_TYPE_SIMPLE;
  616|   271k|        if(length==6) {
  ------------------
  |  Branch (616:12): [True: 81.7k, False: 189k]
  ------------------
  617|       |            // case-insensitive comparisons for complex-type names
  618|  81.7k|            if(isChoice(typeIndex)) {
  ------------------
  |  Branch (618:16): [True: 27.8k, False: 53.8k]
  ------------------
  619|  27.8k|                argType=UMSGPAT_ARG_TYPE_CHOICE;
  620|  53.8k|            } else if(isPlural(typeIndex)) {
  ------------------
  |  Branch (620:23): [True: 40.4k, False: 13.4k]
  ------------------
  621|  40.4k|                argType=UMSGPAT_ARG_TYPE_PLURAL;
  622|  40.4k|            } else if(isSelect(typeIndex)) {
  ------------------
  |  Branch (622:23): [True: 8.33k, False: 5.08k]
  ------------------
  623|  8.33k|                argType=UMSGPAT_ARG_TYPE_SELECT;
  624|  8.33k|            }
  625|   189k|        } else if(length==13) {
  ------------------
  |  Branch (625:19): [True: 7.63k, False: 181k]
  ------------------
  626|  7.63k|            if(isSelect(typeIndex) && isOrdinal(typeIndex+6)) {
  ------------------
  |  Branch (626:16): [True: 7.31k, False: 326]
  |  Branch (626:39): [True: 1.73k, False: 5.58k]
  ------------------
  627|  1.73k|                argType=UMSGPAT_ARG_TYPE_SELECTORDINAL;
  628|  1.73k|            }
  629|  7.63k|        }
  630|       |        // change the ARG_START type from NONE to argType
  631|   271k|        partsList->a[argStart].value = static_cast<int16_t>(argType);
  632|   271k|        if(argType==UMSGPAT_ARG_TYPE_SIMPLE) {
  ------------------
  |  Branch (632:12): [True: 192k, False: 78.3k]
  ------------------
  633|   192k|            addPart(UMSGPAT_PART_TYPE_ARG_TYPE, typeIndex, length, 0, errorCode);
  634|   192k|        }
  635|       |        // look for an argument style (pattern)
  636|   271k|        if(c==u_rightCurlyBrace) {
  ------------------
  |  Branch (636:12): [True: 71.0k, False: 200k]
  ------------------
  637|  71.0k|            if(argType!=UMSGPAT_ARG_TYPE_SIMPLE) {
  ------------------
  |  Branch (637:16): [True: 6, False: 71.0k]
  ------------------
  638|      6|                setParseError(parseError, nameIndex);  // No style field for complex argument.
  639|      6|                errorCode=U_PATTERN_SYNTAX_ERROR;
  640|      6|                return 0;
  641|      6|            }
  642|   200k|        } else /* ',' */ {
  643|   200k|            ++index;
  644|   200k|            if(argType==UMSGPAT_ARG_TYPE_SIMPLE) {
  ------------------
  |  Branch (644:16): [True: 121k, False: 78.3k]
  ------------------
  645|   121k|                index=parseSimpleStyle(index, parseError, errorCode);
  646|   121k|            } else if(argType==UMSGPAT_ARG_TYPE_CHOICE) {
  ------------------
  |  Branch (646:23): [True: 27.8k, False: 50.5k]
  ------------------
  647|  27.8k|                index=parseChoiceStyle(index, nestingLevel, parseError, errorCode);
  648|  50.5k|            } else {
  649|  50.5k|                index=parsePluralOrSelectStyle(argType, index, nestingLevel, parseError, errorCode);
  650|  50.5k|            }
  651|   200k|        }
  652|   271k|    }
  653|       |    // Argument parsing stopped on the '}'.
  654|   672k|    addLimitPart(argStart, UMSGPAT_PART_TYPE_ARG_LIMIT, index, 1, argType, errorCode);
  655|   672k|    return index+1;
  656|   673k|}
_ZN6icu_7814MessagePattern16parseSimpleStyleEiP11UParseErrorR10UErrorCode:
  659|   121k|MessagePattern::parseSimpleStyle(int32_t index, UParseError *parseError, UErrorCode &errorCode) {
  660|   121k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (660:8): [True: 0, False: 121k]
  ------------------
  661|      0|        return 0;
  662|      0|    }
  663|   121k|    int32_t start=index;
  664|   121k|    int32_t nestedBraces=0;
  665|  29.1M|    while(index<msg.length()) {
  ------------------
  |  Branch (665:11): [True: 29.1M, False: 510]
  ------------------
  666|  29.1M|        char16_t c=msg.charAt(index++);
  667|  29.1M|        if(c==u_apos) {
  ------------------
  |  Branch (667:12): [True: 64.9k, False: 29.0M]
  ------------------
  668|       |            // Treat apostrophe as quoting but include it in the style part.
  669|       |            // Find the end of the quoted literal text.
  670|  64.9k|            index=msg.indexOf(u_apos, index);
  671|  64.9k|            if(index<0) {
  ------------------
  |  Branch (671:16): [True: 56, False: 64.8k]
  ------------------
  672|       |                // Quoted literal argument style text reaches to the end of the message.
  673|     56|                setParseError(parseError, start);
  674|     56|                errorCode=U_PATTERN_SYNTAX_ERROR;
  675|     56|                return 0;
  676|     56|            }
  677|       |            // skip the quote-ending apostrophe
  678|  64.8k|            ++index;
  679|  29.0M|        } else if(c==u_leftCurlyBrace) {
  ------------------
  |  Branch (679:19): [True: 31.3k, False: 29.0M]
  ------------------
  680|  31.3k|            ++nestedBraces;
  681|  29.0M|        } else if(c==u_rightCurlyBrace) {
  ------------------
  |  Branch (681:19): [True: 140k, False: 28.9M]
  ------------------
  682|   140k|            if(nestedBraces>0) {
  ------------------
  |  Branch (682:16): [True: 19.2k, False: 121k]
  ------------------
  683|  19.2k|                --nestedBraces;
  684|   121k|            } else {
  685|   121k|                int32_t length=--index-start;
  686|   121k|                if(length>Part::MAX_LENGTH) {
  ------------------
  |  Branch (686:20): [True: 2, False: 121k]
  ------------------
  687|      2|                    setParseError(parseError, start);  // Argument style text too long.
  688|      2|                    errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  689|      2|                    return 0;
  690|      2|                }
  691|   121k|                addPart(UMSGPAT_PART_TYPE_ARG_STYLE, start, length, 0, errorCode);
  692|   121k|                return index;
  693|   121k|            }
  694|   140k|        }  // c is part of literal text
  695|  29.1M|    }
  696|    510|    setParseError(parseError, 0);  // Unmatched '{' braces in message.
  697|    510|    errorCode=U_UNMATCHED_BRACES;
  698|    510|    return 0;
  699|   121k|}
_ZN6icu_7814MessagePattern16parseChoiceStyleEiiP11UParseErrorR10UErrorCode:
  703|  27.8k|                                 UParseError *parseError, UErrorCode &errorCode) {
  704|  27.8k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (704:8): [True: 0, False: 27.8k]
  ------------------
  705|      0|        return 0;
  706|      0|    }
  707|  27.8k|    int32_t start=index;
  708|  27.8k|    index=skipWhiteSpace(index);
  709|  27.8k|    if(index==msg.length() || msg.charAt(index)==u_rightCurlyBrace) {
  ------------------
  |  Branch (709:8): [True: 20, False: 27.8k]
  |  Branch (709:31): [True: 4, False: 27.8k]
  ------------------
  710|     24|        setParseError(parseError, 0);  // Missing choice argument pattern.
  711|     24|        errorCode=U_PATTERN_SYNTAX_ERROR;
  712|     24|        return 0;
  713|     24|    }
  714|   530k|    for(;;) {
  715|       |        // The choice argument style contains |-separated (number, separator, message) triples.
  716|       |        // Parse the number.
  717|   530k|        int32_t numberIndex=index;
  718|   530k|        index=skipDouble(index);
  719|   530k|        int32_t length=index-numberIndex;
  720|   530k|        if(length==0) {
  ------------------
  |  Branch (720:12): [True: 214, False: 530k]
  ------------------
  721|    214|            setParseError(parseError, start);  // Bad choice pattern syntax.
  722|    214|            errorCode=U_PATTERN_SYNTAX_ERROR;
  723|    214|            return 0;
  724|    214|        }
  725|   530k|        if(length>Part::MAX_LENGTH) {
  ------------------
  |  Branch (725:12): [True: 0, False: 530k]
  ------------------
  726|      0|            setParseError(parseError, numberIndex);  // Choice number too long.
  727|      0|            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  728|      0|            return 0;
  729|      0|        }
  730|   530k|        parseDouble(numberIndex, index, true, parseError, errorCode);  // adds ARG_INT or ARG_DOUBLE
  731|   530k|        if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (731:12): [True: 174, False: 530k]
  ------------------
  732|    174|            return 0;
  733|    174|        }
  734|       |        // Parse the separator.
  735|   530k|        index=skipWhiteSpace(index);
  736|   530k|        if(index==msg.length()) {
  ------------------
  |  Branch (736:12): [True: 202, False: 530k]
  ------------------
  737|    202|            setParseError(parseError, start);  // Bad choice pattern syntax.
  738|    202|            errorCode=U_PATTERN_SYNTAX_ERROR;
  739|    202|            return 0;
  740|    202|        }
  741|   530k|        char16_t c=msg.charAt(index);
  742|   530k|        if(!(c==u_pound || c==u_lessThan || c==u_lessOrEqual)) {  // U+2264 is <=
  ------------------
  |  Branch (742:14): [True: 524k, False: 6.06k]
  |  Branch (742:28): [True: 5.14k, False: 920]
  |  Branch (742:45): [True: 794, False: 126]
  ------------------
  743|    126|            setParseError(parseError, start);  // Expected choice separator (#<\u2264) instead of c.
  744|    126|            errorCode=U_PATTERN_SYNTAX_ERROR;
  745|    126|            return 0;
  746|    126|        }
  747|   529k|        addPart(UMSGPAT_PART_TYPE_ARG_SELECTOR, index, 1, 0, errorCode);
  748|       |        // Parse the message fragment.
  749|   529k|        index=parseMessage(++index, 0, nestingLevel+1, UMSGPAT_ARG_TYPE_CHOICE, parseError, errorCode);
  750|   529k|        if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (750:12): [True: 23.2k, False: 506k]
  ------------------
  751|  23.2k|            return 0;
  752|  23.2k|        }
  753|       |        // parseMessage(..., CHOICE) returns the index of the terminator, or msg.length().
  754|   506k|        if(index==msg.length()) {
  ------------------
  |  Branch (754:12): [True: 0, False: 506k]
  ------------------
  755|      0|            return index;
  756|      0|        }
  757|   506k|        if(msg.charAt(index)==u_rightCurlyBrace) {
  ------------------
  |  Branch (757:12): [True: 3.81k, False: 502k]
  ------------------
  758|  3.81k|            if(!inMessageFormatPattern(nestingLevel)) {
  ------------------
  |  Branch (758:16): [True: 0, False: 3.81k]
  ------------------
  759|      0|                setParseError(parseError, start);  // Bad choice pattern syntax.
  760|      0|                errorCode=U_PATTERN_SYNTAX_ERROR;
  761|      0|                return 0;
  762|      0|            }
  763|  3.81k|            return index;
  764|  3.81k|        }  // else the terminator is '|'
  765|   502k|        index=skipWhiteSpace(index+1);
  766|   502k|    }
  767|  27.8k|}
_ZN6icu_7814MessagePattern24parsePluralOrSelectStyleE22UMessagePatternArgTypeiiP11UParseErrorR10UErrorCode:
  772|  71.7k|                                         UParseError *parseError, UErrorCode &errorCode) {
  773|  71.7k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (773:8): [True: 0, False: 71.7k]
  ------------------
  774|      0|        return 0;
  775|      0|    }
  776|  71.7k|    int32_t start=index;
  777|  71.7k|    UBool isEmpty=true;
  778|  71.7k|    UBool hasOther=false;
  779|   158k|    for(;;) {
  780|       |        // First, collect the selector looking for a small set of terminators.
  781|       |        // It would be a little faster to consider the syntax of each possible
  782|       |        // token right here, but that makes the code too complicated.
  783|   158k|        index=skipWhiteSpace(index);
  784|   158k|        UBool eos=index==msg.length();
  785|   158k|        if(eos || msg.charAt(index)==u_rightCurlyBrace) {
  ------------------
  |  Branch (785:12): [True: 21.3k, False: 137k]
  |  Branch (785:19): [True: 6, False: 137k]
  ------------------
  786|  21.3k|            if(eos==inMessageFormatPattern(nestingLevel)) {
  ------------------
  |  Branch (786:16): [True: 98, False: 21.2k]
  ------------------
  787|     98|                setParseError(parseError, start);  // Bad plural/select pattern syntax.
  788|     98|                errorCode=U_PATTERN_SYNTAX_ERROR;
  789|     98|                return 0;
  790|     98|            }
  791|  21.2k|            if(!hasOther) {
  ------------------
  |  Branch (791:16): [True: 6, False: 21.2k]
  ------------------
  792|      6|                setParseError(parseError, 0);  // Missing 'other' keyword in plural/select pattern.
  793|      6|                errorCode=U_DEFAULT_KEYWORD_MISSING;
  794|      6|                return 0;
  795|      6|            }
  796|  21.2k|            return index;
  797|  21.2k|        }
  798|   137k|        int32_t selectorIndex=index;
  799|   137k|        if(UMSGPAT_ARG_TYPE_HAS_PLURAL_STYLE(argType) && msg.charAt(selectorIndex)==u_equal) {
  ------------------
  |  |  273|   274k|    ((argType)==UMSGPAT_ARG_TYPE_PLURAL || (argType)==UMSGPAT_ARG_TYPE_SELECTORDINAL)
  |  |  ------------------
  |  |  |  Branch (273:6): [True: 126k, False: 10.9k]
  |  |  |  Branch (273:44): [True: 2.23k, False: 8.72k]
  |  |  ------------------
  ------------------
  |  Branch (799:58): [True: 5.29k, False: 123k]
  ------------------
  800|       |            // explicit-value plural selector: =double
  801|  5.29k|            index=skipDouble(index+1);
  802|  5.29k|            int32_t length=index-selectorIndex;
  803|  5.29k|            if(length==1) {
  ------------------
  |  Branch (803:16): [True: 98, False: 5.20k]
  ------------------
  804|     98|                setParseError(parseError, start);  // Bad plural/select pattern syntax.
  805|     98|                errorCode=U_PATTERN_SYNTAX_ERROR;
  806|     98|                return 0;
  807|     98|            }
  808|  5.20k|            if(length>Part::MAX_LENGTH) {
  ------------------
  |  Branch (808:16): [True: 0, False: 5.20k]
  ------------------
  809|      0|                setParseError(parseError, selectorIndex);  // Argument selector too long.
  810|      0|                errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  811|      0|                return 0;
  812|      0|            }
  813|  5.20k|            addPart(UMSGPAT_PART_TYPE_ARG_SELECTOR, selectorIndex, length, 0, errorCode);
  814|  5.20k|            parseDouble(selectorIndex+1, index, false,
  815|  5.20k|                        parseError, errorCode);  // adds ARG_INT or ARG_DOUBLE
  816|   132k|        } else {
  817|   132k|            index=skipIdentifier(index);
  818|   132k|            int32_t length=index-selectorIndex;
  819|   132k|            if(length==0) {
  ------------------
  |  Branch (819:16): [True: 32, False: 132k]
  ------------------
  820|     32|                setParseError(parseError, start);  // Bad plural/select pattern syntax.
  821|     32|                errorCode=U_PATTERN_SYNTAX_ERROR;
  822|     32|                return 0;
  823|     32|            }
  824|       |            // Note: The ':' in "offset:" is just beyond the skipIdentifier() range.
  825|   132k|            if( UMSGPAT_ARG_TYPE_HAS_PLURAL_STYLE(argType) && length==6 && index<msg.length() &&
  ------------------
  |  |  273|   264k|    ((argType)==UMSGPAT_ARG_TYPE_PLURAL || (argType)==UMSGPAT_ARG_TYPE_SELECTORDINAL)
  |  |  ------------------
  |  |  |  Branch (273:6): [True: 121k, False: 10.9k]
  |  |  |  Branch (273:44): [True: 2.21k, False: 8.71k]
  |  |  ------------------
  ------------------
  |  Branch (825:63): [True: 918, False: 122k]
  |  Branch (825:76): [True: 908, False: 10]
  ------------------
  826|   132k|                0==msg.compare(selectorIndex, 7, kOffsetColon, 0, 7)
  ------------------
  |  Branch (826:17): [True: 0, False: 908]
  ------------------
  827|   132k|            ) {
  828|       |                // plural offset, not a selector
  829|      0|                if(!isEmpty) {
  ------------------
  |  Branch (829:20): [True: 0, False: 0]
  ------------------
  830|       |                    // Plural argument 'offset:' (if present) must precede key-message pairs.
  831|      0|                    setParseError(parseError, start);
  832|      0|                    errorCode=U_PATTERN_SYNTAX_ERROR;
  833|      0|                    return 0;
  834|      0|                }
  835|       |                // allow whitespace between offset: and its value
  836|      0|                int32_t valueIndex=skipWhiteSpace(index+1);  // The ':' is at index.
  837|      0|                index=skipDouble(valueIndex);
  838|      0|                if(index==valueIndex) {
  ------------------
  |  Branch (838:20): [True: 0, False: 0]
  ------------------
  839|      0|                    setParseError(parseError, start);  // Missing value for plural 'offset:'.
  840|      0|                    errorCode=U_PATTERN_SYNTAX_ERROR;
  841|      0|                    return 0;
  842|      0|                }
  843|      0|                if((index-valueIndex)>Part::MAX_LENGTH) {
  ------------------
  |  Branch (843:20): [True: 0, False: 0]
  ------------------
  844|      0|                    setParseError(parseError, valueIndex);  // Plural offset value too long.
  845|      0|                    errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  846|      0|                    return 0;
  847|      0|                }
  848|      0|                parseDouble(valueIndex, index, false,
  849|      0|                            parseError, errorCode);  // adds ARG_INT or ARG_DOUBLE
  850|      0|                if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (850:20): [True: 0, False: 0]
  ------------------
  851|      0|                    return 0;
  852|      0|                }
  853|      0|                isEmpty=false;
  854|      0|                continue;  // no message fragment after the offset
  855|   132k|            } else {
  856|       |                // normal selector word
  857|   132k|                if(length>Part::MAX_LENGTH) {
  ------------------
  |  Branch (857:20): [True: 14, False: 132k]
  ------------------
  858|     14|                    setParseError(parseError, selectorIndex);  // Argument selector too long.
  859|     14|                    errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  860|     14|                    return 0;
  861|     14|                }
  862|   132k|                addPart(UMSGPAT_PART_TYPE_ARG_SELECTOR, selectorIndex, length, 0, errorCode);
  863|   132k|                if(0==msg.compare(selectorIndex, length, kOther, 0, 5)) {
  ------------------
  |  Branch (863:20): [True: 21.2k, False: 110k]
  ------------------
  864|  21.2k|                    hasOther=true;
  865|  21.2k|                }
  866|   132k|            }
  867|   132k|        }
  868|   137k|        if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (868:12): [True: 174, False: 137k]
  ------------------
  869|    174|            return 0;
  870|    174|        }
  871|       |
  872|       |        // parse the message fragment following the selector
  873|   137k|        index=skipWhiteSpace(index);
  874|   137k|        if(index==msg.length() || msg.charAt(index)!=u_leftCurlyBrace) {
  ------------------
  |  Branch (874:12): [True: 232, False: 136k]
  |  Branch (874:35): [True: 168, False: 136k]
  ------------------
  875|    400|            setParseError(parseError, selectorIndex);  // No message fragment after plural/select selector.
  876|    400|            errorCode=U_PATTERN_SYNTAX_ERROR;
  877|    400|            return 0;
  878|    400|        }
  879|   136k|        index=parseMessage(index, 1, nestingLevel+1, argType, parseError, errorCode);
  880|   136k|        if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (880:12): [True: 49.6k, False: 87.0k]
  ------------------
  881|  49.6k|            return 0;
  882|  49.6k|        }
  883|  87.0k|        isEmpty=false;
  884|  87.0k|    }
  885|  71.7k|}
_ZN6icu_7814MessagePattern14parseArgNumberERKNS_13UnicodeStringEii:
  888|   676k|MessagePattern::parseArgNumber(const UnicodeString &s, int32_t start, int32_t limit) {
  889|       |    // If the identifier contains only ASCII digits, then it is an argument _number_
  890|       |    // and must not have leading zeros (except "0" itself).
  891|       |    // Otherwise it is an argument _name_.
  892|   676k|    if(start>=limit) {
  ------------------
  |  Branch (892:8): [True: 2.15k, False: 674k]
  ------------------
  893|  2.15k|        return UMSGPAT_ARG_NAME_NOT_VALID;
  894|  2.15k|    }
  895|   674k|    int32_t number;
  896|       |    // Defer numeric errors until we know there are only digits.
  897|   674k|    UBool badNumber;
  898|   674k|    char16_t c=s.charAt(start++);
  899|   674k|    if(c==0x30) {
  ------------------
  |  Branch (899:8): [True: 181k, False: 493k]
  ------------------
  900|   181k|        if(start==limit) {
  ------------------
  |  Branch (900:12): [True: 180k, False: 440]
  ------------------
  901|   180k|            return 0;
  902|   180k|        } else {
  903|    440|            number=0;
  904|    440|            badNumber=true;  // leading zero
  905|    440|        }
  906|   493k|    } else if(0x31<=c && c<=0x39) {
  ------------------
  |  Branch (906:15): [True: 437k, False: 55.4k]
  |  Branch (906:26): [True: 194k, False: 242k]
  ------------------
  907|   194k|        number=c-0x30;
  908|   194k|        badNumber=false;
  909|   298k|    } else {
  910|   298k|        return UMSGPAT_ARG_NAME_NOT_NUMBER;
  911|   298k|    }
  912|   314k|    while(start<limit) {
  ------------------
  |  Branch (912:11): [True: 119k, False: 194k]
  ------------------
  913|   119k|        c=s.charAt(start++);
  914|   119k|        if(0x30<=c && c<=0x39) {
  ------------------
  |  Branch (914:12): [True: 119k, False: 202]
  |  Branch (914:23): [True: 118k, False: 816]
  ------------------
  915|   118k|            if(number>=INT32_MAX/10) {
  ------------------
  |  Branch (915:16): [True: 606, False: 118k]
  ------------------
  916|    606|                badNumber=true;  // overflow
  917|    606|            }
  918|   118k|            number=number*10+(c-0x30);
  919|   118k|        } else {
  920|  1.01k|            return UMSGPAT_ARG_NAME_NOT_NUMBER;
  921|  1.01k|        }
  922|   119k|    }
  923|       |    // There are only ASCII digits.
  924|   194k|    if(badNumber) {
  ------------------
  |  Branch (924:8): [True: 28, False: 194k]
  ------------------
  925|     28|        return UMSGPAT_ARG_NAME_NOT_VALID;
  926|   194k|    } else {
  927|   194k|        return number;
  928|   194k|    }
  929|   194k|}
_ZN6icu_7814MessagePattern11parseDoubleEiiaP11UParseErrorR10UErrorCode:
  933|   535k|                            UParseError *parseError, UErrorCode &errorCode) {
  934|   535k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (934:8): [True: 0, False: 535k]
  ------------------
  935|      0|        return;
  936|      0|    }
  937|   535k|    U_ASSERT(start<limit);
  ------------------
  |  |   35|   535k|#   define U_ASSERT(exp) (void)0
  ------------------
  938|       |    // fake loop for easy exit and single throw statement
  939|   535k|    for(;;) { /*loop doesn't iterate*/
  940|       |        // fast path for small integers and infinity
  941|   535k|        int32_t value=0;
  942|   535k|        int32_t isNegative=0;  // not boolean so that we can easily add it to value
  943|   535k|        int32_t index=start;
  944|   535k|        char16_t c=msg.charAt(index++);
  945|   535k|        if(c==u_minus) {
  ------------------
  |  Branch (945:12): [True: 11.1k, False: 524k]
  ------------------
  946|  11.1k|            isNegative=1;
  947|  11.1k|            if(index==limit) {
  ------------------
  |  Branch (947:16): [True: 6, False: 11.1k]
  ------------------
  948|      6|                break;  // no number
  949|      6|            }
  950|  11.1k|            c=msg.charAt(index++);
  951|   524k|        } else if(c==u_plus) {
  ------------------
  |  Branch (951:19): [True: 9.18k, False: 515k]
  ------------------
  952|  9.18k|            if(index==limit) {
  ------------------
  |  Branch (952:16): [True: 26, False: 9.15k]
  ------------------
  953|     26|                break;  // no number
  954|     26|            }
  955|  9.15k|            c=msg.charAt(index++);
  956|  9.15k|        }
  957|   535k|        if(c==0x221e) {  // infinity
  ------------------
  |  Branch (957:12): [True: 382, False: 535k]
  ------------------
  958|    382|            if(allowInfinity && index==limit) {
  ------------------
  |  Branch (958:16): [True: 366, False: 16]
  |  Branch (958:33): [True: 358, False: 8]
  ------------------
  959|    358|                double infinity=uprv_getInfinity();
  ------------------
  |  | 1506|    358|#define uprv_getInfinity U_ICU_ENTRY_POINT_RENAME(uprv_getInfinity)
  |  |  ------------------
  |  |  |  |  123|    358|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    358|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    358|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  960|    358|                addArgDoublePart(
  961|    358|                    isNegative!=0 ? -infinity : infinity,
  ------------------
  |  Branch (961:21): [True: 2, False: 356]
  ------------------
  962|    358|                    start, limit-start, errorCode);
  963|    358|                return;
  964|    358|            } else {
  965|     24|                break;
  966|     24|            }
  967|    382|        }
  968|       |        // try to parse the number as a small integer but fall back to a double
  969|   643k|        while('0'<=c && c<='9') {
  ------------------
  |  Branch (969:15): [True: 225k, False: 417k]
  |  Branch (969:25): [True: 225k, False: 82]
  ------------------
  970|   225k|            value=value*10+(c-'0');
  971|   225k|            if(value>(Part::MAX_VALUE+isNegative)) {
  ------------------
  |  Branch (971:16): [True: 16.9k, False: 208k]
  ------------------
  972|  16.9k|                break;  // not a small-enough integer
  973|  16.9k|            }
  974|   208k|            if(index==limit) {
  ------------------
  |  Branch (974:16): [True: 100k, False: 108k]
  ------------------
  975|   100k|                addPart(UMSGPAT_PART_TYPE_ARG_INT, start, limit-start,
  976|   100k|                        isNegative!=0 ? -value : value, errorCode);
  ------------------
  |  Branch (976:25): [True: 11.1k, False: 89.2k]
  ------------------
  977|   100k|                return;
  978|   100k|            }
  979|   108k|            c=msg.charAt(index++);
  980|   108k|        }
  981|       |        // Let Double.parseDouble() throw a NumberFormatException.
  982|   434k|        char numberChars[128];
  983|   434k|        int32_t capacity = static_cast<int32_t>(sizeof(numberChars));
  984|   434k|        int32_t length=limit-start;
  985|   434k|        if(length>=capacity) {
  ------------------
  |  Branch (985:12): [True: 36, False: 434k]
  ------------------
  986|     36|            break;  // number too long
  987|     36|        }
  988|   434k|        msg.extract(start, length, numberChars, capacity, US_INV);
  ------------------
  |  |   98|   434k|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  989|   434k|        if (static_cast<int32_t>(uprv_strlen(numberChars)) < length) {
  ------------------
  |  |   37|   434k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   434k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (989:13): [True: 18, False: 434k]
  ------------------
  990|     18|            break;  // contains non-invariant character that was turned into NUL
  991|     18|        }
  992|   434k|        char *end;
  993|   434k|        double numericValue=uprv_strtod(numberChars, &end);
  ------------------
  |  |   75|   434k|#define uprv_strtod(source, end) U_STANDARD_CPP_NAMESPACE strtod(source, end)
  |  |  ------------------
  |  |  |  |  393|   434k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  994|   434k|        if(end!=(numberChars+length)) {
  ------------------
  |  Branch (994:12): [True: 238, False: 434k]
  ------------------
  995|    238|            break;  // parsing error
  996|    238|        }
  997|   434k|        addArgDoublePart(numericValue, start, length, errorCode);
  998|   434k|        return;
  999|   434k|    }
 1000|    348|    setParseError(parseError, start /*, limit*/);  // Bad syntax for numeric value.
 1001|    348|    errorCode=U_PATTERN_SYNTAX_ERROR;
 1002|    348|}
_ZN6icu_7814MessagePattern14skipWhiteSpaceEi:
 1005|  3.25M|MessagePattern::skipWhiteSpace(int32_t index) {
 1006|  3.25M|    const char16_t *s=msg.getBuffer();
 1007|  3.25M|    int32_t msgLength=msg.length();
 1008|  3.25M|    const char16_t *t=PatternProps::skipWhiteSpace(s+index, msgLength-index);
 1009|  3.25M|    return static_cast<int32_t>(t - s);
 1010|  3.25M|}
_ZN6icu_7814MessagePattern14skipIdentifierEi:
 1013|   808k|MessagePattern::skipIdentifier(int32_t index) {
 1014|   808k|    const char16_t *s=msg.getBuffer();
 1015|   808k|    int32_t msgLength=msg.length();
 1016|   808k|    const char16_t *t=PatternProps::skipIdentifier(s+index, msgLength-index);
 1017|   808k|    return static_cast<int32_t>(t - s);
 1018|   808k|}
_ZN6icu_7814MessagePattern10skipDoubleEi:
 1021|   535k|MessagePattern::skipDouble(int32_t index) {
 1022|   535k|    int32_t msgLength=msg.length();
 1023|  1.65M|    while(index<msgLength) {
  ------------------
  |  Branch (1023:11): [True: 1.65M, False: 456]
  ------------------
 1024|  1.65M|        char16_t c=msg.charAt(index);
 1025|       |        // U+221E: Allow the infinity symbol, for ChoiceFormat patterns.
 1026|  1.65M|        if((c<0x30 && c!=u_plus && c!=u_minus && c!=u_dot) || (c>0x39 && c!=u_e && c!=u_E && c!=0x221e)) {
  ------------------
  |  Branch (1026:13): [True: 992k, False: 666k]
  |  Branch (1026:23): [True: 961k, False: 31.7k]
  |  Branch (1026:36): [True: 949k, False: 11.7k]
  |  Branch (1026:50): [True: 528k, False: 420k]
  |  Branch (1026:64): [True: 21.1k, False: 1.10M]
  |  Branch (1026:74): [True: 19.9k, False: 1.23k]
  |  Branch (1026:84): [True: 7.87k, False: 12.0k]
  |  Branch (1026:94): [True: 7.00k, False: 868]
  ------------------
 1027|   535k|            break;
 1028|   535k|        }
 1029|  1.12M|        ++index;
 1030|  1.12M|    }
 1031|   535k|    return index;
 1032|   535k|}
_ZN6icu_7814MessagePattern13isArgTypeCharEi:
 1035|  2.96M|MessagePattern::isArgTypeChar(UChar32 c) {
 1036|  2.96M|    return (u_a<=c && c<=u_z) || (u_A<=c && c<=u_Z);
  ------------------
  |  Branch (1036:13): [True: 1.25M, False: 1.71M]
  |  Branch (1036:23): [True: 1.18M, False: 71.1k]
  |  Branch (1036:35): [True: 1.58M, False: 200k]
  |  Branch (1036:45): [True: 1.51M, False: 71.1k]
  ------------------
 1037|  2.96M|}
_ZN6icu_7814MessagePattern8isChoiceEi:
 1040|  81.7k|MessagePattern::isChoice(int32_t index) {
 1041|  81.7k|    char16_t c;
 1042|  81.7k|    return
 1043|  81.7k|        ((c=msg.charAt(index++))==u_c || c==u_C) &&
  ------------------
  |  Branch (1043:10): [True: 530, False: 81.2k]
  |  Branch (1043:42): [True: 28.9k, False: 52.2k]
  ------------------
 1044|  81.7k|        ((c=msg.charAt(index++))==u_h || c==u_H) &&
  ------------------
  |  Branch (1044:10): [True: 204, False: 29.2k]
  |  Branch (1044:42): [True: 28.9k, False: 282]
  ------------------
 1045|  81.7k|        ((c=msg.charAt(index++))==u_o || c==u_O) &&
  ------------------
  |  Branch (1045:10): [True: 27.6k, False: 1.51k]
  |  Branch (1045:42): [True: 1.09k, False: 422]
  ------------------
 1046|  81.7k|        ((c=msg.charAt(index++))==u_i || c==u_I) &&
  ------------------
  |  Branch (1046:10): [True: 28.1k, False: 646]
  |  Branch (1046:42): [True: 300, False: 346]
  ------------------
 1047|  81.7k|        ((c=msg.charAt(index++))==u_c || c==u_C) &&
  ------------------
  |  Branch (1047:10): [True: 27.1k, False: 1.24k]
  |  Branch (1047:42): [True: 898, False: 348]
  ------------------
 1048|  81.7k|        ((c=msg.charAt(index))==u_e || c==u_E);
  ------------------
  |  Branch (1048:10): [True: 24.5k, False: 3.49k]
  |  Branch (1048:40): [True: 3.27k, False: 216]
  ------------------
 1049|  81.7k|}
_ZN6icu_7814MessagePattern8isPluralEi:
 1052|  53.8k|MessagePattern::isPlural(int32_t index) {
 1053|  53.8k|    char16_t c;
 1054|  53.8k|    return
 1055|  53.8k|        ((c=msg.charAt(index++))==u_p || c==u_P) &&
  ------------------
  |  Branch (1055:10): [True: 41.5k, False: 12.3k]
  |  Branch (1055:42): [True: 650, False: 11.7k]
  ------------------
 1056|  53.8k|        ((c=msg.charAt(index++))==u_l || c==u_L) &&
  ------------------
  |  Branch (1056:10): [True: 41.4k, False: 704]
  |  Branch (1056:42): [True: 404, False: 300]
  ------------------
 1057|  53.8k|        ((c=msg.charAt(index++))==u_u || c==u_U) &&
  ------------------
  |  Branch (1057:10): [True: 29.9k, False: 11.9k]
  |  Branch (1057:42): [True: 11.5k, False: 414]
  ------------------
 1058|  53.8k|        ((c=msg.charAt(index++))==u_r || c==u_R) &&
  ------------------
  |  Branch (1058:10): [True: 378, False: 41.0k]
  |  Branch (1058:42): [True: 40.6k, False: 368]
  ------------------
 1059|  53.8k|        ((c=msg.charAt(index++))==u_a || c==u_A) &&
  ------------------
  |  Branch (1059:10): [True: 40.4k, False: 668]
  |  Branch (1059:42): [True: 246, False: 422]
  ------------------
 1060|  53.8k|        ((c=msg.charAt(index))==u_l || c==u_L);
  ------------------
  |  Branch (1060:10): [True: 40.3k, False: 346]
  |  Branch (1060:40): [True: 146, False: 200]
  ------------------
 1061|  53.8k|}
_ZN6icu_7814MessagePattern8isSelectEi:
 1064|  21.0k|MessagePattern::isSelect(int32_t index) {
 1065|  21.0k|    char16_t c;
 1066|  21.0k|    return
 1067|  21.0k|        ((c=msg.charAt(index++))==u_s || c==u_S) &&
  ------------------
  |  Branch (1067:10): [True: 470, False: 20.5k]
  |  Branch (1067:42): [True: 16.9k, False: 3.64k]
  ------------------
 1068|  21.0k|        ((c=msg.charAt(index++))==u_e || c==u_E) &&
  ------------------
  |  Branch (1068:10): [True: 16.6k, False: 722]
  |  Branch (1068:42): [True: 504, False: 218]
  ------------------
 1069|  21.0k|        ((c=msg.charAt(index++))==u_l || c==u_L) &&
  ------------------
  |  Branch (1069:10): [True: 16.0k, False: 1.10k]
  |  Branch (1069:42): [True: 400, False: 704]
  ------------------
 1070|  21.0k|        ((c=msg.charAt(index++))==u_e || c==u_E) &&
  ------------------
  |  Branch (1070:10): [True: 13.5k, False: 2.90k]
  |  Branch (1070:42): [True: 2.48k, False: 414]
  ------------------
 1071|  21.0k|        ((c=msg.charAt(index++))==u_c || c==u_C) &&
  ------------------
  |  Branch (1071:10): [True: 8.30k, False: 7.78k]
  |  Branch (1071:42): [True: 7.56k, False: 220]
  ------------------
 1072|  21.0k|        ((c=msg.charAt(index))==u_t || c==u_T);
  ------------------
  |  Branch (1072:10): [True: 14.4k, False: 1.40k]
  |  Branch (1072:40): [True: 1.19k, False: 214]
  ------------------
 1073|  21.0k|}
_ZN6icu_7814MessagePattern9isOrdinalEi:
 1076|  7.31k|MessagePattern::isOrdinal(int32_t index) {
 1077|  7.31k|    char16_t c;
 1078|  7.31k|    return
 1079|  7.31k|        ((c=msg.charAt(index++))==u_o || c==u_O) &&
  ------------------
  |  Branch (1079:10): [True: 3.14k, False: 4.17k]
  |  Branch (1079:42): [True: 3.90k, False: 266]
  ------------------
 1080|  7.31k|        ((c=msg.charAt(index++))==u_r || c==u_R) &&
  ------------------
  |  Branch (1080:10): [True: 6.21k, False: 836]
  |  Branch (1080:42): [True: 498, False: 338]
  ------------------
 1081|  7.31k|        ((c=msg.charAt(index++))==u_d || c==u_D) &&
  ------------------
  |  Branch (1081:10): [True: 1.61k, False: 5.09k]
  |  Branch (1081:42): [True: 4.88k, False: 208]
  ------------------
 1082|  7.31k|        ((c=msg.charAt(index++))==u_i || c==u_I) &&
  ------------------
  |  Branch (1082:10): [True: 5.81k, False: 686]
  |  Branch (1082:42): [True: 472, False: 214]
  ------------------
 1083|  7.31k|        ((c=msg.charAt(index++))==u_n || c==u_N) &&
  ------------------
  |  Branch (1083:10): [True: 344, False: 5.94k]
  |  Branch (1083:42): [True: 5.42k, False: 518]
  ------------------
 1084|  7.31k|        ((c=msg.charAt(index++))==u_a || c==u_A) &&
  ------------------
  |  Branch (1084:10): [True: 4.88k, False: 886]
  |  Branch (1084:42): [True: 546, False: 340]
  ------------------
 1085|  7.31k|        ((c=msg.charAt(index))==u_l || c==u_L);
  ------------------
  |  Branch (1085:10): [True: 478, False: 4.95k]
  |  Branch (1085:40): [True: 1.25k, False: 3.69k]
  ------------------
 1086|  7.31k|}
_ZN6icu_7814MessagePattern22inMessageFormatPatternEi:
 1089|  25.1k|MessagePattern::inMessageFormatPattern(int32_t nestingLevel) {
 1090|  25.1k|    return nestingLevel>0 || partsList->a[0].type==UMSGPAT_PART_TYPE_MSG_START;
  ------------------
  |  Branch (1090:12): [True: 2.66k, False: 22.4k]
  |  Branch (1090:30): [True: 1.25k, False: 21.2k]
  ------------------
 1091|  25.1k|}
_ZN6icu_7814MessagePattern23inTopLevelChoiceMessageEi22UMessagePatternArgType:
 1094|    420|MessagePattern::inTopLevelChoiceMessage(int32_t nestingLevel, UMessagePatternArgType parentType) {
 1095|    420|    return
 1096|    420|        nestingLevel==1 &&
  ------------------
  |  Branch (1096:9): [True: 286, False: 134]
  ------------------
 1097|    420|        parentType==UMSGPAT_ARG_TYPE_CHOICE &&
  ------------------
  |  Branch (1097:9): [True: 130, False: 156]
  ------------------
 1098|    420|        partsList->a[0].type!=UMSGPAT_PART_TYPE_MSG_START;
  ------------------
  |  Branch (1098:9): [True: 0, False: 130]
  ------------------
 1099|    420|}
_ZN6icu_7814MessagePattern7addPartE23UMessagePatternPartTypeiiiR10UErrorCode:
 1103|  6.55M|                        int32_t value, UErrorCode &errorCode) {
 1104|  6.55M|    if(partsList->ensureCapacityForOneMore(partsLength, errorCode)) {
  ------------------
  |  Branch (1104:8): [True: 6.47M, False: 75.1k]
  ------------------
 1105|  6.47M|        Part &part=partsList->a[partsLength++];
 1106|  6.47M|        part.type=type;
 1107|  6.47M|        part.index=index;
 1108|  6.47M|        part.length = static_cast<uint16_t>(length);
 1109|  6.47M|        part.value = static_cast<int16_t>(value);
 1110|  6.47M|        part.limitPartIndex=0;
 1111|  6.47M|    }
 1112|  6.55M|}
_ZN6icu_7814MessagePattern12addLimitPartEi23UMessagePatternPartTypeiiiR10UErrorCode:
 1117|  1.27M|                             int32_t value, UErrorCode &errorCode) {
 1118|  1.27M|    partsList->a[start].limitPartIndex=partsLength;
 1119|  1.27M|    addPart(type, index, length, value, errorCode);
 1120|  1.27M|}
_ZN6icu_7814MessagePattern16addArgDoublePartEdiiR10UErrorCode:
 1124|   434k|                                 UErrorCode &errorCode) {
 1125|   434k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (1125:8): [True: 0, False: 434k]
  ------------------
 1126|      0|        return;
 1127|      0|    }
 1128|   434k|    int32_t numericIndex=numericValuesLength;
 1129|   434k|    if(numericValuesList==nullptr) {
  ------------------
  |  Branch (1129:8): [True: 500, False: 434k]
  ------------------
 1130|    500|        numericValuesList=new MessagePatternDoubleList();
 1131|    500|        if(numericValuesList==nullptr) {
  ------------------
  |  Branch (1131:12): [True: 0, False: 500]
  ------------------
 1132|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
 1133|      0|            return;
 1134|      0|        }
 1135|   434k|    } else if(!numericValuesList->ensureCapacityForOneMore(numericValuesLength, errorCode)) {
  ------------------
  |  Branch (1135:15): [True: 0, False: 434k]
  ------------------
 1136|      0|        return;
 1137|   434k|    } else {
 1138|   434k|        if(numericIndex>Part::MAX_VALUE) {
  ------------------
  |  Branch (1138:12): [True: 0, False: 434k]
  ------------------
 1139|      0|            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
 1140|      0|            return;
 1141|      0|        }
 1142|   434k|    }
 1143|   434k|    numericValuesList->a[numericValuesLength++]=numericValue;
 1144|   434k|    addPart(UMSGPAT_PART_TYPE_ARG_DOUBLE, start, length, numericIndex, errorCode);
 1145|   434k|}
_ZN6icu_7814MessagePattern13setParseErrorEP11UParseErrori:
 1148|  6.67k|MessagePattern::setParseError(UParseError *parseError, int32_t index) {
 1149|  6.67k|    if(parseError==nullptr) {
  ------------------
  |  Branch (1149:8): [True: 0, False: 6.67k]
  ------------------
 1150|      0|        return;
 1151|      0|    }
 1152|  6.67k|    parseError->offset=index;
 1153|       |
 1154|       |    // Set preContext to some of msg before index.
 1155|       |    // Avoid splitting a surrogate pair.
 1156|  6.67k|    int32_t length=index;
 1157|  6.67k|    if(length>=U_PARSE_CONTEXT_LEN) {
  ------------------
  |  Branch (1157:8): [True: 1.35k, False: 5.32k]
  ------------------
 1158|  1.35k|        length=U_PARSE_CONTEXT_LEN-1;
 1159|  1.35k|        if(length>0 && U16_IS_TRAIL(msg[index-length])) {
  ------------------
  |  |   67|  1.35k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 6, False: 1.34k]
  |  |  ------------------
  ------------------
  |  Branch (1159:12): [True: 1.35k, False: 0]
  ------------------
 1160|      6|            --length;
 1161|      6|        }
 1162|  1.35k|    }
 1163|  6.67k|    msg.extract(index-length, length, parseError->preContext);
 1164|  6.67k|    parseError->preContext[length]=0;
 1165|       |
 1166|       |    // Set postContext to some of msg starting at index.
 1167|  6.67k|    length=msg.length()-index;
 1168|  6.67k|    if(length>=U_PARSE_CONTEXT_LEN) {
  ------------------
  |  Branch (1168:8): [True: 3.63k, False: 3.04k]
  ------------------
 1169|  3.63k|        length=U_PARSE_CONTEXT_LEN-1;
 1170|  3.63k|        if(length>0 && U16_IS_LEAD(msg[index+length-1])) {
  ------------------
  |  |   59|  3.63k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 4, False: 3.63k]
  |  |  ------------------
  ------------------
  |  Branch (1170:12): [True: 3.63k, False: 0]
  ------------------
 1171|      4|            --length;
 1172|      4|        }
 1173|  3.63k|    }
 1174|  6.67k|    msg.extract(index, length, parseError->postContext);
 1175|  6.67k|    parseError->postContext[length]=0;
 1176|  6.67k|}
_ZN6icu_7818MessagePatternListINS_14MessagePattern4PartELi32EEC2Ev:
   93|  36.3k|    MessagePatternList() {}
_ZN6icu_7818MessagePatternListIdLi8EEC2Ev:
   93|    500|    MessagePatternList() {}
_ZN6icu_7818MessagePatternListINS_14MessagePattern4PartELi32EE24ensureCapacityForOneMoreEiR10UErrorCode:
  125|  6.55M|MessagePatternList<T, stackCapacity>::ensureCapacityForOneMore(int32_t oldLength, UErrorCode &errorCode) {
  126|  6.55M|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (126:8): [True: 75.1k, False: 6.47M]
  ------------------
  127|  75.1k|        return false;
  128|  75.1k|    }
  129|  6.47M|    if(a.getCapacity()>oldLength || a.resize(2*oldLength, oldLength)!=nullptr) {
  ------------------
  |  Branch (129:8): [True: 6.46M, False: 10.7k]
  |  Branch (129:37): [True: 10.7k, False: 0]
  ------------------
  130|  6.47M|        return true;
  131|  6.47M|    }
  132|      0|    errorCode=U_MEMORY_ALLOCATION_ERROR;
  133|      0|    return false;
  134|  6.47M|}
_ZN6icu_7818MessagePatternListIdLi8EE24ensureCapacityForOneMoreEiR10UErrorCode:
  125|   434k|MessagePatternList<T, stackCapacity>::ensureCapacityForOneMore(int32_t oldLength, UErrorCode &errorCode) {
  126|   434k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (126:8): [True: 0, False: 434k]
  ------------------
  127|      0|        return false;
  128|      0|    }
  129|   434k|    if(a.getCapacity()>oldLength || a.resize(2*oldLength, oldLength)!=nullptr) {
  ------------------
  |  Branch (129:8): [True: 433k, False: 1.11k]
  |  Branch (129:37): [True: 1.11k, False: 0]
  ------------------
  130|   434k|        return true;
  131|   434k|    }
  132|      0|    errorCode=U_MEMORY_ALLOCATION_ERROR;
  133|      0|    return false;
  134|   434k|}

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

_ZN6icu_7813ParsePositionD2Ev:
   16|      5|ParsePosition::~ParsePosition() {}

_ZN6icu_7812PatternProps20isSyntaxOrWhiteSpaceEi:
  137|  10.6M|PatternProps::isSyntaxOrWhiteSpace(UChar32 c) {
  138|  10.6M|    if(c<0) {
  ------------------
  |  Branch (138:8): [True: 0, False: 10.6M]
  ------------------
  139|      0|        return false;
  140|  10.6M|    } else if(c<=0xff) {
  ------------------
  |  Branch (140:15): [True: 2.80M, False: 7.89M]
  ------------------
  141|  2.80M|        return latin1[c] & 1;
  142|  7.89M|    } else if(c<0x200e) {
  ------------------
  |  Branch (142:15): [True: 94.4k, False: 7.79M]
  ------------------
  143|  94.4k|        return false;
  144|  7.79M|    } else if(c<=0x3030) {
  ------------------
  |  Branch (144:15): [True: 8.98k, False: 7.78M]
  ------------------
  145|  8.98k|        uint32_t bits=syntaxOrWhiteSpace2000[index2000[(c-0x2000)>>5]];
  146|  8.98k|        return (bits >> (c & 0x1f)) & 1;
  147|  7.78M|    } else if(0xfd3e<=c && c<=0xfe46) {
  ------------------
  |  Branch (147:15): [True: 377k, False: 7.41M]
  |  Branch (147:28): [True: 470, False: 376k]
  ------------------
  148|    470|        return c<=0xfd3f || 0xfe45<=c;
  ------------------
  |  Branch (148:16): [True: 4, False: 466]
  |  Branch (148:29): [True: 4, False: 462]
  ------------------
  149|  7.78M|    } else {
  150|  7.78M|        return false;
  151|  7.78M|    }
  152|  10.6M|}
_ZN6icu_7812PatternProps12isWhiteSpaceEi:
  155|  3.74M|PatternProps::isWhiteSpace(UChar32 c) {
  156|  3.74M|    if(c<0) {
  ------------------
  |  Branch (156:8): [True: 3, False: 3.74M]
  ------------------
  157|      3|        return false;
  158|  3.74M|    } else if(c<=0xff) {
  ------------------
  |  Branch (158:15): [True: 3.45M, False: 290k]
  ------------------
  159|  3.45M|        return (latin1[c] >> 2) & 1;
  160|  3.45M|    } else if(0x200e<=c && c<=0x2029) {
  ------------------
  |  Branch (160:15): [True: 219k, False: 70.4k]
  |  Branch (160:28): [True: 18.5k, False: 201k]
  ------------------
  161|  18.5k|        return c<=0x200f || 0x2028<=c;
  ------------------
  |  Branch (161:16): [True: 13.7k, False: 4.78k]
  |  Branch (161:29): [True: 1.42k, False: 3.35k]
  ------------------
  162|   271k|    } else {
  163|   271k|        return false;
  164|   271k|    }
  165|  3.74M|}
_ZN6icu_7812PatternProps14skipWhiteSpaceEPKDsi:
  168|  3.25M|PatternProps::skipWhiteSpace(const char16_t *s, int32_t length) {
  169|  3.25M|    while(length>0 && isWhiteSpace(*s)) {
  ------------------
  |  Branch (169:11): [True: 3.23M, False: 22.9k]
  |  Branch (169:23): [True: 6.99k, False: 3.22M]
  ------------------
  170|  6.99k|        ++s;
  171|  6.99k|        --length;
  172|  6.99k|    }
  173|  3.25M|    return s;
  174|  3.25M|}
_ZN6icu_7812PatternProps14skipWhiteSpaceERKNS_13UnicodeStringEi:
  177|  56.1k|PatternProps::skipWhiteSpace(const UnicodeString& s, int32_t start) {
  178|  56.1k|    int32_t i = start;
  179|  56.1k|    int32_t length = s.length();
  180|  78.5k|    while(i<length && isWhiteSpace(s.charAt(i))) {
  ------------------
  |  Branch (180:11): [True: 71.3k, False: 7.24k]
  |  Branch (180:23): [True: 22.4k, False: 48.9k]
  ------------------
  181|  22.4k|        ++i;
  182|  22.4k|    }
  183|  56.1k|    return i;
  184|  56.1k|}
_ZN6icu_7812PatternProps14trimWhiteSpaceEPKDsRi:
  187|  90.0k|PatternProps::trimWhiteSpace(const char16_t *s, int32_t &length) {
  188|  90.0k|    if(length<=0 || (!isWhiteSpace(s[0]) && !isWhiteSpace(s[length-1]))) {
  ------------------
  |  Branch (188:8): [True: 0, False: 90.0k]
  |  Branch (188:22): [True: 88.2k, False: 1.80k]
  |  Branch (188:45): [True: 87.6k, False: 668]
  ------------------
  189|  87.6k|        return s;
  190|  87.6k|    }
  191|  2.47k|    int32_t start=0;
  192|  2.47k|    int32_t limit=length;
  193|  24.8k|    while(start<limit && isWhiteSpace(s[start])) {
  ------------------
  |  Branch (193:11): [True: 24.4k, False: 399]
  |  Branch (193:26): [True: 22.4k, False: 2.07k]
  ------------------
  194|  22.4k|        ++start;
  195|  22.4k|    }
  196|  2.47k|    if(start<limit) {
  ------------------
  |  Branch (196:8): [True: 2.07k, False: 399]
  ------------------
  197|       |        // There is non-white space at start; we will not move limit below that,
  198|       |        // so we need not test start<limit in the loop.
  199|  4.36k|        while(isWhiteSpace(s[limit-1])) {
  ------------------
  |  Branch (199:15): [True: 2.29k, False: 2.07k]
  ------------------
  200|  2.29k|            --limit;
  201|  2.29k|        }
  202|  2.07k|    }
  203|  2.47k|    length=limit-start;
  204|  2.47k|    return s+start;
  205|  90.0k|}
_ZN6icu_7812PatternProps14skipIdentifierEPKDsi:
  222|   808k|PatternProps::skipIdentifier(const char16_t *s, int32_t length) {
  223|  10.6M|    while(length>0 && !isSyntaxOrWhiteSpace(*s)) {
  ------------------
  |  Branch (223:11): [True: 10.6M, False: 1.10k]
  |  Branch (223:23): [True: 9.88M, False: 807k]
  ------------------
  224|  9.88M|        ++s;
  225|  9.88M|        --length;
  226|  9.88M|    }
  227|   808k|    return s;
  228|   808k|}

_ZN6icu_7812PropNameData12findPropertyEi:
  148|  7.50k|int32_t PropNameData::findProperty(int32_t property) {
  149|  7.50k|    int32_t i=1;  // valueMaps index, initially after numRanges
  150|  15.0k|    for(int32_t numRanges=valueMaps[0]; numRanges>0; --numRanges) {
  ------------------
  |  Branch (150:41): [True: 15.0k, False: 0]
  ------------------
  151|       |        // Read and skip the start and limit of this range.
  152|  15.0k|        int32_t start=valueMaps[i];
  153|  15.0k|        int32_t limit=valueMaps[i+1];
  154|  15.0k|        i+=2;
  155|  15.0k|        if(property<start) {
  ------------------
  |  Branch (155:12): [True: 0, False: 15.0k]
  ------------------
  156|      0|            break;
  157|      0|        }
  158|  15.0k|        if(property<limit) {
  ------------------
  |  Branch (158:12): [True: 7.50k, False: 7.50k]
  ------------------
  159|  7.50k|            return i+(property-start)*2;
  160|  7.50k|        }
  161|  7.50k|        i+=(limit-start)*2;  // Skip all entries for this range.
  162|  7.50k|    }
  163|      0|    return 0;
  164|  7.50k|}
_ZN6icu_7812PropNameData26findPropertyValueNameGroupEii:
  166|  7.50k|int32_t PropNameData::findPropertyValueNameGroup(int32_t valueMapIndex, int32_t value) {
  167|  7.50k|    if(valueMapIndex==0) {
  ------------------
  |  Branch (167:8): [True: 0, False: 7.50k]
  ------------------
  168|      0|        return 0;  // The property does not have named values.
  169|      0|    }
  170|  7.50k|    ++valueMapIndex;  // Skip the BytesTrie offset.
  171|  7.50k|    int32_t numRanges=valueMaps[valueMapIndex++];
  172|  7.50k|    if(numRanges<0x10) {
  ------------------
  |  Branch (172:8): [True: 7.50k, False: 0]
  ------------------
  173|       |        // Ranges of values.
  174|  7.50k|        for(; numRanges>0; --numRanges) {
  ------------------
  |  Branch (174:15): [True: 7.50k, False: 0]
  ------------------
  175|       |            // Read and skip the start and limit of this range.
  176|  7.50k|            int32_t start=valueMaps[valueMapIndex];
  177|  7.50k|            int32_t limit=valueMaps[valueMapIndex+1];
  178|  7.50k|            valueMapIndex+=2;
  179|  7.50k|            if(value<start) {
  ------------------
  |  Branch (179:16): [True: 0, False: 7.50k]
  ------------------
  180|      0|                break;
  181|      0|            }
  182|  7.50k|            if(value<limit) {
  ------------------
  |  Branch (182:16): [True: 7.50k, False: 0]
  ------------------
  183|  7.50k|                return valueMaps[valueMapIndex+value-start];
  184|  7.50k|            }
  185|      0|            valueMapIndex+=limit-start;  // Skip all entries for this range.
  186|      0|        }
  187|  7.50k|    } else {
  188|       |        // List of values.
  189|      0|        int32_t valuesStart=valueMapIndex;
  190|      0|        int32_t nameGroupOffsetsStart=valueMapIndex+numRanges-0x10;
  191|      0|        do {
  192|      0|            int32_t v=valueMaps[valueMapIndex];
  193|      0|            if(value<v) {
  ------------------
  |  Branch (193:16): [True: 0, False: 0]
  ------------------
  194|      0|                break;
  195|      0|            }
  196|      0|            if(value==v) {
  ------------------
  |  Branch (196:16): [True: 0, False: 0]
  ------------------
  197|      0|                return valueMaps[nameGroupOffsetsStart+valueMapIndex-valuesStart];
  198|      0|            }
  199|      0|        } while(++valueMapIndex<nameGroupOffsetsStart);
  ------------------
  |  Branch (199:17): [True: 0, False: 0]
  ------------------
  200|      0|    }
  201|      0|    return 0;
  202|  7.50k|}
_ZN6icu_7812PropNameData7getNameEPKci:
  204|  7.50k|const char *PropNameData::getName(const char *nameGroup, int32_t nameIndex) {
  205|  7.50k|    int32_t numNames=*nameGroup++;
  206|  7.50k|    if(nameIndex<0 || numNames<=nameIndex) {
  ------------------
  |  Branch (206:8): [True: 0, False: 7.50k]
  |  Branch (206:23): [True: 0, False: 7.50k]
  ------------------
  207|      0|        return nullptr;
  208|      0|    }
  209|       |    // Skip nameIndex names.
  210|  7.50k|    for(; nameIndex>0; --nameIndex) {
  ------------------
  |  Branch (210:11): [True: 0, False: 7.50k]
  ------------------
  211|      0|        nameGroup=uprv_strchr(nameGroup, 0)+1;
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  212|      0|    }
  213|  7.50k|    if(*nameGroup==0) {
  ------------------
  |  Branch (213:8): [True: 0, False: 7.50k]
  ------------------
  214|      0|        return nullptr;  // no name (Property[Value]Aliases.txt has "n/a")
  215|      0|    }
  216|  7.50k|    return nameGroup;
  217|  7.50k|}
_ZN6icu_7812PropNameData12containsNameERNS_9BytesTrieEPKc:
  219|      2|UBool PropNameData::containsName(BytesTrie &trie, const char *name) {
  220|      2|    if(name==nullptr) {
  ------------------
  |  Branch (220:8): [True: 0, False: 2]
  ------------------
  221|      0|        return false;
  222|      0|    }
  223|      2|    UStringTrieResult result=USTRINGTRIE_NO_VALUE;
  224|      2|    char c;
  225|     14|    while((c=*name++)!=0) {
  ------------------
  |  Branch (225:11): [True: 12, False: 2]
  ------------------
  226|     12|        c=uprv_invCharToLowercaseAscii(c);
  ------------------
  |  |  193|     12|#   define uprv_invCharToLowercaseAscii uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|     12|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|     12|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|     12|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|     12|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  227|       |        // Ignore delimiters '-', '_', and ASCII White_Space.
  228|     12|        if(c==0x2d || c==0x5f || c==0x20 || (0x09<=c && c<=0x0d)) {
  ------------------
  |  Branch (228:12): [True: 0, False: 12]
  |  Branch (228:23): [True: 0, False: 12]
  |  Branch (228:34): [True: 0, False: 12]
  |  Branch (228:46): [True: 12, False: 0]
  |  Branch (228:57): [True: 0, False: 12]
  ------------------
  229|      0|            continue;
  230|      0|        }
  231|     12|        if(!USTRINGTRIE_HAS_NEXT(result)) {
  ------------------
  |  |   95|     12|#define USTRINGTRIE_HAS_NEXT(result) ((result)&1)
  ------------------
  |  Branch (231:12): [True: 0, False: 12]
  ------------------
  232|      0|            return false;
  233|      0|        }
  234|     12|        result = trie.next(static_cast<uint8_t>(c));
  235|     12|    }
  236|      2|    return USTRINGTRIE_HAS_VALUE(result);
  ------------------
  |  |   86|      2|#define USTRINGTRIE_HAS_VALUE(result) ((result)>=USTRINGTRIE_FINAL_VALUE)
  ------------------
  237|      2|}
_ZN6icu_7812PropNameData20getPropertyValueNameEiii:
  247|  7.50k|const char *PropNameData::getPropertyValueName(int32_t property, int32_t value, int32_t nameChoice) {
  248|  7.50k|    int32_t valueMapIndex=findProperty(property);
  249|  7.50k|    if(valueMapIndex==0) {
  ------------------
  |  Branch (249:8): [True: 0, False: 7.50k]
  ------------------
  250|      0|        return nullptr;  // Not a known property.
  251|      0|    }
  252|  7.50k|    int32_t nameGroupOffset=findPropertyValueNameGroup(valueMaps[valueMapIndex+1], value);
  253|  7.50k|    if(nameGroupOffset==0) {
  ------------------
  |  Branch (253:8): [True: 0, False: 7.50k]
  ------------------
  254|      0|        return nullptr;
  255|      0|    }
  256|  7.50k|    return getName(nameGroups+nameGroupOffset, nameChoice);
  257|  7.50k|}
_ZN6icu_7812PropNameData22getPropertyOrValueEnumEiPKc:
  259|      2|int32_t PropNameData::getPropertyOrValueEnum(int32_t bytesTrieOffset, const char *alias) {
  260|      2|    BytesTrie trie(bytesTries+bytesTrieOffset);
  261|      2|    if(containsName(trie, alias)) {
  ------------------
  |  Branch (261:8): [True: 2, False: 0]
  ------------------
  262|      2|        return trie.getValue();
  263|      2|    } else {
  264|      0|        return UCHAR_INVALID_CODE;
  265|      0|    }
  266|      2|}
_ZN6icu_7812PropNameData20getPropertyValueEnumEiPKc:
  272|      2|int32_t PropNameData::getPropertyValueEnum(int32_t property, const char *alias) {
  273|      2|    int32_t valueMapIndex=findProperty(property);
  274|      2|    if(valueMapIndex==0) {
  ------------------
  |  Branch (274:8): [True: 0, False: 2]
  ------------------
  275|      0|        return UCHAR_INVALID_CODE;  // Not a known property.
  276|      0|    }
  277|      2|    valueMapIndex=valueMaps[valueMapIndex+1];
  278|      2|    if(valueMapIndex==0) {
  ------------------
  |  Branch (278:8): [True: 0, False: 2]
  ------------------
  279|      0|        return UCHAR_INVALID_CODE;  // The property does not have named values.
  280|      0|    }
  281|       |    // valueMapIndex is the start of the property's valueMap,
  282|       |    // where the first word is the BytesTrie offset.
  283|      2|    return getPropertyOrValueEnum(valueMaps[valueMapIndex], alias);
  284|      2|}
u_getPropertyValueName_78:
  309|  7.50k|                       UPropertyNameChoice nameChoice) UPRV_NO_SANITIZE_UNDEFINED {
  310|       |    // The nameChoice is really an integer with a couple of named constants.
  311|       |    // Unicode allows for names other than short and long ones.
  312|       |    // If present, these will be returned for U_LONG_PROPERTY_NAME + i, where i=1, 2,...
  313|  7.50k|    U_NAMESPACE_USE
  ------------------
  |  |  112|  7.50k|#   define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
  ------------------
  314|  7.50k|    return PropNameData::getPropertyValueName(property, value, nameChoice);
  315|  7.50k|}
u_getPropertyValueEnum_78:
  319|      2|                       const char* alias) {
  320|      2|    U_NAMESPACE_USE
  ------------------
  |  |  112|      2|#   define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
  ------------------
  321|      2|    return PropNameData::getPropertyValueEnum(property, alias);
  322|      2|}
uscript_getShortName_78:
  331|  7.50k|uscript_getShortName(UScriptCode scriptCode){
  332|  7.50k|    return u_getPropertyValueName(UCHAR_SCRIPT, scriptCode,
  ------------------
  |  |  286|  7.50k|#define u_getPropertyValueName U_ICU_ENTRY_POINT_RENAME(u_getPropertyValueName)
  |  |  ------------------
  |  |  |  |  123|  7.50k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.50k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.50k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  333|  7.50k|                                  U_SHORT_PROPERTY_NAME);
  334|  7.50k|}

uprv_getUTCtime_78:
  296|  56.1k|{
  297|       |#if defined(U_DEBUG_FAKETIME)
  298|       |    return getUTCtime_fake(); /* Hook for overriding the clock */
  299|       |#else
  300|  56.1k|    return uprv_getRawUTCtime();
  ------------------
  |  | 1510|  56.1k|#define uprv_getRawUTCtime U_ICU_ENTRY_POINT_RENAME(uprv_getRawUTCtime)
  |  |  ------------------
  |  |  |  |  123|  56.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  56.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  56.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  301|  56.1k|#endif
  302|  56.1k|}
uprv_getRawUTCtime_78:
  307|  56.1k|{
  308|       |#if U_PLATFORM_USES_ONLY_WIN32_API
  309|       |
  310|       |    FileTimeConversion winTime;
  311|       |    GetSystemTimeAsFileTime(&winTime.fileTime);
  312|       |    return (UDate)((winTime.int64 - EPOCH_BIAS) / HECTONANOSECOND_PER_MILLISECOND);
  313|       |#else
  314|       |
  315|  56.1k|#if HAVE_GETTIMEOFDAY
  316|  56.1k|    struct timeval posixTime;
  317|  56.1k|    gettimeofday(&posixTime, nullptr);
  318|  56.1k|    return (UDate)(((int64_t)posixTime.tv_sec * U_MILLIS_PER_SECOND) + (posixTime.tv_usec/1000));
  ------------------
  |  |  221|  56.1k|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  319|       |#else
  320|       |    time_t epochtime;
  321|       |    time(&epochtime);
  322|       |    return (UDate)epochtime * U_MILLIS_PER_SECOND;
  323|       |#endif
  324|       |
  325|  56.1k|#endif
  326|  56.1k|}
uprv_isNaN_78:
  340|  56.1k|{
  341|  56.1k|#if IEEE_754
  342|  56.1k|    BitPatternConversion convertedNumber;
  343|  56.1k|    convertedNumber.d64 = number;
  344|       |    /* Infinity is 0x7FF0000000000000U. Anything greater than that is a NaN */
  345|  56.1k|    return (convertedNumber.i64 & U_INT64_MAX) > gInf.i64;
  ------------------
  |  |  249|  56.1k|#     define U_INT64_MAX       ((int64_t)(INT64_C(9223372036854775807)))
  ------------------
  346|       |
  347|       |#elif U_PLATFORM == U_PF_OS390
  348|       |    uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number,
  349|       |                        sizeof(uint32_t));
  350|       |    uint32_t lowBits  = *(uint32_t*)u_bottomNBytesOfDouble(&number,
  351|       |                        sizeof(uint32_t));
  352|       |
  353|       |    return ((highBits & 0x7F080000L) == 0x7F080000L) &&
  354|       |      (lowBits == 0x00000000L);
  355|       |
  356|       |#else
  357|       |    /* If your platform doesn't support IEEE 754 but *does* have an NaN value,*/
  358|       |    /* you'll need to replace this default implementation with what's correct*/
  359|       |    /* for your platform.*/
  360|       |    return number != number;
  361|       |#endif
  362|  56.1k|}
uprv_getInfinity_78:
  427|    358|{
  428|    358|#if IEEE_754 || U_PLATFORM == U_PF_OS390
  429|    358|    return gInf.d64;
  430|       |#else
  431|       |    /* If your platform doesn't support IEEE 754 but *does* have an infinity*/
  432|       |    /* value, you'll need to replace this default implementation with what's*/
  433|       |    /* correct for your platform.*/
  434|       |    return 0.0;
  435|       |#endif
  436|    358|}
uprv_floor_78:
  440|      8|{
  441|      8|    return floor(x);
  442|      8|}
uprv_add32_overflow_78:
  524|   488k|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|   488k|    auto a64 = static_cast<int64_t>(a);
  528|   488k|    auto b64 = static_cast<int64_t>(b);
  529|   488k|    int64_t res64 = a64 + b64;
  530|   488k|    *res = static_cast<int32_t>(res64);
  531|   488k|    return res64 != *res;
  532|   488k|}
uprv_tzset_78:
  633|      1|{
  634|      1|#if defined(U_TZSET)
  635|      1|    U_TZSET();
  ------------------
  |  |  111|      1|#   define U_TZSET tzset
  ------------------
  636|       |#else
  637|       |    /* no initialization*/
  638|       |#endif
  639|      1|}
uprv_timezone_78:
  643|      1|{
  644|      1|#ifdef U_TIMEZONE
  645|      1|    return U_TIMEZONE;
  ------------------
  |  |  124|      1|#   define U_TIMEZONE __timezone
  ------------------
  646|       |#else
  647|       |    time_t t, t1, t2;
  648|       |    struct tm tmrec;
  649|       |    int32_t tdiff = 0;
  650|       |
  651|       |    time(&t);
  652|       |    uprv_memcpy( &tmrec, localtime(&t), sizeof(tmrec) );
  653|       |#if U_PLATFORM != U_PF_IPHONE
  654|       |    UBool dst_checked = (tmrec.tm_isdst != 0); /* daylight savings time is checked*/
  655|       |#endif
  656|       |    t1 = mktime(&tmrec);                 /* local time in seconds*/
  657|       |    uprv_memcpy( &tmrec, gmtime(&t), sizeof(tmrec) );
  658|       |    t2 = mktime(&tmrec);                 /* GMT (or UTC) in seconds*/
  659|       |    tdiff = t2 - t1;
  660|       |
  661|       |#if U_PLATFORM != U_PF_IPHONE
  662|       |    /* imitate NT behaviour, which returns same timezone offset to GMT for
  663|       |       winter and summer.
  664|       |       This does not work on all platforms. For instance, on glibc on Linux
  665|       |       and on Mac OS 10.5, tdiff calculated above remains the same
  666|       |       regardless of whether DST is in effect or not. iOS is another
  667|       |       platform where this does not work. Linux + glibc and Mac OS 10.5
  668|       |       have U_TIMEZONE defined so that this code is not reached.
  669|       |    */
  670|       |    if (dst_checked)
  671|       |        tdiff += 3600;
  672|       |#endif
  673|       |    return tdiff;
  674|       |#endif
  675|      1|}
uprv_tzname_clear_cache_78:
 1073|      1|{
 1074|       |#if U_PLATFORM == U_PF_ANDROID
 1075|       |    /* Android's timezone is stored in system property. */
 1076|       |    gAndroidTimeZone[0] = '\0';
 1077|       |    void* libc = dlopen("libc.so", RTLD_NOLOAD);
 1078|       |    if (libc) {
 1079|       |        /* Android API 26+ has new API to get system property and old API
 1080|       |         * (__system_property_get) is deprecated */
 1081|       |        system_property_read_callback* property_read_callback =
 1082|       |            (system_property_read_callback*)dlsym(
 1083|       |                libc, "__system_property_read_callback");
 1084|       |        if (property_read_callback) {
 1085|       |            const prop_info* info =
 1086|       |                __system_property_find("persist.sys.timezone");
 1087|       |            if (info) {
 1088|       |                property_read_callback(info, &u_property_read, gAndroidTimeZone);
 1089|       |            }
 1090|       |        } else {
 1091|       |            system_property_get* property_get =
 1092|       |                (system_property_get*)dlsym(libc, "__system_property_get");
 1093|       |            if (property_get) {
 1094|       |                property_get("persist.sys.timezone", gAndroidTimeZone);
 1095|       |            }
 1096|       |        }
 1097|       |        dlclose(libc);
 1098|       |    }
 1099|       |#endif
 1100|       |
 1101|      1|#if defined(CHECK_LOCALTIME_LINK) && !defined(DEBUG_SKIP_LOCALTIME_LINK)
 1102|      1|    gTimeZoneBufferPtr = nullptr;
 1103|      1|#endif
 1104|      1|}
uprv_tzname_78:
 1108|      1|{
 1109|      1|    (void)n; // Avoid unreferenced parameter warning.
 1110|      1|    const char *tzid = nullptr;
 1111|       |#if U_PLATFORM_USES_ONLY_WIN32_API
 1112|       |    tzid = uprv_detectWindowsTimeZone();
 1113|       |
 1114|       |    if (tzid != nullptr) {
 1115|       |        return tzid;
 1116|       |    }
 1117|       |
 1118|       |#ifndef U_TZNAME
 1119|       |    // The return value is free'd in timezone.cpp on Windows because
 1120|       |    // the other code path returns a pointer to a heap location.
 1121|       |    // If we don't have a name already, then tzname wouldn't be any
 1122|       |    // better, so just fall back.
 1123|       |    return uprv_strdup("");
 1124|       |#endif // !U_TZNAME
 1125|       |
 1126|       |#else
 1127|       |
 1128|       |/*#if U_PLATFORM_IS_DARWIN_BASED
 1129|       |    int ret;
 1130|       |
 1131|       |    tzid = getenv("TZFILE");
 1132|       |    if (tzid != nullptr) {
 1133|       |        return tzid;
 1134|       |    }
 1135|       |#endif*/
 1136|       |
 1137|       |/* This code can be temporarily disabled to test tzname resolution later on. */
 1138|      1|#ifndef DEBUG_TZNAME
 1139|       |#if U_PLATFORM == U_PF_ANDROID
 1140|       |    tzid = gAndroidTimeZone;
 1141|       |#else
 1142|      1|    tzid = getenv("TZ");
 1143|      1|#endif
 1144|      1|    if (tzid != nullptr && isValidOlsonID(tzid)
  ------------------
  |  Branch (1144:9): [True: 0, False: 1]
  |  Branch (1144:28): [True: 0, False: 0]
  ------------------
 1145|       |#if U_PLATFORM == U_PF_SOLARIS
 1146|       |    /* Don't misinterpret TZ "localtime" on Solaris as a time zone name. */
 1147|       |        && uprv_strcmp(tzid, TZ_ENV_CHECK) != 0
 1148|       |#endif
 1149|      1|    ) {
 1150|       |        /* The colon forces tzset() to treat the remainder as zoneinfo path */
 1151|      0|        if (tzid[0] == ':') {
  ------------------
  |  Branch (1151:13): [True: 0, False: 0]
  ------------------
 1152|      0|            tzid++;
 1153|      0|        }
 1154|       |        /* This might be a good Olson ID. */
 1155|      0|        skipZoneIDPrefix(&tzid);
 1156|      0|        return tzid;
 1157|      0|    }
 1158|       |    /* else U_TZNAME will give a better result. */
 1159|      1|#endif
 1160|       |
 1161|      1|#if defined(CHECK_LOCALTIME_LINK) && !defined(DEBUG_SKIP_LOCALTIME_LINK)
 1162|       |    /* Caller must handle threading issues */
 1163|      1|    if (gTimeZoneBufferPtr == nullptr) {
  ------------------
  |  Branch (1163:9): [True: 1, False: 0]
  ------------------
 1164|       |        /*
 1165|       |        This is a trick to look at the name of the link to get the Olson ID
 1166|       |        because the tzfile contents is underspecified.
 1167|       |        This isn't guaranteed to work because it may not be a symlink.
 1168|       |        */
 1169|      1|        char *ret = realpath(TZDEFAULT, gTimeZoneBuffer);
  ------------------
  |  |  706|      1|#define TZDEFAULT       "/etc/localtime"
  ------------------
 1170|      1|        if (ret != nullptr && uprv_strcmp(TZDEFAULT, gTimeZoneBuffer) != 0) {
  ------------------
  |  |   38|      1|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1170:13): [True: 1, False: 0]
  |  Branch (1170:31): [True: 1, False: 0]
  ------------------
 1171|      1|            int32_t tzZoneInfoTailLen = uprv_strlen(TZZONEINFOTAIL);
  ------------------
  |  |   37|      1|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1172|      1|            const char *tzZoneInfoTailPtr = uprv_strstr(gTimeZoneBuffer, TZZONEINFOTAIL);
  ------------------
  |  |   41|      1|#define uprv_strstr(s, c) U_STANDARD_CPP_NAMESPACE strstr(s, c)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1173|       |            // MacOS14 has the realpath as something like
 1174|       |            // /usr/share/zoneinfo.default/Australia/Melbourne
 1175|       |            // which will not have "/zoneinfo/" in the path.
 1176|       |            // Therefore if we fail, we fall back to read the link which is
 1177|       |            // /var/db/timezone/zoneinfo/Australia/Melbourne
 1178|       |            // We also fall back to reading the link if the realpath leads to something like
 1179|       |            // /usr/share/zoneinfo/posixrules
 1180|      1|            if (tzZoneInfoTailPtr == nullptr ||
  ------------------
  |  Branch (1180:17): [True: 0, False: 1]
  ------------------
 1181|      1|                    uprv_strcmp(tzZoneInfoTailPtr + tzZoneInfoTailLen, "posixrules") == 0) {
  ------------------
  |  |   38|      1|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1181:21): [True: 0, False: 1]
  ------------------
 1182|      0|                ssize_t size = readlink(TZDEFAULT, gTimeZoneBuffer, sizeof(gTimeZoneBuffer)-1);
  ------------------
  |  |  706|      0|#define TZDEFAULT       "/etc/localtime"
  ------------------
 1183|      0|                if (size > 0) {
  ------------------
  |  Branch (1183:21): [True: 0, False: 0]
  ------------------
 1184|      0|                    gTimeZoneBuffer[size] = 0;
 1185|      0|                    tzZoneInfoTailPtr = uprv_strstr(gTimeZoneBuffer, TZZONEINFOTAIL);
  ------------------
  |  |   41|      0|#define uprv_strstr(s, c) U_STANDARD_CPP_NAMESPACE strstr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1186|      0|                }
 1187|      0|            }
 1188|      1|            if (tzZoneInfoTailPtr != nullptr) {
  ------------------
  |  Branch (1188:17): [True: 1, False: 0]
  ------------------
 1189|      1|                tzZoneInfoTailPtr += tzZoneInfoTailLen;
 1190|      1|                skipZoneIDPrefix(&tzZoneInfoTailPtr);
 1191|      1|                if (isValidOlsonID(tzZoneInfoTailPtr)) {
  ------------------
  |  Branch (1191:21): [True: 1, False: 0]
  ------------------
 1192|      1|                    return (gTimeZoneBufferPtr = tzZoneInfoTailPtr);
 1193|      1|                }
 1194|      1|            }
 1195|      1|        } else {
 1196|      0|#if defined(SEARCH_TZFILE)
 1197|      0|            DefaultTZInfo* tzInfo = (DefaultTZInfo*)uprv_malloc(sizeof(DefaultTZInfo));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1198|      0|            if (tzInfo != nullptr) {
  ------------------
  |  Branch (1198:17): [True: 0, False: 0]
  ------------------
 1199|      0|                tzInfo->defaultTZBuffer = nullptr;
 1200|      0|                tzInfo->defaultTZFileSize = 0;
 1201|      0|                tzInfo->defaultTZFilePtr = nullptr;
 1202|      0|                tzInfo->defaultTZstatus = false;
 1203|      0|                tzInfo->defaultTZPosition = 0;
 1204|       |
 1205|      0|                gTimeZoneBufferPtr = searchForTZFile(TZZONEINFO, tzInfo);
  ------------------
  |  |  707|      0|#define TZZONEINFO      "/usr/share/zoneinfo/"
  ------------------
 1206|       |
 1207|       |                /* Free previously allocated memory */
 1208|      0|                if (tzInfo->defaultTZBuffer != nullptr) {
  ------------------
  |  Branch (1208:21): [True: 0, False: 0]
  ------------------
 1209|      0|                    uprv_free(tzInfo->defaultTZBuffer);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1210|      0|                }
 1211|      0|                if (tzInfo->defaultTZFilePtr != nullptr) {
  ------------------
  |  Branch (1211:21): [True: 0, False: 0]
  ------------------
 1212|      0|                    fclose(tzInfo->defaultTZFilePtr);
 1213|      0|                }
 1214|      0|                uprv_free(tzInfo);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1215|      0|            }
 1216|       |
 1217|      0|            if (gTimeZoneBufferPtr != nullptr && isValidOlsonID(gTimeZoneBufferPtr)) {
  ------------------
  |  Branch (1217:17): [True: 0, False: 0]
  |  Branch (1217:50): [True: 0, False: 0]
  ------------------
 1218|      0|                return gTimeZoneBufferPtr;
 1219|      0|            }
 1220|      0|#endif
 1221|      0|        }
 1222|      1|    }
 1223|      0|    else {
 1224|      0|        return gTimeZoneBufferPtr;
 1225|      0|    }
 1226|      0|#endif
 1227|      0|#endif
 1228|       |
 1229|      0|#ifdef U_TZNAME
 1230|       |#if U_PLATFORM_USES_ONLY_WIN32_API
 1231|       |    /* The return value is free'd in timezone.cpp on Windows because
 1232|       |     * the other code path returns a pointer to a heap location. */
 1233|       |    return uprv_strdup(U_TZNAME[n]);
 1234|       |#else
 1235|       |    /*
 1236|       |    U_TZNAME is usually a non-unique abbreviation, which isn't normally usable.
 1237|       |    So we remap the abbreviation to an olson ID.
 1238|       |
 1239|       |    Since Windows exposes a little more timezone information,
 1240|       |    we normally don't use this code on Windows because
 1241|       |    uprv_detectWindowsTimeZone should have already given the correct answer.
 1242|       |    */
 1243|      0|    {
 1244|      0|        struct tm juneSol, decemberSol;
 1245|      0|        int daylightType;
 1246|      0|        static const time_t juneSolstice=1182478260; /*2007-06-21 18:11 UT*/
 1247|      0|        static const time_t decemberSolstice=1198332540; /*2007-12-22 06:09 UT*/
 1248|       |
 1249|       |        /* This probing will tell us when daylight savings occurs.  */
 1250|      0|        localtime_r(&juneSolstice, &juneSol);
 1251|      0|        localtime_r(&decemberSolstice, &decemberSol);
 1252|      0|        if(decemberSol.tm_isdst > 0) {
  ------------------
  |  Branch (1252:12): [True: 0, False: 0]
  ------------------
 1253|      0|          daylightType = U_DAYLIGHT_DECEMBER;
 1254|      0|        } else if(juneSol.tm_isdst > 0) {
  ------------------
  |  Branch (1254:19): [True: 0, False: 0]
  ------------------
 1255|      0|          daylightType = U_DAYLIGHT_JUNE;
 1256|      0|        } else {
 1257|      0|          daylightType = U_DAYLIGHT_NONE;
 1258|      0|        }
 1259|      0|        tzid = remapShortTimeZone(U_TZNAME[0], U_TZNAME[1], daylightType, uprv_timezone());
  ------------------
  |  |  151|      0|#   define U_TZNAME tzname
  ------------------
                      tzid = remapShortTimeZone(U_TZNAME[0], U_TZNAME[1], daylightType, uprv_timezone());
  ------------------
  |  |  151|      0|#   define U_TZNAME tzname
  ------------------
                      tzid = remapShortTimeZone(U_TZNAME[0], U_TZNAME[1], daylightType, uprv_timezone());
  ------------------
  |  | 1546|      0|#define uprv_timezone U_ICU_ENTRY_POINT_RENAME(uprv_timezone)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1260|      0|        if (tzid != nullptr) {
  ------------------
  |  Branch (1260:13): [True: 0, False: 0]
  ------------------
 1261|      0|            return tzid;
 1262|      0|        }
 1263|      0|    }
 1264|      0|    return U_TZNAME[n];
  ------------------
  |  |  151|      0|#   define U_TZNAME tzname
  ------------------
 1265|      0|#endif
 1266|       |#else
 1267|       |    return "";
 1268|       |#endif
 1269|      0|}
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|     12|{
 1356|     12|  if(!path || !*path) {
  ------------------
  |  Branch (1356:6): [True: 0, False: 12]
  |  Branch (1356:15): [True: 0, False: 12]
  ------------------
 1357|      0|    return false;
 1358|      0|  }
 1359|       |
 1360|     12|  if(*path == U_FILE_SEP_CHAR) {
  ------------------
  |  |  130|     12|#   define U_FILE_SEP_CHAR '/'
  ------------------
  |  Branch (1360:6): [True: 0, False: 12]
  ------------------
 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|     12|  return false;
 1379|     12|}
u_getDataDirectory_78:
 1499|     26|u_getDataDirectory() {
 1500|     26|    umtx_initOnce(gDataDirInitOnce, &dataDirectoryInitFn);
 1501|     26|    return gDataDirectory;
 1502|     26|}
u_getTimeZoneFilesDirectory_78:
 1575|      2|u_getTimeZoneFilesDirectory(UErrorCode *status) {
 1576|      2|    umtx_initOnce(gTimeZoneFilesInitOnce, &TimeZoneDataDirInitFn, *status);
  ------------------
  |  |  122|      2|#define gTimeZoneFilesInitOnce U_ICU_ENTRY_POINT_RENAME(gTimeZoneFilesInitOnce)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1577|      2|    return U_SUCCESS(*status) ? gTimeZoneFilesDirectory->data() : "";
  ------------------
  |  Branch (1577:12): [True: 2, False: 0]
  ------------------
 1578|      2|}
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:_ZL14isValidOlsonIDPKc:
  726|      1|static UBool isValidOlsonID(const char *id) {
  727|      1|    int32_t idx = 0;
  728|      1|    int32_t idxMax = 0;
  729|       |
  730|       |    /* Determine if this is something like Iceland (Olson ID)
  731|       |    or AST4ADT (non-Olson ID) */
  732|      8|    while (id[idx] && isNonDigit(id[idx]) && id[idx] != ',') {
  ------------------
  |  |  724|     15|#define isNonDigit(ch) (ch < '0' || '9' < ch)
  |  |  ------------------
  |  |  |  Branch (724:25): [True: 1, False: 6]
  |  |  |  Branch (724:37): [True: 6, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (732:12): [True: 7, False: 1]
  |  Branch (732:46): [True: 7, False: 0]
  ------------------
  733|      7|        idx++;
  734|      7|    }
  735|       |
  736|       |    /* Allow at maximum 2 numbers at the end of the id to support zone id's
  737|       |    like GMT+11. */
  738|      1|    idxMax = idx + 2;
  739|      1|    while (id[idx] && isDigit(id[idx]) && idx < idxMax) {
  ------------------
  |  |  725|      1|#define isDigit(ch) ('0' <= ch && ch <= '9')
  |  |  ------------------
  |  |  |  Branch (725:22): [True: 0, False: 0]
  |  |  |  Branch (725:35): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (739:12): [True: 0, False: 1]
  |  Branch (739:43): [True: 0, False: 0]
  ------------------
  740|      0|        idx++;
  741|      0|    }
  742|       |
  743|       |    /* If we went through the whole string, then it might be okay.
  744|       |    The timezone is sometimes set to "CST-7CDT", "CST6CDT5,J129,J131/19:30",
  745|       |    "GRNLNDST3GRNLNDDT" or similar, so we cannot use it.
  746|       |    The rest of the time it could be an Olson ID. George */
  747|      1|    return id[idx] == 0
  ------------------
  |  Branch (747:12): [True: 1, False: 0]
  ------------------
  748|      1|        || uprv_strcmp(id, "PST8PDT") == 0
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (748:12): [True: 0, False: 0]
  ------------------
  749|      1|        || uprv_strcmp(id, "MST7MDT") == 0
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (749:12): [True: 0, False: 0]
  ------------------
  750|      1|        || uprv_strcmp(id, "CST6CDT") == 0
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (750:12): [True: 0, False: 0]
  ------------------
  751|      1|        || uprv_strcmp(id, "EST5EDT") == 0;
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (751:12): [True: 0, False: 0]
  ------------------
  752|      1|}
putil.cpp:_ZL16skipZoneIDPrefixPPKc:
  766|      1|static void skipZoneIDPrefix(const char** id) {
  767|      1|    if (uprv_strncmp(*id, "posix/", 6) == 0
  ------------------
  |  |   44|      1|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (767:9): [True: 0, False: 1]
  ------------------
  768|      1|        || uprv_strncmp(*id, "right/", 6) == 0)
  ------------------
  |  |   44|      1|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (768:12): [True: 0, False: 1]
  ------------------
  769|      0|    {
  770|      0|        *id += 6;
  771|      0|    }
  772|      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:_ZL21TimeZoneDataDirInitFnR10UErrorCode:
 1521|      1|static void U_CALLCONV TimeZoneDataDirInitFn(UErrorCode &status) {
 1522|      1|    U_ASSERT(gTimeZoneFilesDirectory == nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
 1523|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1524|      1|    gTimeZoneFilesDirectory = new CharString();
 1525|      1|    if (gTimeZoneFilesDirectory == nullptr) {
  ------------------
  |  Branch (1525:9): [True: 0, False: 1]
  ------------------
 1526|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1527|      0|        return;
 1528|      0|    }
 1529|       |
 1530|      1|    const char *dir = "";
 1531|       |
 1532|       |#if defined(ICU_TIMEZONE_FILES_DIR_PREFIX_ENV_VAR)
 1533|       |    char timezonefilesdir_path_buffer[PATH_MAX];
 1534|       |    const char *prefix = getenv(ICU_TIMEZONE_FILES_DIR_PREFIX_ENV_VAR);
 1535|       |#endif
 1536|       |
 1537|       |#if U_PLATFORM_HAS_WINUWP_API == 1
 1538|       |// The UWP version does not support the environment variable setting.
 1539|       |
 1540|       |# if defined(ICU_DATA_DIR_WINDOWS)
 1541|       |    // When using the Windows system data, we can possibly pick up time zone data from the Windows directory.
 1542|       |    char datadir_path_buffer[MAX_PATH];
 1543|       |    if (getIcuDataDirectoryUnderWindowsDirectory(datadir_path_buffer, UPRV_LENGTHOF(datadir_path_buffer))) {
 1544|       |        dir = datadir_path_buffer;
 1545|       |    }
 1546|       |# endif
 1547|       |
 1548|       |#else
 1549|      1|    dir = getenv("ICU_TIMEZONE_FILES_DIR");
 1550|      1|#endif // U_PLATFORM_HAS_WINUWP_API
 1551|       |
 1552|       |#if defined(U_TIMEZONE_FILES_DIR)
 1553|       |    if (dir == nullptr) {
 1554|       |        // Build time configuration setting.
 1555|       |        dir = TO_STRING(U_TIMEZONE_FILES_DIR);
 1556|       |    }
 1557|       |#endif
 1558|       |
 1559|      1|    if (dir == nullptr) {
  ------------------
  |  Branch (1559:9): [True: 1, False: 0]
  ------------------
 1560|      1|        dir = "";
 1561|      1|    }
 1562|       |
 1563|       |#if defined(ICU_TIMEZONE_FILES_DIR_PREFIX_ENV_VAR)
 1564|       |    if (prefix != nullptr) {
 1565|       |        snprintf(timezonefilesdir_path_buffer, sizeof(timezonefilesdir_path_buffer), "%s%s", prefix, dir);
 1566|       |        dir = timezonefilesdir_path_buffer;
 1567|       |    }
 1568|       |#endif
 1569|       |
 1570|      1|    setTimeZoneFilesDir(dir, status);
 1571|      1|}
putil.cpp:_ZL19setTimeZoneFilesDirPKcR10UErrorCode:
 1504|      1|static void setTimeZoneFilesDir(const char *path, UErrorCode &status) {
 1505|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1505:9): [True: 0, False: 1]
  ------------------
 1506|      0|        return;
 1507|      0|    }
 1508|      1|    gTimeZoneFilesDirectory->clear();
 1509|      1|    gTimeZoneFilesDirectory->append(path, status);
 1510|       |#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)
 1511|       |    char *p = gTimeZoneFilesDirectory->data();
 1512|       |    while ((p = uprv_strchr(p, U_FILE_ALT_SEP_CHAR)) != nullptr) {
 1513|       |        *p = U_FILE_SEP_CHAR;
 1514|       |    }
 1515|       |#endif
 1516|      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|   206k|ResourceValue::~ResourceValue() {}
_ZN6icu_7812ResourceSinkD2Ev:
   20|   122k|ResourceSink::~ResourceSink() {}

_ZN6icu_7813ResourceArrayC2Ev:
   48|      1|    ResourceArray() : items16(nullptr), items32(nullptr), length(0) {}
_ZN6icu_7813ResourceArrayC2EPKtPKjiRKNS_14ResourceTracerE:
   53|  85.2k|            items16(i16), items32(i32), length(len),
   54|  85.2k|            fTraceInfo(traceInfo) {}
_ZNK6icu_7813ResourceArray7getSizeEv:
   59|  85.2k|    int32_t getSize() const { return length; }
_ZN6icu_7813ResourceTableC2EPKtPKiS2_PKjiRKNS_14ResourceTracerE:
   89|   555k|            keys16(k16), keys32(k32), items16(i16), items32(i32), length(len),
   90|   555k|            fTraceInfo(traceInfo) {}
_ZNK6icu_7813ResourceValue16getUnicodeStringER10UErrorCode:
  141|  1.36M|    inline UnicodeString getUnicodeString(UErrorCode &errorCode) const {
  142|  1.36M|        int32_t len = 0;
  143|  1.36M|        const char16_t *r = getString(len, errorCode);
  144|  1.36M|        return UnicodeString(true, r, len);
  145|  1.36M|    }
_ZN6icu_7813ResourceValueC2Ev:
  254|   206k|    ResourceValue() {}
_ZN6icu_7812ResourceSinkC2Ev:
  266|   122k|    ResourceSink() {}

_ZN6icu_7814ResourceTracerC2Ev:
  116|   206k|    ResourceTracer() {}
_ZN6icu_7814ResourceTracerC2EPKv:
  118|  2.76M|    ResourceTracer(const void*) {}
_ZN6icu_7814ResourceTracerC2EPKvPKc:
  120|   114k|    ResourceTracer(const void*, const char*) {}
_ZN6icu_7814ResourceTracerC2EPKvi:
  122|   201k|    ResourceTracer(const void*, int32_t) {}
_ZN6icu_7814ResourceTracerC2ERKS0_PKc:
  124|  2.29M|    ResourceTracer(const ResourceTracer&, const char*) {}
_ZN6icu_7814ResourceTracerC2ERKS0_i:
  126|   255k|    ResourceTracer(const ResourceTracer&, int32_t) {}
_ZNK6icu_7814ResourceTracer5traceEPKc:
  128|  3.28M|    void trace(const char*) const {}
_ZNK6icu_7814ResourceTracer9traceOpenEv:
  130|   541k|    void traceOpen() const {}
_ZNK6icu_7814ResourceTracer10maybeTraceEPKc:
  132|   134k|    void maybeTrace(const char*) const {}
_ZN6icu_7810FileTracer9traceOpenEPKcS2_S2_:
  140|     25|    static void traceOpen(const char*, const char*, const char*) {}

_ZN6icu_7821RuleCharacterIteratorC2ERKNS_13UnicodeStringEPKNS_11SymbolTableERNS_13ParsePositionE:
   27|      3|    text(theText),
   28|      3|    pos(thePos),
   29|      3|    sym(theSym),
   30|      3|    buf(nullptr),
   31|      3|    bufPos(0)
   32|      3|{}
_ZNK6icu_7821RuleCharacterIterator5atEndEv:
   34|      5|UBool RuleCharacterIterator::atEnd() const {
   35|      5|    return buf == nullptr && pos.getIndex() == text.length();
  ------------------
  |  Branch (35:12): [True: 5, False: 0]
  |  Branch (35:30): [True: 0, False: 5]
  ------------------
   36|      5|}
_ZN6icu_7821RuleCharacterIterator4nextEiRaR10UErrorCode:
   38|     13|UChar32 RuleCharacterIterator::next(int32_t options, UBool& isEscaped, UErrorCode& ec) {
   39|     13|    if (U_FAILURE(ec)) return DONE;
  ------------------
  |  Branch (39:9): [True: 0, False: 13]
  ------------------
   40|       |
   41|     13|    UChar32 c = DONE;
   42|     13|    isEscaped = false;
   43|       |
   44|     13|    for (;;) {
   45|     13|        c = _current();
   46|     13|        _advance(U16_LENGTH(c));
  ------------------
  |  |  141|     13|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 13, False: 0]
  |  |  ------------------
  ------------------
   47|       |
   48|     13|        if (c == SymbolTable::SYMBOL_REF && buf == nullptr &&
  ------------------
  |  Branch (48:13): [True: 0, False: 13]
  |  Branch (48:45): [True: 0, False: 0]
  ------------------
   49|     13|            (options & PARSE_VARIABLES) != 0 && sym != nullptr) {
  ------------------
  |  Branch (49:13): [True: 0, False: 0]
  |  Branch (49:49): [True: 0, False: 0]
  ------------------
   50|      0|            UnicodeString name = sym->parseReference(text, pos, text.length());
   51|       |            // If name is empty there was an isolated SYMBOL_REF;
   52|       |            // return it.  Caller must be prepared for this.
   53|      0|            if (name.length() == 0) {
  ------------------
  |  Branch (53:17): [True: 0, False: 0]
  ------------------
   54|      0|                break;
   55|      0|            }
   56|      0|            bufPos = 0;
   57|      0|            buf = sym->lookup(name);
   58|      0|            if (buf == nullptr) {
  ------------------
  |  Branch (58:17): [True: 0, False: 0]
  ------------------
   59|      0|                ec = U_UNDEFINED_VARIABLE;
   60|      0|                return DONE;
   61|      0|            }
   62|       |            // Handle empty variable value
   63|      0|            if (buf->length() == 0) {
  ------------------
  |  Branch (63:17): [True: 0, False: 0]
  ------------------
   64|      0|                buf = nullptr;
   65|      0|            }
   66|      0|            continue;
   67|      0|        }
   68|       |
   69|     13|        if ((options & SKIP_WHITESPACE) != 0 && PatternProps::isWhiteSpace(c)) {
  ------------------
  |  Branch (69:13): [True: 9, False: 4]
  |  Branch (69:49): [True: 0, False: 9]
  ------------------
   70|      0|            continue;
   71|      0|        }
   72|       |
   73|     13|        if (c == 0x5C /*'\\'*/ && (options & PARSE_ESCAPES) != 0) {
  ------------------
  |  Branch (73:13): [True: 4, False: 9]
  |  Branch (73:35): [True: 2, False: 2]
  ------------------
   74|      2|            UnicodeString tempEscape;
   75|      2|            int32_t offset = 0;
   76|      2|            c = lookahead(tempEscape, MAX_U_NOTATION_LEN).unescapeAt(offset);
  ------------------
  |  |   21|      2|#define MAX_U_NOTATION_LEN 12
  ------------------
   77|      2|            jumpahead(offset);
   78|      2|            isEscaped = true;
   79|      2|            if (c < 0) {
  ------------------
  |  Branch (79:17): [True: 0, False: 2]
  ------------------
   80|      0|                ec = U_MALFORMED_UNICODE_ESCAPE;
   81|      0|                return DONE;
   82|      0|            }
   83|      2|        }
   84|       |
   85|     13|        break;
   86|     13|    }
   87|       |
   88|     13|    return c;
   89|     13|}
_ZNK6icu_7821RuleCharacterIterator6getPosERNS0_3PosE:
   91|      9|void RuleCharacterIterator::getPos(RuleCharacterIterator::Pos& p) const {
   92|      9|    p.buf = buf;
   93|      9|    p.pos = pos.getIndex();
   94|      9|    p.bufPos = bufPos;
   95|      9|}
_ZN6icu_7821RuleCharacterIterator6setPosERKNS0_3PosE:
   97|      6|void RuleCharacterIterator::setPos(const RuleCharacterIterator::Pos& p) {
   98|      6|    buf = p.buf;
   99|      6|    pos.setIndex(p.pos);
  100|      6|    bufPos = p.bufPos;
  101|      6|}
_ZN6icu_7821RuleCharacterIterator11skipIgnoredEi:
  103|      5|void RuleCharacterIterator::skipIgnored(int32_t options) {
  104|      5|    if ((options & SKIP_WHITESPACE) != 0) {
  ------------------
  |  Branch (104:9): [True: 5, False: 0]
  ------------------
  105|      5|        for (;;) {
  106|      5|            UChar32 a = _current();
  107|      5|            if (!PatternProps::isWhiteSpace(a)) break;
  ------------------
  |  Branch (107:17): [True: 5, False: 0]
  ------------------
  108|      0|            _advance(U16_LENGTH(a));
  ------------------
  |  |  141|      0|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  109|      0|        }
  110|      5|    }
  111|      5|}
_ZNK6icu_7821RuleCharacterIterator9lookaheadERNS_13UnicodeStringEi:
  113|      4|UnicodeString& RuleCharacterIterator::lookahead(UnicodeString& result, int32_t maxLookAhead) const {
  114|      4|    if (maxLookAhead < 0) {
  ------------------
  |  Branch (114:9): [True: 2, False: 2]
  ------------------
  115|      2|        maxLookAhead = 0x7FFFFFFF;
  116|      2|    }
  117|      4|    if (buf != nullptr) {
  ------------------
  |  Branch (117:9): [True: 0, False: 4]
  ------------------
  118|      0|        buf->extract(bufPos, maxLookAhead, result);
  119|      4|    } else {
  120|      4|        text.extract(pos.getIndex(), maxLookAhead, result);
  121|      4|    }
  122|      4|    return result;
  123|      4|}
_ZN6icu_7821RuleCharacterIterator9jumpaheadEi:
  125|      4|void RuleCharacterIterator::jumpahead(int32_t count) {
  126|      4|    _advance(count);
  127|      4|}
_ZNK6icu_7821RuleCharacterIterator8_currentEv:
  137|     18|UChar32 RuleCharacterIterator::_current() const {
  138|     18|    if (buf != nullptr) {
  ------------------
  |  Branch (138:9): [True: 0, False: 18]
  ------------------
  139|      0|        return buf->char32At(bufPos);
  140|     18|    } else {
  141|     18|        int i = pos.getIndex();
  142|     18|        return (i < text.length()) ? text.char32At(i) : static_cast<UChar32>(DONE);
  ------------------
  |  Branch (142:16): [True: 15, False: 3]
  ------------------
  143|     18|    }
  144|     18|}
_ZN6icu_7821RuleCharacterIterator8_advanceEi:
  146|     17|void RuleCharacterIterator::_advance(int32_t count) {
  147|     17|    if (buf != nullptr) {
  ------------------
  |  Branch (147:9): [True: 0, False: 17]
  ------------------
  148|      0|        bufPos += count;
  149|      0|        if (bufPos == buf->length()) {
  ------------------
  |  Branch (149:13): [True: 0, False: 0]
  ------------------
  150|      0|            buf = nullptr;
  151|      0|        }
  152|     17|    } else {
  153|     17|        pos.setIndex(pos.getIndex() + count);
  154|     17|        if (pos.getIndex() > text.length()) {
  ------------------
  |  Branch (154:13): [True: 0, False: 17]
  ------------------
  155|      0|            pos.setIndex(text.length());
  156|      0|        }
  157|     17|    }
  158|     17|}

_ZNK6icu_7821RuleCharacterIterator10inVariableEv:
  226|      3|inline UBool RuleCharacterIterator::inVariable() const {
  227|      3|    return buf != nullptr;
  228|      3|}

_ZN6icu_7812SharedObjectD2Ev:
   18|  1.04k|SharedObject::~SharedObject() {}
_ZNK6icu_7812SharedObject6addRefEv:
   23|   230k|SharedObject::addRef() const {
   24|   230k|    umtx_atomic_inc(&hardRefCount);
   25|   230k|}
_ZNK6icu_7812SharedObject9removeRefEv:
   36|   457k|SharedObject::removeRef() const {
   37|   457k|    const UnifiedCacheBase *cache = this->cachePtr;
   38|   457k|    int32_t updatedRefCount = umtx_atomic_dec(&hardRefCount);
   39|   457k|    U_ASSERT(updatedRefCount >= 0);
  ------------------
  |  |   35|   457k|#   define U_ASSERT(exp) (void)0
  ------------------
   40|   457k|    if (updatedRefCount == 0) {
  ------------------
  |  Branch (40:9): [True: 228k, False: 228k]
  ------------------
   41|   228k|        if (cache) {
  ------------------
  |  Branch (41:13): [True: 228k, False: 0]
  ------------------
   42|   228k|            cache->handleUnreferencedObject();
   43|   228k|        } else {
   44|      0|            delete this;
   45|      0|        }
   46|   228k|    }
   47|   457k|}
_ZNK6icu_7812SharedObject11getRefCountEv:
   51|  2.09k|SharedObject::getRefCount() const {
   52|  2.09k|    return umtx_loadAcquire(hardRefCount);
   53|  2.09k|}

_ZN6icu_7816UnifiedCacheBaseC2Ev:
   30|      1|    UnifiedCacheBase() { }
_ZN6icu_7812SharedObjectC2Ev:
   58|  2.05k|            softRefCount(0),
   59|  2.05k|            hardRefCount(0),
   60|  2.05k|            cachePtr(nullptr) {}
_ZNK6icu_7812SharedObject16noHardReferencesEv:
   96|  2.09k|    inline UBool noHardReferences() const { return getRefCount() == 0; }
_ZN6icu_7812SharedObject7copyPtrINS_18SharedNumberFormatEEEvPKT_RS5_:
  144|  77.3k|    static void copyPtr(const T *src, const T *&dest) {
  145|  77.3k|        if(src != dest) {
  ------------------
  |  Branch (145:12): [True: 77.3k, False: 0]
  ------------------
  146|  77.3k|            if(dest != nullptr) { dest->removeRef(); }
  ------------------
  |  Branch (146:16): [True: 0, False: 77.3k]
  ------------------
  147|  77.3k|            dest = src;
  148|  77.3k|            if(src != nullptr) { src->addRef(); }
  ------------------
  |  Branch (148:16): [True: 77.3k, False: 0]
  ------------------
  149|  77.3k|        }
  150|  77.3k|    }
_ZN6icu_7812SharedObject8clearPtrINS_18SharedNumberFormatEEEvRPKT_:
  156|  77.3k|    static void clearPtr(const T *&ptr) {
  157|  77.3k|        if (ptr != nullptr) {
  ------------------
  |  Branch (157:13): [True: 77.3k, False: 0]
  ------------------
  158|  77.3k|            ptr->removeRef();
  159|  77.3k|            ptr = nullptr;
  160|  77.3k|        }
  161|  77.3k|    }
_ZN6icu_7812SharedObject7copyPtrINS_14SharedCalendarEEEvPKT_RS5_:
  144|  58.2k|    static void copyPtr(const T *src, const T *&dest) {
  145|  58.2k|        if(src != dest) {
  ------------------
  |  Branch (145:12): [True: 58.2k, False: 0]
  ------------------
  146|  58.2k|            if(dest != nullptr) { dest->removeRef(); }
  ------------------
  |  Branch (146:16): [True: 0, False: 58.2k]
  ------------------
  147|  58.2k|            dest = src;
  148|  58.2k|            if(src != nullptr) { src->addRef(); }
  ------------------
  |  Branch (148:16): [True: 58.2k, False: 0]
  ------------------
  149|  58.2k|        }
  150|  58.2k|    }
_ZN6icu_7812SharedObject8clearPtrINS_14SharedCalendarEEEvRPKT_:
  156|  58.2k|    static void clearPtr(const T *&ptr) {
  157|  58.2k|        if (ptr != nullptr) {
  ------------------
  |  Branch (157:13): [True: 58.2k, False: 0]
  ------------------
  158|  58.2k|            ptr->removeRef();
  159|  58.2k|            ptr = nullptr;
  160|  58.2k|        }
  161|  58.2k|    }
_ZN6icu_7812SharedObject7copyPtrINS_18DateFmtBestPatternEEEvPKT_RS5_:
  144|  36.9k|    static void copyPtr(const T *src, const T *&dest) {
  145|  36.9k|        if(src != dest) {
  ------------------
  |  Branch (145:12): [True: 36.9k, False: 0]
  ------------------
  146|  36.9k|            if(dest != nullptr) { dest->removeRef(); }
  ------------------
  |  Branch (146:16): [True: 0, False: 36.9k]
  ------------------
  147|  36.9k|            dest = src;
  148|  36.9k|            if(src != nullptr) { src->addRef(); }
  ------------------
  |  Branch (148:16): [True: 36.9k, False: 0]
  ------------------
  149|  36.9k|        }
  150|  36.9k|    }
_ZN6icu_7812SharedObject8clearPtrINS_18DateFmtBestPatternEEEvRPKT_:
  156|  36.9k|    static void clearPtr(const T *&ptr) {
  157|  36.9k|        if (ptr != nullptr) {
  ------------------
  |  Branch (157:13): [True: 36.9k, False: 0]
  ------------------
  158|  36.9k|            ptr->removeRef();
  159|  36.9k|            ptr = nullptr;
  160|  36.9k|        }
  161|  36.9k|    }
_ZN6icu_7812SharedObject7copyPtrINS_23SharedDateFormatSymbolsEEEvPKT_RS5_:
  144|  56.1k|    static void copyPtr(const T *src, const T *&dest) {
  145|  56.1k|        if(src != dest) {
  ------------------
  |  Branch (145:12): [True: 56.1k, False: 0]
  ------------------
  146|  56.1k|            if(dest != nullptr) { dest->removeRef(); }
  ------------------
  |  Branch (146:16): [True: 0, False: 56.1k]
  ------------------
  147|  56.1k|            dest = src;
  148|  56.1k|            if(src != nullptr) { src->addRef(); }
  ------------------
  |  Branch (148:16): [True: 56.1k, False: 0]
  ------------------
  149|  56.1k|        }
  150|  56.1k|    }
_ZN6icu_7812SharedObject8clearPtrINS_23SharedDateFormatSymbolsEEEvRPKT_:
  156|  56.1k|    static void clearPtr(const T *&ptr) {
  157|  56.1k|        if (ptr != nullptr) {
  ------------------
  |  Branch (157:13): [True: 56.1k, False: 0]
  ------------------
  158|  56.1k|            ptr->removeRef();
  159|  56.1k|            ptr = nullptr;
  160|  56.1k|        }
  161|  56.1k|    }

_ZN6icu_7815SimpleFormatterD2Ev:
   61|  3.20k|SimpleFormatter::~SimpleFormatter() {}
_ZN6icu_7815SimpleFormatter27applyPatternMinMaxArgumentsERKNS_13UnicodeStringEiiR10UErrorCode:
   66|  3.20k|        UErrorCode &errorCode) {
   67|  3.20k|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (67:9): [True: 0, False: 3.20k]
  ------------------
   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|  3.20k|    const char16_t *patternBuffer = pattern.getBuffer();
   74|  3.20k|    int32_t patternLength = pattern.length();
   75|       |    // Reserve the first char for the number of arguments.
   76|  3.20k|    compiledPattern.setTo(static_cast<char16_t>(0));
   77|  3.20k|    int32_t textLength = 0;
   78|  3.20k|    int32_t maxArg = -1;
   79|  3.20k|    UBool inQuote = false;
   80|  20.1k|    for (int32_t i = 0; i < patternLength;) {
  ------------------
  |  Branch (80:25): [True: 16.9k, False: 3.20k]
  ------------------
   81|  16.9k|        char16_t c = patternBuffer[i++];
   82|  16.9k|        if (c == APOS) {
  ------------------
  |  Branch (82:13): [True: 64, False: 16.8k]
  ------------------
   83|     64|            if (i < patternLength && (c = patternBuffer[i]) == APOS) {
  ------------------
  |  Branch (83:17): [True: 64, False: 0]
  |  Branch (83:38): [True: 0, False: 64]
  ------------------
   84|       |                // double apostrophe, skip the second one
   85|      0|                ++i;
   86|     64|            } else if (inQuote) {
  ------------------
  |  Branch (86:24): [True: 0, False: 64]
  ------------------
   87|       |                // skip the quote-ending apostrophe
   88|      0|                inQuote = false;
   89|      0|                continue;
   90|     64|            } else if (c == OPEN_BRACE || c == CLOSE_BRACE) {
  ------------------
  |  Branch (90:24): [True: 0, False: 64]
  |  Branch (90:43): [True: 0, False: 64]
  ------------------
   91|       |                // Skip the quote-starting apostrophe, find the end of the quoted literal text.
   92|      0|                ++i;
   93|      0|                inQuote = true;
   94|     64|            } else {
   95|       |                // The apostrophe is part of literal text.
   96|     64|                c = APOS;
   97|     64|            }
   98|  16.8k|        } else if (!inQuote && c == OPEN_BRACE) {
  ------------------
  |  Branch (98:20): [True: 16.8k, False: 0]
  |  Branch (98:32): [True: 7.53k, False: 9.34k]
  ------------------
   99|  7.53k|            if (textLength > 0) {
  ------------------
  |  Branch (99:17): [True: 4.33k, False: 3.20k]
  ------------------
  100|  4.33k|                compiledPattern.setCharAt(compiledPattern.length() - textLength - 1,
  101|  4.33k|                                          static_cast<char16_t>(ARG_NUM_LIMIT + textLength));
  102|  4.33k|                textLength = 0;
  103|  4.33k|            }
  104|  7.53k|            int32_t argNumber;
  105|  7.53k|            if ((i + 1) < patternLength &&
  ------------------
  |  Branch (105:17): [True: 7.53k, False: 0]
  ------------------
  106|  7.53k|                    0 <= (argNumber = patternBuffer[i] - DIGIT_ZERO) && argNumber <= 9 &&
  ------------------
  |  Branch (106:21): [True: 7.53k, False: 0]
  |  Branch (106:73): [True: 7.53k, False: 0]
  ------------------
  107|  7.53k|                    patternBuffer[i + 1] == CLOSE_BRACE) {
  ------------------
  |  Branch (107:21): [True: 7.53k, False: 0]
  ------------------
  108|  7.53k|                i += 2;
  109|  7.53k|            } 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|  7.53k|            if (argNumber > maxArg) {
  ------------------
  |  Branch (129:17): [True: 4.84k, False: 2.69k]
  ------------------
  130|  4.84k|                maxArg = argNumber;
  131|  4.84k|            }
  132|  7.53k|            compiledPattern.append(static_cast<char16_t>(argNumber));
  133|  7.53k|            continue;
  134|  7.53k|        }  // else: c is part of literal text
  135|       |        // Append c and track the literal-text segment length.
  136|  9.41k|        if (textLength == 0) {
  ------------------
  |  Branch (136:13): [True: 5.46k, False: 3.95k]
  ------------------
  137|       |            // Reserve a char for the length of a new text segment, preset the maximum length.
  138|  5.46k|            compiledPattern.append(SEGMENT_LENGTH_PLACEHOLDER_CHAR);
  139|  5.46k|        }
  140|  9.41k|        compiledPattern.append(c);
  141|  9.41k|        if (++textLength == MAX_SEGMENT_LENGTH) {
  ------------------
  |  Branch (141:13): [True: 0, False: 9.41k]
  ------------------
  142|      0|            textLength = 0;
  143|      0|        }
  144|  9.41k|    }
  145|  3.20k|    if (textLength > 0) {
  ------------------
  |  Branch (145:9): [True: 1.13k, False: 2.07k]
  ------------------
  146|  1.13k|        compiledPattern.setCharAt(compiledPattern.length() - textLength - 1,
  147|  1.13k|                                  static_cast<char16_t>(ARG_NUM_LIMIT + textLength));
  148|  1.13k|    }
  149|  3.20k|    int32_t argCount = maxArg + 1;
  150|  3.20k|    if (argCount < min || max < argCount) {
  ------------------
  |  Branch (150:9): [True: 0, False: 3.20k]
  |  Branch (150:27): [True: 0, False: 3.20k]
  ------------------
  151|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  152|      0|        return false;
  153|      0|    }
  154|  3.20k|    compiledPattern.setCharAt(0, static_cast<char16_t>(argCount));
  155|  3.20k|    return true;
  156|  3.20k|}
_ZNK6icu_7815SimpleFormatter6formatERKNS_13UnicodeStringES3_RS1_R10UErrorCode:
  168|  1.56k|        UnicodeString &appendTo, UErrorCode &errorCode) const {
  169|  1.56k|    const UnicodeString *values[] = { &value0, &value1 };
  170|  1.56k|    return formatAndAppend(values, 2, appendTo, nullptr, 0, errorCode);
  171|  1.56k|}
_ZNK6icu_7815SimpleFormatter15formatAndAppendEPKPKNS_13UnicodeStringEiRS1_PiiR10UErrorCode:
  185|  1.56k|        int32_t *offsets, int32_t offsetsLength, UErrorCode &errorCode) const {
  186|  1.56k|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (186:9): [True: 0, False: 1.56k]
  ------------------
  187|      0|        return appendTo;
  188|      0|    }
  189|  1.56k|    if (isInvalidArray(values, valuesLength) || isInvalidArray(offsets, offsetsLength) ||
  ------------------
  |  Branch (189:9): [True: 0, False: 1.56k]
  |  Branch (189:49): [True: 0, False: 1.56k]
  ------------------
  190|  1.56k|            valuesLength < getArgumentLimit()) {
  ------------------
  |  Branch (190:13): [True: 0, False: 1.56k]
  ------------------
  191|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  192|      0|        return appendTo;
  193|      0|    }
  194|  1.56k|    return format(compiledPattern.getBuffer(), compiledPattern.length(), values,
  195|  1.56k|                  appendTo, nullptr, true,
  196|  1.56k|                  offsets, offsetsLength, errorCode);
  197|  1.56k|}
_ZNK6icu_7815SimpleFormatter16formatAndReplaceEPKPKNS_13UnicodeStringEiRS1_PiiR10UErrorCode:
  202|  1.64k|        int32_t *offsets, int32_t offsetsLength, UErrorCode &errorCode) const {
  203|  1.64k|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (203:9): [True: 0, False: 1.64k]
  ------------------
  204|      0|        return result;
  205|      0|    }
  206|  1.64k|    if (isInvalidArray(values, valuesLength) || isInvalidArray(offsets, offsetsLength)) {
  ------------------
  |  Branch (206:9): [True: 0, False: 1.64k]
  |  Branch (206:49): [True: 0, False: 1.64k]
  ------------------
  207|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  208|      0|        return result;
  209|      0|    }
  210|  1.64k|    const char16_t *cp = compiledPattern.getBuffer();
  211|  1.64k|    int32_t cpLength = compiledPattern.length();
  212|  1.64k|    if (valuesLength < getArgumentLimit(cp, cpLength)) {
  ------------------
  |  Branch (212:9): [True: 0, False: 1.64k]
  ------------------
  213|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  214|      0|        return result;
  215|      0|    }
  216|       |
  217|       |    // If the pattern starts with an argument whose value is the same object
  218|       |    // as the result, then we keep the result contents and append to it.
  219|       |    // Otherwise we replace its contents.
  220|  1.64k|    int32_t firstArg = -1;
  221|       |    // If any non-initial argument value is the same object as the result,
  222|       |    // then we first copy its contents and use that instead while formatting.
  223|  1.64k|    UnicodeString resultCopy;
  224|  1.64k|    if (getArgumentLimit(cp, cpLength) > 0) {
  ------------------
  |  Branch (224:9): [True: 1.64k, False: 0]
  ------------------
  225|  9.95k|        for (int32_t i = 1; i < cpLength;) {
  ------------------
  |  Branch (225:29): [True: 8.31k, False: 1.64k]
  ------------------
  226|  8.31k|            int32_t n = cp[i++];
  227|  8.31k|            if (n < ARG_NUM_LIMIT) {
  ------------------
  |  Branch (227:17): [True: 4.41k, False: 3.90k]
  ------------------
  228|  4.41k|                if (values[n] == &result) {
  ------------------
  |  Branch (228:21): [True: 1.64k, False: 2.77k]
  ------------------
  229|  1.64k|                    if (i == 2) {
  ------------------
  |  Branch (229:25): [True: 1.64k, False: 0]
  ------------------
  230|  1.64k|                        firstArg = n;
  231|  1.64k|                    } else if (resultCopy.isEmpty() && !result.isEmpty()) {
  ------------------
  |  Branch (231:32): [True: 0, False: 0]
  |  Branch (231:56): [True: 0, False: 0]
  ------------------
  232|      0|                        resultCopy = result;
  233|      0|                    }
  234|  1.64k|                }
  235|  4.41k|            } else {
  236|  3.90k|                i += n - ARG_NUM_LIMIT;
  237|  3.90k|            }
  238|  8.31k|        }
  239|  1.64k|    }
  240|  1.64k|    if (firstArg < 0) {
  ------------------
  |  Branch (240:9): [True: 0, False: 1.64k]
  ------------------
  241|      0|        result.remove();
  242|      0|    }
  243|  1.64k|    return format(cp, cpLength, values,
  244|  1.64k|                  result, &resultCopy, false,
  245|  1.64k|                  offsets, offsetsLength, errorCode);
  246|  1.64k|}
_ZN6icu_7815SimpleFormatter6formatEPKDsiPKPKNS_13UnicodeStringERS3_S5_aPiiR10UErrorCode:
  279|  3.20k|        UErrorCode &errorCode) {
  280|  3.20k|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (280:9): [True: 0, False: 3.20k]
  ------------------
  281|      0|        return result;
  282|      0|    }
  283|  3.20k|    for (int32_t i = 0; i < offsetsLength; i++) {
  ------------------
  |  Branch (283:25): [True: 0, False: 3.20k]
  ------------------
  284|      0|        offsets[i] = -1;
  285|      0|    }
  286|  16.1k|    for (int32_t i = 1; i < compiledPatternLength;) {
  ------------------
  |  Branch (286:25): [True: 12.9k, False: 3.20k]
  ------------------
  287|  12.9k|        int32_t n = compiledPattern[i++];
  288|  12.9k|        if (n < ARG_NUM_LIMIT) {
  ------------------
  |  Branch (288:13): [True: 7.53k, False: 5.46k]
  ------------------
  289|  7.53k|            const UnicodeString *value = values[n];
  290|  7.53k|            if (value == nullptr) {
  ------------------
  |  Branch (290:17): [True: 0, False: 7.53k]
  ------------------
  291|      0|                errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  292|      0|                return result;
  293|      0|            }
  294|  7.53k|            if (value == &result) {
  ------------------
  |  Branch (294:17): [True: 1.64k, False: 5.89k]
  ------------------
  295|  1.64k|                if (forbidResultAsValue) {
  ------------------
  |  Branch (295:21): [True: 0, False: 1.64k]
  ------------------
  296|      0|                    errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  297|      0|                    return result;
  298|      0|                }
  299|  1.64k|                if (i == 2) {
  ------------------
  |  Branch (299:21): [True: 1.64k, False: 0]
  ------------------
  300|       |                    // We are appending to result which is also the first value object.
  301|  1.64k|                    if (n < offsetsLength) {
  ------------------
  |  Branch (301:25): [True: 0, False: 1.64k]
  ------------------
  302|      0|                        offsets[n] = 0;
  303|      0|                    }
  304|  1.64k|                } else {
  305|      0|                    if (n < offsetsLength) {
  ------------------
  |  Branch (305:25): [True: 0, False: 0]
  ------------------
  306|      0|                        offsets[n] = result.length();
  307|      0|                    }
  308|      0|                    result.append(*resultCopy);
  309|      0|                }
  310|  5.89k|            } else {
  311|  5.89k|                if (n < offsetsLength) {
  ------------------
  |  Branch (311:21): [True: 0, False: 5.89k]
  ------------------
  312|      0|                    offsets[n] = result.length();
  313|      0|                }
  314|  5.89k|                result.append(*value);
  315|  5.89k|            }
  316|  7.53k|        } else {
  317|  5.46k|            int32_t length = n - ARG_NUM_LIMIT;
  318|  5.46k|            result.append(compiledPattern + i, length);
  319|  5.46k|            i += length;
  320|  5.46k|        }
  321|  12.9k|    }
  322|  3.20k|    return result;
  323|  3.20k|}
simpleformatter.cpp:_ZN6icu_7812_GLOBAL__N_114isInvalidArrayEPKvi:
   47|  6.40k|inline UBool isInvalidArray(const void *array, int32_t length) {
   48|  6.40k|   return (length < 0 || (array == nullptr && length != 0));
  ------------------
  |  Branch (48:12): [True: 0, False: 6.40k]
  |  Branch (48:27): [True: 3.20k, False: 3.20k]
  |  Branch (48:47): [True: 0, False: 3.20k]
  ------------------
   49|  6.40k|}

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

uprv_sortArray_78:
  258|      8|               UBool sortStable, UErrorCode *pErrorCode) {
  259|      8|    if(pErrorCode==nullptr || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (259:8): [True: 0, False: 8]
  |  Branch (259:31): [True: 0, False: 8]
  ------------------
  260|      0|        return;
  261|      0|    }
  262|      8|    if((length>0 && array==nullptr) || length<0 || itemSize<=0 || cmp==nullptr) {
  ------------------
  |  Branch (262:9): [True: 8, False: 0]
  |  Branch (262:21): [True: 0, False: 8]
  |  Branch (262:40): [True: 0, False: 8]
  |  Branch (262:52): [True: 0, False: 8]
  |  Branch (262:67): [True: 0, False: 8]
  ------------------
  263|      0|        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
  264|      0|        return;
  265|      0|    }
  266|       |
  267|      8|    if(length<=1) {
  ------------------
  |  Branch (267:8): [True: 8, False: 0]
  ------------------
  268|      8|        return;
  269|      8|    } else if(length<MIN_QSORT || sortStable) {
  ------------------
  |  Branch (269:15): [True: 0, False: 0]
  |  Branch (269:35): [True: 0, False: 0]
  ------------------
  270|      0|        insertionSort((char *)array, length, itemSize, cmp, context, pErrorCode);
  271|      0|    } else {
  272|      0|        quickSort((char *)array, length, itemSize, cmp, context, pErrorCode);
  273|      0|    }
  274|      8|}

ucase_getTrie_78:
   75|  92.5k|ucase_getTrie() {
   76|  92.5k|    return &ucase_props_singleton.trie;
   77|  92.5k|}
ucase_getTypeOrIgnorable_78:
  680|  1.15M|ucase_getTypeOrIgnorable(UChar32 c) {
  681|  1.15M|    uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
  ------------------
  |  |  360|  1.15M|#define UTRIE2_GET16(trie, c) _UTRIE2_GET((trie), index, (trie)->indexLength, (c))
  |  |  ------------------
  |  |  |  |  871|  1.15M|    (trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
  |  |  |  |  ------------------
  |  |  |  |  |  |  845|  1.15M|    ((uint32_t)(c)<0xd800 ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (845:6): [True: 24.0k, False: 1.12M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  846|  1.15M|        _UTRIE2_INDEX_RAW(0, (trie)->index, c) : \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|  24.0k|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  816|  24.0k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|  24.0k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  847|  1.15M|        (uint32_t)(c)<=0xffff ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (847:9): [True: 1.12M, False: 7.10k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  848|  1.12M|            _UTRIE2_INDEX_RAW( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|  2.24M|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (815:30): [True: 4.87k, False: 1.11M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  816|  1.12M|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|  1.12M|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  849|  1.12M|                (c)<=0xdbff ? UTRIE2_LSCP_INDEX_2_OFFSET-(0xd800>>UTRIE2_SHIFT_2) : 0, \
  |  |  |  |  |  |  850|  1.12M|                (trie)->index, c) : \
  |  |  |  |  |  |  851|  1.12M|            (uint32_t)(c)>0x10ffff ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (851:13): [True: 0, False: 7.10k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  852|  7.10k|                (asciiOffset)+UTRIE2_BAD_UTF8_DATA_OFFSET : \
  |  |  |  |  |  |  853|  7.10k|                (c)>=(trie)->highStart ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (853:17): [True: 6.00k, False: 1.10k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  7.10k|                    (trie)->highValueIndex : \
  |  |  |  |  |  |  855|  7.10k|                    _UTRIE2_INDEX_FROM_SUPP((trie)->index, c))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  833|  1.10k|    (((int32_t)((trieIndex)[ \
  |  |  |  |  |  |  |  |  834|  1.10k|        (trieIndex)[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+ \
  |  |  |  |  |  |  |  |  835|  1.10k|                      ((c)>>UTRIE2_SHIFT_1)]+ \
  |  |  |  |  |  |  |  |  836|  1.10k|        (((c)>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK)]) \
  |  |  |  |  |  |  |  |  837|  1.10k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  838|  1.10k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  682|  1.15M|    return UCASE_GET_TYPE_AND_IGNORABLE(props);
  ------------------
  |  |  372|  1.15M|#define UCASE_GET_TYPE_AND_IGNORABLE(props) ((props)&7)
  ------------------
  683|  1.15M|}
ucase_toFullLower_78:
 1153|  3.45M|                  int32_t loc) {
 1154|       |    // The sign of the result has meaning, input must be non-negative so that it can be returned as is.
 1155|  3.45M|    U_ASSERT(c >= 0);
  ------------------
  |  |   35|  3.45M|#   define U_ASSERT(exp) (void)0
  ------------------
 1156|  3.45M|    UChar32 result=c;
 1157|       |    // Reset the output pointer in case it was uninitialized.
 1158|  3.45M|    *pString=nullptr;
 1159|  3.45M|    uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
  ------------------
  |  |  360|  3.45M|#define UTRIE2_GET16(trie, c) _UTRIE2_GET((trie), index, (trie)->indexLength, (c))
  |  |  ------------------
  |  |  |  |  871|  3.45M|    (trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
  |  |  |  |  ------------------
  |  |  |  |  |  |  845|  3.45M|    ((uint32_t)(c)<0xd800 ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (845:6): [True: 2.32M, False: 1.12M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  846|  3.45M|        _UTRIE2_INDEX_RAW(0, (trie)->index, c) : \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|  2.32M|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  816|  2.32M|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|  2.32M|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  847|  3.45M|        (uint32_t)(c)<=0xffff ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (847:9): [True: 1.09M, False: 25.6k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  848|  1.12M|            _UTRIE2_INDEX_RAW( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|  2.19M|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (815:30): [True: 50.3k, False: 1.04M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  816|  1.09M|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|  1.09M|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  849|  1.12M|                (c)<=0xdbff ? UTRIE2_LSCP_INDEX_2_OFFSET-(0xd800>>UTRIE2_SHIFT_2) : 0, \
  |  |  |  |  |  |  850|  1.12M|                (trie)->index, c) : \
  |  |  |  |  |  |  851|  1.12M|            (uint32_t)(c)>0x10ffff ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (851:13): [True: 0, False: 25.6k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  852|  25.6k|                (asciiOffset)+UTRIE2_BAD_UTF8_DATA_OFFSET : \
  |  |  |  |  |  |  853|  25.6k|                (c)>=(trie)->highStart ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (853:17): [True: 6.86k, False: 18.7k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  25.6k|                    (trie)->highValueIndex : \
  |  |  |  |  |  |  855|  25.6k|                    _UTRIE2_INDEX_FROM_SUPP((trie)->index, c))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  833|  18.7k|    (((int32_t)((trieIndex)[ \
  |  |  |  |  |  |  |  |  834|  18.7k|        (trieIndex)[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+ \
  |  |  |  |  |  |  |  |  835|  18.7k|                      ((c)>>UTRIE2_SHIFT_1)]+ \
  |  |  |  |  |  |  |  |  836|  18.7k|        (((c)>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK)]) \
  |  |  |  |  |  |  |  |  837|  18.7k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  838|  18.7k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1160|  3.45M|    if(!UCASE_HAS_EXCEPTION(props)) {
  ------------------
  |  |  380|  3.45M|#define UCASE_HAS_EXCEPTION(props) ((props)&UCASE_EXCEPTION)
  |  |  ------------------
  |  |  |  |  377|  3.45M|#define UCASE_EXCEPTION         8
  |  |  ------------------
  ------------------
  |  Branch (1160:8): [True: 1.12M, False: 2.32M]
  ------------------
 1161|  1.12M|        if(UCASE_IS_UPPER_OR_TITLE(props)) {
  ------------------
  |  |  374|  1.12M|#define UCASE_IS_UPPER_OR_TITLE(props) ((props)&2)
  |  |  ------------------
  |  |  |  Branch (374:40): [True: 22.2k, False: 1.10M]
  |  |  ------------------
  ------------------
 1162|  22.2k|            result=c+UCASE_GET_DELTA(props);
  ------------------
  |  |  397|  22.2k|#   define UCASE_GET_DELTA(props) ((int16_t)(props)>>UCASE_DELTA_SHIFT)
  |  |  ------------------
  |  |  |  |  391|  22.2k|#define UCASE_DELTA_SHIFT   7
  |  |  ------------------
  ------------------
 1163|  22.2k|        }
 1164|  2.32M|    } else {
 1165|  2.32M|        const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props), *pe2;
  ------------------
  |  |   79|  2.32M|#define GET_EXCEPTIONS(csp, props) ((csp)->exceptions+((props)>>UCASE_EXC_SHIFT))
  |  |  ------------------
  |  |  |  |  403|  2.32M|#define UCASE_EXC_SHIFT     4
  |  |  ------------------
  ------------------
 1166|  2.32M|        uint16_t excWord=*pe++;
 1167|  2.32M|        int32_t full;
 1168|       |
 1169|  2.32M|        pe2=pe;
 1170|       |
 1171|  2.32M|        if(excWord&UCASE_EXC_CONDITIONAL_SPECIAL) {
  ------------------
  |  |  444|  2.32M|#define UCASE_EXC_CONDITIONAL_SPECIAL   0x4000
  ------------------
  |  Branch (1171:12): [True: 2.30M, False: 21.9k]
  ------------------
 1172|       |            /* use hardcoded conditions and mappings */
 1173|       |
 1174|       |            /*
 1175|       |             * Test for conditional mappings first
 1176|       |             *   (otherwise the unconditional default mappings are always taken),
 1177|       |             * then test for characters that have unconditional mappings in SpecialCasing.txt,
 1178|       |             * then get the UnicodeData.txt mappings.
 1179|       |             */
 1180|  2.30M|            if( loc==UCASE_LOC_LITHUANIAN &&
  ------------------
  |  Branch (1180:17): [True: 0, False: 2.30M]
  ------------------
 1181|       |                    /* base characters, find accents above */
 1182|  2.30M|                    (((c==0x49 || c==0x4a || c==0x12e) &&
  ------------------
  |  Branch (1182:24): [True: 0, False: 0]
  |  Branch (1182:35): [True: 0, False: 0]
  |  Branch (1182:46): [True: 0, False: 0]
  ------------------
 1183|      0|                        isFollowedByMoreAbove(iter, context)) ||
  ------------------
  |  Branch (1183:25): [True: 0, False: 0]
  ------------------
 1184|       |                    /* precomposed with accent above, no need to find one */
 1185|      0|                    (c==0xcc || c==0xcd || c==0x128))
  ------------------
  |  Branch (1185:22): [True: 0, False: 0]
  |  Branch (1185:33): [True: 0, False: 0]
  |  Branch (1185:44): [True: 0, False: 0]
  ------------------
 1186|  2.30M|            ) {
 1187|       |                /*
 1188|       |                    # Lithuanian
 1189|       |
 1190|       |                    # Lithuanian retains the dot in a lowercase i when followed by accents.
 1191|       |
 1192|       |                    # Introduce an explicit dot above when lowercasing capital I's and J's
 1193|       |                    # whenever there are more accents above.
 1194|       |                    # (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek)
 1195|       |
 1196|       |                    0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I
 1197|       |                    004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J
 1198|       |                    012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK
 1199|       |                    00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE
 1200|       |                    00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE
 1201|       |                    0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE
 1202|       |                 */
 1203|      0|                switch(c) {
 1204|      0|                case 0x49:  /* LATIN CAPITAL LETTER I */
  ------------------
  |  Branch (1204:17): [True: 0, False: 0]
  ------------------
 1205|      0|                    *pString=iDot;
 1206|      0|                    return 2;
 1207|      0|                case 0x4a:  /* LATIN CAPITAL LETTER J */
  ------------------
  |  Branch (1207:17): [True: 0, False: 0]
  ------------------
 1208|      0|                    *pString=jDot;
 1209|      0|                    return 2;
 1210|      0|                case 0x12e: /* LATIN CAPITAL LETTER I WITH OGONEK */
  ------------------
  |  Branch (1210:17): [True: 0, False: 0]
  ------------------
 1211|      0|                    *pString=iOgonekDot;
 1212|      0|                    return 2;
 1213|      0|                case 0xcc:  /* LATIN CAPITAL LETTER I WITH GRAVE */
  ------------------
  |  Branch (1213:17): [True: 0, False: 0]
  ------------------
 1214|      0|                    *pString=iDotGrave;
 1215|      0|                    return 3;
 1216|      0|                case 0xcd:  /* LATIN CAPITAL LETTER I WITH ACUTE */
  ------------------
  |  Branch (1216:17): [True: 0, False: 0]
  ------------------
 1217|      0|                    *pString=iDotAcute;
 1218|      0|                    return 3;
 1219|      0|                case 0x128: /* LATIN CAPITAL LETTER I WITH TILDE */
  ------------------
  |  Branch (1219:17): [True: 0, False: 0]
  ------------------
 1220|      0|                    *pString=iDotTilde;
 1221|      0|                    return 3;
 1222|      0|                default:
  ------------------
  |  Branch (1222:17): [True: 0, False: 0]
  ------------------
 1223|      0|                    return 0; /* will not occur */
 1224|      0|                }
 1225|       |            /* # Turkish and Azeri */
 1226|  2.30M|            } else if(loc==UCASE_LOC_TURKISH && c==0x130) {
  ------------------
  |  Branch (1226:23): [True: 0, False: 2.30M]
  |  Branch (1226:49): [True: 0, False: 0]
  ------------------
 1227|       |                /*
 1228|       |                    # I and i-dotless; I-dot and i are case pairs in Turkish and Azeri
 1229|       |                    # The following rules handle those cases.
 1230|       |
 1231|       |                    0130; 0069; 0130; 0130; tr # LATIN CAPITAL LETTER I WITH DOT ABOVE
 1232|       |                    0130; 0069; 0130; 0130; az # LATIN CAPITAL LETTER I WITH DOT ABOVE
 1233|       |                 */
 1234|      0|                return 0x69;
 1235|  2.30M|            } else if(loc==UCASE_LOC_TURKISH && c==0x307 && isPrecededBy_I(iter, context)) {
  ------------------
  |  Branch (1235:23): [True: 0, False: 2.30M]
  |  Branch (1235:49): [True: 0, False: 0]
  |  Branch (1235:61): [True: 0, False: 0]
  ------------------
 1236|       |                /*
 1237|       |                    # When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i.
 1238|       |                    # This matches the behavior of the canonically equivalent I-dot_above
 1239|       |
 1240|       |                    0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE
 1241|       |                    0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE
 1242|       |                 */
 1243|      0|                return 0; /* remove the dot (continue without output) */
 1244|  2.30M|            } else if(loc==UCASE_LOC_TURKISH && c==0x49 && !isFollowedByDotAbove(iter, context)) {
  ------------------
  |  Branch (1244:23): [True: 0, False: 2.30M]
  |  Branch (1244:49): [True: 0, False: 0]
  |  Branch (1244:60): [True: 0, False: 0]
  ------------------
 1245|       |                /*
 1246|       |                    # When lowercasing, unless an I is before a dot_above, it turns into a dotless i.
 1247|       |
 1248|       |                    0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I
 1249|       |                    0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I
 1250|       |                 */
 1251|      0|                return 0x131;
 1252|  2.30M|            } else if(c==0x130) {
  ------------------
  |  Branch (1252:23): [True: 1.72M, False: 582k]
  ------------------
 1253|       |                /*
 1254|       |                    # Preserve canonical equivalence for I with dot. Turkic is handled below.
 1255|       |
 1256|       |                    0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE
 1257|       |                 */
 1258|  1.72M|                *pString=iDot;
 1259|  1.72M|                return 2;
 1260|  1.72M|            } else if(  c==0x3a3 &&
  ------------------
  |  Branch (1260:25): [True: 580k, False: 1.76k]
  ------------------
 1261|   582k|                        !isFollowedByCasedLetter(iter, context, 1) &&
  ------------------
  |  Branch (1261:25): [True: 571k, False: 9.48k]
  ------------------
 1262|   582k|                        isFollowedByCasedLetter(iter, context, -1) /* -1=preceded */
  ------------------
  |  Branch (1262:25): [True: 4.98k, False: 566k]
  ------------------
 1263|   582k|            ) {
 1264|       |                /* greek capital sigma maps depending on surrounding cased letters (see SpecialCasing.txt) */
 1265|       |                /*
 1266|       |                    # Special case for final form of sigma
 1267|       |
 1268|       |                    03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA
 1269|       |                 */
 1270|  4.98k|                return 0x3c2; /* greek small final sigma */
 1271|   577k|            } else {
 1272|       |                /* no known conditional special case mapping, use a normal mapping */
 1273|   577k|            }
 1274|  2.30M|        } else if(HAS_SLOT(excWord, UCASE_EXC_FULL_MAPPINGS)) {
  ------------------
  |  |  101|  21.9k|#define HAS_SLOT(flags, idx) ((flags)&(1<<(idx)))
  |  |  ------------------
  |  |  |  Branch (101:30): [True: 916, False: 21.0k]
  |  |  ------------------
  ------------------
 1275|    916|            GET_SLOT_VALUE(excWord, UCASE_EXC_FULL_MAPPINGS, pe, full);
  ------------------
  |  |  113|    916|#define GET_SLOT_VALUE(excWord, idx, pExc16, value) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    916|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  114|    916|    if(((excWord)&UCASE_EXC_DOUBLE_SLOTS)==0) { \
  |  |  ------------------
  |  |  |  |  423|    916|#define UCASE_EXC_DOUBLE_SLOTS      0x100
  |  |  ------------------
  |  |  |  Branch (114:8): [True: 916, False: 0]
  |  |  ------------------
  |  |  115|    916|        (pExc16)+=SLOT_OFFSET(excWord, idx); \
  |  |  ------------------
  |  |  |  |  102|    916|#define SLOT_OFFSET(flags, idx) flagsOffset[(flags)&((1<<(idx))-1)]
  |  |  ------------------
  |  |  116|    916|        (value)=*pExc16; \
  |  |  117|    916|    } else { \
  |  |  118|      0|        (pExc16)+=2*SLOT_OFFSET(excWord, idx); \
  |  |  ------------------
  |  |  |  |  102|      0|#define SLOT_OFFSET(flags, idx) flagsOffset[(flags)&((1<<(idx))-1)]
  |  |  ------------------
  |  |  119|      0|        (value)=*pExc16++; \
  |  |  120|      0|        (value)=((value)<<16)|*pExc16; \
  |  |  121|      0|    } \
  |  |  122|    916|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    916|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1276|    916|            full&=UCASE_FULL_LOWER;
  ------------------
  |  |  448|    916|#define UCASE_FULL_LOWER    0xf
  ------------------
 1277|    916|            if(full!=0) {
  ------------------
  |  Branch (1277:16): [True: 0, False: 916]
  ------------------
 1278|       |                /* set the output pointer to the lowercase mapping */
 1279|      0|                *pString=reinterpret_cast<const char16_t *>(pe+1);
 1280|       |
 1281|       |                /* return the string length */
 1282|      0|                return full;
 1283|      0|            }
 1284|    916|        }
 1285|       |
 1286|   599k|        if(HAS_SLOT(excWord, UCASE_EXC_DELTA) && UCASE_IS_UPPER_OR_TITLE(props)) {
  ------------------
  |  |  101|  1.19M|#define HAS_SLOT(flags, idx) ((flags)&(1<<(idx)))
  |  |  ------------------
  |  |  |  Branch (101:30): [True: 592k, False: 6.97k]
  |  |  ------------------
  ------------------
                      if(HAS_SLOT(excWord, UCASE_EXC_DELTA) && UCASE_IS_UPPER_OR_TITLE(props)) {
  ------------------
  |  |  374|   592k|#define UCASE_IS_UPPER_OR_TITLE(props) ((props)&2)
  |  |  ------------------
  |  |  |  Branch (374:40): [True: 585k, False: 7.74k]
  |  |  ------------------
  ------------------
 1287|   585k|            int32_t delta;
 1288|   585k|            GET_SLOT_VALUE(excWord, UCASE_EXC_DELTA, pe2, delta);
  ------------------
  |  |  113|   585k|#define GET_SLOT_VALUE(excWord, idx, pExc16, value) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   585k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  114|   585k|    if(((excWord)&UCASE_EXC_DOUBLE_SLOTS)==0) { \
  |  |  ------------------
  |  |  |  |  423|   585k|#define UCASE_EXC_DOUBLE_SLOTS      0x100
  |  |  ------------------
  |  |  |  Branch (114:8): [True: 585k, False: 0]
  |  |  ------------------
  |  |  115|   585k|        (pExc16)+=SLOT_OFFSET(excWord, idx); \
  |  |  ------------------
  |  |  |  |  102|   585k|#define SLOT_OFFSET(flags, idx) flagsOffset[(flags)&((1<<(idx))-1)]
  |  |  ------------------
  |  |  116|   585k|        (value)=*pExc16; \
  |  |  117|   585k|    } else { \
  |  |  118|      0|        (pExc16)+=2*SLOT_OFFSET(excWord, idx); \
  |  |  ------------------
  |  |  |  |  102|      0|#define SLOT_OFFSET(flags, idx) flagsOffset[(flags)&((1<<(idx))-1)]
  |  |  ------------------
  |  |  119|      0|        (value)=*pExc16++; \
  |  |  120|      0|        (value)=((value)<<16)|*pExc16; \
  |  |  121|      0|    } \
  |  |  122|   585k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   585k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1289|   585k|            return (excWord&UCASE_EXC_DELTA_IS_NEGATIVE)==0 ? c+delta : c-delta;
  ------------------
  |  Branch (1289:20): [True: 577k, False: 7.28k]
  ------------------
 1290|   585k|        }
 1291|  14.7k|        if(HAS_SLOT(excWord, UCASE_EXC_LOWER)) {
  ------------------
  |  |  101|  14.7k|#define HAS_SLOT(flags, idx) ((flags)&(1<<(idx)))
  |  |  ------------------
  |  |  |  Branch (101:30): [True: 707, False: 14.0k]
  |  |  ------------------
  ------------------
 1292|    707|            GET_SLOT_VALUE(excWord, UCASE_EXC_LOWER, pe2, result);
  ------------------
  |  |  113|    707|#define GET_SLOT_VALUE(excWord, idx, pExc16, value) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    707|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  114|    707|    if(((excWord)&UCASE_EXC_DOUBLE_SLOTS)==0) { \
  |  |  ------------------
  |  |  |  |  423|    707|#define UCASE_EXC_DOUBLE_SLOTS      0x100
  |  |  ------------------
  |  |  |  Branch (114:8): [True: 707, False: 0]
  |  |  ------------------
  |  |  115|    707|        (pExc16)+=SLOT_OFFSET(excWord, idx); \
  |  |  ------------------
  |  |  |  |  102|    707|#define SLOT_OFFSET(flags, idx) flagsOffset[(flags)&((1<<(idx))-1)]
  |  |  ------------------
  |  |  116|    707|        (value)=*pExc16; \
  |  |  117|    707|    } else { \
  |  |  118|      0|        (pExc16)+=2*SLOT_OFFSET(excWord, idx); \
  |  |  ------------------
  |  |  |  |  102|      0|#define SLOT_OFFSET(flags, idx) flagsOffset[(flags)&((1<<(idx))-1)]
  |  |  ------------------
  |  |  119|      0|        (value)=*pExc16++; \
  |  |  120|      0|        (value)=((value)<<16)|*pExc16; \
  |  |  121|      0|    } \
  |  |  122|    707|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    707|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1293|    707|        }
 1294|  14.7k|    }
 1295|       |
 1296|  1.13M|    return (result==c) ? ~result : result;
  ------------------
  |  Branch (1296:12): [True: 1.11M, False: 23.0k]
  ------------------
 1297|  3.45M|}
ucase.cpp:_ZL23isFollowedByCasedLetterPFiPvaES_a:
 1000|  1.15M|isFollowedByCasedLetter(UCaseContextIterator *iter, void *context, int8_t dir) {
 1001|  1.15M|    UChar32 c;
 1002|       |
 1003|  1.15M|    if(iter==nullptr) {
  ------------------
  |  Branch (1003:8): [True: 0, False: 1.15M]
  ------------------
 1004|      0|        return false;
 1005|      0|    }
 1006|       |
 1007|  1.15M|    for(/* dir!=0 sets direction */; (c=iter(context, dir))>=0; dir=0) {
  ------------------
  |  Branch (1007:38): [True: 1.15M, False: 2.82k]
  ------------------
 1008|  1.15M|        int32_t type=ucase_getTypeOrIgnorable(c);
  ------------------
  |  |  576|  1.15M|#define ucase_getTypeOrIgnorable U_ICU_ENTRY_POINT_RENAME(ucase_getTypeOrIgnorable)
  |  |  ------------------
  |  |  |  |  123|  1.15M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.15M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.15M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1009|  1.15M|        if(type&4) {
  ------------------
  |  Branch (1009:12): [True: 3.95k, False: 1.14M]
  ------------------
 1010|       |            /* case-ignorable, continue with the loop */
 1011|  1.14M|        } else if(type!=UCASE_NONE) {
  ------------------
  |  Branch (1011:19): [True: 14.4k, False: 1.13M]
  ------------------
 1012|  14.4k|            return true; /* followed by cased letter */
 1013|  1.13M|        } else {
 1014|  1.13M|            return false; /* uncased and not case-ignorable */
 1015|  1.13M|        }
 1016|  1.15M|    }
 1017|       |
 1018|  2.82k|    return false; /* not followed by cased letter */
 1019|  1.15M|}

u_charType_78:
   50|  12.0k|u_charType(UChar32 c) {
   51|  12.0k|    uint32_t props;
   52|  12.0k|    GET_PROPS(c, props);
  ------------------
  |  |   44|  12.0k|#define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c))
  |  |  ------------------
  |  |  |  |  360|  12.0k|#define UTRIE2_GET16(trie, c) _UTRIE2_GET((trie), index, (trie)->indexLength, (c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  871|  12.0k|    (trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  845|  12.0k|    ((uint32_t)(c)<0xd800 ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (845:6): [True: 7.06k, False: 4.94k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  846|  12.0k|        _UTRIE2_INDEX_RAW(0, (trie)->index, c) : \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  815|  7.06k|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  |  |  816|  7.06k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  817|  7.06k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  847|  12.0k|        (uint32_t)(c)<=0xffff ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (847:9): [True: 362, False: 4.58k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  848|  4.94k|            _UTRIE2_INDEX_RAW( \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  815|    724|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (815:30): [True: 2, False: 360]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  816|    362|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  817|    362|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  849|  4.94k|                (c)<=0xdbff ? UTRIE2_LSCP_INDEX_2_OFFSET-(0xd800>>UTRIE2_SHIFT_2) : 0, \
  |  |  |  |  |  |  |  |  850|  4.94k|                (trie)->index, c) : \
  |  |  |  |  |  |  |  |  851|  4.94k|            (uint32_t)(c)>0x10ffff ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (851:13): [True: 0, False: 4.58k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  852|  4.58k|                (asciiOffset)+UTRIE2_BAD_UTF8_DATA_OFFSET : \
  |  |  |  |  |  |  |  |  853|  4.58k|                (c)>=(trie)->highStart ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (853:17): [True: 0, False: 4.58k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  4.58k|                    (trie)->highValueIndex : \
  |  |  |  |  |  |  |  |  855|  4.58k|                    _UTRIE2_INDEX_FROM_SUPP((trie)->index, c))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  833|  4.58k|    (((int32_t)((trieIndex)[ \
  |  |  |  |  |  |  |  |  |  |  834|  4.58k|        (trieIndex)[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+ \
  |  |  |  |  |  |  |  |  |  |  835|  4.58k|                      ((c)>>UTRIE2_SHIFT_1)]+ \
  |  |  |  |  |  |  |  |  |  |  836|  4.58k|        (((c)>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK)]) \
  |  |  |  |  |  |  |  |  |  |  837|  4.58k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  838|  4.58k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   53|  12.0k|    return (int8_t)GET_CATEGORY(props);
  ------------------
  |  |   65|  12.0k|#define GET_CATEGORY(props) ((props)&0x1f)
  ------------------
   54|  12.0k|}
u_charDigitValue_78:
  343|   508k|u_charDigitValue(UChar32 c) {
  344|   508k|    uint32_t props;
  345|   508k|    int32_t value;
  346|   508k|    GET_PROPS(c, props);
  ------------------
  |  |   44|   508k|#define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c))
  |  |  ------------------
  |  |  |  |  360|   508k|#define UTRIE2_GET16(trie, c) _UTRIE2_GET((trie), index, (trie)->indexLength, (c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  871|   508k|    (trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  845|   508k|    ((uint32_t)(c)<0xd800 ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (845:6): [True: 508k, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  846|   508k|        _UTRIE2_INDEX_RAW(0, (trie)->index, c) : \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  815|   508k|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  |  |  816|   508k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  817|   508k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  847|   508k|        (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|   508k|    value=(int32_t)GET_NUMERIC_TYPE_VALUE(props)-UPROPS_NTV_DECIMAL_START;
  ------------------
  |  |   68|   508k|#define GET_NUMERIC_TYPE_VALUE(props) ((props)>>UPROPS_NUMERIC_TYPE_VALUE_SHIFT)
  ------------------
  348|   508k|    if(value<=9) {
  ------------------
  |  Branch (348:8): [True: 508k, False: 0]
  ------------------
  349|   508k|        return value;
  350|   508k|    } else {
  351|      0|        return -1;
  352|      0|    }
  353|   508k|}
u_digit_78:
  449|   508k|u_digit(UChar32 ch, int8_t radix) {
  450|   508k|    int8_t value;
  451|   508k|    if((uint8_t)(radix-2)<=(36-2)) {
  ------------------
  |  Branch (451:8): [True: 508k, False: 0]
  ------------------
  452|   508k|        value=(int8_t)u_charDigitValue(ch);
  ------------------
  |  |  220|   508k|#define u_charDigitValue U_ICU_ENTRY_POINT_RENAME(u_charDigitValue)
  |  |  ------------------
  |  |  |  |  123|   508k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   508k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   508k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  453|   508k|        if(value<0) {
  ------------------
  |  Branch (453:12): [True: 0, False: 508k]
  ------------------
  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|   508k|    } else {
  466|      0|        value=-1;   /* invalid radix */
  467|      0|    }
  468|   508k|    return (int8_t)((value<radix) ? value : -1);
  ------------------
  |  Branch (468:21): [True: 508k, False: 0]
  ------------------
  469|   508k|}
uchar_addPropertyStarts_78:
  647|      1|uchar_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) {
  648|      1|    if(U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (648:8): [True: 0, False: 1]
  ------------------
  649|      0|        return;
  650|      0|    }
  651|       |
  652|       |    /* add the start code point of each same-value range of the main trie */
  653|      1|    utrie2_enum(&propsTrie, nullptr, _enumPropertyStartsRange, sa);
  ------------------
  |  | 1962|      1|#define utrie2_enum U_ICU_ENTRY_POINT_RENAME(utrie2_enum)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  654|       |
  655|       |    /* add code points with hardcoded properties, plus the ones following them */
  656|       |
  657|       |    /* add for u_isblank() */
  658|      1|    USET_ADD_CP_AND_NEXT(sa, TAB);
  ------------------
  |  |  644|      1|#define USET_ADD_CP_AND_NEXT(sa, cp) sa->add(sa->set, cp); sa->add(sa->set, cp+1)
  ------------------
  659|       |
  660|       |    /* add for IS_THAT_CONTROL_SPACE() */
  661|      1|    sa->add(sa->set, CR+1); /* range TAB..CR */
  662|      1|    sa->add(sa->set, 0x1c);
  663|      1|    sa->add(sa->set, 0x1f+1);
  664|      1|    USET_ADD_CP_AND_NEXT(sa, 0x85);  // NEXT LINE (NEL)
  ------------------
  |  |  644|      1|#define USET_ADD_CP_AND_NEXT(sa, cp) sa->add(sa->set, cp); sa->add(sa->set, cp+1)
  ------------------
  665|       |
  666|       |    /* add for u_isIDIgnorable() what was not added above */
  667|      1|    sa->add(sa->set, 0x7f); /* range DEL..NBSP-1, NBSP added below */
  668|      1|    sa->add(sa->set, HAIRSP);
  669|      1|    sa->add(sa->set, RLM+1);
  670|      1|    sa->add(sa->set, 0x206a);  // INHIBIT SYMMETRIC SWAPPING
  671|      1|    sa->add(sa->set, 0x206f+1);  // NOMINAL DIGIT SHAPES
  672|      1|    USET_ADD_CP_AND_NEXT(sa, ZWNBSP);
  ------------------
  |  |  644|      1|#define USET_ADD_CP_AND_NEXT(sa, cp) sa->add(sa->set, cp); sa->add(sa->set, cp+1)
  ------------------
  673|       |
  674|       |    /* add no-break spaces for u_isWhitespace() what was not added above */
  675|      1|    USET_ADD_CP_AND_NEXT(sa, NBSP);
  ------------------
  |  |  644|      1|#define USET_ADD_CP_AND_NEXT(sa, cp) sa->add(sa->set, cp); sa->add(sa->set, cp+1)
  ------------------
  676|      1|    USET_ADD_CP_AND_NEXT(sa, FIGURESP);
  ------------------
  |  |  644|      1|#define USET_ADD_CP_AND_NEXT(sa, cp) sa->add(sa->set, cp); sa->add(sa->set, cp+1)
  ------------------
  677|      1|    USET_ADD_CP_AND_NEXT(sa, NNBSP);
  ------------------
  |  |  644|      1|#define USET_ADD_CP_AND_NEXT(sa, cp) sa->add(sa->set, cp); sa->add(sa->set, cp+1)
  ------------------
  678|       |
  679|       |    /* add for u_digit() */
  680|      1|    sa->add(sa->set, u'a');
  681|      1|    sa->add(sa->set, u'z'+1);
  682|      1|    sa->add(sa->set, u'A');
  683|      1|    sa->add(sa->set, u'Z'+1);
  684|       |    // fullwidth
  685|      1|    sa->add(sa->set, u'ａ');
  686|      1|    sa->add(sa->set, u'ｚ'+1);
  687|      1|    sa->add(sa->set, u'Ａ');
  688|      1|    sa->add(sa->set, u'Ｚ'+1);
  689|       |
  690|       |    /* add for u_isxdigit() */
  691|      1|    sa->add(sa->set, u'f'+1);
  692|      1|    sa->add(sa->set, u'F'+1);
  693|       |    // fullwidth
  694|      1|    sa->add(sa->set, u'ｆ'+1);
  695|      1|    sa->add(sa->set, u'Ｆ'+1);
  696|       |
  697|       |    /* add for UCHAR_DEFAULT_IGNORABLE_CODE_POINT what was not added above */
  698|      1|    sa->add(sa->set, 0x2060); /* range 2060..206f */
  699|      1|    sa->add(sa->set, 0xfff0);
  700|      1|    sa->add(sa->set, 0xfffb+1);
  701|      1|    sa->add(sa->set, 0xe0000);
  702|      1|    sa->add(sa->set, 0xe0fff+1);
  703|       |
  704|       |    /* add for UCHAR_GRAPHEME_BASE and others */
  705|      1|    USET_ADD_CP_AND_NEXT(sa, CGJ);
  ------------------
  |  |  644|      1|#define USET_ADD_CP_AND_NEXT(sa, cp) sa->add(sa->set, cp); sa->add(sa->set, cp+1)
  ------------------
  706|      1|}
uchar.cpp:_ZL24_enumPropertyStartsRangePKviij:
  635|  5.98k|_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32_t value) {
  636|       |    /* add the start code point to the USet */
  637|  5.98k|    const USetAdder* sa = static_cast<const USetAdder*>(context);
  638|  5.98k|    sa->add(sa->set, start);
  639|  5.98k|    (void)end;
  640|  5.98k|    (void)value;
  641|  5.98k|    return true;
  642|  5.98k|}

ucln_common_registerCleanup_78:
   67|  44.4k|{
   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|  44.4k|    U_ASSERT(UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT);
  ------------------
  |  |   35|  44.4k|#   define U_ASSERT(exp) (void)0
  ------------------
   79|  44.4k|    if (type == UCLN_COMMON_MUTEX) {
  ------------------
  |  Branch (79:9): [True: 1, False: 44.4k]
  ------------------
   80|      1|        gCommonCleanupFunctions[type] = func;
   81|  44.4k|    } else if (UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT)  {
  ------------------
  |  Branch (81:16): [True: 44.4k, False: 0]
  |  Branch (81:44): [True: 44.4k, False: 0]
  ------------------
   82|  44.4k|        icu::Mutex m;     // See ticket 10295 for discussion.
   83|  44.4k|        gCommonCleanupFunctions[type] = func;
   84|  44.4k|    }
   85|       |#if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
   86|       |    ucln_registerAutomaticCleanup();
   87|       |#endif
   88|  44.4k|}
ucln_registerCleanup_78:
   97|      5|{
   98|      5|    U_ASSERT(UCLN_START < type && type < UCLN_COMMON);
  ------------------
  |  |   35|      5|#   define U_ASSERT(exp) (void)0
  ------------------
   99|      5|    if (UCLN_START < type && type < UCLN_COMMON)
  ------------------
  |  Branch (99:9): [True: 5, False: 0]
  |  Branch (99:30): [True: 5, False: 0]
  ------------------
  100|      5|    {
  101|      5|        gLibCleanupFunctions[type] = func;
  102|      5|    }
  103|      5|}

udata_getHeaderSize_78:
   36|     20|udata_getHeaderSize(const DataHeader *udh) {
   37|     20|    if(udh==nullptr) {
  ------------------
  |  Branch (37:8): [True: 0, False: 20]
  ------------------
   38|      0|        return 0;
   39|     20|    } else if(udh->info.isBigEndian==U_IS_BIG_ENDIAN) {
  ------------------
  |  |  353|     20|#   define U_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
  ------------------
  |  Branch (39:15): [True: 20, False: 0]
  ------------------
   40|       |        /* same endianness */
   41|     20|        return udh->dataHeader.headerSize;
   42|     20|    } else {
   43|       |        /* opposite endianness */
   44|      0|        uint16_t x=udh->dataHeader.headerSize;
   45|      0|        return (uint16_t)((x<<8)|(x>>8));
   46|      0|    }
   47|     20|}
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|     25|                  UErrorCode *pErrorCode) {
  230|     25|    (void)pErrorCode;
  231|     25|    const UDataOffsetTOC  *toc = (UDataOffsetTOC *)pData->toc;
  232|     25|    if(toc!=nullptr) {
  ------------------
  |  Branch (232:8): [True: 25, False: 0]
  ------------------
  233|     25|        const char *base=(const char *)toc;
  234|     25|        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|     25|        number=offsetTOCPrefixBinarySearch(tocEntryName, base, toc->entry, count);
  244|     25|        if(number>=0) {
  ------------------
  |  Branch (244:12): [True: 19, False: 6]
  ------------------
  245|       |            /* found it */
  246|     19|            const UDataOffsetTOCEntry *entry=toc->entry+number;
  247|       |#ifdef UDATA_DEBUG
  248|       |            fprintf(stderr, "%s: Found.\n", tocEntryName);
  249|       |#endif
  250|     19|            if((number+1) < count) {
  ------------------
  |  Branch (250:16): [True: 19, False: 0]
  ------------------
  251|     19|                *pLength = (int32_t)(entry[1].dataOffset - entry->dataOffset);
  252|     19|            } else {
  253|      0|                *pLength = -1;
  254|      0|            }
  255|     19|            return (const DataHeader *)(base+entry->dataOffset);
  256|     19|        } else {
  257|       |#ifdef UDATA_DEBUG
  258|       |            fprintf(stderr, "%s: Not found.\n", tocEntryName);
  259|       |#endif
  260|      6|            return nullptr;
  261|      6|        }
  262|     25|    } else {
  263|       |#ifdef UDATA_DEBUG
  264|       |        fprintf(stderr, "returning header\n");
  265|       |#endif
  266|       |
  267|      0|        return pData->pHeader;
  268|      0|    }
  269|     25|}
ucmndata.cpp:_ZL27offsetTOCPrefixBinarySearchPKcS0_PK19UDataOffsetTOCEntryi:
  125|     25|                            const UDataOffsetTOCEntry *toc, int32_t count) {
  126|     25|    int32_t start=0;
  127|     25|    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|     25|    int32_t startPrefixLength=0;
  134|     25|    int32_t limitPrefixLength=0;
  135|     25|    if(count==0) {
  ------------------
  |  Branch (135:8): [True: 0, False: 25]
  ------------------
  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|     25|    if(0==strcmpAfterPrefix(s, names+toc[0].nameOffset, &startPrefixLength)) {
  ------------------
  |  Branch (144:8): [True: 0, False: 25]
  ------------------
  145|      0|        return 0;
  146|      0|    }
  147|     25|    ++start;
  148|     25|    --limit;
  149|     25|    if(0==strcmpAfterPrefix(s, names+toc[limit].nameOffset, &limitPrefixLength)) {
  ------------------
  |  Branch (149:8): [True: 0, False: 25]
  ------------------
  150|      0|        return limit;
  151|      0|    }
  152|    288|    while(start<limit) {
  ------------------
  |  Branch (152:11): [True: 282, False: 6]
  ------------------
  153|    282|        int32_t i=(start+limit)/2;
  154|    282|        int32_t prefixLength=MIN(startPrefixLength, limitPrefixLength);
  ------------------
  |  |   97|    282|#define MIN(a,b) (((a)<(b)) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (97:19): [True: 75, False: 207]
  |  |  ------------------
  ------------------
  155|    282|        int32_t cmp=strcmpAfterPrefix(s, names+toc[i].nameOffset, &prefixLength);
  156|    282|        if(cmp<0) {
  ------------------
  |  Branch (156:12): [True: 135, False: 147]
  ------------------
  157|    135|            limit=i;
  158|    135|            limitPrefixLength=prefixLength;
  159|    147|        } else if(cmp==0) {
  ------------------
  |  Branch (159:19): [True: 19, False: 128]
  ------------------
  160|     19|            return i;
  161|    128|        } else {
  162|    128|            start=i+1;
  163|    128|            startPrefixLength=prefixLength;
  164|    128|        }
  165|    282|    }
  166|      6|    return -1;
  167|     25|}
ucmndata.cpp:_ZL17strcmpAfterPrefixPKcS0_Pi:
  105|    332|strcmpAfterPrefix(const char *s1, const char *s2, int32_t *pPrefixLength) {
  106|    332|    int32_t pl=*pPrefixLength;
  107|    332|    int32_t cmp=0;
  108|    332|    s1+=pl;
  109|    332|    s2+=pl;
  110|  1.31k|    for(;;) {
  111|  1.31k|        int32_t c1 = static_cast<uint8_t>(*s1++);
  112|  1.31k|        int32_t c2 = static_cast<uint8_t>(*s2++);
  113|  1.31k|        cmp=c1-c2;
  114|  1.31k|        if(cmp!=0 || c1==0) {  /* different or done */
  ------------------
  |  Branch (114:12): [True: 313, False: 997]
  |  Branch (114:22): [True: 19, False: 978]
  ------------------
  115|    332|            break;
  116|    332|        }
  117|    978|        ++pl;  /* increment shared same-prefix length */
  118|    978|    }
  119|    332|    *pPrefixLength=pl;
  120|    332|    return cmp;
  121|    332|}

ucurr_forLocale_78:
  505|  44.4k|                UErrorCode* ec) {
  506|  44.4k|    if (U_FAILURE(*ec)) { return 0; }
  ------------------
  |  Branch (506:9): [True: 0, False: 44.4k]
  ------------------
  507|  44.4k|    if (buffCapacity < 0 || (buff == nullptr && buffCapacity > 0)) {
  ------------------
  |  Branch (507:9): [True: 0, False: 44.4k]
  |  Branch (507:30): [True: 0, False: 44.4k]
  |  Branch (507:49): [True: 0, False: 0]
  ------------------
  508|      0|        *ec = U_ILLEGAL_ARGUMENT_ERROR;
  509|      0|        return 0;
  510|      0|    }
  511|       |
  512|  44.4k|    UErrorCode localStatus = U_ZERO_ERROR;
  513|  44.4k|    CharString currency = ulocimp_getKeywordValue(locale, "currency", localStatus);
  ------------------
  |  | 1200|  44.4k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  514|  44.4k|    int32_t resLen = currency.length();
  515|       |
  516|  44.4k|    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: 44.4k, False: 0]
  |  Branch (516:35): [True: 0, False: 44.4k]
  |  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|  44.4k|    CharString id = idForLocale(locale, ec);
  526|  44.4k|    if (U_FAILURE(*ec)) {
  ------------------
  |  Branch (526:9): [True: 0, False: 44.4k]
  ------------------
  527|      0|        return 0;
  528|      0|    }
  529|       |
  530|  44.4k|#if !UCONFIG_NO_SERVICE
  531|  44.4k|    const char16_t* result = CReg::get(id.data());
  532|  44.4k|    if (result) {
  ------------------
  |  Branch (532:9): [True: 0, False: 44.4k]
  ------------------
  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|  44.4k|#endif
  540|       |    // Remove variants, which is only needed for registration.
  541|  44.4k|    char *idDelim = uprv_strchr(id.data(), VAR_DELIM);
  ------------------
  |  |   40|  44.4k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  44.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  542|  44.4k|    if (idDelim) {
  ------------------
  |  Branch (542:9): [True: 0, False: 44.4k]
  ------------------
  543|      0|        id.truncate(idDelim - id.data());
  544|      0|    }
  545|       |
  546|  44.4k|    const char16_t* s = nullptr;  // Currency code from data file.
  547|  44.4k|    if (id.isEmpty()) {
  ------------------
  |  Branch (547:9): [True: 0, False: 44.4k]
  ------------------
  548|       |        // No point looking in the data for an empty string.
  549|       |        // This is what we would get.
  550|      0|        localStatus = U_MISSING_RESOURCE_ERROR;
  551|  44.4k|    } else {
  552|       |        // Look up the CurrencyMap element in the root bundle.
  553|  44.4k|        localStatus = U_ZERO_ERROR;
  554|  44.4k|        UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus);
  ------------------
  |  | 1693|  44.4k|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus);
  ------------------
  |  |   21|  44.4k|#define U_ICUDATA_CURR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "curr"
  |  |  ------------------
  |  |  |  |  154|  44.4k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  555|  44.4k|        UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus);
  ------------------
  |  | 1661|  44.4k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  556|  44.4k|        LocalUResourceBundlePointer countryArray(ures_getByKey(rb, id.data(), cm, &localStatus));
  ------------------
  |  | 1661|  44.4k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       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|  44.4k|        if (U_SUCCESS(localStatus)) {
  ------------------
  |  Branch (559:13): [True: 44.4k, False: 0]
  ------------------
  560|  44.4k|            int32_t arrayLength = ures_getSize(countryArray.getAlias());
  ------------------
  |  | 1674|  44.4k|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  561|  44.4k|            for (int32_t i = 0; i < arrayLength; ++i) {
  ------------------
  |  Branch (561:33): [True: 44.4k, False: 0]
  ------------------
  562|  44.4k|                LocalUResourceBundlePointer currencyReq(
  563|  44.4k|                    ures_getByIndex(countryArray.getAlias(), i, nullptr, &localStatus));
  ------------------
  |  | 1660|  44.4k|#define ures_getByIndex U_ICU_ENTRY_POINT_RENAME(ures_getByIndex)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       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|  44.4k|                UErrorCode tenderStatus = localStatus;
  566|  44.4k|                const char16_t *tender =
  567|  44.4k|                    ures_getStringByKey(currencyReq.getAlias(), "tender", nullptr, &tenderStatus);
  ------------------
  |  | 1677|  44.4k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  568|  44.4k|                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: 44.4k, False: 0]
  |  Branch (568:60): [True: 0, False: 0]
  ------------------
  569|  44.4k|                if (!isTender && s != nullptr) {
  ------------------
  |  Branch (569:21): [True: 0, False: 44.4k]
  |  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|  44.4k|                s = ures_getStringByKey(currencyReq.getAlias(), "id", &resLen, &localStatus);
  ------------------
  |  | 1677|  44.4k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  575|  44.4k|                if (isTender) {
  ------------------
  |  Branch (575:21): [True: 44.4k, False: 0]
  ------------------
  576|  44.4k|                    break;
  577|  44.4k|                }
  578|  44.4k|            }
  579|  44.4k|            if (U_SUCCESS(localStatus) && s == nullptr) {
  ------------------
  |  Branch (579:17): [True: 44.4k, False: 0]
  |  Branch (579:43): [True: 0, False: 44.4k]
  ------------------
  580|      0|                localStatus = U_MISSING_RESOURCE_ERROR;
  581|      0|            }
  582|  44.4k|        }
  583|  44.4k|    }
  584|       |
  585|  44.4k|    if ((U_FAILURE(localStatus)) && strchr(id.data(), '_') != nullptr) {
  ------------------
  |  Branch (585:9): [True: 0, False: 44.4k]
  |  Branch (585:37): [True: 0, False: 0]
  ------------------
  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|  44.4k|    if (*ec == U_ZERO_ERROR || localStatus != U_ZERO_ERROR) {
  ------------------
  |  Branch (593:9): [True: 44.4k, False: 0]
  |  Branch (593:32): [True: 0, False: 0]
  ------------------
  594|       |        // There is nothing to fallback to. Report the failure/warning if possible.
  595|  44.4k|        *ec = localStatus;
  596|  44.4k|    }
  597|  44.4k|    if (U_SUCCESS(*ec)) {
  ------------------
  |  Branch (597:9): [True: 44.4k, False: 0]
  ------------------
  598|  44.4k|        if(buffCapacity > resLen) {
  ------------------
  |  Branch (598:12): [True: 44.4k, False: 0]
  ------------------
  599|  44.4k|            u_strcpy(buff, s);
  ------------------
  |  |  390|  44.4k|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  600|  44.4k|        }
  601|  44.4k|    }
  602|  44.4k|    return u_terminateUChars(buff, buffCapacity, resLen, ec);
  ------------------
  |  |  408|  44.4k|#define u_terminateUChars U_ICU_ENTRY_POINT_RENAME(u_terminateUChars)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  603|  44.4k|}
ucurr_getName_78:
  645|  44.4k|              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|  44.4k|    if (U_FAILURE(*ec)) {
  ------------------
  |  Branch (658:9): [True: 0, False: 44.4k]
  ------------------
  659|      0|        return nullptr;
  660|      0|    }
  661|       |
  662|  44.4k|    int32_t choice = (int32_t) nameStyle;
  663|  44.4k|    if (choice < 0 || choice > 4) {
  ------------------
  |  Branch (663:9): [True: 0, False: 44.4k]
  |  Branch (663:23): [True: 0, False: 44.4k]
  ------------------
  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|  44.4k|    UErrorCode ec2 = U_ZERO_ERROR;
  680|       |
  681|  44.4k|    if (locale == nullptr) {
  ------------------
  |  Branch (681:9): [True: 0, False: 44.4k]
  ------------------
  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|  44.4k|    CharString loc = ulocimp_getName(locale, ec2);
  ------------------
  |  | 1204|  44.4k|#define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  685|  44.4k|    if (U_FAILURE(ec2)) {
  ------------------
  |  Branch (685:9): [True: 0, False: 44.4k]
  ------------------
  686|      0|        *ec = U_ILLEGAL_ARGUMENT_ERROR;
  687|      0|        return nullptr;
  688|      0|    }
  689|       |
  690|  44.4k|    char buf[ISO_CURRENCY_CODE_LENGTH+1];
  691|  44.4k|    myUCharsToChars(buf, currency);
  692|       |    
  693|       |    /* Normalize the keyword value to uppercase */
  694|  44.4k|    T_CString_toUpperCase(buf);
  ------------------
  |  |   70|  44.4k|#define T_CString_toUpperCase U_ICU_ENTRY_POINT_RENAME(T_CString_toUpperCase)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  695|       |    
  696|  44.4k|    const char16_t* s = nullptr;
  697|  44.4k|    ec2 = U_ZERO_ERROR;
  698|  44.4k|    LocalUResourceBundlePointer rb(ures_open(U_ICUDATA_CURR, loc.data(), &ec2));
  ------------------
  |  | 1691|  44.4k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  LocalUResourceBundlePointer rb(ures_open(U_ICUDATA_CURR, loc.data(), &ec2));
  ------------------
  |  |   21|  44.4k|#define U_ICUDATA_CURR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "curr"
  |  |  ------------------
  |  |  |  |  154|  44.4k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  699|       |
  700|  44.4k|    if (nameStyle == UCURR_NARROW_SYMBOL_NAME || nameStyle == UCURR_FORMAL_SYMBOL_NAME || nameStyle == UCURR_VARIANT_SYMBOL_NAME) {
  ------------------
  |  Branch (700:9): [True: 0, False: 44.4k]
  |  Branch (700:50): [True: 0, False: 44.4k]
  |  Branch (700:91): [True: 0, False: 44.4k]
  ------------------
  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|  44.4k|    if (s == nullptr) {
  ------------------
  |  Branch (725:9): [True: 44.4k, False: 0]
  ------------------
  726|  44.4k|        ures_getByKey(rb.getAlias(), CURRENCIES, rb.getAlias(), &ec2);
  ------------------
  |  | 1661|  44.4k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  727|  44.4k|        ures_getByKeyWithFallback(rb.getAlias(), buf, rb.getAlias(), &ec2);
  ------------------
  |  | 1662|  44.4k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  728|  44.4k|        s = ures_getStringByIndex(rb.getAlias(), choice, len, &ec2);
  ------------------
  |  | 1676|  44.4k|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  729|  44.4k|    }
  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|  44.4k|    if (U_SUCCESS(ec2)) {
  ------------------
  |  Branch (733:9): [True: 44.4k, False: 0]
  ------------------
  734|  44.4k|        if (ec2 == U_USING_DEFAULT_WARNING
  ------------------
  |  Branch (734:13): [True: 0, False: 44.4k]
  ------------------
  735|  44.4k|            || (ec2 == U_USING_FALLBACK_WARNING && *ec != U_USING_DEFAULT_WARNING)) {
  ------------------
  |  Branch (735:17): [True: 44.4k, False: 0]
  |  Branch (735:52): [True: 23.2k, False: 21.2k]
  ------------------
  736|  23.2k|            *ec = ec2;
  737|  23.2k|        }
  738|  44.4k|    }
  739|       |
  740|       |    // We no longer support choice format data in names.  Data should not contain
  741|       |    // choice patterns.
  742|  44.4k|    if (isChoiceFormat != nullptr) {
  ------------------
  |  Branch (742:9): [True: 0, False: 44.4k]
  ------------------
  743|      0|        *isChoiceFormat = false;
  744|      0|    }
  745|  44.4k|    if (U_SUCCESS(ec2)) {
  ------------------
  |  Branch (745:9): [True: 44.4k, False: 0]
  ------------------
  746|  44.4k|        U_ASSERT(s != nullptr);
  ------------------
  |  |   35|  44.4k|#   define U_ASSERT(exp) (void)0
  ------------------
  747|  44.4k|        return s;
  748|  44.4k|    }
  749|       |
  750|       |    // If we fail to find a match, use the ISO 4217 code
  751|      0|    *len = u_strlen(currency); // Should == ISO_CURRENCY_CODE_LENGTH, but maybe not...?
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  752|      0|    *ec = U_USING_DEFAULT_WARNING;
  753|      0|    return currency;
  754|  44.4k|}
uprv_getStaticCurrencyName_78:
 1633|  44.4k|{
 1634|  44.4k|    U_NAMESPACE_USE
  ------------------
  |  |  112|  44.4k|#   define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
  ------------------
 1635|       |
 1636|  44.4k|    int32_t len;
 1637|  44.4k|    const char16_t* currname = ucurr_getName(iso, loc, UCURR_SYMBOL_NAME,
  ------------------
  |  |  837|  44.4k|#define ucurr_getName U_ICU_ENTRY_POINT_RENAME(ucurr_getName)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1638|  44.4k|                                          nullptr /* isChoiceFormat */, &len, &ec);
 1639|  44.4k|    if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (1639:9): [True: 44.4k, False: 0]
  ------------------
 1640|  44.4k|        result.setTo(currname, len);
 1641|  44.4k|    }
 1642|  44.4k|}
ucurr.cpp:_ZL11idForLocalePKcP10UErrorCode:
  345|  44.4k|{
  346|  44.4k|    return ulocimp_getRegionForSupplementalData(locale, false, *ec);
  ------------------
  |  | 1207|  44.4k|#define ulocimp_getRegionForSupplementalData U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegionForSupplementalData)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  347|  44.4k|}
_ZN4CReg3getEPKc:
  420|  44.4k|    static const char16_t* get(const char* id) {
  421|  44.4k|        const char16_t* result = nullptr;
  422|  44.4k|        umtx_lock(&gCRegLock);
  ------------------
  |  | 1250|  44.4k|#define umtx_lock U_ICU_ENTRY_POINT_RENAME(umtx_lock)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  423|  44.4k|        CReg* p = gCRegHead;
  424|       |
  425|       |        /* register cleanup of the mutex */
  426|  44.4k|        ucln_common_registerCleanup(UCLN_COMMON_CURRENCY, currency_cleanup);
  ------------------
  |  |  617|  44.4k|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  427|  44.4k|        while (p) {
  ------------------
  |  Branch (427:16): [True: 0, False: 44.4k]
  ------------------
  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|  44.4k|        umtx_unlock(&gCRegLock);
  ------------------
  |  | 1251|  44.4k|#define umtx_unlock U_ICU_ENTRY_POINT_RENAME(umtx_unlock)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  435|  44.4k|        return result;
  436|  44.4k|    }
ucurr.cpp:_ZL15myUCharsToCharsPcPKDs:
  281|  44.4k|myUCharsToChars(char* resultOfLen4, const char16_t* currency) {
  282|  44.4k|    u_UCharsToChars(currency, resultOfLen4, ISO_CURRENCY_CODE_LENGTH);
  ------------------
  |  |  211|  44.4k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  u_UCharsToChars(currency, resultOfLen4, ISO_CURRENCY_CODE_LENGTH);
  ------------------
  |  |   74|  44.4k|#define ISO_CURRENCY_CODE_LENGTH 3
  ------------------
  283|  44.4k|    resultOfLen4[ISO_CURRENCY_CODE_LENGTH] = 0;
  ------------------
  |  |   74|  44.4k|#define ISO_CURRENCY_CODE_LENGTH 3
  ------------------
  284|  44.4k|    return resultOfLen4;
  285|  44.4k|}

_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|     25|                 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|     25|    if(pErrorCode==nullptr || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (1411:8): [True: 0, False: 25]
  |  Branch (1411:31): [True: 0, False: 25]
  ------------------
 1412|      0|        return nullptr;
 1413|     25|    } else if(name==nullptr || *name==0 || isAcceptable==nullptr) {
  ------------------
  |  Branch (1413:15): [True: 0, False: 25]
  |  Branch (1413:32): [True: 0, False: 25]
  |  Branch (1413:44): [True: 0, False: 25]
  ------------------
 1414|      0|        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
 1415|      0|        return nullptr;
 1416|     25|    } else {
 1417|     25|        return doOpenChoice(path, type, name, isAcceptable, context, pErrorCode);
 1418|     25|    }
 1419|     25|}
udata.cpp:_ZL12findBasenamePKc:
  225|      8|findBasename(const char *path) {
  226|      8|    const char *basename=uprv_strrchr(path, U_FILE_SEP_CHAR);
  ------------------
  |  |   42|      8|#define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      8|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  227|      8|    if(basename==nullptr) {
  ------------------
  |  Branch (227:8): [True: 8, False: 0]
  ------------------
  228|      8|        return path;
  229|      8|    } else {
  230|      0|        return basename+1;
  231|      0|    }
  232|      8|}
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|      7|static UHashtable *udata_getHashTable(UErrorCode &err) {
  299|      7|    umtx_initOnce(gCommonDataCacheInitOnce, &udata_initHashTable, err);
  300|      7|    return gCommonDataCache;
  301|      7|}
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|     25|{
 1152|     25|    UDataMemory         *retVal = nullptr;
 1153|       |
 1154|     25|    const char         *dataPath;
 1155|       |
 1156|     25|    int32_t             tocEntrySuffixIndex;
 1157|     25|    const char         *tocEntryPathSuffix;
 1158|     25|    UErrorCode          subErrorCode=U_ZERO_ERROR;
 1159|     25|    const char         *treeChar;
 1160|       |
 1161|     25|    UBool               isICUData = false;
 1162|       |
 1163|       |
 1164|     25|    FileTracer::traceOpen(path, type, name);
 1165|       |
 1166|       |
 1167|       |    /* Is this path ICU data? */
 1168|     25|    if(path == nullptr ||
  ------------------
  |  Branch (1168:8): [True: 13, False: 12]
  ------------------
 1169|     25|       !strcmp(path, U_ICUDATA_ALIAS) ||  /* "ICUDATA" */
  ------------------
  |  |   74|     12|#define U_ICUDATA_ALIAS "ICUDATA"
  ------------------
  |  Branch (1169:8): [True: 0, False: 12]
  ------------------
 1170|     25|       !uprv_strncmp(path, U_ICUDATA_NAME U_TREE_SEPARATOR_STRING, /* "icudt26e-" */
  ------------------
  |  |   44|     12|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|     12|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1170:8): [True: 12, False: 0]
  ------------------
 1171|     25|                     uprv_strlen(U_ICUDATA_NAME U_TREE_SEPARATOR_STRING)) ||  
 1172|     25|       !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|     25|                     uprv_strlen(U_ICUDATA_ALIAS U_TREE_SEPARATOR_STRING))) {
 1174|     25|      isICUData = true;
 1175|     25|    }
 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|     25|    CharString tocEntryName; /* entry name in tree format. ex:  'icudt28b/coll/ar.res' */
 1196|     25|    CharString tocEntryPath; /* entry name in path format. ex:  'icudt28b\\coll\\ar.res' */
 1197|       |
 1198|     25|    CharString pkgName;
 1199|     25|    CharString treeName;
 1200|       |
 1201|       |    /* ======= Set up strings */
 1202|     25|    if(path==nullptr) {
  ------------------
  |  Branch (1202:8): [True: 13, False: 12]
  ------------------
 1203|     13|        pkgName.append(U_ICUDATA_NAME, *pErrorCode);
  ------------------
  |  |  154|     13|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  |  |  |  |  144|     13|#     define U_ICUDATA_TYPE_LETTER "l"
  |  |  ------------------
  ------------------
 1204|     13|    } else {
 1205|     12|        const char *pkg;
 1206|     12|        const char *first;
 1207|     12|        pkg = uprv_strrchr(path, U_FILE_SEP_CHAR);
  ------------------
  |  |   42|     12|#define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
  |  |  ------------------
  |  |  |  |  393|     12|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1208|     12|        first = uprv_strchr(path, U_FILE_SEP_CHAR);
  ------------------
  |  |   40|     12|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|     12|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1209|     12|        if(uprv_pathIsAbsolute(path) || (pkg != first)) { /* more than one slash in the path- not a tree name */
  ------------------
  |  | 1533|     12|#define uprv_pathIsAbsolute U_ICU_ENTRY_POINT_RENAME(uprv_pathIsAbsolute)
  |  |  ------------------
  |  |  |  |  123|     12|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     12|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     12|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1209:12): [True: 0, False: 12]
  |  Branch (1209:41): [True: 0, False: 12]
  ------------------
 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|     12|        } else {
 1217|     12|            treeChar = uprv_strchr(path, U_TREE_SEPARATOR);
  ------------------
  |  |   40|     12|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|     12|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1218|     12|            if(treeChar) { 
  ------------------
  |  Branch (1218:16): [True: 12, False: 0]
  ------------------
 1219|     12|                treeName.append(treeChar+1, *pErrorCode); /* following '-' */
 1220|     12|                if(isICUData) {
  ------------------
  |  Branch (1220:20): [True: 12, False: 0]
  ------------------
 1221|     12|                    pkgName.append(U_ICUDATA_NAME, *pErrorCode);
  ------------------
  |  |  154|     12|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  |  |  |  |  144|     12|#     define U_ICUDATA_TYPE_LETTER "l"
  |  |  ------------------
  ------------------
 1222|     12|                } 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|     12|            } else {
 1233|      0|                if(isICUData) {
  ------------------
  |  Branch (1233:20): [True: 0, False: 0]
  ------------------
 1234|      0|                    pkgName.append(U_ICUDATA_NAME, *pErrorCode);
  ------------------
  |  |  154|      0|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  |  |  |  |  144|      0|#     define U_ICUDATA_TYPE_LETTER "l"
  |  |  ------------------
  ------------------
 1235|      0|                } else {
 1236|      0|                    pkgName.append(path, *pErrorCode);
 1237|      0|                }
 1238|      0|            }
 1239|     12|        }
 1240|     12|    }
 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|     25|    tocEntryName.append(pkgName, *pErrorCode);
 1253|     25|    tocEntryPath.append(pkgName, *pErrorCode);
 1254|     25|    tocEntrySuffixIndex = tocEntryName.length();
 1255|       |
 1256|     25|    if(!treeName.isEmpty()) {
  ------------------
  |  Branch (1256:8): [True: 12, False: 13]
  ------------------
 1257|     12|        tocEntryName.append(U_TREE_ENTRY_SEP_CHAR, *pErrorCode).append(treeName, *pErrorCode);
  ------------------
  |  |   62|     12|#define U_TREE_ENTRY_SEP_CHAR '/'
  ------------------
 1258|     12|        tocEntryPath.append(U_FILE_SEP_CHAR, *pErrorCode).append(treeName, *pErrorCode);
  ------------------
  |  |  130|     12|#   define U_FILE_SEP_CHAR '/'
  ------------------
 1259|     12|    }
 1260|       |
 1261|     25|    tocEntryName.append(U_TREE_ENTRY_SEP_CHAR, *pErrorCode).append(name, *pErrorCode);
  ------------------
  |  |   62|     25|#define U_TREE_ENTRY_SEP_CHAR '/'
  ------------------
 1262|     25|    tocEntryPath.append(U_FILE_SEP_CHAR, *pErrorCode).append(name, *pErrorCode);
  ------------------
  |  |  130|     25|#   define U_FILE_SEP_CHAR '/'
  ------------------
 1263|     25|    if(type!=nullptr && *type!=0) {
  ------------------
  |  Branch (1263:8): [True: 25, False: 0]
  |  Branch (1263:25): [True: 25, False: 0]
  ------------------
 1264|     25|        tocEntryName.append(".", *pErrorCode).append(type, *pErrorCode);
 1265|     25|        tocEntryPath.append(".", *pErrorCode).append(type, *pErrorCode);
 1266|     25|    }
 1267|       |    // The +1 is for the U_FILE_SEP_CHAR that is always appended above.
 1268|     25|    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|     25|#if !defined(ICU_DATA_DIR_WINDOWS)
 1276|     25|    if(path == nullptr) {
  ------------------
  |  Branch (1276:8): [True: 13, False: 12]
  ------------------
 1277|     13|        path = COMMON_DATA_NAME; /* "icudt26e" */
  ------------------
  |  |   34|     13|#define COMMON_DATA_NAME U_ICUDATA_NAME
  |  |  ------------------
  |  |  |  |  154|     13|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  |  |  ------------------
  |  |  |  |  |  |  144|     13|#     define U_ICUDATA_TYPE_LETTER "l"
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1278|     13|    }
 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|     25|    dataPath = u_getDataDirectory();
  ------------------
  |  |  271|     25|#define u_getDataDirectory U_ICU_ENTRY_POINT_RENAME(u_getDataDirectory)
  |  |  ------------------
  |  |  |  |  123|     25|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     25|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     25|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1291|       |
 1292|       |    /****    Time zone individual files override  */
 1293|     25|    if (isICUData && isTimeZoneFile(name, type)) {
  ------------------
  |  Branch (1293:9): [True: 25, False: 0]
  |  Branch (1293:22): [True: 2, False: 23]
  ------------------
 1294|      2|        const char *tzFilesDir = u_getTimeZoneFilesDirectory(pErrorCode);
  ------------------
  |  |  287|      2|#define u_getTimeZoneFilesDirectory U_ICU_ENTRY_POINT_RENAME(u_getTimeZoneFilesDirectory)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1295|      2|        if (tzFilesDir[0] != 0) {
  ------------------
  |  Branch (1295:13): [True: 0, False: 2]
  ------------------
 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|      2|    }
 1306|       |
 1307|       |    /****    COMMON PACKAGE  - only if packages are first. */
 1308|     25|    if(gDataFileAccess == UDATA_PACKAGES_FIRST) {
  ------------------
  |  Branch (1308:8): [True: 0, False: 25]
  ------------------
 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|     25|    if((gDataFileAccess==UDATA_PACKAGES_FIRST) ||
  ------------------
  |  Branch (1322:8): [True: 0, False: 25]
  ------------------
 1323|     25|       (gDataFileAccess==UDATA_FILES_FIRST)) {
  ------------------
  |  Branch (1323:8): [True: 25, 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|     25|        if ((dataPath && *dataPath) || !isICUData) {
  ------------------
  |  Branch (1328:14): [True: 25, False: 0]
  |  Branch (1328:26): [True: 0, False: 25]
  |  Branch (1328:40): [True: 0, False: 25]
  ------------------
 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|     25|    }
 1336|       |
 1337|       |    /****    COMMON PACKAGE  */
 1338|     25|    if((gDataFileAccess==UDATA_ONLY_PACKAGES) || 
  ------------------
  |  Branch (1338:8): [True: 0, False: 25]
  ------------------
 1339|     25|       (gDataFileAccess==UDATA_FILES_FIRST)) {
  ------------------
  |  Branch (1339:8): [True: 25, False: 0]
  ------------------
 1340|       |#ifdef UDATA_DEBUG
 1341|       |        fprintf(stderr, "Trying packages (UDATA_ONLY_PACKAGES || UDATA_FILES_FIRST)\n");
 1342|       |#endif
 1343|     25|        retVal = doLoadFromCommonData(isICUData,
 1344|     25|                            pkgName.data(), dataPath, tocEntryPathSuffix, tocEntryName.data(),
 1345|     25|                            path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
 1346|     25|        if((retVal != nullptr) || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (1346:12): [True: 19, False: 6]
  |  Branch (1346:35): [True: 0, False: 6]
  ------------------
 1347|     19|            return retVal;
 1348|     19|        }
 1349|     25|    }
 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|      6|    if(gDataFileAccess==UDATA_NO_FILES) {
  ------------------
  |  Branch (1354:8): [True: 0, False: 6]
  ------------------
 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|      6|    if(U_SUCCESS(*pErrorCode)) {
  ------------------
  |  Branch (1367:8): [True: 6, False: 0]
  ------------------
 1368|      6|        if(U_SUCCESS(subErrorCode)) {
  ------------------
  |  Branch (1368:12): [True: 5, False: 1]
  ------------------
 1369|       |            /* file not found */
 1370|      5|            *pErrorCode=U_FILE_ACCESS_ERROR;
 1371|      5|        } else {
 1372|       |            /* entry point not found or rejected */
 1373|      1|            *pErrorCode=subErrorCode;
 1374|      1|        }
 1375|      6|    }
 1376|      6|    return retVal;
 1377|      6|}
udata.cpp:_ZL14isTimeZoneFilePKcS0_:
 1107|     25|static UBool isTimeZoneFile(const char *name, const char *type) {
 1108|     25|    return ((uprv_strcmp(type, "res") == 0) &&
  ------------------
  |  |   38|     25|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     25|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1108:13): [True: 25, False: 0]
  ------------------
 1109|     25|            (uprv_strcmp(name, "zoneinfo64") == 0 ||
  ------------------
  |  |   38|     25|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     25|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1109:14): [True: 1, False: 24]
  ------------------
 1110|     25|             uprv_strcmp(name, "timezoneTypes") == 0 ||
  ------------------
  |  |   38|     24|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     24|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1110:14): [True: 1, False: 23]
  ------------------
 1111|     25|             uprv_strcmp(name, "windowsZones") == 0 ||
  ------------------
  |  |   38|     23|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     23|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1111:14): [True: 0, False: 23]
  ------------------
 1112|     25|             uprv_strcmp(name, "metaZones") == 0));
  ------------------
  |  |   38|     23|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     23|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1112:14): [True: 0, False: 23]
  ------------------
 1113|     25|}
udata.cpp:_ZL13checkDataItemPK10DataHeaderPFaPvPKcS4_PK9UDataInfoES2_S4_S4_P10UErrorCodeSB_:
  949|     19|{
  950|     19|    UDataMemory  *rDataMem = nullptr;          /* the new UDataMemory, to be returned.        */
  951|       |
  952|     19|    if (U_FAILURE(*fatalErr)) {
  ------------------
  |  Branch (952:9): [True: 0, False: 19]
  ------------------
  953|      0|        return nullptr;
  954|      0|    }
  955|       |
  956|     19|    if(pHeader->dataHeader.magic1==0xda &&
  ------------------
  |  Branch (956:8): [True: 19, False: 0]
  ------------------
  957|     19|        pHeader->dataHeader.magic2==0x27 &&
  ------------------
  |  Branch (957:9): [True: 19, False: 0]
  ------------------
  958|     19|        (isAcceptable==nullptr || isAcceptable(context, type, name, &pHeader->info))
  ------------------
  |  Branch (958:10): [True: 0, False: 19]
  |  Branch (958:35): [True: 19, False: 0]
  ------------------
  959|     19|    ) {
  960|     19|        rDataMem=UDataMemory_createNewInstance(fatalErr);
  ------------------
  |  |   79|     19|#define UDataMemory_createNewInstance U_ICU_ENTRY_POINT_RENAME(UDataMemory_createNewInstance)
  |  |  ------------------
  |  |  |  |  123|     19|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     19|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     19|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  961|     19|        if (U_FAILURE(*fatalErr)) {
  ------------------
  |  Branch (961:13): [True: 0, False: 19]
  ------------------
  962|      0|            return nullptr;
  963|      0|        }
  964|     19|        rDataMem->pHeader = pHeader;
  965|     19|    } 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|     19|    return rDataMem;
  972|     19|}
udata.cpp:_ZL20doLoadFromCommonDataaPKcS0_S0_S0_S0_S0_S0_PFaPvS0_S0_PK9UDataInfoES1_P10UErrorCodeS8_:
 1042|     25|{
 1043|     25|    UDataMemory        *pEntryData;
 1044|     25|    const DataHeader   *pHeader;
 1045|     25|    UDataMemory        *pCommonData;
 1046|     25|    int32_t            commonDataIndex;
 1047|     25|    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|     31|    for (commonDataIndex = isICUData ? 0 : -1;;) {
  ------------------
  |  Branch (1057:28): [True: 25, False: 0]
  ------------------
 1058|     31|        pCommonData=openCommonData(path, commonDataIndex, subErrorCode); /** search for pkg **/
 1059|       |
 1060|     31|        if(U_SUCCESS(*subErrorCode) && pCommonData!=nullptr) {
  ------------------
  |  Branch (1060:12): [True: 31, False: 0]
  |  Branch (1060:40): [True: 25, False: 6]
  ------------------
 1061|     25|            int32_t length;
 1062|       |
 1063|       |            /* look up the data piece in the common data */
 1064|     25|            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|     25|            if(pHeader!=nullptr) {
  ------------------
  |  Branch (1069:16): [True: 19, False: 6]
  ------------------
 1070|     19|                pEntryData = checkDataItem(pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode);
 1071|       |#ifdef UDATA_DEBUG
 1072|       |                fprintf(stderr, "pEntryData=%p\n", (void*) pEntryData);
 1073|       |#endif
 1074|     19|                if (U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (1074:21): [True: 0, False: 19]
  ------------------
 1075|      0|                    return nullptr;
 1076|      0|                }
 1077|     19|                if (pEntryData != nullptr) {
  ------------------
  |  Branch (1077:21): [True: 19, False: 0]
  ------------------
 1078|     19|                    pEntryData->length = length;
 1079|     19|                    return pEntryData;
 1080|     19|                }
 1081|     19|            }
 1082|     25|        }
 1083|       |        // If we failed due to being out-of-memory, then stop early and report the error.
 1084|     12|        if (*subErrorCode == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (1084:13): [True: 0, False: 12]
  ------------------
 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|     12|        if (!isICUData) {
  ------------------
  |  Branch (1091:13): [True: 0, False: 12]
  ------------------
 1092|      0|            return nullptr;
 1093|     12|        } else if (pCommonData != nullptr) {
  ------------------
  |  Branch (1093:20): [True: 6, False: 6]
  ------------------
 1094|      6|            ++commonDataIndex;  /* try the next data package */
 1095|      6|        } else if ((!checkedExtendedICUData) && extendICUData(subErrorCode)) {
  ------------------
  |  Branch (1095:20): [True: 6, False: 0]
  |  Branch (1095:49): [True: 0, False: 6]
  ------------------
 1096|      0|            checkedExtendedICUData = true;
 1097|       |            /* try this data package slot again: it changed from nullptr to non-nullptr */
 1098|      6|        } else {
 1099|      6|            return nullptr;
 1100|      6|        }
 1101|     12|    }
 1102|     25|}
udata.cpp:_ZL14openCommonDataPKciP10UErrorCode:
  673|     32|{
  674|     32|    UDataMemory tData;
  675|     32|    const char *pathBuffer;
  676|     32|    const char *inBasename;
  677|       |
  678|     32|    if (U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (678:9): [True: 0, False: 32]
  ------------------
  679|      0|        return nullptr;
  680|      0|    }
  681|       |
  682|     32|    UDataMemory_init(&tData);
  ------------------
  |  |   80|     32|#define UDataMemory_init U_ICU_ENTRY_POINT_RENAME(UDataMemory_init)
  |  |  ------------------
  |  |  |  |  123|     32|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     32|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     32|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  683|       |
  684|       |    /* ??????? TODO revisit this */ 
  685|     32|    if (commonDataIndex >= 0) {
  ------------------
  |  Branch (685:9): [True: 31, False: 1]
  ------------------
  686|       |        /* "mini-cache" for common ICU data */
  687|     31|        if(commonDataIndex >= UPRV_LENGTHOF(gCommonICUDataArray)) {
  ------------------
  |  |   99|     31|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (687:12): [True: 0, False: 31]
  ------------------
  688|      0|            return nullptr;
  689|      0|        }
  690|     31|        {
  691|     31|            Mutex lock;
  692|     31|            if(gCommonICUDataArray[commonDataIndex] != nullptr) {
  ------------------
  |  Branch (692:16): [True: 24, False: 7]
  ------------------
  693|     24|                return gCommonICUDataArray[commonDataIndex];
  694|     24|            }
  695|      7|#if !defined(ICU_DATA_DIR_WINDOWS)
  696|       |// When using the Windows system data, we expect only a single data file.
  697|      7|            int32_t i;
  698|      7|            for(i = 0; i < commonDataIndex; ++i) {
  ------------------
  |  Branch (698:24): [True: 6, False: 1]
  ------------------
  699|      6|                if(gCommonICUDataArray[i]->pHeader == &U_ICUDATA_ENTRY_POINT) {
  ------------------
  |  |  171|      6|#define U_ICUDATA_ENTRY_POINT  U_DEF2_ICUDATA_ENTRY_POINT(U_ICU_VERSION_MAJOR_NUM,U_LIB_SUFFIX_C_NAME)
  |  |  ------------------
  |  |  |  |  178|      6|#define U_DEF2_ICUDATA_ENTRY_POINT(major,suff) U_DEF_ICUDATA_ENTRY_POINT(major,suff)
  |  |  |  |  ------------------
  |  |  |  |  |  |  187|      6|#define U_DEF_ICUDATA_ENTRY_POINT(major, suff) icudt##major##_dat
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (699:20): [True: 6, False: 0]
  ------------------
  700|       |                    /* The linked-in data is already in the list. */
  701|      6|                    return nullptr;
  702|      6|                }
  703|      6|            }
  704|      7|#endif
  705|      7|        }
  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|      7|        }
  727|      7|#endif
  728|      7|    }
  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|      7|{
  307|      7|    UHashtable        *htable;
  308|      7|    UDataMemory       *retVal = nullptr;
  309|      7|    DataCacheElement  *el;
  310|      7|    const char        *baseName;
  311|       |
  312|      7|    htable = udata_getHashTable(err);
  313|      7|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (313:9): [True: 1, False: 6]
  ------------------
  314|      1|        return nullptr;
  315|      1|    }
  316|       |
  317|      6|    baseName = findBasename(path);   /* Cache remembers only the base name, not the full path. */
  318|      6|    umtx_lock(nullptr);
  ------------------
  |  | 1250|      6|#define umtx_lock U_ICU_ENTRY_POINT_RENAME(umtx_lock)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  319|      6|    el = static_cast<DataCacheElement*>(uhash_get(htable, baseName));
  ------------------
  |  | 1007|      6|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  320|      6|    umtx_unlock(nullptr);
  ------------------
  |  | 1251|      6|#define umtx_unlock U_ICU_ENTRY_POINT_RENAME(umtx_unlock)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  321|      6|    if (el != nullptr) {
  ------------------
  |  Branch (321:9): [True: 0, False: 6]
  ------------------
  322|      0|        retVal = el->item;
  323|      0|    }
  324|       |#ifdef UDATA_DEBUG
  325|       |    fprintf(stderr, "Cache: [%s] -> %p\n", baseName, (void*) retVal);
  326|       |#endif
  327|      6|    return retVal;
  328|      7|}
udata.cpp:_ZL13extendICUDataP10UErrorCode:
  811|      6|{
  812|      6|    UDataMemory   *pData;
  813|      6|    UDataMemory   copyPData;
  814|      6|    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|      6|    if(!umtx_loadAcquire(gHaveTriedToLoadCommonData)) {
  ------------------
  |  Branch (830:8): [True: 1, False: 5]
  ------------------
  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|      6|    didUpdate = findCommonICUDataByName(U_ICUDATA_NAME, *pErr);  /* Return 'true' when a racing writes out the extended                 */
  ------------------
  |  |  154|      6|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  |  |  |  |  144|      6|#     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|      6|    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|      6|}
udata.cpp:_ZL23findCommonICUDataByNamePKcR10UErrorCode:
  144|      6|{
  145|      6|    UBool found = false;
  146|      6|    int32_t i;
  147|       |
  148|      6|    UDataMemory  *pData = udata_findCachedData(inBasename, err);
  149|      6|    if (U_FAILURE(err) || pData == nullptr)
  ------------------
  |  Branch (149:9): [True: 1, False: 5]
  |  Branch (149:27): [True: 5, False: 0]
  ------------------
  150|      6|        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|      6|}

UDataMemory_init_78:
   28|     54|U_CFUNC void UDataMemory_init(UDataMemory *This) {
   29|     54|    uprv_memset(This, 0, sizeof(UDataMemory));
  ------------------
  |  |  100|     54|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|     54|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   30|     54|    This->length=-1;
   31|     54|}
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|     20|U_CFUNC UDataMemory *UDataMemory_createNewInstance(UErrorCode *pErr) {
   42|     20|    UDataMemory *This;
   43|       |
   44|     20|    if (U_FAILURE(*pErr)) {
  ------------------
  |  Branch (44:9): [True: 0, False: 20]
  ------------------
   45|      0|        return nullptr;
   46|      0|    }
   47|     20|    This = (UDataMemory *)uprv_malloc(sizeof(UDataMemory));
  ------------------
  |  | 1524|     20|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|     20|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     20|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     20|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   48|     20|    if (This == nullptr) {
  ------------------
  |  Branch (48:9): [True: 0, False: 20]
  ------------------
   49|      0|        *pErr = U_MEMORY_ALLOCATION_ERROR; }
   50|     20|    else {
   51|     20|        UDataMemory_init(This);
  ------------------
  |  |   80|     20|#define UDataMemory_init U_ICU_ENTRY_POINT_RENAME(UDataMemory_init)
  |  |  ------------------
  |  |  |  |  123|     20|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     20|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     20|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   52|     20|        This->heapAllocated = true;
   53|     20|    }
   54|     20|    return This;
   55|     20|}
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|     19|udata_getMemory(UDataMemory *pData) {
  105|     19|    if(pData!=nullptr && pData->pHeader!=nullptr) {
  ------------------
  |  Branch (105:8): [True: 19, False: 0]
  |  Branch (105:26): [True: 19, False: 0]
  ------------------
  106|     19|        return (char *)(pData->pHeader)+udata_getHeaderSize(pData->pHeader);
  ------------------
  |  |  887|     19|#define udata_getHeaderSize U_ICU_ENTRY_POINT_RENAME(udata_getHeaderSize)
  |  |  ------------------
  |  |  |  |  123|     19|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     19|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     19|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  107|     19|    } else {
  108|      0|        return nullptr;
  109|      0|    }
  110|     19|}
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|  2.78k|           UErrorCode *status) {
  548|       |
  549|  2.78k|    return _uhash_create(keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status);
  ------------------
  |  |   91|  2.78k|#define DEFAULT_PRIME_INDEX 4
  ------------------
  550|  2.78k|}
uhash_openSize_78:
  557|      2|               UErrorCode *status) {
  558|       |
  559|       |    /* Find the smallest index i for which PRIMES[i] >= size. */
  560|      2|    int32_t i = 0;
  561|     10|    while (i<(PRIMES_LENGTH-1) && PRIMES[i]<size) {
  ------------------
  |  |   90|     10|#define PRIMES_LENGTH UPRV_LENGTHOF(PRIMES)
  |  |  ------------------
  |  |  |  |   99|     10|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  |  |  ------------------
  ------------------
  |  Branch (561:12): [True: 10, False: 0]
  |  Branch (561:35): [True: 8, False: 2]
  ------------------
  562|      8|        ++i;
  563|      8|    }
  564|       |
  565|      2|    return _uhash_create(keyHash, keyComp, valueComp, i, status);
  566|      2|}
uhash_init_78:
  573|  3.57k|           UErrorCode *status) {
  574|       |
  575|  3.57k|    return _uhash_init(fillinResult, keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status);
  ------------------
  |  |   91|  3.57k|#define DEFAULT_PRIME_INDEX 4
  ------------------
  576|  3.57k|}
uhash_close_78:
  595|  26.0k|uhash_close(UHashtable *hash) {
  596|  26.0k|    if (hash == nullptr) {
  ------------------
  |  Branch (596:9): [True: 19.7k, False: 6.34k]
  ------------------
  597|  19.7k|        return;
  598|  19.7k|    }
  599|  6.34k|    if (hash->elements != nullptr) {
  ------------------
  |  Branch (599:9): [True: 6.34k, False: 0]
  ------------------
  600|  6.34k|        if (hash->keyDeleter != nullptr || hash->valueDeleter != nullptr) {
  ------------------
  |  Branch (600:13): [True: 3.57k, False: 2.77k]
  |  Branch (600:44): [True: 2.77k, False: 1]
  ------------------
  601|  6.34k|            int32_t pos=UHASH_FIRST;
  ------------------
  |  |  610|  6.34k|#define UHASH_FIRST (-1)
  ------------------
  602|  6.34k|            UHashElement *e;
  603|   185k|            while ((e = (UHashElement*) uhash_nextElement(hash, &pos)) != nullptr) {
  ------------------
  |  | 1029|   185k|#define uhash_nextElement U_ICU_ENTRY_POINT_RENAME(uhash_nextElement)
  |  |  ------------------
  |  |  |  |  123|   185k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   185k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   185k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (603:20): [True: 179k, False: 6.34k]
  ------------------
  604|   179k|                HASH_DELETE_KEY_VALUE(hash, e->key.pointer, e->value.pointer);
  ------------------
  |  |  124|   179k|#define HASH_DELETE_KEY_VALUE(hash, keypointer, valuepointer) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   179k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  125|   179k|    if (hash->keyDeleter != nullptr && keypointer != nullptr) { \
  |  |  ------------------
  |  |  |  Branch (125:9): [True: 102k, False: 77.3k]
  |  |  |  Branch (125:40): [True: 102k, False: 0]
  |  |  ------------------
  |  |  126|   102k|        (*hash->keyDeleter)(keypointer); \
  |  |  127|   102k|    } \
  |  |  128|   179k|    if (hash->valueDeleter != nullptr && valuepointer != nullptr) { \
  |  |  ------------------
  |  |  |  Branch (128:9): [True: 83.5k, False: 96.0k]
  |  |  |  Branch (128:42): [True: 83.5k, False: 0]
  |  |  ------------------
  |  |  129|  83.5k|        (*hash->valueDeleter)(valuepointer); \
  |  |  130|  83.5k|    } \
  |  |  131|   179k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   179k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  605|   179k|            }
  606|  6.34k|        }
  607|  6.34k|        uprv_free(hash->elements);
  ------------------
  |  | 1503|  6.34k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  6.34k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.34k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.34k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  608|  6.34k|        hash->elements = nullptr;
  609|  6.34k|    }
  610|  6.34k|    if (hash->allocated) {
  ------------------
  |  Branch (610:9): [True: 2.77k, False: 3.57k]
  ------------------
  611|  2.77k|        uprv_free(hash);
  ------------------
  |  | 1503|  2.77k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  2.77k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.77k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.77k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  612|  2.77k|    }
  613|  6.34k|}
uhash_setKeyDeleter_78:
  636|  3.57k|uhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn) {
  637|  3.57k|    UObjectDeleter *result = hash->keyDeleter;
  638|  3.57k|    hash->keyDeleter = fn;
  639|  3.57k|    return result;
  640|  3.57k|}
uhash_setValueDeleter_78:
  643|  4.30k|uhash_setValueDeleter(UHashtable *hash, UObjectDeleter *fn) {
  644|  4.30k|    UObjectDeleter *result = hash->valueDeleter;
  645|  4.30k|    hash->valueDeleter = fn;
  646|  4.30k|    return result;
  647|  4.30k|}
uhash_count_78:
  659|   230k|uhash_count(const UHashtable *hash) {
  660|   230k|    return hash->count;
  661|   230k|}
uhash_get_78:
  665|  1.00M|          const void* key) {
  666|  1.00M|    UHashTok keyholder;
  667|  1.00M|    keyholder.pointer = (void*) key;
  668|  1.00M|    return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer;
  669|  1.00M|}
uhash_iget_78:
  673|      2|           int32_t key) {
  674|      2|    UHashTok keyholder;
  675|      2|    keyholder.integer = key;
  676|      2|    return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer;
  677|      2|}
uhash_geti_78:
  681|   222k|           const void* key) {
  682|   222k|    UHashTok keyholder;
  683|   222k|    keyholder.pointer = (void*) key;
  684|   222k|    return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer;
  685|   222k|}
uhash_put_78:
  721|  8.81k|          UErrorCode *status) {
  722|  8.81k|    UHashTok keyholder, valueholder;
  723|  8.81k|    keyholder.pointer = key;
  724|  8.81k|    valueholder.pointer = value;
  725|  8.81k|    return _uhash_put(hash, keyholder, valueholder,
  726|  8.81k|                      HINT_KEY_POINTER | HINT_VALUE_POINTER,
  ------------------
  |  |  139|  8.81k|#define HINT_KEY_POINTER   (1)
  ------------------
                                    HINT_KEY_POINTER | HINT_VALUE_POINTER,
  ------------------
  |  |  140|  8.81k|#define HINT_VALUE_POINTER (2)
  ------------------
  727|  8.81k|                      status).pointer;
  728|  8.81k|}
uhash_iput_78:
  734|  77.3k|           UErrorCode *status) {
  735|  77.3k|    UHashTok keyholder, valueholder;
  736|  77.3k|    keyholder.integer = key;
  737|  77.3k|    valueholder.pointer = value;
  738|  77.3k|    return _uhash_put(hash, keyholder, valueholder,
  739|  77.3k|                      HINT_VALUE_POINTER,
  ------------------
  |  |  140|  77.3k|#define HINT_VALUE_POINTER (2)
  ------------------
  740|  77.3k|                      status).pointer;
  741|  77.3k|}
uhash_puti_78:
  747|   103k|           UErrorCode *status) {
  748|   103k|    UHashTok keyholder, valueholder;
  749|   103k|    keyholder.pointer = key;
  750|   103k|    valueholder.integer = value;
  751|   103k|    return _uhash_put(hash, keyholder, valueholder,
  752|   103k|                      HINT_KEY_POINTER,
  ------------------
  |  |  139|   103k|#define HINT_KEY_POINTER   (1)
  ------------------
  753|   103k|                      status).integer;
  754|   103k|}
uhash_remove_78:
  799|     34|             const void* key) {
  800|     34|    UHashTok keyholder;
  801|     34|    keyholder.pointer = (void*) key;
  802|     34|    return _uhash_remove(hash, keyholder).pointer;
  803|     34|}
uhash_find_78:
  866|   230k|uhash_find(const UHashtable *hash, const void* key) {
  867|   230k|    UHashTok keyholder;
  868|   230k|    const UHashElement *e;
  869|   230k|    keyholder.pointer = (void*) key;
  870|   230k|    e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder));
  871|   230k|    return IS_EMPTY_OR_DELETED(e->hashcode) ? nullptr : e;
  ------------------
  |  |  120|   230k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  |  |  ------------------
  |  |  |  Branch (120:32): [True: 2.04k, False: 228k]
  |  |  ------------------
  ------------------
  872|   230k|}
uhash_nextElement_78:
  875|   186k|uhash_nextElement(const UHashtable *hash, int32_t *pos) {
  876|       |    /* Walk through the array until we find an element that is not
  877|       |     * EMPTY and not DELETED.
  878|       |     */
  879|   186k|    int32_t i;
  880|   186k|    U_ASSERT(hash != nullptr);
  ------------------
  |  |   35|   186k|#   define U_ASSERT(exp) (void)0
  ------------------
  881|   964k|    for (i = *pos + 1; i < hash->length; ++i) {
  ------------------
  |  Branch (881:24): [True: 957k, False: 6.34k]
  ------------------
  882|   957k|        if (!IS_EMPTY_OR_DELETED(hash->elements[i].hashcode)) {
  ------------------
  |  |  120|   957k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  ------------------
  |  Branch (882:13): [True: 180k, False: 777k]
  ------------------
  883|   180k|            *pos = i;
  884|   180k|            return &(hash->elements[i]);
  885|   180k|        }
  886|   957k|    }
  887|       |
  888|       |    /* No more elements */
  889|  6.34k|    return nullptr;
  890|   186k|}
uhash_removeElement_78:
  893|  1.04k|uhash_removeElement(UHashtable *hash, const UHashElement* e) {
  894|  1.04k|    U_ASSERT(hash != nullptr);
  ------------------
  |  |   35|  1.04k|#   define U_ASSERT(exp) (void)0
  ------------------
  895|  1.04k|    U_ASSERT(e != nullptr);
  ------------------
  |  |   35|  1.04k|#   define U_ASSERT(exp) (void)0
  ------------------
  896|  1.04k|    if (!IS_EMPTY_OR_DELETED(e->hashcode)) {
  ------------------
  |  |  120|  1.04k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  ------------------
  |  Branch (896:9): [True: 1.04k, False: 0]
  ------------------
  897|  1.04k|        UHashElement *nce = (UHashElement *)e;
  898|  1.04k|        return _uhash_internalRemoveElement(hash, nce).pointer;
  899|  1.04k|    }
  900|      0|    return nullptr;
  901|  1.04k|}
uhash_hashUChars_78:
  932|  38.3k|uhash_hashUChars(const UHashTok key) {
  933|  38.3k|    const char16_t *s = (const char16_t *)key.pointer;
  934|  38.3k|    return s == nullptr ? 0 : ustr_hashUCharsN(s, u_strlen(s));
  ------------------
  |  | 1880|  38.3k|#define ustr_hashUCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashUCharsN)
  |  |  ------------------
  |  |  |  |  123|  38.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  38.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  38.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return s == nullptr ? 0 : ustr_hashUCharsN(s, u_strlen(s));
  ------------------
  |  |  393|  38.3k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|  38.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  38.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  38.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (934:12): [True: 0, False: 38.3k]
  ------------------
  935|  38.3k|}
uhash_hashChars_78:
  938|  2.01M|uhash_hashChars(const UHashTok key) {
  939|  2.01M|    const char *s = (const char *)key.pointer;
  940|  2.01M|    return s == nullptr ? 0 : static_cast<int32_t>(ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s))));
  ------------------
  |  | 1878|  1.67M|#define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN)
  |  |  ------------------
  |  |  |  |  123|  1.67M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.67M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.67M|#       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|  1.67M|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.67M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (940:12): [True: 342k, False: 1.67M]
  ------------------
  941|  2.01M|}
uhash_compareUChars_78:
 1012|  15.1k|uhash_compareUChars(const UHashTok key1, const UHashTok key2) {
 1013|  15.1k|    const char16_t *p1 = (const char16_t*) key1.pointer;
 1014|  15.1k|    const char16_t *p2 = (const char16_t*) key2.pointer;
 1015|  15.1k|    if (p1 == p2) {
  ------------------
  |  Branch (1015:9): [True: 33, False: 15.1k]
  ------------------
 1016|     33|        return true;
 1017|     33|    }
 1018|  15.1k|    if (p1 == nullptr || p2 == nullptr) {
  ------------------
  |  Branch (1018:9): [True: 0, False: 15.1k]
  |  Branch (1018:26): [True: 0, False: 15.1k]
  ------------------
 1019|      0|        return false;
 1020|      0|    }
 1021|  60.3k|    while (*p1 != 0 && *p1 == *p2) {
  ------------------
  |  Branch (1021:12): [True: 45.1k, False: 15.1k]
  |  Branch (1021:24): [True: 45.1k, False: 0]
  ------------------
 1022|  45.1k|        ++p1;
 1023|  45.1k|        ++p2;
 1024|  45.1k|    }
 1025|  15.1k|    return *p1 == *p2;
 1026|  15.1k|}
uhash_compareChars_78:
 1029|  2.01M|uhash_compareChars(const UHashTok key1, const UHashTok key2) {
 1030|  2.01M|    const char *p1 = (const char*) key1.pointer;
 1031|  2.01M|    const char *p2 = (const char*) key2.pointer;
 1032|  2.01M|    if (p1 == p2) {
  ------------------
  |  Branch (1032:9): [True: 342k, False: 1.66M]
  ------------------
 1033|   342k|        return true;
 1034|   342k|    }
 1035|  1.66M|    if (p1 == nullptr || p2 == nullptr) {
  ------------------
  |  Branch (1035:9): [True: 0, False: 1.66M]
  |  Branch (1035:26): [True: 0, False: 1.66M]
  ------------------
 1036|      0|        return false;
 1037|      0|    }
 1038|  18.6M|    while (*p1 != 0 && *p1 == *p2) {
  ------------------
  |  Branch (1038:12): [True: 16.9M, False: 1.66M]
  |  Branch (1038:24): [True: 16.9M, False: 0]
  ------------------
 1039|  16.9M|        ++p1;
 1040|  16.9M|        ++p2;
 1041|  16.9M|    }
 1042|  1.66M|    return *p1 == *p2;
 1043|  1.66M|}
uhash_hashLong_78:
 1090|  77.3k|uhash_hashLong(const UHashTok key) {
 1091|  77.3k|    return key.integer;
 1092|  77.3k|}
uhash_compareLong_78:
 1095|      1|uhash_compareLong(const UHashTok key1, const UHashTok key2) {
 1096|      1|    return key1.integer == key2.integer;
 1097|      1|}
uhash.cpp:_ZL13_uhash_createPFi8UElementEPFaS_S_ES3_iP10UErrorCode:
  287|  2.78k|              UErrorCode *status) {
  288|  2.78k|    UHashtable *result;
  289|       |
  290|  2.78k|    if (U_FAILURE(*status)) return nullptr;
  ------------------
  |  Branch (290:9): [True: 0, False: 2.78k]
  ------------------
  291|       |
  292|  2.78k|    result = static_cast<UHashtable*>(uprv_malloc(sizeof(UHashtable)));
  ------------------
  |  | 1524|  2.78k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  2.78k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.78k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.78k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  293|  2.78k|    if (result == nullptr) {
  ------------------
  |  Branch (293:9): [True: 0, False: 2.78k]
  ------------------
  294|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  295|      0|        return nullptr;
  296|      0|    }
  297|       |
  298|  2.78k|    _uhash_init(result, keyHash, keyComp, valueComp, primeIndex, status);
  299|  2.78k|    result->allocated       = true;
  300|       |
  301|  2.78k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (301:9): [True: 0, False: 2.78k]
  ------------------
  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|  2.78k|    return result;
  307|  2.78k|}
uhash.cpp:_ZL11_uhash_initP10UHashtablePFi8UElementEPFaS1_S1_ES5_iP10UErrorCode:
  260|  6.35k|{
  261|  6.35k|    if (U_FAILURE(*status)) return nullptr;
  ------------------
  |  Branch (261:9): [True: 0, False: 6.35k]
  ------------------
  262|  6.35k|    U_ASSERT(keyHash != nullptr);
  ------------------
  |  |   35|  6.35k|#   define U_ASSERT(exp) (void)0
  ------------------
  263|  6.35k|    U_ASSERT(keyComp != nullptr);
  ------------------
  |  |   35|  6.35k|#   define U_ASSERT(exp) (void)0
  ------------------
  264|       |
  265|  6.35k|    result->keyHasher       = keyHash;
  266|  6.35k|    result->keyComparator   = keyComp;
  267|  6.35k|    result->valueComparator = valueComp;
  268|  6.35k|    result->keyDeleter      = nullptr;
  269|  6.35k|    result->valueDeleter    = nullptr;
  270|  6.35k|    result->allocated       = false;
  271|  6.35k|    _uhash_internalSetResizePolicy(result, U_GROW);
  272|       |
  273|  6.35k|    _uhash_allocate(result, primeIndex, status);
  274|       |
  275|  6.35k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (275:9): [True: 0, False: 6.35k]
  ------------------
  276|      0|        return nullptr;
  277|      0|    }
  278|       |
  279|  6.35k|    return result;
  280|  6.35k|}
uhash.cpp:_ZL15_uhash_allocateP10UHashtableiP10UErrorCode:
  217|  6.88k|                UErrorCode *status) {
  218|       |
  219|  6.88k|    UHashElement *p, *limit;
  220|  6.88k|    UHashTok emptytok;
  221|       |
  222|  6.88k|    if (U_FAILURE(*status)) return;
  ------------------
  |  Branch (222:9): [True: 0, False: 6.88k]
  ------------------
  223|       |
  224|  6.88k|    U_ASSERT(primeIndex >= 0 && primeIndex < PRIMES_LENGTH);
  ------------------
  |  |   35|  6.88k|#   define U_ASSERT(exp) (void)0
  ------------------
  225|       |
  226|  6.88k|    hash->primeIndex = static_cast<int8_t>(primeIndex);
  227|  6.88k|    hash->length = PRIMES[primeIndex];
  228|       |
  229|  6.88k|    p = hash->elements = static_cast<UHashElement*>(
  230|  6.88k|        uprv_malloc(sizeof(UHashElement) * hash->length));
  ------------------
  |  | 1524|  6.88k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  6.88k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.88k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.88k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|       |
  232|  6.88k|    if (hash->elements == nullptr) {
  ------------------
  |  Branch (232:9): [True: 0, False: 6.88k]
  ------------------
  233|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  234|      0|        return;
  235|      0|    }
  236|       |
  237|  6.88k|    emptytok.pointer = nullptr; /* Only one of these two is needed */
  238|  6.88k|    emptytok.integer = 0;    /* but we don't know which one. */
  239|       |
  240|  6.88k|    limit = p + hash->length;
  241|  1.15M|    while (p < limit) {
  ------------------
  |  Branch (241:12): [True: 1.14M, False: 6.88k]
  ------------------
  242|  1.14M|        p->key = emptytok;
  243|  1.14M|        p->value = emptytok;
  244|  1.14M|        p->hashcode = HASH_EMPTY;
  ------------------
  |  |  118|  1.14M|#define HASH_EMPTY      ((int32_t) HASH_DELETED + 1)
  |  |  ------------------
  |  |  |  |  117|  1.14M|#define HASH_DELETED    ((int32_t) 0x80000000)
  |  |  ------------------
  ------------------
  245|  1.14M|        ++p;
  246|  1.14M|    }
  247|       |
  248|  6.88k|    hash->count = 0;
  249|  6.88k|    hash->lowWaterMark = static_cast<int32_t>(hash->length * hash->lowWaterRatio);
  250|  6.88k|    hash->highWaterMark = static_cast<int32_t>(hash->length * hash->highWaterRatio);
  251|  6.88k|}
uhash.cpp:_ZL30_uhash_internalSetResizePolicyP10UHashtable17UHashResizePolicy:
  197|  6.35k|_uhash_internalSetResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) {
  198|  6.35k|    U_ASSERT(hash != nullptr);
  ------------------
  |  |   35|  6.35k|#   define U_ASSERT(exp) (void)0
  ------------------
  199|  6.35k|    U_ASSERT(((int32_t)policy) >= 0);
  ------------------
  |  |   35|  6.35k|#   define U_ASSERT(exp) (void)0
  ------------------
  200|  6.35k|    U_ASSERT(((int32_t)policy) < 3);
  ------------------
  |  |   35|  6.35k|#   define U_ASSERT(exp) (void)0
  ------------------
  201|  6.35k|    hash->lowWaterRatio  = RESIZE_POLICY_RATIO_TABLE[policy * 2];
  202|  6.35k|    hash->highWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2 + 1];
  203|  6.35k|}
uhash.cpp:_ZL13_uhash_rehashP10UHashtableP10UErrorCode:
  399|    525|_uhash_rehash(UHashtable *hash, UErrorCode *status) {
  400|       |
  401|    525|    UHashElement *old = hash->elements;
  402|    525|    int32_t oldLength = hash->length;
  403|    525|    int32_t newPrimeIndex = hash->primeIndex;
  404|    525|    int32_t i;
  405|       |
  406|    525|    if (hash->count > hash->highWaterMark) {
  ------------------
  |  Branch (406:9): [True: 525, False: 0]
  ------------------
  407|    525|        if (++newPrimeIndex >= PRIMES_LENGTH) {
  ------------------
  |  |   90|    525|#define PRIMES_LENGTH UPRV_LENGTHOF(PRIMES)
  |  |  ------------------
  |  |  |  |   99|    525|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  |  |  ------------------
  ------------------
  |  Branch (407:13): [True: 0, False: 525]
  ------------------
  408|      0|            return;
  409|      0|        }
  410|    525|    } 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|    525|    _uhash_allocate(hash, newPrimeIndex, status);
  419|       |
  420|    525|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (420:9): [True: 0, False: 525]
  ------------------
  421|      0|        hash->elements = old;
  422|      0|        hash->length = oldLength;
  423|      0|        return;
  424|      0|    }
  425|       |
  426|   169k|    for (i = oldLength - 1; i >= 0; --i) {
  ------------------
  |  Branch (426:29): [True: 168k, False: 525]
  ------------------
  427|   168k|        if (!IS_EMPTY_OR_DELETED(old[i].hashcode)) {
  ------------------
  |  |  120|   168k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  ------------------
  |  Branch (427:13): [True: 84.7k, False: 84.1k]
  ------------------
  428|  84.7k|            UHashElement *e = _uhash_find(hash, old[i].key, old[i].hashcode);
  429|  84.7k|            U_ASSERT(e != nullptr);
  ------------------
  |  |   35|  84.7k|#   define U_ASSERT(exp) (void)0
  ------------------
  430|  84.7k|            U_ASSERT(e->hashcode == HASH_EMPTY);
  ------------------
  |  |   35|  84.7k|#   define U_ASSERT(exp) (void)0
  ------------------
  431|  84.7k|            e->key = old[i].key;
  432|  84.7k|            e->value = old[i].value;
  433|  84.7k|            e->hashcode = old[i].hashcode;
  434|  84.7k|            ++hash->count;
  435|  84.7k|        }
  436|   168k|    }
  437|       |
  438|    525|    uprv_free(old);
  ------------------
  |  | 1503|    525|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    525|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    525|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    525|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  439|    525|}
uhash.cpp:_ZL11_uhash_findPK10UHashtable8UElementi:
  339|  1.73M|            int32_t hashcode) {
  340|       |
  341|  1.73M|    int32_t firstDeleted = -1;  /* assume invalid index */
  342|  1.73M|    int32_t theIndex, startIndex;
  343|  1.73M|    int32_t jump = 0; /* lazy evaluate */
  344|  1.73M|    int32_t tableHash;
  345|  1.73M|    UHashElement *elements = hash->elements;
  346|       |
  347|  1.73M|    hashcode &= 0x7FFFFFFF; /* must be positive */
  348|  1.73M|    startIndex = theIndex = (hashcode ^ 0x4000000) % hash->length;
  349|       |
  350|  1.90M|    do {
  351|  1.90M|        tableHash = elements[theIndex].hashcode;
  352|  1.90M|        if (tableHash == hashcode) {          /* quick check */
  ------------------
  |  Branch (352:13): [True: 1.34M, False: 557k]
  ------------------
  353|  1.34M|            if ((*hash->keyComparator)(key, elements[theIndex].key)) {
  ------------------
  |  Branch (353:17): [True: 1.34M, False: 2.63k]
  ------------------
  354|  1.34M|                return &(elements[theIndex]);
  355|  1.34M|            }
  356|  1.34M|        } else if (!IS_EMPTY_OR_DELETED(tableHash)) {
  ------------------
  |  |  120|   557k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  ------------------
  |  Branch (356:20): [True: 160k, False: 397k]
  ------------------
  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|   397k|        } else if (tableHash == HASH_EMPTY) { /* empty, end o' the line */
  ------------------
  |  |  118|   397k|#define HASH_EMPTY      ((int32_t) HASH_DELETED + 1)
  |  |  ------------------
  |  |  |  |  117|   397k|#define HASH_DELETED    ((int32_t) 0x80000000)
  |  |  ------------------
  ------------------
  |  Branch (361:20): [True: 390k, False: 6.81k]
  ------------------
  362|   390k|            break;
  363|   390k|        } else if (firstDeleted < 0) { /* remember first deleted */
  ------------------
  |  Branch (363:20): [True: 5.58k, False: 1.22k]
  ------------------
  364|  5.58k|            firstDeleted = theIndex;
  365|  5.58k|        }
  366|   169k|        if (jump == 0) { /* lazy compute jump */
  ------------------
  |  Branch (366:13): [True: 135k, False: 34.0k]
  ------------------
  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|   135k|            jump = (hashcode % (hash->length - 1)) + 1;
  372|   135k|        }
  373|   169k|        theIndex = (theIndex + jump) % hash->length;
  374|   169k|    } while (theIndex != startIndex);
  ------------------
  |  Branch (374:14): [True: 169k, False: 0]
  ------------------
  375|       |
  376|   390k|    if (firstDeleted >= 0) {
  ------------------
  |  Branch (376:9): [True: 896, False: 389k]
  ------------------
  377|    896|        theIndex = firstDeleted; /* reset if had deleted slot */
  378|   389k|    } else if (tableHash != HASH_EMPTY) {
  ------------------
  |  |  118|   389k|#define HASH_EMPTY      ((int32_t) HASH_DELETED + 1)
  |  |  ------------------
  |  |  |  |  117|   389k|#define HASH_DELETED    ((int32_t) 0x80000000)
  |  |  ------------------
  ------------------
  |  Branch (378:16): [True: 0, False: 389k]
  ------------------
  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|   390k|    return &(elements[theIndex]);
  387|   390k|}
uhash.cpp:_ZL10_uhash_putP10UHashtable8UElementS1_aP10UErrorCode:
  471|   190k|           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|   190k|    int32_t hashcode;
  479|   190k|    UHashElement* e;
  480|   190k|    UHashTok emptytok;
  481|       |
  482|   190k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (482:9): [True: 0, False: 190k]
  ------------------
  483|      0|        goto err;
  484|      0|    }
  485|   190k|    U_ASSERT(hash != nullptr);
  ------------------
  |  |   35|   190k|#   define U_ASSERT(exp) (void)0
  ------------------
  486|   190k|    if ((hint & HINT_VALUE_POINTER) ?
  ------------------
  |  |  140|   190k|#define HINT_VALUE_POINTER (2)
  ------------------
  |  Branch (486:9): [True: 86.1k, False: 103k]
  |  Branch (486:9): [True: 0, False: 190k]
  ------------------
  487|  86.1k|            value.pointer == nullptr :
  488|   190k|            value.integer == 0 && (hint & HINT_ALLOW_ZERO) == 0) {
  ------------------
  |  |  141|      0|#define HINT_ALLOW_ZERO    (4)
  ------------------
  |  Branch (488:13): [True: 0, False: 103k]
  |  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|   190k|    if (hash->count > hash->highWaterMark) {
  ------------------
  |  Branch (494:9): [True: 525, False: 189k]
  ------------------
  495|    525|        _uhash_rehash(hash, status);
  496|    525|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (496:13): [True: 0, False: 525]
  ------------------
  497|      0|            goto err;
  498|      0|        }
  499|    525|    }
  500|       |
  501|   190k|    hashcode = (*hash->keyHasher)(key);
  502|   190k|    e = _uhash_find(hash, key, hashcode);
  503|   190k|    U_ASSERT(e != nullptr);
  ------------------
  |  |   35|   190k|#   define U_ASSERT(exp) (void)0
  ------------------
  504|       |
  505|   190k|    if (IS_EMPTY_OR_DELETED(e->hashcode)) {
  ------------------
  |  |  120|   190k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  |  |  ------------------
  |  |  |  Branch (120:32): [True: 190k, 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|   190k|        ++hash->count;
  514|   190k|        if (hash->count == hash->length) {
  ------------------
  |  Branch (514:13): [True: 0, False: 190k]
  ------------------
  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|   190k|    }
  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|   190k|    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|   190k|}
uhash.cpp:_ZL17_uhash_setElementP10UHashtableP12UHashElementi8UElementS3_a:
  150|   191k|                  UHashTok key, UHashTok value, int8_t hint) {
  151|       |
  152|   191k|    UHashTok oldValue = e->value;
  153|   191k|    if (hash->keyDeleter != nullptr && e->key.pointer != nullptr &&
  ------------------
  |  Branch (153:9): [True: 105k, False: 85.8k]
  |  Branch (153:40): [True: 1.08k, False: 104k]
  ------------------
  154|   191k|        e->key.pointer != key.pointer) { /* Avoid double deletion */
  ------------------
  |  Branch (154:9): [True: 1.08k, False: 0]
  ------------------
  155|  1.08k|        (*hash->keyDeleter)(e->key.pointer);
  156|  1.08k|    }
  157|   191k|    if (hash->valueDeleter != nullptr) {
  ------------------
  |  Branch (157:9): [True: 83.7k, False: 107k]
  ------------------
  158|  83.7k|        if (oldValue.pointer != nullptr &&
  ------------------
  |  Branch (158:13): [True: 0, False: 83.7k]
  ------------------
  159|  83.7k|            oldValue.pointer != value.pointer) { /* Avoid double deletion */
  ------------------
  |  Branch (159:13): [True: 0, False: 0]
  ------------------
  160|      0|            (*hash->valueDeleter)(oldValue.pointer);
  161|      0|        }
  162|  83.7k|        oldValue.pointer = nullptr;
  163|  83.7k|    }
  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|   191k|    if (hint & HINT_KEY_POINTER) {
  ------------------
  |  |  139|   191k|#define HINT_KEY_POINTER   (1)
  ------------------
  |  Branch (170:9): [True: 112k, False: 78.4k]
  ------------------
  171|   112k|        e->key.pointer = key.pointer;
  172|   112k|    } else {
  173|  78.4k|        e->key = key;
  174|  78.4k|    }
  175|   191k|    if (hint & HINT_VALUE_POINTER) {
  ------------------
  |  |  140|   191k|#define HINT_VALUE_POINTER (2)
  ------------------
  |  Branch (175:9): [True: 86.1k, False: 105k]
  ------------------
  176|  86.1k|        e->value.pointer = value.pointer;
  177|   105k|    } else {
  178|   105k|        e->value = value;
  179|   105k|    }
  180|   191k|    e->hashcode = hashcode;
  181|   191k|    return oldValue;
  182|   191k|}
uhash.cpp:_ZL13_uhash_removeP10UHashtable8UElement:
  443|     34|              UHashTok key) {
  444|       |    /* First find the position of the key in the table.  If the object
  445|       |     * has not been removed already, remove it.  If the user wanted
  446|       |     * keys deleted, then delete it also.  We have to put a special
  447|       |     * hashcode in that position that means that something has been
  448|       |     * deleted, since when we do a find, we have to continue PAST any
  449|       |     * deleted values.
  450|       |     */
  451|     34|    UHashTok result;
  452|     34|    UHashElement* e = _uhash_find(hash, key, hash->keyHasher(key));
  453|     34|    U_ASSERT(e != nullptr);
  ------------------
  |  |   35|     34|#   define U_ASSERT(exp) (void)0
  ------------------
  454|     34|    result.pointer = nullptr;
  455|     34|    result.integer = 0;
  456|     34|    if (!IS_EMPTY_OR_DELETED(e->hashcode)) {
  ------------------
  |  |  120|     34|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  ------------------
  |  Branch (456:9): [True: 34, False: 0]
  ------------------
  457|     34|        result = _uhash_internalRemoveElement(hash, e);
  458|     34|        if (hash->count < hash->lowWaterMark) {
  ------------------
  |  Branch (458:13): [True: 0, False: 34]
  ------------------
  459|      0|            UErrorCode status = U_ZERO_ERROR;
  460|      0|            _uhash_rehash(hash, &status);
  461|      0|        }
  462|     34|    }
  463|     34|    return result;
  464|     34|}
uhash.cpp:_ZL28_uhash_internalRemoveElementP10UHashtableP12UHashElement:
  188|  1.08k|_uhash_internalRemoveElement(UHashtable *hash, UHashElement* e) {
  189|  1.08k|    UHashTok empty;
  190|  1.08k|    U_ASSERT(!IS_EMPTY_OR_DELETED(e->hashcode));
  ------------------
  |  |   35|  1.08k|#   define U_ASSERT(exp) (void)0
  ------------------
  191|  1.08k|    --hash->count;
  192|  1.08k|    empty.pointer = nullptr; empty.integer = 0;
  193|  1.08k|    return _uhash_setElement(hash, e, HASH_DELETED, empty, empty, 0);
  ------------------
  |  |  117|  1.08k|#define HASH_DELETED    ((int32_t) 0x80000000)
  ------------------
  194|  1.08k|}

u_charsToUChars_78:
  185|   299k|u_charsToUChars(const char *cs, char16_t *us, int32_t length) {
  186|   299k|    char16_t u;
  187|   299k|    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|  1.31M|    while(length>0) {
  ------------------
  |  Branch (194:11): [True: 1.01M, False: 299k]
  ------------------
  195|  1.01M|        c=(uint8_t)(*cs++);
  196|  1.01M|        u=(char16_t)CHAR_TO_UCHAR(c);
  ------------------
  |  |  174|  1.01M|#define CHAR_TO_UCHAR(c) c
  ------------------
  197|  1.01M|        U_ASSERT((u!=0 || c==0)); /* only invariant chars converted? */
  ------------------
  |  |   35|  1.01M|#   define U_ASSERT(exp) (void)0
  ------------------
  198|  1.01M|        *us++=u;
  199|  1.01M|        --length;
  200|  1.01M|    }
  201|   299k|}
u_UCharsToChars_78:
  204|  1.14M|u_UCharsToChars(const char16_t *us, char *cs, int32_t length) {
  205|  1.14M|    char16_t u;
  206|       |
  207|  7.36M|    while(length>0) {
  ------------------
  |  Branch (207:11): [True: 6.22M, False: 1.14M]
  ------------------
  208|  6.22M|        u=*us++;
  209|  6.22M|        if(!UCHAR_IS_INVARIANT(u)) {
  ------------------
  |  |  168|  6.22M|#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0)
  |  |  ------------------
  |  |  |  Branch (168:32): [True: 6.22M, False: 276]
  |  |  |  Branch (168:47): [True: 6.22M, False: 0]
  |  |  ------------------
  ------------------
  210|    276|            U_ASSERT(false); /* Variant characters were used. These are not portable in ICU. */
  ------------------
  |  |   35|    276|#   define U_ASSERT(exp) (void)0
  ------------------
  211|    276|            u=0;
  212|    276|        }
  213|  6.22M|        *cs++=(char)UCHAR_TO_CHAR(u);
  ------------------
  |  |  175|  6.22M|#define UCHAR_TO_CHAR(c) c
  ------------------
  214|  6.22M|        --length;
  215|  6.22M|    }
  216|  1.14M|}
uprv_isInvariantUString_78:
  263|   168k|uprv_isInvariantUString(const char16_t *s, int32_t length) {
  264|   168k|    char16_t c;
  265|       |
  266|  3.34M|    for(;;) {
  267|  3.34M|        if(length<0) {
  ------------------
  |  Branch (267:12): [True: 8, False: 3.34M]
  ------------------
  268|       |            /* NUL-terminated */
  269|      8|            c=*s++;
  270|      8|            if(c==0) {
  ------------------
  |  Branch (270:16): [True: 1, False: 7]
  ------------------
  271|      1|                break;
  272|      1|            }
  273|  3.34M|        } else {
  274|       |            /* count length */
  275|  3.34M|            if(length==0) {
  ------------------
  |  Branch (275:16): [True: 168k, False: 3.17M]
  ------------------
  276|   168k|                break;
  277|   168k|            }
  278|  3.17M|            --length;
  279|  3.17M|            c=*s++;
  280|  3.17M|        }
  281|       |
  282|       |        /*
  283|       |         * no assertions here because these functions are legitimately called
  284|       |         * for strings with variant characters
  285|       |         */
  286|  3.17M|        if(!UCHAR_IS_INVARIANT(c)) {
  ------------------
  |  |  168|  3.17M|#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0)
  |  |  ------------------
  |  |  |  Branch (168:32): [True: 3.17M, False: 0]
  |  |  |  Branch (168:47): [True: 3.17M, False: 0]
  |  |  ------------------
  ------------------
  287|      0|            return false; /* found a variant char */
  288|      0|        }
  289|  3.17M|    }
  290|   168k|    return true;
  291|   168k|}

_ZN6icu_7817uprv_upperOrdinalEi:
   79|  14.9k|inline int32_t uprv_upperOrdinal(int32_t c) {
   80|  14.9k|#if U_CHARSET_FAMILY==U_ASCII_FAMILY
   81|  14.9k|    return c - 'A';
   82|       |#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
   83|       |    // EBCDIC: A-Z (26 letters) is split into three ranges A-I (9 letters), J-R (9), S-Z (8).
   84|       |    // https://en.wikipedia.org/wiki/EBCDIC_037#Codepage_layout
   85|       |    if (c <= 'I') { return c - 'A'; }  // A-I --> 0-8
   86|       |    if (c < 'J') { return -1; }
   87|       |    if (c <= 'R') { return c - 'J' + 9; }  // J-R --> 9..17
   88|       |    if (c < 'S') { return -1; }
   89|       |    return c - 'S' + 18;  // S-Z --> 18..25
   90|       |#else
   91|       |#   error Unknown charset family!
   92|       |#endif
   93|  14.9k|}
_ZN6icu_7817uprv_lowerOrdinalEi:
   97|      8|inline int32_t uprv_lowerOrdinal(int32_t c) {
   98|      8|#if U_CHARSET_FAMILY==U_ASCII_FAMILY
   99|      8|    return c - 'a';
  100|       |#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
  101|       |    // EBCDIC: a-z (26 letters) is split into three ranges a-i (9 letters), j-r (9), s-z (8).
  102|       |    // https://en.wikipedia.org/wiki/EBCDIC_037#Codepage_layout
  103|       |    if (c <= 'i') { return c - 'a'; }  // a-i --> 0-8
  104|       |    if (c < 'j') { return -1; }
  105|       |    if (c <= 'r') { return c - 'j' + 9; }  // j-r --> 9..17
  106|       |    if (c < 's') { return -1; }
  107|       |    return c - 's' + 18;  // s-z --> 18..25
  108|       |#else
  109|       |#   error Unknown charset family!
  110|       |#endif
  111|      8|}

locale_getKeywordsStart_78:
  526|   750k|locale_getKeywordsStart(std::string_view localeID) {
  527|   750k|    if (size_t pos = localeID.find('@'); pos != std::string_view::npos) {
  ------------------
  |  Branch (527:42): [True: 4.09k, False: 746k]
  ------------------
  528|  4.09k|        return localeID.data() + pos;
  529|  4.09k|    }
  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|   746k|    return nullptr;
  546|   750k|}
_Z22ulocimp_getKeywords_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEEcRN6icu_788ByteSinkEbR10UErrorCode:
  614|      8|{
  615|      8|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (615:9): [True: 0, False: 8]
  ------------------
  616|       |
  617|      8|    KeywordStruct keywordList[ULOC_MAX_NO_KEYWORDS];
  618|       |
  619|      8|    int32_t maxKeywords = ULOC_MAX_NO_KEYWORDS;
  ------------------
  |  |  523|      8|#define ULOC_MAX_NO_KEYWORDS 25
  ------------------
  620|      8|    int32_t numKeywords = 0;
  621|      8|    size_t equalSign = std::string_view::npos;
  622|      8|    size_t semicolon = std::string_view::npos;
  623|      8|    int32_t i = 0, j, n;
  624|       |
  625|      8|    if(prev == '@') { /* start of keyword definition */
  ------------------
  |  Branch (625:8): [True: 8, False: 0]
  ------------------
  626|       |        /* we will grab pairs, trim spaces, lowercase keywords, sort and return */
  627|      8|        do {
  628|      8|            bool duplicate = false;
  629|       |            /* skip leading spaces */
  630|      8|            while (localeID.front() == ' ') {
  ------------------
  |  Branch (630:20): [True: 0, False: 8]
  ------------------
  631|      0|                localeID.remove_prefix(1);
  632|      0|            }
  633|      8|            if (localeID.empty()) { /* handle trailing "; " */
  ------------------
  |  Branch (633:17): [True: 0, False: 8]
  ------------------
  634|      0|                break;
  635|      0|            }
  636|      8|            if(numKeywords == maxKeywords) {
  ------------------
  |  Branch (636:16): [True: 0, False: 8]
  ------------------
  637|      0|                status = U_INTERNAL_PROGRAM_ERROR;
  638|      0|                return;
  639|      0|            }
  640|      8|            equalSign = localeID.find('=');
  641|      8|            semicolon = localeID.find(';');
  642|       |            /* lack of '=' [foo@currency] is illegal */
  643|       |            /* ';' before '=' [foo@currency;collation=pinyin] is illegal */
  644|      8|            if (equalSign == std::string_view::npos ||
  ------------------
  |  Branch (644:17): [True: 0, False: 8]
  ------------------
  645|      8|                (semicolon != std::string_view::npos && semicolon < equalSign)) {
  ------------------
  |  Branch (645:18): [True: 0, False: 8]
  |  Branch (645:57): [True: 0, False: 0]
  ------------------
  646|      0|                status = U_INVALID_FORMAT_ERROR;
  647|      0|                return;
  648|      0|            }
  649|       |            /* zero-length keyword is an error. */
  650|      8|            if (equalSign == 0) {
  ------------------
  |  Branch (650:17): [True: 0, False: 8]
  ------------------
  651|      0|                status = U_INVALID_FORMAT_ERROR;
  652|      0|                return;
  653|      0|            }
  654|       |            /* need to normalize both keyword and keyword name */
  655|      8|            if (equalSign >= ULOC_KEYWORD_BUFFER_LEN) {
  ------------------
  |  |  522|      8|#define ULOC_KEYWORD_BUFFER_LEN 25
  ------------------
  |  Branch (655:17): [True: 0, False: 8]
  ------------------
  656|       |                /* keyword name too long for internal buffer */
  657|      0|                status = U_INTERNAL_PROGRAM_ERROR;
  658|      0|                return;
  659|      0|            }
  660|     72|            for (i = 0, n = 0; static_cast<size_t>(i) < equalSign; ++i) {
  ------------------
  |  Branch (660:32): [True: 64, False: 8]
  ------------------
  661|     64|                if (localeID[i] != ' ') {
  ------------------
  |  Branch (661:21): [True: 64, False: 0]
  ------------------
  662|     64|                    keywordList[numKeywords].keyword[n++] = uprv_tolower(localeID[i]);
  ------------------
  |  |   68|     64|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|     64|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  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
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  663|     64|                }
  664|     64|            }
  665|       |
  666|      8|            keywordList[numKeywords].keyword[n] = 0;
  667|      8|            keywordList[numKeywords].keywordLen = n;
  668|       |            /* now grab the value part. First we skip the '=' */
  669|      8|            equalSign++;
  670|       |            /* then we leading spaces */
  671|      8|            while (equalSign < localeID.length() && localeID[equalSign] == ' ') {
  ------------------
  |  Branch (671:20): [True: 8, False: 0]
  |  Branch (671:53): [True: 0, False: 8]
  ------------------
  672|      0|                equalSign++;
  673|      0|            }
  674|       |
  675|       |            /* Premature end or zero-length value */
  676|      8|            if (equalSign == localeID.length() || equalSign == semicolon) {
  ------------------
  |  Branch (676:17): [True: 0, False: 8]
  |  Branch (676:51): [True: 0, False: 8]
  ------------------
  677|      0|                status = U_INVALID_FORMAT_ERROR;
  678|      0|                return;
  679|      0|            }
  680|       |
  681|      8|            keywordList[numKeywords].valueStart = localeID.data() + equalSign;
  682|       |
  683|      8|            std::string_view value = localeID;
  684|      8|            if (semicolon != std::string_view::npos) {
  ------------------
  |  Branch (684:17): [True: 0, False: 8]
  ------------------
  685|      0|                value.remove_suffix(value.length() - semicolon);
  686|      0|                localeID.remove_prefix(semicolon + 1);
  687|      8|            } else {
  688|      8|                localeID = {};
  689|      8|            }
  690|      8|            value.remove_prefix(equalSign);
  691|      8|            if (size_t last = value.find_last_not_of(' '); last != std::string_view::npos) {
  ------------------
  |  Branch (691:60): [True: 8, False: 0]
  ------------------
  692|      8|                value.remove_suffix(value.length() - last - 1);
  693|      8|            }
  694|      8|            keywordList[numKeywords].valueLen = static_cast<int32_t>(value.length());
  695|       |
  696|       |            /* If this is a duplicate keyword, then ignore it */
  697|      8|            for (j=0; j<numKeywords; ++j) {
  ------------------
  |  Branch (697:23): [True: 0, False: 8]
  ------------------
  698|      0|                if (uprv_strcmp(keywordList[j].keyword, keywordList[numKeywords].keyword) == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (698:21): [True: 0, False: 0]
  ------------------
  699|      0|                    duplicate = true;
  700|      0|                    break;
  701|      0|                }
  702|      0|            }
  703|      8|            if (!duplicate) {
  ------------------
  |  Branch (703:17): [True: 8, False: 0]
  ------------------
  704|      8|                ++numKeywords;
  705|      8|            }
  706|      8|        } while (!localeID.empty());
  ------------------
  |  Branch (706:18): [True: 0, False: 8]
  ------------------
  707|       |
  708|       |        /* now we have a list of keywords */
  709|       |        /* we need to sort it */
  710|      8|        uprv_sortArray(keywordList, numKeywords, sizeof(KeywordStruct), compareKeywordStructs, nullptr, false, &status);
  ------------------
  |  | 1538|      8|#define uprv_sortArray U_ICU_ENTRY_POINT_RENAME(uprv_sortArray)
  |  |  ------------------
  |  |  |  |  123|      8|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      8|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      8|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  711|       |
  712|       |        /* Now construct the keyword part */
  713|     16|        for(i = 0; i < numKeywords; i++) {
  ------------------
  |  Branch (713:20): [True: 8, False: 8]
  ------------------
  714|      8|            sink.Append(keywordList[i].keyword, keywordList[i].keywordLen);
  715|      8|            if(valuesToo) {
  ------------------
  |  Branch (715:16): [True: 8, False: 0]
  ------------------
  716|      8|                sink.Append("=", 1);
  717|      8|                sink.Append(keywordList[i].valueStart, keywordList[i].valueLen);
  718|      8|                if(i < numKeywords - 1) {
  ------------------
  |  Branch (718:20): [True: 0, False: 8]
  ------------------
  719|      0|                    sink.Append(";", 1);
  720|      0|                }
  721|      8|            } else {
  722|      0|                sink.Append("\0", 1);
  723|      0|            }
  724|      8|        }
  725|      8|    }
  726|      8|}
uloc_getKeywordValue_78:
  733|   102k|{
  734|   102k|    if (U_FAILURE(*status)) { return 0; }
  ------------------
  |  Branch (734:9): [True: 0, False: 102k]
  ------------------
  735|   102k|    if (keywordName == nullptr || *keywordName == '\0') {
  ------------------
  |  Branch (735:9): [True: 0, False: 102k]
  |  Branch (735:35): [True: 0, False: 102k]
  ------------------
  736|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
  737|      0|        return 0;
  738|      0|    }
  739|   102k|    return ByteSinkUtil::viaByteSinkToTerminatedChars(
  740|   102k|        buffer, bufferCapacity,
  741|   102k|        [&](ByteSink& sink, UErrorCode& status) {
  742|   102k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  743|   102k|        },
  744|   102k|        *status);
  745|   102k|}
_Z26ulocimp_getKeywordValue_78PKcNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEER10UErrorCode:
  751|  99.1k|{
  752|  99.1k|    return ByteSinkUtil::viaByteSinkToCharString(
  753|  99.1k|        [&](ByteSink& sink, UErrorCode& status) {
  754|  99.1k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  755|  99.1k|        },
  756|  99.1k|        status);
  757|  99.1k|}
_Z26ulocimp_getKeywordValue_78PKcNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
  764|   201k|{
  765|   201k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (765:9): [True: 0, False: 201k]
  ------------------
  766|       |
  767|   201k|    if (localeID == nullptr || keywordName.empty()) {
  ------------------
  |  Branch (767:9): [True: 0, False: 201k]
  |  Branch (767:32): [True: 0, False: 201k]
  ------------------
  768|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  769|      0|        return;
  770|      0|    }
  771|       |
  772|   201k|    const char* startSearchHere = nullptr;
  773|   201k|    const char* nextSeparator = nullptr;
  774|       |
  775|   201k|    CharString tempBuffer;
  776|   201k|    const char* tmpLocaleID;
  777|       |
  778|   201k|    CharString canonKeywordName = locale_canonKeywordName(keywordName, status);
  779|   201k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (779:9): [True: 0, False: 201k]
  ------------------
  780|      0|      return;
  781|      0|    }
  782|       |
  783|   201k|    if (localeID != nullptr && _hasBCP47Extension(localeID)) {
  ------------------
  |  Branch (783:9): [True: 201k, False: 0]
  |  Branch (783:32): [True: 0, False: 201k]
  ------------------
  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|   201k|    } else {
  787|   201k|        tmpLocaleID=localeID;
  788|   201k|    }
  789|       |
  790|   201k|    startSearchHere = locale_getKeywordsStart(tmpLocaleID);
  ------------------
  |  |  138|   201k|#define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart)
  |  |  ------------------
  |  |  |  |  123|   201k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   201k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   201k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  791|   201k|    if(startSearchHere == nullptr) {
  ------------------
  |  Branch (791:8): [True: 197k, False: 4.09k]
  ------------------
  792|       |        /* no keywords, return at once */
  793|   197k|        return;
  794|   197k|    }
  795|       |
  796|       |    /* find the first keyword */
  797|  4.09k|    while(startSearchHere) {
  ------------------
  |  Branch (797:11): [True: 4.09k, False: 4]
  ------------------
  798|  4.09k|        const char* keyValueTail;
  799|       |
  800|  4.09k|        startSearchHere++; /* skip @ or ; */
  801|  4.09k|        nextSeparator = uprv_strchr(startSearchHere, '=');
  ------------------
  |  |   40|  4.09k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  4.09k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  802|  4.09k|        if(!nextSeparator) {
  ------------------
  |  Branch (802:12): [True: 0, False: 4.09k]
  ------------------
  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|  4.09k|        while(*startSearchHere == ' ') {
  ------------------
  |  Branch (807:15): [True: 0, False: 4.09k]
  ------------------
  808|      0|            startSearchHere++;
  809|      0|        }
  810|  4.09k|        keyValueTail = nextSeparator;
  811|  4.09k|        while (keyValueTail > startSearchHere && *(keyValueTail-1) == ' ') {
  ------------------
  |  Branch (811:16): [True: 4.09k, False: 0]
  |  Branch (811:50): [True: 0, False: 4.09k]
  ------------------
  812|      0|            keyValueTail--;
  813|      0|        }
  814|       |        /* now keyValueTail points to first char after the keyName */
  815|       |        /* copy & normalize keyName from locale */
  816|  4.09k|        if (startSearchHere == keyValueTail) {
  ------------------
  |  Branch (816:13): [True: 0, False: 4.09k]
  ------------------
  817|      0|            status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */
  818|      0|            return;
  819|      0|        }
  820|  4.09k|        CharString localeKeywordName;
  821|  36.8k|        while (startSearchHere < keyValueTail) {
  ------------------
  |  Branch (821:16): [True: 32.7k, False: 4.09k]
  ------------------
  822|  32.7k|          if (!UPRV_ISALPHANUM(*startSearchHere)) {
  ------------------
  |  Branch (822:15): [True: 0, False: 32.7k]
  ------------------
  823|      0|            status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */
  824|      0|            return;
  825|      0|          }
  826|  32.7k|          localeKeywordName.append(uprv_tolower(*startSearchHere++), status);
  ------------------
  |  |   68|  32.7k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  32.7k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  32.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  32.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  32.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  827|  32.7k|        }
  828|  4.09k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (828:13): [True: 0, False: 4.09k]
  ------------------
  829|      0|            return;
  830|      0|        }
  831|       |
  832|  4.09k|        startSearchHere = uprv_strchr(nextSeparator, ';');
  ------------------
  |  |   40|  4.09k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  4.09k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  833|       |
  834|  4.09k|        if (canonKeywordName == localeKeywordName) {
  ------------------
  |  Branch (834:13): [True: 4.08k, False: 4]
  ------------------
  835|       |             /* current entry matches the keyword. */
  836|  4.08k|           nextSeparator++; /* skip '=' */
  837|       |            /* First strip leading & trailing spaces (TC decided to tolerate these) */
  838|  4.08k|            while(*nextSeparator == ' ') {
  ------------------
  |  Branch (838:19): [True: 0, False: 4.08k]
  ------------------
  839|      0|              nextSeparator++;
  840|      0|            }
  841|  4.08k|            keyValueTail = (startSearchHere)? startSearchHere: nextSeparator + uprv_strlen(nextSeparator);
  ------------------
  |  |   37|  4.08k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  4.08k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (841:28): [True: 0, False: 4.08k]
  ------------------
  842|  4.08k|            while(keyValueTail > nextSeparator && *(keyValueTail-1) == ' ') {
  ------------------
  |  Branch (842:19): [True: 4.08k, False: 0]
  |  Branch (842:51): [True: 0, False: 4.08k]
  ------------------
  843|      0|              keyValueTail--;
  844|      0|            }
  845|       |            /* Now copy the value, but check well-formedness */
  846|  4.08k|            if (nextSeparator == keyValueTail) {
  ------------------
  |  Branch (846:17): [True: 0, False: 4.08k]
  ------------------
  847|      0|              status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value name in passed-in locale */
  848|      0|              return;
  849|      0|            }
  850|  40.8k|            while (nextSeparator < keyValueTail) {
  ------------------
  |  Branch (850:20): [True: 36.7k, False: 4.08k]
  ------------------
  851|  36.7k|              if (!UPRV_ISALPHANUM(*nextSeparator) && !UPRV_OK_VALUE_PUNCTUATION(*nextSeparator)) {
  ------------------
  |  Branch (851:19): [True: 0, False: 36.7k]
  |  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|  36.7k|              sink.Append(nextSeparator++, 1);
  857|  36.7k|            }
  858|  4.08k|            return;
  859|  4.08k|        }
  860|  4.09k|    }
  861|  4.09k|}
_Z20ulocimp_getRegion_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 1475|  46.5k|ulocimp_getRegion(std::string_view localeID, UErrorCode& status) {
 1476|  46.5k|    return ByteSinkUtil::viaByteSinkToCharString(
 1477|  46.5k|        [&](ByteSink& sink, UErrorCode& status) {
 1478|  46.5k|            ulocimp_getSubtags(
 1479|  46.5k|                    localeID,
 1480|  46.5k|                    nullptr,
 1481|  46.5k|                    nullptr,
 1482|  46.5k|                    &sink,
 1483|  46.5k|                    nullptr,
 1484|  46.5k|                    nullptr,
 1485|  46.5k|                    status);
 1486|  46.5k|        },
 1487|  46.5k|        status);
 1488|  46.5k|}
_Z21ulocimp_getSubtags_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEEPN6icu_7810CharStringES6_S6_S6_PPKcR10UErrorCode:
 1514|  1.01M|        UErrorCode& status) {
 1515|  1.01M|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1515:9): [True: 0, False: 1.01M]
  ------------------
 1516|       |
 1517|  1.01M|    std::optional<CharStringByteSink> languageSink;
 1518|  1.01M|    std::optional<CharStringByteSink> scriptSink;
 1519|  1.01M|    std::optional<CharStringByteSink> regionSink;
 1520|  1.01M|    std::optional<CharStringByteSink> variantSink;
 1521|       |
 1522|  1.01M|    if (language != nullptr) { languageSink.emplace(language); }
  ------------------
  |  Branch (1522:9): [True: 1.01M, False: 0]
  ------------------
 1523|  1.01M|    if (script != nullptr) { scriptSink.emplace(script); }
  ------------------
  |  Branch (1523:9): [True: 1.01M, False: 0]
  ------------------
 1524|  1.01M|    if (region != nullptr) { regionSink.emplace(region); }
  ------------------
  |  Branch (1524:9): [True: 857k, False: 154k]
  ------------------
 1525|  1.01M|    if (variant != nullptr) { variantSink.emplace(variant); }
  ------------------
  |  Branch (1525:9): [True: 548k, False: 463k]
  ------------------
 1526|       |
 1527|  1.01M|    ulocimp_getSubtags(
  ------------------
  |  | 1209|  1.01M|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  1.01M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.01M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.01M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1528|  1.01M|            localeID,
 1529|  1.01M|            languageSink.has_value() ? &*languageSink : nullptr,
  ------------------
  |  Branch (1529:13): [True: 1.01M, False: 0]
  ------------------
 1530|  1.01M|            scriptSink.has_value() ? &*scriptSink : nullptr,
  ------------------
  |  Branch (1530:13): [True: 1.01M, False: 0]
  ------------------
 1531|  1.01M|            regionSink.has_value() ? &*regionSink : nullptr,
  ------------------
  |  Branch (1531:13): [True: 857k, False: 154k]
  ------------------
 1532|  1.01M|            variantSink.has_value() ? &*variantSink : nullptr,
  ------------------
  |  Branch (1532:13): [True: 548k, False: 463k]
  ------------------
 1533|  1.01M|            pEnd,
 1534|  1.01M|            status);
 1535|  1.01M|}
_Z21ulocimp_getSubtags_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEEPN6icu_788ByteSinkES6_S6_S6_PPKcR10UErrorCode:
 1545|  1.52M|        UErrorCode& status) {
 1546|  1.52M|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1546:9): [True: 0, False: 1.52M]
  ------------------
 1547|       |
 1548|  1.52M|    if (pEnd != nullptr) {
  ------------------
  |  Branch (1548:9): [True: 548k, False: 974k]
  ------------------
 1549|   548k|        *pEnd = localeID.data();
 1550|   974k|    } else if (language == nullptr &&
  ------------------
  |  Branch (1550:16): [True: 510k, False: 463k]
  ------------------
 1551|   974k|               script == nullptr &&
  ------------------
  |  Branch (1551:16): [True: 510k, False: 0]
  ------------------
 1552|   974k|               region == nullptr &&
  ------------------
  |  Branch (1552:16): [True: 463k, False: 46.5k]
  ------------------
 1553|   974k|               variant == nullptr) {
  ------------------
  |  Branch (1553:16): [True: 0, False: 463k]
  ------------------
 1554|      0|        return;
 1555|      0|    }
 1556|       |
 1557|  1.52M|    if (localeID.empty()) { return; }
  ------------------
  |  Branch (1557:9): [True: 94.1k, False: 1.42M]
  ------------------
 1558|       |
 1559|  1.42M|    bool hasRegion = false;
 1560|       |
 1561|  1.42M|    {
 1562|  1.42M|        size_t len = _getLanguage(localeID, language, status);
 1563|  1.42M|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1563:13): [True: 0, False: 1.42M]
  ------------------
 1564|  1.42M|        if (len > 0) {
  ------------------
  |  Branch (1564:13): [True: 1.42M, False: 10]
  ------------------
 1565|  1.42M|            localeID.remove_prefix(len);
 1566|  1.42M|        }
 1567|  1.42M|    }
 1568|       |
 1569|  1.42M|    if (pEnd != nullptr) {
  ------------------
  |  Branch (1569:9): [True: 454k, False: 974k]
  ------------------
 1570|   454k|        *pEnd = localeID.data();
 1571|   974k|    } else if (script == nullptr &&
  ------------------
  |  Branch (1571:16): [True: 510k, False: 463k]
  ------------------
 1572|   974k|               region == nullptr &&
  ------------------
  |  Branch (1572:16): [True: 463k, False: 46.5k]
  ------------------
 1573|   974k|               variant == nullptr) {
  ------------------
  |  Branch (1573:16): [True: 0, False: 463k]
  ------------------
 1574|      0|        return;
 1575|      0|    }
 1576|       |
 1577|  1.42M|    if (localeID.empty()) { return; }
  ------------------
  |  Branch (1577:9): [True: 8.17k, False: 1.42M]
  ------------------
 1578|       |
 1579|  1.42M|    if (_isIDSeparator(localeID.front())) {
  ------------------
  |  Branch (1579:9): [True: 1.42M, False: 11]
  ------------------
 1580|  1.42M|        std::string_view sub = localeID;
 1581|  1.42M|        sub.remove_prefix(1);
 1582|  1.42M|        size_t len = _getScript(sub, script);
 1583|  1.42M|        if (len > 0) {
  ------------------
  |  Branch (1583:13): [True: 309k, False: 1.11M]
  ------------------
 1584|   309k|            localeID.remove_prefix(len + 1);
 1585|   309k|            if (pEnd != nullptr) { *pEnd = localeID.data(); }
  ------------------
  |  Branch (1585:17): [True: 1, False: 309k]
  ------------------
 1586|   309k|        }
 1587|  1.42M|    }
 1588|       |
 1589|  1.42M|    if ((region == nullptr && variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
  ------------------
  |  Branch (1589:10): [True: 618k, False: 801k]
  |  Branch (1589:31): [True: 154k, False: 463k]
  |  Branch (1589:53): [True: 154k, False: 0]
  |  Branch (1589:73): [True: 309k, False: 956k]
  ------------------
 1590|       |
 1591|   956k|    if (_isIDSeparator(localeID.front())) {
  ------------------
  |  Branch (1591:9): [True: 956k, False: 11]
  ------------------
 1592|   956k|        std::string_view sub = localeID;
 1593|   956k|        sub.remove_prefix(1);
 1594|   956k|        size_t len = _getRegion(sub, region);
 1595|   956k|        if (len > 0) {
  ------------------
  |  Branch (1595:13): [True: 956k, False: 2]
  ------------------
 1596|   956k|            hasRegion = true;
 1597|   956k|            localeID.remove_prefix(len + 1);
 1598|   956k|            if (pEnd != nullptr) { *pEnd = localeID.data(); }
  ------------------
  |  Branch (1598:17): [True: 446k, False: 510k]
  ------------------
 1599|   956k|        }
 1600|   956k|    }
 1601|       |
 1602|   956k|    if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
  ------------------
  |  Branch (1602:10): [True: 201k, False: 755k]
  |  Branch (1602:32): [True: 201k, False: 0]
  |  Branch (1602:52): [True: 162k, False: 592k]
  ------------------
 1603|       |
 1604|   592k|    bool hasVariant = false;
 1605|       |
 1606|   592k|    if (_isIDSeparator(localeID.front()) && !_isBCP47Extension(localeID)) {
  ------------------
  |  Branch (1606:9): [True: 592k, False: 11]
  |  Branch (1606:45): [True: 592k, False: 0]
  ------------------
 1607|   592k|        std::string_view sub = localeID;
 1608|       |        /* If there was no country ID, skip a possible extra IDSeparator */
 1609|   592k|        size_t skip = !hasRegion && localeID.size() > 1 && _isIDSeparator(localeID[1]) ? 2 : 1;
  ------------------
  |  Branch (1609:23): [True: 2, False: 592k]
  |  Branch (1609:37): [True: 2, False: 0]
  |  Branch (1609:60): [True: 2, False: 0]
  ------------------
 1610|   592k|        sub.remove_prefix(skip);
 1611|   592k|        size_t len = _getVariant(sub, localeID[0], variant, false, status);
 1612|   592k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1612:13): [True: 0, False: 592k]
  ------------------
 1613|   592k|        if (len > 0) {
  ------------------
  |  Branch (1613:13): [True: 592k, False: 0]
  ------------------
 1614|   592k|            hasVariant = true;
 1615|   592k|            localeID.remove_prefix(skip + len);
 1616|   592k|            if (pEnd != nullptr) { *pEnd = localeID.data(); }
  ------------------
  |  Branch (1616:17): [True: 437k, False: 154k]
  ------------------
 1617|   592k|        }
 1618|   592k|    }
 1619|       |
 1620|   592k|    if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
  ------------------
  |  Branch (1620:10): [True: 0, False: 592k]
  |  Branch (1620:32): [True: 0, False: 0]
  |  Branch (1620:52): [True: 592k, False: 11]
  ------------------
 1621|       |
 1622|     11|    if (_isBCP47Extension(localeID)) {
  ------------------
  |  Branch (1622:9): [True: 0, False: 11]
  ------------------
 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|     11|}
_Z20ulocimp_getParent_78PKcR10UErrorCode:
 2001|  66.9k|{
 2002|  66.9k|    return ByteSinkUtil::viaByteSinkToCharString(
 2003|  66.9k|        [&](ByteSink& sink, UErrorCode& status) {
 2004|  66.9k|            ulocimp_getParent(localeID, sink, status);
 2005|  66.9k|        },
 2006|  66.9k|        err);
 2007|  66.9k|}
_Z20ulocimp_getParent_78PKcRN6icu_788ByteSinkER10UErrorCode:
 2013|  66.9k|{
 2014|  66.9k|    if (U_FAILURE(err)) { return; }
  ------------------
  |  Branch (2014:9): [True: 0, False: 66.9k]
  ------------------
 2015|       |
 2016|  66.9k|    const char *lastUnderscore;
 2017|  66.9k|    int32_t i;
 2018|       |
 2019|  66.9k|    if (localeID == nullptr)
  ------------------
  |  Branch (2019:9): [True: 0, False: 66.9k]
  ------------------
 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|  66.9k|    lastUnderscore=uprv_strrchr(localeID, '_');
  ------------------
  |  |   42|  66.9k|#define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  66.9k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2023|  66.9k|    if(lastUnderscore!=nullptr) {
  ------------------
  |  Branch (2023:8): [True: 58.7k, False: 8.17k]
  ------------------
 2024|  58.7k|        i = static_cast<int32_t>(lastUnderscore - localeID);
 2025|  58.7k|    } else {
 2026|  8.17k|        i=0;
 2027|  8.17k|    }
 2028|       |
 2029|  66.9k|    if (i > 0) {
  ------------------
  |  Branch (2029:9): [True: 58.7k, False: 8.17k]
  ------------------
 2030|  58.7k|        if (uprv_strnicmp(localeID, "und_", 4) == 0) {
  ------------------
  |  | 1544|  58.7k|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|  58.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  58.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  58.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2030:13): [True: 0, False: 58.7k]
  ------------------
 2031|      0|            localeID += 3;
 2032|      0|            i -= 3;
 2033|      0|        }
 2034|  58.7k|        sink.Append(localeID, i);
 2035|  58.7k|    }
 2036|  66.9k|}
_Z18ulocimp_getName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 2159|  44.4k|{
 2160|  44.4k|    return ByteSinkUtil::viaByteSinkToCharString(
 2161|  44.4k|        [&](ByteSink& sink, UErrorCode& status) {
 2162|  44.4k|            ulocimp_getName(localeID, sink, status);
 2163|  44.4k|        },
 2164|  44.4k|        err);
 2165|  44.4k|}
_Z18ulocimp_getName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
 2171|   134k|{
 2172|   134k|    _canonicalize(localeID, sink, 0, err);
 2173|   134k|}
_Z22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 2195|   413k|{
 2196|   413k|    return ByteSinkUtil::viaByteSinkToCharString(
 2197|   413k|        [&](ByteSink& sink, UErrorCode& status) {
 2198|   413k|            ulocimp_getBaseName(localeID, sink, status);
 2199|   413k|        },
 2200|   413k|        err);
 2201|   413k|}
_Z22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
 2207|   413k|{
 2208|   413k|    _canonicalize(localeID, sink, _ULOC_STRIP_KEYWORDS, err);
  ------------------
  |  | 1785|   413k|#define _ULOC_STRIP_KEYWORDS 0x2
  ------------------
 2209|   413k|}
_Z23ulocimp_canonicalize_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 2231|      8|{
 2232|      8|    return ByteSinkUtil::viaByteSinkToCharString(
 2233|      8|        [&](ByteSink& sink, UErrorCode& status) {
 2234|      8|            ulocimp_canonicalize(localeID, sink, status);
 2235|      8|        },
 2236|      8|        err);
 2237|      8|}
_Z23ulocimp_canonicalize_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
 2243|      8|{
 2244|      8|    _canonicalize(localeID, sink, _ULOC_CANONICALIZE, err);
  ------------------
  |  | 1786|      8|#define _ULOC_CANONICALIZE   0x1
  ------------------
 2245|      8|}
uloc_getDefault_78:
 2336|   645k|{
 2337|   645k|    return locale_get_default();
  ------------------
  |  |  139|   645k|#define locale_get_default U_ICU_ENTRY_POINT_RENAME(locale_get_default)
  |  |  ------------------
  |  |  |  |  123|   645k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   645k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   645k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2338|   645k|}
uloc.cpp:_ZN12_GLOBAL__N_123locale_canonKeywordNameENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEER10UErrorCode:
  556|   201k|{
  557|   201k|  if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (557:7): [True: 0, False: 201k]
  ------------------
  558|   201k|  CharString result;
  559|       |
  560|  1.28M|  for (char c : keywordName) {
  ------------------
  |  Branch (560:15): [True: 1.28M, False: 201k]
  ------------------
  561|  1.28M|    if (!UPRV_ISALPHANUM(c)) {
  ------------------
  |  Branch (561:9): [True: 0, False: 1.28M]
  ------------------
  562|      0|      status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */
  563|      0|      return {};
  564|      0|    }
  565|  1.28M|    result.append(uprv_tolower(c), status);
  ------------------
  |  |   68|  1.28M|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  1.28M|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  1.28M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  1.28M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  1.28M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  566|  1.28M|  }
  567|   201k|  if (result.isEmpty()) {
  ------------------
  |  Branch (567:7): [True: 0, False: 201k]
  ------------------
  568|      0|    status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name */
  569|      0|    return {};
  570|      0|  }
  571|       |
  572|   201k|  return result;
  573|   201k|}
uloc.cpp:_ZN12_GLOBAL__N_118_hasBCP47ExtensionENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
  510|   750k|inline bool _hasBCP47Extension(std::string_view id) {
  511|   750k|    return id.find('@') == std::string_view::npos && getShortestSubtagLength(id) == 1;
  ------------------
  |  Branch (511:12): [True: 746k, False: 4.09k]
  |  Branch (511:54): [True: 0, False: 746k]
  ------------------
  512|   750k|}
uloc.cpp:_ZN12_GLOBAL__N_123getShortestSubtagLengthENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
  485|   746k|int32_t getShortestSubtagLength(std::string_view localeID) {
  486|   746k|    int32_t localeIDLength = static_cast<int32_t>(localeID.length());
  487|   746k|    int32_t length = localeIDLength;
  488|   746k|    int32_t tmpLength = 0;
  489|   746k|    int32_t i;
  490|   746k|    bool reset = true;
  491|       |
  492|  7.79M|    for (i = 0; i < localeIDLength; i++) {
  ------------------
  |  Branch (492:17): [True: 7.04M, False: 746k]
  ------------------
  493|  7.04M|        if (localeID[i] != '_' && localeID[i] != '-') {
  ------------------
  |  Branch (493:13): [True: 5.77M, False: 1.27M]
  |  Branch (493:35): [True: 5.77M, False: 0]
  ------------------
  494|  5.77M|            if (reset) {
  ------------------
  |  Branch (494:17): [True: 1.93M, False: 3.83M]
  ------------------
  495|  1.93M|                tmpLength = 0;
  496|  1.93M|                reset = false;
  497|  1.93M|            }
  498|  5.77M|            tmpLength++;
  499|  5.77M|        } else {
  500|  1.27M|            if (tmpLength != 0 && tmpLength < length) {
  ------------------
  |  Branch (500:17): [True: 1.27M, False: 0]
  |  Branch (500:35): [True: 643k, False: 635k]
  ------------------
  501|   643k|                length = tmpLength;
  502|   643k|            }
  503|  1.27M|            reset = true;
  504|  1.27M|        }
  505|  7.04M|    }
  506|       |
  507|   746k|    return length;
  508|   746k|}
uloc.cpp:_ZN12_GLOBAL__N_115UPRV_ISALPHANUMEc:
  516|  1.35M|inline bool UPRV_ISALPHANUM(char c) { return uprv_isASCIILetter(c) || UPRV_ISDIGIT(c); }
  ------------------
  |  | 1514|  1.35M|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|  1.35M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.35M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.35M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (516:46): [True: 1.35M, False: 0]
  |  Branch (516:71): [True: 0, False: 0]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_112_getLanguageENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEPN6icu_788ByteSinkER10UErrorCode:
 1219|  1.42M|size_t _getLanguage(std::string_view localeID, ByteSink* sink, UErrorCode& status) {
 1220|  1.42M|    size_t skip = 0;
 1221|  1.42M|    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: 1.42M]
  |  Branch (1221:33): [True: 0, False: 0]
  ------------------
 1222|      0|        skip = 4;
 1223|      0|        localeID.remove_prefix(skip);
 1224|  1.42M|    } else if (localeID.size() >= 3 && uprv_strnicmp(localeID.data(), "und", 3) == 0 &&
  ------------------
  |  | 1544|  1.42M|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|  1.42M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.42M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.42M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1224:16): [True: 1.42M, False: 8.17k]
  |  Branch (1224:40): [True: 0, False: 1.42M]
  ------------------
 1225|  1.42M|               (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|  1.42M|    constexpr int32_t MAXLEN = ULOC_LANG_CAPACITY - 1;  // Minus NUL.
  ------------------
  |  |  251|  1.42M|#define ULOC_LANG_CAPACITY 12
  ------------------
 1234|       |
 1235|       |    /* if it starts with i- or x- then copy that prefix */
 1236|  1.42M|    size_t len = _isIDPrefix(localeID) ? 2 : 0;
  ------------------
  |  Branch (1236:18): [True: 0, False: 1.42M]
  ------------------
 1237|  4.28M|    while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) {
  ------------------
  |  Branch (1237:12): [True: 4.27M, False: 8.17k]
  |  Branch (1237:37): [True: 4.27M, False: 11]
  |  Branch (1237:70): [True: 2.85M, False: 1.42M]
  ------------------
 1238|  2.85M|        if (len == MAXLEN) {
  ------------------
  |  Branch (1238:13): [True: 0, False: 2.85M]
  ------------------
 1239|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
 1240|      0|            return 0;
 1241|      0|        }
 1242|  2.85M|        len++;
 1243|  2.85M|    }
 1244|       |
 1245|  1.42M|    if (sink == nullptr || len == 0) { return skip + len; }
  ------------------
  |  Branch (1245:9): [True: 510k, False: 918k]
  |  Branch (1245:28): [True: 9, False: 918k]
  ------------------
 1246|       |
 1247|   918k|    int32_t minCapacity = uprv_max(static_cast<int32_t>(len), 4);  // Minimum 3 letters plus NUL.
  ------------------
  |  | 1526|   918k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|   918k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   918k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   918k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1248|   918k|    char scratch[MAXLEN];
 1249|   918k|    int32_t capacity = 0;
 1250|   918k|    char* buffer = sink->GetAppendBuffer(
 1251|   918k|            minCapacity, minCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity);
  ------------------
  |  |   99|   918k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1252|       |
 1253|  2.75M|    for (size_t i = 0; i < len; ++i) {
  ------------------
  |  Branch (1253:24): [True: 1.83M, False: 918k]
  ------------------
 1254|  1.83M|        buffer[i] = uprv_tolower(localeID[i]);
  ------------------
  |  |   68|  1.83M|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  1.83M|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  1.83M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  1.83M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  1.83M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1255|  1.83M|    }
 1256|   918k|    if (localeID.size() >= 2 && _isIDSeparator(localeID[1])) {
  ------------------
  |  Branch (1256:9): [True: 918k, False: 0]
  |  Branch (1256:33): [True: 0, False: 918k]
  ------------------
 1257|      0|        buffer[1] = '-';
 1258|      0|    }
 1259|       |
 1260|   918k|    if (len == 3) {
  ------------------
  |  Branch (1260:9): [True: 0, False: 918k]
  ------------------
 1261|       |        /* convert 3 character code to 2 character code if possible *CWB*/
 1262|      0|        U_ASSERT(capacity >= 4);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1263|      0|        buffer[3] = '\0';
 1264|      0|        std::optional<int16_t> offset = _findIndex(LANGUAGES_3, buffer);
 1265|      0|        if (offset.has_value()) {
  ------------------
  |  Branch (1265:13): [True: 0, False: 0]
  ------------------
 1266|      0|            const char* const alias = LANGUAGES[*offset];
 1267|      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        ::
  |  |  ------------------
  ------------------
 1268|      0|            return skip + len;
 1269|      0|        }
 1270|      0|    }
 1271|       |
 1272|   918k|    sink->Append(buffer, static_cast<int32_t>(len));
 1273|   918k|    return skip + len;
 1274|   918k|}
uloc.cpp:_ZN12_GLOBAL__N_111_isIDPrefixENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
 1152|  1.42M|inline bool _isIDPrefix(std::string_view s) {
 1153|  1.42M|    return s.size() >= 2 && _isPrefixLetter(s[0]) && _isIDSeparator(s[1]);
  ------------------
  |  Branch (1153:12): [True: 1.42M, False: 0]
  |  Branch (1153:29): [True: 0, False: 1.42M]
  |  Branch (1153:54): [True: 0, False: 0]
  ------------------
 1154|  1.42M|}
uloc.cpp:_ZN12_GLOBAL__N_115_isPrefixLetterEc:
 1148|  1.42M|inline bool _isPrefixLetter(char a) { return a == 'x' || a == 'X' || a == 'i' || a == 'I'; }
  ------------------
  |  Branch (1148:46): [True: 0, False: 1.42M]
  |  Branch (1148:58): [True: 0, False: 1.42M]
  |  Branch (1148:70): [True: 0, False: 1.42M]
  |  Branch (1148:82): [True: 0, False: 1.42M]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_113_isTerminatorEc:
 1159|  11.0M|inline bool _isTerminator(char a) { return a == '.' || a == '@'; }
  ------------------
  |  Branch (1159:44): [True: 0, False: 11.0M]
  |  Branch (1159:56): [True: 13, False: 11.0M]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_110_getScriptENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEPN6icu_788ByteSinkE:
 1276|  1.42M|size_t _getScript(std::string_view localeID, ByteSink* sink) {
 1277|  1.42M|    constexpr int32_t LENGTH = 4;
 1278|       |
 1279|  1.42M|    size_t len = 0;
 1280|  4.87M|    while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len]) &&
  ------------------
  |  Branch (1280:12): [True: 4.25M, False: 626k]
  |  Branch (1280:37): [True: 4.25M, False: 0]
  |  Branch (1280:70): [True: 3.45M, False: 793k]
  ------------------
 1281|  4.87M|            uprv_isASCIILetter(localeID[len])) {
  ------------------
  |  | 1514|  3.45M|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|  3.45M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.45M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.45M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1281:13): [True: 3.45M, False: 0]
  ------------------
 1282|  3.45M|        if (len == LENGTH) { return 0; }
  ------------------
  |  Branch (1282:13): [True: 0, False: 3.45M]
  ------------------
 1283|  3.45M|        len++;
 1284|  3.45M|    }
 1285|  1.42M|    if (len != LENGTH) { return 0; }
  ------------------
  |  Branch (1285:9): [True: 1.11M, False: 309k]
  ------------------
 1286|       |
 1287|   309k|    if (sink == nullptr) { return len; }
  ------------------
  |  Branch (1287:9): [True: 154k, False: 154k]
  ------------------
 1288|       |
 1289|   154k|    char scratch[LENGTH];
 1290|   154k|    int32_t capacity = 0;
 1291|   154k|    char* buffer = sink->GetAppendBuffer(
 1292|   154k|            LENGTH, LENGTH, scratch, UPRV_LENGTHOF(scratch), &capacity);
  ------------------
  |  |   99|   154k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1293|       |
 1294|   154k|    buffer[0] = uprv_toupper(localeID[0]);
  ------------------
  |  | 1547|   154k|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|   154k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   154k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   154k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1295|   618k|    for (int32_t i = 1; i < LENGTH; ++i) {
  ------------------
  |  Branch (1295:25): [True: 463k, False: 154k]
  ------------------
 1296|   463k|        buffer[i] = uprv_tolower(localeID[i]);
  ------------------
  |  |   68|   463k|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|   463k|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|   463k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|   463k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|   463k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1297|   463k|    }
 1298|       |
 1299|   154k|    sink->Append(buffer, LENGTH);
 1300|   154k|    return len;
 1301|   309k|}
uloc.cpp:_ZN12_GLOBAL__N_110_getRegionENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEPN6icu_788ByteSinkE:
 1303|   956k|size_t _getRegion(std::string_view localeID, ByteSink* sink) {
 1304|   956k|    constexpr int32_t MINLEN = 2;
 1305|   956k|    constexpr int32_t MAXLEN = ULOC_COUNTRY_CAPACITY - 1;  // Minus NUL.
  ------------------
  |  |  258|   956k|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
 1306|       |
 1307|   956k|    size_t len = 0;
 1308|  2.86M|    while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) {
  ------------------
  |  Branch (1308:12): [True: 2.55M, False: 317k]
  |  Branch (1308:37): [True: 2.55M, False: 2]
  |  Branch (1308:70): [True: 1.91M, False: 639k]
  ------------------
 1309|  1.91M|        if (len == MAXLEN) { return 0; }
  ------------------
  |  Branch (1309:13): [True: 0, False: 1.91M]
  ------------------
 1310|  1.91M|        len++;
 1311|  1.91M|    }
 1312|   956k|    if (len < MINLEN) { return 0; }
  ------------------
  |  Branch (1312:9): [True: 2, False: 956k]
  ------------------
 1313|       |
 1314|   956k|    if (sink == nullptr) { return len; }
  ------------------
  |  Branch (1314:9): [True: 309k, False: 647k]
  ------------------
 1315|       |
 1316|   647k|    char scratch[ULOC_COUNTRY_CAPACITY];
 1317|   647k|    int32_t capacity = 0;
 1318|   647k|    char* buffer = sink->GetAppendBuffer(
 1319|   647k|            ULOC_COUNTRY_CAPACITY,
  ------------------
  |  |  258|   647k|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
 1320|   647k|            ULOC_COUNTRY_CAPACITY,
  ------------------
  |  |  258|   647k|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
 1321|   647k|            scratch,
 1322|   647k|            UPRV_LENGTHOF(scratch),
  ------------------
  |  |   99|   647k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1323|   647k|            &capacity);
 1324|       |
 1325|  1.94M|    for (size_t i = 0; i < len; ++i) {
  ------------------
  |  Branch (1325:24): [True: 1.29M, False: 647k]
  ------------------
 1326|  1.29M|        buffer[i] = uprv_toupper(localeID[i]);
  ------------------
  |  | 1547|  1.29M|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|  1.29M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.29M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.29M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1327|  1.29M|    }
 1328|       |
 1329|   647k|    if (len == 3) {
  ------------------
  |  Branch (1329:9): [True: 0, False: 647k]
  ------------------
 1330|       |        /* convert 3 character code to 2 character code if possible *CWB*/
 1331|      0|        U_ASSERT(capacity >= 4);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 1332|      0|        buffer[3] = '\0';
 1333|      0|        std::optional<int16_t> offset = _findIndex(COUNTRIES_3, buffer);
 1334|      0|        if (offset.has_value()) {
  ------------------
  |  Branch (1334:13): [True: 0, False: 0]
  ------------------
 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|      0|    }
 1340|       |
 1341|   647k|    sink->Append(buffer, static_cast<int32_t>(len));
 1342|   647k|    return len;
 1343|   647k|}
uloc.cpp:_ZN12_GLOBAL__N_117_isBCP47ExtensionENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
 1161|   592k|inline bool _isBCP47Extension(std::string_view p) {
 1162|   592k|    return p.size() >= 3 &&
  ------------------
  |  Branch (1162:12): [True: 592k, False: 0]
  ------------------
 1163|   592k|           p[0] == '-' &&
  ------------------
  |  Branch (1163:12): [True: 0, False: 592k]
  ------------------
 1164|   592k|           (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|   592k|           p[2] == '-';
  ------------------
  |  Branch (1167:12): [True: 0, False: 0]
  ------------------
 1168|   592k|}
uloc.cpp:_ZN12_GLOBAL__N_111_getVariantENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEcPN6icu_788ByteSinkEbR10UErrorCode:
 1354|   592k|            UErrorCode& status) {
 1355|   592k|    if (U_FAILURE(status) || localeID.empty()) return 0;
  ------------------
  |  Branch (1355:9): [True: 0, False: 592k]
  |  Branch (1355:30): [True: 0, False: 592k]
  ------------------
 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|   592k|    constexpr int32_t MAX_VARIANTS_LENGTH = 179;
 1366|       |
 1367|       |    /* get one or more variant tags and separate them with '_' */
 1368|   592k|    size_t index = 0;
 1369|   592k|    if (_isIDSeparator(prev)) {
  ------------------
  |  Branch (1369:9): [True: 592k, False: 0]
  ------------------
 1370|       |        /* get a variant string after a '-' or '_' */
 1371|   592k|        for (std::string_view sub = localeID;;) {
 1372|   592k|            size_t next = sub.find_first_of(".@_-");
 1373|       |            // For historical reasons, a trailing separator is included in the variant.
 1374|   592k|            bool finished = next == std::string_view::npos || next + 1 == sub.length();
  ------------------
  |  Branch (1374:29): [True: 592k, False: 0]
  |  Branch (1374:63): [True: 0, False: 0]
  ------------------
 1375|   592k|            size_t limit = finished ? sub.length() : next;
  ------------------
  |  Branch (1375:28): [True: 592k, False: 0]
  ------------------
 1376|   592k|            index += limit;
 1377|   592k|            if (index > MAX_VARIANTS_LENGTH) {
  ------------------
  |  Branch (1377:17): [True: 0, False: 592k]
  ------------------
 1378|      0|                status = U_ILLEGAL_ARGUMENT_ERROR;
 1379|      0|                return 0;
 1380|      0|            }
 1381|       |
 1382|   592k|            if (sink != nullptr) {
  ------------------
  |  Branch (1382:17): [True: 592k, False: 0]
  ------------------
 1383|   592k|                if (needSeparator) {
  ------------------
  |  Branch (1383:21): [True: 0, False: 592k]
  ------------------
 1384|      0|                    sink->Append("_", 1);
 1385|   592k|                } else {
 1386|   592k|                    needSeparator = true;
 1387|   592k|                }
 1388|       |
 1389|   592k|                int32_t length = static_cast<int32_t>(limit);
 1390|   592k|                int32_t minCapacity = uprv_min(length, MAX_VARIANTS_LENGTH);
  ------------------
  |  | 1529|   592k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|   592k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   592k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   592k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1391|   592k|                char scratch[MAX_VARIANTS_LENGTH];
 1392|   592k|                int32_t capacity = 0;
 1393|   592k|                char* buffer = sink->GetAppendBuffer(
 1394|   592k|                        minCapacity, minCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity);
  ------------------
  |  |   99|   592k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1395|       |
 1396|  3.55M|                for (size_t i = 0; i < limit; ++i) {
  ------------------
  |  Branch (1396:36): [True: 2.96M, False: 592k]
  ------------------
 1397|  2.96M|                    buffer[i] = uprv_toupper(sub[i]);
  ------------------
  |  | 1547|  2.96M|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|  2.96M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.96M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.96M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1398|  2.96M|                }
 1399|   592k|                sink->Append(buffer, length);
 1400|   592k|            }
 1401|       |
 1402|   592k|            if (finished) { return index; }
  ------------------
  |  Branch (1402:17): [True: 592k, 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|   592k|    }
 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|   548k|              UErrorCode& err) {
 1807|   548k|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (1807:9): [True: 0, False: 548k]
  ------------------
 1808|      0|        return;
 1809|      0|    }
 1810|       |
 1811|   548k|    int32_t j, fieldCount=0;
 1812|   548k|    CharString tempBuffer;  // if localeID has a BCP47 extension, tmpLocaleID points to this
 1813|   548k|    CharString localeIDWithHyphens;  // if localeID has a BPC47 extension and have _, tmpLocaleID points to this
 1814|   548k|    std::string_view origLocaleID;
 1815|   548k|    std::string_view tmpLocaleID;
 1816|   548k|    size_t keywordAssign = std::string_view::npos;
 1817|   548k|    size_t separatorIndicator = std::string_view::npos;
 1818|       |
 1819|   548k|    if (_hasBCP47Extension(localeID)) {
  ------------------
  |  Branch (1819:9): [True: 0, False: 548k]
  ------------------
 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|   548k|    } else {
 1838|   548k|        tmpLocaleID=localeID;
 1839|   548k|    }
 1840|       |
 1841|   548k|    origLocaleID=tmpLocaleID;
 1842|       |
 1843|       |    /* get all pieces, one after another, and separate with '_' */
 1844|   548k|    CharString tag;
 1845|   548k|    CharString script;
 1846|   548k|    CharString country;
 1847|   548k|    CharString variant;
 1848|   548k|    const char* end = nullptr;
 1849|   548k|    ulocimp_getSubtags(
  ------------------
  |  | 1209|   548k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|   548k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   548k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   548k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1850|   548k|            tmpLocaleID,
 1851|   548k|            &tag,
 1852|   548k|            &script,
 1853|   548k|            &country,
 1854|   548k|            &variant,
 1855|   548k|            &end,
 1856|   548k|            err);
 1857|   548k|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (1857:9): [True: 0, False: 548k]
  ------------------
 1858|      0|        return;
 1859|      0|    }
 1860|   548k|    U_ASSERT(end != nullptr);
  ------------------
  |  |   35|   548k|#   define U_ASSERT(exp) (void)0
  ------------------
 1861|   548k|    if (end > tmpLocaleID.data()) {
  ------------------
  |  Branch (1861:9): [True: 454k, False: 94.1k]
  ------------------
 1862|   454k|        tmpLocaleID.remove_prefix(end - tmpLocaleID.data());
 1863|   454k|    }
 1864|       |
 1865|   548k|    if (tag.length() == I_DEFAULT_LENGTH && origLocaleID.length() >= I_DEFAULT_LENGTH &&
  ------------------
  |  Branch (1865:9): [True: 0, False: 548k]
  |  Branch (1865:45): [True: 0, False: 0]
  ------------------
 1866|   548k|            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|   548k|    } else {
 1870|   548k|        if (!script.isEmpty()) {
  ------------------
  |  Branch (1870:13): [True: 1, False: 548k]
  ------------------
 1871|      1|            ++fieldCount;
 1872|      1|            tag.append('_', err);
 1873|      1|            tag.append(script, err);
 1874|      1|        }
 1875|   548k|        if (!country.isEmpty()) {
  ------------------
  |  Branch (1875:13): [True: 446k, False: 102k]
  ------------------
 1876|   446k|            ++fieldCount;
 1877|   446k|            tag.append('_', err);
 1878|   446k|            tag.append(country, err);
 1879|   446k|        }
 1880|   548k|        if (!variant.isEmpty()) {
  ------------------
  |  Branch (1880:13): [True: 437k, False: 110k]
  ------------------
 1881|   437k|            ++fieldCount;
 1882|   437k|            if (country.isEmpty()) {
  ------------------
  |  Branch (1882:17): [True: 2, False: 437k]
  ------------------
 1883|      2|                tag.append('_', err);
 1884|      2|            }
 1885|   437k|            tag.append('_', err);
 1886|   437k|            tag.append(variant, err);
 1887|   437k|        }
 1888|   548k|    }
 1889|       |
 1890|       |    /* Copy POSIX-style charset specifier, if any [mr.utf8] */
 1891|   548k|    if (!OPTION_SET(options, _ULOC_CANONICALIZE) && !tmpLocaleID.empty() && tmpLocaleID.front() == '.') {
  ------------------
  |  | 1786|   548k|#define _ULOC_CANONICALIZE   0x1
  ------------------
  |  Branch (1891:9): [True: 548k, False: 8]
  |  Branch (1891:53): [True: 5, False: 548k]
  |  Branch (1891:77): [True: 0, False: 5]
  ------------------
 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|   548k|    if (const char* start = locale_getKeywordsStart(tmpLocaleID); start != nullptr) {
  ------------------
  |  |  138|   548k|#define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart)
  |  |  ------------------
  |  |  |  |  123|   548k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   548k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   548k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1918:67): [True: 8, False: 548k]
  ------------------
 1919|      8|        if (start > tmpLocaleID.data()) {
  ------------------
  |  Branch (1919:13): [True: 0, False: 8]
  ------------------
 1920|      0|            tmpLocaleID.remove_prefix(start - tmpLocaleID.data());
 1921|      0|        }
 1922|      8|        keywordAssign = tmpLocaleID.find('=');
 1923|      8|        separatorIndicator = tmpLocaleID.find(';');
 1924|   548k|    } else {
 1925|   548k|        tmpLocaleID = {};
 1926|   548k|    }
 1927|       |
 1928|       |    /* Copy POSIX-style variant, if any [mr@FOO] */
 1929|   548k|    if (!OPTION_SET(options, _ULOC_CANONICALIZE) &&
  ------------------
  |  | 1786|   548k|#define _ULOC_CANONICALIZE   0x1
  ------------------
  |  Branch (1929:9): [True: 548k, False: 8]
  ------------------
 1930|   548k|        !tmpLocaleID.empty() && keywordAssign == std::string_view::npos) {
  ------------------
  |  Branch (1930:9): [True: 5, False: 548k]
  |  Branch (1930:33): [True: 0, False: 5]
  ------------------
 1931|      0|        tag.append(tmpLocaleID, err);
 1932|      0|        tmpLocaleID = {};
 1933|      0|    }
 1934|       |
 1935|   548k|    if (OPTION_SET(options, _ULOC_CANONICALIZE)) {
  ------------------
  |  | 1786|   548k|#define _ULOC_CANONICALIZE   0x1
  ------------------
  |  Branch (1935:9): [True: 8, False: 548k]
  ------------------
 1936|       |        /* Handle @FOO variant if @ is present and not followed by = */
 1937|      8|        if (!tmpLocaleID.empty() && keywordAssign == std::string_view::npos) {
  ------------------
  |  Branch (1937:13): [True: 3, False: 5]
  |  Branch (1937:37): [True: 0, False: 3]
  ------------------
 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|     88|        for (j=0; j<UPRV_LENGTHOF(CANONICALIZE_MAP); j++) {
  ------------------
  |  |   99|     88|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1954:19): [True: 80, False: 8]
  ------------------
 1955|     80|            StringPiece id(CANONICALIZE_MAP[j].id);
 1956|     80|            if (tag == id) {
  ------------------
  |  Branch (1956:17): [True: 0, False: 80]
  ------------------
 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|     80|        }
 1965|      8|    }
 1966|       |
 1967|   548k|    sink.Append(tag.data(), tag.length());
 1968|       |
 1969|   548k|    if (!OPTION_SET(options, _ULOC_STRIP_KEYWORDS)) {
  ------------------
  |  | 1785|   548k|#define _ULOC_STRIP_KEYWORDS 0x2
  ------------------
  |  Branch (1969:9): [True: 134k, False: 413k]
  ------------------
 1970|   134k|        if (!tmpLocaleID.empty() && keywordAssign != std::string_view::npos &&
  ------------------
  |  Branch (1970:13): [True: 8, False: 134k]
  |  Branch (1970:37): [True: 8, False: 0]
  ------------------
 1971|   134k|            (separatorIndicator == std::string_view::npos || separatorIndicator > keywordAssign)) {
  ------------------
  |  Branch (1971:14): [True: 8, False: 0]
  |  Branch (1971:62): [True: 0, False: 0]
  ------------------
 1972|      8|            sink.Append("@", 1);
 1973|      8|            ++fieldCount;
 1974|      8|            tmpLocaleID.remove_prefix(1);
 1975|      8|            ulocimp_getKeywords(tmpLocaleID, '@', sink, true, err);
  ------------------
  |  | 1201|      8|#define ulocimp_getKeywords U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywords)
  |  |  ------------------
  |  |  |  |  123|      8|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      8|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      8|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1976|      8|        }
 1977|   134k|    }
 1978|   548k|}
uloc.cpp:_ZN12_GLOBAL__N_110OPTION_SETEjj:
 1790|  2.19M|inline bool OPTION_SET(uint32_t options, uint32_t mask) { return (options & mask) != 0; }
uloc.cpp:_ZZ23uloc_getKeywordValue_78ENK3$_0clERN6icu_788ByteSinkER10UErrorCode:
  741|   102k|        [&](ByteSink& sink, UErrorCode& status) {
  742|   102k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  ------------------
  |  | 1200|   102k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  743|   102k|        },
uloc.cpp:_ZZ26ulocimp_getKeywordValue_78PKcNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES7_:
  753|  99.1k|        [&](ByteSink& sink, UErrorCode& status) {
  754|  99.1k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  ------------------
  |  | 1200|  99.1k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  99.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  99.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  99.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  755|  99.1k|        },
uloc.cpp:_ZZ20ulocimp_getRegion_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 1477|  46.5k|        [&](ByteSink& sink, UErrorCode& status) {
 1478|  46.5k|            ulocimp_getSubtags(
  ------------------
  |  | 1209|  46.5k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  46.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  46.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  46.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1479|  46.5k|                    localeID,
 1480|  46.5k|                    nullptr,
 1481|  46.5k|                    nullptr,
 1482|  46.5k|                    &sink,
 1483|  46.5k|                    nullptr,
 1484|  46.5k|                    nullptr,
 1485|  46.5k|                    status);
 1486|  46.5k|        },
uloc.cpp:_ZZ20ulocimp_getParent_78PKcR10UErrorCodeENK3$_0clERN6icu_788ByteSinkES2_:
 2003|  66.9k|        [&](ByteSink& sink, UErrorCode& status) {
 2004|  66.9k|            ulocimp_getParent(localeID, sink, status);
  ------------------
  |  | 1205|  66.9k|#define ulocimp_getParent U_ICU_ENTRY_POINT_RENAME(ulocimp_getParent)
  |  |  ------------------
  |  |  |  |  123|  66.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  66.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  66.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2005|  66.9k|        },
uloc.cpp:_ZZ18ulocimp_getName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 2161|  44.4k|        [&](ByteSink& sink, UErrorCode& status) {
 2162|  44.4k|            ulocimp_getName(localeID, sink, status);
  ------------------
  |  | 1204|  44.4k|#define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2163|  44.4k|        },
uloc.cpp:_ZZ22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 2197|   413k|        [&](ByteSink& sink, UErrorCode& status) {
 2198|   413k|            ulocimp_getBaseName(localeID, sink, status);
  ------------------
  |  | 1199|   413k|#define ulocimp_getBaseName U_ICU_ENTRY_POINT_RENAME(ulocimp_getBaseName)
  |  |  ------------------
  |  |  |  |  123|   413k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   413k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   413k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2199|   413k|        },
uloc.cpp:_ZZ23ulocimp_canonicalize_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 2233|      8|        [&](ByteSink& sink, UErrorCode& status) {
 2234|      8|            ulocimp_canonicalize(localeID, sink, status);
  ------------------
  |  | 1197|      8|#define ulocimp_canonicalize U_ICU_ENTRY_POINT_RENAME(ulocimp_canonicalize)
  |  |  ------------------
  |  |  |  |  123|      8|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      8|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      8|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2235|      8|        },

loclikely.cpp:_ZN12_GLOBAL__N_114_isIDSeparatorEc:
   49|     10|inline bool _isIDSeparator(char a) { return a == '_' || a == '-'; }
  ------------------
  |  Branch (49:45): [True: 0, False: 10]
  |  Branch (49:57): [True: 0, False: 10]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_114_isIDSeparatorEc:
   49|  15.5M|inline bool _isIDSeparator(char a) { return a == '_' || a == '-'; }
  ------------------
  |  Branch (49:45): [True: 6.41M, False: 9.14M]
  |  Branch (49:57): [True: 0, False: 9.14M]
  ------------------

uprv_max_78:
   17|  1.53M|{
   18|  1.53M|    return (x > y ? x : y);
  ------------------
  |  Branch (18:13): [True: 0, False: 1.53M]
  ------------------
   19|  1.53M|}
uprv_min_78:
   23|  1.21M|{
   24|  1.21M|    return (x > y ? y : x);
  ------------------
  |  Branch (24:13): [True: 154k, False: 1.06M]
  ------------------
   25|  1.21M|}

_ZN6icu_786UMutex8getMutexEv:
   80|      7|std::mutex *UMutex::getMutex() {
   81|      7|    std::mutex *retPtr = fMutex.load(std::memory_order_acquire);
   82|      7|    if (retPtr == nullptr) {
  ------------------
  |  Branch (82:9): [True: 7, False: 0]
  ------------------
   83|      7|        std::call_once(*pInitFlag, umtx_init);
   84|      7|        std::lock_guard<std::mutex> guard(*initMutex);
   85|      7|        retPtr = fMutex.load(std::memory_order_acquire);
   86|      7|        if (retPtr == nullptr) {
  ------------------
  |  Branch (86:13): [True: 7, False: 0]
  ------------------
   87|      7|            fMutex = new(fStorage) std::mutex();
   88|      7|            retPtr = fMutex;
   89|      7|            fListLink = gListHead;
   90|      7|            gListHead = this;
   91|      7|        }
   92|      7|    }
   93|      7|    U_ASSERT(retPtr != nullptr);
  ------------------
  |  |   35|      7|#   define U_ASSERT(exp) (void)0
  ------------------
   94|      7|    return retPtr;
   95|      7|}
umtx_lock_78:
  112|  5.58M|umtx_lock(UMutex *mutex) {
  113|  5.58M|    if (mutex == nullptr) {
  ------------------
  |  Branch (113:9): [True: 44.5k, False: 5.53M]
  ------------------
  114|  44.5k|        mutex = &globalMutex;
  115|  44.5k|    }
  116|  5.58M|    mutex->lock();
  117|  5.58M|}
umtx_unlock_78:
  122|  5.58M|{
  123|  5.58M|    if (mutex == nullptr) {
  ------------------
  |  Branch (123:9): [True: 44.5k, False: 5.53M]
  ------------------
  124|  44.5k|        mutex = &globalMutex;
  125|  44.5k|    }
  126|  5.58M|    mutex->unlock();
  127|  5.58M|}
_ZN6icu_7820umtx_initImplPreInitERNS_9UInitOnceE:
  145|     14|umtx_initImplPreInit(UInitOnce &uio) {
  146|     14|    std::call_once(*pInitFlag, umtx_init);
  147|     14|    std::unique_lock<std::mutex> lock(*initMutex);
  148|     14|    if (umtx_loadAcquire(uio.fState) == 0) {
  ------------------
  |  Branch (148:9): [True: 14, False: 0]
  ------------------
  149|     14|        umtx_storeRelease(uio.fState, 1);
  150|     14|        return true;      // Caller will next call the init function.
  151|     14|    } 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|     14|}
_ZN6icu_7821umtx_initImplPostInitERNS_9UInitOnceE:
  170|     14|umtx_initImplPostInit(UInitOnce &uio) {
  171|     14|    {
  172|     14|        std::unique_lock<std::mutex> lock(*initMutex);
  173|     14|        umtx_storeRelease(uio.fState, 2);
  174|     14|    }
  175|     14|    initCondition->notify_all();
  176|     14|}
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_7813umtx_initOnceERNS_9UInitOnceEPFvR10UErrorCodeES3_:
  135|  1.00M|inline void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(UErrorCode &), UErrorCode &errCode) {
  136|  1.00M|    if (U_FAILURE(errCode)) {
  ------------------
  |  Branch (136:9): [True: 1, False: 1.00M]
  ------------------
  137|      1|        return;
  138|      1|    }
  139|  1.00M|    if (umtx_loadAcquire(uio.fState) != 2 && umtx_initImplPreInit(uio)) {
  ------------------
  |  Branch (139:9): [True: 9, False: 1.00M]
  |  Branch (139:46): [True: 9, False: 0]
  ------------------
  140|       |        // We run the initialization.
  141|      9|        (*fp)(errCode);
  142|      9|        uio.fErrCode = errCode;
  143|      9|        umtx_initImplPostInit(uio);
  144|  1.00M|    } else {
  145|       |        // Someone else already ran the initialization.
  146|  1.00M|        if (U_FAILURE(uio.fErrCode)) {
  ------------------
  |  Branch (146:13): [True: 0, False: 1.00M]
  ------------------
  147|      0|            errCode = uio.fErrCode;
  148|      0|        }
  149|  1.00M|    }
  150|  1.00M|}
_ZN6icu_7816umtx_loadAcquireERNSt3__16atomicIiEE:
   75|  56.1M|inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) {
   76|  56.1M|    return var.load(std::memory_order_acquire);
   77|  56.1M|}
_ZN6icu_789UInitOnce5resetEv:
  101|   224k|    void reset() {fState = 0;}
_ZN6icu_789UInitOnce7isResetEv:
  102|      4|    UBool isReset() {return umtx_loadAcquire(fState) == 0;}
_ZN6icu_786UMutex4lockEv:
  229|  5.58M|    void lock() {
  230|  5.58M|        std::mutex *m = fMutex.load(std::memory_order_acquire);
  231|  5.58M|        if (m == nullptr) { m = getMutex(); }
  ------------------
  |  Branch (231:13): [True: 7, False: 5.58M]
  ------------------
  232|  5.58M|        m->lock();
  233|  5.58M|    }
_ZN6icu_786UMutex6unlockEv:
  234|  5.58M|    void unlock() { fMutex.load(std::memory_order_relaxed)->unlock(); }
_ZN6icu_7817umtx_storeReleaseERNSt3__16atomicIiEEi:
   79|   154k|inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) {
   80|   154k|    var.store(val, std::memory_order_release);
   81|   154k|}
_ZN6icu_7815umtx_atomic_incEPNSt3__16atomicIiEE:
   83|  1.09M|inline int32_t umtx_atomic_inc(u_atomic_int32_t *var) {
   84|  1.09M|    return var->fetch_add(1) + 1;
   85|  1.09M|}
_ZN6icu_7815umtx_atomic_decEPNSt3__16atomicIiEE:
   87|  1.49M|inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) {
   88|  1.49M|    return var->fetch_sub(1) - 1;
   89|  1.49M|}
_ZN6icu_7813umtx_initOnceERNS_9UInitOnceEPFvvE:
  123|   168k|inline void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)()) {
  124|   168k|    if (umtx_loadAcquire(uio.fState) == 2) {
  ------------------
  |  Branch (124:9): [True: 168k, False: 4]
  ------------------
  125|   168k|        return;
  126|   168k|    }
  127|      4|    if (umtx_initImplPreInit(uio)) {
  ------------------
  |  Branch (127:9): [True: 4, False: 0]
  ------------------
  128|      4|        (*fp)();
  129|      4|        umtx_initImplPostInit(uio);
  130|      4|    }
  131|      4|}
_ZN6icu_7813umtx_initOnceI15UPropertySourceEEvRNS_9UInitOnceEPFvT_R10UErrorCodeES4_S6_:
  166|      2|template<class T> void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(T, UErrorCode &), T context, UErrorCode &errCode) {
  167|      2|    if (U_FAILURE(errCode)) {
  ------------------
  |  Branch (167:9): [True: 0, False: 2]
  ------------------
  168|      0|        return;
  169|      0|    }
  170|      2|    if (umtx_loadAcquire(uio.fState) != 2 && umtx_initImplPreInit(uio)) {
  ------------------
  |  Branch (170:9): [True: 1, False: 1]
  |  Branch (170:46): [True: 1, False: 0]
  ------------------
  171|       |        // We run the initialization.
  172|      1|        (*fp)(context, errCode);
  173|      1|        uio.fErrCode = errCode;
  174|      1|        umtx_initImplPostInit(uio);
  175|      1|    } else {
  176|       |        // Someone else already ran the initialization.
  177|      1|        if (U_FAILURE(uio.fErrCode)) {
  ------------------
  |  Branch (177:13): [True: 0, False: 1]
  ------------------
  178|      0|            errCode = uio.fErrCode;
  179|      0|        }
  180|      1|    }
  181|      2|}

_ZN6icu_788ByteSinkC2Ev:
   59|  4.75M|  ByteSink() { }
_ZNK6icu_7820CheckedArrayByteSink10OverflowedEv:
  240|   192k|  UBool Overflowed() const { return overflowed_; }
_ZNK6icu_7820CheckedArrayByteSink21NumberOfBytesAppendedEv:
  248|   656k|  int32_t NumberOfBytesAppended() const { return appended_; }

_ZN6icu_789BytesTrie5resetEv:
   96|     27|    BytesTrie &reset() {
   97|     27|        pos_=bytes_;
   98|     27|        remainingMatchLength_=-1;
   99|     27|        return *this;
  100|     27|    }
_ZNK6icu_789BytesTrie8getValueEv:
  246|     11|    inline int32_t getValue() const {
  247|     11|        const uint8_t *pos=pos_;
  248|     11|        int32_t leadByte=*pos++;
  249|       |        // U_ASSERT(leadByte>=kMinValueLead);
  250|     11|        return readValue(pos, leadByte>>1);
  251|     11|    }
_ZN6icu_789BytesTrieC2EPKv:
   72|      3|            : ownedArray_(nullptr), bytes_(static_cast<const uint8_t *>(trieBytes)),
   73|      3|              pos_(bytes_), remainingMatchLength_(-1) {}
_ZN6icu_789BytesTrieC2ERKS0_:
   88|      8|            : ownedArray_(nullptr), bytes_(other.bytes_),
   89|      8|              pos_(other.pos_), remainingMatchLength_(other.remainingMatchLength_) {}
_ZNK6icu_789BytesTrie10getState64Ev:
  110|     44|    uint64_t getState64() const {
  111|     44|        return (static_cast<uint64_t>(remainingMatchLength_ + 2) << kState64RemainingShift) |
  112|     44|            static_cast<uint64_t>(pos_ - bytes_);
  113|     44|    }
_ZN6icu_789BytesTrie14resetToState64Em:
  129|      5|    BytesTrie &resetToState64(uint64_t state) {
  130|      5|        remainingMatchLength_ = static_cast<int32_t>(state >> kState64RemainingShift) - 2;
  131|      5|        pos_ = bytes_ + (state & kState64PosMask);
  132|      5|        return *this;
  133|      5|    }
_ZN6icu_789BytesTrie9skipValueEPKhi:
  406|     56|    static inline const uint8_t *skipValue(const uint8_t *pos, int32_t leadByte) {
  407|       |        // U_ASSERT(leadByte>=kMinValueLead);
  408|     56|        if(leadByte>=(kMinTwoByteValueLead<<1)) {
  ------------------
  |  Branch (408:12): [True: 48, False: 8]
  ------------------
  409|     48|            if(leadByte<(kMinThreeByteValueLead<<1)) {
  ------------------
  |  Branch (409:16): [True: 48, False: 0]
  ------------------
  410|     48|                ++pos;
  411|     48|            } else if(leadByte<(kFourByteValueLead<<1)) {
  ------------------
  |  Branch (411:23): [True: 0, False: 0]
  ------------------
  412|      0|                pos+=2;
  413|      0|            } else {
  414|      0|                pos+=3+((leadByte>>1)&1);
  415|      0|            }
  416|     48|        }
  417|     56|        return pos;
  418|     56|    }
_ZN6icu_789BytesTrie9skipValueEPKh:
  419|     54|    static inline const uint8_t *skipValue(const uint8_t *pos) {
  420|     54|        int32_t leadByte=*pos++;
  421|     54|        return skipValue(pos, leadByte);
  422|     54|    }
_ZN6icu_789BytesTrie9skipDeltaEPKh:
  427|     55|    static inline const uint8_t *skipDelta(const uint8_t *pos) {
  428|     55|        int32_t delta=*pos++;
  429|     55|        if(delta>=kMinTwoByteDeltaLead) {
  ------------------
  |  Branch (429:12): [True: 45, False: 10]
  ------------------
  430|     45|            if(delta<kMinThreeByteDeltaLead) {
  ------------------
  |  Branch (430:16): [True: 31, False: 14]
  ------------------
  431|     31|                ++pos;
  432|     31|            } else if(delta<kFourByteDeltaLead) {
  ------------------
  |  Branch (432:23): [True: 14, False: 0]
  ------------------
  433|     14|                pos+=2;
  434|     14|            } else {
  435|      0|                pos+=3+(delta&1);
  436|      0|            }
  437|     45|        }
  438|     55|        return pos;
  439|     55|    }
_ZN6icu_789BytesTrie11valueResultEi:
  441|      4|    static inline UStringTrieResult valueResult(int32_t node) {
  442|      4|        return static_cast<UStringTrieResult>(USTRINGTRIE_INTERMEDIATE_VALUE - (node & kValueIsFinal));
  443|      4|    }

_ZN6icu_7814ConstChar16PtrC2EPKDs:
  229|  5.12M|ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p_(p) {}
_ZN6icu_7814ConstChar16PtrD2Ev:
  237|  5.12M|ConstChar16Ptr::~ConstChar16Ptr() {
  238|  5.12M|    U_ALIASING_BARRIER(p_);
  ------------------
  |  |   35|  5.12M|#   define U_ALIASING_BARRIER(ptr) asm volatile("" : : "rm"(ptr) : "memory")
  ------------------
  239|  5.12M|}
_ZNK6icu_789Char16PtrcvPDsEv:
   97|  13.4k|    inline operator char16_t *() const { return get(); }
_ZNK6icu_7814ConstChar16PtrcvPKDsEv:
  205|  5.12M|    inline operator const char16_t *() const { return get(); }
_ZNK6icu_789Char16Ptr3getEv:
  133|  13.4k|char16_t *Char16Ptr::get() const { return p_; }
_ZNK6icu_7814ConstChar16Ptr3getEv:
  241|  5.12M|const char16_t *ConstChar16Ptr::get() const { return p_; }
_ZN6icu_788internal15toU16StringViewENSt3__117basic_string_viewIDsNS1_11char_traitsIDsEEEE:
  400|   216k|inline std::u16string_view toU16StringView(std::u16string_view sv) { return sv; }
_ZN6icu_788internal23toU16StringViewNullableINSt3__117basic_string_viewIDsNS2_11char_traitsIDsEEEEvEES6_RKT_:
  430|  6.03k|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|  6.03k|    return toU16StringView(text);
  432|  6.03k|}
_ZN6icu_788internal23toU16StringViewNullableIPKDsvvEENSt3__117basic_string_viewIDsNS4_11char_traitsIDsEEEERKT_:
  441|  56.1k|inline std::u16string_view toU16StringViewNullable(const T& text) {
  442|  56.1k|    if (text == nullptr) return {};  // For backward compatibility.
  ------------------
  |  Branch (442:9): [True: 0, False: 56.1k]
  ------------------
  443|  56.1k|    return toU16StringView(text);
  444|  56.1k|}
_ZN6icu_788internal23toU16StringViewNullableIA2_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|   154k|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|   154k|    return toU16StringView(text);
  432|   154k|}
_ZN6icu_788internal23toU16StringViewNullableIA6_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|     19|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|     19|    return toU16StringView(text);
  432|     19|}
_ZN6icu_789Char16PtrC2EPDs:
  121|  13.3k|Char16Ptr::Char16Ptr(char16_t *p) : p_(p) {}
_ZN6icu_789Char16PtrD2Ev:
  129|  13.3k|Char16Ptr::~Char16Ptr() {
  130|  13.3k|    U_ALIASING_BARRIER(p_);
  ------------------
  |  |   35|  13.3k|#   define U_ALIASING_BARRIER(ptr) asm volatile("" : : "rm"(ptr) : "memory")
  ------------------
  131|  13.3k|}

_ZN6icu_785EditsC2Ev:
   87|  6.42k|            array(stackArray), capacity(STACK_CAPACITY), length(0), delta(0), numChanges(0),
   88|  6.42k|            errorCode_(U_ZERO_ERROR) {}
_ZNK6icu_785Edits11lengthDeltaEv:
  172|  6.42k|    int32_t lengthDelta() const { return delta; }
_ZN6icu_785Edits8Iterator4nextER10UErrorCode:
  232|   111k|        UBool next(UErrorCode &errorCode) { return next(onlyChanges_, errorCode); }
_ZNK6icu_785Edits8Iterator9oldLengthEv:
  343|   106k|        int32_t oldLength() const { return oldLength_; }
_ZNK6icu_785Edits8Iterator9newLengthEv:
  354|   106k|        int32_t newLength() const { return newLength_; }
_ZNK6icu_785Edits8Iterator16replacementIndexEv:
  380|   106k|        int32_t replacementIndex() const {
  381|       |            // TODO: Throw an exception if we aren't in a change edit?
  382|   106k|            return replIndex;
  383|   106k|        }
_ZNK6icu_785Edits8Iterator16destinationIndexEv:
  392|   106k|        int32_t destinationIndex() const { return destIndex; }
_ZNK6icu_785Edits24getCoarseChangesIteratorEv:
  438|  4.64k|    Iterator getCoarseChangesIterator() const {
  439|  4.64k|        return Iterator(array, length, true, true);
  440|  4.64k|    }
_ZN6icu_785Edits11setLastUnitEi:
  511|  1.27M|    void setLastUnit(int32_t last) { array[length - 1] = static_cast<uint16_t>(last); }
_ZNK6icu_785Edits8lastUnitEv:
  512|  2.81M|    int32_t lastUnit() const { return length > 0 ? array[length - 1] : 0xffff; }
  ------------------
  |  Branch (512:39): [True: 2.80M, False: 6.42k]
  ------------------

_ZN6icu_787EnumSetI27UDateFormatBooleanAttributeLj0ELj4EEC2Ev:
   36|  56.1k|    inline EnumSet() : fBools(0) {}
_ZN6icu_787EnumSetI27UDateFormatBooleanAttributeLj0ELj4EED2Ev:
   38|  56.1k|    inline ~EnumSet() {}
_ZNK6icu_787EnumSetI27UDateFormatBooleanAttributeLj0ELj4EE12isValidValueEi:
   47|   224k|    inline UBool isValidValue(int32_t v) const { return (v==0||v==1); }
  ------------------
  |  Branch (47:58): [True: 0, False: 224k]
  |  Branch (47:64): [True: 224k, False: 0]
  ------------------
_ZN6icu_787EnumSetI27UDateFormatBooleanAttributeLj0ELj4EE3setES1_i:
   44|   224k|    inline void set(T toSet, int32_t v) { fBools=(fBools&(~flag(toSet)))|(v?(flag(toSet)):0); }
  ------------------
  |  Branch (44:75): [True: 224k, False: 0]
  ------------------
_ZNK6icu_787EnumSetI27UDateFormatBooleanAttributeLj0ELj4EE4flagES1_:
   59|   449k|    inline uint32_t flag(T toCheck) const { return (1<<(toCheck-minValue)); }

_ZNK6icu_7816LocalPointerBaseINS_8message210data_model3KeyEE8getAliasEv:
  122|    538|    T *getAlias() const { return ptr; }
_ZN6icu_784swapERNS_10LocalArrayINS_8message210data_model6OptionEEES5_:
  466|   124k|    friend inline void swap(LocalArray<T> &p1, LocalArray<T> &p2) noexcept {
  467|   124k|        p1.swap(p2);
  468|   124k|    }
_ZN6icu_7810LocalArrayINS_8message210data_model6OptionEE4swapERS4_:
  455|   124k|    void swap(LocalArray<T> &other) noexcept {
  456|   124k|        T *temp=LocalPointerBase<T>::ptr;
  457|   124k|        LocalPointerBase<T>::ptr=other.ptr;
  458|   124k|        other.ptr=temp;
  459|   124k|    }
_ZNK6icu_7816LocalPointerBaseINS_8message210data_model6OptionEE8getAliasEv:
  122|   196k|    T *getAlias() const { return ptr; }
_ZN6icu_784swapERNS_10LocalArrayINS_8message210data_model11PatternPartEEES5_:
  466|  15.3k|    friend inline void swap(LocalArray<T> &p1, LocalArray<T> &p2) noexcept {
  467|  15.3k|        p1.swap(p2);
  468|  15.3k|    }
_ZN6icu_7810LocalArrayINS_8message210data_model11PatternPartEE4swapERS4_:
  455|  15.3k|    void swap(LocalArray<T> &other) noexcept {
  456|  15.3k|        T *temp=LocalPointerBase<T>::ptr;
  457|  15.3k|        LocalPointerBase<T>::ptr=other.ptr;
  458|  15.3k|        other.ptr=temp;
  459|  15.3k|    }
_ZNK6icu_7816LocalPointerBaseINS_8message210data_model7BindingEE8getAliasEv:
  122|    503|    T *getAlias() const { return ptr; }
_ZNK6icu_7816LocalPointerBaseINS_13UnicodeStringEE8getAliasEv:
  122|     52|    T *getAlias() const { return ptr; }
_ZN6icu_784swapERNS_10LocalArrayINS_8message210data_model7BindingEEES5_:
  466|  8.09k|    friend inline void swap(LocalArray<T> &p1, LocalArray<T> &p2) noexcept {
  467|  8.09k|        p1.swap(p2);
  468|  8.09k|    }
_ZN6icu_7810LocalArrayINS_8message210data_model7BindingEE4swapERS4_:
  455|  8.09k|    void swap(LocalArray<T> &other) noexcept {
  456|  8.09k|        T *temp=LocalPointerBase<T>::ptr;
  457|  8.09k|        LocalPointerBase<T>::ptr=other.ptr;
  458|  8.09k|        other.ptr=temp;
  459|  8.09k|    }
_ZN6icu_7812LocalPointerINS_7UVectorEEC2EPS1_R10UErrorCode:
  214|      1|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|      1|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 1]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|      1|    }
_ZN6icu_7816LocalPointerBaseINS_7UVectorEEC2EPS1_:
   82|   183k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_7UVectorEED2Ev:
  245|   183k|    ~LocalPointer() {
  246|   183k|        delete LocalPointerBase<T>::ptr;
  247|   183k|    }
_ZN6icu_7816LocalPointerBaseINS_7UVectorEED2Ev:
   88|   183k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_7UVectorEEptEv:
  134|  25.0k|    T *operator->() const { return ptr; }
_ZN6icu_7812LocalPointerINS_13UnicodeStringEEC2EPS1_R10UErrorCode:
  214|    119|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|    119|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 119]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|    119|    }
_ZN6icu_7816LocalPointerBaseINS_13UnicodeStringEEC2EPS1_:
   82|    171|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_13UnicodeStringEED2Ev:
  245|    119|    ~LocalPointer() {
  246|    119|        delete LocalPointerBase<T>::ptr;
  247|    119|    }
_ZN6icu_7816LocalPointerBaseINS_13UnicodeStringEED2Ev:
   88|    171|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_13UnicodeStringEE6orphanEv:
  141|    171|    T *orphan() {
  142|    171|        T *p=ptr;
  143|    171|        ptr=nullptr;
  144|    171|        return p;
  145|    171|    }
_ZN6icu_7812LocalPointerINS_7UVectorEEC2EPS1_:
  200|   183k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_7UVectorEE6orphanEv:
  141|   166k|    T *orphan() {
  142|   166k|        T *p=ptr;
  143|   166k|        ptr=nullptr;
  144|   166k|        return p;
  145|   166k|    }
_ZN6icu_7812LocalPointerINS_12NumberFormatEEC2EPS1_:
  200|      2|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_12NumberFormatEEC2EPS1_:
   82|      2|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZNK6icu_7816LocalPointerBaseINS_12NumberFormatEEptEv:
  134|      2|    T *operator->() const { return ptr; }
_ZN6icu_7812LocalPointerINS_12NumberFormatEED2Ev:
  245|      2|    ~LocalPointer() {
  246|      2|        delete LocalPointerBase<T>::ptr;
  247|      2|    }
_ZN6icu_7816LocalPointerBaseINS_12NumberFormatEED2Ev:
   88|      2|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_10DateFormatEEC2EPS1_:
   82|  36.9k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_10DateFormatEED2Ev:
  245|  36.9k|    ~LocalPointer() {
  246|  36.9k|        delete LocalPointerBase<T>::ptr;
  247|  36.9k|    }
_ZN6icu_7816LocalPointerBaseINS_10DateFormatEED2Ev:
   88|  36.9k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_15NumberingSystemEEC2EPS1_:
  200|  44.4k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_15NumberingSystemEEC2EPS1_:
   82|   133k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_15NumberingSystemEED2Ev:
  245|   133k|    ~LocalPointer() {
  246|   133k|        delete LocalPointerBase<T>::ptr;
  247|   133k|    }
_ZN6icu_7816LocalPointerBaseINS_15NumberingSystemEED2Ev:
   88|   133k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_15NumberingSystemEE6orphanEv:
  141|  88.9k|    T *orphan() {
  142|  88.9k|        T *p=ptr;
  143|  88.9k|        ptr=nullptr;
  144|  88.9k|        return p;
  145|  88.9k|    }
_ZN6icu_7812LocalPointerINS_11PluralRulesEEC2EPS1_:
  200|  98.5k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_11PluralRulesEEC2EPS1_:
   82|   119k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_11PluralRulesEED2Ev:
  245|   119k|    ~LocalPointer() {
  246|   119k|        delete LocalPointerBase<T>::ptr;
  247|   119k|    }
_ZN6icu_7816LocalPointerBaseINS_11PluralRulesEED2Ev:
   88|   119k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_11PluralRulesEEptEv:
  134|  42.4k|    T *operator->() const { return ptr; }
_ZN6icu_7810LocalArrayINS_8message210data_model6OptionEEC2EPS3_:
  375|  1.00M|    explicit LocalArray(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_8message210data_model6OptionEEC2EPS3_:
   82|  1.00M|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7810LocalArrayINS_8message210data_model3KeyEEC2EPS3_:
  375|  1.62k|    explicit LocalArray(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_8message210data_model3KeyEEC2EPS3_:
   82|  1.62k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZNK6icu_7816LocalPointerBaseINS_18CurrencyPluralInfoEE6isNullEv:
   94|   541k|    UBool isNull() const { return ptr==nullptr; }
_ZN6icu_7812LocalPointerINS_18CurrencyPluralInfoEE12adoptInsteadEPS1_:
  300|   119k|    void adoptInstead(T *p) {
  301|   119k|        delete LocalPointerBase<T>::ptr;
  302|   119k|        LocalPointerBase<T>::ptr=p;
  303|   119k|    }
_ZN6icu_7812LocalPointerIKNS_20DecimalFormatSymbolsEED2Ev:
  245|   119k|    ~LocalPointer() {
  246|   119k|        delete LocalPointerBase<T>::ptr;
  247|   119k|    }
_ZN6icu_7816LocalPointerBaseIKNS_20DecimalFormatSymbolsEED2Ev:
   88|   119k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_11PluralRulesEE8getAliasEv:
  122|  21.2k|    T *getAlias() const { return ptr; }
_ZN6icu_7810LocalArrayINS_13UnicodeStringEED2Ev:
  420|     52|    ~LocalArray() {
  421|     52|        delete[] LocalPointerBase<T>::ptr;
  422|     52|    }
_ZN6icu_7812LocalPointerIKNS_20DecimalFormatSymbolsEEC2EPS2_:
  200|   119k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_20DecimalFormatSymbolsEEC2EPS2_:
   82|   119k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_20DecimalFormatSymbolsEEC2EPS1_R10UErrorCode:
  214|  42.4k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  42.4k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 42.4k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  42.4k|    }
_ZN6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEEC2EPS1_:
   82|  42.4k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_20DecimalFormatSymbolsEED2Ev:
  245|  42.4k|    ~LocalPointer() {
  246|  42.4k|        delete LocalPointerBase<T>::ptr;
  247|  42.4k|    }
_ZN6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEED2Ev:
   88|  42.4k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEE8getAliasEv:
  122|      2|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerIKNS_20DecimalFormatSymbolsEE12adoptInsteadEPS2_:
  300|   175k|    void adoptInstead(T *p) {
  301|   175k|        delete LocalPointerBase<T>::ptr;
  302|   175k|        LocalPointerBase<T>::ptr=p;
  303|   175k|    }
_ZN6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEE6orphanEv:
  141|  42.4k|    T *orphan() {
  142|  42.4k|        T *p=ptr;
  143|  42.4k|        ptr=nullptr;
  144|  42.4k|        return p;
  145|  42.4k|    }
_ZN6icu_788internal16LocalOpenPointerI15UResourceBundleXadL_Z13ures_close_78EEEC2EPS2_:
  567|  1.01M|    explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase<Type>(p) {}
_ZN6icu_7816LocalPointerBaseI15UResourceBundleEC2EPS1_:
   82|  1.01M|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZNK6icu_7816LocalPointerBaseI15UResourceBundleE8getAliasEv:
  122|  2.02M|    T *getAlias() const { return ptr; }
_ZN6icu_788internal16LocalOpenPointerI15UResourceBundleXadL_Z13ures_close_78EEED2Ev:
  575|  1.01M|    ~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } }
  ------------------
  |  Branch (575:31): [True: 882k, False: 134k]
  ------------------
_ZN6icu_7816LocalPointerBaseI15UResourceBundleED2Ev:
   88|  1.01M|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7810LocalArrayINS_13UnicodeStringEEC2EPS1_R10UErrorCode:
  389|     52|    LocalArray(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  390|     52|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (390:12): [True: 0, False: 52]
  |  Branch (390:26): [True: 0, False: 0]
  ------------------
  391|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  392|      0|        }
  393|     52|    }
_ZN6icu_7812LocalPointerINS_18CurrencyPluralInfoEEC2EPS1_:
  200|   197k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_18CurrencyPluralInfoEEC2EPS1_:
   82|   197k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_18CurrencyPluralInfoEED2Ev:
  245|   197k|    ~LocalPointer() {
  246|   197k|        delete LocalPointerBase<T>::ptr;
  247|   197k|    }
_ZN6icu_7816LocalPointerBaseINS_18CurrencyPluralInfoEED2Ev:
   88|   197k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_15NumberingSystemEE12adoptInsteadEPS1_:
  300|  44.4k|    void adoptInstead(T *p) {
  301|  44.4k|        delete LocalPointerBase<T>::ptr;
  302|  44.4k|        LocalPointerBase<T>::ptr=p;
  303|  44.4k|    }
_ZNK6icu_7816LocalPointerBaseINS_15NumberingSystemEE8getAliasEv:
  122|  44.4k|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerINS_20DecimalFormatSymbolsEEC2EPS1_:
  200|      2|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7812LocalPointerINS_20DecimalFormatSymbolsEE29adoptInsteadAndCheckErrorCodeEPS1_R10UErrorCode:
  319|      2|    void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) {
  320|      2|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (320:12): [True: 2, False: 0]
  ------------------
  321|      2|            delete LocalPointerBase<T>::ptr;
  322|      2|            LocalPointerBase<T>::ptr=p;
  323|      2|            if(p==nullptr) {
  ------------------
  |  Branch (323:16): [True: 0, False: 2]
  ------------------
  324|      0|                errorCode=U_MEMORY_ALLOCATION_ERROR;
  325|      0|            }
  326|      2|        } else {
  327|      0|            delete p;
  328|      0|        }
  329|      2|    }
_ZN6icu_7812LocalPointerINS_12NumberFormatEE12adoptInsteadEPS1_:
  300|      2|    void adoptInstead(T *p) {
  301|      2|        delete LocalPointerBase<T>::ptr;
  302|      2|        LocalPointerBase<T>::ptr=p;
  303|      2|    }
_ZN6icu_7812LocalPointerINS_13DecimalFormatEEC2EPS1_:
  200|  77.3k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_13DecimalFormatEEC2EPS1_:
   82|  77.3k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_13DecimalFormatEED2Ev:
  245|  77.3k|    ~LocalPointer() {
  246|  77.3k|        delete LocalPointerBase<T>::ptr;
  247|  77.3k|    }
_ZN6icu_7816LocalPointerBaseINS_13DecimalFormatEED2Ev:
   88|  77.3k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_13DecimalFormatEE7isValidEv:
  100|  77.3k|    UBool isValid() const { return ptr!=nullptr; }
_ZNK6icu_7816LocalPointerBaseINS_13DecimalFormatEEptEv:
  134|  77.3k|    T *operator->() const { return ptr; }
_ZN6icu_7816LocalPointerBaseINS_13DecimalFormatEE6orphanEv:
  141|  77.3k|    T *orphan() {
  142|  77.3k|        T *p=ptr;
  143|  77.3k|        ptr=nullptr;
  144|  77.3k|        return p;
  145|  77.3k|    }
_ZN6icu_7816LocalPointerBaseINS_12NumberFormatEE6orphanEv:
  141|      2|    T *orphan() {
  142|      2|        T *p=ptr;
  143|      2|        ptr=nullptr;
  144|      2|        return p;
  145|      2|    }
_ZN6icu_7812LocalPointerINS_15NumberingSystemEEC2EPS1_R10UErrorCode:
  214|  88.9k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  88.9k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 88.9k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  88.9k|    }
_ZNK6icu_7816LocalPointerBaseINS_15NumberingSystemEEptEv:
  134|   222k|    T *operator->() const { return ptr; }
_ZN6icu_7812LocalPointerINS_11PluralRulesEEC2EPS1_R10UErrorCode:
  214|  21.2k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  21.2k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 21.2k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  21.2k|    }
_ZN6icu_7816LocalPointerBaseINS_11PluralRulesEE6orphanEv:
  141|  21.2k|    T *orphan() {
  142|  21.2k|        T *p=ptr;
  143|  21.2k|        ptr=nullptr;
  144|  21.2k|        return p;
  145|  21.2k|    }
_ZN6icu_7812LocalPointerINS_20StandardPluralRangesEED2Ev:
  245|  21.2k|    ~LocalPointer() {
  246|  21.2k|        delete LocalPointerBase<T>::ptr;
  247|  21.2k|    }
_ZN6icu_7816LocalPointerBaseINS_20StandardPluralRangesEED2Ev:
   88|  21.2k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_20StandardPluralRangesEE6orphanEv:
  141|  21.2k|    T *orphan() {
  142|  21.2k|        T *p=ptr;
  143|  21.2k|        ptr=nullptr;
  144|  21.2k|        return p;
  145|  21.2k|    }
_ZN6icu_7812LocalPointerINS_9UVector32EEC2EPS1_R10UErrorCode:
  214|   127k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|   127k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 127k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|   127k|    }
_ZN6icu_7816LocalPointerBaseINS_9UVector32EEC2EPS1_:
   82|   127k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_9UVector32EED2Ev:
  245|   127k|    ~LocalPointer() {
  246|   127k|        delete LocalPointerBase<T>::ptr;
  247|   127k|    }
_ZN6icu_7816LocalPointerBaseINS_9UVector32EED2Ev:
   88|   127k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_9UVector32EE6orphanEv:
  141|   127k|    T *orphan() {
  142|   127k|        T *p=ptr;
  143|   127k|        ptr=nullptr;
  144|   127k|        return p;
  145|   127k|    }
_ZN6icu_7812LocalPointerINS_6NFRuleEEC2EPS1_R10UErrorCode:
  214|  42.4k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  42.4k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 42.4k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  42.4k|    }
_ZN6icu_7816LocalPointerBaseINS_6NFRuleEEC2EPS1_:
   82|  84.8k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_6NFRuleEED2Ev:
  245|  84.8k|    ~LocalPointer() {
  246|  84.8k|        delete LocalPointerBase<T>::ptr;
  247|  84.8k|    }
_ZN6icu_7816LocalPointerBaseINS_6NFRuleEED2Ev:
   88|  84.8k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_6NFRuleEE6orphanEv:
  141|  84.8k|    T *orphan() {
  142|  84.8k|        T *p=ptr;
  143|  84.8k|        ptr=nullptr;
  144|  84.8k|        return p;
  145|  84.8k|    }
_ZN6icu_7812LocalPointerINS_10UnicodeSetEEC2EPS1_:
  200|      1|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_10UnicodeSetEEC2EPS1_:
   82|      1|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_10UnicodeSetEED2Ev:
  245|      1|    ~LocalPointer() {
  246|      1|        delete LocalPointerBase<T>::ptr;
  247|      1|    }
_ZN6icu_7816LocalPointerBaseINS_10UnicodeSetEED2Ev:
   88|      1|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_788internal16LocalOpenPointerI15UResourceBundleXadL_Z13ures_close_78EEE12adoptInsteadEPS2_:
  595|  42.6k|    void adoptInstead(Type *p) {
  596|  42.6k|        if (ptr != nullptr) { closeFunction(ptr); }
  ------------------
  |  Branch (596:13): [True: 10, False: 42.6k]
  ------------------
  597|  42.6k|        ptr=p;
  598|  42.6k|    }
_ZN6icu_7812LocalPointerINS_24DateTimePatternGeneratorEEC2EPS1_:
  200|  2.04k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_24DateTimePatternGeneratorEEC2EPS1_:
   82|  4.08k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_24DateTimePatternGeneratorEED2Ev:
  245|  4.08k|    ~LocalPointer() {
  246|  4.08k|        delete LocalPointerBase<T>::ptr;
  247|  4.08k|    }
_ZN6icu_7816LocalPointerBaseINS_24DateTimePatternGeneratorEED2Ev:
   88|  4.08k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_24DateTimePatternGeneratorEEptEv:
  134|  2.04k|    T *operator->() const { return ptr; }
_ZNK6icu_7816LocalPointerBaseINS_7UVectorEE8getAliasEv:
  122|     24|    T *getAlias() const { return ptr; }
_ZN6icu_7816LocalPointerBaseI15UResourceBundleE6orphanEv:
  141|      3|    T *orphan() {
  142|      3|        T *p=ptr;
  143|      3|        ptr=nullptr;
  144|      3|        return p;
  145|      3|    }
_ZNK6icu_7816LocalPointerBaseINS_7UVectorEE6isNullEv:
   94|     58|    UBool isNull() const { return ptr==nullptr; }
_ZN6icu_7812LocalPointerINS_8CalendarEEC2EPS1_:
  200|      2|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_8CalendarEEC2EPS1_:
   82|      2|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_8CalendarEE29adoptInsteadAndCheckErrorCodeEPS1_R10UErrorCode:
  319|      2|    void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) {
  320|      2|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (320:12): [True: 2, False: 0]
  ------------------
  321|      2|            delete LocalPointerBase<T>::ptr;
  322|      2|            LocalPointerBase<T>::ptr=p;
  323|      2|            if(p==nullptr) {
  ------------------
  |  Branch (323:16): [True: 0, False: 2]
  ------------------
  324|      0|                errorCode=U_MEMORY_ALLOCATION_ERROR;
  325|      0|            }
  326|      2|        } else {
  327|      0|            delete p;
  328|      0|        }
  329|      2|    }
_ZN6icu_7816LocalPointerBaseINS_8CalendarEE6orphanEv:
  141|      2|    T *orphan() {
  142|      2|        T *p=ptr;
  143|      2|        ptr=nullptr;
  144|      2|        return p;
  145|      2|    }
_ZN6icu_7812LocalPointerINS_8CalendarEED2Ev:
  245|      2|    ~LocalPointer() {
  246|      2|        delete LocalPointerBase<T>::ptr;
  247|      2|    }
_ZN6icu_7816LocalPointerBaseINS_8CalendarEED2Ev:
   88|      2|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_8TimeZoneEEC2EPS1_R10UErrorCode:
  214|      3|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|      3|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 3]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|      3|    }
_ZN6icu_7816LocalPointerBaseINS_8TimeZoneEEC2EPS1_:
   82|  56.1k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_8TimeZoneEED2Ev:
  245|  56.1k|    ~LocalPointer() {
  246|  56.1k|        delete LocalPointerBase<T>::ptr;
  247|  56.1k|    }
_ZN6icu_7816LocalPointerBaseINS_8TimeZoneEED2Ev:
   88|  56.1k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_8TimeZoneEE6isNullEv:
   94|      3|    UBool isNull() const { return ptr==nullptr; }
_ZN6icu_7816LocalPointerBaseINS_8TimeZoneEE6orphanEv:
  141|  56.1k|    T *orphan() {
  142|  56.1k|        T *p=ptr;
  143|  56.1k|        ptr=nullptr;
  144|  56.1k|        return p;
  145|  56.1k|    }
_ZN6icu_7812LocalPointerINS_8TimeZoneEEC2EPS1_:
  200|  56.1k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZNK6icu_7816LocalPointerBaseI15UResourceBundleE6isNullEv:
   94|  2.04k|    UBool isNull() const { return ptr==nullptr; }
_ZN6icu_7812LocalPointerINS_9HashtableEEC2EPS1_R10UErrorCode:
  214|  2.04k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  2.04k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 2.04k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  2.04k|    }
_ZN6icu_7816LocalPointerBaseINS_9HashtableEEC2EPS1_:
   82|  2.04k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_9HashtableEED2Ev:
  245|  2.04k|    ~LocalPointer() {
  246|  2.04k|        delete LocalPointerBase<T>::ptr;
  247|  2.04k|    }
_ZN6icu_7816LocalPointerBaseINS_9HashtableEED2Ev:
   88|  2.04k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_9HashtableEE6orphanEv:
  141|  2.04k|    T *orphan() {
  142|  2.04k|        T *p=ptr;
  143|  2.04k|        ptr=nullptr;
  144|  2.04k|        return p;
  145|  2.04k|    }
_ZN6icu_7812LocalPointerINS_18DateFmtBestPatternEEC2EPS1_R10UErrorCode:
  214|  2.04k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  2.04k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 2.04k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  2.04k|    }
_ZN6icu_7816LocalPointerBaseINS_18DateFmtBestPatternEEC2EPS1_:
   82|  2.04k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseINS_18DateFmtBestPatternEE6orphanEv:
  141|  2.04k|    T *orphan() {
  142|  2.04k|        T *p=ptr;
  143|  2.04k|        ptr=nullptr;
  144|  2.04k|        return p;
  145|  2.04k|    }
_ZN6icu_7812LocalPointerINS_18DateFmtBestPatternEED2Ev:
  245|  2.04k|    ~LocalPointer() {
  246|  2.04k|        delete LocalPointerBase<T>::ptr;
  247|  2.04k|    }
_ZN6icu_7816LocalPointerBaseINS_18DateFmtBestPatternEED2Ev:
   88|  2.04k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_10DateFormatEEC2EPS1_R10UErrorCode:
  214|  36.9k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  36.9k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 36.9k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  36.9k|    }
_ZN6icu_7816LocalPointerBaseINS_10DateFormatEE6orphanEv:
  141|  36.9k|    T *orphan() {
  142|  36.9k|        T *p=ptr;
  143|  36.9k|        ptr=nullptr;
  144|  36.9k|        return p;
  145|  36.9k|    }
_ZNK6icu_7816LocalPointerBaseIKNS_20DecimalFormatSymbolsEE6isNullEv:
   94|   464k|    UBool isNull() const { return ptr==nullptr; }
_ZN6icu_7812LocalPointerIKNS_20DecimalFormatSymbolsEE29adoptInsteadAndCheckErrorCodeEPS2_R10UErrorCode:
  319|  98.5k|    void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) {
  320|  98.5k|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (320:12): [True: 98.5k, False: 0]
  ------------------
  321|  98.5k|            delete LocalPointerBase<T>::ptr;
  322|  98.5k|            LocalPointerBase<T>::ptr=p;
  323|  98.5k|            if(p==nullptr) {
  ------------------
  |  Branch (323:16): [True: 0, False: 98.5k]
  ------------------
  324|      0|                errorCode=U_MEMORY_ALLOCATION_ERROR;
  325|      0|            }
  326|  98.5k|        } else {
  327|      0|            delete p;
  328|      0|        }
  329|  98.5k|    }
_ZN6icu_7816LocalPointerBaseIKNS_20DecimalFormatSymbolsEE6orphanEv:
  141|      2|    T *orphan() {
  142|      2|        T *p=ptr;
  143|      2|        ptr=nullptr;
  144|      2|        return p;
  145|      2|    }
_ZNK6icu_7816LocalPointerBaseIKNS_20DecimalFormatSymbolsEE8getAliasEv:
  122|  98.5k|    T *getAlias() const { return ptr; }
_ZNK6icu_7816LocalPointerBaseINS_18CurrencyPluralInfoEE8getAliasEv:
  122|   309k|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerINS_7UVectorEE12adoptInsteadEPS1_:
  300|  24.7k|    void adoptInstead(T *p) {
  301|  24.7k|        delete LocalPointerBase<T>::ptr;
  302|  24.7k|        LocalPointerBase<T>::ptr=p;
  303|  24.7k|    }
_ZNK6icu_7816LocalPointerBaseI15UResourceBundleE7isValidEv:
  100|     12|    UBool isValid() const { return ptr!=nullptr; }
_ZN6icu_7816LocalPointerBaseIiEC2EPi:
   82|    281|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseIiE6orphanEv:
  141|    276|    T *orphan() {
  142|    276|        T *p=ptr;
  143|    276|        ptr=nullptr;
  144|    276|        return p;
  145|    276|    }
_ZN6icu_7816LocalPointerBaseIiED2Ev:
   88|    281|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_24DateTimePatternGeneratorEEC2EPS1_R10UErrorCode:
  214|  2.04k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  2.04k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 2.04k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  2.04k|    }
_ZN6icu_7816LocalPointerBaseINS_24DateTimePatternGeneratorEE6orphanEv:
  141|  2.04k|    T *orphan() {
  142|  2.04k|        T *p=ptr;
  143|  2.04k|        ptr=nullptr;
  144|  2.04k|        return p;
  145|  2.04k|    }
_ZNK6icu_7816LocalPointerBaseINS_11PtnSkeletonEEptEv:
  134|   780k|    T *operator->() const { return ptr; }
_ZNK6icu_7816LocalPointerBaseINS_7PtnElemEE8getAliasEv:
  122|  2.13M|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerINS_7PtnElemEEC2EPS1_R10UErrorCode:
  214|   132k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|   132k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 132k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|   132k|    }
_ZN6icu_7816LocalPointerBaseINS_7PtnElemEEC2EPS1_:
   82|   265k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_7PtnElemEED2Ev:
  245|   265k|    ~LocalPointer() {
  246|   265k|        delete LocalPointerBase<T>::ptr;
  247|   265k|    }
_ZN6icu_7816LocalPointerBaseINS_7PtnElemEED2Ev:
   88|   265k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_7PtnElemEEptEv:
  134|   265k|    T *operator->() const { return ptr; }
_ZN6icu_7812LocalPointerINS_11PtnSkeletonEE29adoptInsteadAndCheckErrorCodeEPS1_R10UErrorCode:
  319|   132k|    void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) {
  320|   132k|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (320:12): [True: 132k, False: 0]
  ------------------
  321|   132k|            delete LocalPointerBase<T>::ptr;
  322|   132k|            LocalPointerBase<T>::ptr=p;
  323|   132k|            if(p==nullptr) {
  ------------------
  |  Branch (323:16): [True: 0, False: 132k]
  ------------------
  324|      0|                errorCode=U_MEMORY_ALLOCATION_ERROR;
  325|      0|            }
  326|   132k|        } else {
  327|      0|            delete p;
  328|      0|        }
  329|   132k|    }
_ZNK6icu_7816LocalPointerBaseINS_11PtnSkeletonEEdeEv:
  128|   418k|    T &operator*() const { return *ptr; }
_ZN6icu_7816LocalPointerBaseINS_7PtnElemEE6orphanEv:
  141|   132k|    T *orphan() {
  142|   132k|        T *p=ptr;
  143|   132k|        ptr=nullptr;
  144|   132k|        return p;
  145|   132k|    }
_ZN6icu_7812LocalPointerINS_7PtnElemEE12adoptInsteadEPS1_:
  300|  98.0k|    void adoptInstead(T *p) {
  301|  98.0k|        delete LocalPointerBase<T>::ptr;
  302|  98.0k|        LocalPointerBase<T>::ptr=p;
  303|  98.0k|    }
_ZNK6icu_7816LocalPointerBaseINS_7PtnElemEEneEPKS1_:
  116|  1.28M|    bool operator!=(const T *other) const { return ptr!=other; }
_ZNK6icu_7816LocalPointerBaseINS_11PtnSkeletonEE8getAliasEv:
  122|  18.9k|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerINS_15DateTimeMatcherEEC2EPS1_:
  200|  7.02k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_15DateTimeMatcherEEC2EPS1_:
   82|  7.02k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_15DateTimeMatcherEED2Ev:
  245|  7.02k|    ~LocalPointer() {
  246|  7.02k|        delete LocalPointerBase<T>::ptr;
  247|  7.02k|    }
_ZN6icu_7816LocalPointerBaseINS_15DateTimeMatcherEED2Ev:
   88|  7.02k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_15DateTimeMatcherEE29adoptInsteadAndCheckErrorCodeEPS1_R10UErrorCode:
  319|  7.02k|    void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) {
  320|  7.02k|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (320:12): [True: 7.02k, False: 0]
  ------------------
  321|  7.02k|            delete LocalPointerBase<T>::ptr;
  322|  7.02k|            LocalPointerBase<T>::ptr=p;
  323|  7.02k|            if(p==nullptr) {
  ------------------
  |  Branch (323:16): [True: 0, False: 7.02k]
  ------------------
  324|      0|                errorCode=U_MEMORY_ALLOCATION_ERROR;
  325|      0|            }
  326|  7.02k|        } else {
  327|      0|            delete p;
  328|      0|        }
  329|  7.02k|    }
_ZNK6icu_7816LocalPointerBaseINS_15DateTimeMatcherEEptEv:
  134|   418k|    T *operator->() const { return ptr; }
_ZNK6icu_7816LocalPointerBaseINS_15DateTimeMatcherEEdeEv:
  128|   418k|    T &operator*() const { return *ptr; }
_ZN6icu_7812LocalPointerINS_11PtnSkeletonEEC2EPS1_:
  200|   132k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_11PtnSkeletonEEC2EPS1_:
   82|   132k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_7PtnElemEEC2EPS1_:
  200|   132k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7812LocalPointerINS_11PtnSkeletonEED2Ev:
  245|   132k|    ~LocalPointer() {
  246|   132k|        delete LocalPointerBase<T>::ptr;
  247|   132k|    }
_ZN6icu_7816LocalPointerBaseINS_11PtnSkeletonEED2Ev:
   88|   132k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7810LocalArrayINS_8message210data_model3KeyEED2Ev:
  420|  1.62k|    ~LocalArray() {
  421|  1.62k|        delete[] LocalPointerBase<T>::ptr;
  422|  1.62k|    }
_ZN6icu_7816LocalPointerBaseINS_8message210data_model3KeyEED2Ev:
   88|  1.62k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7810LocalArrayINS_8message210data_model6OptionEED2Ev:
  420|  1.00M|    ~LocalArray() {
  421|  1.00M|        delete[] LocalPointerBase<T>::ptr;
  422|  1.00M|    }
_ZN6icu_7816LocalPointerBaseINS_8message210data_model6OptionEED2Ev:
   88|  1.00M|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7810LocalArrayINS_8message210data_model11PatternPartEEC2EPS3_:
  375|  92.8k|    explicit LocalArray(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_8message210data_model11PatternPartEEC2EPS3_:
   82|  92.8k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7810LocalArrayINS_8message210data_model11PatternPartEED2Ev:
  420|  92.8k|    ~LocalArray() {
  421|  92.8k|        delete[] LocalPointerBase<T>::ptr;
  422|  92.8k|    }
_ZN6icu_7816LocalPointerBaseINS_8message210data_model11PatternPartEED2Ev:
   88|  92.8k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7810LocalArrayINS_8message210data_model3KeyEE12adoptInsteadEPS3_:
  475|    811|    void adoptInstead(T *p) {
  476|    811|        delete[] LocalPointerBase<T>::ptr;
  477|    811|        LocalPointerBase<T>::ptr=p;
  478|    811|    }
_ZN6icu_7810LocalArrayINS_8message210data_model6OptionEE12adoptInsteadEPS3_:
  475|   321k|    void adoptInstead(T *p) {
  476|   321k|        delete[] LocalPointerBase<T>::ptr;
  477|   321k|        LocalPointerBase<T>::ptr=p;
  478|   321k|    }
_ZN6icu_7810LocalArrayINS_8message210data_model11PatternPartEE12adoptInsteadEPS3_:
  475|  38.3k|    void adoptInstead(T *p) {
  476|  38.3k|        delete[] LocalPointerBase<T>::ptr;
  477|  38.3k|        LocalPointerBase<T>::ptr=p;
  478|  38.3k|    }
_ZNK6icu_7816LocalPointerBaseINS_8message210data_model11PatternPartEE8getAliasEv:
  122|  7.88k|    T *getAlias() const { return ptr; }
_ZN6icu_7810LocalArrayINS_8message210data_model7BindingEEC2EPS3_:
  375|  23.2k|    explicit LocalArray(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_8message210data_model7BindingEEC2EPS3_:
   82|  23.2k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7810LocalArrayINS_8message210data_model7BindingEED2Ev:
  420|  23.2k|    ~LocalArray() {
  421|  23.2k|        delete[] LocalPointerBase<T>::ptr;
  422|  23.2k|    }
_ZN6icu_7816LocalPointerBaseINS_8message210data_model7BindingEED2Ev:
   88|  23.2k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_6NFRuleEEC2EPS1_:
  200|  42.4k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZNK6icu_7816LocalPointerBaseINS_6NFRuleEE6isNullEv:
   94|  42.4k|    UBool isNull() const { return ptr==nullptr; }
_ZNK6icu_7816LocalPointerBaseINS_6NFRuleEEptEv:
  134|   127k|    T *operator->() const { return ptr; }
_ZN6icu_7812LocalPointerINS_20StandardPluralRangesEEC2EPS1_R10UErrorCode:
  214|  21.2k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  21.2k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 21.2k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  21.2k|    }
_ZN6icu_7816LocalPointerBaseINS_20StandardPluralRangesEEC2EPS1_:
   82|  21.2k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZNK6icu_7816LocalPointerBaseINS_10UnicodeSetEE8getAliasEv:
  122|      1|    T *getAlias() const { return ptr; }
_ZN6icu_7816LocalPointerBaseINS_10UnicodeSetEE6orphanEv:
  141|      1|    T *orphan() {
  142|      1|        T *p=ptr;
  143|      1|        ptr=nullptr;
  144|      1|        return p;
  145|      1|    }
_ZNK6icu_7816LocalPointerBaseINS_10UnicodeSetEEptEv:
  134|      2|    T *operator->() const { return ptr; }
_ZNK6icu_7816LocalPointerBaseI15UResourceBundleEptEv:
  134|      1|    T *operator->() const { return ptr; }
_ZNK6icu_7816LocalPointerBaseINS_10UnicodeSetEE6isNullEv:
   94|      1|    UBool isNull() const { return ptr==nullptr; }

_ZNK6icu_786Locale10getCountryEv:
 1204|      6|{
 1205|      6|    return country;
 1206|      6|}
_ZNK6icu_786Locale11getLanguageEv:
 1210|  23.2k|{
 1211|  23.2k|    return language;
 1212|  23.2k|}
_ZNK6icu_786Locale9getScriptEv:
 1216|      4|{
 1217|      4|    return script;
 1218|      4|}
_ZNK6icu_786Locale10getVariantEv:
 1222|      2|{
 1223|      2|    return fIsBogus ? "" : &baseName[variantBegin];
  ------------------
  |  Branch (1223:12): [True: 0, False: 2]
  ------------------
 1224|      2|}
_ZNK6icu_786Locale7getNameEv:
 1228|  1.03M|{
 1229|  1.03M|    return fullName;
 1230|  1.03M|}
_ZNK6icu_786Locale7isBogusEv:
 1289|  2.05k|Locale::isBogus() const {
 1290|  2.05k|    return fIsBogus;
 1291|  2.05k|}

_ZNK6icu_7814MessagePattern10countPartsEv:
  616|  4.25k|    int32_t countParts() const {
  617|  4.25k|        return partsLength;
  618|  4.25k|    }
_ZNK6icu_7814MessagePattern7getPartEi:
  626|  1.76M|    const Part &getPart(int32_t i) const {
  627|  1.76M|        return parts[i];
  628|  1.76M|    }
_ZNK6icu_7814MessagePattern12getSubstringERKNS0_4PartE:
  659|   129k|    UnicodeString getSubstring(const Part &part) const {
  660|   129k|        return msg.tempSubString(part.index, part.length);
  661|   129k|    }
_ZN6icu_7814MessagePattern4PartC2Ev:
  719|  1.16M|        Part() {}
_ZNK6icu_7814MessagePattern4Part7getTypeEv:
  726|  1.82M|        UMessagePatternPartType getType() const {
  727|  1.82M|            return type;
  728|  1.82M|        }
_ZNK6icu_7814MessagePattern4Part8getValueEv:
  765|   145k|        int32_t getValue() const {
  766|   145k|            return value;
  767|   145k|        }
_ZNK6icu_7814MessagePattern4Part10getArgTypeEv:
  775|   156k|        UMessagePatternArgType getArgType() const {
  776|   156k|            UMessagePatternPartType msgType=getType();
  777|   156k|            if(msgType ==UMSGPAT_PART_TYPE_ARG_START || msgType ==UMSGPAT_PART_TYPE_ARG_LIMIT) {
  ------------------
  |  Branch (777:16): [True: 156k, False: 0]
  |  Branch (777:57): [True: 0, False: 0]
  ------------------
  778|   156k|                return static_cast<UMessagePatternArgType>(value);
  779|   156k|            } else {
  780|      0|                return UMSGPAT_ARG_TYPE_NONE;
  781|      0|            }
  782|   156k|        }
_ZN6icu_7814MessagePattern4Part15hasNumericValueE23UMessagePatternPartType:
  791|  21.2k|        static UBool hasNumericValue(UMessagePatternPartType type) {
  792|  21.2k|            return type==UMSGPAT_PART_TYPE_ARG_INT || type==UMSGPAT_PART_TYPE_ARG_DOUBLE;
  ------------------
  |  Branch (792:20): [True: 0, False: 21.2k]
  |  Branch (792:55): [True: 0, False: 21.2k]
  ------------------
  793|  21.2k|        }
_ZN6icu_7814MessagePattern14parseArgNumberEii:
  865|   676k|    int32_t parseArgNumber(int32_t start, int32_t limit) {
  866|   676k|        return parseArgNumber(msg, start, limit);
  867|   676k|    }

_ZN6icu_7813ParsePositionC2Ei:
   70|      5|        : UObject(),
   71|      5|        index(newIndex),
   72|      5|        errorIndex(-1)
   73|      5|      {}
_ZNK6icu_7813ParsePosition8getIndexEv:
  212|     81|{
  213|     81|  return index;
  214|     81|}
_ZN6icu_7813ParsePosition8setIndexEi:
  218|     25|{
  219|     25|  this->index = offset;
  220|     25|}

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

_ZN6icu_7815SimpleFormatterC2ERKNS_13UnicodeStringEiiR10UErrorCode:
   96|  3.20k|                    UErrorCode &errorCode) {
   97|  3.20k|        applyPatternMinMaxArguments(pattern, min, max, errorCode);
   98|  3.20k|    }
_ZNK6icu_7815SimpleFormatter16getArgumentLimitEv:
  155|  1.56k|    int32_t getArgumentLimit() const {
  156|  1.56k|        return getArgumentLimit(compiledPattern.getBuffer(), compiledPattern.length());
  157|  1.56k|    }
_ZN6icu_7815SimpleFormatter16getArgumentLimitEPKDsi:
  314|  4.84k|                                              int32_t compiledPatternLength) {
  315|  4.84k|        return compiledPatternLength == 0 ? 0 : compiledPattern[0];
  ------------------
  |  Branch (315:16): [True: 0, False: 4.84k]
  ------------------
  316|  4.84k|    }

_ZN6icu_7811StringPieceC2Ev:
   71|      1|  StringPiece() : ptr_(nullptr), length_(0) { }
_ZN6icu_7811StringPieceC2EPKci:
  151|     25|  StringPiece(const char* offset, int32_t len) : ptr_(offset), length_(len) { }
_ZNK6icu_7811StringPiececvNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEEEv:
  185|  90.0k|  inline operator std::string_view() const {
  186|  90.0k|    return {data(), static_cast<std::string_view::size_type>(size())};
  187|  90.0k|  }
_ZNK6icu_7811StringPiece4dataEv:
  200|  16.7M|  const char* data() const { return ptr_; }
_ZNK6icu_7811StringPiece4sizeEv:
  206|  90.0k|  int32_t size() const { return length_; }
_ZNK6icu_7811StringPiece6lengthEv:
  212|  18.2M|  int32_t length() const { return length_; }
_ZNK6icu_7811StringPiece5emptyEv:
  218|     48|  UBool empty() const { return length_ == 0; }

_ZN6icu_7810UnicodeSet10setPatternERKNS_13UnicodeStringE:
 1830|      3|    void setPattern(const UnicodeString& newPat) {
 1831|      3|        setPattern(newPat.getBuffer(), newPat.length());
 1832|      3|    }
_ZNK6icu_7810UnicodeSet8isFrozenEv:
 1848|  6.92k|inline UBool UnicodeSet::isFrozen() const {
 1849|  6.92k|    return bmpSet != nullptr || stringSpan != nullptr;
  ------------------
  |  Branch (1849:12): [True: 0, False: 6.92k]
  |  Branch (1849:33): [True: 0, False: 6.92k]
  ------------------
 1850|  6.92k|}
_ZNK6icu_7810UnicodeSet7isBogusEv:
 1864|  6.92k|inline UBool UnicodeSet::isBogus() const {
 1865|  6.92k|    return fFlags & kIsBogus;
 1866|  6.92k|}

_ZN6icu_784swapERNS_13UnicodeStringES1_:
 1990|  34.5M|  swap(UnicodeString &s1, UnicodeString &s2) noexcept {
 1991|  34.5M|    s1.swap(s2);
 1992|  34.5M|  }
_ZNK6icu_7813UnicodeString8doEqualsERKS0_i:
 3773|   160k|  inline UBool doEquals(const UnicodeString &text, int32_t len) const {
 3774|   160k|    return doEquals(text.getArrayStart(), len);
 3775|   160k|  }
_ZNK6icu_7813UnicodeString8pinIndexERi:
 4138|   503k|{
 4139|       |  // pin index
 4140|   503k|  if(start < 0) {
  ------------------
  |  Branch (4140:6): [True: 0, False: 503k]
  ------------------
 4141|      0|    start = 0;
 4142|   503k|  } else if(start > length()) {
  ------------------
  |  Branch (4142:13): [True: 0, False: 503k]
  ------------------
 4143|      0|    start = length();
 4144|      0|  }
 4145|   503k|}
_ZNK6icu_7813UnicodeString10pinIndicesERiS1_:
 4150|  15.1M|{
 4151|       |  // pin indices
 4152|  15.1M|  int32_t len = length();
 4153|  15.1M|  if(start < 0) {
  ------------------
  |  Branch (4153:6): [True: 122, False: 15.1M]
  ------------------
 4154|    122|    start = 0;
 4155|  15.1M|  } else if(start > len) {
  ------------------
  |  Branch (4155:13): [True: 0, False: 15.1M]
  ------------------
 4156|      0|    start = len;
 4157|      0|  }
 4158|  15.1M|  if(_length < 0) {
  ------------------
  |  Branch (4158:6): [True: 0, False: 15.1M]
  ------------------
 4159|      0|    _length = 0;
 4160|  15.1M|  } else if(_length > (len - start)) {
  ------------------
  |  Branch (4160:13): [True: 557k, False: 14.6M]
  ------------------
 4161|   557k|    _length = (len - start);
 4162|   557k|  }
 4163|  15.1M|}
_ZN6icu_7813UnicodeString13getArrayStartEv:
 4166|  82.0M|UnicodeString::getArrayStart() {
 4167|  82.0M|  return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ?
  ------------------
  |  Branch (4167:10): [True: 26.3M, False: 55.7M]
  ------------------
 4168|  55.7M|    fUnion.fStackFields.fBuffer : fUnion.fFields.fArray;
 4169|  82.0M|}
_ZNK6icu_7813UnicodeString13getArrayStartEv:
 4172|   372M|UnicodeString::getArrayStart() const {
 4173|   372M|  return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ?
  ------------------
  |  Branch (4173:10): [True: 17.6M, False: 354M]
  ------------------
 4174|   354M|    fUnion.fStackFields.fBuffer : fUnion.fFields.fArray;
 4175|   372M|}
_ZNK6icu_7813UnicodeString14hasShortLengthEv:
 4202|   706M|UnicodeString::hasShortLength() const {
 4203|   706M|  return fUnion.fFields.fLengthAndFlags>=0;
 4204|   706M|}
_ZNK6icu_7813UnicodeString14getShortLengthEv:
 4207|   305M|UnicodeString::getShortLength() const {
 4208|       |  // fLengthAndFlags must be non-negative -> short length >= 0
 4209|       |  // and arithmetic or logical shift does not matter.
 4210|   305M|  return fUnion.fFields.fLengthAndFlags>>kLengthShift;
 4211|   305M|}
_ZNK6icu_7813UnicodeString6lengthEv:
 4214|   697M|UnicodeString::length() const {
 4215|   697M|  return hasShortLength() ? getShortLength() : fUnion.fFields.fLength;
  ------------------
  |  Branch (4215:10): [True: 121M, False: 575M]
  ------------------
 4216|   697M|}
_ZNK6icu_7813UnicodeString11getCapacityEv:
 4219|  79.8M|UnicodeString::getCapacity() const {
 4220|  79.8M|  return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ?
  ------------------
  |  Branch (4220:10): [True: 24.7M, False: 55.1M]
  ------------------
 4221|  55.1M|    US_STACKBUF_SIZE : fUnion.fFields.fCapacity;
 4222|  79.8M|}
_ZNK6icu_7813UnicodeString8hashCodeEv:
 4226|   335k|{ return doHashCode(); }
_ZNK6icu_7813UnicodeString7isBogusEv:
 4230|   104M|{ return fUnion.fFields.fLengthAndFlags & kIsBogus; }
_ZNK6icu_7813UnicodeString10isWritableEv:
 4234|  86.4M|{ return !(fUnion.fFields.fLengthAndFlags & (kOpenGetBuffer | kIsBogus)); }
_ZNK6icu_7813UnicodeString16isBufferWritableEv:
 4238|  78.9M|{
 4239|  78.9M|  return
 4240|  78.9M|      !(fUnion.fFields.fLengthAndFlags&(kOpenGetBuffer|kIsBogus|kBufferIsReadonly)) &&
  ------------------
  |  Branch (4240:7): [True: 78.7M, False: 180k]
  ------------------
 4241|  78.9M|      (!(fUnion.fFields.fLengthAndFlags&kRefCounted) || refCount()==1);
  ------------------
  |  Branch (4241:8): [True: 24.0M, False: 54.7M]
  |  Branch (4241:57): [True: 54.7M, False: 42.6k]
  ------------------
 4242|  78.9M|}
_ZNK6icu_7813UnicodeString9getBufferEv:
 4245|  4.36M|UnicodeString::getBuffer() const {
 4246|  4.36M|  if(fUnion.fFields.fLengthAndFlags&(kIsBogus|kOpenGetBuffer)) {
  ------------------
  |  Branch (4246:6): [True: 0, False: 4.36M]
  ------------------
 4247|      0|    return nullptr;
 4248|  4.36M|  } else if(fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) {
  ------------------
  |  Branch (4248:13): [True: 34.1k, False: 4.33M]
  ------------------
 4249|  34.1k|    return fUnion.fStackFields.fBuffer;
 4250|  4.33M|  } else {
 4251|  4.33M|    return fUnion.fFields.fArray;
 4252|  4.33M|  }
 4253|  4.36M|}
_ZNK6icu_7813UnicodeString9doCompareEiiRKS0_ii:
 4264|   921k|{
 4265|   921k|  if(srcText.isBogus()) {
  ------------------
  |  Branch (4265:6): [True: 0, False: 921k]
  ------------------
 4266|      0|    return static_cast<int8_t>(!isBogus()); // 0 if both are bogus, 1 otherwise
 4267|   921k|  } else {
 4268|   921k|    srcText.pinIndices(srcStart, srcLength);
 4269|   921k|    return doCompare(start, thisLength, srcText.getArrayStart(), srcStart, srcLength);
 4270|   921k|  }
 4271|   921k|}
_ZNK6icu_7813UnicodeString17doEqualsSubstringEiiRKS0_ii:
 4279|  44.4k|{
 4280|  44.4k|  if(srcText.isBogus()) {
  ------------------
  |  Branch (4280:6): [True: 0, False: 44.4k]
  ------------------
 4281|      0|    return isBogus();
 4282|  44.4k|  } else {
 4283|  44.4k|    srcText.pinIndices(srcStart, srcLength);
 4284|  44.4k|    return !isBogus() && doEqualsSubstring(start, thisLength, srcText.getArrayStart(), srcStart, srcLength);
  ------------------
  |  Branch (4284:12): [True: 44.4k, False: 0]
  |  Branch (4284:26): [True: 22.0k, False: 22.3k]
  ------------------
 4285|  44.4k|  }
 4286|  44.4k|}
_ZNK6icu_7813UnicodeStringeqERKS0_:
 4290|   959k|{
 4291|   959k|  if(isBogus()) {
  ------------------
  |  Branch (4291:6): [True: 773k, False: 185k]
  ------------------
 4292|   773k|    return text.isBogus();
 4293|   773k|  } else {
 4294|   185k|    int32_t len = length(), textLength = text.length();
 4295|   185k|    return !text.isBogus() && len == textLength && doEquals(text, len);
  ------------------
  |  Branch (4295:12): [True: 185k, False: 0]
  |  Branch (4295:31): [True: 160k, False: 25.3k]
  |  Branch (4295:52): [True: 157k, False: 3.58k]
  ------------------
 4296|   185k|  }
 4297|   959k|}
_ZNK6icu_7813UnicodeStringneERKS0_:
 4301|      4|{ return (! operator==(text)); }
_ZNK6icu_7813UnicodeString7compareERKS0_:
 4321|   921k|{ return doCompare(0, length(), text, 0, text.length()); }
_ZNK6icu_7813UnicodeString7compareENS_14ConstChar16PtrEi:
 4332|  2.74M|{ return doCompare(0, length(), srcChars, 0, srcLength); }
_ZNK6icu_7813UnicodeString7compareEiiPKDsii:
 4354|   189k|{ return doCompare(start, _length, srcChars, srcStart, srcLength); }
_ZNK6icu_7813UnicodeString7indexOfEPKDsii:
 4536|   190k|               int32_t start) const {
 4537|   190k|  pinIndex(start);
 4538|   190k|  return indexOf(srcChars, 0, srcLength, start, length() - start);
 4539|   190k|}
_ZNK6icu_7813UnicodeString7indexOfEDs:
 4562|  1.08M|{ return doIndexOf(c, 0, length()); }
_ZNK6icu_7813UnicodeString7indexOfEDsi:
 4570|   312k|               int32_t start) const {
 4571|   312k|  pinIndex(start);
 4572|   312k|  return doIndexOf(c, start, length() - start);
 4573|   312k|}
_ZNK6icu_7813UnicodeString10startsWithERKS0_:
 4668|  44.4k|{ return doEqualsSubstring(0, text.length(), text, 0, text.length()); }
_ZNK6icu_7813UnicodeString10startsWithENS_14ConstChar16PtrEi:
 4677|    136|UnicodeString::startsWith(ConstChar16Ptr srcChars, int32_t srcLength) const {
 4678|    136|  if(srcLength < 0) {
  ------------------
  |  Branch (4678:6): [True: 0, False: 136]
  ------------------
 4679|      0|    srcLength = u_strlen(toUCharPtr(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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4680|      0|  }
 4681|    136|  return doEqualsSubstring(0, srcLength, srcChars, 0, srcLength);
 4682|    136|}
_ZNK6icu_7813UnicodeString8endsWithENS_14ConstChar16PtrEi:
 4708|  21.4k|            int32_t srcLength) const {
 4709|  21.4k|  if(srcLength < 0) {
  ------------------
  |  Branch (4709:6): [True: 0, False: 21.4k]
  ------------------
 4710|      0|    srcLength = u_strlen(toUCharPtr(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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4711|      0|  }
 4712|  21.4k|  return doEqualsSubstring(length() - srcLength, srcLength, srcChars, 0, srcLength);
 4713|  21.4k|}
_ZN6icu_7813UnicodeString7replaceEiiRKS0_ii:
 4741|      6|{ return doReplace(start, _length, srcText, srcStart, srcLength); }
_ZNK6icu_7813UnicodeString9doExtractEiiRS0_:
 4799|      6|{ target.replace(0, target.length(), *this, start, _length); }
_ZNK6icu_7813UnicodeString7extractEiiNS_9Char16PtrEi:
 4806|  13.3k|{ doExtract(start, _length, target, targetStart); }
_ZNK6icu_7813UnicodeString7extractEiiRS0_:
 4812|      4|{ doExtract(start, _length, target); }
_ZNK6icu_7813UnicodeString20tempSubStringBetweenEii:
 4840|      4|UnicodeString::tempSubStringBetween(int32_t start, int32_t limit) const {
 4841|      4|    return tempSubString(start, limit - start);
 4842|      4|}
_ZNK6icu_7813UnicodeString8doCharAtEi:
 4846|   172M|{
 4847|   172M|  if (static_cast<uint32_t>(offset) < static_cast<uint32_t>(length())) {
  ------------------
  |  Branch (4847:7): [True: 171M, False: 177k]
  ------------------
 4848|   171M|    return getArrayStart()[offset];
 4849|   171M|  } else {
 4850|   177k|    return kInvalidUChar;
 4851|   177k|  }
 4852|   172M|}
_ZNK6icu_7813UnicodeString6charAtEi:
 4856|   158M|{ return doCharAt(offset); }
_ZNK6icu_7813UnicodeStringixEi:
 4860|  13.5M|{ return doCharAt(offset); }
_ZNK6icu_7813UnicodeString7isEmptyEv:
 4863|  94.0M|UnicodeString::isEmpty() const {
 4864|       |  // Arithmetic or logical right shift does not matter: only testing for 0.
 4865|  94.0M|  return (fUnion.fFields.fLengthAndFlags>>kLengthShift) == 0;
 4866|  94.0M|}
_ZN6icu_7813UnicodeString13setZeroLengthEv:
 4872|  1.01M|UnicodeString::setZeroLength() {
 4873|  1.01M|  fUnion.fFields.fLengthAndFlags &= kAllStorageFlags;
 4874|  1.01M|}
_ZN6icu_7813UnicodeString14setShortLengthEi:
 4877|  33.9M|UnicodeString::setShortLength(int32_t len) {
 4878|       |  // requires 0 <= len <= kMaxShortLength
 4879|  33.9M|  fUnion.fFields.fLengthAndFlags =
 4880|  33.9M|    static_cast<int16_t>((fUnion.fFields.fLengthAndFlags & kAllStorageFlags) | (len << kLengthShift));
 4881|  33.9M|}
_ZN6icu_7813UnicodeString9setLengthEi:
 4884|  82.9M|UnicodeString::setLength(int32_t len) {
 4885|  82.9M|  if(len <= kMaxShortLength) {
  ------------------
  |  Branch (4885:6): [True: 33.9M, False: 48.9M]
  ------------------
 4886|  33.9M|    setShortLength(len);
 4887|  48.9M|  } else {
 4888|  48.9M|    fUnion.fFields.fLengthAndFlags |= kLengthIsLarge;
 4889|  48.9M|    fUnion.fFields.fLength = len;
 4890|  48.9M|  }
 4891|  82.9M|}
_ZN6icu_7813UnicodeString10setToEmptyEv:
 4894|  7.14M|UnicodeString::setToEmpty() {
 4895|  7.14M|  fUnion.fFields.fLengthAndFlags = kShortString;
 4896|  7.14M|}
_ZN6icu_7813UnicodeString8setArrayEPDsii:
 4899|  2.14M|UnicodeString::setArray(char16_t *array, int32_t len, int32_t capacity) {
 4900|  2.14M|  setLength(len);
 4901|  2.14M|  fUnion.fFields.fArray = array;
 4902|  2.14M|  fUnion.fFields.fCapacity = capacity;
 4903|  2.14M|}
_ZN6icu_7813UnicodeStringaSEDs:
 4907|  1.15M|{ return doReplace(0, length(), &ch, 0, 1); }
_ZN6icu_7813UnicodeString5setToERKS0_ii:
 4917|  4.38M|{
 4918|  4.38M|  unBogus();
 4919|  4.38M|  return doReplace(0, length(), srcText, srcStart, srcLength);
 4920|  4.38M|}
_ZN6icu_7813UnicodeString5setToERKS0_:
 4933|   110k|{
 4934|   110k|  return copyFrom(srcText);
 4935|   110k|}
_ZN6icu_7813UnicodeString5setToEPKDsi:
 4940|  88.9k|{
 4941|  88.9k|  unBogus();
 4942|  88.9k|  return doReplace(0, length(), srcChars, 0, srcLength);
 4943|  88.9k|}
_ZN6icu_7813UnicodeString5setToEDs:
 4947|  3.20k|{
 4948|  3.20k|  unBogus();
 4949|  3.20k|  return doReplace(0, length(), &srcChar, 0, 1);
 4950|  3.20k|}
_ZN6icu_7813UnicodeString5setToEi:
 4954|   444k|{
 4955|   444k|  unBogus();
 4956|   444k|  return replace(0, length(), srcChar);
 4957|   444k|}
_ZN6icu_7813UnicodeString6appendERKS0_ii:
 4963|  42.4k|{ return doAppend(srcText, srcStart, srcLength); }
_ZN6icu_7813UnicodeString6appendERKS0_:
 4967|  2.20M|{ return doAppend(srcText, 0, srcText.length()); }
_ZN6icu_7813UnicodeString6appendENS_14ConstChar16PtrEi:
 4978|  5.46k|{ return doAppend(srcChars, 0, srcLength); }
_ZN6icu_7813UnicodeString6appendEDs:
 4982|   342k|{ return doAppend(&srcChar, 0, 1); }
_ZN6icu_7813UnicodeStringpLEDs:
 4986|  2.83M|{ return doAppend(&ch, 0, 1); }
_ZN6icu_7813UnicodeStringpLEi:
 4989|  66.7M|UnicodeString::operator+= (UChar32 ch) {
 4990|  66.7M|  return append(ch);
 4991|  66.7M|}
_ZN6icu_7813UnicodeStringpLERKS0_:
 4995|   302k|{ return doAppend(srcText, 0, srcText.length()); }
_ZN6icu_7813UnicodeString6removeEv:
 5035|   812k|{
 5036|       |  // remove() of a bogus string makes the string empty and non-bogus
 5037|   812k|  if(isBogus()) {
  ------------------
  |  Branch (5037:6): [True: 0, False: 812k]
  ------------------
 5038|      0|    setToEmpty();
 5039|   812k|  } else {
 5040|   812k|    setZeroLength();
 5041|   812k|  }
 5042|   812k|  return *this;
 5043|   812k|}
_ZN6icu_7813UnicodeString6removeEii:
 5048|   107k|{
 5049|   107k|    if(start <= 0 && _length == INT32_MAX) {
  ------------------
  |  Branch (5049:8): [True: 64.1k, False: 43.0k]
  |  Branch (5049:22): [True: 0, False: 64.1k]
  ------------------
 5050|       |        // remove(guaranteed everything) of a bogus string makes the string empty and non-bogus
 5051|      0|        return remove();
 5052|      0|    }
 5053|   107k|    return doReplace(start, _length, nullptr, 0, 0);
 5054|   107k|}
_ZN6icu_7813UnicodeString13removeBetweenEii:
 5059|   127k|{ return doReplace(start, limit - start, nullptr, 0, 0); }
_ZN6icu_7813UnicodeString13retainBetweenEii:
 5062|    132|UnicodeString::retainBetween(int32_t start, int32_t limit) {
 5063|    132|  truncate(limit);
 5064|    132|  return doReplace(0, start, nullptr, 0, 0);
 5065|    132|}
_ZN6icu_7813UnicodeString8truncateEi:
 5069|  31.0k|{
 5070|  31.0k|  if(isBogus() && targetLength == 0) {
  ------------------
  |  Branch (5070:6): [True: 0, False: 31.0k]
  |  Branch (5070:19): [True: 0, False: 0]
  ------------------
 5071|       |    // truncate(0) of a bogus string makes the string empty and non-bogus
 5072|      0|    unBogus();
 5073|      0|    return false;
 5074|  31.0k|  } else if (static_cast<uint32_t>(targetLength) < static_cast<uint32_t>(length())) {
  ------------------
  |  Branch (5074:14): [True: 31.0k, False: 0]
  ------------------
 5075|  31.0k|    setLength(targetLength);
 5076|  31.0k|    return true;
 5077|  31.0k|  } else {
 5078|      0|    return false;
 5079|      0|  }
 5080|  31.0k|}
_ZN6icu_7813UnicodeStringC2Ev:
 4182|   116M|UnicodeString::UnicodeString() {
 4183|   116M|  fUnion.fStackFields.fLengthAndFlags=kShortString;
 4184|   116M|}
_ZN6icu_7813UnicodeStringC2INSt3__117basic_string_viewIDsNS2_11char_traitsIDsEEEEvEERKT_:
 3274|  6.03k|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|  6.03k|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|  6.03k|    doAppend(internal::toU16StringViewNullable(text));
 3277|  6.03k|  }
_ZN6icu_7813UnicodeStringC2IPKDsvEERKT_:
 3274|  56.1k|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|  56.1k|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|  56.1k|    doAppend(internal::toU16StringViewNullable(text));
 3277|  56.1k|  }
_ZN6icu_7813UnicodeStringC2IA2_DsvEERKT_:
 3274|   154k|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|   154k|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|   154k|    doAppend(internal::toU16StringViewNullable(text));
 3277|   154k|  }
_ZN6icu_7813UnicodeStringC2IA6_DsvEERKT_:
 3274|     19|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|     19|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|     19|    doAppend(internal::toU16StringViewNullable(text));
 3277|     19|  }

_ZN6icu_787UMemorynwEmPv:
  166|      1|    static inline void * U_EXPORT2 operator new(size_t, void *ptr) noexcept { return ptr; }

_ZN6icu_7821ures_getUnicodeStringEPK15UResourceBundleP10UErrorCode:
  813|  16.3k|ures_getUnicodeString(const UResourceBundle *resB, UErrorCode* status) {
  814|  16.3k|    UnicodeString result;
  815|  16.3k|    int32_t len = 0;
  816|  16.3k|    const char16_t *r = ConstChar16Ptr(ures_getString(resB, &len, status));
  ------------------
  |  | 1675|  16.3k|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|  16.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  16.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  16.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  817|  16.3k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (817:8): [True: 16.3k, False: 0]
  ------------------
  818|  16.3k|        result.setTo(true, r, len);
  819|  16.3k|    } else {
  820|      0|        result.setToBogus();
  821|      0|    }
  822|  16.3k|    return result;
  823|  16.3k|}
_ZN6icu_7825ures_getNextUnicodeStringEP15UResourceBundlePPKcP10UErrorCode:
  838|   148k|ures_getNextUnicodeString(UResourceBundle *resB, const char ** key, UErrorCode* status) {
  839|   148k|    UnicodeString result;
  840|   148k|    int32_t len = 0;
  841|   148k|    const char16_t* r = ConstChar16Ptr(ures_getNextString(resB, &len, key, status));
  ------------------
  |  | 1673|   148k|#define ures_getNextString U_ICU_ENTRY_POINT_RENAME(ures_getNextString)
  |  |  ------------------
  |  |  |  |  123|   148k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   148k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   148k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  842|   148k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (842:8): [True: 148k, False: 0]
  ------------------
  843|   148k|        result.setTo(true, r, len);
  844|   148k|    } else {
  845|      0|        result.setToBogus();
  846|      0|    }
  847|   148k|    return result;
  848|   148k|}
_ZN6icu_7826ures_getUnicodeStringByKeyEPK15UResourceBundlePKcP10UErrorCode:
  883|  44.4k|ures_getUnicodeStringByKey(const UResourceBundle *resB, const char* key, UErrorCode* status) {
  884|  44.4k|    UnicodeString result;
  885|  44.4k|    int32_t len = 0;
  886|  44.4k|    const char16_t* r = ConstChar16Ptr(ures_getStringByKey(resB, key, &len, status));
  ------------------
  |  | 1677|  44.4k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  887|  44.4k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (887:8): [True: 44.4k, False: 2]
  ------------------
  888|  44.4k|        result.setTo(true, r, len);
  889|  44.4k|    } else {
  890|      2|        result.setToBogus();
  891|      2|    }
  892|  44.4k|    return result;
  893|  44.4k|}

msgfmt.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   185k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
msgfmt.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  1.45M|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
messageformat2_formatter.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  31.3k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
messageformat2_function_registry.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  3.52k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
messageformat2_function_registry.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  7.54k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
messageformat2_parser.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  14.1M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
messageformat2_parser.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  31.5k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
number_grouping.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  56.1k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_longnames.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  60.8k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
number_patternstring.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   928k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_utils.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   224k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
numfmt.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   520k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
numfmt.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  77.3k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
numsys.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   266k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
plurfmt.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  42.4k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
plurrule.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  9.20M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
plurrule.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   148k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
rbnf.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   148k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
rbnf.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  88.0k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
smpdtfmt.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   340k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
smpdtfmt.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  75.4k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
standardplural.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   190k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
timezone.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  56.2k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
timezone.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|      1|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
zonemeta.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      4|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
zonemeta.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|      3|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
calendar.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   269k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
calendar.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  58.2k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
datefmt.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   187k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
datefmt.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  93.0k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
dcfmtsym.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  1.06M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
dcfmtsym.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   177k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
decimfmt.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   316k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
decimfmt.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   119k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
dtfmtsym.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   224k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
dtfmtsym.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  56.2k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
dtptngen.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   986k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
dtptngen.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   470k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
formatted_string_builder.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   224k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
gregocal.cpp:_ZL9U_FAILURE10UErrorCode:
  737|     15|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
gregoimp.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      8|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
messageformat2_checker.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  7.54k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
messageformat2_data_model.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  13.2M|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
messageformat2_data_model.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  14.9M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
messageformat2_errors.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  27.4k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
nfrs.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  42.4k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
nfrule.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   169k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
nfsubs.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  21.2k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_affixutils.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   112k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_decimfmtprops.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   309k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_simple.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   168k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
olsontz.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|      4|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
olsontz.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      8|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
pluralranges.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   402k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
bytesinkutil.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  2.15M|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
charstr.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  19.4M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
charstr.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   334k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
edits.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  2.93M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
edits.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  4.64k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
locbased.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  1.22M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
locid.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   548k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
loclikely.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  46.5k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
loclikely.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   139k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
loclikelysubtags.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  38.2k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
loclikelysubtags.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|     20|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
lsr.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|     16|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
messagepattern.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   105M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
putil.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      4|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
putil.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|      2|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
simpleformatter.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  9.60k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uarrsort.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      8|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uchar.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      1|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ucurr.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   266k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ucurr.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   311k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
udata.cpp:_ZL9U_FAILURE10UErrorCode:
  737|    151|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
udata.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|     43|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
udatamem.cpp:_ZL9U_FAILURE10UErrorCode:
  737|     20|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uhash.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   216k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uloc.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  7.90M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
unifiedcache.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   690k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
unifiedcache.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  2.04k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uniset_props.cpp:_ZL9U_FAILURE10UErrorCode:
  737|     32|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uniset_props.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|      4|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
unistr.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      3|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
unistr.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|     25|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
unistr_case.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  92.5k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
unistr_case.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  4.64k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uresbund.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  12.4M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uresbund.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  2.28M|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uresdata.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  2.00M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ustrcase.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  92.5k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
ustring.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   680k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
ustrtrns.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      3|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uvector.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  13.5M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
characterproperties.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      8|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ruleiter.cpp:_ZL9U_FAILURE10UErrorCode:
  737|     13|    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|   232k|ucache_hashKeys(const UHashTok key) {
   50|   232k|    const CacheKeyBase* ckey = static_cast<const CacheKeyBase*>(key.pointer);
   51|   232k|    return ckey->hashCode();
   52|   232k|}
_ZN6icu_7818ucache_compareKeysE8UElementS0_:
   55|   231k|ucache_compareKeys(const UHashTok key1, const UHashTok key2) {
   56|   231k|    const CacheKeyBase* p1 = static_cast<const CacheKeyBase*>(key1.pointer);
   57|   231k|    const CacheKeyBase* p2 = static_cast<const CacheKeyBase*>(key2.pointer);
   58|   231k|    return *p1 == *p2;
   59|   231k|}
_ZN6icu_7816ucache_deleteKeyEPv:
   62|  1.04k|ucache_deleteKey(void *obj) {
   63|  1.04k|    CacheKeyBase* p = static_cast<CacheKeyBase*>(obj);
   64|  1.04k|    delete p;
   65|  1.04k|}
_ZN6icu_7812CacheKeyBaseD2Ev:
   67|   229k|CacheKeyBase::~CacheKeyBase() {
   68|   229k|}
_ZN6icu_7812UnifiedCache11getInstanceER10UErrorCode:
   88|   228k|UnifiedCache *UnifiedCache::getInstance(UErrorCode &status) {
   89|   228k|    umtx_initOnce(gCacheInitOnce, &cacheInit, status);
   90|   228k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (90:9): [True: 0, False: 228k]
  ------------------
   91|      0|        return nullptr;
   92|      0|    }
   93|   228k|    U_ASSERT(gCache != nullptr);
  ------------------
  |  |   35|   228k|#   define U_ASSERT(exp) (void)0
  ------------------
   94|   228k|    return gCache;
   95|   228k|}
_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|   228k|void UnifiedCache::handleUnreferencedObject() const {
  168|   228k|    std::lock_guard<std::mutex> lock(*gCacheMutex);
  169|   228k|    --fNumValuesInUse;
  170|   228k|    _runEvictionSlice();
  171|   228k|}
_ZNK6icu_7812UnifiedCache12_nextElementEv:
  237|  1.04k|UnifiedCache::_nextElement() const {
  238|  1.04k|    const UHashElement *element = uhash_nextElement(fHashtable, &fEvictPos);
  ------------------
  |  | 1029|  1.04k|#define uhash_nextElement U_ICU_ENTRY_POINT_RENAME(uhash_nextElement)
  |  |  ------------------
  |  |  |  |  123|  1.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  239|  1.04k|    if (element == nullptr) {
  ------------------
  |  Branch (239:9): [True: 0, False: 1.04k]
  ------------------
  240|      0|        fEvictPos = UHASH_FIRST;
  ------------------
  |  |  610|      0|#define UHASH_FIRST (-1)
  ------------------
  241|      0|        return uhash_nextElement(fHashtable, &fEvictPos);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  242|      0|    }
  243|  1.04k|    return element;
  244|  1.04k|}
_ZNK6icu_7812UnifiedCache27_computeCountOfItemsToEvictEv:
  266|   230k|int32_t UnifiedCache::_computeCountOfItemsToEvict() const {
  267|   230k|    int32_t totalItems = uhash_count(fHashtable);
  ------------------
  |  | 1001|   230k|#define uhash_count U_ICU_ENTRY_POINT_RENAME(uhash_count)
  |  |  ------------------
  |  |  |  |  123|   230k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   230k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   230k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  268|   230k|    int32_t evictableItems = totalItems - fNumValuesInUse;
  269|       |
  270|   230k|    int32_t unusedLimitByPercentage = fNumValuesInUse * fMaxPercentageOfInUse / 100;
  271|   230k|    int32_t unusedLimit = std::max(unusedLimitByPercentage, fMaxUnused);
  272|   230k|    int32_t countOfItemsToEvict = std::max<int32_t>(0, evictableItems - unusedLimit);
  273|   230k|    return countOfItemsToEvict;
  274|   230k|}
_ZNK6icu_7812UnifiedCache17_runEvictionSliceEv:
  276|   230k|void UnifiedCache::_runEvictionSlice() const {
  277|   230k|    int32_t maxItemsToEvict = _computeCountOfItemsToEvict();
  278|   230k|    if (maxItemsToEvict <= 0) {
  ------------------
  |  Branch (278:9): [True: 229k, False: 1.04k]
  ------------------
  279|   229k|        return;
  280|   229k|    }
  281|  1.04k|    for (int32_t i = 0; i < MAX_EVICT_ITERATIONS; ++i) {
  ------------------
  |  Branch (281:25): [True: 1.04k, False: 0]
  ------------------
  282|  1.04k|        const UHashElement *element = _nextElement();
  283|  1.04k|        if (element == nullptr) {
  ------------------
  |  Branch (283:13): [True: 0, False: 1.04k]
  ------------------
  284|      0|            break;
  285|      0|        }
  286|  1.04k|        if (_isEvictable(element)) {
  ------------------
  |  Branch (286:13): [True: 1.04k, False: 0]
  ------------------
  287|  1.04k|            const SharedObject *sharedObject =
  288|  1.04k|                    static_cast<const SharedObject*>(element->value.pointer);
  289|  1.04k|            uhash_removeElement(fHashtable, element);
  ------------------
  |  | 1037|  1.04k|#define uhash_removeElement U_ICU_ENTRY_POINT_RENAME(uhash_removeElement)
  |  |  ------------------
  |  |  |  |  123|  1.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  290|  1.04k|            removeSoftRef(sharedObject);   // Deletes sharedObject when SoftRefCount goes to zero.
  291|  1.04k|            ++fAutoEvictedCount;
  292|  1.04k|            if (--maxItemsToEvict == 0) {
  ------------------
  |  Branch (292:17): [True: 1.04k, False: 0]
  ------------------
  293|  1.04k|                break;
  294|  1.04k|            }
  295|  1.04k|        }
  296|  1.04k|    }
  297|  1.04k|}
_ZNK6icu_7812UnifiedCache7_putNewERKNS_12CacheKeyBaseEPKNS_12SharedObjectE10UErrorCodeRS7_:
  303|  2.04k|        UErrorCode &status) const {
  304|  2.04k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (304:9): [True: 0, False: 2.04k]
  ------------------
  305|      0|        return;
  306|      0|    }
  307|  2.04k|    CacheKeyBase *keyToAdopt = key.clone();
  308|  2.04k|    if (keyToAdopt == nullptr) {
  ------------------
  |  Branch (308:9): [True: 0, False: 2.04k]
  ------------------
  309|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  310|      0|        return;
  311|      0|    }
  312|  2.04k|    keyToAdopt->fCreationStatus = creationStatus;
  313|  2.04k|    if (value->softRefCount == 0) {
  ------------------
  |  Branch (313:9): [True: 0, False: 2.04k]
  ------------------
  314|      0|        _registerPrimary(keyToAdopt, value);
  315|      0|    }
  316|  2.04k|    void *oldValue = uhash_put(fHashtable, keyToAdopt, (void *) value, &status);
  ------------------
  |  | 1032|  2.04k|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  317|  2.04k|    U_ASSERT(oldValue == nullptr);
  ------------------
  |  |   35|  2.04k|#   define U_ASSERT(exp) (void)0
  ------------------
  318|  2.04k|    (void)oldValue;
  319|  2.04k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (319:9): [True: 2.04k, False: 0]
  ------------------
  320|  2.04k|        value->softRefCount++;
  321|  2.04k|    }
  322|  2.04k|}
_ZNK6icu_7812UnifiedCache18_putIfAbsentAndGetERKNS_12CacheKeyBaseERPKNS_12SharedObjectER10UErrorCode:
  327|  2.04k|        UErrorCode &status) const {
  328|  2.04k|    std::lock_guard<std::mutex> lock(*gCacheMutex);
  329|  2.04k|    const UHashElement *element = uhash_find(fHashtable, &key);
  ------------------
  |  | 1006|  2.04k|#define uhash_find U_ICU_ENTRY_POINT_RENAME(uhash_find)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|  2.04k|    if (element != nullptr && !_inProgress(element)) {
  ------------------
  |  Branch (330:9): [True: 2.04k, False: 0]
  |  Branch (330:31): [True: 0, False: 2.04k]
  ------------------
  331|      0|        _fetch(element, value, status);
  332|      0|        return;
  333|      0|    }
  334|  2.04k|    if (element == nullptr) {
  ------------------
  |  Branch (334:9): [True: 0, False: 2.04k]
  ------------------
  335|      0|        UErrorCode putError = U_ZERO_ERROR;
  336|       |        // best-effort basis only.
  337|      0|        _putNew(key, value, status, putError);
  338|  2.04k|    } else {
  339|  2.04k|        _put(element, value, status);
  340|  2.04k|    }
  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|  2.04k|    _runEvictionSlice();
  344|  2.04k|}
_ZNK6icu_7812UnifiedCache5_pollERKNS_12CacheKeyBaseERPKNS_12SharedObjectER10UErrorCode:
  350|   228k|        UErrorCode &status) const {
  351|   228k|    U_ASSERT(value == nullptr);
  ------------------
  |  |   35|   228k|#   define U_ASSERT(exp) (void)0
  ------------------
  352|   228k|    U_ASSERT(status == U_ZERO_ERROR);
  ------------------
  |  |   35|   228k|#   define U_ASSERT(exp) (void)0
  ------------------
  353|   228k|    std::unique_lock<std::mutex> lock(*gCacheMutex);
  354|   228k|    const UHashElement *element = uhash_find(fHashtable, &key);
  ------------------
  |  | 1006|   228k|#define uhash_find U_ICU_ENTRY_POINT_RENAME(uhash_find)
  |  |  ------------------
  |  |  |  |  123|   228k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   228k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   228k|#       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|   228k|     while (element != nullptr && _inProgress(element)) {
  ------------------
  |  Branch (359:13): [True: 226k, False: 2.04k]
  |  Branch (359:35): [True: 0, False: 226k]
  ------------------
  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|   228k|    if (element != nullptr) {
  ------------------
  |  Branch (366:9): [True: 226k, False: 2.04k]
  ------------------
  367|   226k|         _fetch(element, value, status);
  368|   226k|        return true;
  369|   226k|    }
  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|  2.04k|    _putNew(key, fNoValue, U_ZERO_ERROR, status);
  375|  2.04k|    return false;
  376|   228k|}
_ZNK6icu_7812UnifiedCache4_getERKNS_12CacheKeyBaseERPKNS_12SharedObjectEPKvR10UErrorCode:
  382|   228k|        UErrorCode &status) const {
  383|   228k|    U_ASSERT(value == nullptr);
  ------------------
  |  |   35|   228k|#   define U_ASSERT(exp) (void)0
  ------------------
  384|   228k|    U_ASSERT(status == U_ZERO_ERROR);
  ------------------
  |  |   35|   228k|#   define U_ASSERT(exp) (void)0
  ------------------
  385|   228k|    if (_poll(key, value, status)) {
  ------------------
  |  Branch (385:9): [True: 226k, False: 2.04k]
  ------------------
  386|   226k|        if (value == fNoValue) {
  ------------------
  |  Branch (386:13): [True: 0, False: 226k]
  ------------------
  387|      0|            SharedObject::clearPtr(value);
  388|      0|        }
  389|   226k|        return;
  390|   226k|    }
  391|  2.04k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (391:9): [True: 0, False: 2.04k]
  ------------------
  392|      0|        return;
  393|      0|    }
  394|  2.04k|    value = key.createObject(creationContext, status);
  395|  2.04k|    U_ASSERT(value == nullptr || value->hasHardReferences());
  ------------------
  |  |   35|  2.04k|#   define U_ASSERT(exp) (void)0
  ------------------
  396|  2.04k|    U_ASSERT(value != nullptr || status != U_ZERO_ERROR);
  ------------------
  |  |   35|  2.04k|#   define U_ASSERT(exp) (void)0
  ------------------
  397|  2.04k|    if (value == nullptr) {
  ------------------
  |  Branch (397:9): [True: 0, False: 2.04k]
  ------------------
  398|      0|        SharedObject::copyPtr(fNoValue, value);
  399|      0|    }
  400|  2.04k|    _putIfAbsentAndGet(key, value, status);
  401|  2.04k|    if (value == fNoValue) {
  ------------------
  |  Branch (401:9): [True: 0, False: 2.04k]
  ------------------
  402|      0|        SharedObject::clearPtr(value);
  403|      0|    }
  404|  2.04k|}
_ZNK6icu_7812UnifiedCache16_registerPrimaryEPKNS_12CacheKeyBaseEPKNS_12SharedObjectE:
  407|  2.04k|            const CacheKeyBase *theKey, const SharedObject *value) const {
  408|  2.04k|    theKey->fIsPrimary = true;
  409|  2.04k|    value->cachePtr = this;
  410|  2.04k|    ++fNumValuesTotal;
  411|  2.04k|    ++fNumValuesInUse;
  412|  2.04k|}
_ZNK6icu_7812UnifiedCache4_putEPK12UHashElementPKNS_12SharedObjectE10UErrorCode:
  417|  2.04k|        const UErrorCode status) const {
  418|  2.04k|    U_ASSERT(_inProgress(element));
  ------------------
  |  |   35|  2.04k|#   define U_ASSERT(exp) (void)0
  ------------------
  419|  2.04k|    const CacheKeyBase* theKey = static_cast<const CacheKeyBase*>(element->key.pointer);
  420|  2.04k|    const SharedObject* oldValue = static_cast<const SharedObject*>(element->value.pointer);
  421|  2.04k|    theKey->fCreationStatus = status;
  422|  2.04k|    if (value->softRefCount == 0) {
  ------------------
  |  Branch (422:9): [True: 2.04k, False: 0]
  ------------------
  423|  2.04k|        _registerPrimary(theKey, value);
  424|  2.04k|    }
  425|  2.04k|    value->softRefCount++;
  426|  2.04k|    UHashElement *ptr = const_cast<UHashElement *>(element);
  427|  2.04k|    ptr->value.pointer = (void *) value;
  428|  2.04k|    U_ASSERT(oldValue == fNoValue);
  ------------------
  |  |   35|  2.04k|#   define U_ASSERT(exp) (void)0
  ------------------
  429|  2.04k|    removeSoftRef(oldValue);
  430|       |
  431|       |    // Tell waiting threads that we replace in-progress status with
  432|       |    // an error.
  433|  2.04k|    gInProgressValueAddedCond->notify_all();
  434|  2.04k|}
_ZNK6icu_7812UnifiedCache6_fetchEPK12UHashElementRPKNS_12SharedObjectER10UErrorCode:
  439|   455k|        UErrorCode &status) const {
  440|   455k|    const CacheKeyBase* theKey = static_cast<const CacheKeyBase*>(element->key.pointer);
  441|   455k|    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|   455k|    removeHardRef(value);
  447|   455k|    value = static_cast<const SharedObject *>(element->value.pointer);
  448|   455k|    addHardRef(value);
  449|   455k|}
_ZNK6icu_7812UnifiedCache11_inProgressEPK12UHashElement:
  452|   228k|UBool UnifiedCache::_inProgress(const UHashElement* element) const {
  453|   228k|    UErrorCode status = U_ZERO_ERROR;
  454|   228k|    const SharedObject * value = nullptr;
  455|   228k|    _fetch(element, value, status);
  456|   228k|    UBool result = _inProgress(value, status);
  457|   228k|    removeHardRef(value);
  458|   228k|    return result;
  459|   228k|}
_ZNK6icu_7812UnifiedCache11_inProgressEPKNS_12SharedObjectE10UErrorCode:
  462|   229k|        const SharedObject* theValue, UErrorCode creationStatus) const {
  463|   229k|    return (theValue == fNoValue && creationStatus == U_ZERO_ERROR);
  ------------------
  |  Branch (463:13): [True: 2.04k, False: 227k]
  |  Branch (463:37): [True: 2.04k, False: 0]
  ------------------
  464|   229k|}
_ZNK6icu_7812UnifiedCache12_isEvictableEPK12UHashElement:
  467|  1.04k|{
  468|  1.04k|    const CacheKeyBase* theKey = static_cast<const CacheKeyBase*>(element->key.pointer);
  469|  1.04k|    const SharedObject* theValue = static_cast<const SharedObject*>(element->value.pointer);
  470|       |
  471|       |    // Entries that are under construction are never evictable
  472|  1.04k|    if (_inProgress(theValue, theKey->fCreationStatus)) {
  ------------------
  |  Branch (472:9): [True: 0, False: 1.04k]
  ------------------
  473|      0|        return false;
  474|      0|    }
  475|       |
  476|       |    // We can evict entries that are either not a primary or have just
  477|       |    // one reference (The one reference being from the cache itself).
  478|  1.04k|    return (!theKey->fIsPrimary || (theValue->softRefCount == 1 && theValue->noHardReferences()));
  ------------------
  |  Branch (478:13): [True: 0, False: 1.04k]
  |  Branch (478:37): [True: 1.04k, False: 0]
  |  Branch (478:68): [True: 1.04k, False: 0]
  ------------------
  479|  1.04k|}
_ZNK6icu_7812UnifiedCache13removeSoftRefEPKNS_12SharedObjectE:
  481|  3.09k|void UnifiedCache::removeSoftRef(const SharedObject *value) const {
  482|  3.09k|    U_ASSERT(value->cachePtr == this);
  ------------------
  |  |   35|  3.09k|#   define U_ASSERT(exp) (void)0
  ------------------
  483|  3.09k|    U_ASSERT(value->softRefCount > 0);
  ------------------
  |  |   35|  3.09k|#   define U_ASSERT(exp) (void)0
  ------------------
  484|  3.09k|    if (--value->softRefCount == 0) {
  ------------------
  |  Branch (484:9): [True: 1.04k, False: 2.04k]
  ------------------
  485|  1.04k|        --fNumValuesTotal;
  486|  1.04k|        if (value->noHardReferences()) {
  ------------------
  |  Branch (486:13): [True: 1.04k, False: 0]
  ------------------
  487|  1.04k|            delete value;
  488|  1.04k|        } 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|  1.04k|    }
  495|  3.09k|}
_ZNK6icu_7812UnifiedCache13removeHardRefEPKNS_12SharedObjectE:
  497|   683k|int32_t UnifiedCache::removeHardRef(const SharedObject *value) const {
  498|   683k|    int refCount = 0;
  499|   683k|    if (value) {
  ------------------
  |  Branch (499:9): [True: 228k, False: 455k]
  ------------------
  500|   228k|        refCount = umtx_atomic_dec(&value->hardRefCount);
  501|   228k|        U_ASSERT(refCount >= 0);
  ------------------
  |  |   35|   228k|#   define U_ASSERT(exp) (void)0
  ------------------
  502|   228k|        if (refCount == 0) {
  ------------------
  |  Branch (502:13): [True: 226k, False: 2.04k]
  ------------------
  503|   226k|            --fNumValuesInUse;
  504|   226k|        }
  505|   228k|    }
  506|   683k|    return refCount;
  507|   683k|}
_ZNK6icu_7812UnifiedCache10addHardRefEPKNS_12SharedObjectE:
  509|   455k|int32_t UnifiedCache::addHardRef(const SharedObject *value) const {
  510|   455k|    int refCount = 0;
  511|   455k|    if (value) {
  ------------------
  |  Branch (511:9): [True: 455k, False: 0]
  ------------------
  512|   455k|        refCount = umtx_atomic_inc(&value->hardRefCount);
  513|   455k|        U_ASSERT(refCount >= 1);
  ------------------
  |  |   35|   455k|#   define U_ASSERT(exp) (void)0
  ------------------
  514|   455k|        if (refCount == 1) {
  ------------------
  |  Branch (514:13): [True: 453k, False: 2.04k]
  ------------------
  515|   453k|            fNumValuesInUse++;
  516|   453k|        }
  517|   455k|    }
  518|   455k|    return refCount;
  519|   455k|}
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|   228k|   CacheKeyBase() : fCreationStatus(U_ZERO_ERROR), fIsPrimary(false) {}
_ZN6icu_7812CacheKeyBaseC2ERKS0_:
   43|  2.04k|           : UObject(other), fCreationStatus(other.fCreationStatus), fIsPrimary(false) { }
_ZN6icu_78eqERKNS_12CacheKeyBaseES2_:
   79|   231k|                                 const CacheKeyBase& rhs) {
   80|   231k|       return lhs.equals(rhs);
   81|   231k|   }
_ZN6icu_7812UnifiedCache11getByLocaleINS_18SharedNumberFormatEEEvRKNS_6LocaleERPKT_R10UErrorCode:
  269|  77.3k|           const Locale &loc, const T *&ptr, UErrorCode &status) {
  270|  77.3k|       const UnifiedCache *cache = getInstance(status);
  271|  77.3k|       if (U_FAILURE(status)) {
  ------------------
  |  Branch (271:12): [True: 0, False: 77.3k]
  ------------------
  272|      0|           return;
  273|      0|       }
  274|  77.3k|       cache->get(LocaleCacheKey<T>(loc), ptr, status);
  275|  77.3k|   }
_ZNK6icu_7812UnifiedCache3getINS_18SharedNumberFormatEEEvRKNS_8CacheKeyIT_EERPKS4_R10UErrorCode:
  205|  77.3k|           UErrorCode &status) const {
  206|  77.3k|       get(key, nullptr, ptr, status);
  207|  77.3k|   }
_ZNK6icu_7812UnifiedCache3getINS_18SharedNumberFormatEEEvRKNS_8CacheKeyIT_EEPKvRPKS4_R10UErrorCode:
  228|  77.3k|           UErrorCode &status) const {
  229|  77.3k|       if (U_FAILURE(status)) {
  ------------------
  |  Branch (229:12): [True: 0, False: 77.3k]
  ------------------
  230|      0|           return;
  231|      0|       }
  232|  77.3k|       UErrorCode creationStatus = U_ZERO_ERROR;
  233|  77.3k|       const SharedObject *value = nullptr;
  234|  77.3k|       _get(key, value, creationContext, creationStatus);
  235|  77.3k|       const T *tvalue = (const T *) value;
  236|  77.3k|       if (U_SUCCESS(creationStatus)) {
  ------------------
  |  Branch (236:12): [True: 77.3k, False: 0]
  ------------------
  237|  77.3k|           SharedObject::copyPtr(tvalue, ptr);
  238|  77.3k|       }
  239|  77.3k|       SharedObject::clearPtr(tvalue);
  240|       |       // Take care not to overwrite a warning status passed in with
  241|       |       // another warning or U_ZERO_ERROR.
  242|  77.3k|       if (status == U_ZERO_ERROR || U_FAILURE(creationStatus)) {
  ------------------
  |  Branch (242:12): [True: 21.2k, False: 56.1k]
  |  Branch (242:38): [True: 0, False: 56.1k]
  ------------------
  243|  21.2k|           status = creationStatus;
  244|  21.2k|       }
  245|  77.3k|   }
_ZN6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEEC2ERKNS_6LocaleE:
  151|  77.3k|   LocaleCacheKey(const Locale &loc) : fLoc(loc) {}
_ZNK6icu_788CacheKeyINS_18SharedNumberFormatEE8hashCodeEv:
  110|  77.3k|   virtual int32_t hashCode() const override {
  111|  77.3k|       const char *s = typeid(T).name();
  112|  77.3k|       return ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s)));
  ------------------
  |  | 1878|  77.3k|#define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN)
  |  |  ------------------
  |  |  |  |  123|  77.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  77.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  77.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                     return ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s)));
  ------------------
  |  |   37|  77.3k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  77.3k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  113|  77.3k|   }
_ZNK6icu_788CacheKeyINS_18SharedNumberFormatEE6equalsERKNS_12CacheKeyBaseE:
  129|  77.3k|   virtual bool equals(const CacheKeyBase &other) const override {
  130|  77.3k|       return this == &other || typeid(*this) == typeid(other);
  ------------------
  |  Branch (130:15): [True: 0, False: 77.3k]
  |  Branch (130:33): [True: 77.3k, False: 0]
  ------------------
  131|  77.3k|   }
_ZNK6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEE8hashCodeEv:
  155|  77.3k|   virtual int32_t hashCode() const override {
  156|  77.3k|       return (int32_t)(37u * (uint32_t)CacheKey<T>::hashCode() + (uint32_t)fLoc.hashCode());
  157|  77.3k|   }
_ZNK6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEE5cloneEv:
  161|      2|   virtual CacheKeyBase *clone() const override {
  162|      2|       return new LocaleCacheKey<T>(*this);
  163|      2|   }
_ZN6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEEC2ERKS2_:
  153|      2|           : CacheKey<T>(other), fLoc(other.fLoc) { }
_ZNK6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEE6equalsERKNS_12CacheKeyBaseE:
  142|  77.3k|   virtual bool equals(const CacheKeyBase &other) const override {
  143|  77.3k|       if (!CacheKey<T>::equals(other)) {
  ------------------
  |  Branch (143:12): [True: 0, False: 77.3k]
  ------------------
  144|      0|           return false;
  145|      0|       }
  146|       |       // We know this and other are of same class because equals() on
  147|       |       // CacheKey returned true.
  148|  77.3k|       return operator==(static_cast<const LocaleCacheKey<T> &>(other));
  149|  77.3k|   }
_ZNK6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEEeqERKS2_:
  158|  77.3k|   inline bool operator == (const LocaleCacheKey<T> &other) const {
  159|  77.3k|       return fLoc == other.fLoc;
  160|  77.3k|   }
_ZN6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEED2Ev:
  154|  77.3k|   virtual ~LocaleCacheKey() { }
_ZN6icu_7812UnifiedCache11getByLocaleINS_14SharedCalendarEEEvRKNS_6LocaleERPKT_R10UErrorCode:
  269|  58.2k|           const Locale &loc, const T *&ptr, UErrorCode &status) {
  270|  58.2k|       const UnifiedCache *cache = getInstance(status);
  271|  58.2k|       if (U_FAILURE(status)) {
  ------------------
  |  Branch (271:12): [True: 0, False: 58.2k]
  ------------------
  272|      0|           return;
  273|      0|       }
  274|  58.2k|       cache->get(LocaleCacheKey<T>(loc), ptr, status);
  275|  58.2k|   }
_ZNK6icu_7812UnifiedCache3getINS_14SharedCalendarEEEvRKNS_8CacheKeyIT_EERPKS4_R10UErrorCode:
  205|  58.2k|           UErrorCode &status) const {
  206|  58.2k|       get(key, nullptr, ptr, status);
  207|  58.2k|   }
_ZNK6icu_7812UnifiedCache3getINS_14SharedCalendarEEEvRKNS_8CacheKeyIT_EEPKvRPKS4_R10UErrorCode:
  228|  58.2k|           UErrorCode &status) const {
  229|  58.2k|       if (U_FAILURE(status)) {
  ------------------
  |  Branch (229:12): [True: 0, False: 58.2k]
  ------------------
  230|      0|           return;
  231|      0|       }
  232|  58.2k|       UErrorCode creationStatus = U_ZERO_ERROR;
  233|  58.2k|       const SharedObject *value = nullptr;
  234|  58.2k|       _get(key, value, creationContext, creationStatus);
  235|  58.2k|       const T *tvalue = (const T *) value;
  236|  58.2k|       if (U_SUCCESS(creationStatus)) {
  ------------------
  |  Branch (236:12): [True: 58.2k, False: 0]
  ------------------
  237|  58.2k|           SharedObject::copyPtr(tvalue, ptr);
  238|  58.2k|       }
  239|  58.2k|       SharedObject::clearPtr(tvalue);
  240|       |       // Take care not to overwrite a warning status passed in with
  241|       |       // another warning or U_ZERO_ERROR.
  242|  58.2k|       if (status == U_ZERO_ERROR || U_FAILURE(creationStatus)) {
  ------------------
  |  Branch (242:12): [True: 19.7k, False: 38.4k]
  |  Branch (242:38): [True: 0, False: 38.4k]
  ------------------
  243|  19.7k|           status = creationStatus;
  244|  19.7k|       }
  245|  58.2k|   }
_ZN6icu_7814LocaleCacheKeyINS_14SharedCalendarEEC2ERKNS_6LocaleE:
  151|  58.2k|   LocaleCacheKey(const Locale &loc) : fLoc(loc) {}
_ZNK6icu_788CacheKeyINS_14SharedCalendarEE8hashCodeEv:
  110|  58.2k|   virtual int32_t hashCode() const override {
  111|  58.2k|       const char *s = typeid(T).name();
  112|  58.2k|       return ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s)));
  ------------------
  |  | 1878|  58.2k|#define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN)
  |  |  ------------------
  |  |  |  |  123|  58.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  58.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  58.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                     return ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s)));
  ------------------
  |  |   37|  58.2k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  58.2k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  113|  58.2k|   }
_ZNK6icu_788CacheKeyINS_14SharedCalendarEE6equalsERKNS_12CacheKeyBaseE:
  129|  58.2k|   virtual bool equals(const CacheKeyBase &other) const override {
  130|  58.2k|       return this == &other || typeid(*this) == typeid(other);
  ------------------
  |  Branch (130:15): [True: 0, False: 58.2k]
  |  Branch (130:33): [True: 58.2k, False: 0]
  ------------------
  131|  58.2k|   }
_ZNK6icu_7814LocaleCacheKeyINS_14SharedCalendarEE8hashCodeEv:
  155|  58.2k|   virtual int32_t hashCode() const override {
  156|  58.2k|       return (int32_t)(37u * (uint32_t)CacheKey<T>::hashCode() + (uint32_t)fLoc.hashCode());
  157|  58.2k|   }
_ZNK6icu_7814LocaleCacheKeyINS_14SharedCalendarEE5cloneEv:
  161|      2|   virtual CacheKeyBase *clone() const override {
  162|      2|       return new LocaleCacheKey<T>(*this);
  163|      2|   }
_ZN6icu_7814LocaleCacheKeyINS_14SharedCalendarEEC2ERKS2_:
  153|      2|           : CacheKey<T>(other), fLoc(other.fLoc) { }
_ZNK6icu_7814LocaleCacheKeyINS_14SharedCalendarEE6equalsERKNS_12CacheKeyBaseE:
  142|  58.2k|   virtual bool equals(const CacheKeyBase &other) const override {
  143|  58.2k|       if (!CacheKey<T>::equals(other)) {
  ------------------
  |  Branch (143:12): [True: 0, False: 58.2k]
  ------------------
  144|      0|           return false;
  145|      0|       }
  146|       |       // We know this and other are of same class because equals() on
  147|       |       // CacheKey returned true.
  148|  58.2k|       return operator==(static_cast<const LocaleCacheKey<T> &>(other));
  149|  58.2k|   }
_ZNK6icu_7814LocaleCacheKeyINS_14SharedCalendarEEeqERKS2_:
  158|  58.2k|   inline bool operator == (const LocaleCacheKey<T> &other) const {
  159|  58.2k|       return fLoc == other.fLoc;
  160|  58.2k|   }
_ZN6icu_7814LocaleCacheKeyINS_14SharedCalendarEED2Ev:
  154|  58.2k|   virtual ~LocaleCacheKey() { }
_ZN6icu_7814LocaleCacheKeyINS_18DateFmtBestPatternEEC2ERKNS_6LocaleE:
  151|  36.9k|   LocaleCacheKey(const Locale &loc) : fLoc(loc) {}
_ZNK6icu_788CacheKeyINS_18DateFmtBestPatternEE8hashCodeEv:
  110|  40.9k|   virtual int32_t hashCode() const override {
  111|  40.9k|       const char *s = typeid(T).name();
  112|  40.9k|       return ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s)));
  ------------------
  |  | 1878|  40.9k|#define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN)
  |  |  ------------------
  |  |  |  |  123|  40.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  40.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  40.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                     return ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s)));
  ------------------
  |  |   37|  40.9k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  40.9k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  113|  40.9k|   }
_ZNK6icu_788CacheKeyINS_18DateFmtBestPatternEE6equalsERKNS_12CacheKeyBaseE:
  129|  39.5k|   virtual bool equals(const CacheKeyBase &other) const override {
  130|  39.5k|       return this == &other || typeid(*this) == typeid(other);
  ------------------
  |  Branch (130:15): [True: 0, False: 39.5k]
  |  Branch (130:33): [True: 39.5k, False: 0]
  ------------------
  131|  39.5k|   }
_ZNK6icu_7814LocaleCacheKeyINS_18DateFmtBestPatternEE8hashCodeEv:
  155|  40.9k|   virtual int32_t hashCode() const override {
  156|  40.9k|       return (int32_t)(37u * (uint32_t)CacheKey<T>::hashCode() + (uint32_t)fLoc.hashCode());
  157|  40.9k|   }
_ZN6icu_7814LocaleCacheKeyINS_18DateFmtBestPatternEEC2ERKS2_:
  153|  2.04k|           : CacheKey<T>(other), fLoc(other.fLoc) { }
_ZNK6icu_7814LocaleCacheKeyINS_18DateFmtBestPatternEE6equalsERKNS_12CacheKeyBaseE:
  142|  39.5k|   virtual bool equals(const CacheKeyBase &other) const override {
  143|  39.5k|       if (!CacheKey<T>::equals(other)) {
  ------------------
  |  Branch (143:12): [True: 0, False: 39.5k]
  ------------------
  144|      0|           return false;
  145|      0|       }
  146|       |       // We know this and other are of same class because equals() on
  147|       |       // CacheKey returned true.
  148|  39.5k|       return operator==(static_cast<const LocaleCacheKey<T> &>(other));
  149|  39.5k|   }
_ZNK6icu_7814LocaleCacheKeyINS_18DateFmtBestPatternEEeqERKS2_:
  158|  39.5k|   inline bool operator == (const LocaleCacheKey<T> &other) const {
  159|  39.5k|       return fLoc == other.fLoc;
  160|  39.5k|   }
_ZN6icu_7814LocaleCacheKeyINS_18DateFmtBestPatternEED2Ev:
  154|  37.9k|   virtual ~LocaleCacheKey() { }
_ZNK6icu_7812UnifiedCache3getINS_18DateFmtBestPatternEEEvRKNS_8CacheKeyIT_EERPKS4_R10UErrorCode:
  205|  36.9k|           UErrorCode &status) const {
  206|  36.9k|       get(key, nullptr, ptr, status);
  207|  36.9k|   }
_ZNK6icu_7812UnifiedCache3getINS_18DateFmtBestPatternEEEvRKNS_8CacheKeyIT_EEPKvRPKS4_R10UErrorCode:
  228|  36.9k|           UErrorCode &status) const {
  229|  36.9k|       if (U_FAILURE(status)) {
  ------------------
  |  Branch (229:12): [True: 0, False: 36.9k]
  ------------------
  230|      0|           return;
  231|      0|       }
  232|  36.9k|       UErrorCode creationStatus = U_ZERO_ERROR;
  233|  36.9k|       const SharedObject *value = nullptr;
  234|  36.9k|       _get(key, value, creationContext, creationStatus);
  235|  36.9k|       const T *tvalue = (const T *) value;
  236|  36.9k|       if (U_SUCCESS(creationStatus)) {
  ------------------
  |  Branch (236:12): [True: 36.9k, False: 0]
  ------------------
  237|  36.9k|           SharedObject::copyPtr(tvalue, ptr);
  238|  36.9k|       }
  239|  36.9k|       SharedObject::clearPtr(tvalue);
  240|       |       // Take care not to overwrite a warning status passed in with
  241|       |       // another warning or U_ZERO_ERROR.
  242|  36.9k|       if (status == U_ZERO_ERROR || U_FAILURE(creationStatus)) {
  ------------------
  |  Branch (242:12): [True: 1.05k, False: 35.8k]
  |  Branch (242:38): [True: 0, False: 35.8k]
  ------------------
  243|  1.05k|           status = creationStatus;
  244|  1.05k|       }
  245|  36.9k|   }
_ZN6icu_7812UnifiedCache11getByLocaleINS_23SharedDateFormatSymbolsEEEvRKNS_6LocaleERPKT_R10UErrorCode:
  269|  56.1k|           const Locale &loc, const T *&ptr, UErrorCode &status) {
  270|  56.1k|       const UnifiedCache *cache = getInstance(status);
  271|  56.1k|       if (U_FAILURE(status)) {
  ------------------
  |  Branch (271:12): [True: 0, False: 56.1k]
  ------------------
  272|      0|           return;
  273|      0|       }
  274|  56.1k|       cache->get(LocaleCacheKey<T>(loc), ptr, status);
  275|  56.1k|   }
_ZNK6icu_7812UnifiedCache3getINS_23SharedDateFormatSymbolsEEEvRKNS_8CacheKeyIT_EERPKS4_R10UErrorCode:
  205|  56.1k|           UErrorCode &status) const {
  206|  56.1k|       get(key, nullptr, ptr, status);
  207|  56.1k|   }
_ZNK6icu_7812UnifiedCache3getINS_23SharedDateFormatSymbolsEEEvRKNS_8CacheKeyIT_EEPKvRPKS4_R10UErrorCode:
  228|  56.1k|           UErrorCode &status) const {
  229|  56.1k|       if (U_FAILURE(status)) {
  ------------------
  |  Branch (229:12): [True: 0, False: 56.1k]
  ------------------
  230|      0|           return;
  231|      0|       }
  232|  56.1k|       UErrorCode creationStatus = U_ZERO_ERROR;
  233|  56.1k|       const SharedObject *value = nullptr;
  234|  56.1k|       _get(key, value, creationContext, creationStatus);
  235|  56.1k|       const T *tvalue = (const T *) value;
  236|  56.1k|       if (U_SUCCESS(creationStatus)) {
  ------------------
  |  Branch (236:12): [True: 56.1k, False: 0]
  ------------------
  237|  56.1k|           SharedObject::copyPtr(tvalue, ptr);
  238|  56.1k|       }
  239|  56.1k|       SharedObject::clearPtr(tvalue);
  240|       |       // Take care not to overwrite a warning status passed in with
  241|       |       // another warning or U_ZERO_ERROR.
  242|  56.1k|       if (status == U_ZERO_ERROR || U_FAILURE(creationStatus)) {
  ------------------
  |  Branch (242:12): [True: 490, False: 55.6k]
  |  Branch (242:38): [True: 0, False: 55.6k]
  ------------------
  243|    490|           status = creationStatus;
  244|    490|       }
  245|  56.1k|   }
_ZN6icu_7814LocaleCacheKeyINS_23SharedDateFormatSymbolsEEC2ERKNS_6LocaleE:
  151|  56.1k|   LocaleCacheKey(const Locale &loc) : fLoc(loc) {}
_ZNK6icu_788CacheKeyINS_23SharedDateFormatSymbolsEE8hashCodeEv:
  110|  56.1k|   virtual int32_t hashCode() const override {
  111|  56.1k|       const char *s = typeid(T).name();
  112|  56.1k|       return ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s)));
  ------------------
  |  | 1878|  56.1k|#define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN)
  |  |  ------------------
  |  |  |  |  123|  56.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  56.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  56.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                     return ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s)));
  ------------------
  |  |   37|  56.1k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  56.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  113|  56.1k|   }
_ZNK6icu_788CacheKeyINS_23SharedDateFormatSymbolsEE6equalsERKNS_12CacheKeyBaseE:
  129|  56.1k|   virtual bool equals(const CacheKeyBase &other) const override {
  130|  56.1k|       return this == &other || typeid(*this) == typeid(other);
  ------------------
  |  Branch (130:15): [True: 0, False: 56.1k]
  |  Branch (130:33): [True: 56.1k, False: 0]
  ------------------
  131|  56.1k|   }
_ZNK6icu_7814LocaleCacheKeyINS_23SharedDateFormatSymbolsEE8hashCodeEv:
  155|  56.1k|   virtual int32_t hashCode() const override {
  156|  56.1k|       return (int32_t)(37u * (uint32_t)CacheKey<T>::hashCode() + (uint32_t)fLoc.hashCode());
  157|  56.1k|   }
_ZNK6icu_7814LocaleCacheKeyINS_23SharedDateFormatSymbolsEE5cloneEv:
  161|      2|   virtual CacheKeyBase *clone() const override {
  162|      2|       return new LocaleCacheKey<T>(*this);
  163|      2|   }
_ZN6icu_7814LocaleCacheKeyINS_23SharedDateFormatSymbolsEEC2ERKS2_:
  153|      2|           : CacheKey<T>(other), fLoc(other.fLoc) { }
_ZNK6icu_7814LocaleCacheKeyINS_23SharedDateFormatSymbolsEE6equalsERKNS_12CacheKeyBaseE:
  142|  56.1k|   virtual bool equals(const CacheKeyBase &other) const override {
  143|  56.1k|       if (!CacheKey<T>::equals(other)) {
  ------------------
  |  Branch (143:12): [True: 0, False: 56.1k]
  ------------------
  144|      0|           return false;
  145|      0|       }
  146|       |       // We know this and other are of same class because equals() on
  147|       |       // CacheKey returned true.
  148|  56.1k|       return operator==(static_cast<const LocaleCacheKey<T> &>(other));
  149|  56.1k|   }
_ZNK6icu_7814LocaleCacheKeyINS_23SharedDateFormatSymbolsEEeqERKS2_:
  158|  56.1k|   inline bool operator == (const LocaleCacheKey<T> &other) const {
  159|  56.1k|       return fLoc == other.fLoc;
  160|  56.1k|   }
_ZN6icu_7814LocaleCacheKeyINS_23SharedDateFormatSymbolsEED2Ev:
  154|  56.1k|   virtual ~LocaleCacheKey() { }

_ZN6icu_7814UnicodeMatcherD2Ev:
   23|      2|UnicodeMatcher::~UnicodeMatcher() {}
_ZN6icu_7813UnicodeFilterD2Ev:
   25|      2|UnicodeFilter::~UnicodeFilter() {}

_ZN6icu_7814UnicodeFunctorD2Ev:
   16|      2|UnicodeFunctor::~UnicodeFunctor() {}

_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|  7.94k|    int32_t add(const char16_t*p, UErrorCode &errorCode) {
   59|  7.94k|        if (U_FAILURE(errorCode)) { return -1; }
  ------------------
  |  Branch (59:13): [True: 0, False: 7.94k]
  ------------------
   60|  7.94k|        if (isFrozen) {
  ------------------
  |  Branch (60:13): [True: 0, False: 7.94k]
  ------------------
   61|      0|            errorCode = U_NO_WRITE_PERMISSION;
   62|      0|            return -1;
   63|      0|        }
   64|       |        // The string points into the resource bundle.
   65|  7.94k|        int32_t oldIndex = uhash_geti(&map, p);
  ------------------
  |  | 1008|  7.94k|#define uhash_geti U_ICU_ENTRY_POINT_RENAME(uhash_geti)
  |  |  ------------------
  |  |  |  |  123|  7.94k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.94k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.94k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   66|  7.94k|        if (oldIndex != 0) {  // found duplicate
  ------------------
  |  Branch (66:13): [True: 32, False: 7.91k]
  ------------------
   67|     32|            return oldIndex;
   68|     32|        }
   69|       |        // Explicit NUL terminator for the previous string.
   70|       |        // The strings object is also terminated with one implicit NUL.
   71|  7.91k|        strings->append(0, errorCode);
   72|  7.91k|        int32_t newIndex = strings->length();
   73|  7.91k|        strings->appendInvariantChars(p, u_strlen(p), errorCode);
  ------------------
  |  |  393|  7.91k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|  7.91k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.91k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.91k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   74|  7.91k|        uhash_puti(&map, const_cast<char16_t *>(p), newIndex, &errorCode);
  ------------------
  |  | 1033|  7.91k|#define uhash_puti U_ICU_ENTRY_POINT_RENAME(uhash_puti)
  |  |  ------------------
  |  |  |  |  123|  7.91k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.91k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.91k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|  7.91k|        return newIndex;
   76|  7.94k|    }
_ZN6icu_7817UniqueCharStrings6freezeEv:
  100|      1|    void freeze() { isFrozen = true; }
_ZNK6icu_7817UniqueCharStrings3getEi:
  106|  23.0k|    const char *get(int32_t i) const {
  107|  23.0k|        U_ASSERT(isFrozen);
  ------------------
  |  |   35|  23.0k|#   define U_ASSERT(exp) (void)0
  ------------------
  108|  23.0k|        return isFrozen && i > 0 ? strings->data() + i : nullptr;
  ------------------
  |  Branch (108:16): [True: 23.0k, False: 0]
  |  Branch (108:28): [True: 23.0k, False: 0]
  ------------------
  109|  23.0k|    }
_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_7817UniqueCharStrings10addByValueENS_13UnicodeStringER10UErrorCode:
   81|  22.5k|    int32_t addByValue(UnicodeString s, UErrorCode &errorCode) {
   82|  22.5k|        if (U_FAILURE(errorCode)) { return -1; }
  ------------------
  |  Branch (82:13): [True: 0, False: 22.5k]
  ------------------
   83|  22.5k|        if (isFrozen) {
  ------------------
  |  Branch (83:13): [True: 0, False: 22.5k]
  ------------------
   84|      0|            errorCode = U_NO_WRITE_PERMISSION;
   85|      0|            return -1;
   86|      0|        }
   87|  22.5k|        int32_t oldIndex = uhash_geti(&map, s.getTerminatedBuffer());
  ------------------
  |  | 1008|  22.5k|#define uhash_geti U_ICU_ENTRY_POINT_RENAME(uhash_geti)
  |  |  ------------------
  |  |  |  |  123|  22.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  22.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  22.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   88|  22.5k|        if (oldIndex != 0) {  // found duplicate
  ------------------
  |  Branch (88:13): [True: 15.1k, False: 7.36k]
  ------------------
   89|  15.1k|            return oldIndex;
   90|  15.1k|        }
   91|       |        // We need to store the string content of the UnicodeString.
   92|  7.36k|        UnicodeString *key = keyStore.create(s);
   93|  7.36k|        if (key == nullptr) {
  ------------------
  |  Branch (93:13): [True: 0, False: 7.36k]
  ------------------
   94|      0|            errorCode = U_MEMORY_ALLOCATION_ERROR;
   95|      0|            return -1;
   96|      0|        }
   97|  7.36k|        return add(key->getTerminatedBuffer(), errorCode);
   98|  7.36k|    }

_ZNK6icu_7810UnicodeSet10hasStringsEv:
  120|     14|UBool UnicodeSet::hasStrings() const {
  121|     14|    return strings_ != nullptr && !strings_->isEmpty();
  ------------------
  |  Branch (121:12): [True: 0, False: 14]
  |  Branch (121:35): [True: 0, False: 0]
  ------------------
  122|     14|}
_ZN6icu_7810UnicodeSetC2Ev:
  139|      9|UnicodeSet::UnicodeSet() {
  140|      9|    list[0] = UNICODESET_HIGH;
  ------------------
  |  |   34|      9|#define UNICODESET_HIGH 0x0110000
  ------------------
  141|      9|    _dbgct(this);
  142|      9|}
_ZN6icu_7810UnicodeSetC2Eii:
  151|      1|UnicodeSet::UnicodeSet(UChar32 start, UChar32 end) {
  152|      1|    list[0] = UNICODESET_HIGH;
  ------------------
  |  |   34|      1|#define UNICODESET_HIGH 0x0110000
  ------------------
  153|      1|    add(start, end);
  154|      1|    _dbgct(this);
  155|      1|}
_ZN6icu_7810UnicodeSetD2Ev:
  189|      2|UnicodeSet::~UnicodeSet() {
  190|      2|    _dbgdt(this); // first!
  191|      2|    if (list != stackList) {
  ------------------
  |  Branch (191:9): [True: 2, False: 0]
  ------------------
  192|      2|        uprv_free(list);
  ------------------
  |  | 1503|      2|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|      2|    }
  194|      2|    delete bmpSet;
  195|      2|    if (buffer != stackList) {
  ------------------
  |  Branch (195:9): [True: 2, False: 0]
  ------------------
  196|      2|        uprv_free(buffer);
  ------------------
  |  | 1503|      2|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  197|      2|    }
  198|      2|    delete strings_;
  199|      2|    delete stringSpan;
  200|      2|    releasePattern();
  201|      2|}
_ZN6icu_7810UnicodeSetaSERKS0_:
  206|      2|UnicodeSet& UnicodeSet::operator=(const UnicodeSet& o) {
  207|      2|    return copyFrom(o, false);
  208|      2|}
_ZN6icu_7810UnicodeSet8copyFromERKS0_a:
  210|      2|UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) {
  211|      2|    if (this == &o) {
  ------------------
  |  Branch (211:9): [True: 0, False: 2]
  ------------------
  212|      0|        return *this;
  213|      0|    }
  214|      2|    if (isFrozen()) {
  ------------------
  |  Branch (214:9): [True: 0, False: 2]
  ------------------
  215|      0|        return *this;
  216|      0|    }
  217|      2|    if (o.isBogus()) {
  ------------------
  |  Branch (217:9): [True: 0, False: 2]
  ------------------
  218|      0|        setToBogus();
  219|      0|        return *this;
  220|      0|    }
  221|      2|    if (!ensureCapacity(o.len)) {
  ------------------
  |  Branch (221:9): [True: 0, False: 2]
  ------------------
  222|       |        // ensureCapacity will mark the UnicodeSet as Bogus if OOM failure happens.
  223|      0|        return *this;
  224|      0|    }
  225|      2|    len = o.len;
  226|      2|    uprv_memcpy(list, o.list, (size_t)len*sizeof(UChar32));
  ------------------
  |  |   42|      2|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      2|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      2|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      2|    _Pragma("clang diagnostic push") \
  |  |   45|      2|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      2|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      2|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      2|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      2|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      2|    _Pragma("clang diagnostic pop") \
  |  |   49|      2|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      2|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      2|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      2|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  227|      2|    if (o.bmpSet != nullptr && !asThawed) {
  ------------------
  |  Branch (227:9): [True: 0, False: 2]
  |  Branch (227:32): [True: 0, False: 0]
  ------------------
  228|      0|        bmpSet = new BMPSet(*o.bmpSet, list, len);
  229|      0|        if (bmpSet == nullptr) { // Check for memory allocation error.
  ------------------
  |  Branch (229:13): [True: 0, False: 0]
  ------------------
  230|      0|            setToBogus();
  231|      0|            return *this;
  232|      0|        }
  233|      0|    }
  234|      2|    if (o.hasStrings()) {
  ------------------
  |  Branch (234:9): [True: 0, False: 2]
  ------------------
  235|      0|        UErrorCode status = U_ZERO_ERROR;
  236|      0|        if ((strings_ == nullptr && !allocateStrings(status)) ||
  ------------------
  |  Branch (236:14): [True: 0, False: 0]
  |  Branch (236:37): [True: 0, False: 0]
  ------------------
  237|      0|                (strings_->assign(*o.strings_, cloneUnicodeString, status), U_FAILURE(status))) {
  ------------------
  |  Branch (237:17): [True: 0, False: 0]
  ------------------
  238|      0|            setToBogus();
  239|      0|            return *this;
  240|      0|        }
  241|      2|    } else if (hasStrings()) {
  ------------------
  |  Branch (241:16): [True: 0, False: 2]
  ------------------
  242|      0|        strings_->removeAllElements();
  243|      0|    }
  244|      2|    if (o.stringSpan != nullptr && !asThawed) {
  ------------------
  |  Branch (244:9): [True: 0, False: 2]
  |  Branch (244:36): [True: 0, False: 0]
  ------------------
  245|      0|        stringSpan = new UnicodeSetStringSpan(*o.stringSpan, *strings_);
  246|      0|        if (stringSpan == nullptr) { // Check for memory allocation error.
  ------------------
  |  Branch (246:13): [True: 0, False: 0]
  ------------------
  247|      0|            setToBogus();
  248|      0|            return *this;
  249|      0|        }
  250|      0|    }
  251|      2|    releasePattern();
  252|      2|    if (o.pat) {
  ------------------
  |  Branch (252:9): [True: 0, False: 2]
  ------------------
  253|      0|        setPattern(o.pat, o.patLen);
  254|      0|    }
  255|      2|    return *this;
  256|      2|}
_ZNK6icu_7810UnicodeSet8containsEi:
  340|  51.8M|UBool UnicodeSet::contains(UChar32 c) const {
  341|       |    // Set i to the index of the start item greater than ch
  342|       |    // We know we will terminate without length test!
  343|       |    // LATER: for large sets, add binary search
  344|       |    //int32_t i = -1;
  345|       |    //for (;;) {
  346|       |    //    if (c < list[++i]) break;
  347|       |    //}
  348|  51.8M|    if (bmpSet != nullptr) {
  ------------------
  |  Branch (348:9): [True: 51.8M, False: 0]
  ------------------
  349|  51.8M|        return bmpSet->contains(c);
  350|  51.8M|    }
  351|      0|    if (stringSpan != nullptr) {
  ------------------
  |  Branch (351:9): [True: 0, False: 0]
  ------------------
  352|      0|        return stringSpan->contains(c);
  353|      0|    }
  354|      0|    if (c >= UNICODESET_HIGH) { // Don't need to check LOW bound
  ------------------
  |  |   34|      0|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (354:9): [True: 0, False: 0]
  ------------------
  355|      0|        return false;
  356|      0|    }
  357|      0|    int32_t i = findCodePoint(c);
  358|      0|    return i & 1; // return true if odd
  359|      0|}
_ZNK6icu_7810UnicodeSet13findCodePointEi:
  370|  6.19k|int32_t UnicodeSet::findCodePoint(UChar32 c) const {
  371|       |    /* Examples:
  372|       |                                       findCodePoint(c)
  373|       |       set              list[]         c=0 1 3 4 7 8
  374|       |       ===              ==============   ===========
  375|       |       []               [110000]         0 0 0 0 0 0
  376|       |       [\u0000-\u0003]  [0, 4, 110000]   1 1 1 2 2 2
  377|       |       [\u0004-\u0007]  [4, 8, 110000]   0 0 0 1 1 2
  378|       |       [:Any:]          [0, 110000]      1 1 1 1 1 1
  379|       |     */
  380|       |
  381|       |    // Return the smallest i such that c < list[i].  Assume
  382|       |    // list[len - 1] == HIGH and that c is legal (0..HIGH-1).
  383|  6.19k|    if (c < list[0])
  ------------------
  |  Branch (383:9): [True: 7, False: 6.18k]
  ------------------
  384|      7|        return 0;
  385|       |    // High runner test.  c is often after the last range, so an
  386|       |    // initial check for this condition pays off.
  387|  6.18k|    int32_t lo = 0;
  388|  6.18k|    int32_t hi = len - 1;
  389|  6.18k|    if (lo >= hi || c >= list[hi-1])
  ------------------
  |  Branch (389:9): [True: 0, False: 6.18k]
  |  Branch (389:21): [True: 6.13k, False: 52]
  ------------------
  390|  6.13k|        return hi;
  391|       |    // invariant: c >= list[lo]
  392|       |    // invariant: c < list[hi]
  393|    567|    for (;;) {
  394|    567|        int32_t i = (lo + hi) >> 1;
  395|    567|        if (i == lo) {
  ------------------
  |  Branch (395:13): [True: 52, False: 515]
  ------------------
  396|     52|            break; // Found!
  397|    515|        } else if (c < list[i]) {
  ------------------
  |  Branch (397:20): [True: 318, False: 197]
  ------------------
  398|    318|            hi = i;
  399|    318|        } else {
  400|    197|            lo = i;
  401|    197|        }
  402|    567|    }
  403|     52|    return hi;
  404|  6.18k|}
_ZN6icu_7810UnicodeSet3addEii:
  765|    860|UnicodeSet& UnicodeSet::add(UChar32 start, UChar32 end) {
  766|    860|    if (pinCodePoint(start) < pinCodePoint(end)) {
  ------------------
  |  Branch (766:9): [True: 710, False: 150]
  ------------------
  767|    710|        UChar32 limit = end + 1;
  768|       |        // Fast path for adding a new range after the last one.
  769|       |        // Odd list length: [..., lastStart, lastLimit, HIGH]
  770|    710|        if ((len & 1) != 0) {
  ------------------
  |  Branch (770:13): [True: 710, False: 0]
  ------------------
  771|       |            // If the list is empty, set lastLimit low enough to not be adjacent to 0.
  772|    710|            UChar32 lastLimit = len == 1 ? -2 : list[len - 2];
  ------------------
  |  Branch (772:33): [True: 3, False: 707]
  ------------------
  773|    710|            if (lastLimit <= start && !isFrozen() && !isBogus()) {
  ------------------
  |  Branch (773:17): [True: 696, False: 14]
  |  Branch (773:39): [True: 696, False: 0]
  |  Branch (773:54): [True: 696, False: 0]
  ------------------
  774|    696|                if (lastLimit == start) {
  ------------------
  |  Branch (774:21): [True: 0, False: 696]
  ------------------
  775|       |                    // Extend the last range.
  776|      0|                    list[len - 2] = limit;
  777|      0|                    if (limit == UNICODESET_HIGH) {
  ------------------
  |  |   34|      0|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (777:25): [True: 0, False: 0]
  ------------------
  778|      0|                        --len;
  779|      0|                    }
  780|    696|                } else {
  781|    696|                    list[len - 1] = start;
  782|    696|                    if (limit < UNICODESET_HIGH) {
  ------------------
  |  |   34|    696|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (782:25): [True: 695, False: 1]
  ------------------
  783|    695|                        if (ensureCapacity(len + 2)) {
  ------------------
  |  Branch (783:29): [True: 695, False: 0]
  ------------------
  784|    695|                            list[len++] = limit;
  785|    695|                            list[len++] = UNICODESET_HIGH;
  ------------------
  |  |   34|    695|#define UNICODESET_HIGH 0x0110000
  ------------------
  786|    695|                        }
  787|    695|                    } else {  // limit == UNICODESET_HIGH
  788|      1|                        if (ensureCapacity(len + 1)) {
  ------------------
  |  Branch (788:29): [True: 1, False: 0]
  ------------------
  789|      1|                            list[len++] = UNICODESET_HIGH;
  ------------------
  |  |   34|      1|#define UNICODESET_HIGH 0x0110000
  ------------------
  790|      1|                        }
  791|      1|                    }
  792|    696|                }
  793|    696|                releasePattern();
  794|    696|                return *this;
  795|    696|            }
  796|    710|        }
  797|       |        // This is slow. Could be much faster using findCodePoint(start)
  798|       |        // and modifying the list, dealing with adjacent & overlapping ranges.
  799|     14|        UChar32 range[3] = { start, limit, UNICODESET_HIGH };
  ------------------
  |  |   34|     14|#define UNICODESET_HIGH 0x0110000
  ------------------
  800|     14|        add(range, 2, 0);
  801|    150|    } else if (start == end) {
  ------------------
  |  Branch (801:16): [True: 150, False: 0]
  ------------------
  802|    150|        add(start);
  803|    150|    }
  804|    164|    return *this;
  805|    860|}
_ZN6icu_7810UnicodeSet3addEi:
  833|  6.19k|UnicodeSet& UnicodeSet::add(UChar32 c) {
  834|       |    // find smallest i such that c < list[i]
  835|       |    // if odd, then it is IN the set
  836|       |    // if even, then it is OUT of the set
  837|  6.19k|    int32_t i = findCodePoint(pinCodePoint(c));
  838|       |
  839|       |    // already in set?
  840|  6.19k|    if ((i & 1) != 0  || isFrozen() || isBogus()) return *this;
  ------------------
  |  Branch (840:9): [True: 20, False: 6.17k]
  |  Branch (840:26): [True: 0, False: 6.17k]
  |  Branch (840:40): [True: 0, False: 6.17k]
  ------------------
  841|       |
  842|       |    // HIGH is 0x110000
  843|       |    // assert(list[len-1] == HIGH);
  844|       |
  845|       |    // empty = [HIGH]
  846|       |    // [start_0, limit_0, start_1, limit_1, HIGH]
  847|       |
  848|       |    // [..., start_k-1, limit_k-1, start_k, limit_k, ..., HIGH]
  849|       |    //                             ^
  850|       |    //                             list[i]
  851|       |
  852|       |    // i == 0 means c is before the first range
  853|       |
  854|       |#ifdef DEBUG_US_ADD
  855|       |    printf("Add of ");
  856|       |    dump(c);
  857|       |    printf(" found at %d", i);
  858|       |    printf(": ");
  859|       |    dump(list, len);
  860|       |    printf(" => ");
  861|       |#endif
  862|       |
  863|  6.17k|    if (c == list[i]-1) {
  ------------------
  |  Branch (863:9): [True: 8, False: 6.16k]
  ------------------
  864|       |        // c is before start of next range
  865|      8|        list[i] = c;
  866|       |        // if we touched the HIGH mark, then add a new one
  867|      8|        if (c == (UNICODESET_HIGH - 1)) {
  ------------------
  |  |   34|      8|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (867:13): [True: 0, False: 8]
  ------------------
  868|      0|            if (!ensureCapacity(len+1)) {
  ------------------
  |  Branch (868:17): [True: 0, False: 0]
  ------------------
  869|       |                // ensureCapacity will mark the object as Bogus if OOM failure happens.
  870|      0|                return *this;
  871|      0|            }
  872|      0|            list[len++] = UNICODESET_HIGH;
  ------------------
  |  |   34|      0|#define UNICODESET_HIGH 0x0110000
  ------------------
  873|      0|        }
  874|      8|        if (i > 0 && c == list[i-1]) {
  ------------------
  |  Branch (874:13): [True: 8, False: 0]
  |  Branch (874:22): [True: 4, False: 4]
  ------------------
  875|       |            // collapse adjacent ranges
  876|       |
  877|       |            // [..., start_k-1, c, c, limit_k, ..., HIGH]
  878|       |            //                     ^
  879|       |            //                     list[i]
  880|       |
  881|       |            //for (int32_t k=i-1; k<len-2; ++k) {
  882|       |            //    list[k] = list[k+2];
  883|       |            //}
  884|      4|            UChar32* dst = list + i - 1;
  885|      4|            UChar32* src = dst + 2;
  886|      4|            UChar32* srclimit = list + len;
  887|     28|            while (src < srclimit) *(dst++) = *(src++);
  ------------------
  |  Branch (887:20): [True: 24, False: 4]
  ------------------
  888|       |
  889|      4|            len -= 2;
  890|      4|        }
  891|      8|    }
  892|       |
  893|  6.16k|    else if (i > 0 && c == list[i-1]) {
  ------------------
  |  Branch (893:14): [True: 6.15k, False: 7]
  |  Branch (893:23): [True: 4.06k, False: 2.09k]
  ------------------
  894|       |        // c is after end of prior range
  895|  4.06k|        list[i-1]++;
  896|       |        // no need to check for collapse here
  897|  4.06k|    }
  898|       |
  899|  2.10k|    else {
  900|       |        // At this point we know the new char is not adjacent to
  901|       |        // any existing ranges, and it is not 10FFFF.
  902|       |
  903|       |
  904|       |        // [..., start_k-1, limit_k-1, start_k, limit_k, ..., HIGH]
  905|       |        //                             ^
  906|       |        //                             list[i]
  907|       |
  908|       |        // [..., start_k-1, limit_k-1, c, c+1, start_k, limit_k, ..., HIGH]
  909|       |        //                             ^
  910|       |        //                             list[i]
  911|       |
  912|  2.10k|        if (!ensureCapacity(len+2)) {
  ------------------
  |  Branch (912:13): [True: 0, False: 2.10k]
  ------------------
  913|       |            // ensureCapacity will mark the object as Bogus if OOM failure happens.
  914|      0|            return *this;
  915|      0|        }
  916|       |
  917|  2.10k|        UChar32 *p = list + i;
  918|  2.10k|        uprv_memmove(p + 2, p, (len - i) * sizeof(*p));
  ------------------
  |  |   51|  2.10k|#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.10k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   52|  2.10k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   53|  2.10k|    _Pragma("clang diagnostic push") \
  |  |   54|  2.10k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   55|  2.10k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.10k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   56|  2.10k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.10k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   57|  2.10k|    _Pragma("clang diagnostic pop") \
  |  |   58|  2.10k|    U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  2.10k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   59|  2.10k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.10k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  919|  2.10k|        list[i] = c;
  920|  2.10k|        list[i+1] = c+1;
  921|  2.10k|        len += 2;
  922|  2.10k|    }
  923|       |
  924|       |#ifdef DEBUG_US_ADD
  925|       |    dump(list, len);
  926|       |    printf("\n");
  927|       |
  928|       |    for (i=1; i<len; ++i) {
  929|       |        if (list[i] <= list[i-1]) {
  930|       |            // Corrupt array!
  931|       |            printf("ERROR: list has been corrupted\n");
  932|       |            exit(1);
  933|       |        }
  934|       |    }
  935|       |#endif
  936|       |
  937|  6.17k|    releasePattern();
  938|  6.17k|    return *this;
  939|  6.17k|}
_ZN6icu_7810UnicodeSet6addAllERKS0_:
 1272|      7|UnicodeSet& UnicodeSet::addAll(const UnicodeSet& c) {
 1273|      7|    if ( c.len>0 && c.list!=nullptr ) {
  ------------------
  |  Branch (1273:10): [True: 7, False: 0]
  |  Branch (1273:21): [True: 7, False: 0]
  ------------------
 1274|      7|        add(c.list, c.len, 0);
 1275|      7|    }
 1276|       |
 1277|       |    // Add strings in order
 1278|      7|    if ( c.strings_!=nullptr ) {
  ------------------
  |  Branch (1278:10): [True: 0, False: 7]
  ------------------
 1279|      0|        for (int32_t i=0; i<c.strings_->size(); ++i) {
  ------------------
  |  Branch (1279:27): [True: 0, False: 0]
  ------------------
 1280|      0|            const UnicodeString* s = static_cast<const UnicodeString*>(c.strings_->elementAt(i));
 1281|      0|            if (!stringsContains(*s)) {
  ------------------
  |  Branch (1281:17): [True: 0, False: 0]
  ------------------
 1282|      0|                _add(*s);
 1283|      0|            }
 1284|      0|        }
 1285|      0|    }
 1286|      7|    return *this;
 1287|      7|}
_ZN6icu_7810UnicodeSet5clearEv:
 1362|      5|UnicodeSet& UnicodeSet::clear() {
 1363|      5|    if (isFrozen()) {
  ------------------
  |  Branch (1363:9): [True: 0, False: 5]
  ------------------
 1364|      0|        return *this;
 1365|      0|    }
 1366|      5|    list[0] = UNICODESET_HIGH;
  ------------------
  |  |   34|      5|#define UNICODESET_HIGH 0x0110000
  ------------------
 1367|      5|    len = 1;
 1368|      5|    releasePattern();
 1369|      5|    if (strings_ != nullptr) {
  ------------------
  |  Branch (1369:9): [True: 0, False: 5]
  ------------------
 1370|      0|        strings_->removeAllElements();
 1371|      0|    }
 1372|       |    // Remove bogus
 1373|      5|    fFlags = 0;
 1374|      5|    return *this;
 1375|      5|}
_ZNK6icu_7810UnicodeSet13getRangeCountEv:
 1383|      2|int32_t UnicodeSet::getRangeCount() const {
 1384|      2|    return len/2;
 1385|      2|}
_ZNK6icu_7810UnicodeSet13getRangeStartEi:
 1393|  3.88k|UChar32 UnicodeSet::getRangeStart(int32_t index) const {
 1394|  3.88k|    return list[index*2];
 1395|  3.88k|}
_ZNK6icu_7810UnicodeSet11getRangeEndEi:
 1403|  3.88k|UChar32 UnicodeSet::getRangeEnd(int32_t index) const {
 1404|  3.88k|    return list[index*2 + 1] - 1;
 1405|  3.88k|}
_ZN6icu_7810UnicodeSet7compactEv:
 1415|     11|UnicodeSet& UnicodeSet::compact() {
 1416|     11|    if (isFrozen() || isBogus()) {
  ------------------
  |  Branch (1416:9): [True: 0, False: 11]
  |  Branch (1416:23): [True: 0, False: 11]
  ------------------
 1417|      0|        return *this;
 1418|      0|    }
 1419|       |    // Delete buffer first to defragment memory less.
 1420|     11|    if (buffer != stackList) {
  ------------------
  |  Branch (1420:9): [True: 11, False: 0]
  ------------------
 1421|     11|        uprv_free(buffer);
  ------------------
  |  | 1503|     11|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|     11|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     11|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     11|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1422|     11|        buffer = nullptr;
 1423|     11|        bufferCapacity = 0;
 1424|     11|    }
 1425|     11|    if (list == stackList) {
  ------------------
  |  Branch (1425:9): [True: 4, False: 7]
  ------------------
 1426|       |        // pass
 1427|      7|    } else if (len <= INITIAL_CAPACITY) {
  ------------------
  |  Branch (1427:16): [True: 2, False: 5]
  ------------------
 1428|      2|        uprv_memcpy(stackList, list, len * sizeof(UChar32));
  ------------------
  |  |   42|      2|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      2|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      2|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      2|    _Pragma("clang diagnostic push") \
  |  |   45|      2|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      2|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      2|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      2|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      2|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      2|    _Pragma("clang diagnostic pop") \
  |  |   49|      2|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      2|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      2|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      2|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1429|      2|        uprv_free(list);
  ------------------
  |  | 1503|      2|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1430|      2|        list = stackList;
 1431|      2|        capacity = INITIAL_CAPACITY;
 1432|      5|    } else if ((len + 7) < capacity) {
  ------------------
  |  Branch (1432:16): [True: 5, False: 0]
  ------------------
 1433|       |        // If we have more than a little unused capacity, shrink it to len.
 1434|      5|        UChar32* temp = static_cast<UChar32*>(uprv_realloc(list, sizeof(UChar32) * len));
  ------------------
  |  | 1536|      5|#define uprv_realloc U_ICU_ENTRY_POINT_RENAME(uprv_realloc)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1435|      5|        if (temp) {
  ------------------
  |  Branch (1435:13): [True: 5, False: 0]
  ------------------
 1436|      5|            list = temp;
 1437|      5|            capacity = len;
 1438|      5|        }
 1439|       |        // else what the heck happened?! We allocated less memory!
 1440|       |        // Oh well. We'll keep our original array.
 1441|      5|    }
 1442|     11|    if (strings_ != nullptr && strings_->isEmpty()) {
  ------------------
  |  Branch (1442:9): [True: 0, False: 11]
  |  Branch (1442:32): [True: 0, False: 0]
  ------------------
 1443|      0|        delete strings_;
 1444|      0|        strings_ = nullptr;
 1445|      0|    }
 1446|     11|    return *this;
 1447|     11|}
_ZN6icu_7810UnicodeSet12nextCapacityEi:
 1624|     19|int32_t UnicodeSet::nextCapacity(int32_t minCapacity) {
 1625|       |    // Grow exponentially to reduce the frequency of allocations.
 1626|     19|    if (minCapacity < INITIAL_CAPACITY) {
  ------------------
  |  Branch (1626:9): [True: 2, False: 17]
  ------------------
 1627|      2|        return minCapacity + INITIAL_CAPACITY;
 1628|     17|    } else if (minCapacity <= 2500) {
  ------------------
  |  Branch (1628:16): [True: 16, False: 1]
  ------------------
 1629|     16|        return 5 * minCapacity;
 1630|     16|    } else {
 1631|      1|        int32_t newCapacity = 2 * minCapacity;
 1632|      1|        if (newCapacity > MAX_LENGTH) {
  ------------------
  |  Branch (1632:13): [True: 0, False: 1]
  ------------------
 1633|      0|            newCapacity = MAX_LENGTH;
 1634|      0|        }
 1635|      1|        return newCapacity;
 1636|      1|    }
 1637|     19|}
_ZN6icu_7810UnicodeSet14ensureCapacityEi:
 1639|  2.80k|bool UnicodeSet::ensureCapacity(int32_t newLen) {
 1640|  2.80k|    if (newLen > MAX_LENGTH) {
  ------------------
  |  Branch (1640:9): [True: 0, False: 2.80k]
  ------------------
 1641|      0|        newLen = MAX_LENGTH;
 1642|      0|    }
 1643|  2.80k|    if (newLen <= capacity) {
  ------------------
  |  Branch (1643:9): [True: 2.79k, False: 11]
  ------------------
 1644|  2.79k|        return true;
 1645|  2.79k|    }
 1646|     11|    int32_t newCapacity = nextCapacity(newLen);
 1647|     11|    UChar32* temp = static_cast<UChar32*>(uprv_malloc(newCapacity * sizeof(UChar32)));
  ------------------
  |  | 1524|     11|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|     11|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     11|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     11|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1648|     11|    if (temp == nullptr) {
  ------------------
  |  Branch (1648:9): [True: 0, False: 11]
  ------------------
 1649|      0|        setToBogus(); // set the object to bogus state if an OOM failure occurred.
 1650|      0|        return false;
 1651|      0|    }
 1652|       |    // Copy only the actual contents.
 1653|     11|    uprv_memcpy(temp, list, len * sizeof(UChar32));
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1654|     11|    if (list != stackList) {
  ------------------
  |  Branch (1654:9): [True: 6, False: 5]
  ------------------
 1655|      6|        uprv_free(list);
  ------------------
  |  | 1503|      6|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1656|      6|    }
 1657|     11|    list = temp;
 1658|     11|    capacity = newCapacity;
 1659|     11|    return true;
 1660|     11|}
_ZN6icu_7810UnicodeSet20ensureBufferCapacityEi:
 1662|     21|bool UnicodeSet::ensureBufferCapacity(int32_t newLen) {
 1663|     21|    if (newLen > MAX_LENGTH) {
  ------------------
  |  Branch (1663:9): [True: 0, False: 21]
  ------------------
 1664|      0|        newLen = MAX_LENGTH;
 1665|      0|    }
 1666|     21|    if (newLen <= bufferCapacity) {
  ------------------
  |  Branch (1666:9): [True: 13, False: 8]
  ------------------
 1667|     13|        return true;
 1668|     13|    }
 1669|      8|    int32_t newCapacity = nextCapacity(newLen);
 1670|      8|    UChar32* temp = static_cast<UChar32*>(uprv_malloc(newCapacity * sizeof(UChar32)));
  ------------------
  |  | 1524|      8|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      8|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      8|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      8|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1671|      8|    if (temp == nullptr) {
  ------------------
  |  Branch (1671:9): [True: 0, False: 8]
  ------------------
 1672|      0|        setToBogus();
 1673|      0|        return false;
 1674|      0|    }
 1675|       |    // The buffer has no contents to be copied.
 1676|       |    // It is always filled from scratch after this call.
 1677|      8|    if (buffer != stackList) {
  ------------------
  |  Branch (1677:9): [True: 4, False: 4]
  ------------------
 1678|      4|        uprv_free(buffer);
  ------------------
  |  | 1503|      4|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      4|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      4|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      4|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1679|      4|    }
 1680|      8|    buffer = temp;
 1681|      8|    bufferCapacity = newCapacity;
 1682|      8|    return true;
 1683|      8|}
_ZN6icu_7810UnicodeSet11swapBuffersEv:
 1688|     21|void UnicodeSet::swapBuffers() {
 1689|       |    // swap list and buffer
 1690|     21|    UChar32* temp = list;
 1691|     21|    list = buffer;
 1692|     21|    buffer = temp;
 1693|       |
 1694|     21|    int32_t c = capacity;
 1695|     21|    capacity = bufferCapacity;
 1696|     21|    bufferCapacity = c;
 1697|     21|}
_ZN6icu_7810UnicodeSet3addEPKiia:
 1763|     21|void UnicodeSet::add(const UChar32* other, int32_t otherLen, int8_t polarity) {
 1764|     21|    if (isFrozen() || isBogus() || other==nullptr) {
  ------------------
  |  Branch (1764:9): [True: 0, False: 21]
  |  Branch (1764:23): [True: 0, False: 21]
  |  Branch (1764:36): [True: 0, False: 21]
  ------------------
 1765|      0|        return;
 1766|      0|    }
 1767|     21|    if (!ensureBufferCapacity(len + otherLen)) {
  ------------------
  |  Branch (1767:9): [True: 0, False: 21]
  ------------------
 1768|      0|        return;
 1769|      0|    }
 1770|       |
 1771|     21|    int32_t i = 0, j = 0, k = 0;
 1772|     21|    UChar32 a = list[i++];
 1773|     21|    UChar32 b = other[j++];
 1774|       |    // change from xor is that we have to check overlapping pairs
 1775|       |    // polarity bit 1 means a is second, bit 2 means b is.
 1776|  12.6k|    for (;;) {
 1777|  12.6k|        switch (polarity) {
  ------------------
  |  Branch (1777:17): [True: 0, False: 12.6k]
  ------------------
 1778|  6.33k|          case 0: // both first; take lower if unequal
  ------------------
  |  Branch (1778:11): [True: 6.33k, False: 6.34k]
  ------------------
 1779|  6.33k|            if (a < b) { // take a
  ------------------
  |  Branch (1779:17): [True: 5.43k, False: 894]
  ------------------
 1780|       |                // Back up over overlapping ranges in buffer[]
 1781|  5.43k|                if (k > 0 && a <= buffer[k-1]) {
  ------------------
  |  Branch (1781:21): [True: 5.42k, False: 17]
  |  Branch (1781:30): [True: 665, False: 4.75k]
  ------------------
 1782|       |                    // Pick latter end value in buffer[] vs. list[]
 1783|    665|                    a = max(list[i], buffer[--k]);
 1784|  4.77k|                } else {
 1785|       |                    // No overlap
 1786|  4.77k|                    buffer[k++] = a;
 1787|  4.77k|                    a = list[i];
 1788|  4.77k|                }
 1789|  5.43k|                i++; // Common if/else code factored out
 1790|  5.43k|                polarity ^= 1;
 1791|  5.43k|            } else if (b < a) { // take b
  ------------------
  |  Branch (1791:24): [True: 872, False: 22]
  ------------------
 1792|    872|                if (k > 0 && b <= buffer[k-1]) {
  ------------------
  |  Branch (1792:21): [True: 868, False: 4]
  |  Branch (1792:30): [True: 136, False: 732]
  ------------------
 1793|    136|                    b = max(other[j], buffer[--k]);
 1794|    736|                } else {
 1795|    736|                    buffer[k++] = b;
 1796|    736|                    b = other[j];
 1797|    736|                }
 1798|    872|                j++;
 1799|    872|                polarity ^= 2;
 1800|    872|            } else { // a == b, take a, drop b
 1801|     22|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|     22|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1801:21): [True: 17, False: 5]
  ------------------
 1802|       |                // This is symmetrical; it doesn't matter if
 1803|       |                // we backtrack with a or b. - liu
 1804|      5|                if (k > 0 && a <= buffer[k-1]) {
  ------------------
  |  Branch (1804:21): [True: 5, False: 0]
  |  Branch (1804:30): [True: 0, False: 5]
  ------------------
 1805|      0|                    a = max(list[i], buffer[--k]);
 1806|      5|                } else {
 1807|       |                    // No overlap
 1808|      5|                    buffer[k++] = a;
 1809|      5|                    a = list[i];
 1810|      5|                }
 1811|      5|                i++;
 1812|      5|                polarity ^= 1;
 1813|      5|                b = other[j++];
 1814|      5|                polarity ^= 2;
 1815|      5|            }
 1816|  6.31k|            break;
 1817|  6.31k|          case 3: // both second; take higher if unequal, and drop other
  ------------------
  |  Branch (1817:11): [True: 17, False: 12.6k]
  ------------------
 1818|     17|            if (b <= a) { // take a
  ------------------
  |  Branch (1818:17): [True: 7, False: 10]
  ------------------
 1819|      7|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|      7|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1819:21): [True: 0, False: 7]
  ------------------
 1820|      7|                buffer[k++] = a;
 1821|     10|            } else { // take b
 1822|     10|                if (b == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|     10|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1822:21): [True: 0, False: 10]
  ------------------
 1823|     10|                buffer[k++] = b;
 1824|     10|            }
 1825|     17|            a = list[i++];
 1826|     17|            polarity ^= 1;   // factored common code
 1827|     17|            b = other[j++];
 1828|     17|            polarity ^= 2;
 1829|     17|            break;
 1830|  5.44k|          case 1: // a second, b first; if b < a, overlap
  ------------------
  |  Branch (1830:11): [True: 5.44k, False: 7.22k]
  ------------------
 1831|  5.44k|            if (a < b) { // no overlap, take a
  ------------------
  |  Branch (1831:17): [True: 5.42k, False: 17]
  ------------------
 1832|  5.42k|                buffer[k++] = a; a = list[i++]; polarity ^= 1;
 1833|  5.42k|            } else if (b < a) { // OVERLAP, drop b
  ------------------
  |  Branch (1833:24): [True: 7, False: 10]
  ------------------
 1834|      7|                b = other[j++];
 1835|      7|                polarity ^= 2;
 1836|     10|            } else { // a == b, drop both!
 1837|     10|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|     10|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1837:21): [True: 2, False: 8]
  ------------------
 1838|      8|                a = list[i++];
 1839|      8|                polarity ^= 1;
 1840|      8|                b = other[j++];
 1841|      8|                polarity ^= 2;
 1842|      8|            }
 1843|  5.44k|            break;
 1844|  5.44k|          case 2: // a first, b second; if a < b, overlap
  ------------------
  |  Branch (1844:11): [True: 880, False: 11.7k]
  ------------------
 1845|    880|            if (b < a) { // no overlap, take b
  ------------------
  |  Branch (1845:17): [True: 865, False: 15]
  ------------------
 1846|    865|                buffer[k++] = b;
 1847|    865|                b = other[j++];
 1848|    865|                polarity ^= 2;
 1849|    865|            } else  if (a < b) { // OVERLAP, drop a
  ------------------
  |  Branch (1849:25): [True: 5, False: 10]
  ------------------
 1850|      5|                a = list[i++];
 1851|      5|                polarity ^= 1;
 1852|     10|            } else { // a == b, drop both!
 1853|     10|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|     10|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1853:21): [True: 2, False: 8]
  ------------------
 1854|      8|                a = list[i++];
 1855|      8|                polarity ^= 1;
 1856|      8|                b = other[j++];
 1857|      8|                polarity ^= 2;
 1858|      8|            }
 1859|    878|            break;
 1860|  12.6k|        }
 1861|  12.6k|    }
 1862|     21| loop_end:
 1863|     21|    buffer[k++] = UNICODESET_HIGH;    // terminate
  ------------------
  |  |   34|     21|#define UNICODESET_HIGH 0x0110000
  ------------------
 1864|     21|    len = k;
 1865|     21|    swapBuffers();
 1866|     21|    releasePattern();
 1867|     21|}
_ZN6icu_7810UnicodeSet12_appendToPatERNS_13UnicodeStringEia:
 1979|      2|void UnicodeSet::_appendToPat(UnicodeString& buf, UChar32 c, UBool escapeUnprintable) {
 1980|      2|    if (escapeUnprintable ? ICU_Utility::isUnprintable(c) : ICU_Utility::shouldAlwaysBeEscaped(c)) {
  ------------------
  |  Branch (1980:9): [True: 0, False: 2]
  |  Branch (1980:9): [True: 0, False: 2]
  ------------------
 1981|       |        // Use hex escape notation (\uxxxx or \Uxxxxxxxx) for anything
 1982|       |        // unprintable
 1983|      0|        ICU_Utility::escape(buf, c);
 1984|      0|        return;
 1985|      0|    }
 1986|       |    // Okay to let ':' pass through
 1987|      2|    switch (c) {
 1988|      0|    case u'[':
  ------------------
  |  Branch (1988:5): [True: 0, False: 2]
  ------------------
 1989|      0|    case u']':
  ------------------
  |  Branch (1989:5): [True: 0, False: 2]
  ------------------
 1990|      0|    case u'-':
  ------------------
  |  Branch (1990:5): [True: 0, False: 2]
  ------------------
 1991|      0|    case u'^':
  ------------------
  |  Branch (1991:5): [True: 0, False: 2]
  ------------------
 1992|      0|    case u'&':
  ------------------
  |  Branch (1992:5): [True: 0, False: 2]
  ------------------
 1993|      0|    case u'\\':
  ------------------
  |  Branch (1993:5): [True: 0, False: 2]
  ------------------
 1994|      0|    case u'{':
  ------------------
  |  Branch (1994:5): [True: 0, False: 2]
  ------------------
 1995|      0|    case u'}':
  ------------------
  |  Branch (1995:5): [True: 0, False: 2]
  ------------------
 1996|      0|    case u':':
  ------------------
  |  Branch (1996:5): [True: 0, False: 2]
  ------------------
 1997|      0|    case SymbolTable::SYMBOL_REF:
  ------------------
  |  Branch (1997:5): [True: 0, False: 2]
  ------------------
 1998|      0|        buf.append(u'\\');
 1999|      0|        break;
 2000|      2|    default:
  ------------------
  |  Branch (2000:5): [True: 2, False: 0]
  ------------------
 2001|       |        // Escape whitespace
 2002|      2|        if (PatternProps::isWhiteSpace(c)) {
  ------------------
  |  Branch (2002:13): [True: 0, False: 2]
  ------------------
 2003|      0|            buf.append(u'\\');
 2004|      0|        }
 2005|      2|        break;
 2006|      2|    }
 2007|      2|    buf.append(c);
 2008|      2|}
_ZN6icu_7810UnicodeSet12_appendToPatERNS_13UnicodeStringEiia:
 2011|      1|                              UBool escapeUnprintable) {
 2012|      1|    _appendToPat(result, start, escapeUnprintable);
 2013|      1|    if (start != end) {
  ------------------
  |  Branch (2013:9): [True: 0, False: 1]
  ------------------
 2014|      0|        if ((start+1) != end ||
  ------------------
  |  Branch (2014:13): [True: 0, False: 0]
  ------------------
 2015|       |                // Avoid writing what looks like a lead+trail surrogate pair.
 2016|      0|                start == 0xdbff) {
  ------------------
  |  Branch (2016:17): [True: 0, False: 0]
  ------------------
 2017|      0|            result.append(u'-');
 2018|      0|        }
 2019|      0|        _appendToPat(result, end, escapeUnprintable);
 2020|      0|    }
 2021|      1|}
_ZNK6icu_7810UnicodeSet16_generatePatternERNS_13UnicodeStringEa:
 2082|      1|{
 2083|      1|    result.append(u'[');
 2084|       |
 2085|      1|    int32_t i = 0;
 2086|      1|    int32_t limit = len & ~1;  // = 2 * getRangeCount()
 2087|       |
 2088|       |    // If the set contains at least 2 intervals and includes both
 2089|       |    // MIN_VALUE and MAX_VALUE, then the inverse representation will
 2090|       |    // be more economical.
 2091|       |    //     if (getRangeCount() >= 2 &&
 2092|       |    //             getRangeStart(0) == MIN_VALUE &&
 2093|       |    //             getRangeEnd(last) == MAX_VALUE)
 2094|       |    // Invariant: list[len-1] == HIGH == MAX_VALUE + 1
 2095|       |    // If limit == len then len is even and the last range ends with MAX_VALUE.
 2096|       |    //
 2097|       |    // *But* do not write the inverse (complement) if there are strings.
 2098|       |    // Since ICU 70, the '^' performs a code point complement which removes all strings.
 2099|      1|    if (len >= 4 && list[0] == 0 && limit == len && !hasStrings()) {
  ------------------
  |  Branch (2099:9): [True: 0, False: 1]
  |  Branch (2099:21): [True: 0, False: 0]
  |  Branch (2099:37): [True: 0, False: 0]
  |  Branch (2099:53): [True: 0, False: 0]
  ------------------
 2100|       |        // Emit the inverse
 2101|      0|        result.append(u'^');
 2102|       |        // Offsetting the inversion list index by one lets us
 2103|       |        // iterate over the ranges of the set complement.
 2104|      0|        i = 1;
 2105|      0|        --limit;
 2106|      0|    }
 2107|       |
 2108|       |    // Emit the ranges as pairs.
 2109|      2|    while (i < limit) {
  ------------------
  |  Branch (2109:12): [True: 1, False: 1]
  ------------------
 2110|      1|        UChar32 start = list[i];  // getRangeStart()
 2111|      1|        UChar32 end = list[i + 1] - 1;  // getRangeEnd() = range limit minus one
 2112|      1|        if (!(0xd800 <= end && end <= 0xdbff)) {
  ------------------
  |  Branch (2112:15): [True: 0, False: 1]
  |  Branch (2112:32): [True: 0, False: 0]
  ------------------
 2113|      1|            _appendToPat(result, start, end, escapeUnprintable);
 2114|      1|            i += 2;
 2115|      1|        } else {
 2116|       |            // The range ends with a lead surrogate.
 2117|       |            // Avoid writing what looks like a lead+trail surrogate pair.
 2118|       |            // 1. Postpone ranges that start with a lead surrogate code point.
 2119|      0|            int32_t firstLead = i;
 2120|      0|            while ((i += 2) < limit && list[i] <= 0xdbff) {}
  ------------------
  |  Branch (2120:20): [True: 0, False: 0]
  |  Branch (2120:40): [True: 0, False: 0]
  ------------------
 2121|      0|            int32_t firstAfterLead = i;
 2122|       |            // 2. Write following ranges that start with a trail surrogate code point.
 2123|      0|            while (i < limit && (start = list[i]) <= 0xdfff) {
  ------------------
  |  Branch (2123:20): [True: 0, False: 0]
  |  Branch (2123:33): [True: 0, False: 0]
  ------------------
 2124|      0|                _appendToPat(result, start, list[i + 1] - 1, escapeUnprintable);
 2125|      0|                i += 2;
 2126|      0|            }
 2127|       |            // 3. Now write the postponed ranges.
 2128|      0|            for (int j = firstLead; j < firstAfterLead; j += 2) {
  ------------------
  |  Branch (2128:37): [True: 0, False: 0]
  ------------------
 2129|      0|                _appendToPat(result, list[j], list[j + 1] - 1, escapeUnprintable);
 2130|      0|            }
 2131|      0|        }
 2132|      1|    }
 2133|       |
 2134|      1|    if (strings_ != nullptr) {
  ------------------
  |  Branch (2134:9): [True: 0, False: 1]
  ------------------
 2135|      0|        for (int32_t i = 0; i<strings_->size(); ++i) {
  ------------------
  |  Branch (2135:29): [True: 0, False: 0]
  ------------------
 2136|      0|            result.append(u'{');
 2137|      0|            _appendToPat(result,
 2138|      0|                         *static_cast<const UnicodeString*>(strings_->elementAt(i)),
 2139|      0|                         escapeUnprintable);
 2140|      0|            result.append(u'}');
 2141|      0|        }
 2142|      0|    }
 2143|      1|    return result.append(u']');
 2144|      1|}
_ZN6icu_7810UnicodeSet14releasePatternEv:
 2149|  6.90k|void UnicodeSet::releasePattern() {
 2150|  6.90k|    if (pat) {
  ------------------
  |  Branch (2150:9): [True: 1, False: 6.90k]
  ------------------
 2151|      1|        uprv_free(pat);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2152|      1|        pat = nullptr;
 2153|      1|        patLen = 0;
 2154|      1|    }
 2155|  6.90k|}
_ZN6icu_7810UnicodeSet10setPatternEPKDsi:
 2160|      3|void UnicodeSet::setPattern(const char16_t *newPat, int32_t newPatLen) {
 2161|      3|    releasePattern();
 2162|      3|    pat = static_cast<char16_t*>(uprv_malloc((newPatLen + 1) * sizeof(char16_t)));
  ------------------
  |  | 1524|      3|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2163|      3|    if (pat) {
  ------------------
  |  Branch (2163:9): [True: 3, False: 0]
  ------------------
 2164|      3|        patLen = newPatLen;
 2165|      3|        u_memcpy(pat, newPat, patLen);
  ------------------
  |  |  334|      3|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2166|      3|        pat[patLen] = 0;
 2167|      3|    }
 2168|       |    // else we don't care if malloc failed. This was just a nice cache.
 2169|       |    // We can regenerate an equivalent pattern later when requested.
 2170|      3|}
_ZN6icu_7810UnicodeSet6freezeEv:
 2172|     10|UnicodeSet *UnicodeSet::freeze() {
 2173|     10|    if(!isFrozen() && !isBogus()) {
  ------------------
  |  Branch (2173:8): [True: 10, False: 0]
  |  Branch (2173:23): [True: 10, False: 0]
  ------------------
 2174|     10|        compact();
 2175|       |
 2176|       |        // Optimize contains() and span() and similar functions.
 2177|     10|        if (hasStrings()) {
  ------------------
  |  Branch (2177:13): [True: 0, False: 10]
  ------------------
 2178|      0|            stringSpan = new UnicodeSetStringSpan(*this, *strings_, UnicodeSetStringSpan::ALL);
 2179|      0|            if (stringSpan == nullptr) {
  ------------------
  |  Branch (2179:17): [True: 0, False: 0]
  ------------------
 2180|      0|                setToBogus();
 2181|      0|                return this;
 2182|      0|            } else if (!stringSpan->needsStringSpanUTF16()) {
  ------------------
  |  Branch (2182:24): [True: 0, False: 0]
  ------------------
 2183|       |                // All strings are irrelevant for span() etc. because
 2184|       |                // all of each string's code points are contained in this set.
 2185|       |                // Do not check needsStringSpanUTF8() because UTF-8 has at most as
 2186|       |                // many relevant strings as UTF-16.
 2187|       |                // (Thus needsStringSpanUTF8() implies needsStringSpanUTF16().)
 2188|      0|                delete stringSpan;
 2189|      0|                stringSpan = nullptr;
 2190|      0|            }
 2191|      0|        }
 2192|     10|        if (stringSpan == nullptr) {
  ------------------
  |  Branch (2192:13): [True: 10, False: 0]
  ------------------
 2193|       |            // No span-relevant strings: Optimize for code point spans.
 2194|     10|            bmpSet=new BMPSet(list, len);
 2195|     10|            if (bmpSet == nullptr) { // Check for memory allocation error.
  ------------------
  |  Branch (2195:17): [True: 0, False: 10]
  ------------------
 2196|      0|                setToBogus();
 2197|      0|            }
 2198|     10|        }
 2199|     10|    }
 2200|     10|    return this;
 2201|     10|}
uniset.cpp:_ZN6icu_78L12pinCodePointERi:
   54|  7.91k|static inline UChar32 pinCodePoint(UChar32& c) {
   55|  7.91k|    if (c < UNICODESET_LOW) {
  ------------------
  |  |   37|  7.91k|#define UNICODESET_LOW 0x000000
  ------------------
  |  Branch (55:9): [True: 0, False: 7.91k]
  ------------------
   56|      0|        c = UNICODESET_LOW;
  ------------------
  |  |   37|      0|#define UNICODESET_LOW 0x000000
  ------------------
   57|  7.91k|    } else if (c > (UNICODESET_HIGH-1)) {
  ------------------
  |  |   34|  7.91k|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (57:16): [True: 0, False: 7.91k]
  ------------------
   58|      0|        c = (UNICODESET_HIGH-1);
  ------------------
  |  |   34|      0|#define UNICODESET_HIGH 0x0110000
  ------------------
   59|      0|    }
   60|  7.91k|    return c;
   61|  7.91k|}
uniset.cpp:_ZN6icu_78L3maxEii:
 1708|    801|static inline UChar32 max(UChar32 a, UChar32 b) {
 1709|    801|    return (a > b) ? a : b;
  ------------------
  |  Branch (1709:12): [True: 0, False: 801]
  ------------------
 1710|    801|}

_ZN6icu_7810UnicodeSetC2ERKNS_13UnicodeStringER10UErrorCode:
  156|      3|                       UErrorCode& status) {
  157|      3|    applyPattern(pattern, status);
  158|      3|    _dbgct(this);
  159|      3|}
_ZN6icu_7810UnicodeSet12applyPatternERKNS_13UnicodeStringER10UErrorCode:
  166|      3|                                     UErrorCode& status) {
  167|       |    // Equivalent to
  168|       |    //   return applyPattern(pattern, USET_IGNORE_SPACE, nullptr, status);
  169|       |    // but without dependency on closeOver().
  170|      3|    ParsePosition pos(0);
  171|      3|    applyPatternIgnoreSpace(pattern, pos, nullptr, status);
  172|      3|    if (U_FAILURE(status)) return *this;
  ------------------
  |  Branch (172:9): [True: 0, False: 3]
  ------------------
  173|       |
  174|      3|    int32_t i = pos.getIndex();
  175|       |    // Skip over trailing whitespace
  176|      3|    ICU_Utility::skipWhitespace(pattern, i, true);
  177|      3|    if (i != pattern.length()) {
  ------------------
  |  Branch (177:9): [True: 0, False: 3]
  ------------------
  178|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  179|      0|    }
  180|      3|    return *this;
  181|      3|}
_ZN6icu_7810UnicodeSet23applyPatternIgnoreSpaceERKNS_13UnicodeStringERNS_13ParsePositionEPKNS_11SymbolTableER10UErrorCode:
  187|      3|                                    UErrorCode& status) {
  188|      3|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (188:9): [True: 0, False: 3]
  ------------------
  189|      0|        return;
  190|      0|    }
  191|      3|    if (isFrozen()) {
  ------------------
  |  Branch (191:9): [True: 0, False: 3]
  ------------------
  192|      0|        status = U_NO_WRITE_PERMISSION;
  193|      0|        return;
  194|      0|    }
  195|       |    // Need to build the pattern in a temporary string because
  196|       |    // _applyPattern calls add() etc., which set pat to empty.
  197|      3|    UnicodeString rebuiltPat;
  198|      3|    RuleCharacterIterator chars(pattern, symbols, pos);
  199|      3|    applyPattern(chars, symbols, rebuiltPat, USET_IGNORE_SPACE, nullptr, 0, status);
  200|      3|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (200:9): [True: 0, False: 3]
  ------------------
  201|      3|    if (chars.inVariable()) {
  ------------------
  |  Branch (201:9): [True: 0, False: 3]
  ------------------
  202|       |        // syntaxError(chars, "Extra chars in variable value");
  203|      0|        status = U_MALFORMED_SET;
  204|      0|        return;
  205|      0|    }
  206|      3|    setPattern(rebuiltPat);
  207|      3|}
_ZN6icu_7810UnicodeSet12applyPatternERNS_21RuleCharacterIteratorEPKNS_11SymbolTableERNS_13UnicodeStringEjMS0_FRS0_iEiR10UErrorCode:
  267|      3|                              UErrorCode& ec) {
  268|      3|    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (268:9): [True: 0, False: 3]
  ------------------
  269|      3|    if (depth > MAX_DEPTH) {
  ------------------
  |  Branch (269:9): [True: 0, False: 3]
  ------------------
  270|      0|        ec = U_ILLEGAL_ARGUMENT_ERROR;
  271|      0|        return;
  272|      0|    }
  273|       |
  274|       |    // Syntax characters: [ ] ^ - & { }
  275|       |
  276|       |    // Recognized special forms for chars, sets: c-c s-s s&s
  277|       |
  278|      3|    int32_t opts = RuleCharacterIterator::PARSE_VARIABLES |
  279|      3|                   RuleCharacterIterator::PARSE_ESCAPES;
  280|      3|    if ((options & USET_IGNORE_SPACE) != 0) {
  ------------------
  |  Branch (280:9): [True: 3, False: 0]
  ------------------
  281|      3|        opts |= RuleCharacterIterator::SKIP_WHITESPACE;
  282|      3|    }
  283|       |
  284|      3|    UnicodeString patLocal, buf;
  285|      3|    UBool usePat = false;
  286|      3|    UnicodeSetPointer scratch;
  287|      3|    RuleCharacterIterator::Pos backup;
  288|       |
  289|       |    // mode: 0=before [, 1=between [...], 2=after ]
  290|       |    // lastItem: 0=none, 1=char, 2=set
  291|      3|    int8_t lastItem = 0, mode = 0;
  292|      3|    UChar32 lastChar = 0;
  293|      3|    char16_t op = 0;
  294|       |
  295|      3|    UBool invert = false;
  296|       |
  297|      3|    clear();
  298|       |
  299|      6|    while (mode != 2 && !chars.atEnd()) {
  ------------------
  |  Branch (299:12): [True: 5, False: 1]
  |  Branch (299:25): [True: 5, False: 0]
  ------------------
  300|      5|        U_ASSERT((lastItem == 0 && op == 0) ||
  ------------------
  |  |   35|      5|#   define U_ASSERT(exp) (void)0
  ------------------
  301|      5|                 (lastItem == 1 && (op == 0 || op == u'-')) ||
  302|      5|                 (lastItem == 2 && (op == 0 || op == u'-' || op == u'&')));
  303|       |
  304|      5|        UChar32 c = 0;
  305|      5|        UBool literal = false;
  306|      5|        UnicodeSet* nested = nullptr; // alias - do not delete
  307|       |
  308|       |        // -------- Check for property pattern
  309|       |
  310|       |        // setMode: 0=none, 1=unicodeset, 2=propertypat, 3=preparsed
  311|      5|        int8_t setMode = 0;
  312|      5|        if (resemblesPropertyPattern(chars, opts)) {
  ------------------
  |  Branch (312:13): [True: 2, False: 3]
  ------------------
  313|      2|            setMode = 2;
  314|      2|        }
  315|       |
  316|       |        // -------- Parse '[' of opening delimiter OR nested set.
  317|       |        // If there is a nested set, use `setMode' to define how
  318|       |        // the set should be parsed.  If the '[' is part of the
  319|       |        // opening delimiter for this pattern, parse special
  320|       |        // strings "[", "[^", "[-", and "[^-".  Check for stand-in
  321|       |        // characters representing a nested set in the symbol
  322|       |        // table.
  323|       |
  324|      3|        else {
  325|       |            // Prepare to backup if necessary
  326|      3|            chars.getPos(backup);
  327|      3|            c = chars.next(opts, literal, ec);
  328|      3|            if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (328:17): [True: 0, False: 3]
  ------------------
  329|       |
  330|      3|            if (c == u'[' && !literal) {
  ------------------
  |  Branch (330:17): [True: 1, False: 2]
  |  Branch (330:30): [True: 1, False: 0]
  ------------------
  331|      1|                if (mode == 1) {
  ------------------
  |  Branch (331:21): [True: 0, False: 1]
  ------------------
  332|      0|                    chars.setPos(backup); // backup
  333|      0|                    setMode = 1;
  334|      1|                } else {
  335|       |                    // Handle opening '[' delimiter
  336|      1|                    mode = 1;
  337|      1|                    patLocal.append(u'[');
  338|      1|                    chars.getPos(backup); // prepare to backup
  339|      1|                    c = chars.next(opts, literal, ec); 
  340|      1|                    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (340:25): [True: 0, False: 1]
  ------------------
  341|      1|                    if (c == u'^' && !literal) {
  ------------------
  |  Branch (341:25): [True: 0, False: 1]
  |  Branch (341:38): [True: 0, False: 0]
  ------------------
  342|      0|                        invert = true;
  343|      0|                        patLocal.append(u'^');
  344|      0|                        chars.getPos(backup); // prepare to backup
  345|      0|                        c = chars.next(opts, literal, ec);
  346|      0|                        if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (346:29): [True: 0, False: 0]
  ------------------
  347|      0|                    }
  348|       |                    // Fall through to handle special leading '-';
  349|       |                    // otherwise restart loop for nested [], \p{}, etc.
  350|      1|                    if (c == u'-') {
  ------------------
  |  Branch (350:25): [True: 0, False: 1]
  ------------------
  351|      0|                        literal = true;
  352|       |                        // Fall through to handle literal '-' below
  353|      1|                    } else {
  354|      1|                        chars.setPos(backup); // backup
  355|      1|                        continue;
  356|      1|                    }
  357|      1|                }
  358|      2|            } else if (symbols != nullptr) {
  ------------------
  |  Branch (358:24): [True: 0, False: 2]
  ------------------
  359|      0|                const UnicodeFunctor *m = symbols->lookupMatcher(c);
  360|      0|                if (m != nullptr) {
  ------------------
  |  Branch (360:21): [True: 0, False: 0]
  ------------------
  361|      0|                    const UnicodeSet *ms = dynamic_cast<const UnicodeSet *>(m);
  362|      0|                    if (ms == nullptr) {
  ------------------
  |  Branch (362:25): [True: 0, False: 0]
  ------------------
  363|      0|                        ec = U_MALFORMED_SET;
  364|      0|                        return;
  365|      0|                    }
  366|       |                    // casting away const, but `nested' won't be modified
  367|       |                    // (important not to modify stored set)
  368|      0|                    nested = const_cast<UnicodeSet*>(ms);
  369|      0|                    setMode = 3;
  370|      0|                }
  371|      0|            }
  372|      3|        }
  373|       |
  374|       |        // -------- Handle a nested set.  This either is inline in
  375|       |        // the pattern or represented by a stand-in that has
  376|       |        // previously been parsed and was looked up in the symbol
  377|       |        // table.
  378|       |
  379|      4|        if (setMode != 0) {
  ------------------
  |  Branch (379:13): [True: 2, False: 2]
  ------------------
  380|      2|            if (lastItem == 1) {
  ------------------
  |  Branch (380:17): [True: 0, False: 2]
  ------------------
  381|      0|                if (op != 0) {
  ------------------
  |  Branch (381:21): [True: 0, False: 0]
  ------------------
  382|       |                    // syntaxError(chars, "Char expected after operator");
  383|      0|                    ec = U_MALFORMED_SET;
  384|      0|                    return;
  385|      0|                }
  386|      0|                add(lastChar, lastChar);
  387|      0|                _appendToPat(patLocal, lastChar, false);
  388|      0|                lastItem = 0;
  389|      0|                op = 0;
  390|      0|            }
  391|       |
  392|      2|            if (op == u'-' || op == u'&') {
  ------------------
  |  Branch (392:17): [True: 0, False: 2]
  |  Branch (392:31): [True: 0, False: 2]
  ------------------
  393|      0|                patLocal.append(op);
  394|      0|            }
  395|       |
  396|      2|            if (nested == nullptr) {
  ------------------
  |  Branch (396:17): [True: 2, False: 0]
  ------------------
  397|       |                // lazy allocation
  398|      2|                if (!scratch.allocate()) {
  ------------------
  |  Branch (398:21): [True: 0, False: 2]
  ------------------
  399|      0|                    ec = U_MEMORY_ALLOCATION_ERROR;
  400|      0|                    return;
  401|      0|                }
  402|      2|                nested = scratch.pointer();
  403|      2|            }
  404|      2|            switch (setMode) {
  ------------------
  |  Branch (404:21): [True: 0, False: 2]
  ------------------
  405|      0|            case 1:
  ------------------
  |  Branch (405:13): [True: 0, False: 2]
  ------------------
  406|      0|                nested->applyPattern(chars, symbols, patLocal, options, caseClosure, depth + 1, ec);
  407|      0|                break;
  408|      2|            case 2:
  ------------------
  |  Branch (408:13): [True: 2, False: 0]
  ------------------
  409|      2|                chars.skipIgnored(opts);
  410|      2|                nested->applyPropertyPattern(chars, patLocal, ec);
  411|      2|                if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (411:21): [True: 0, False: 2]
  ------------------
  412|      2|                break;
  413|      2|            case 3: // `nested' already parsed
  ------------------
  |  Branch (413:13): [True: 0, False: 2]
  ------------------
  414|      0|                nested->_toPattern(patLocal, false);
  415|      0|                break;
  416|      2|            }
  417|       |
  418|      2|            usePat = true;
  419|       |
  420|      2|            if (mode == 0) {
  ------------------
  |  Branch (420:17): [True: 2, False: 0]
  ------------------
  421|       |                // Entire pattern is a category; leave parse loop
  422|      2|                *this = *nested;
  423|      2|                mode = 2;
  424|      2|                break;
  425|      2|            }
  426|       |
  427|      0|            switch (op) {
  ------------------
  |  Branch (427:21): [True: 0, False: 0]
  ------------------
  428|      0|            case u'-':
  ------------------
  |  Branch (428:13): [True: 0, False: 0]
  ------------------
  429|      0|                removeAll(*nested);
  430|      0|                break;
  431|      0|            case u'&':
  ------------------
  |  Branch (431:13): [True: 0, False: 0]
  ------------------
  432|      0|                retainAll(*nested);
  433|      0|                break;
  434|      0|            case 0:
  ------------------
  |  Branch (434:13): [True: 0, False: 0]
  ------------------
  435|      0|                addAll(*nested);
  436|      0|                break;
  437|      0|            }
  438|       |
  439|      0|            op = 0;
  440|      0|            lastItem = 2;
  441|       |
  442|      0|            continue;
  443|      0|        }
  444|       |
  445|      2|        if (mode == 0) {
  ------------------
  |  Branch (445:13): [True: 0, False: 2]
  ------------------
  446|       |            // syntaxError(chars, "Missing '['");
  447|      0|            ec = U_MALFORMED_SET;
  448|      0|            return;
  449|      0|        }
  450|       |
  451|       |        // -------- Parse special (syntax) characters.  If the
  452|       |        // current character is not special, or if it is escaped,
  453|       |        // then fall through and handle it below.
  454|       |
  455|      2|        if (!literal) {
  ------------------
  |  Branch (455:13): [True: 1, False: 1]
  ------------------
  456|      1|            switch (c) {
  457|      1|            case u']':
  ------------------
  |  Branch (457:13): [True: 1, False: 0]
  ------------------
  458|      1|                if (lastItem == 1) {
  ------------------
  |  Branch (458:21): [True: 1, False: 0]
  ------------------
  459|      1|                    add(lastChar, lastChar);
  460|      1|                    _appendToPat(patLocal, lastChar, false);
  461|      1|                }
  462|       |                // Treat final trailing '-' as a literal
  463|      1|                if (op == u'-') {
  ------------------
  |  Branch (463:21): [True: 0, False: 1]
  ------------------
  464|      0|                    add(op, op);
  465|      0|                    patLocal.append(op);
  466|      1|                } else if (op == u'&') {
  ------------------
  |  Branch (466:28): [True: 0, False: 1]
  ------------------
  467|       |                    // syntaxError(chars, "Trailing '&'");
  468|      0|                    ec = U_MALFORMED_SET;
  469|      0|                    return;
  470|      0|                }
  471|      1|                patLocal.append(u']');
  472|      1|                mode = 2;
  473|      1|                continue;
  474|      0|            case u'-':
  ------------------
  |  Branch (474:13): [True: 0, False: 1]
  ------------------
  475|      0|                if (op == 0) {
  ------------------
  |  Branch (475:21): [True: 0, False: 0]
  ------------------
  476|      0|                    if (lastItem != 0) {
  ------------------
  |  Branch (476:25): [True: 0, False: 0]
  ------------------
  477|      0|                        op = static_cast<char16_t>(c);
  478|      0|                        continue;
  479|      0|                    } else {
  480|       |                        // Treat final trailing '-' as a literal
  481|      0|                        add(c, c);
  482|      0|                        c = chars.next(opts, literal, ec);
  483|      0|                        if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (483:29): [True: 0, False: 0]
  ------------------
  484|      0|                        if (c == u']' && !literal) {
  ------------------
  |  Branch (484:29): [True: 0, False: 0]
  |  Branch (484:42): [True: 0, False: 0]
  ------------------
  485|      0|                            patLocal.append(u"-]", 2);
  486|      0|                            mode = 2;
  487|      0|                            continue;
  488|      0|                        }
  489|      0|                    }
  490|      0|                }
  491|       |                // syntaxError(chars, "'-' not after char or set");
  492|      0|                ec = U_MALFORMED_SET;
  493|      0|                return;
  494|      0|            case u'&':
  ------------------
  |  Branch (494:13): [True: 0, False: 1]
  ------------------
  495|      0|                if (lastItem == 2 && op == 0) {
  ------------------
  |  Branch (495:21): [True: 0, False: 0]
  |  Branch (495:38): [True: 0, False: 0]
  ------------------
  496|      0|                    op = static_cast<char16_t>(c);
  497|      0|                    continue;
  498|      0|                }
  499|       |                // syntaxError(chars, "'&' not after set");
  500|      0|                ec = U_MALFORMED_SET;
  501|      0|                return;
  502|      0|            case u'^':
  ------------------
  |  Branch (502:13): [True: 0, False: 1]
  ------------------
  503|       |                // syntaxError(chars, "'^' not after '['");
  504|      0|                ec = U_MALFORMED_SET;
  505|      0|                return;
  506|      0|            case u'{':
  ------------------
  |  Branch (506:13): [True: 0, False: 1]
  ------------------
  507|      0|                if (op != 0) {
  ------------------
  |  Branch (507:21): [True: 0, False: 0]
  ------------------
  508|       |                    // syntaxError(chars, "Missing operand after operator");
  509|      0|                    ec = U_MALFORMED_SET;
  510|      0|                    return;
  511|      0|                }
  512|      0|                if (lastItem == 1) {
  ------------------
  |  Branch (512:21): [True: 0, False: 0]
  ------------------
  513|      0|                    add(lastChar, lastChar);
  514|      0|                    _appendToPat(patLocal, lastChar, false);
  515|      0|                }
  516|      0|                lastItem = 0;
  517|      0|                buf.truncate(0);
  518|      0|                {
  519|      0|                    UBool ok = false;
  520|      0|                    while (!chars.atEnd()) {
  ------------------
  |  Branch (520:28): [True: 0, False: 0]
  ------------------
  521|      0|                        c = chars.next(opts, literal, ec);
  522|      0|                        if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (522:29): [True: 0, False: 0]
  ------------------
  523|      0|                        if (c == u'}' && !literal) {
  ------------------
  |  Branch (523:29): [True: 0, False: 0]
  |  Branch (523:42): [True: 0, False: 0]
  ------------------
  524|      0|                            ok = true;
  525|      0|                            break;
  526|      0|                        }
  527|      0|                        buf.append(c);
  528|      0|                    }
  529|      0|                    if (!ok) {
  ------------------
  |  Branch (529:25): [True: 0, False: 0]
  ------------------
  530|       |                        // syntaxError(chars, "Invalid multicharacter string");
  531|      0|                        ec = U_MALFORMED_SET;
  532|      0|                        return;
  533|      0|                    }
  534|      0|                }
  535|       |                // We have new string. Add it to set and continue;
  536|       |                // we don't need to drop through to the further
  537|       |                // processing
  538|      0|                add(buf);
  539|      0|                patLocal.append(u'{');
  540|      0|                _appendToPat(patLocal, buf, false);
  541|      0|                patLocal.append(u'}');
  542|      0|                continue;
  543|      0|            case SymbolTable::SYMBOL_REF:
  ------------------
  |  Branch (543:13): [True: 0, False: 1]
  ------------------
  544|       |                //         symbols  nosymbols
  545|       |                // [a-$]   error    error (ambiguous)
  546|       |                // [a$]    anchor   anchor
  547|       |                // [a-$x]  var "x"* literal '$'
  548|       |                // [a-$.]  error    literal '$'
  549|       |                // *We won't get here in the case of var "x"
  550|      0|                {
  551|      0|                    chars.getPos(backup);
  552|      0|                    c = chars.next(opts, literal, ec);
  553|      0|                    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (553:25): [True: 0, False: 0]
  ------------------
  554|      0|                    UBool anchor = (c == u']' && !literal);
  ------------------
  |  Branch (554:37): [True: 0, False: 0]
  |  Branch (554:50): [True: 0, False: 0]
  ------------------
  555|      0|                    if (symbols == nullptr && !anchor) {
  ------------------
  |  Branch (555:25): [True: 0, False: 0]
  |  Branch (555:47): [True: 0, False: 0]
  ------------------
  556|      0|                        c = SymbolTable::SYMBOL_REF;
  557|      0|                        chars.setPos(backup);
  558|      0|                        break; // literal '$'
  559|      0|                    }
  560|      0|                    if (anchor && op == 0) {
  ------------------
  |  Branch (560:25): [True: 0, False: 0]
  |  Branch (560:35): [True: 0, False: 0]
  ------------------
  561|      0|                        if (lastItem == 1) {
  ------------------
  |  Branch (561:29): [True: 0, False: 0]
  ------------------
  562|      0|                            add(lastChar, lastChar);
  563|      0|                            _appendToPat(patLocal, lastChar, false);
  564|      0|                        }
  565|      0|                        add(U_ETHER);
  ------------------
  |  |   37|      0|#define U_ETHER ((char16_t)0xFFFF)
  ------------------
  566|      0|                        usePat = true;
  567|      0|                        patLocal.append(static_cast<char16_t>(SymbolTable::SYMBOL_REF));
  568|      0|                        patLocal.append(u']');
  569|      0|                        mode = 2;
  570|      0|                        continue;
  571|      0|                    }
  572|       |                    // syntaxError(chars, "Unquoted '$'");
  573|      0|                    ec = U_MALFORMED_SET;
  574|      0|                    return;
  575|      0|                }
  576|      0|            default:
  ------------------
  |  Branch (576:13): [True: 0, False: 1]
  ------------------
  577|      0|                break;
  578|      1|            }
  579|      1|        }
  580|       |
  581|       |        // -------- Parse literal characters.  This includes both
  582|       |        // escaped chars ("\u4E01") and non-syntax characters
  583|       |        // ("a").
  584|       |
  585|      1|        switch (lastItem) {
  ------------------
  |  Branch (585:17): [True: 0, False: 1]
  ------------------
  586|      1|        case 0:
  ------------------
  |  Branch (586:9): [True: 1, False: 0]
  ------------------
  587|      1|            lastItem = 1;
  588|      1|            lastChar = c;
  589|      1|            break;
  590|      0|        case 1:
  ------------------
  |  Branch (590:9): [True: 0, False: 1]
  ------------------
  591|      0|            if (op == u'-') {
  ------------------
  |  Branch (591:17): [True: 0, False: 0]
  ------------------
  592|      0|                if (lastChar >= c) {
  ------------------
  |  Branch (592:21): [True: 0, False: 0]
  ------------------
  593|       |                    // Don't allow redundant (a-a) or empty (b-a) ranges;
  594|       |                    // these are most likely typos.
  595|       |                    // syntaxError(chars, "Invalid range");
  596|      0|                    ec = U_MALFORMED_SET;
  597|      0|                    return;
  598|      0|                }
  599|      0|                add(lastChar, c);
  600|      0|                _appendToPat(patLocal, lastChar, false);
  601|      0|                patLocal.append(op);
  602|      0|                _appendToPat(patLocal, c, false);
  603|      0|                lastItem = 0;
  604|      0|                op = 0;
  605|      0|            } else {
  606|      0|                add(lastChar, lastChar);
  607|      0|                _appendToPat(patLocal, lastChar, false);
  608|      0|                lastChar = c;
  609|      0|            }
  610|      0|            break;
  611|      0|        case 2:
  ------------------
  |  Branch (611:9): [True: 0, False: 1]
  ------------------
  612|      0|            if (op != 0) {
  ------------------
  |  Branch (612:17): [True: 0, False: 0]
  ------------------
  613|       |                // syntaxError(chars, "Set expected after operator");
  614|      0|                ec = U_MALFORMED_SET;
  615|      0|                return;
  616|      0|            }
  617|      0|            lastChar = c;
  618|      0|            lastItem = 1;
  619|      0|            break;
  620|      1|        }
  621|      1|    }
  622|       |
  623|      3|    if (mode != 2) {
  ------------------
  |  Branch (623:9): [True: 0, False: 3]
  ------------------
  624|       |        // syntaxError(chars, "Missing ']'");
  625|      0|        ec = U_MALFORMED_SET;
  626|      0|        return;
  627|      0|    }
  628|       |
  629|      3|    chars.skipIgnored(opts);
  630|       |
  631|       |    /**
  632|       |     * Handle global flags (invert, case insensitivity).  If this
  633|       |     * pattern should be compiled case-insensitive, then we need
  634|       |     * to close over case BEFORE COMPLEMENTING.  This makes
  635|       |     * patterns like /[^abc]/i work.
  636|       |     */
  637|      3|    if ((options & USET_CASE_MASK) != 0) {
  ------------------
  |  Branch (637:9): [True: 0, False: 3]
  ------------------
  638|      0|        (this->*caseClosure)(options);
  639|      0|    }
  640|      3|    if (invert) {
  ------------------
  |  Branch (640:9): [True: 0, False: 3]
  ------------------
  641|      0|        complement().removeAllStrings();  // code point complement
  642|      0|    }
  643|       |
  644|       |    // Use the rebuilt pattern (patLocal) only if necessary.  Prefer the
  645|       |    // generated pattern.
  646|      3|    if (usePat) {
  ------------------
  |  Branch (646:9): [True: 2, False: 1]
  ------------------
  647|      2|        rebuiltPat.append(patLocal);
  648|      2|    } else {
  649|      1|        _generatePattern(rebuiltPat, false);
  650|      1|    }
  651|      3|    if (isBogus() && U_SUCCESS(ec)) {
  ------------------
  |  Branch (651:9): [True: 0, False: 3]
  |  Branch (651:22): [True: 0, False: 0]
  ------------------
  652|       |        // We likely ran out of memory. AHHH!
  653|      0|        ec = U_MEMORY_ALLOCATION_ERROR;
  654|      0|    }
  655|      3|}
_ZN6icu_7810UnicodeSet11applyFilterEPFaiPvES1_PKS0_R10UErrorCode:
  706|      2|                             UErrorCode &status) {
  707|      2|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (707:9): [True: 0, False: 2]
  ------------------
  708|       |
  709|       |    // Logically, walk through all Unicode characters, noting the start
  710|       |    // and end of each range for which filter.contain(c) is
  711|       |    // true.  Add each range to a set.
  712|       |    //
  713|       |    // To improve performance, use an inclusions set which
  714|       |    // encodes information about character ranges that are known
  715|       |    // to have identical properties.
  716|       |    // inclusions contains the first characters of
  717|       |    // same-value ranges for the given property.
  718|       |
  719|      2|    clear();
  720|       |
  721|      2|    UChar32 startHasProperty = -1;
  722|      2|    int32_t limitRange = inclusions->getRangeCount();
  723|       |
  724|  3.88k|    for (int j=0; j<limitRange; ++j) {
  ------------------
  |  Branch (724:19): [True: 3.88k, False: 2]
  ------------------
  725|       |        // get current range
  726|  3.88k|        UChar32 start = inclusions->getRangeStart(j);
  727|  3.88k|        UChar32 end = inclusions->getRangeEnd(j);
  728|       |
  729|       |        // for all the code points in the range, process
  730|  15.8k|        for (UChar32 ch = start; ch <= end; ++ch) {
  ------------------
  |  Branch (730:34): [True: 12.0k, False: 3.88k]
  ------------------
  731|       |            // only add to this UnicodeSet on inflection points --
  732|       |            // where the hasProperty value changes to false
  733|  12.0k|            if ((*filter)(ch, context)) {
  ------------------
  |  Branch (733:17): [True: 3.97k, False: 8.03k]
  ------------------
  734|  3.97k|                if (startHasProperty < 0) {
  ------------------
  |  Branch (734:21): [True: 821, False: 3.15k]
  ------------------
  735|    821|                    startHasProperty = ch;
  736|    821|                }
  737|  8.03k|            } else if (startHasProperty >= 0) {
  ------------------
  |  Branch (737:24): [True: 821, False: 7.21k]
  ------------------
  738|    821|                add(startHasProperty, ch-1);
  739|    821|                startHasProperty = -1;
  740|    821|            }
  741|  12.0k|        }
  742|  3.88k|    }
  743|      2|    if (startHasProperty >= 0) {
  ------------------
  |  Branch (743:9): [True: 0, False: 2]
  ------------------
  744|      0|        add(startHasProperty, static_cast<UChar32>(0x10FFFF));
  745|      0|    }
  746|      2|    if (isBogus() && U_SUCCESS(status)) {
  ------------------
  |  Branch (746:9): [True: 0, False: 2]
  |  Branch (746:22): [True: 0, False: 0]
  ------------------
  747|       |        // We likely ran out of memory. AHHH!
  748|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  749|      0|    }
  750|      2|}
_ZN6icu_7810UnicodeSet21applyIntPropertyValueE9UPropertyiR10UErrorCode:
  783|      2|UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) {
  784|      2|    if (U_FAILURE(ec) || isFrozen()) { return *this; }
  ------------------
  |  Branch (784:9): [True: 0, False: 2]
  |  Branch (784:26): [True: 0, False: 2]
  ------------------
  785|      2|    if (prop == UCHAR_GENERAL_CATEGORY_MASK) {
  ------------------
  |  Branch (785:9): [True: 2, False: 0]
  ------------------
  786|      2|        const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec);
  787|      2|        applyFilter(generalCategoryMaskFilter, &value, inclusions, ec);
  788|      2|    } else if (prop == UCHAR_SCRIPT_EXTENSIONS) {
  ------------------
  |  Branch (788:16): [True: 0, False: 0]
  ------------------
  789|      0|        const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec);
  790|      0|        UScriptCode script = static_cast<UScriptCode>(value);
  791|      0|        applyFilter(scriptExtensionsFilter, &script, inclusions, ec);
  792|      0|    } else if (prop == UCHAR_IDENTIFIER_TYPE) {
  ------------------
  |  Branch (792:16): [True: 0, False: 0]
  ------------------
  793|      0|        const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec);
  794|      0|        UIdentifierType idType = static_cast<UIdentifierType>(value);
  795|      0|        applyFilter(idTypeFilter, &idType, inclusions, ec);
  796|      0|    } else if (0 <= prop && prop < UCHAR_BINARY_LIMIT) {
  ------------------
  |  Branch (796:16): [True: 0, False: 0]
  |  Branch (796:29): [True: 0, False: 0]
  ------------------
  797|      0|        if (value == 0 || value == 1) {
  ------------------
  |  Branch (797:13): [True: 0, False: 0]
  |  Branch (797:27): [True: 0, False: 0]
  ------------------
  798|      0|            const USet *set = u_getBinaryPropertySet(prop, &ec);
  ------------------
  |  |  269|      0|#define u_getBinaryPropertySet U_ICU_ENTRY_POINT_RENAME(u_getBinaryPropertySet)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  799|      0|            if (U_FAILURE(ec)) { return *this; }
  ------------------
  |  Branch (799:17): [True: 0, False: 0]
  ------------------
  800|      0|            copyFrom(*UnicodeSet::fromUSet(set), true);
  801|      0|            if (value == 0) {
  ------------------
  |  Branch (801:17): [True: 0, False: 0]
  ------------------
  802|      0|                complement().removeAllStrings();  // code point complement
  803|      0|            }
  804|      0|        } else {
  805|      0|            clear();
  806|      0|        }
  807|      0|    } else if (UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT) {
  ------------------
  |  Branch (807:16): [True: 0, False: 0]
  |  Branch (807:43): [True: 0, False: 0]
  ------------------
  808|      0|        const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec);
  809|      0|        IntPropertyContext c = {prop, value};
  810|      0|        applyFilter(intPropertyFilter, &c, inclusions, ec);
  811|      0|    } else {
  812|      0|        ec = U_ILLEGAL_ARGUMENT_ERROR;
  813|      0|    }
  814|      2|    return *this;
  815|      2|}
_ZN6icu_7810UnicodeSet18applyPropertyAliasERKNS_13UnicodeStringES3_R10UErrorCode:
  820|      2|                               UErrorCode& ec) {
  821|      2|    if (U_FAILURE(ec) || isFrozen()) return *this;
  ------------------
  |  Branch (821:9): [True: 0, False: 2]
  |  Branch (821:26): [True: 0, False: 2]
  ------------------
  822|       |
  823|       |    // prop and value used to be converted to char * using the default
  824|       |    // converter instead of the invariant conversion.
  825|       |    // This should not be necessary because all Unicode property and value
  826|       |    // names use only invariant characters.
  827|       |    // If there are any variant characters, then we won't find them anyway.
  828|       |    // Checking first avoids assertion failures in the conversion.
  829|      2|    if( !uprv_isInvariantUString(prop.getBuffer(), prop.length()) ||
  ------------------
  |  | 1518|      2|#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (829:9): [True: 0, False: 2]
  ------------------
  830|      2|        !uprv_isInvariantUString(value.getBuffer(), value.length())
  ------------------
  |  | 1518|      2|#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (830:9): [True: 0, False: 2]
  ------------------
  831|      2|    ) {
  832|      0|        FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  833|      0|    }
  834|      2|    CharString pname, vname;
  835|      2|    pname.appendInvariantChars(prop, ec);
  836|      2|    vname.appendInvariantChars(value, ec);
  837|      2|    if (U_FAILURE(ec)) return *this;
  ------------------
  |  Branch (837:9): [True: 0, False: 2]
  ------------------
  838|       |
  839|      2|    UProperty p;
  840|      2|    int32_t v;
  841|      2|    UBool invert = false;
  842|       |
  843|      2|    if (value.length() > 0) {
  ------------------
  |  Branch (843:9): [True: 0, False: 2]
  ------------------
  844|      0|        p = u_getPropertyEnum(pname.data());
  ------------------
  |  |  283|      0|#define u_getPropertyEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyEnum)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  845|      0|        if (p == UCHAR_INVALID_CODE) FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (845:13): [True: 0, False: 0]
  ------------------
  846|       |
  847|       |        // Treat gc as gcm
  848|      0|        if (p == UCHAR_GENERAL_CATEGORY) {
  ------------------
  |  Branch (848:13): [True: 0, False: 0]
  ------------------
  849|      0|            p = UCHAR_GENERAL_CATEGORY_MASK;
  850|      0|        }
  851|       |
  852|      0|        if ((p >= UCHAR_BINARY_START && p < UCHAR_BINARY_LIMIT) ||
  ------------------
  |  Branch (852:14): [True: 0, False: 0]
  |  Branch (852:41): [True: 0, False: 0]
  ------------------
  853|      0|            (p >= UCHAR_INT_START && p < UCHAR_INT_LIMIT) ||
  ------------------
  |  Branch (853:14): [True: 0, False: 0]
  |  Branch (853:38): [True: 0, False: 0]
  ------------------
  854|      0|            (p >= UCHAR_MASK_START && p < UCHAR_MASK_LIMIT)) {
  ------------------
  |  Branch (854:14): [True: 0, False: 0]
  |  Branch (854:39): [True: 0, False: 0]
  ------------------
  855|      0|            v = u_getPropertyValueEnum(p, vname.data());
  ------------------
  |  |  285|      0|#define u_getPropertyValueEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyValueEnum)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  856|      0|            if (v == UCHAR_INVALID_CODE) {
  ------------------
  |  Branch (856:17): [True: 0, False: 0]
  ------------------
  857|       |                // Handle numeric CCC
  858|      0|                if (p == UCHAR_CANONICAL_COMBINING_CLASS ||
  ------------------
  |  Branch (858:21): [True: 0, False: 0]
  ------------------
  859|      0|                    p == UCHAR_TRAIL_CANONICAL_COMBINING_CLASS ||
  ------------------
  |  Branch (859:21): [True: 0, False: 0]
  ------------------
  860|      0|                    p == UCHAR_LEAD_CANONICAL_COMBINING_CLASS) {
  ------------------
  |  Branch (860:21): [True: 0, False: 0]
  ------------------
  861|      0|                    char* end;
  862|      0|                    double val = uprv_strtod(vname.data(), &end);
  ------------------
  |  |   75|      0|#define uprv_strtod(source, end) U_STANDARD_CPP_NAMESPACE strtod(source, end)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  863|       |                    // Anything between 0 and 255 is valid even if unused.
  864|       |                    // Cast double->int only after range check.
  865|       |                    // We catch NaN here because comparing it with both 0 and 255 will be false
  866|       |                    // (as are all comparisons with NaN).
  867|      0|                    if (*end != 0 || !(0 <= val && val <= 255) ||
  ------------------
  |  Branch (867:25): [True: 0, False: 0]
  |  Branch (867:40): [True: 0, False: 0]
  |  Branch (867:52): [True: 0, False: 0]
  ------------------
  868|      0|                            (v = static_cast<int32_t>(val)) != val) {
  ------------------
  |  Branch (868:29): [True: 0, False: 0]
  ------------------
  869|       |                        // non-integral value or outside 0..255, or trailing junk
  870|      0|                        FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  871|      0|                    }
  872|      0|                } else {
  873|      0|                    FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  874|      0|                }
  875|      0|            }
  876|      0|        }
  877|       |
  878|      0|        else {
  879|       |
  880|      0|            switch (p) {
  881|      0|            case UCHAR_NUMERIC_VALUE:
  ------------------
  |  Branch (881:13): [True: 0, False: 0]
  ------------------
  882|      0|                {
  883|      0|                    char* end;
  884|      0|                    double val = uprv_strtod(vname.data(), &end);
  ------------------
  |  |   75|      0|#define uprv_strtod(source, end) U_STANDARD_CPP_NAMESPACE strtod(source, end)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  885|      0|                    if (*end != 0) {
  ------------------
  |  Branch (885:25): [True: 0, False: 0]
  ------------------
  886|      0|                        FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  887|      0|                    }
  888|      0|                    applyFilter(numericValueFilter, &val,
  889|      0|                                CharacterProperties::getInclusionsForProperty(p, ec), ec);
  890|      0|                    return *this;
  891|      0|                }
  892|      0|            case UCHAR_NAME:
  ------------------
  |  Branch (892:13): [True: 0, False: 0]
  ------------------
  893|      0|                {
  894|       |                    // Must munge name, since u_charFromName() does not do
  895|       |                    // 'loose' matching.
  896|      0|                    char buf[128]; // it suffices that this be > uprv_getMaxCharNameLength
  897|      0|                    if (!mungeCharName(buf, vname.data(), sizeof(buf))) FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (897:25): [True: 0, False: 0]
  ------------------
  898|      0|                    UChar32 ch = u_charFromName(U_EXTENDED_CHAR_NAME, buf, &ec);
  ------------------
  |  |  222|      0|#define u_charFromName U_ICU_ENTRY_POINT_RENAME(u_charFromName)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  899|      0|                    if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (899:25): [True: 0, False: 0]
  ------------------
  900|      0|                        clear();
  901|      0|                        add(ch);
  902|      0|                        return *this;
  903|      0|                    } else {
  904|      0|                        FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  905|      0|                    }
  906|      0|                }
  907|      0|            case UCHAR_UNICODE_1_NAME:
  ------------------
  |  Branch (907:13): [True: 0, False: 0]
  ------------------
  908|       |                // ICU 49 deprecates the Unicode_1_Name property APIs.
  909|      0|                FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  910|      0|            case UCHAR_AGE:
  ------------------
  |  Branch (910:13): [True: 0, False: 0]
  ------------------
  911|      0|                {
  912|       |                    // Must munge name, since u_versionFromString() does not do
  913|       |                    // 'loose' matching.
  914|      0|                    char buf[128];
  915|      0|                    if (!mungeCharName(buf, vname.data(), sizeof(buf))) FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (915:25): [True: 0, False: 0]
  ------------------
  916|      0|                    UVersionInfo version;
  917|      0|                    u_versionFromString(version, buf);
  ------------------
  |  |  417|      0|#define u_versionFromString U_ICU_ENTRY_POINT_RENAME(u_versionFromString)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  918|      0|                    applyFilter(versionFilter, &version,
  919|      0|                                CharacterProperties::getInclusionsForProperty(p, ec), ec);
  920|      0|                    return *this;
  921|      0|                }
  922|      0|            case UCHAR_SCRIPT_EXTENSIONS:
  ------------------
  |  Branch (922:13): [True: 0, False: 0]
  ------------------
  923|      0|                v = u_getPropertyValueEnum(UCHAR_SCRIPT, vname.data());
  ------------------
  |  |  285|      0|#define u_getPropertyValueEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyValueEnum)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  924|      0|                if (v == UCHAR_INVALID_CODE) {
  ------------------
  |  Branch (924:21): [True: 0, False: 0]
  ------------------
  925|      0|                    FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  926|      0|                }
  927|       |                // fall through to calling applyIntPropertyValue()
  928|      0|                break;
  929|      0|            case UCHAR_IDENTIFIER_TYPE:
  ------------------
  |  Branch (929:13): [True: 0, False: 0]
  ------------------
  930|      0|                v = u_getPropertyValueEnum(p, vname.data());
  ------------------
  |  |  285|      0|#define u_getPropertyValueEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyValueEnum)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  931|      0|                if (v == UCHAR_INVALID_CODE) {
  ------------------
  |  Branch (931:21): [True: 0, False: 0]
  ------------------
  932|      0|                    FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  933|      0|                }
  934|       |                // fall through to calling applyIntPropertyValue()
  935|      0|                break;
  936|      0|            default:
  ------------------
  |  Branch (936:13): [True: 0, False: 0]
  ------------------
  937|       |                // p is a non-binary, non-enumerated property that we
  938|       |                // don't support (yet).
  939|      0|                FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  940|      0|            }
  941|      0|        }
  942|      0|    }
  943|       |
  944|      2|    else {
  945|       |        // value is empty.  Interpret as General Category, Script, or
  946|       |        // Binary property.
  947|      2|        p = UCHAR_GENERAL_CATEGORY_MASK;
  948|      2|        v = u_getPropertyValueEnum(p, pname.data());
  ------------------
  |  |  285|      2|#define u_getPropertyValueEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyValueEnum)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  949|      2|        if (v == UCHAR_INVALID_CODE) {
  ------------------
  |  Branch (949:13): [True: 0, False: 2]
  ------------------
  950|      0|            p = UCHAR_SCRIPT;
  951|      0|            v = u_getPropertyValueEnum(p, pname.data());
  ------------------
  |  |  285|      0|#define u_getPropertyValueEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyValueEnum)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  952|      0|            if (v == UCHAR_INVALID_CODE) {
  ------------------
  |  Branch (952:17): [True: 0, False: 0]
  ------------------
  953|      0|                p = u_getPropertyEnum(pname.data());
  ------------------
  |  |  283|      0|#define u_getPropertyEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyEnum)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  954|      0|                if (p >= UCHAR_BINARY_START && p < UCHAR_BINARY_LIMIT) {
  ------------------
  |  Branch (954:21): [True: 0, False: 0]
  |  Branch (954:48): [True: 0, False: 0]
  ------------------
  955|      0|                    v = 1;
  956|      0|                } else if (0 == uprv_comparePropertyNames(ANY, pname.data())) {
  ------------------
  |  |   60|      0|#   define uprv_comparePropertyNames uprv_compareASCIIPropertyNames
  |  |  ------------------
  |  |  |  | 1400|      0|#define uprv_compareASCIIPropertyNames U_ICU_ENTRY_POINT_RENAME(uprv_compareASCIIPropertyNames)
  |  |  |  |  ------------------
  |  |  |  |  |  |  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 (956:28): [True: 0, False: 0]
  ------------------
  957|      0|                    set(MIN_VALUE, MAX_VALUE);
  958|      0|                    return *this;
  959|      0|                } else if (0 == uprv_comparePropertyNames(ASCII, pname.data())) {
  ------------------
  |  |   60|      0|#   define uprv_comparePropertyNames uprv_compareASCIIPropertyNames
  |  |  ------------------
  |  |  |  | 1400|      0|#define uprv_compareASCIIPropertyNames U_ICU_ENTRY_POINT_RENAME(uprv_compareASCIIPropertyNames)
  |  |  |  |  ------------------
  |  |  |  |  |  |  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 (959:28): [True: 0, False: 0]
  ------------------
  960|      0|                    set(0, 0x7F);
  961|      0|                    return *this;
  962|      0|                } else if (0 == uprv_comparePropertyNames(ASSIGNED, pname.data())) {
  ------------------
  |  |   60|      0|#   define uprv_comparePropertyNames uprv_compareASCIIPropertyNames
  |  |  ------------------
  |  |  |  | 1400|      0|#define uprv_compareASCIIPropertyNames U_ICU_ENTRY_POINT_RENAME(uprv_compareASCIIPropertyNames)
  |  |  |  |  ------------------
  |  |  |  |  |  |  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 (962:28): [True: 0, False: 0]
  ------------------
  963|       |                    // [:Assigned:]=[:^Cn:]
  964|      0|                    p = UCHAR_GENERAL_CATEGORY_MASK;
  965|      0|                    v = U_GC_CN_MASK;
  ------------------
  |  |  925|      0|#define U_GC_CN_MASK    U_MASK(U_GENERAL_OTHER_TYPES)
  |  |  ------------------
  |  |  |  |  174|      0|#define U_MASK(x) ((uint32_t)1<<(x))
  |  |  ------------------
  ------------------
  966|      0|                    invert = true;
  967|      0|                } else {
  968|      0|                    FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  969|      0|                }
  970|      0|            }
  971|      0|        }
  972|      2|    }
  973|       |
  974|      2|    applyIntPropertyValue(p, v, ec);
  975|      2|    if(invert) {
  ------------------
  |  Branch (975:8): [True: 0, False: 2]
  ------------------
  976|      0|        complement().removeAllStrings();  // code point complement
  977|      0|    }
  978|       |
  979|      2|    if (isBogus() && U_SUCCESS(ec)) {
  ------------------
  |  Branch (979:9): [True: 0, False: 2]
  |  Branch (979:22): [True: 0, False: 0]
  ------------------
  980|       |        // We likely ran out of memory. AHHH!
  981|      0|        ec = U_MEMORY_ALLOCATION_ERROR;
  982|      0|    }
  983|      2|    return *this;
  984|      2|}
_ZN6icu_7810UnicodeSet24resemblesPropertyPatternERNS_21RuleCharacterIteratorEi:
 1014|      5|                                           int32_t iterOpts) {
 1015|       |    // NOTE: literal will always be false, because we don't parse escapes.
 1016|      5|    UBool result = false, literal;
 1017|      5|    UErrorCode ec = U_ZERO_ERROR;
 1018|      5|    iterOpts &= ~RuleCharacterIterator::PARSE_ESCAPES;
 1019|      5|    RuleCharacterIterator::Pos pos;
 1020|      5|    chars.getPos(pos);
 1021|      5|    UChar32 c = chars.next(iterOpts, literal, ec);
 1022|      5|    if (c == u'[' || c == u'\\') {
  ------------------
  |  Branch (1022:9): [True: 3, False: 2]
  |  Branch (1022:22): [True: 1, False: 1]
  ------------------
 1023|      4|        UChar32 d = chars.next(iterOpts & ~RuleCharacterIterator::SKIP_WHITESPACE,
 1024|      4|                               literal, ec);
 1025|      4|        result = (c == u'[') ? (d == u':') :
  ------------------
  |  Branch (1025:18): [True: 3, False: 1]
  ------------------
 1026|      4|                               (d == u'N' || d == u'p' || d == u'P');
  ------------------
  |  Branch (1026:33): [True: 0, False: 1]
  |  Branch (1026:46): [True: 0, False: 1]
  |  Branch (1026:59): [True: 0, False: 1]
  ------------------
 1027|      4|    }
 1028|      5|    chars.setPos(pos);
 1029|      5|    return result && U_SUCCESS(ec);
  ------------------
  |  Branch (1029:12): [True: 2, False: 3]
  |  Branch (1029:22): [True: 2, False: 0]
  ------------------
 1030|      5|}
_ZN6icu_7810UnicodeSet20applyPropertyPatternERKNS_13UnicodeStringERNS_13ParsePositionER10UErrorCode:
 1037|      2|                                             UErrorCode &ec) {
 1038|      2|    int32_t pos = ppos.getIndex();
 1039|       |
 1040|      2|    UBool posix = false; // true for [:pat:], false for \p{pat} \P{pat} \N{pat}
 1041|      2|    UBool isName = false; // true for \N{pat}, o/w false
 1042|      2|    UBool invert = false;
 1043|       |
 1044|      2|    if (U_FAILURE(ec)) return *this;
  ------------------
  |  Branch (1044:9): [True: 0, False: 2]
  ------------------
 1045|       |
 1046|       |    // Minimum length is 5 characters, e.g. \p{L}
 1047|      2|    if ((pos+5) > pattern.length()) {
  ------------------
  |  Branch (1047:9): [True: 0, False: 2]
  ------------------
 1048|      0|        FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1049|      0|    }
 1050|       |
 1051|       |    // On entry, ppos should point to one of the following locations:
 1052|       |    // Look for an opening [:, [:^, \p, or \P
 1053|      2|    if (isPOSIXOpen(pattern, pos)) {
  ------------------
  |  Branch (1053:9): [True: 2, False: 0]
  ------------------
 1054|      2|        posix = true;
 1055|      2|        pos += 2;
 1056|      2|        pos = ICU_Utility::skipWhitespace(pattern, pos);
 1057|      2|        if (pos < pattern.length() && pattern.charAt(pos) == u'^') {
  ------------------
  |  Branch (1057:13): [True: 2, False: 0]
  |  Branch (1057:39): [True: 0, False: 2]
  ------------------
 1058|      0|            ++pos;
 1059|      0|            invert = true;
 1060|      0|        }
 1061|      2|    } else if (isPerlOpen(pattern, pos) || isNameOpen(pattern, pos)) {
  ------------------
  |  Branch (1061:16): [True: 0, False: 0]
  |  Branch (1061:44): [True: 0, False: 0]
  ------------------
 1062|      0|        char16_t c = pattern.charAt(pos+1);
 1063|      0|        invert = (c == u'P');
 1064|      0|        isName = (c == u'N');
 1065|      0|        pos += 2;
 1066|      0|        pos = ICU_Utility::skipWhitespace(pattern, pos);
 1067|      0|        if (pos == pattern.length() || pattern.charAt(pos++) != u'{') {
  ------------------
  |  Branch (1067:13): [True: 0, False: 0]
  |  Branch (1067:40): [True: 0, False: 0]
  ------------------
 1068|       |            // Syntax error; "\p" or "\P" not followed by "{"
 1069|      0|            FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1070|      0|        }
 1071|      0|    } else {
 1072|       |        // Open delimiter not seen
 1073|      0|        FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1074|      0|    }
 1075|       |
 1076|       |    // Look for the matching close delimiter, either :] or }
 1077|      2|    int32_t close;
 1078|      2|    if (posix) {
  ------------------
  |  Branch (1078:9): [True: 2, False: 0]
  ------------------
 1079|      2|      close = pattern.indexOf(u":]", 2, pos);
 1080|      2|    } else {
 1081|      0|      close = pattern.indexOf(u'}', pos);
 1082|      0|    }
 1083|      2|    if (close < 0) {
  ------------------
  |  Branch (1083:9): [True: 0, False: 2]
  ------------------
 1084|       |        // Syntax error; close delimiter missing
 1085|      0|        FAIL(ec);
  ------------------
  |  |  777|      0|#define FAIL(ec) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  778|      0|    ec=U_ILLEGAL_ARGUMENT_ERROR; \
  |  |  779|      0|    return *this; \
  |  |  780|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1086|      0|    }
 1087|       |
 1088|       |    // Look for an '=' sign.  If this is present, we will parse a
 1089|       |    // medium \p{gc=Cf} or long \p{GeneralCategory=Format}
 1090|       |    // pattern.
 1091|      2|    int32_t equals = pattern.indexOf(u'=', pos);
 1092|      2|    UnicodeString propName, valueName;
 1093|      2|    if (equals >= 0 && equals < close && !isName) {
  ------------------
  |  Branch (1093:9): [True: 0, False: 2]
  |  Branch (1093:24): [True: 0, False: 0]
  |  Branch (1093:42): [True: 0, False: 0]
  ------------------
 1094|       |        // Equals seen; parse medium/long pattern
 1095|      0|        pattern.extractBetween(pos, equals, propName);
 1096|      0|        pattern.extractBetween(equals+1, close, valueName);
 1097|      0|    }
 1098|       |
 1099|      2|    else {
 1100|       |        // Handle case where no '=' is seen, and \N{}
 1101|      2|        pattern.extractBetween(pos, close, propName);
 1102|       |            
 1103|       |        // Handle \N{name}
 1104|      2|        if (isName) {
  ------------------
  |  Branch (1104:13): [True: 0, False: 2]
  ------------------
 1105|       |            // This is a little inefficient since it means we have to
 1106|       |            // parse NAME_PROP back to UCHAR_NAME even though we already
 1107|       |            // know it's UCHAR_NAME.  If we refactor the API to
 1108|       |            // support args of (UProperty, char*) then we can remove
 1109|       |            // NAME_PROP and make this a little more efficient.
 1110|      0|            valueName = propName;
 1111|      0|            propName = NAME_PROP;
 1112|      0|        }
 1113|      2|    }
 1114|       |
 1115|      2|    applyPropertyAlias(propName, valueName, ec);
 1116|       |
 1117|      2|    if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (1117:9): [True: 2, False: 0]
  ------------------
 1118|      2|        if (invert) {
  ------------------
  |  Branch (1118:13): [True: 0, False: 2]
  ------------------
 1119|      0|            complement().removeAllStrings();  // code point complement
 1120|      0|        }
 1121|       |
 1122|       |        // Move to the limit position after the close delimiter if the
 1123|       |        // parse succeeded.
 1124|      2|        ppos.setIndex(close + (posix ? 2 : 1));
  ------------------
  |  Branch (1124:32): [True: 2, False: 0]
  ------------------
 1125|      2|    }
 1126|       |
 1127|      2|    return *this;
 1128|      2|}
_ZN6icu_7810UnicodeSet20applyPropertyPatternERNS_21RuleCharacterIteratorERNS_13UnicodeStringER10UErrorCode:
 1141|      2|                                      UErrorCode& ec) {
 1142|      2|    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (1142:9): [True: 0, False: 2]
  ------------------
 1143|      2|    UnicodeString pattern;
 1144|      2|    chars.lookahead(pattern);
 1145|      2|    ParsePosition pos(0);
 1146|      2|    applyPropertyPattern(pattern, pos, ec);
 1147|      2|    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (1147:9): [True: 0, False: 2]
  ------------------
 1148|      2|    if (pos.getIndex() == 0) {
  ------------------
  |  Branch (1148:9): [True: 0, False: 2]
  ------------------
 1149|       |        // syntaxError(chars, "Invalid property pattern");
 1150|      0|        ec = U_MALFORMED_SET;
 1151|      0|        return;
 1152|      0|    }
 1153|      2|    chars.jumpahead(pos.getIndex());
 1154|      2|    rebuiltPat.append(pattern, 0, pos.getIndex());
 1155|      2|}
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117UnicodeSetPointerC2Ev:
  232|      3|    inline UnicodeSetPointer() : p(nullptr) {}
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117UnicodeSetPointer8allocateEv:
  235|      2|    inline UBool allocate() {
  236|      2|        if (p == nullptr) {
  ------------------
  |  Branch (236:13): [True: 2, False: 0]
  ------------------
  237|      2|            p = new UnicodeSet();
  238|      2|        }
  239|      2|        return p != nullptr;
  240|      2|    }
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117UnicodeSetPointer7pointerEv:
  234|      2|    inline UnicodeSet* pointer() { return p; }
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117UnicodeSetPointerD2Ev:
  233|      3|    inline ~UnicodeSetPointer() { delete p; }
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_125generalCategoryMaskFilterEiPv:
  667|  12.0k|UBool generalCategoryMaskFilter(UChar32 ch, void* context) {
  668|  12.0k|    int32_t value = *static_cast<int32_t*>(context);
  669|  12.0k|    return (U_GET_GC_MASK((UChar32) ch) & value) != 0;
  ------------------
  |  | 3644|  12.0k|#define U_GET_GC_MASK(c) U_MASK(u_charType(c))
  |  |  ------------------
  |  |  |  |  174|  12.0k|#define U_MASK(x) ((uint32_t)1<<(x))
  |  |  ------------------
  ------------------
  670|  12.0k|}
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_111isPOSIXOpenERKNS_13UnicodeStringEi:
  129|      2|isPOSIXOpen(const UnicodeString &pattern, int32_t pos) {
  130|      2|    return pattern.charAt(pos)==u'[' && pattern.charAt(pos+1)==u':';
  ------------------
  |  Branch (130:12): [True: 2, False: 0]
  |  Branch (130:41): [True: 2, False: 0]
  ------------------
  131|      2|}

_ZN6icu_7811ReplaceableD2Ev:
  106|   193M|Replaceable::~Replaceable() {}
_ZN6icu_78plERKNS_13UnicodeStringES2_:
  111|   154k|operator+ (const UnicodeString &s1, const UnicodeString &s2) {
  112|   154k|  int32_t sumLengths;
  113|   154k|  if (uprv_add32_overflow(s1.length(), s2.length(), &sumLengths)) {
  ------------------
  |  | 1394|   154k|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|   154k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   154k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   154k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (113:7): [True: 0, False: 154k]
  ------------------
  114|      0|    UnicodeString bogus;
  115|      0|    bogus.setToBogus();
  116|      0|    return bogus;
  117|      0|  }
  118|   154k|  if (sumLengths != INT32_MAX) {
  ------------------
  |  Branch (118:7): [True: 154k, False: 0]
  ------------------
  119|   154k|    ++sumLengths;  // space for a terminating NUL if we need one
  120|   154k|  }
  121|   154k|  return UnicodeString(sumLengths, static_cast<UChar32>(0), 0).append(s1).append(s2);
  122|   154k|}
_ZN6icu_7813UnicodeString6addRefEv:
  146|   410k|UnicodeString::addRef() {
  147|   410k|  umtx_atomic_inc(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1);
  148|   410k|}
_ZN6icu_7813UnicodeString9removeRefEv:
  151|   720k|UnicodeString::removeRef() {
  152|   720k|  return umtx_atomic_dec(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1);
  153|   720k|}
_ZNK6icu_7813UnicodeString8refCountEv:
  156|  54.9M|UnicodeString::refCount() const {
  157|  54.9M|  return umtx_loadAcquire(*(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1));
  158|  54.9M|}
_ZN6icu_7813UnicodeString12releaseArrayEv:
  161|   293M|UnicodeString::releaseArray() {
  162|   293M|  if((fUnion.fFields.fLengthAndFlags & kRefCounted) && removeRef() == 0) {
  ------------------
  |  Branch (162:6): [True: 720k, False: 293M]
  |  Branch (162:56): [True: 352k, False: 368k]
  ------------------
  163|   352k|    uprv_free(reinterpret_cast<int32_t*>(fUnion.fFields.fArray) - 1);
  ------------------
  |  | 1503|   352k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|   352k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   352k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   352k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  164|   352k|  }
  165|   293M|}
_ZN6icu_7813UnicodeStringC2Eiii:
  175|   154k|UnicodeString::UnicodeString(int32_t capacity, UChar32 c, int32_t count) {
  176|   154k|  fUnion.fFields.fLengthAndFlags = 0;
  177|   154k|  if (count <= 0 || static_cast<uint32_t>(c) > 0x10ffff) {
  ------------------
  |  Branch (177:7): [True: 154k, False: 0]
  |  Branch (177:21): [True: 0, False: 0]
  ------------------
  178|       |    // just allocate and do not do anything else
  179|   154k|    allocate(capacity);
  180|   154k|  } else if(c <= 0xffff) {
  ------------------
  |  Branch (180:13): [True: 0, False: 0]
  ------------------
  181|      0|    int32_t length = count;
  182|      0|    if(capacity < length) {
  ------------------
  |  Branch (182:8): [True: 0, False: 0]
  ------------------
  183|      0|      capacity = length;
  184|      0|    }
  185|      0|    if(allocate(capacity)) {
  ------------------
  |  Branch (185:8): [True: 0, False: 0]
  ------------------
  186|      0|      char16_t *array = getArrayStart();
  187|      0|      char16_t unit = static_cast<char16_t>(c);
  188|      0|      for(int32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (188:26): [True: 0, False: 0]
  ------------------
  189|      0|        array[i] = unit;
  190|      0|      }
  191|      0|      setLength(length);
  192|      0|    }
  193|      0|  } else {  // supplementary code point, write surrogate pairs
  194|      0|    if(count > (INT32_MAX / 2)) {
  ------------------
  |  Branch (194:8): [True: 0, False: 0]
  ------------------
  195|       |      // We would get more than 2G UChars.
  196|      0|      allocate(capacity);
  197|      0|      return;
  198|      0|    }
  199|      0|    int32_t length = count * 2;
  200|      0|    if(capacity < length) {
  ------------------
  |  Branch (200:8): [True: 0, False: 0]
  ------------------
  201|      0|      capacity = length;
  202|      0|    }
  203|      0|    if(allocate(capacity)) {
  ------------------
  |  Branch (203:8): [True: 0, False: 0]
  ------------------
  204|      0|      char16_t *array = getArrayStart();
  205|      0|      char16_t lead = U16_LEAD(c);
  ------------------
  |  |  123|      0|#define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
  ------------------
  206|      0|      char16_t trail = U16_TRAIL(c);
  ------------------
  |  |  132|      0|#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
  ------------------
  207|      0|      for(int32_t i = 0; i < length; i += 2) {
  ------------------
  |  Branch (207:26): [True: 0, False: 0]
  ------------------
  208|      0|        array[i] = lead;
  209|      0|        array[i + 1] = trail;
  210|      0|      }
  211|      0|      setLength(length);
  212|      0|    }
  213|      0|  }
  214|   154k|}
_ZN6icu_7813UnicodeStringC2EDs:
  216|  32.6k|UnicodeString::UnicodeString(char16_t ch) {
  217|  32.6k|  fUnion.fFields.fLengthAndFlags = kLength1 | kShortString;
  218|  32.6k|  fUnion.fStackFields.fBuffer[0] = ch;
  219|  32.6k|}
_ZN6icu_7813UnicodeStringC2Ei:
  221|  1.79k|UnicodeString::UnicodeString(UChar32 ch) {
  222|  1.79k|  fUnion.fFields.fLengthAndFlags = kShortString;
  223|  1.79k|  int32_t i = 0;
  224|  1.79k|  UBool isError = false;
  225|  1.79k|  U16_APPEND(fUnion.fStackFields.fBuffer, i, US_STACKBUF_SIZE, ch, isError);
  ------------------
  |  |  393|  1.79k|#define U16_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.79k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  394|  1.79k|    if((uint32_t)(c)<=0xffff) { \
  |  |  ------------------
  |  |  |  Branch (394:8): [True: 1.79k, False: 0]
  |  |  ------------------
  |  |  395|  1.79k|        (s)[(i)++]=(uint16_t)(c); \
  |  |  396|  1.79k|    } 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|  1.79k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.79k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  226|       |  // We test isError so that the compiler does not complain that we don't.
  227|       |  // If isError then i==0 which is what we want anyway.
  228|  1.79k|  if(!isError) {
  ------------------
  |  Branch (228:6): [True: 1.79k, False: 0]
  ------------------
  229|  1.79k|    setShortLength(i);
  230|  1.79k|  }
  231|  1.79k|}
_ZN6icu_7813UnicodeStringC2EPKDsi:
  234|      4|                             int32_t textLength) {
  235|      4|  fUnion.fFields.fLengthAndFlags = kShortString;
  236|      4|  doAppend(text, 0, textLength);
  237|      4|}
_ZN6icu_7813UnicodeStringC2EaNS_14ConstChar16PtrEi:
  241|  1.87M|                             int32_t textLength) {
  242|  1.87M|  fUnion.fFields.fLengthAndFlags = kReadonlyAlias;
  243|  1.87M|  const char16_t *text = textPtr;
  244|  1.87M|  if(text == nullptr) {
  ------------------
  |  Branch (244:6): [True: 4.08k, False: 1.87M]
  ------------------
  245|       |    // treat as an empty string, do not alias
  246|  4.08k|    setToEmpty();
  247|  1.87M|  } else if(textLength < -1 ||
  ------------------
  |  Branch (247:13): [True: 0, False: 1.87M]
  ------------------
  248|  1.87M|            (textLength == -1 && !isTerminated) ||
  ------------------
  |  Branch (248:14): [True: 194k, False: 1.67M]
  |  Branch (248:34): [True: 0, False: 194k]
  ------------------
  249|  1.87M|            (textLength >= 0 && isTerminated && text[textLength] != 0)
  ------------------
  |  Branch (249:14): [True: 1.67M, False: 194k]
  |  Branch (249:33): [True: 1.37M, False: 306k]
  |  Branch (249:49): [True: 0, False: 1.37M]
  ------------------
  250|  1.87M|  ) {
  251|      0|    setToBogus();
  252|  1.87M|  } else {
  253|  1.87M|    if(textLength == -1) {
  ------------------
  |  Branch (253:8): [True: 194k, False: 1.67M]
  ------------------
  254|       |      // text is terminated, or else it would have failed the above test
  255|   194k|      textLength = u_strlen(text);
  ------------------
  |  |  393|   194k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|   194k|    }
  257|  1.87M|    setArray(const_cast<char16_t *>(text), textLength,
  258|  1.87M|             isTerminated ? textLength + 1 : textLength);
  ------------------
  |  Branch (258:14): [True: 1.56M, False: 306k]
  ------------------
  259|  1.87M|  }
  260|  1.87M|}
_ZN6icu_7813UnicodeStringC2EPKciNS0_10EInvariantE:
  284|   299k|UnicodeString::UnicodeString(const char *src, int32_t length, EInvariant) {
  285|   299k|  fUnion.fFields.fLengthAndFlags = kShortString;
  286|   299k|  if(src==nullptr) {
  ------------------
  |  Branch (286:6): [True: 0, False: 299k]
  ------------------
  287|       |    // treat as an empty string
  288|   299k|  } else {
  289|   299k|    if(length<0) {
  ------------------
  |  Branch (289:8): [True: 277k, False: 22.4k]
  ------------------
  290|   277k|      length = static_cast<int32_t>(uprv_strlen(src));
  ------------------
  |  |   37|   277k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   277k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  291|   277k|    }
  292|   299k|    if(cloneArrayIfNeeded(length, length, false)) {
  ------------------
  |  Branch (292:8): [True: 299k, False: 0]
  ------------------
  293|   299k|      u_charsToUChars(src, getArrayStart(), length);
  ------------------
  |  |  226|   299k|#define u_charsToUChars U_ICU_ENTRY_POINT_RENAME(u_charsToUChars)
  |  |  ------------------
  |  |  |  |  123|   299k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   299k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   299k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  294|   299k|      setLength(length);
  295|   299k|    } else {
  296|      0|      setToBogus();
  297|      0|    }
  298|   299k|  }
  299|   299k|}
_ZN6icu_7813UnicodeStringC2EPKc:
  323|      3|UnicodeString::UnicodeString(const char *codepageData) {
  324|      3|  fUnion.fFields.fLengthAndFlags = kShortString;
  325|      3|  if (codepageData != nullptr) {
  ------------------
  |  Branch (325:7): [True: 3, False: 0]
  ------------------
  326|      3|    setToUTF8(codepageData);
  327|      3|  }
  328|      3|}
_ZN6icu_7813UnicodeStringC2ERKS0_:
  345|  70.3M|UnicodeString::UnicodeString(const UnicodeString& that) {
  346|  70.3M|  fUnion.fFields.fLengthAndFlags = kShortString;
  347|  70.3M|  copyFrom(that);
  348|  70.3M|}
_ZN6icu_7813UnicodeStringC2EOS0_:
  350|   312k|UnicodeString::UnicodeString(UnicodeString &&src) noexcept {
  351|   312k|  copyFieldsFrom(src, true);
  352|   312k|}
_ZN6icu_7813UnicodeStringC2ERKS0_ii:
  362|  4.17M|                             int32_t srcLength) {
  363|  4.17M|  fUnion.fFields.fLengthAndFlags = kShortString;
  364|  4.17M|  setTo(that, srcStart, srcLength);
  365|  4.17M|}
_ZN6icu_7813UnicodeString8allocateEi:
  409|  1.82M|UnicodeString::allocate(int32_t capacity) {
  410|  1.82M|  if(capacity <= US_STACKBUF_SIZE) {
  ------------------
  |  Branch (410:6): [True: 1.42M, False: 402k]
  ------------------
  411|  1.42M|    fUnion.fFields.fLengthAndFlags = kShortString;
  412|  1.42M|    return true;
  413|  1.42M|  }
  414|   402k|  if(capacity <= kMaxCapacity) {
  ------------------
  |  Branch (414:6): [True: 402k, False: 0]
  ------------------
  415|   402k|    ++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|   402k|    size_t numBytes = sizeof(int32_t) + static_cast<size_t>(capacity) * U_SIZEOF_UCHAR;
  ------------------
  |  |  352|   402k|#define U_SIZEOF_UCHAR 2
  ------------------
  419|       |    // Round up to a multiple of 16.
  420|   402k|    numBytes = (numBytes + 15) & ~15;
  421|   402k|    int32_t* array = static_cast<int32_t*>(uprv_malloc(numBytes));
  ------------------
  |  | 1524|   402k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|   402k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   402k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   402k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  422|   402k|    if(array != nullptr) {
  ------------------
  |  Branch (422:8): [True: 402k, False: 0]
  ------------------
  423|       |      // set initial refCount and point behind the refCount
  424|   402k|      *array++ = 1;
  425|   402k|      numBytes -= sizeof(int32_t);
  426|       |
  427|       |      // have fArray point to the first char16_t
  428|   402k|      fUnion.fFields.fArray = reinterpret_cast<char16_t*>(array);
  429|   402k|      fUnion.fFields.fCapacity = static_cast<int32_t>(numBytes / U_SIZEOF_UCHAR);
  ------------------
  |  |  352|   402k|#define U_SIZEOF_UCHAR 2
  ------------------
  430|   402k|      fUnion.fFields.fLengthAndFlags = kLongString;
  431|   402k|      return true;
  432|   402k|    }
  433|   402k|  }
  434|      0|  fUnion.fFields.fLengthAndFlags = kIsBogus;
  435|      0|  fUnion.fFields.fArray = nullptr;
  436|      0|  fUnion.fFields.fCapacity = 0;
  437|      0|  return false;
  438|   402k|}
_ZN6icu_7813UnicodeStringD2Ev:
  462|   193M|{
  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|   193M|  releaseArray();
  478|   193M|}
_ZN6icu_7813UnicodeStringaSERKS0_:
  527|  1.98M|UnicodeString::operator=(const UnicodeString &src) {
  528|  1.98M|  return copyFrom(src);
  529|  1.98M|}
_ZN6icu_7813UnicodeString12fastCopyFromERKS0_:
  532|  21.8M|UnicodeString::fastCopyFrom(const UnicodeString &src) {
  533|  21.8M|  return copyFrom(src, true);
  534|  21.8M|}
_ZN6icu_7813UnicodeString8copyFromERKS0_a:
  537|  94.2M|UnicodeString::copyFrom(const UnicodeString &src, UBool fastCopy) {
  538|       |  // if assigning to ourselves, do nothing
  539|  94.2M|  if(this == &src) {
  ------------------
  |  Branch (539:6): [True: 36.9k, False: 94.2M]
  ------------------
  540|  36.9k|    return *this;
  541|  36.9k|  }
  542|       |
  543|       |  // is the right side bogus?
  544|  94.2M|  if(src.isBogus()) {
  ------------------
  |  Branch (544:6): [True: 1.88M, False: 92.3M]
  ------------------
  545|  1.88M|    setToBogus();
  546|  1.88M|    return *this;
  547|  1.88M|  }
  548|       |
  549|       |  // delete the current contents
  550|  92.3M|  releaseArray();
  551|       |
  552|  92.3M|  if(src.isEmpty()) {
  ------------------
  |  Branch (552:6): [True: 7.13M, False: 85.2M]
  ------------------
  553|       |    // empty string - use the stack buffer
  554|  7.13M|    setToEmpty();
  555|  7.13M|    return *this;
  556|  7.13M|  }
  557|       |
  558|       |  // fLength>0 and not an "open" src.getBuffer(minCapacity)
  559|  85.2M|  fUnion.fFields.fLengthAndFlags = src.fUnion.fFields.fLengthAndFlags;
  560|  85.2M|  switch(src.fUnion.fFields.fLengthAndFlags & kAllStorageFlags) {
  561|  75.6M|  case kShortString:
  ------------------
  |  Branch (561:3): [True: 75.6M, False: 9.58M]
  ------------------
  562|       |    // short string using the stack buffer, do the same
  563|  75.6M|    uprv_memcpy(fUnion.fStackFields.fBuffer, src.fUnion.fStackFields.fBuffer,
  ------------------
  |  |   42|  75.6M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  75.6M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  75.6M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  75.6M|    _Pragma("clang diagnostic push") \
  |  |   45|  75.6M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  75.6M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  75.6M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  75.6M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  75.6M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  75.6M|    _Pragma("clang diagnostic pop") \
  |  |   49|  75.6M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  75.6M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  75.6M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  75.6M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  564|  75.6M|                getShortLength() * U_SIZEOF_UCHAR);
  565|  75.6M|    break;
  566|   410k|  case kLongString:
  ------------------
  |  Branch (566:3): [True: 410k, False: 84.8M]
  ------------------
  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|   410k|    const_cast<UnicodeString &>(src).addRef();
  570|       |    // copy all fields, share the reference-counted buffer
  571|   410k|    fUnion.fFields.fArray = src.fUnion.fFields.fArray;
  572|   410k|    fUnion.fFields.fCapacity = src.fUnion.fFields.fCapacity;
  573|   410k|    if(!hasShortLength()) {
  ------------------
  |  Branch (573:8): [True: 16.0k, False: 394k]
  ------------------
  574|  16.0k|      fUnion.fFields.fLength = src.fUnion.fFields.fLength;
  575|  16.0k|    }
  576|   410k|    break;
  577|  9.17M|  case kReadonlyAlias:
  ------------------
  |  Branch (577:3): [True: 9.17M, False: 76.0M]
  ------------------
  578|  9.17M|    if(fastCopy) {
  ------------------
  |  Branch (578:8): [True: 8.03M, False: 1.14M]
  ------------------
  579|       |      // src is a readonly alias, do the same
  580|       |      // -> maintain the readonly alias as such
  581|  8.03M|      fUnion.fFields.fArray = src.fUnion.fFields.fArray;
  582|  8.03M|      fUnion.fFields.fCapacity = src.fUnion.fFields.fCapacity;
  583|  8.03M|      if(!hasShortLength()) {
  ------------------
  |  Branch (583:10): [True: 0, False: 8.03M]
  ------------------
  584|      0|        fUnion.fFields.fLength = src.fUnion.fFields.fLength;
  585|      0|      }
  586|  8.03M|      break;
  587|  8.03M|    }
  588|       |    // else if(!fastCopy) fall through to case kWritableAlias
  589|       |    // -> allocate a new buffer and copy the contents
  590|  1.14M|    U_FALLTHROUGH;
  ------------------
  |  |  511|  1.14M|#       define U_FALLTHROUGH [[clang::fallthrough]]
  ------------------
  591|  1.14M|  case kWritableAlias: {
  ------------------
  |  Branch (591:3): [True: 0, False: 85.2M]
  ------------------
  592|       |    // src is a writable alias; we make a copy of that instead
  593|  1.14M|    int32_t srcLength = src.length();
  594|  1.14M|    if(allocate(srcLength)) {
  ------------------
  |  Branch (594:8): [True: 1.14M, False: 0]
  ------------------
  595|  1.14M|      u_memcpy(getArrayStart(), src.getArrayStart(), srcLength);
  ------------------
  |  |  334|  1.14M|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|  1.14M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.14M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.14M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  596|  1.14M|      setLength(srcLength);
  597|  1.14M|      break;
  598|  1.14M|    }
  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: 85.2M]
  ------------------
  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|  85.2M|  }
  610|       |
  611|  85.2M|  return *this;
  612|  85.2M|}
_ZN6icu_7813UnicodeStringaSEOS0_:
  614|  4.55M|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|  4.55M|  releaseArray();
  618|  4.55M|  copyFieldsFrom(src, true);
  619|  4.55M|  return *this;
  620|  4.55M|}
_ZN6icu_7813UnicodeString14copyFieldsFromERS0_a:
  623|   108M|void UnicodeString::copyFieldsFrom(UnicodeString &src, UBool setSrcToBogus) noexcept {
  624|   108M|  int16_t lengthAndFlags = fUnion.fFields.fLengthAndFlags = src.fUnion.fFields.fLengthAndFlags;
  625|   108M|  if(lengthAndFlags & kUsingStackBuffer) {
  ------------------
  |  Branch (625:6): [True: 108M, False: 241k]
  ------------------
  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|   108M|    if(this != &src) {
  ------------------
  |  Branch (629:8): [True: 108M, False: 0]
  ------------------
  630|   108M|      uprv_memcpy(fUnion.fStackFields.fBuffer, src.fUnion.fStackFields.fBuffer,
  ------------------
  |  |   42|   108M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   108M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   108M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   108M|    _Pragma("clang diagnostic push") \
  |  |   45|   108M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   108M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   108M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   108M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   108M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   108M|    _Pragma("clang diagnostic pop") \
  |  |   49|   108M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   108M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   108M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   108M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  631|   108M|                  getShortLength() * U_SIZEOF_UCHAR);
  632|   108M|    }
  633|   108M|  } else {
  634|       |    // In all other cases, copy all fields.
  635|   241k|    fUnion.fFields.fArray = src.fUnion.fFields.fArray;
  636|   241k|    fUnion.fFields.fCapacity = src.fUnion.fFields.fCapacity;
  637|   241k|    if(!hasShortLength()) {
  ------------------
  |  Branch (637:8): [True: 6.77k, False: 234k]
  ------------------
  638|  6.77k|      fUnion.fFields.fLength = src.fUnion.fFields.fLength;
  639|  6.77k|    }
  640|   241k|    if(setSrcToBogus) {
  ------------------
  |  Branch (640:8): [True: 210k, False: 30.4k]
  ------------------
  641|       |      // Set src to bogus without releasing any memory.
  642|   210k|      src.fUnion.fFields.fLengthAndFlags = kIsBogus;
  643|   210k|      src.fUnion.fFields.fArray = nullptr;
  644|   210k|      src.fUnion.fFields.fCapacity = 0;
  645|   210k|    }
  646|   241k|  }
  647|   108M|}
_ZN6icu_7813UnicodeString4swapERS0_:
  649|  34.5M|void UnicodeString::swap(UnicodeString &other) noexcept {
  650|  34.5M|  UnicodeString temp;  // Empty short string: Known not to need releaseArray().
  651|       |  // Copy fields without resetting source values in between.
  652|  34.5M|  temp.copyFieldsFrom(*this, false);
  653|  34.5M|  this->copyFieldsFrom(other, false);
  654|  34.5M|  other.copyFieldsFrom(temp, false);
  655|       |  // Set temp to an empty string so that other's memory is not released twice.
  656|  34.5M|  temp.fUnion.fFields.fLengthAndFlags = kShortString;
  657|  34.5M|}
_ZNK6icu_7813UnicodeString10unescapeAtERi:
  690|      2|UChar32 UnicodeString::unescapeAt(int32_t &offset) const {
  691|      2|    return u_unescapeAt(UnicodeString_charAt, &offset, length(), (void*)this);
  ------------------
  |  |  416|      2|#define u_unescapeAt U_ICU_ENTRY_POINT_RENAME(u_unescapeAt)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  692|      2|}
_ZNK6icu_7813UnicodeString8doEqualsEPKDsi:
  698|   160k|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|   160k|  return uprv_memcmp(getArrayStart(), text, len * U_SIZEOF_UCHAR) == 0;
  ------------------
  |  |  101|   160k|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|   160k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  702|   160k|}
_ZNK6icu_7813UnicodeString17doEqualsSubstringEiiPKDsii:
  710|  66.0k|{
  711|       |  // compare illegal string values
  712|  66.0k|  if(isBogus()) {
  ------------------
  |  Branch (712:6): [True: 0, False: 66.0k]
  ------------------
  713|      0|    return false;
  714|      0|  }
  715|       |  
  716|       |  // pin indices to legal values
  717|  66.0k|  pinIndices(start, length);
  718|       |
  719|  66.0k|  if(srcChars == nullptr) {
  ------------------
  |  Branch (719:6): [True: 0, False: 66.0k]
  ------------------
  720|       |    // treat const char16_t *srcChars==nullptr as an empty string
  721|      0|    return length == 0 ? true : false;
  ------------------
  |  Branch (721:12): [True: 0, False: 0]
  ------------------
  722|      0|  }
  723|       |
  724|       |  // get the correct pointer
  725|  66.0k|  const char16_t *chars = getArrayStart();
  726|       |
  727|  66.0k|  chars += start;
  728|  66.0k|  srcChars += srcStart;
  729|       |
  730|       |  // get the srcLength if necessary
  731|  66.0k|  if(srcLength < 0) {
  ------------------
  |  Branch (731:6): [True: 0, False: 66.0k]
  ------------------
  732|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  733|      0|  }
  734|       |
  735|  66.0k|  if (length != srcLength) {
  ------------------
  |  Branch (735:7): [True: 21.6k, False: 44.3k]
  ------------------
  736|  21.6k|    return false;
  737|  21.6k|  }
  738|       |
  739|  44.3k|  if(length == 0 || chars == srcChars) {
  ------------------
  |  Branch (739:6): [True: 0, False: 44.3k]
  |  Branch (739:21): [True: 0, False: 44.3k]
  ------------------
  740|      0|    return true;
  741|      0|  }
  742|       |
  743|  44.3k|  return u_memcmp(chars, srcChars, srcLength) == 0;
  ------------------
  |  |  332|  44.3k|#define u_memcmp U_ICU_ENTRY_POINT_RENAME(u_memcmp)
  |  |  ------------------
  |  |  |  |  123|  44.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  744|  44.3k|}
_ZNK6icu_7813UnicodeString9doCompareEiiPKDsii:
  752|  3.85M|{
  753|       |  // compare illegal string values
  754|  3.85M|  if(isBogus()) {
  ------------------
  |  Branch (754:6): [True: 0, False: 3.85M]
  ------------------
  755|      0|    return -1;
  756|      0|  }
  757|       |  
  758|       |  // pin indices to legal values
  759|  3.85M|  pinIndices(start, length);
  760|       |
  761|  3.85M|  if(srcChars == nullptr) {
  ------------------
  |  Branch (761:6): [True: 0, False: 3.85M]
  ------------------
  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|  3.85M|  const char16_t *chars = getArrayStart();
  768|       |
  769|  3.85M|  chars += start;
  770|  3.85M|  srcChars += srcStart;
  771|       |
  772|  3.85M|  int32_t minLength;
  773|  3.85M|  int8_t lengthResult;
  774|       |
  775|       |  // get the srcLength if necessary
  776|  3.85M|  if(srcLength < 0) {
  ------------------
  |  Branch (776:6): [True: 0, False: 3.85M]
  ------------------
  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|  3.85M|  if(length != srcLength) {
  ------------------
  |  Branch (781:6): [True: 2.92M, False: 923k]
  ------------------
  782|  2.92M|    if(length < srcLength) {
  ------------------
  |  Branch (782:8): [True: 610k, False: 2.31M]
  ------------------
  783|   610k|      minLength = length;
  784|   610k|      lengthResult = -1;
  785|  2.31M|    } else {
  786|  2.31M|      minLength = srcLength;
  787|  2.31M|      lengthResult = 1;
  788|  2.31M|    }
  789|  2.92M|  } else {
  790|   923k|    minLength = length;
  791|   923k|    lengthResult = 0;
  792|   923k|  }
  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|  3.85M|  if(minLength > 0 && chars != srcChars) {
  ------------------
  |  Branch (802:6): [True: 3.83M, False: 19.6k]
  |  Branch (802:23): [True: 3.83M, False: 0]
  ------------------
  803|  3.83M|    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|  7.36M|      do {
  814|  7.36M|        result = static_cast<int32_t>(*(chars++)) - static_cast<int32_t>(*(srcChars++));
  815|  7.36M|        if(result != 0) {
  ------------------
  |  Branch (815:12): [True: 2.49M, False: 4.87M]
  ------------------
  816|  2.49M|          return static_cast<int8_t>(result >> 15 | 1);
  817|  2.49M|        }
  818|  7.36M|      } while(--minLength > 0);
  ------------------
  |  Branch (818:15): [True: 3.53M, False: 1.33M]
  ------------------
  819|  3.83M|#   endif
  820|  3.83M|  }
  821|  1.35M|  return lengthResult;
  822|  3.85M|}
_ZNK6icu_7813UnicodeString8char32AtEi:
  871|   145M|{
  872|   145M|  int32_t len = length();
  873|   145M|  if (static_cast<uint32_t>(offset) < static_cast<uint32_t>(len)) {
  ------------------
  |  Branch (873:7): [True: 145M, False: 3.85k]
  ------------------
  874|   145M|    const char16_t *array = getArrayStart();
  875|   145M|    UChar32 c;
  876|   145M|    U16_GET(array, 0, offset, len, c);
  ------------------
  |  |  201|   145M|#define U16_GET(s, start, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   145M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  202|   145M|    (c)=(s)[i]; \
  |  |  203|   145M|    if(U16_IS_SURROGATE(c)) { \
  |  |  ------------------
  |  |  |  |   75|   145M|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   145M|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:27): [True: 387k, False: 145M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  204|   387k|        uint16_t __c2; \
  |  |  205|   387k|        if(U16_IS_SURROGATE_LEAD(c)) { \
  |  |  ------------------
  |  |  |  |   84|   387k|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:34): [True: 141k, False: 245k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  206|   141k|            if((i)+1!=(length) && U16_IS_TRAIL(__c2=(s)[(i)+1])) { \
  |  |  ------------------
  |  |  |  |   67|   141k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 59.1k, False: 82.2k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (206:16): [True: 141k, False: 390]
  |  |  ------------------
  |  |  207|  59.1k|                (c)=U16_GET_SUPPLEMENTARY((c), __c2); \
  |  |  ------------------
  |  |  |  |  113|  59.1k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  |  |  ------------------
  |  |  |  |  |  |   99|  59.1k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  208|  59.1k|            } \
  |  |  209|   245k|        } else { \
  |  |  210|   245k|            if((i)>(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \
  |  |  ------------------
  |  |  |  |   59|   245k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 0, False: 245k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (210:16): [True: 245k, False: 147]
  |  |  ------------------
  |  |  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|   245k|        } \
  |  |  214|   387k|    } \
  |  |  215|   145M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   145M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  877|   145M|    return c;
  878|   145M|  } else {
  879|  3.85k|    return kInvalidUChar;
  880|  3.85k|  }
  881|   145M|}
_ZNK6icu_7813UnicodeString11countChar32Eii:
  907|   489k|UnicodeString::countChar32(int32_t start, int32_t length) const {
  908|   489k|  pinIndices(start, length);
  909|       |  // if(isBogus()) then fArray==0 and start==0 - u_countChar32() checks for nullptr
  910|   489k|  return u_countChar32(getArrayStart()+start, length);
  ------------------
  |  |  228|   489k|#define u_countChar32 U_ICU_ENTRY_POINT_RENAME(u_countChar32)
  |  |  ------------------
  |  |  |  |  123|   489k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   489k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   489k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  911|   489k|}
_ZNK6icu_7813UnicodeString11moveIndex32Eii:
  921|  38.6M|UnicodeString::moveIndex32(int32_t index, int32_t delta) const {
  922|       |  // pin index
  923|  38.6M|  int32_t len = length();
  924|  38.6M|  if(index<0) {
  ------------------
  |  Branch (924:6): [True: 0, False: 38.6M]
  ------------------
  925|      0|    index=0;
  926|  38.6M|  } else if(index>len) {
  ------------------
  |  Branch (926:13): [True: 0, False: 38.6M]
  ------------------
  927|      0|    index=len;
  928|      0|  }
  929|       |
  930|  38.6M|  const char16_t *array = getArrayStart();
  931|  38.6M|  if(delta>0) {
  ------------------
  |  Branch (931:6): [True: 38.6M, False: 7.59k]
  ------------------
  932|  38.6M|    U16_FWD_N(array, index, len, delta);
  ------------------
  |  |  474|  38.6M|#define U16_FWD_N(s, i, length, n) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  38.6M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  475|  38.6M|    int32_t __N=(n); \
  |  |  476|  77.3M|    while(__N>0 && ((i)<(length) || ((length)<0 && (s)[i]!=0))) { \
  |  |  ------------------
  |  |  |  Branch (476:11): [True: 38.7M, False: 38.6M]
  |  |  |  Branch (476:21): [True: 38.7M, False: 120]
  |  |  |  Branch (476:38): [True: 0, False: 120]
  |  |  |  Branch (476:52): [True: 0, False: 0]
  |  |  ------------------
  |  |  477|  38.7M|        U16_FWD_1(s, i, length); \
  |  |  ------------------
  |  |  |  |  433|  38.7M|#define U16_FWD_1(s, i, length) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  |  |  ------------------
  |  |  |  |  |  |  169|  38.7M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  |  |  ------------------
  |  |  |  |  434|  38.7M|    if(U16_IS_LEAD((s)[(i)++]) && (i)!=(length) && U16_IS_TRAIL((s)[i])) { \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|  77.4M|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (59:24): [True: 43.8k, False: 38.6M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |                   if(U16_IS_LEAD((s)[(i)++]) && (i)!=(length) && U16_IS_TRAIL((s)[i])) { \
  |  |  |  |  ------------------
  |  |  |  |  |  |   67|  43.8k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:25): [True: 24.7k, False: 19.0k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (434:35): [True: 43.8k, False: 33]
  |  |  |  |  ------------------
  |  |  |  |  435|  24.7k|        ++(i); \
  |  |  |  |  436|  24.7k|    } \
  |  |  |  |  437|  38.7M|} UPRV_BLOCK_MACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  178|  38.7M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  478|  38.7M|        --__N; \
  |  |  479|  38.7M|    } \
  |  |  480|  38.6M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  38.6M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  933|  38.6M|  } else {
  934|  7.59k|    U16_BACK_N(array, 0, index, -delta);
  ------------------
  |  |  684|  7.59k|#define U16_BACK_N(s, start, i, n) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  7.59k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  685|  7.59k|    int32_t __N=(n); \
  |  |  686|  7.59k|    while(__N>0 && (i)>(start)) { \
  |  |  ------------------
  |  |  |  Branch (686:11): [True: 0, False: 7.59k]
  |  |  |  Branch (686:20): [True: 0, False: 0]
  |  |  ------------------
  |  |  687|      0|        U16_BACK_1(s, start, i); \
  |  |  ------------------
  |  |  |  |  643|      0|#define U16_BACK_1(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  |  |  ------------------
  |  |  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  |  |  ------------------
  |  |  |  |  644|      0|    if(U16_IS_TRAIL((s)[--(i)]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
  |  |  |  |  ------------------
  |  |  |  |  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |                   if(U16_IS_TRAIL((s)[--(i)]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (644:36): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  645|      0|        --(i); \
  |  |  |  |  646|      0|    } \
  |  |  |  |  647|      0|} UPRV_BLOCK_MACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  688|      0|        --__N; \
  |  |  689|      0|    } \
  |  |  690|  7.59k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  7.59k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  935|  7.59k|  }
  936|       |
  937|  38.6M|  return index;
  938|  38.6M|}
_ZNK6icu_7813UnicodeString9doExtractEiiPDsi:
  945|  13.3k|{
  946|       |  // pin indices to legal values
  947|  13.3k|  pinIndices(start, length);
  948|       |
  949|       |  // do not copy anything if we alias dst itself
  950|  13.3k|  const char16_t *array = getArrayStart();
  951|  13.3k|  if(array + start != dst + dstStart) {
  ------------------
  |  Branch (951:6): [True: 13.3k, False: 0]
  ------------------
  952|  13.3k|    us_arrayCopy(array, start, dst, dstStart, length);
  953|  13.3k|  }
  954|  13.3k|}
_ZNK6icu_7813UnicodeString7extractENS_9Char16PtrEiR10UErrorCode:
  958|     25|                       UErrorCode &errorCode) const {
  959|     25|  int32_t len = length();
  960|     25|  if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (960:6): [True: 25, False: 0]
  ------------------
  961|     25|    if (isBogus() || destCapacity < 0 || (destCapacity > 0 && dest == nullptr)) {
  ------------------
  |  Branch (961:9): [True: 0, False: 25]
  |  Branch (961:22): [True: 0, False: 25]
  |  Branch (961:43): [True: 25, False: 0]
  |  Branch (961:63): [True: 0, False: 25]
  ------------------
  962|      0|      errorCode=U_ILLEGAL_ARGUMENT_ERROR;
  963|     25|    } else {
  964|     25|      const char16_t *array = getArrayStart();
  965|     25|      if(len>0 && len<=destCapacity && array!=dest) {
  ------------------
  |  Branch (965:10): [True: 25, False: 0]
  |  Branch (965:19): [True: 25, False: 0]
  |  Branch (965:40): [True: 25, False: 0]
  ------------------
  966|     25|        u_memcpy(dest, array, len);
  ------------------
  |  |  334|     25|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|     25|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     25|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     25|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  967|     25|      }
  968|     25|      return u_terminateUChars(dest, destCapacity, len, &errorCode);
  ------------------
  |  |  408|     25|#define u_terminateUChars U_ICU_ENTRY_POINT_RENAME(u_terminateUChars)
  |  |  ------------------
  |  |  |  |  123|     25|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     25|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     25|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  969|     25|    }
  970|     25|  }
  971|       |
  972|      0|  return len;
  973|     25|}
_ZNK6icu_7813UnicodeString7extractEiiPciNS0_10EInvariantE:
  981|   434k|{
  982|       |  // if the arguments are illegal, then do nothing
  983|   434k|  if(targetCapacity < 0 || (targetCapacity > 0 && target == nullptr)) {
  ------------------
  |  Branch (983:6): [True: 0, False: 434k]
  |  Branch (983:29): [True: 434k, False: 0]
  |  Branch (983:51): [True: 0, False: 434k]
  ------------------
  984|      0|    return 0;
  985|      0|  }
  986|       |
  987|       |  // pin the indices to legal values
  988|   434k|  pinIndices(start, length);
  989|       |
  990|   434k|  if(length <= targetCapacity) {
  ------------------
  |  Branch (990:6): [True: 434k, False: 0]
  ------------------
  991|   434k|    u_UCharsToChars(getArrayStart() + start, target, length);
  ------------------
  |  |  211|   434k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|   434k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   434k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   434k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  992|   434k|  }
  993|   434k|  UErrorCode status = U_ZERO_ERROR;
  994|   434k|  return u_terminateChars(target, targetCapacity, length, &status);
  ------------------
  |  |  406|   434k|#define u_terminateChars U_ICU_ENTRY_POINT_RENAME(u_terminateChars)
  |  |  ------------------
  |  |  |  |  123|   434k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   434k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   434k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  995|   434k|}
_ZNK6icu_7813UnicodeString13tempSubStringEii:
  998|   208k|UnicodeString::tempSubString(int32_t start, int32_t len) const {
  999|   208k|  pinIndices(start, len);
 1000|   208k|  const char16_t *array = getBuffer();  // not getArrayStart() to check kIsBogus & kOpenGetBuffer
 1001|   208k|  if(array==nullptr) {
  ------------------
  |  Branch (1001:6): [True: 0, False: 208k]
  ------------------
 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|   208k|  return UnicodeString(false, array + start, len);
 1006|   208k|}
_ZNK6icu_7813UnicodeString14extractBetweenEiiRS0_:
 1040|      2|                  UnicodeString& target) const {
 1041|      2|  pinIndex(start);
 1042|      2|  pinIndex(limit);
 1043|      2|  doExtract(start, limit - start, target);
 1044|      2|}
_ZNK6icu_7813UnicodeString7indexOfEPKDsiiii:
 1112|   190k|{
 1113|   190k|  if (isBogus() || srcChars == nullptr || srcStart < 0 || srcLength == 0) {
  ------------------
  |  Branch (1113:7): [True: 0, False: 190k]
  |  Branch (1113:20): [True: 0, False: 190k]
  |  Branch (1113:43): [True: 0, False: 190k]
  |  Branch (1113:59): [True: 0, False: 190k]
  ------------------
 1114|      0|    return -1;
 1115|      0|  }
 1116|       |
 1117|       |  // UnicodeString does not find empty substrings
 1118|   190k|  if(srcLength < 0 && srcChars[srcStart] == 0) {
  ------------------
  |  Branch (1118:6): [True: 84.8k, False: 106k]
  |  Branch (1118:23): [True: 0, False: 84.8k]
  ------------------
 1119|      0|    return -1;
 1120|      0|  }
 1121|       |
 1122|       |  // get the indices within bounds
 1123|   190k|  pinIndices(start, length);
 1124|       |
 1125|       |  // find the first occurrence of the substring
 1126|   190k|  const char16_t *array = getArrayStart();
 1127|   190k|  const char16_t *match = u_strFindFirst(array + start, length, srcChars + srcStart, srcLength);
  ------------------
  |  |  361|   190k|#define u_strFindFirst U_ICU_ENTRY_POINT_RENAME(u_strFindFirst)
  |  |  ------------------
  |  |  |  |  123|   190k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   190k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   190k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1128|   190k|  if(match == nullptr) {
  ------------------
  |  Branch (1128:6): [True: 148k, False: 42.4k]
  ------------------
 1129|   148k|    return -1;
 1130|   148k|  } else {
 1131|  42.4k|    return static_cast<int32_t>(match - array);
 1132|  42.4k|  }
 1133|   190k|}
_ZNK6icu_7813UnicodeString9doIndexOfEDsii:
 1139|  1.39M|{
 1140|       |  // pin indices
 1141|  1.39M|  pinIndices(start, length);
 1142|       |
 1143|       |  // find the first occurrence of c
 1144|  1.39M|  const char16_t *array = getArrayStart();
 1145|  1.39M|  const char16_t *match = u_memchr(array + start, c, length);
  ------------------
  |  |  330|  1.39M|#define u_memchr U_ICU_ENTRY_POINT_RENAME(u_memchr)
  |  |  ------------------
  |  |  |  |  123|  1.39M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.39M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.39M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1146|  1.39M|  if(match == nullptr) {
  ------------------
  |  Branch (1146:6): [True: 827k, False: 567k]
  ------------------
 1147|   827k|    return -1;
 1148|   827k|  } else {
 1149|   567k|    return static_cast<int32_t>(match - array);
 1150|   567k|  }
 1151|  1.39M|}
_ZN6icu_7813UnicodeString10setToBogusEv:
 1283|  3.31M|{
 1284|  3.31M|  releaseArray();
 1285|       |
 1286|  3.31M|  fUnion.fFields.fLengthAndFlags = kIsBogus;
 1287|  3.31M|  fUnion.fFields.fArray = nullptr;
 1288|  3.31M|  fUnion.fFields.fCapacity = 0;
 1289|  3.31M|}
_ZN6icu_7813UnicodeString7unBogusEv:
 1293|  4.92M|UnicodeString::unBogus() {
 1294|  4.92M|  if(fUnion.fFields.fLengthAndFlags & kIsBogus) {
  ------------------
  |  Branch (1294:6): [True: 2, False: 4.92M]
  ------------------
 1295|      2|    setToEmpty();
 1296|      2|  }
 1297|  4.92M|}
_ZN6icu_7813UnicodeString19getTerminatedBufferEv:
 1300|   166k|UnicodeString::getTerminatedBuffer() {
 1301|   166k|  if(!isWritable()) {
  ------------------
  |  Branch (1301:6): [True: 0, False: 166k]
  ------------------
 1302|      0|    return nullptr;
 1303|      0|  }
 1304|   166k|  char16_t *array = getArrayStart();
 1305|   166k|  int32_t len = length();
 1306|   166k|  if(len < getCapacity()) {
  ------------------
  |  Branch (1306:6): [True: 166k, False: 0]
  ------------------
 1307|   166k|    if(fUnion.fFields.fLengthAndFlags & kBufferIsReadonly) {
  ------------------
  |  Branch (1307:8): [True: 25, False: 166k]
  ------------------
 1308|       |      // If len<capacity on a read-only alias, then array[len] is
 1309|       |      // either the original NUL (if constructed with (true, s, length))
 1310|       |      // or one of the original string contents characters (if later truncated),
 1311|       |      // therefore we can assume that array[len] is initialized memory.
 1312|     25|      if(array[len] == 0) {
  ------------------
  |  Branch (1312:10): [True: 25, False: 0]
  ------------------
 1313|     25|        return array;
 1314|     25|      }
 1315|   166k|    } else if(((fUnion.fFields.fLengthAndFlags & kRefCounted) == 0 || refCount() == 1)) {
  ------------------
  |  Branch (1315:16): [True: 166k, False: 0]
  |  Branch (1315:71): [True: 0, False: 0]
  ------------------
 1316|       |      // kRefCounted: Do not write the NUL if the buffer is shared.
 1317|       |      // That is mostly safe, except when the length of one copy was modified
 1318|       |      // without copy-on-write, e.g., via truncate(newLength) or remove().
 1319|       |      // Then the NUL would be written into the middle of another copy's string.
 1320|       |
 1321|       |      // Otherwise, the buffer is fully writable and it is anyway safe to write the NUL.
 1322|       |      // Do not test if there is a NUL already because it might be uninitialized memory.
 1323|       |      // (That would be safe, but tools like valgrind & Purify would complain.)
 1324|   166k|      array[len] = 0;
 1325|   166k|      return array;
 1326|   166k|    }
 1327|   166k|  }
 1328|      0|  if(len<INT32_MAX && cloneArrayIfNeeded(len+1)) {
  ------------------
  |  Branch (1328:6): [True: 0, False: 0]
  |  Branch (1328:23): [True: 0, False: 0]
  ------------------
 1329|      0|    array = getArrayStart();
 1330|      0|    array[len] = 0;
 1331|      0|    return array;
 1332|      0|  } else {
 1333|      0|    return nullptr;
 1334|      0|  }
 1335|      0|}
_ZN6icu_7813UnicodeString5setToEaNS_14ConstChar16PtrEi:
 1342|   273k|{
 1343|   273k|  if(fUnion.fFields.fLengthAndFlags & kOpenGetBuffer) {
  ------------------
  |  Branch (1343:6): [True: 0, False: 273k]
  ------------------
 1344|       |    // do not modify a string that has an "open" getBuffer(minCapacity)
 1345|      0|    return *this;
 1346|      0|  }
 1347|       |
 1348|   273k|  const char16_t *text = textPtr;
 1349|   273k|  if(text == nullptr) {
  ------------------
  |  Branch (1349:6): [True: 0, False: 273k]
  ------------------
 1350|       |    // treat as an empty string, do not alias
 1351|      0|    releaseArray();
 1352|      0|    setToEmpty();
 1353|      0|    return *this;
 1354|      0|  }
 1355|       |
 1356|   273k|  if( textLength < -1 ||
  ------------------
  |  Branch (1356:7): [True: 0, False: 273k]
  ------------------
 1357|   273k|      (textLength == -1 && !isTerminated) ||
  ------------------
  |  Branch (1357:8): [True: 0, False: 273k]
  |  Branch (1357:28): [True: 0, False: 0]
  ------------------
 1358|   273k|      (textLength >= 0 && isTerminated && text[textLength] != 0)
  ------------------
  |  Branch (1358:8): [True: 273k, False: 0]
  |  Branch (1358:27): [True: 273k, False: 0]
  |  Branch (1358:43): [True: 0, False: 273k]
  ------------------
 1359|   273k|  ) {
 1360|      0|    setToBogus();
 1361|      0|    return *this;
 1362|      0|  }
 1363|       |
 1364|   273k|  releaseArray();
 1365|       |
 1366|   273k|  if(textLength == -1) {
  ------------------
  |  Branch (1366:6): [True: 0, False: 273k]
  ------------------
 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|   273k|  fUnion.fFields.fLengthAndFlags = kReadonlyAlias;
 1371|   273k|  setArray(const_cast<char16_t*>(text), textLength, isTerminated ? textLength + 1 : textLength);
  ------------------
  |  Branch (1371:53): [True: 273k, False: 0]
  ------------------
 1372|   273k|  return *this;
 1373|   273k|}
_ZN6icu_7813UnicodeString9setToUTF8ENS_11StringPieceE:
 1411|      3|UnicodeString &UnicodeString::setToUTF8(StringPiece utf8) {
 1412|      3|  unBogus();
 1413|      3|  int32_t length = utf8.length();
 1414|      3|  int32_t capacity;
 1415|       |  // The UTF-16 string will be at most as long as the UTF-8 string.
 1416|      3|  if(length <= US_STACKBUF_SIZE) {
  ------------------
  |  Branch (1416:6): [True: 3, False: 0]
  ------------------
 1417|      3|    capacity = US_STACKBUF_SIZE;
 1418|      3|  } else {
 1419|      0|    capacity = length + 1;  // +1 for the terminating NUL.
 1420|      0|  }
 1421|      3|  char16_t *utf16 = getBuffer(capacity);
 1422|      3|  int32_t length16;
 1423|      3|  UErrorCode errorCode = U_ZERO_ERROR;
 1424|      3|  u_strFromUTF8WithSub(utf16, getCapacity(), &length16,
  ------------------
  |  |  370|      3|#define u_strFromUTF8WithSub U_ICU_ENTRY_POINT_RENAME(u_strFromUTF8WithSub)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1425|      3|      utf8.data(), length,
 1426|      3|      0xfffd,  // Substitution character.
 1427|      3|      nullptr,    // Don't care about number of substitutions.
 1428|      3|      &errorCode);
 1429|      3|  releaseBuffer(length16);
 1430|      3|  if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (1430:6): [True: 0, False: 3]
  ------------------
 1431|      0|    setToBogus();
 1432|      0|  }
 1433|      3|  return *this;
 1434|      3|}
_ZN6icu_7813UnicodeString9setCharAtEiDs:
 1439|  8.66k|{
 1440|  8.66k|  int32_t len = length();
 1441|  8.66k|  if(cloneArrayIfNeeded() && len > 0) {
  ------------------
  |  Branch (1441:6): [True: 8.66k, False: 0]
  |  Branch (1441:30): [True: 8.66k, False: 0]
  ------------------
 1442|  8.66k|    if(offset < 0) {
  ------------------
  |  Branch (1442:8): [True: 0, False: 8.66k]
  ------------------
 1443|      0|      offset = 0;
 1444|  8.66k|    } else if(offset >= len) {
  ------------------
  |  Branch (1444:15): [True: 0, False: 8.66k]
  ------------------
 1445|      0|      offset = len - 1;
 1446|      0|    }
 1447|       |
 1448|  8.66k|    getArrayStart()[offset] = c;
 1449|  8.66k|  }
 1450|  8.66k|  return *this;
 1451|  8.66k|}
_ZN6icu_7813UnicodeString7replaceEiii:
 1456|   444k|               UChar32 srcChar) {
 1457|   444k|  char16_t buffer[U16_MAX_LENGTH];
 1458|   444k|  int32_t count = 0;
 1459|   444k|  UBool isError = false;
 1460|   444k|  U16_APPEND(buffer, count, U16_MAX_LENGTH, srcChar, isError);
  ------------------
  |  |  393|   444k|#define U16_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   444k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  394|   444k|    if((uint32_t)(c)<=0xffff) { \
  |  |  ------------------
  |  |  |  Branch (394:8): [True: 444k, False: 0]
  |  |  ------------------
  |  |  395|   444k|        (s)[(i)++]=(uint16_t)(c); \
  |  |  396|   444k|    } 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|   444k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   444k|#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|   444k|  return doReplace(start, _length, buffer, 0, isError ? 0 : count);
  ------------------
  |  Branch (1464:47): [True: 0, False: 444k]
  ------------------
 1465|   444k|}
_ZN6icu_7813UnicodeString6appendEi:
 1468|  66.7M|UnicodeString::append(UChar32 srcChar) {
 1469|  66.7M|  char16_t buffer[U16_MAX_LENGTH];
 1470|  66.7M|  int32_t _length = 0;
 1471|  66.7M|  UBool isError = false;
 1472|  66.7M|  U16_APPEND(buffer, _length, U16_MAX_LENGTH, srcChar, isError);
  ------------------
  |  |  393|  66.7M|#define U16_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  66.7M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  394|  66.7M|    if((uint32_t)(c)<=0xffff) { \
  |  |  ------------------
  |  |  |  Branch (394:8): [True: 66.6M, False: 39.8k]
  |  |  ------------------
  |  |  395|  66.6M|        (s)[(i)++]=(uint16_t)(c); \
  |  |  396|  66.6M|    } else if((uint32_t)(c)<=0x10ffff && (i)+1<(capacity)) { \
  |  |  ------------------
  |  |  |  Branch (396:15): [True: 39.8k, False: 0]
  |  |  |  Branch (396:42): [True: 39.8k, False: 0]
  |  |  ------------------
  |  |  397|  39.8k|        (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
  |  |  398|  39.8k|        (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
  |  |  399|  39.8k|    } else /* c>0x10ffff or not enough space */ { \
  |  |  400|      0|        (isError)=true; \
  |  |  401|      0|    } \
  |  |  402|  66.7M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  66.7M|#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|  66.7M|  return isError ? *this : doAppend(buffer, 0, _length);
  ------------------
  |  Branch (1475:10): [True: 0, False: 66.7M]
  ------------------
 1476|  66.7M|}
_ZN6icu_7813UnicodeString9doReplaceEiiRKS0_ii:
 1484|  4.38M|{
 1485|       |  // pin the indices to legal values
 1486|  4.38M|  src.pinIndices(srcStart, srcLength);
 1487|       |
 1488|       |  // get the characters from src
 1489|       |  // and replace the range in ourselves with them
 1490|  4.38M|  return doReplace(start, length, src.getArrayStart(), srcStart, srcLength);
 1491|  4.38M|}
_ZN6icu_7813UnicodeString9doReplaceEiiPKDsii:
 1499|  6.42M|{
 1500|  6.42M|  if(!isWritable()) {
  ------------------
  |  Branch (1500:6): [True: 0, False: 6.42M]
  ------------------
 1501|      0|    return *this;
 1502|      0|  }
 1503|       |
 1504|  6.42M|  int32_t oldLength = this->length();
 1505|       |
 1506|       |  // optimize (read-only alias).remove(0, start) and .remove(start, end)
 1507|  6.42M|  if((fUnion.fFields.fLengthAndFlags&kBufferIsReadonly) && srcLength == 0) {
  ------------------
  |  Branch (1507:6): [True: 48.1k, False: 6.37M]
  |  Branch (1507:60): [True: 0, False: 48.1k]
  ------------------
 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|  6.42M|  if(start == oldLength) {
  ------------------
  |  Branch (1526:6): [True: 5.57M, False: 851k]
  ------------------
 1527|  5.57M|    return doAppend(srcChars, srcStart, srcLength);
 1528|  5.57M|  }
 1529|       |
 1530|   851k|  if (srcChars == nullptr) {
  ------------------
  |  Branch (1530:7): [True: 234k, False: 617k]
  ------------------
 1531|   234k|    srcLength = 0;
 1532|   617k|  } else {
 1533|       |    // Perform all remaining operations relative to srcChars + srcStart.
 1534|       |    // From this point forward, do not use srcStart.
 1535|   617k|    srcChars += srcStart;
 1536|   617k|    if (srcLength < 0) {
  ------------------
  |  Branch (1536:9): [True: 0, False: 617k]
  ------------------
 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|   617k|  }
 1541|       |
 1542|       |  // pin the indices to legal values
 1543|   851k|  pinIndices(start, length);
 1544|       |
 1545|       |  // Calculate the size of the string after the replace.
 1546|       |  // Avoid int32_t overflow.
 1547|   851k|  int32_t newLength = oldLength - length;
 1548|   851k|  if(srcLength > (INT32_MAX - newLength)) {
  ------------------
  |  Branch (1548:6): [True: 0, False: 851k]
  ------------------
 1549|      0|    setToBogus();
 1550|      0|    return *this;
 1551|      0|  }
 1552|   851k|  newLength += srcLength;
 1553|       |
 1554|       |  // Check for insertion into ourself
 1555|   851k|  const char16_t *oldArray = getArrayStart();
 1556|   851k|  if (isBufferWritable() &&
  ------------------
  |  Branch (1556:7): [True: 761k, False: 90.6k]
  ------------------
 1557|   851k|      oldArray < srcChars + srcLength &&
  ------------------
  |  Branch (1557:7): [True: 526k, False: 234k]
  ------------------
 1558|   851k|      srcChars < oldArray + oldLength) {
  ------------------
  |  Branch (1558:7): [True: 0, False: 526k]
  ------------------
 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|   851k|  char16_t oldStackBuffer[US_STACKBUF_SIZE];
 1571|   851k|  if((fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) && (newLength > US_STACKBUF_SIZE)) {
  ------------------
  |  Branch (1571:6): [True: 637k, False: 213k]
  |  Branch (1571:60): [True: 21.2k, False: 616k]
  ------------------
 1572|       |    // copy the stack buffer contents because it will be overwritten with
 1573|       |    // fUnion.fFields values
 1574|  21.2k|    u_memcpy(oldStackBuffer, oldArray, oldLength);
  ------------------
  |  |  334|  21.2k|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1575|  21.2k|    oldArray = oldStackBuffer;
 1576|  21.2k|  }
 1577|       |
 1578|       |  // clone our array and allocate a bigger array if needed
 1579|   851k|  int32_t *bufferToDelete = nullptr;
 1580|   851k|  if(!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength),
  ------------------
  |  Branch (1580:6): [True: 0, False: 851k]
  ------------------
 1581|   851k|                         false, &bufferToDelete)
 1582|   851k|  ) {
 1583|      0|    return *this;
 1584|      0|  }
 1585|       |
 1586|       |  // now do the replace
 1587|       |
 1588|   851k|  char16_t *newArray = getArrayStart();
 1589|   851k|  if(newArray != oldArray) {
  ------------------
  |  Branch (1589:6): [True: 111k, False: 739k]
  ------------------
 1590|       |    // if fArray changed, then we need to copy everything except what will change
 1591|   111k|    us_arrayCopy(oldArray, 0, newArray, 0, start);
 1592|   111k|    us_arrayCopy(oldArray, start + length,
 1593|   111k|                 newArray, start + srcLength,
 1594|   111k|                 oldLength - (start + length));
 1595|   739k|  } else if(length != srcLength) {
  ------------------
  |  Branch (1595:13): [True: 197k, False: 542k]
  ------------------
 1596|       |    // fArray did not change; copy only the portion that isn't changing, leaving a hole
 1597|   197k|    us_arrayCopy(oldArray, start + length,
 1598|   197k|                 newArray, start + srcLength,
 1599|   197k|                 oldLength - (start + length));
 1600|   197k|  }
 1601|       |
 1602|       |  // now fill in the hole with the new string
 1603|   851k|  us_arrayCopy(srcChars, 0, newArray, start, srcLength);
 1604|       |
 1605|   851k|  setLength(newLength);
 1606|       |
 1607|       |  // delayed delete in case srcChars == fArray when we started, and
 1608|       |  // to keep oldArray alive for the above operations
 1609|   851k|  if (bufferToDelete) {
  ------------------
  |  Branch (1609:7): [True: 0, False: 851k]
  ------------------
 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|   851k|  return *this;
 1614|   851k|}
_ZN6icu_7813UnicodeString8doAppendERKS0_ii:
 1632|  2.54M|UnicodeString::doAppend(const UnicodeString& src, int32_t srcStart, int32_t srcLength) {
 1633|  2.54M|  if(srcLength == 0) {
  ------------------
  |  Branch (1633:6): [True: 234k, False: 2.31M]
  ------------------
 1634|   234k|    return *this;
 1635|   234k|  }
 1636|       |
 1637|       |  // pin the indices to legal values
 1638|  2.31M|  src.pinIndices(srcStart, srcLength);
 1639|  2.31M|  return doAppend(src.getArrayStart(), srcStart, srcLength);
 1640|  2.54M|}
_ZN6icu_7813UnicodeString8doAppendEPKDsii:
 1643|  78.0M|UnicodeString::doAppend(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) {
 1644|  78.0M|  if(!isWritable() || srcLength == 0 || srcChars == nullptr) {
  ------------------
  |  Branch (1644:6): [True: 0, False: 78.0M]
  |  Branch (1644:23): [True: 0, False: 78.0M]
  |  Branch (1644:41): [True: 0, False: 78.0M]
  ------------------
 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|  78.0M|  srcChars += srcStart;
 1651|       |
 1652|  78.0M|  if(srcLength < 0) {
  ------------------
  |  Branch (1652:6): [True: 0, False: 78.0M]
  ------------------
 1653|       |    // get the srcLength if necessary
 1654|      0|    if((srcLength = u_strlen(srcChars)) == 0) {
  ------------------
  |  |  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 (1654:8): [True: 0, False: 0]
  ------------------
 1655|      0|      return *this;
 1656|      0|    }
 1657|      0|  }
 1658|       |
 1659|  78.0M|  int32_t oldLength = length();
 1660|  78.0M|  int32_t newLength;
 1661|       |
 1662|  78.0M|  if (srcLength <= getCapacity() - oldLength && isBufferWritable()) {
  ------------------
  |  Branch (1662:7): [True: 77.6M, False: 333k]
  |  Branch (1662:49): [True: 77.6M, False: 86]
  ------------------
 1663|  77.6M|    newLength = oldLength + srcLength;
 1664|       |    // Faster than a memmove
 1665|  77.6M|    if (srcLength <= 4) {
  ------------------
  |  Branch (1665:9): [True: 77.1M, False: 492k]
  ------------------
 1666|  77.1M|      char16_t *arr = getArrayStart();
 1667|  77.1M|      arr[oldLength] = srcChars[0];
 1668|  77.1M|      if (srcLength > 1) arr[oldLength+1] = srcChars[1];
  ------------------
  |  Branch (1668:11): [True: 1.87M, False: 75.3M]
  ------------------
 1669|  77.1M|      if (srcLength > 2) arr[oldLength+2] = srcChars[2];
  ------------------
  |  Branch (1669:11): [True: 634k, False: 76.5M]
  ------------------
 1670|  77.1M|      if (srcLength > 3) arr[oldLength+3] = srcChars[3];
  ------------------
  |  Branch (1670:11): [True: 126k, False: 77.0M]
  ------------------
 1671|  77.1M|      setLength(newLength);
 1672|  77.1M|      return *this;
 1673|  77.1M|    }
 1674|  77.6M|  } else {
 1675|   333k|    if (uprv_add32_overflow(oldLength, srcLength, &newLength)) {
  ------------------
  |  | 1394|   333k|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|   333k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   333k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   333k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1675:9): [True: 0, False: 333k]
  ------------------
 1676|      0|      setToBogus();
 1677|      0|      return *this;
 1678|      0|    }
 1679|       |
 1680|       |    // Check for append onto ourself
 1681|   333k|    const char16_t* oldArray = getArrayStart();
 1682|   333k|    if (isBufferWritable() &&
  ------------------
  |  Branch (1682:9): [True: 291k, False: 42.5k]
  ------------------
 1683|   333k|        oldArray < srcChars + srcLength &&
  ------------------
  |  Branch (1683:9): [True: 118k, False: 173k]
  ------------------
 1684|   333k|        srcChars < oldArray + oldLength) {
  ------------------
  |  Branch (1684:9): [True: 0, False: 118k]
  ------------------
 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|   333k|    if (!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength))) {
  ------------------
  |  Branch (1695:9): [True: 0, False: 333k]
  ------------------
 1696|      0|      return *this;
 1697|      0|    }
 1698|   333k|  }
 1699|       |
 1700|   826k|  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|   826k|  if(srcChars != newArray + oldLength) {
  ------------------
  |  Branch (1708:6): [True: 826k, False: 0]
  ------------------
 1709|   826k|    us_arrayCopy(srcChars, 0, newArray, oldLength, srcLength);
 1710|   826k|  }
 1711|   826k|  setLength(newLength);
 1712|       |
 1713|   826k|  return *this;
 1714|  78.0M|}
_ZN6icu_7813UnicodeString8doAppendENSt3__117basic_string_viewIDsNS1_11char_traitsIDsEEEE:
 1717|   216k|UnicodeString::doAppend(std::u16string_view src) {
 1718|   216k|  if (!isWritable() || src.empty()) {
  ------------------
  |  Branch (1718:7): [True: 0, False: 216k]
  |  Branch (1718:24): [True: 0, False: 216k]
  ------------------
 1719|      0|    return *this;
 1720|      0|  }
 1721|   216k|  if (src.length() > INT32_MAX) {
  ------------------
  |  Branch (1721:7): [True: 0, False: 216k]
  ------------------
 1722|      0|    setToBogus();
 1723|      0|    return *this;
 1724|      0|  }
 1725|   216k|  return doAppend(src.data(), 0, static_cast<int32_t>(src.length()));
 1726|   216k|}
_ZNK6icu_7813UnicodeString10doHashCodeEv:
 1864|   335k|{
 1865|       |    /* Delegate hash computation to uhash.  This makes UnicodeString
 1866|       |     * hashing consistent with char16_t* hashing.  */
 1867|   335k|    int32_t hashCode = ustr_hashUCharsN(getArrayStart(), length());
  ------------------
  |  | 1880|   335k|#define ustr_hashUCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashUCharsN)
  |  |  ------------------
  |  |  |  |  123|   335k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   335k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   335k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1868|   335k|    if (hashCode == kInvalidHashCode) {
  ------------------
  |  Branch (1868:9): [True: 3.22k, False: 332k]
  ------------------
 1869|  3.22k|        hashCode = kEmptyHashCode;
 1870|  3.22k|    }
 1871|   335k|    return hashCode;
 1872|   335k|}
_ZN6icu_7813UnicodeString9getBufferEi:
 1879|      3|UnicodeString::getBuffer(int32_t minCapacity) {
 1880|      3|  if(minCapacity>=-1 && cloneArrayIfNeeded(minCapacity)) {
  ------------------
  |  Branch (1880:6): [True: 3, False: 0]
  |  Branch (1880:25): [True: 3, False: 0]
  ------------------
 1881|      3|    fUnion.fFields.fLengthAndFlags|=kOpenGetBuffer;
 1882|      3|    setZeroLength();
 1883|      3|    return getArrayStart();
 1884|      3|  } else {
 1885|      0|    return nullptr;
 1886|      0|  }
 1887|      3|}
_ZN6icu_7813UnicodeString13releaseBufferEi:
 1890|      3|UnicodeString::releaseBuffer(int32_t newLength) {
 1891|      3|  if(fUnion.fFields.fLengthAndFlags&kOpenGetBuffer && newLength>=-1) {
  ------------------
  |  Branch (1891:6): [True: 3, False: 0]
  |  Branch (1891:55): [True: 3, False: 0]
  ------------------
 1892|       |    // set the new fLength
 1893|      3|    int32_t capacity=getCapacity();
 1894|      3|    if(newLength==-1) {
  ------------------
  |  Branch (1894:8): [True: 0, False: 3]
  ------------------
 1895|       |      // the new length is the string length, capped by fCapacity
 1896|      0|      const char16_t *array=getArrayStart(), *p=array, *limit=array+capacity;
 1897|      0|      while(p<limit && *p!=0) {
  ------------------
  |  Branch (1897:13): [True: 0, False: 0]
  |  Branch (1897:24): [True: 0, False: 0]
  ------------------
 1898|      0|        ++p;
 1899|      0|      }
 1900|      0|      newLength = static_cast<int32_t>(p - array);
 1901|      3|    } else if(newLength>capacity) {
  ------------------
  |  Branch (1901:15): [True: 0, False: 3]
  ------------------
 1902|      0|      newLength=capacity;
 1903|      0|    }
 1904|      3|    setLength(newLength);
 1905|      3|    fUnion.fFields.fLengthAndFlags&=~kOpenGetBuffer;
 1906|      3|  }
 1907|      3|}
_ZN6icu_7813UnicodeString18cloneArrayIfNeededEiiaPPia:
 1917|  1.58M|                                  UBool forceClone) {
 1918|       |  // default parameters need to be static, therefore
 1919|       |  // the defaults are -1 to have convenience defaults
 1920|  1.58M|  if(newCapacity == -1) {
  ------------------
  |  Branch (1920:6): [True: 8.66k, False: 1.57M]
  ------------------
 1921|  8.66k|    newCapacity = getCapacity();
 1922|  8.66k|  }
 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|  1.58M|  if(!isWritable()) {
  ------------------
  |  Branch (1927:6): [True: 0, False: 1.58M]
  ------------------
 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|  1.58M|  if(forceClone ||
  ------------------
  |  Branch (1938:6): [True: 2.82k, False: 1.57M]
  ------------------
 1939|  1.58M|     fUnion.fFields.fLengthAndFlags & kBufferIsReadonly ||
  ------------------
  |  Branch (1939:6): [True: 174k, False: 1.40M]
  ------------------
 1940|  1.58M|     (fUnion.fFields.fLengthAndFlags & kRefCounted && refCount() > 1) ||
  ------------------
  |  Branch (1940:7): [True: 215k, False: 1.18M]
  |  Branch (1940:55): [True: 42.5k, False: 172k]
  ------------------
 1941|  1.58M|     newCapacity > getCapacity()
  ------------------
  |  Branch (1941:6): [True: 312k, False: 1.04M]
  ------------------
 1942|  1.58M|  ) {
 1943|       |    // check growCapacity for default value and use of the stack buffer
 1944|   532k|    if(growCapacity < 0) {
  ------------------
  |  Branch (1944:8): [True: 0, False: 532k]
  ------------------
 1945|      0|      growCapacity = newCapacity;
 1946|   532k|    } else if(newCapacity <= US_STACKBUF_SIZE && growCapacity > US_STACKBUF_SIZE) {
  ------------------
  |  Branch (1946:15): [True: 170k, False: 362k]
  |  Branch (1946:50): [True: 87.2k, False: 83.2k]
  ------------------
 1947|  87.2k|      growCapacity = US_STACKBUF_SIZE;
 1948|   445k|    } else if(newCapacity > growCapacity) {
  ------------------
  |  Branch (1948:15): [True: 0, False: 445k]
  ------------------
 1949|      0|      setToBogus();
 1950|      0|      return false;  // bad inputs
 1951|      0|    }
 1952|   532k|    if(growCapacity > kMaxCapacity) {
  ------------------
  |  Branch (1952:8): [True: 0, False: 532k]
  ------------------
 1953|      0|      setToBogus();
 1954|      0|      return false;
 1955|      0|    }
 1956|       |
 1957|       |    // save old values
 1958|   532k|    char16_t oldStackBuffer[US_STACKBUF_SIZE];
 1959|   532k|    char16_t *oldArray;
 1960|   532k|    int32_t oldLength = length();
 1961|   532k|    int16_t flags = fUnion.fFields.fLengthAndFlags;
 1962|       |
 1963|   532k|    if(flags&kUsingStackBuffer) {
  ------------------
  |  Branch (1963:8): [True: 264k, False: 268k]
  ------------------
 1964|   264k|      U_ASSERT(!(flags&kRefCounted)); /* kRefCounted and kUsingStackBuffer are mutally exclusive */
  ------------------
  |  |   35|   264k|#   define U_ASSERT(exp) (void)0
  ------------------
 1965|   264k|      if(doCopyArray && growCapacity > US_STACKBUF_SIZE) {
  ------------------
  |  Branch (1965:10): [True: 242k, False: 22.2k]
  |  Branch (1965:25): [True: 242k, False: 0]
  ------------------
 1966|       |        // copy the stack buffer contents because it will be overwritten with
 1967|       |        // fUnion.fFields values
 1968|   242k|        us_arrayCopy(fUnion.fStackFields.fBuffer, 0, oldStackBuffer, 0, oldLength);
 1969|   242k|        oldArray = oldStackBuffer;
 1970|   242k|      } else {
 1971|  22.2k|        oldArray = nullptr; // no need to copy from the stack buffer to itself
 1972|  22.2k|      }
 1973|   268k|    } else {
 1974|   268k|      oldArray = fUnion.fFields.fArray;
 1975|   268k|      U_ASSERT(oldArray!=nullptr); /* when stack buffer is not used, oldArray must have a non-nullptr reference */
  ------------------
  |  |   35|   268k|#   define U_ASSERT(exp) (void)0
  ------------------
 1976|   268k|    }
 1977|       |
 1978|       |    // allocate a new array
 1979|   532k|    if(allocate(growCapacity) ||
  ------------------
  |  Branch (1979:8): [True: 532k, False: 0]
  ------------------
 1980|   532k|       (newCapacity < growCapacity && allocate(newCapacity))
  ------------------
  |  Branch (1980:9): [True: 0, False: 0]
  |  Branch (1980:39): [True: 0, False: 0]
  ------------------
 1981|   532k|    ) {
 1982|   532k|      if(doCopyArray) {
  ------------------
  |  Branch (1982:10): [True: 334k, False: 197k]
  ------------------
 1983|       |        // copy the contents
 1984|       |        // do not copy more than what fits - it may be smaller than before
 1985|   334k|        int32_t minLength = oldLength;
 1986|   334k|        newCapacity = getCapacity();
 1987|   334k|        if(newCapacity < minLength) {
  ------------------
  |  Branch (1987:12): [True: 0, False: 334k]
  ------------------
 1988|      0|          minLength = newCapacity;
 1989|      0|        }
 1990|   334k|        if(oldArray != nullptr) {
  ------------------
  |  Branch (1990:12): [True: 334k, False: 0]
  ------------------
 1991|   334k|          us_arrayCopy(oldArray, 0, getArrayStart(), 0, minLength);
 1992|   334k|        }
 1993|   334k|        setLength(minLength);
 1994|   334k|      } else {
 1995|   197k|        setZeroLength();
 1996|   197k|      }
 1997|       |
 1998|       |      // release the old array
 1999|   532k|      if(flags & kRefCounted) {
  ------------------
  |  Branch (1999:10): [True: 91.7k, False: 440k]
  ------------------
 2000|       |        // the array is refCounted; decrement and release if 0
 2001|  91.7k|        u_atomic_int32_t* pRefCount = reinterpret_cast<u_atomic_int32_t*>(oldArray) - 1;
 2002|  91.7k|        if(umtx_atomic_dec(pRefCount) == 0) {
  ------------------
  |  Branch (2002:12): [True: 49.2k, False: 42.5k]
  ------------------
 2003|  49.2k|          if (pBufferToDelete == nullptr) {
  ------------------
  |  Branch (2003:15): [True: 49.2k, 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|  49.2k|            uprv_free((void *)pRefCount);
  ------------------
  |  | 1503|  49.2k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  49.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  49.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  49.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2008|  49.2k|          } else {
 2009|       |            // the caller requested to delete it himself
 2010|      0|            *pBufferToDelete = reinterpret_cast<int32_t*>(pRefCount);
 2011|      0|          }
 2012|  49.2k|        }
 2013|  91.7k|      }
 2014|   532k|    } 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|   532k|  }
 2025|  1.58M|  return true;
 2026|  1.58M|}
uhash_hashUnicodeString_78:
 2081|   294k|uhash_hashUnicodeString(const UElement key) {
 2082|   294k|    const UnicodeString *str = (const UnicodeString*) key.pointer;
 2083|   294k|    return (str == nullptr) ? 0 : str->hashCode();
  ------------------
  |  Branch (2083:12): [True: 0, False: 294k]
  ------------------
 2084|   294k|}
uhash_compareUnicodeString_78:
 2089|  96.2k|uhash_compareUnicodeString(const UElement key1, const UElement key2) {
 2090|  96.2k|    const UnicodeString *str1 = (const UnicodeString*) key1.pointer;
 2091|  96.2k|    const UnicodeString *str2 = (const UnicodeString*) key2.pointer;
 2092|  96.2k|    if (str1 == str2) {
  ------------------
  |  Branch (2092:9): [True: 0, False: 96.2k]
  ------------------
 2093|      0|        return true;
 2094|      0|    }
 2095|  96.2k|    if (str1 == nullptr || str2 == nullptr) {
  ------------------
  |  Branch (2095:9): [True: 0, False: 96.2k]
  |  Branch (2095:28): [True: 0, False: 96.2k]
  ------------------
 2096|      0|        return false;
 2097|      0|    }
 2098|  96.2k|    return *str1 == *str2;
 2099|  96.2k|}
unistr.cpp:_ZL20UnicodeString_charAtiPv:
   96|     10|UnicodeString_charAt(int32_t offset, void *context) {
   97|     10|    return ((icu::UnicodeString*) context)->charAt(offset);
   98|     10|}
unistr.cpp:_ZL12us_arrayCopyPKDsiPDsii:
   87|  2.69M|{
   88|  2.69M|  if(count>0) {
  ------------------
  |  Branch (88:6): [True: 2.11M, False: 580k]
  ------------------
   89|  2.11M|    uprv_memmove(dst+dstStart, src+srcStart, (size_t)count*sizeof(*src));
  ------------------
  |  |   51|  2.11M|#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.11M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   52|  2.11M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   53|  2.11M|    _Pragma("clang diagnostic push") \
  |  |   54|  2.11M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   55|  2.11M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.11M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   56|  2.11M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.11M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   57|  2.11M|    _Pragma("clang diagnostic pop") \
  |  |   58|  2.11M|    U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  2.11M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   59|  2.11M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.11M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   90|  2.11M|  }
   91|  2.69M|}
unistr.cpp:_ZN6icu_7812_GLOBAL__N_115getGrowCapacityEi:
  397|  1.18M|int32_t getGrowCapacity(int32_t newLength) {
  398|  1.18M|  int32_t growSize = (newLength >> 2) + kGrowSize;
  399|  1.18M|  if(growSize <= (kMaxCapacity - newLength)) {
  ------------------
  |  Branch (399:6): [True: 1.18M, False: 0]
  ------------------
  400|  1.18M|    return newLength + growSize;
  401|  1.18M|  } else {
  402|      0|    return kMaxCapacity;
  403|      0|  }
  404|  1.18M|}

_ZN6icu_7813UnicodeString7caseMapEijPNS_13BreakIteratorEPFiijS2_PDsiPKDsiPNS_5EditsER10UErrorCodeE:
   95|  90.0k|                       UStringCaseMapper *stringCaseMapper) {
   96|  90.0k|  if(isEmpty() || !isWritable()) {
  ------------------
  |  Branch (96:6): [True: 399, False: 89.6k]
  |  Branch (96:19): [True: 0, False: 89.6k]
  ------------------
   97|       |    // nothing to do
   98|    399|    return *this;
   99|    399|  }
  100|       |
  101|  89.6k|  char16_t oldBuffer[2 * US_STACKBUF_SIZE];
  102|  89.6k|  char16_t *oldArray;
  103|  89.6k|  int32_t oldLength = length();
  104|  89.6k|  int32_t newLength;
  105|  89.6k|  UBool writable = isBufferWritable();
  106|  89.6k|  UErrorCode errorCode = U_ZERO_ERROR;
  107|       |
  108|  89.6k|#if !UCONFIG_NO_BREAK_ITERATION
  109|       |  // Read-only alias to the original string contents for the titlecasing BreakIterator.
  110|       |  // We cannot set the iterator simply to *this because *this is being modified.
  111|  89.6k|  UnicodeString oldString;
  112|  89.6k|#endif
  113|       |
  114|       |  // Try to avoid heap-allocating a new character array for this string.
  115|  89.6k|  if (writable ? oldLength <= UPRV_LENGTHOF(oldBuffer) : oldLength < US_STACKBUF_SIZE) {
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (115:7): [True: 0, False: 89.6k]
  |  Branch (115:7): [True: 83.2k, False: 6.42k]
  ------------------
  116|       |    // Short string: Copy the contents into a temporary buffer and
  117|       |    // case-map back into the current array, or into the stack buffer.
  118|  83.2k|    char16_t *buffer = getArrayStart();
  119|  83.2k|    int32_t capacity;
  120|  83.2k|    oldArray = oldBuffer;
  121|  83.2k|    u_memcpy(oldBuffer, buffer, oldLength);
  ------------------
  |  |  334|  83.2k|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|  83.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  83.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  83.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  122|  83.2k|    if (writable) {
  ------------------
  |  Branch (122:9): [True: 0, False: 83.2k]
  ------------------
  123|      0|      capacity = getCapacity();
  124|  83.2k|    } else {
  125|       |      // Switch from the read-only alias or shared heap buffer to the stack buffer.
  126|  83.2k|      if (!cloneArrayIfNeeded(US_STACKBUF_SIZE, US_STACKBUF_SIZE, /* doCopyArray= */ false)) {
  ------------------
  |  Branch (126:11): [True: 0, False: 83.2k]
  ------------------
  127|      0|        return *this;
  128|      0|      }
  129|  83.2k|      U_ASSERT(fUnion.fFields.fLengthAndFlags & kUsingStackBuffer);
  ------------------
  |  |   35|  83.2k|#   define U_ASSERT(exp) (void)0
  ------------------
  130|  83.2k|      buffer = fUnion.fStackFields.fBuffer;
  131|  83.2k|      capacity = US_STACKBUF_SIZE;
  132|  83.2k|    }
  133|  83.2k|#if !UCONFIG_NO_BREAK_ITERATION
  134|  83.2k|    if (iter != nullptr) {
  ------------------
  |  Branch (134:9): [True: 0, False: 83.2k]
  ------------------
  135|      0|      oldString.setTo(false, oldArray, oldLength);
  136|      0|      iter->setText(oldString);
  137|      0|    }
  138|  83.2k|#endif
  139|  83.2k|    newLength = stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR
  ------------------
  |  |  131|  83.2k|#   define UCASEMAP_BREAK_ITERATOR iter,
  ------------------
  140|  83.2k|                                 buffer, capacity,
  141|  83.2k|                                 oldArray, oldLength, nullptr, errorCode);
  142|  83.2k|    if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (142:9): [True: 82.2k, False: 1.04k]
  ------------------
  143|  82.2k|      setLength(newLength);
  144|  82.2k|      return *this;
  145|  82.2k|    } else if (errorCode == U_BUFFER_OVERFLOW_ERROR) {
  ------------------
  |  Branch (145:16): [True: 1.04k, False: 0]
  ------------------
  146|       |      // common overflow handling below
  147|  1.04k|    } else {
  148|      0|      setToBogus();
  149|      0|      return *this;
  150|      0|    }
  151|  83.2k|  } else {
  152|       |    // Longer string or read-only buffer:
  153|       |    // Collect only changes and then apply them to this string.
  154|       |    // Case mapping often changes only small parts of a string,
  155|       |    // and often does not change its length.
  156|  6.42k|    oldArray = getArrayStart();
  157|  6.42k|    Edits edits;
  158|  6.42k|    char16_t replacementChars[200];
  159|  6.42k|#if !UCONFIG_NO_BREAK_ITERATION
  160|  6.42k|    if (iter != nullptr) {
  ------------------
  |  Branch (160:9): [True: 0, False: 6.42k]
  ------------------
  161|      0|      oldString.setTo(false, oldArray, oldLength);
  162|      0|      iter->setText(oldString);
  163|      0|    }
  164|  6.42k|#endif
  165|  6.42k|    stringCaseMapper(caseLocale, options | U_OMIT_UNCHANGED_TEXT, UCASEMAP_BREAK_ITERATOR
  ------------------
  |  |  152|  6.42k|#define U_OMIT_UNCHANGED_TEXT 0x4000
  ------------------
                  stringCaseMapper(caseLocale, options | U_OMIT_UNCHANGED_TEXT, UCASEMAP_BREAK_ITERATOR
  ------------------
  |  |  131|  6.42k|#   define UCASEMAP_BREAK_ITERATOR iter,
  ------------------
  166|  6.42k|                     replacementChars, UPRV_LENGTHOF(replacementChars),
  ------------------
  |  |   99|  6.42k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  167|  6.42k|                     oldArray, oldLength, &edits, errorCode);
  168|  6.42k|    if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (168:9): [True: 4.64k, False: 1.78k]
  ------------------
  169|       |      // Grow the buffer at most once, not for multiple doReplace() calls.
  170|  4.64k|      newLength = oldLength + edits.lengthDelta();
  171|  4.64k|      if (newLength > oldLength && !cloneArrayIfNeeded(newLength, newLength)) {
  ------------------
  |  Branch (171:11): [True: 892, False: 3.75k]
  |  Branch (171:36): [True: 0, False: 892]
  ------------------
  172|      0|        return *this;
  173|      0|      }
  174|   111k|      for (Edits::Iterator ei = edits.getCoarseChangesIterator(); ei.next(errorCode);) {
  ------------------
  |  Branch (174:67): [True: 106k, False: 4.64k]
  ------------------
  175|   106k|        doReplace(ei.destinationIndex(), ei.oldLength(),
  176|   106k|                  replacementChars, ei.replacementIndex(), ei.newLength());
  177|   106k|      }
  178|  4.64k|      if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (178:11): [True: 0, False: 4.64k]
  ------------------
  179|      0|        setToBogus();
  180|      0|      }
  181|  4.64k|      return *this;
  182|  4.64k|    } else if (errorCode == U_BUFFER_OVERFLOW_ERROR) {
  ------------------
  |  Branch (182:16): [True: 1.78k, False: 0]
  ------------------
  183|       |      // common overflow handling below
  184|  1.78k|      newLength = oldLength + edits.lengthDelta();
  185|  1.78k|    } else {
  186|      0|      setToBogus();
  187|      0|      return *this;
  188|      0|    }
  189|  6.42k|  }
  190|       |
  191|       |  // Handle buffer overflow, newLength is known.
  192|       |  // We need to allocate a new buffer for the internal string case mapping function.
  193|       |  // This is very similar to how doReplace() keeps the old array pointer
  194|       |  // and deletes the old array itself after it is done.
  195|       |  // In addition, we are forcing cloneArrayIfNeeded() to always allocate a new array.
  196|  2.82k|  int32_t *bufferToDelete = nullptr;
  197|  2.82k|  if (!cloneArrayIfNeeded(newLength, newLength, false, &bufferToDelete, true)) {
  ------------------
  |  Branch (197:7): [True: 0, False: 2.82k]
  ------------------
  198|      0|    return *this;
  199|      0|  }
  200|  2.82k|  errorCode = U_ZERO_ERROR;
  201|       |  // No need to iter->setText() again: The case mapper restarts via iter->first().
  202|  2.82k|  newLength = stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR
  ------------------
  |  |  131|  2.82k|#   define UCASEMAP_BREAK_ITERATOR iter,
  ------------------
  203|  2.82k|                               getArrayStart(), getCapacity(),
  204|  2.82k|                               oldArray, oldLength, nullptr, errorCode);
  205|  2.82k|  if (bufferToDelete) {
  ------------------
  |  Branch (205:7): [True: 0, False: 2.82k]
  ------------------
  206|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  207|      0|  }
  208|  2.82k|  if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (208:7): [True: 2.82k, False: 0]
  ------------------
  209|  2.82k|    setLength(newLength);
  210|  2.82k|  } else {
  211|      0|    setToBogus();
  212|      0|  }
  213|  2.82k|  return *this;
  214|  2.82k|}

_ZN6icu_7813UnicodeString7toLowerERKNS_6LocaleE:
   39|  90.0k|UnicodeString::toLower(const Locale &locale) {
   40|  90.0k|  return caseMap(ustrcase_getCaseLocale(locale.getBaseName()), 0,
  ------------------
  |  | 1881|  90.0k|#define ustrcase_getCaseLocale U_ICU_ENTRY_POINT_RENAME(ustrcase_getCaseLocale)
  |  |  ------------------
  |  |  |  |  123|  90.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  90.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  90.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   41|  90.0k|                 UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToLower);
  ------------------
  |  |  132|  90.0k|#   define UCASEMAP_BREAK_ITERATOR_NULL NULL,
  ------------------
                               UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToLower);
  ------------------
  |  | 1884|  90.0k|#define ustrcase_internalToLower U_ICU_ENTRY_POINT_RENAME(ustrcase_internalToLower)
  |  |  ------------------
  |  |  |  |  123|  90.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  90.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  90.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   42|  90.0k|}

_ZN6icu_787UMemorynwEm:
   61|  16.9M|void * U_EXPORT2 UMemory::operator new(size_t size) noexcept {
   62|  16.9M|    return uprv_malloc(size);
  ------------------
  |  | 1524|  16.9M|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  16.9M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  16.9M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  16.9M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   63|  16.9M|}
_ZN6icu_787UMemorydlEPv:
   65|  16.9M|void U_EXPORT2 UMemory::operator delete(void *p) noexcept {
   66|  16.9M|    if(p!=nullptr) {
  ------------------
  |  Branch (66:8): [True: 16.9M, False: 0]
  ------------------
   67|  16.9M|        uprv_free(p);
  ------------------
  |  | 1503|  16.9M|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  16.9M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  16.9M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  16.9M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   68|  16.9M|    }
   69|  16.9M|}
_ZN6icu_787UMemorynaEm:
   71|  2.09M|void * U_EXPORT2 UMemory::operator new[](size_t size) noexcept {
   72|  2.09M|    return uprv_malloc(size);
  ------------------
  |  | 1524|  2.09M|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  2.09M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.09M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.09M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   73|  2.09M|}
_ZN6icu_787UMemorydaEPv:
   75|  2.09M|void U_EXPORT2 UMemory::operator delete[](void *p) noexcept {
   76|  2.09M|    if(p!=nullptr) {
  ------------------
  |  Branch (76:8): [True: 2.09M, False: 0]
  ------------------
   77|  2.09M|        uprv_free(p);
  ------------------
  |  | 1503|  2.09M|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  2.09M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.09M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.09M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   78|  2.09M|    }
   79|  2.09M|}
_ZN6icu_787UObjectD2Ev:
   94|   313M|UObject::~UObject() {}
uprv_deleteUObject_78:
  103|  13.5M|uprv_deleteUObject(void *obj) {
  104|  13.5M|    delete static_cast<UObject *>(obj);
  105|  13.5M|}

uprops_getSource_78:
  791|      2|uprops_getSource(UProperty which) {
  792|      2|    if(which<UCHAR_BINARY_START) {
  ------------------
  |  Branch (792:8): [True: 0, False: 2]
  ------------------
  793|      0|        return UPROPS_SRC_NONE; /* undefined */
  794|      2|    } else if(which<UCHAR_BINARY_LIMIT) {
  ------------------
  |  Branch (794:15): [True: 0, False: 2]
  ------------------
  795|      0|        const BinaryProperty &prop=binProps[which];
  796|      0|        if(prop.mask!=0) {
  ------------------
  |  Branch (796:12): [True: 0, False: 0]
  ------------------
  797|      0|            return UPROPS_SRC_PROPSVEC;
  798|      0|        } else {
  799|      0|            return (UPropertySource)prop.column;
  800|      0|        }
  801|      2|    } else if(which<UCHAR_INT_START) {
  ------------------
  |  Branch (801:15): [True: 0, False: 2]
  ------------------
  802|      0|        return UPROPS_SRC_NONE; /* undefined */
  803|      2|    } else if(which<UCHAR_INT_LIMIT) {
  ------------------
  |  Branch (803:15): [True: 0, False: 2]
  ------------------
  804|      0|        const IntProperty &prop=intProps[which-UCHAR_INT_START];
  805|      0|        if(prop.mask!=0) {
  ------------------
  |  Branch (805:12): [True: 0, False: 0]
  ------------------
  806|      0|            return UPROPS_SRC_PROPSVEC;
  807|      0|        } else {
  808|      0|            return (UPropertySource)prop.column;
  809|      0|        }
  810|      2|    } else if(which<UCHAR_STRING_START) {
  ------------------
  |  Branch (810:15): [True: 2, False: 0]
  ------------------
  811|      2|        switch(which) {
  812|      2|        case UCHAR_GENERAL_CATEGORY_MASK:
  ------------------
  |  Branch (812:9): [True: 2, False: 0]
  ------------------
  813|      2|        case UCHAR_NUMERIC_VALUE:
  ------------------
  |  Branch (813:9): [True: 0, False: 2]
  ------------------
  814|      2|            return UPROPS_SRC_CHAR;
  815|       |
  816|      0|        default:
  ------------------
  |  Branch (816:9): [True: 0, False: 2]
  ------------------
  817|      0|            return UPROPS_SRC_NONE;
  818|      2|        }
  819|      2|    } else if(which<UCHAR_STRING_LIMIT) {
  ------------------
  |  Branch (819:15): [True: 0, False: 0]
  ------------------
  820|      0|        switch(which) {
  821|      0|        case UCHAR_AGE:
  ------------------
  |  Branch (821:9): [True: 0, False: 0]
  ------------------
  822|      0|            return UPROPS_SRC_PROPSVEC;
  823|       |
  824|      0|        case UCHAR_BIDI_MIRRORING_GLYPH:
  ------------------
  |  Branch (824:9): [True: 0, False: 0]
  ------------------
  825|      0|            return UPROPS_SRC_BIDI;
  826|       |
  827|      0|        case UCHAR_CASE_FOLDING:
  ------------------
  |  Branch (827:9): [True: 0, False: 0]
  ------------------
  828|      0|        case UCHAR_LOWERCASE_MAPPING:
  ------------------
  |  Branch (828:9): [True: 0, False: 0]
  ------------------
  829|      0|        case UCHAR_SIMPLE_CASE_FOLDING:
  ------------------
  |  Branch (829:9): [True: 0, False: 0]
  ------------------
  830|      0|        case UCHAR_SIMPLE_LOWERCASE_MAPPING:
  ------------------
  |  Branch (830:9): [True: 0, False: 0]
  ------------------
  831|      0|        case UCHAR_SIMPLE_TITLECASE_MAPPING:
  ------------------
  |  Branch (831:9): [True: 0, False: 0]
  ------------------
  832|      0|        case UCHAR_SIMPLE_UPPERCASE_MAPPING:
  ------------------
  |  Branch (832:9): [True: 0, False: 0]
  ------------------
  833|      0|        case UCHAR_TITLECASE_MAPPING:
  ------------------
  |  Branch (833:9): [True: 0, False: 0]
  ------------------
  834|      0|        case UCHAR_UPPERCASE_MAPPING:
  ------------------
  |  Branch (834:9): [True: 0, False: 0]
  ------------------
  835|      0|            return UPROPS_SRC_CASE;
  836|       |
  837|      0|        case UCHAR_ISO_COMMENT:
  ------------------
  |  Branch (837:9): [True: 0, False: 0]
  ------------------
  838|      0|        case UCHAR_NAME:
  ------------------
  |  Branch (838:9): [True: 0, False: 0]
  ------------------
  839|      0|        case UCHAR_UNICODE_1_NAME:
  ------------------
  |  Branch (839:9): [True: 0, False: 0]
  ------------------
  840|      0|            return UPROPS_SRC_NAMES;
  841|       |
  842|      0|        default:
  ------------------
  |  Branch (842:9): [True: 0, False: 0]
  ------------------
  843|      0|            return UPROPS_SRC_NONE;
  844|      0|        }
  845|      0|    } else {
  846|      0|        switch(which) {
  847|      0|        case UCHAR_SCRIPT_EXTENSIONS:
  ------------------
  |  Branch (847:9): [True: 0, False: 0]
  ------------------
  848|      0|        case UCHAR_IDENTIFIER_TYPE:
  ------------------
  |  Branch (848:9): [True: 0, False: 0]
  ------------------
  849|      0|            return UPROPS_SRC_PROPSVEC;
  850|      0|        default:
  ------------------
  |  Branch (850:9): [True: 0, False: 0]
  ------------------
  851|      0|            return UPROPS_SRC_NONE; /* undefined */
  852|      0|        }
  853|      0|    }
  854|      2|}

ures_initStackObject_78:
  726|   582k|U_CFUNC void ures_initStackObject(UResourceBundle* resB) {
  727|   582k|  uprv_memset(resB, 0, sizeof(UResourceBundle));
  ------------------
  |  |  100|   582k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|   582k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  728|   582k|  ures_setIsStackObject(resB, true);
  729|   582k|}
_ZN6icu_7820StackUResourceBundleC2Ev:
  733|   396k|StackUResourceBundle::StackUResourceBundle() {
  734|   396k|    ures_initStackObject(&bundle);
  ------------------
  |  | 1690|   396k|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|   396k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   396k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   396k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  735|   396k|}
_ZN6icu_7820StackUResourceBundleD2Ev:
  737|   396k|StackUResourceBundle::~StackUResourceBundle() {
  738|   396k|    ures_close(&bundle);
  ------------------
  |  | 1652|   396k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|   396k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   396k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   396k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  739|   396k|}
ures_close_78:
 1147|  2.19M|{
 1148|  2.19M|    ures_closeBundle(resB, true);
 1149|  2.19M|}
ures_getString_78:
 1524|   213k|U_CAPI const char16_t* U_EXPORT2 ures_getString(const UResourceBundle* resB, int32_t* len, UErrorCode* status) {
 1525|   213k|    const char16_t *s;
 1526|   213k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1526:9): [True: 0, False: 213k]
  |  Branch (1526:28): [True: 0, False: 213k]
  ------------------
 1527|      0|        return nullptr;
 1528|      0|    }
 1529|   213k|    if(resB == nullptr) {
  ------------------
  |  Branch (1529:8): [True: 0, False: 213k]
  ------------------
 1530|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1531|      0|        return nullptr;
 1532|      0|    }
 1533|   213k|    s = res_getString({resB}, &resB->getResData(), resB->fRes, len);
 1534|   213k|    if (s == nullptr) {
  ------------------
  |  Branch (1534:9): [True: 0, False: 213k]
  ------------------
 1535|      0|        *status = U_RESOURCE_TYPE_MISMATCH;
 1536|      0|    }
 1537|   213k|    return s;
 1538|   213k|}
ures_getIntVector_78:
 1630|     17|                                                   UErrorCode*               status) {
 1631|     17|  const int32_t *p;
 1632|     17|  if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1632:7): [True: 0, False: 17]
  |  Branch (1632:26): [True: 3, False: 14]
  ------------------
 1633|      3|    return nullptr;
 1634|      3|  }
 1635|     14|  if(resB == nullptr) {
  ------------------
  |  Branch (1635:6): [True: 0, False: 14]
  ------------------
 1636|      0|    *status = U_ILLEGAL_ARGUMENT_ERROR;
 1637|      0|    return nullptr;
 1638|      0|  }
 1639|     14|  p = res_getIntVector({resB}, &resB->getResData(), resB->fRes, len);
 1640|     14|  if (p == nullptr) {
  ------------------
  |  Branch (1640:7): [True: 0, False: 14]
  ------------------
 1641|      0|    *status = U_RESOURCE_TYPE_MISMATCH;
 1642|      0|  }
 1643|     14|  return p;
 1644|     14|}
ures_getInt_78:
 1648|  88.9k|U_CAPI int32_t U_EXPORT2 ures_getInt(const UResourceBundle* resB, UErrorCode *status) {
 1649|  88.9k|  if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1649:7): [True: 0, False: 88.9k]
  |  Branch (1649:26): [True: 2, False: 88.9k]
  ------------------
 1650|      2|    return 0xffffffff;
 1651|      2|  }
 1652|  88.9k|  if(resB == nullptr) {
  ------------------
  |  Branch (1652:6): [True: 0, False: 88.9k]
  ------------------
 1653|      0|    *status = U_ILLEGAL_ARGUMENT_ERROR;
 1654|      0|    return 0xffffffff;
 1655|      0|  }
 1656|  88.9k|  if(RES_GET_TYPE(resB->fRes) != URES_INT) {
  ------------------
  |  |   68|  88.9k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (1656:6): [True: 0, False: 88.9k]
  ------------------
 1657|      0|    *status = U_RESOURCE_TYPE_MISMATCH;
 1658|      0|    return 0xffffffff;
 1659|      0|  }
 1660|  88.9k|  return res_getInt({resB}, resB->fRes);
 1661|  88.9k|}
ures_getType_78:
 1678|  37.6k|U_CAPI UResType U_EXPORT2 ures_getType(const UResourceBundle *resB) {
 1679|  37.6k|  if(resB == nullptr) {
  ------------------
  |  Branch (1679:6): [True: 0, False: 37.6k]
  ------------------
 1680|      0|    return URES_NONE;
 1681|      0|  }
 1682|  37.6k|  return res_getPublicType(resB->fRes);
  ------------------
  |  |  203|  37.6k|#define res_getPublicType U_ICU_ENTRY_POINT_RENAME(res_getPublicType)
  |  |  ------------------
  |  |  |  |  123|  37.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  37.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  37.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1683|  37.6k|}
ures_getKey_78:
 1685|     10|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|     10|  if(resB == nullptr) {
  ------------------
  |  Branch (1695:6): [True: 0, False: 10]
  ------------------
 1696|      0|    return nullptr;
 1697|      0|  }
 1698|     10|  return(resB->fKey);
 1699|     10|}
ures_getSize_78:
 1701|   133k|U_CAPI int32_t U_EXPORT2 ures_getSize(const UResourceBundle *resB) {
 1702|   133k|  if(resB == nullptr) {
  ------------------
  |  Branch (1702:6): [True: 0, False: 133k]
  ------------------
 1703|      0|    return 0;
 1704|      0|  }
 1705|       |  
 1706|   133k|  return resB->fSize;
 1707|   133k|}
ures_hasNext_78:
 1728|  84.8k|U_CAPI UBool U_EXPORT2 ures_hasNext(const UResourceBundle *resB) {
 1729|  84.8k|  if(resB == nullptr) {
  ------------------
  |  Branch (1729:6): [True: 0, False: 84.8k]
  ------------------
 1730|      0|    return false;
 1731|      0|  }
 1732|  84.8k|  return resB->fIndex < resB->fSize-1;
 1733|  84.8k|}
ures_getNextString_78:
 1735|   148k|U_CAPI const char16_t* U_EXPORT2 ures_getNextString(UResourceBundle *resB, int32_t* len, const char ** key, UErrorCode *status) {
 1736|   148k|  Resource r = RES_BOGUS;
  ------------------
  |  |   65|   148k|#define RES_BOGUS 0xffffffff
  ------------------
 1737|       |  
 1738|   148k|  if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1738:7): [True: 0, False: 148k]
  |  Branch (1738:26): [True: 0, False: 148k]
  ------------------
 1739|      0|    return nullptr;
 1740|      0|  }
 1741|   148k|  if(resB == nullptr) {
  ------------------
  |  Branch (1741:6): [True: 0, False: 148k]
  ------------------
 1742|      0|    *status = U_ILLEGAL_ARGUMENT_ERROR;
 1743|      0|    return nullptr;
 1744|      0|  }
 1745|       |  
 1746|   148k|  if(resB->fIndex == resB->fSize-1) {
  ------------------
  |  Branch (1746:6): [True: 0, False: 148k]
  ------------------
 1747|      0|    *status = U_INDEX_OUTOFBOUNDS_ERROR;
 1748|   148k|  } else {
 1749|   148k|    resB->fIndex++;
 1750|   148k|    switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|   148k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1751|      0|    case URES_STRING:
  ------------------
  |  Branch (1751:5): [True: 0, False: 148k]
  ------------------
 1752|      0|    case URES_STRING_V2:
  ------------------
  |  Branch (1752:5): [True: 0, False: 148k]
  ------------------
 1753|      0|      return res_getString({resB}, &resB->getResData(), resB->fRes, len);
 1754|      0|    case URES_TABLE:
  ------------------
  |  Branch (1754:5): [True: 0, False: 148k]
  ------------------
 1755|  84.8k|    case URES_TABLE16:
  ------------------
  |  Branch (1755:5): [True: 84.8k, False: 63.6k]
  ------------------
 1756|  84.8k|    case URES_TABLE32:
  ------------------
  |  Branch (1756:5): [True: 0, False: 148k]
  ------------------
 1757|  84.8k|      r = res_getTableItemByIndex(&resB->getResData(), resB->fRes, resB->fIndex, key);
  ------------------
  |  |  206|  84.8k|#define res_getTableItemByIndex U_ICU_ENTRY_POINT_RENAME(res_getTableItemByIndex)
  |  |  ------------------
  |  |  |  |  123|  84.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  84.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  84.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1758|  84.8k|      if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|   169k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1758:10): [True: 0, False: 84.8k]
  |  Branch (1758:28): [True: 0, False: 0]
  ------------------
 1759|       |        /* TODO: do the fallback */
 1760|      0|      }
 1761|  84.8k|      return ures_getStringWithAlias(resB, r, resB->fIndex, len, status);
 1762|      0|    case URES_ARRAY:
  ------------------
  |  Branch (1762:5): [True: 0, False: 148k]
  ------------------
 1763|  63.6k|    case URES_ARRAY16:
  ------------------
  |  Branch (1763:5): [True: 63.6k, False: 84.8k]
  ------------------
 1764|  63.6k|      r = res_getArrayItem(&resB->getResData(), resB->fRes, resB->fIndex);
  ------------------
  |  |  200|  63.6k|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|  63.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  63.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  63.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1765|  63.6k|      if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|   127k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1765:10): [True: 0, False: 63.6k]
  |  Branch (1765:28): [True: 0, False: 0]
  ------------------
 1766|       |        /* TODO: do the fallback */
 1767|      0|      }
 1768|  63.6k|      return ures_getStringWithAlias(resB, r, resB->fIndex, len, status);
 1769|      0|    case URES_ALIAS:
  ------------------
  |  Branch (1769:5): [True: 0, False: 148k]
  ------------------
 1770|      0|      return ures_getStringWithAlias(resB, resB->fRes, resB->fIndex, len, status);
 1771|      0|    case URES_INT:
  ------------------
  |  Branch (1771:5): [True: 0, False: 148k]
  ------------------
 1772|      0|    case URES_BINARY:
  ------------------
  |  Branch (1772:5): [True: 0, False: 148k]
  ------------------
 1773|      0|    case URES_INT_VECTOR:
  ------------------
  |  Branch (1773:5): [True: 0, False: 148k]
  ------------------
 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: 148k]
  ------------------
 1777|      0|      return nullptr;
 1778|   148k|    }
 1779|   148k|  }
 1780|       |
 1781|      0|  return nullptr;
 1782|   148k|}
ures_getNextResource_78:
 1784|     12|U_CAPI UResourceBundle* U_EXPORT2 ures_getNextResource(UResourceBundle *resB, UResourceBundle *fillIn, UErrorCode *status) {
 1785|     12|    const char *key = nullptr;
 1786|     12|    Resource r = RES_BOGUS;
  ------------------
  |  |   65|     12|#define RES_BOGUS 0xffffffff
  ------------------
 1787|       |
 1788|     12|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1788:9): [True: 0, False: 12]
  |  Branch (1788:28): [True: 0, False: 12]
  ------------------
 1789|       |            /*return nullptr;*/
 1790|      0|            return fillIn;
 1791|      0|    }
 1792|     12|    if(resB == nullptr) {
  ------------------
  |  Branch (1792:8): [True: 0, False: 12]
  ------------------
 1793|      0|            *status = U_ILLEGAL_ARGUMENT_ERROR;
 1794|       |            /*return nullptr;*/
 1795|      0|            return fillIn;
 1796|      0|    }
 1797|       |
 1798|     12|    if(resB->fIndex == resB->fSize-1) {
  ------------------
  |  Branch (1798:8): [True: 2, False: 10]
  ------------------
 1799|      2|      *status = U_INDEX_OUTOFBOUNDS_ERROR;
 1800|       |      /*return nullptr;*/
 1801|     10|    } else {
 1802|     10|        resB->fIndex++;
 1803|     10|        switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|     10|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1804|      0|        case URES_INT:
  ------------------
  |  Branch (1804:9): [True: 0, False: 10]
  ------------------
 1805|      0|        case URES_BINARY:
  ------------------
  |  Branch (1805:9): [True: 0, False: 10]
  ------------------
 1806|      0|        case URES_STRING:
  ------------------
  |  Branch (1806:9): [True: 0, False: 10]
  ------------------
 1807|      0|        case URES_STRING_V2:
  ------------------
  |  Branch (1807:9): [True: 0, False: 10]
  ------------------
 1808|      0|        case URES_INT_VECTOR:
  ------------------
  |  Branch (1808:9): [True: 0, False: 10]
  ------------------
 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|     10|        case URES_TABLE:
  ------------------
  |  Branch (1810:9): [True: 10, False: 0]
  ------------------
 1811|     10|        case URES_TABLE16:
  ------------------
  |  Branch (1811:9): [True: 0, False: 10]
  ------------------
 1812|     10|        case URES_TABLE32:
  ------------------
  |  Branch (1812:9): [True: 0, False: 10]
  ------------------
 1813|     10|            r = res_getTableItemByIndex(&resB->getResData(), resB->fRes, resB->fIndex, &key);
  ------------------
  |  |  206|     10|#define res_getTableItemByIndex U_ICU_ENTRY_POINT_RENAME(res_getTableItemByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1814|     10|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|     20|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1814:16): [True: 0, False: 10]
  |  Branch (1814:34): [True: 0, False: 0]
  ------------------
 1815|       |                /* TODO: do the fallback */
 1816|      0|            }
 1817|     10|            return init_resb_result(resB->fData, r, key, resB->fIndex, resB, fillIn, status);
 1818|      0|        case URES_ARRAY:
  ------------------
  |  Branch (1818:9): [True: 0, False: 10]
  ------------------
 1819|      0|        case URES_ARRAY16:
  ------------------
  |  Branch (1819:9): [True: 0, False: 10]
  ------------------
 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: 10]
  ------------------
 1826|       |            /*return nullptr;*/
 1827|      0|            return fillIn;
 1828|     10|        }
 1829|     10|    }
 1830|       |    /*return nullptr;*/
 1831|      2|    return fillIn;
 1832|     12|}
ures_getByIndex_78:
 1834|  80.0k|U_CAPI UResourceBundle* U_EXPORT2 ures_getByIndex(const UResourceBundle *resB, int32_t indexR, UResourceBundle *fillIn, UErrorCode *status) {
 1835|  80.0k|    const char* key = nullptr;
 1836|  80.0k|    Resource r = RES_BOGUS;
  ------------------
  |  |   65|  80.0k|#define RES_BOGUS 0xffffffff
  ------------------
 1837|       |
 1838|  80.0k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1838:9): [True: 0, False: 80.0k]
  |  Branch (1838:28): [True: 0, False: 80.0k]
  ------------------
 1839|       |        /*return nullptr;*/
 1840|      0|        return fillIn;
 1841|      0|    }
 1842|  80.0k|    if(resB == nullptr) {
  ------------------
  |  Branch (1842:8): [True: 0, False: 80.0k]
  ------------------
 1843|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1844|       |        /*return nullptr;*/
 1845|      0|        return fillIn;
 1846|      0|    }
 1847|       |
 1848|  80.0k|    if(indexR >= 0 && resB->fSize > indexR) {
  ------------------
  |  Branch (1848:8): [True: 80.0k, False: 0]
  |  Branch (1848:23): [True: 80.0k, False: 0]
  ------------------
 1849|  80.0k|        switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|  80.0k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1850|      0|        case URES_INT:
  ------------------
  |  Branch (1850:9): [True: 0, False: 80.0k]
  ------------------
 1851|      0|        case URES_BINARY:
  ------------------
  |  Branch (1851:9): [True: 0, False: 80.0k]
  ------------------
 1852|      0|        case URES_STRING:
  ------------------
  |  Branch (1852:9): [True: 0, False: 80.0k]
  ------------------
 1853|      0|        case URES_STRING_V2:
  ------------------
  |  Branch (1853:9): [True: 0, False: 80.0k]
  ------------------
 1854|      0|        case URES_INT_VECTOR:
  ------------------
  |  Branch (1854:9): [True: 0, False: 80.0k]
  ------------------
 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: 80.0k]
  ------------------
 1857|      0|        case URES_TABLE16:
  ------------------
  |  Branch (1857:9): [True: 0, False: 80.0k]
  ------------------
 1858|      0|        case URES_TABLE32:
  ------------------
  |  Branch (1858:9): [True: 0, False: 80.0k]
  ------------------
 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|  44.4k|        case URES_ARRAY:
  ------------------
  |  Branch (1864:9): [True: 44.4k, False: 35.5k]
  ------------------
 1865|  80.0k|        case URES_ARRAY16:
  ------------------
  |  Branch (1865:9): [True: 35.5k, False: 44.4k]
  ------------------
 1866|  80.0k|            r = res_getArrayItem(&resB->getResData(), resB->fRes, indexR);
  ------------------
  |  |  200|  80.0k|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|  80.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  80.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  80.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1867|  80.0k|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|   160k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1867:16): [True: 0, False: 80.0k]
  |  Branch (1867:34): [True: 0, False: 0]
  ------------------
 1868|       |                /* TODO: do the fallback */
 1869|      0|            }
 1870|  80.0k|            return init_resb_result(resB->fData, r, key, indexR, resB, fillIn, status);
 1871|      0|        default:
  ------------------
  |  Branch (1871:9): [True: 0, False: 80.0k]
  ------------------
 1872|       |            /*return nullptr;*/
 1873|      0|            return fillIn;
 1874|  80.0k|        }
 1875|  80.0k|    } else {
 1876|      0|        *status = U_MISSING_RESOURCE_ERROR;
 1877|      0|    }
 1878|       |    /*return nullptr;*/
 1879|      0|    return fillIn;
 1880|  80.0k|}
ures_getStringByIndex_78:
 1882|  52.6k|U_CAPI const char16_t* U_EXPORT2 ures_getStringByIndex(const UResourceBundle *resB, int32_t indexS, int32_t* len, UErrorCode *status) {
 1883|  52.6k|    const char* key = nullptr;
 1884|  52.6k|    Resource r = RES_BOGUS;
  ------------------
  |  |   65|  52.6k|#define RES_BOGUS 0xffffffff
  ------------------
 1885|       |
 1886|  52.6k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1886:9): [True: 0, False: 52.6k]
  |  Branch (1886:28): [True: 0, False: 52.6k]
  ------------------
 1887|      0|        return nullptr;
 1888|      0|    }
 1889|  52.6k|    if(resB == nullptr) {
  ------------------
  |  Branch (1889:8): [True: 0, False: 52.6k]
  ------------------
 1890|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1891|      0|        return nullptr;
 1892|      0|    }
 1893|       |
 1894|  52.6k|    if(indexS >= 0 && resB->fSize > indexS) {
  ------------------
  |  Branch (1894:8): [True: 52.6k, False: 0]
  |  Branch (1894:23): [True: 52.6k, False: 0]
  ------------------
 1895|  52.6k|        switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|  52.6k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1896|      0|        case URES_STRING:
  ------------------
  |  Branch (1896:9): [True: 0, False: 52.6k]
  ------------------
 1897|      0|        case URES_STRING_V2:
  ------------------
  |  Branch (1897:9): [True: 0, False: 52.6k]
  ------------------
 1898|      0|            return res_getString({resB}, &resB->getResData(), resB->fRes, len);
 1899|      0|        case URES_TABLE:
  ------------------
  |  Branch (1899:9): [True: 0, False: 52.6k]
  ------------------
 1900|      0|        case URES_TABLE16:
  ------------------
  |  Branch (1900:9): [True: 0, False: 52.6k]
  ------------------
 1901|      0|        case URES_TABLE32:
  ------------------
  |  Branch (1901:9): [True: 0, False: 52.6k]
  ------------------
 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|      0|        case URES_ARRAY:
  ------------------
  |  Branch (1907:9): [True: 0, False: 52.6k]
  ------------------
 1908|  52.6k|        case URES_ARRAY16:
  ------------------
  |  Branch (1908:9): [True: 52.6k, False: 0]
  ------------------
 1909|  52.6k|            r = res_getArrayItem(&resB->getResData(), resB->fRes, indexS);
  ------------------
  |  |  200|  52.6k|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|  52.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  52.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  52.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1910|  52.6k|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|   105k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1910:16): [True: 0, False: 52.6k]
  |  Branch (1910:34): [True: 0, False: 0]
  ------------------
 1911|       |                /* TODO: do the fallback */
 1912|      0|            }
 1913|  52.6k|            return ures_getStringWithAlias(resB, r, indexS, len, status);
 1914|      0|        case URES_ALIAS:
  ------------------
  |  Branch (1914:9): [True: 0, False: 52.6k]
  ------------------
 1915|      0|            return ures_getStringWithAlias(resB, resB->fRes, indexS, len, status);
 1916|      0|        case URES_INT:
  ------------------
  |  Branch (1916:9): [True: 0, False: 52.6k]
  ------------------
 1917|      0|        case URES_BINARY:
  ------------------
  |  Branch (1917:9): [True: 0, False: 52.6k]
  ------------------
 1918|      0|        case URES_INT_VECTOR:
  ------------------
  |  Branch (1918:9): [True: 0, False: 52.6k]
  ------------------
 1919|      0|            *status = U_RESOURCE_TYPE_MISMATCH;
 1920|      0|            break;
 1921|      0|        default:
  ------------------
  |  Branch (1921:9): [True: 0, False: 52.6k]
  ------------------
 1922|       |          /* must not occur */
 1923|      0|          *status = U_INTERNAL_PROGRAM_ERROR;
 1924|      0|          break;
 1925|  52.6k|        }
 1926|  52.6k|    } else {
 1927|      0|        *status = U_MISSING_RESOURCE_ERROR;
 1928|      0|    }
 1929|      0|    return nullptr;
 1930|  52.6k|}
ures_getStringByKeyWithFallback_78:
 2033|   178k|                                UErrorCode *status) {
 2034|       |
 2035|   178k|    UResourceBundle stack;
 2036|   178k|    const char16_t* retVal = nullptr;
 2037|   178k|    ures_initStackObject(&stack);
  ------------------
  |  | 1690|   178k|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|   178k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   178k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   178k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2038|   178k|    ures_getByKeyWithFallback(resB, inKey, &stack, status);
  ------------------
  |  | 1662|   178k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|   178k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   178k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   178k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2039|   178k|    int32_t length;
 2040|   178k|    retVal = ures_getString(&stack, &length, status);
  ------------------
  |  | 1675|   178k|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|   178k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   178k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   178k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2041|   178k|    ures_close(&stack);
  ------------------
  |  | 1652|   178k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|   178k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   178k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   178k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2042|   178k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (2042:9): [True: 0, False: 178k]
  ------------------
 2043|      0|        return nullptr;
 2044|      0|    }
 2045|   178k|    if (length == 3 && retVal[0] == EMPTY_SET && retVal[1] == EMPTY_SET && retVal[2] == EMPTY_SET ) {
  ------------------
  |  |   35|   178k|#define EMPTY_SET 0x2205
  ------------------
                  if (length == 3 && retVal[0] == EMPTY_SET && retVal[1] == EMPTY_SET && retVal[2] == EMPTY_SET ) {
  ------------------
  |  |   35|   178k|#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: 178k]
  |  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|   178k|    if (len != nullptr) {
  ------------------
  |  Branch (2050:9): [True: 121k, False: 56.1k]
  ------------------
 2051|   121k|        *len = length;
 2052|   121k|    }
 2053|   178k|    return retVal;
 2054|   178k|}
ures_getByKeyWithFallback_78:
 2164|   634k|                          UErrorCode *status) {
 2165|   634k|    Resource res = RES_BOGUS, rootRes = RES_BOGUS;
  ------------------
  |  |   65|   634k|#define RES_BOGUS 0xffffffff
  ------------------
                  Resource res = RES_BOGUS, rootRes = RES_BOGUS;
  ------------------
  |  |   65|   634k|#define RES_BOGUS 0xffffffff
  ------------------
 2166|   634k|    UResourceBundle *helper = nullptr;
 2167|       |
 2168|   634k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2168:9): [True: 0, False: 634k]
  |  Branch (2168:28): [True: 0, False: 634k]
  ------------------
 2169|      0|        return fillIn;
 2170|      0|    }
 2171|   634k|    if(resB == nullptr) {
  ------------------
  |  Branch (2171:8): [True: 0, False: 634k]
  ------------------
 2172|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2173|      0|        return fillIn;
 2174|      0|    }
 2175|       |
 2176|   634k|    int32_t type = RES_GET_TYPE(resB->fRes);
  ------------------
  |  |   68|   634k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2177|   634k|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|   634k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 634k, False: 0]
  |  |  |  Branch (84:61): [True: 0, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2178|   634k|        const char* origResPath = resB->fResPath;
 2179|   634k|        int32_t origResPathLen = resB->fResPathLen;
 2180|   634k|        res = getTableItemByKeyPath(&resB->getResData(), resB->fRes, inKey);
 2181|   634k|        const char* key = inKey;
 2182|   634k|        bool didRootOnce = false;
 2183|   634k|        if(res == RES_BOGUS) {
  ------------------
  |  |   65|   634k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2183:12): [True: 216k, False: 417k]
  ------------------
 2184|   216k|            UResourceDataEntry *dataEntry = resB->fData;
 2185|   216k|            CharString path;
 2186|   216k|            char *myPath = nullptr;
 2187|   216k|            const char* resPath = resB->fResPath;
 2188|   216k|            int32_t len = resB->fResPathLen;
 2189|   662k|            while(res == RES_BOGUS && (dataEntry->fParent != nullptr || !didRootOnce)) { /* Otherwise, we'll look in parents */
  ------------------
  |  |   65|  1.32M|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2189:19): [True: 445k, False: 216k]
  |  Branch (2189:40): [True: 445k, False: 0]
  |  Branch (2189:73): [True: 0, False: 0]
  ------------------
 2190|   445k|                if (dataEntry->fParent != nullptr) {
  ------------------
  |  Branch (2190:21): [True: 445k, False: 0]
  ------------------
 2191|   445k|                    dataEntry = dataEntry->fParent;
 2192|   445k|                } 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|      0|                    didRootOnce = true;
 2199|      0|                }
 2200|   445k|                rootRes = dataEntry->fData.rootRes;
 2201|       |
 2202|   445k|                if(dataEntry->fBogus == U_ZERO_ERROR) {
  ------------------
  |  Branch (2202:20): [True: 445k, False: 0]
  ------------------
 2203|   445k|                    createPath(origResPath, origResPathLen, resPath, len, inKey, path, status);
 2204|   445k|                    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (2204:25): [True: 0, False: 445k]
  ------------------
 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|   445k|                    myPath = path.data();
 2209|   445k|                    key = inKey;
 2210|   445k|                    do {
 2211|   445k|                        res = res_findResource(&(dataEntry->fData), rootRes, &myPath, &key);
  ------------------
  |  |  198|   445k|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|   445k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   445k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   445k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2212|   445k|                        if (RES_GET_TYPE(res) == URES_ALIAS && *myPath) {
  ------------------
  |  |   68|   445k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (2212:29): [True: 0, False: 445k]
  |  Branch (2212:64): [True: 0, False: 0]
  ------------------
 2213|       |                            /* We hit an alias, but we didn't finish following the path. */
 2214|      0|                            helper = init_resb_result(dataEntry, res, nullptr, -1, resB, helper, status);
 2215|       |                            /*helper = init_resb_result(dataEntry, res, inKey, -1, resB, helper, status);*/
 2216|      0|                            if(helper) {
  ------------------
  |  Branch (2216:32): [True: 0, False: 0]
  ------------------
 2217|      0|                              dataEntry = helper->fData;
 2218|      0|                              rootRes = helper->fRes;
 2219|      0|                              resPath = helper->fResPath;
 2220|      0|                              len = helper->fResPathLen;
 2221|       |
 2222|      0|                            } else {
 2223|      0|                              break;
 2224|      0|                            }
 2225|   445k|                        } else if (res == RES_BOGUS) {
  ------------------
  |  |   65|   445k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2225:36): [True: 228k, False: 216k]
  ------------------
 2226|   228k|                            break;
 2227|   228k|                        }
 2228|   445k|                    } while(*myPath); /* Continue until the whole path is consumed */
  ------------------
  |  Branch (2228:29): [True: 0, False: 216k]
  ------------------
 2229|   445k|                }
 2230|   445k|            }
 2231|       |            /*dataEntry = getFallbackData(resB, &key, &res, status);*/
 2232|   216k|            if(res != RES_BOGUS) {
  ------------------
  |  |   65|   216k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2232:16): [True: 216k, False: 0]
  ------------------
 2233|       |              /* check if resB->fResPath gives the right name here */
 2234|   216k|                if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|   216k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   216k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                              if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|   216k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   216k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (2234:20): [True: 0, False: 216k]
  |  Branch (2234:75): [True: 145k, False: 71.8k]
  ------------------
 2235|   145k|                    *status = U_USING_DEFAULT_WARNING;
 2236|   145k|                } else {
 2237|  71.8k|                    *status = U_USING_FALLBACK_WARNING;
 2238|  71.8k|                }
 2239|       |
 2240|   216k|                fillIn = init_resb_result(dataEntry, res, key, -1, resB, fillIn, status);
 2241|   216k|                if (resPath != nullptr) {
  ------------------
  |  Branch (2241:21): [True: 44.4k, False: 172k]
  ------------------
 2242|  44.4k|                    createPath(origResPath, origResPathLen, resPath, len, inKey, path, status);
 2243|   172k|                } else {
 2244|   172k|                    const char* separator = nullptr;
 2245|   172k|                    if (fillIn->fResPath != nullptr) {
  ------------------
  |  Branch (2245:25): [True: 172k, False: 0]
  ------------------
 2246|   172k|                        separator = uprv_strchr(fillIn->fResPath, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|   172k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   172k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2247|   172k|                    }
 2248|   172k|                    if (separator != nullptr && separator[1] != '\0') {
  ------------------
  |  Branch (2248:25): [True: 172k, False: 0]
  |  Branch (2248:49): [True: 0, False: 172k]
  ------------------
 2249|      0|                        createPath(origResPath, origResPathLen, fillIn->fResPath,
 2250|      0|                                   static_cast<int32_t>(uprv_strlen(fillIn->fResPath)), inKey, path, status);
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2251|   172k|                    } else {
 2252|   172k|                        createPath(origResPath, origResPathLen, "", 0, inKey, path, status);
 2253|   172k|                    }
 2254|   172k|                }
 2255|   216k|                ures_freeResPath(fillIn);
 2256|   216k|                ures_appendResPath(fillIn, path.data(), path.length(), status);
 2257|   216k|                if(fillIn->fResPath[fillIn->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   216k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2257:20): [True: 172k, False: 44.4k]
  ------------------
 2258|   172k|                    ures_appendResPath(fillIn, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|   172k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 2259|   172k|                }
 2260|   216k|            } else {
 2261|      0|                *status = U_MISSING_RESOURCE_ERROR;
 2262|      0|            }
 2263|   417k|        } else {
 2264|   417k|            fillIn = init_resb_result(resB->fData, res, key, -1, resB, fillIn, status);
 2265|   417k|        }
 2266|   634k|    } 
 2267|      0|    else {
 2268|      0|        *status = U_RESOURCE_TYPE_MISMATCH;
 2269|      0|    }
 2270|   634k|    ures_close(helper);
  ------------------
  |  | 1652|   634k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|   634k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   634k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   634k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2271|   634k|    return fillIn;
 2272|   634k|}
ures_getAllChildrenWithFallback_78:
 2429|  6.12k|                                icu::ResourceSink &sink, UErrorCode &errorCode) {
 2430|  6.12k|    GetAllChildrenSink allChildrenSink(sink);
 2431|  6.12k|    ures_getAllItemsWithFallback(bundle, path, allChildrenSink, errorCode);
  ------------------
  |  | 1658|  6.12k|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|  6.12k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.12k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.12k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2432|  6.12k|}
ures_getValueWithFallback_78:
 2448|      2|                          ResourceDataValue &value, UErrorCode &errorCode) {
 2449|      2|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2449:9): [True: 0, False: 2]
  ------------------
 2450|      2|    if (path == nullptr) {
  ------------------
  |  Branch (2450:9): [True: 0, False: 2]
  ------------------
 2451|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
 2452|      0|        return;
 2453|      0|    }
 2454|      2|    const UResourceBundle *rb;
 2455|      2|    if (*path == 0) {
  ------------------
  |  Branch (2455:9): [True: 0, False: 2]
  ------------------
 2456|       |        // empty path
 2457|      0|        rb = bundle;
 2458|      2|    } else {
 2459|      2|        rb = ures_getByKeyWithFallback(bundle, path, tempFillIn, &errorCode);
  ------------------
  |  | 1662|      2|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2460|      2|        if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (2460:13): [True: 0, False: 2]
  ------------------
 2461|      0|            return;
 2462|      0|        }
 2463|      2|    }
 2464|      2|    value.setData(rb->getResData());
 2465|      2|    value.setValidLocaleDataEntry(rb->fValidLocaleDataEntry);
 2466|      2|    value.setResource(rb->fRes, ResourceTracer(rb));
 2467|      2|}
ures_getAllItemsWithFallback_78:
 2471|   116k|                             icu::ResourceSink &sink, UErrorCode &errorCode) {
 2472|   116k|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2472:9): [True: 0, False: 116k]
  ------------------
 2473|   116k|    if (path == nullptr) {
  ------------------
  |  Branch (2473:9): [True: 0, False: 116k]
  ------------------
 2474|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
 2475|      0|        return;
 2476|      0|    }
 2477|   116k|    StackUResourceBundle stackBundle;
 2478|   116k|    const UResourceBundle *rb;
 2479|   116k|    if (*path == 0) {
  ------------------
  |  Branch (2479:9): [True: 2, False: 116k]
  ------------------
 2480|       |        // empty path
 2481|      2|        rb = bundle;
 2482|   116k|    } else {
 2483|   116k|        rb = ures_getByKeyWithFallback(bundle, path, stackBundle.getAlias(), &errorCode);
  ------------------
  |  | 1662|   116k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2484|   116k|        if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (2484:13): [True: 0, False: 116k]
  ------------------
 2485|      0|            return;
 2486|      0|        }
 2487|   116k|    }
 2488|       |    // Get all table items with fallback.
 2489|   116k|    ResourceDataValue value;
 2490|   116k|    getAllItemsWithFallback(rb, value, sink, errorCode);
 2491|   116k|}
ures_getByKey_78:
 2493|   478k|U_CAPI UResourceBundle* U_EXPORT2 ures_getByKey(const UResourceBundle *resB, const char* inKey, UResourceBundle *fillIn, UErrorCode *status) {
 2494|   478k|    Resource res = RES_BOGUS;
  ------------------
  |  |   65|   478k|#define RES_BOGUS 0xffffffff
  ------------------
 2495|   478k|    UResourceDataEntry *dataEntry = nullptr;
 2496|   478k|    const char *key = inKey;
 2497|       |
 2498|   478k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2498:9): [True: 0, False: 478k]
  |  Branch (2498:28): [True: 2, False: 478k]
  ------------------
 2499|      2|        return fillIn;
 2500|      2|    }
 2501|   478k|    if(resB == nullptr) {
  ------------------
  |  Branch (2501:8): [True: 0, False: 478k]
  ------------------
 2502|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2503|      0|        return fillIn;
 2504|      0|    }
 2505|       |
 2506|   478k|    int32_t type = RES_GET_TYPE(resB->fRes);
  ------------------
  |  |   68|   478k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2507|   478k|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|   478k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 478k, False: 1]
  |  |  |  Branch (84:61): [True: 1, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2508|   478k|        int32_t t;
 2509|   478k|        res = res_getTableItemByKey(&resB->getResData(), resB->fRes, &t, &key);
  ------------------
  |  |  207|   478k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|   478k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   478k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   478k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2510|   478k|        if(res == RES_BOGUS) {
  ------------------
  |  |   65|   478k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2510:12): [True: 42.9k, False: 435k]
  ------------------
 2511|  42.9k|            key = inKey;
 2512|  42.9k|            if(resB->fHasFallback) {
  ------------------
  |  Branch (2512:16): [True: 42.9k, False: 5]
  ------------------
 2513|  42.9k|                dataEntry = getFallbackData(resB, &key, &res, status);
 2514|  42.9k|                if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (2514:20): [True: 18.3k, False: 24.5k]
  ------------------
 2515|       |                    /* check if resB->fResPath gives the right name here */
 2516|  18.3k|                    return init_resb_result(dataEntry, res, key, -1, resB, fillIn, status);
 2517|  24.5k|                } else {
 2518|  24.5k|                    *status = U_MISSING_RESOURCE_ERROR;
 2519|  24.5k|                }
 2520|  42.9k|            } else {
 2521|      5|                *status = U_MISSING_RESOURCE_ERROR;
 2522|      5|            }
 2523|   435k|        } else {
 2524|   435k|            return init_resb_result(resB->fData, res, key, -1, resB, fillIn, status);
 2525|   435k|        }
 2526|   478k|    } 
 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|  24.5k|    return fillIn;
 2544|   478k|}
ures_getStringByKey_78:
 2546|   205k|U_CAPI const char16_t* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, const char* inKey, int32_t* len, UErrorCode *status) {
 2547|   205k|    Resource res = RES_BOGUS;
  ------------------
  |  |   65|   205k|#define RES_BOGUS 0xffffffff
  ------------------
 2548|   205k|    UResourceDataEntry *dataEntry = nullptr;
 2549|   205k|    const char* key = inKey;
 2550|       |
 2551|   205k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2551:9): [True: 0, False: 205k]
  |  Branch (2551:28): [True: 0, False: 205k]
  ------------------
 2552|      0|        return nullptr;
 2553|      0|    }
 2554|   205k|    if(resB == nullptr) {
  ------------------
  |  Branch (2554:8): [True: 0, False: 205k]
  ------------------
 2555|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2556|      0|        return nullptr;
 2557|      0|    }
 2558|       |
 2559|   205k|    int32_t type = RES_GET_TYPE(resB->fRes);
  ------------------
  |  |   68|   205k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2560|   205k|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|   205k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 141k, False: 63.6k]
  |  |  |  Branch (84:61): [True: 63.6k, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2561|   205k|        int32_t t=0;
 2562|       |
 2563|   205k|        res = res_getTableItemByKey(&resB->getResData(), resB->fRes, &t, &key);
  ------------------
  |  |  207|   205k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|   205k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   205k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   205k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2564|       |
 2565|   205k|        if(res == RES_BOGUS) {
  ------------------
  |  |   65|   205k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2565:12): [True: 90.9k, False: 114k]
  ------------------
 2566|  90.9k|            key = inKey;
 2567|  90.9k|            if(resB->fHasFallback) {
  ------------------
  |  Branch (2567:16): [True: 0, False: 90.9k]
  ------------------
 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|  90.9k|            } else {
 2589|  90.9k|                *status = U_MISSING_RESOURCE_ERROR;
 2590|  90.9k|            }
 2591|   114k|        } else {
 2592|   114k|            switch (RES_GET_TYPE(res)) {
  ------------------
  |  |   68|   114k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2593|      0|            case URES_STRING:
  ------------------
  |  Branch (2593:13): [True: 0, False: 114k]
  ------------------
 2594|   114k|            case URES_STRING_V2:
  ------------------
  |  Branch (2594:13): [True: 114k, False: 0]
  ------------------
 2595|   114k|                return res_getString({resB, key}, &resB->getResData(), res, len);
 2596|      0|            case URES_ALIAS:
  ------------------
  |  Branch (2596:13): [True: 0, False: 114k]
  ------------------
 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: 114k]
  ------------------
 2605|      0|                *status = U_RESOURCE_TYPE_MISMATCH;
 2606|   114k|            }
 2607|   114k|        }
 2608|   205k|    } 
 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|  90.9k|    return nullptr;
 2627|   205k|}
ures_getLocaleByType_78:
 2671|   186k|                     UErrorCode* status) {
 2672|   186k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2672:9): [True: 0, False: 186k]
  |  Branch (2672:28): [True: 0, False: 186k]
  ------------------
 2673|      0|        return nullptr;
 2674|      0|    }
 2675|   186k|    if (!resourceBundle) {
  ------------------
  |  Branch (2675:9): [True: 0, False: 186k]
  ------------------
 2676|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2677|      0|        return nullptr;
 2678|   186k|    } else {
 2679|   186k|        switch(type) {
 2680|  84.9k|        case ULOC_ACTUAL_LOCALE:
  ------------------
  |  Branch (2680:9): [True: 84.9k, False: 101k]
  ------------------
 2681|  84.9k|            return resourceBundle->fData->fName;
 2682|   101k|        case ULOC_VALID_LOCALE:
  ------------------
  |  Branch (2682:9): [True: 101k, False: 84.9k]
  ------------------
 2683|   101k|            return resourceBundle->fValidLocaleDataEntry->fName;
 2684|      0|        case ULOC_REQUESTED_LOCALE:
  ------------------
  |  Branch (2684:9): [True: 0, False: 186k]
  ------------------
 2685|      0|        default:
  ------------------
  |  Branch (2685:9): [True: 0, False: 186k]
  ------------------
 2686|      0|            *status = U_ILLEGAL_ARGUMENT_ERROR;
 2687|      0|            return nullptr;
 2688|   186k|        }
 2689|   186k|    }
 2690|   186k|}
ures_open_78:
 2769|   409k|ures_open(const char* path, const char* localeID, UErrorCode* status) {
 2770|   409k|    return ures_openWithType(nullptr, path, localeID, URES_OPEN_LOCALE_DEFAULT_ROOT, status);
 2771|   409k|}
ures_openDirect_78:
 2783|   131k|ures_openDirect(const char* path, const char* localeID, UErrorCode* status) {
 2784|   131k|    return ures_openWithType(nullptr, path, localeID, URES_OPEN_DIRECT, status);
 2785|   131k|}
ures_getFunctionalEquivalent_78:
 3068|  4.08k|{
 3069|  4.08k|    CharString defVal; /* default value for given locale */
 3070|  4.08k|    CharString defLoc; /* default value for given locale */
 3071|  4.08k|    CharString found;
 3072|  4.08k|    CharString parent;
 3073|  4.08k|    CharString full;
 3074|  4.08k|    UResourceBundle bund1, bund2;
 3075|  4.08k|    UResourceBundle *res = nullptr;
 3076|  4.08k|    UErrorCode subStatus = U_ZERO_ERROR;
 3077|  4.08k|    int32_t length = 0;
 3078|  4.08k|    if(U_FAILURE(*status)) return 0;
  ------------------
  |  Branch (3078:8): [True: 0, False: 4.08k]
  ------------------
 3079|  4.08k|    CharString kwVal;
 3080|  4.08k|    if (keyword != nullptr && *keyword != '\0') {
  ------------------
  |  Branch (3080:9): [True: 4.08k, False: 0]
  |  Branch (3080:31): [True: 4.08k, False: 0]
  ------------------
 3081|  4.08k|        kwVal = ulocimp_getKeywordValue(locid, keyword, subStatus);
  ------------------
  |  | 1200|  4.08k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  4.08k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.08k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.08k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3082|  4.08k|        if (kwVal == DEFAULT_TAG) {
  ------------------
  |  | 2916|  4.08k|#define DEFAULT_TAG       "default"
  ------------------
  |  Branch (3082:13): [True: 0, False: 4.08k]
  ------------------
 3083|      0|            kwVal.clear();
 3084|      0|        }
 3085|  4.08k|    }
 3086|  4.08k|    if (locid == nullptr) {
  ------------------
  |  Branch (3086:9): [True: 0, False: 4.08k]
  ------------------
 3087|      0|        locid = 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3088|      0|    }
 3089|  4.08k|    CharString base = ulocimp_getBaseName(locid, subStatus);
  ------------------
  |  | 1199|  4.08k|#define ulocimp_getBaseName U_ICU_ENTRY_POINT_RENAME(ulocimp_getBaseName)
  |  |  ------------------
  |  |  |  |  123|  4.08k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.08k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.08k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3090|       |#if defined(URES_TREE_DEBUG)
 3091|       |    fprintf(stderr, "getFunctionalEquivalent: \"%s\" [%s=%s] in %s - %s\n", 
 3092|       |            locid, keyword, kwVal.data(), base.data(), u_errorName(subStatus));
 3093|       |#endif
 3094|  4.08k|    ures_initStackObject(&bund1);
  ------------------
  |  | 1690|  4.08k|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|  4.08k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.08k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.08k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3095|  4.08k|    ures_initStackObject(&bund2);
  ------------------
  |  | 1690|  4.08k|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|  4.08k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.08k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.08k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3096|       |
 3097|  4.08k|    parent.copyFrom(base, subStatus);
 3098|  4.08k|    found.copyFrom(base, subStatus);
 3099|       |
 3100|  4.08k|    if(isAvailable) {
  ------------------
  |  Branch (3100:8): [True: 0, False: 4.08k]
  ------------------
 3101|      0|        UEnumeration *locEnum = ures_openAvailableLocales(path, &subStatus);
  ------------------
  |  | 1692|      0|#define ures_openAvailableLocales U_ICU_ENTRY_POINT_RENAME(ures_openAvailableLocales)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3102|      0|        *isAvailable = true;
 3103|      0|        if (U_SUCCESS(subStatus)) {
  ------------------
  |  Branch (3103:13): [True: 0, False: 0]
  ------------------
 3104|      0|            *isAvailable = isLocaleInList(locEnum, parent.data(), &subStatus);
 3105|      0|        }
 3106|      0|        uenum_close(locEnum);
  ------------------
  |  |  948|      0|#define uenum_close U_ICU_ENTRY_POINT_RENAME(uenum_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3107|      0|    }
 3108|       |
 3109|  4.08k|    if(U_FAILURE(subStatus)) {
  ------------------
  |  Branch (3109:8): [True: 0, False: 4.08k]
  ------------------
 3110|      0|        *status = subStatus;
 3111|      0|        return 0;
 3112|      0|    }
 3113|       |    
 3114|  16.3k|    do {
 3115|  16.3k|        subStatus = U_ZERO_ERROR;
 3116|  16.3k|        res = ures_open(path, parent.data(), &subStatus);
  ------------------
  |  | 1691|  16.3k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  16.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  16.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  16.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3117|  16.3k|        if(((subStatus == U_USING_FALLBACK_WARNING) ||
  ------------------
  |  Branch (3117:13): [True: 0, False: 16.3k]
  ------------------
 3118|  16.3k|            (subStatus == U_USING_DEFAULT_WARNING)) && isAvailable)
  ------------------
  |  Branch (3118:13): [True: 0, False: 16.3k]
  |  Branch (3118:56): [True: 0, False: 0]
  ------------------
 3119|      0|        {
 3120|      0|            *isAvailable = false;
 3121|      0|        }
 3122|  16.3k|        isAvailable = nullptr; /* only want to set this the first time around */
 3123|       |        
 3124|       |#if defined(URES_TREE_DEBUG)
 3125|       |        fprintf(stderr, "%s;%s -> %s [%s]\n", path?path:"ICUDATA", parent.data(), u_errorName(subStatus), ures_getLocale(res, &subStatus));
 3126|       |#endif
 3127|  16.3k|        if(U_FAILURE(subStatus)) {
  ------------------
  |  Branch (3127:12): [True: 0, False: 16.3k]
  ------------------
 3128|      0|            *status = subStatus;
 3129|  16.3k|        } else if(subStatus == U_ZERO_ERROR) {
  ------------------
  |  Branch (3129:19): [True: 16.3k, False: 0]
  ------------------
 3130|  16.3k|            ures_getByKey(res,resName,&bund1, &subStatus);
  ------------------
  |  | 1661|  16.3k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  16.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  16.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  16.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3131|  16.3k|            if(subStatus == U_ZERO_ERROR) {
  ------------------
  |  Branch (3131:16): [True: 8.17k, False: 8.17k]
  ------------------
 3132|  8.17k|                const char16_t *defUstr;
 3133|  8.17k|                int32_t defLen;
 3134|       |                /* look for default item */
 3135|       |#if defined(URES_TREE_DEBUG)
 3136|       |                fprintf(stderr, "%s;%s : loaded default -> %s\n",
 3137|       |                    path?path:"ICUDATA", parent.data(), u_errorName(subStatus));
 3138|       |#endif
 3139|  8.17k|                defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus);
  ------------------
  |  | 1677|  8.17k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|  8.17k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  8.17k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  8.17k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                              defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus);
  ------------------
  |  | 2916|  8.17k|#define DEFAULT_TAG       "default"
  ------------------
 3140|  8.17k|                if(U_SUCCESS(subStatus) && defLen) {
  ------------------
  |  Branch (3140:20): [True: 4.08k, False: 4.08k]
  |  Branch (3140:44): [True: 4.08k, False: 0]
  ------------------
 3141|  4.08k|                    defVal.clear().appendInvariantChars(defUstr, defLen, subStatus);
 3142|       |#if defined(URES_TREE_DEBUG)
 3143|       |                    fprintf(stderr, "%s;%s -> default %s=%s,  %s\n", 
 3144|       |                        path?path:"ICUDATA", parent.data(), keyword, defVal.data(), u_errorName(subStatus));
 3145|       |#endif
 3146|  4.08k|                    defLoc.copyFrom(parent, subStatus);
 3147|  4.08k|                    if(kwVal.isEmpty()) {
  ------------------
  |  Branch (3147:24): [True: 4.08k, False: 0]
  ------------------
 3148|  4.08k|                        kwVal.append(defVal, subStatus);
 3149|       |#if defined(URES_TREE_DEBUG)
 3150|       |                        fprintf(stderr, "%s;%s -> kwVal =  %s\n", 
 3151|       |                            path?path:"ICUDATA", parent.data(), keyword, kwVal.data());
 3152|       |#endif
 3153|  4.08k|                    }
 3154|  4.08k|                }
 3155|  8.17k|            }
 3156|  16.3k|        }
 3157|       |        
 3158|  16.3k|        subStatus = U_ZERO_ERROR;
 3159|       |
 3160|  16.3k|        if (res != nullptr) {
  ------------------
  |  Branch (3160:13): [True: 16.3k, False: 0]
  ------------------
 3161|  16.3k|            found.clear().append(ures_getLocaleByType(res, ULOC_VALID_LOCALE, &subStatus), subStatus);
  ------------------
  |  | 1669|  16.3k|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|  16.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  16.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  16.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3162|  16.3k|        }
 3163|       |
 3164|  16.3k|        if (found != parent) {
  ------------------
  |  Branch (3164:13): [True: 4.08k, False: 12.2k]
  ------------------
 3165|  4.08k|            parent.copyFrom(found, subStatus);
 3166|  12.2k|        } else {
 3167|  12.2k|            getParentForFunctionalEquivalent(found.data(),res,&bund1,parent);
 3168|  12.2k|        }
 3169|  16.3k|        ures_close(res);
  ------------------
  |  | 1652|  16.3k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  16.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  16.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  16.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3170|  16.3k|    } while(defVal.isEmpty() && !found.isEmpty() && found != "root" && U_SUCCESS(*status));
  ------------------
  |  Branch (3170:13): [True: 12.2k, False: 4.08k]
  |  Branch (3170:33): [True: 12.2k, False: 0]
  |  Branch (3170:53): [True: 12.2k, False: 0]
  |  Branch (3170:72): [True: 12.2k, False: 0]
  ------------------
 3171|       |    
 3172|       |    /* Now, see if we can find the kwVal collator.. start the search over.. */
 3173|  4.08k|    parent.copyFrom(base, subStatus);
 3174|  4.08k|    found.copyFrom(base, subStatus);
 3175|       |
 3176|  12.2k|    do {
 3177|  12.2k|        res = ures_open(path, parent.data(), &subStatus);
  ------------------
  |  | 1691|  12.2k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  12.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  12.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  12.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3178|  12.2k|        if((subStatus == U_USING_FALLBACK_WARNING) && isAvailable) {
  ------------------
  |  Branch (3178:12): [True: 0, False: 12.2k]
  |  Branch (3178:55): [True: 0, False: 0]
  ------------------
 3179|      0|            *isAvailable = false;
 3180|      0|        }
 3181|  12.2k|        isAvailable = nullptr; /* only want to set this the first time around */
 3182|       |        
 3183|       |#if defined(URES_TREE_DEBUG)
 3184|       |        fprintf(stderr, "%s;%s -> %s (looking for %s)\n", 
 3185|       |            path?path:"ICUDATA", parent.data(), u_errorName(subStatus), kwVal.data());
 3186|       |#endif
 3187|  12.2k|        if(U_FAILURE(subStatus)) {
  ------------------
  |  Branch (3187:12): [True: 0, False: 12.2k]
  ------------------
 3188|      0|            *status = subStatus;
 3189|  12.2k|        } else if(subStatus == U_ZERO_ERROR) {
  ------------------
  |  Branch (3189:19): [True: 12.2k, False: 0]
  ------------------
 3190|  12.2k|            ures_getByKey(res,resName,&bund1, &subStatus);
  ------------------
  |  | 1661|  12.2k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  12.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  12.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  12.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3191|       |#if defined(URES_TREE_DEBUG)
 3192|       |/**/ fprintf(stderr,"@%d [%s] %s\n", __LINE__, resName, u_errorName(subStatus));
 3193|       |#endif
 3194|  12.2k|            if(subStatus == U_ZERO_ERROR) {
  ------------------
  |  Branch (3194:16): [True: 4.08k, False: 8.17k]
  ------------------
 3195|  4.08k|                ures_getByKey(&bund1, kwVal.data(), &bund2, &subStatus);
  ------------------
  |  | 1661|  4.08k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  4.08k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.08k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.08k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3196|       |#if defined(URES_TREE_DEBUG)
 3197|       |/**/ fprintf(stderr,"@%d [%s] %s\n", __LINE__, kwVal.data(), u_errorName(subStatus));
 3198|       |#endif
 3199|  4.08k|                if(subStatus == U_ZERO_ERROR) {
  ------------------
  |  Branch (3199:20): [True: 4.08k, False: 0]
  ------------------
 3200|       |#if defined(URES_TREE_DEBUG)
 3201|       |                    fprintf(stderr, "%s;%s -> full0 %s=%s,  %s\n", 
 3202|       |                        path?path:"ICUDATA", parent.data(), keyword, kwVal.data(), u_errorName(subStatus));
 3203|       |#endif
 3204|  4.08k|                    if (parent.isEmpty()) {
  ------------------
  |  Branch (3204:25): [True: 0, False: 4.08k]
  ------------------
 3205|      0|                        full.clear().append("root", subStatus);
 3206|  4.08k|                    } else {
 3207|  4.08k|                        full.copyFrom(parent, subStatus);
 3208|  4.08k|                    }
 3209|       |                        /* now, recalculate default kw if need be */
 3210|  4.08k|                        if(defLoc.length() > full.length()) {
  ------------------
  |  Branch (3210:28): [True: 0, False: 4.08k]
  ------------------
 3211|      0|                          const char16_t *defUstr;
 3212|      0|                          int32_t defLen;
 3213|       |                          /* look for default item */
 3214|       |#if defined(URES_TREE_DEBUG)
 3215|       |                            fprintf(stderr, "%s;%s -> recalculating Default0\n", 
 3216|       |                                    path?path:"ICUDATA", full.data());
 3217|       |#endif
 3218|      0|                          defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus);
  ------------------
  |  | 1677|      0|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                                        defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus);
  ------------------
  |  | 2916|      0|#define DEFAULT_TAG       "default"
  ------------------
 3219|      0|                          if(U_SUCCESS(subStatus) && defLen) {
  ------------------
  |  Branch (3219:30): [True: 0, False: 0]
  |  Branch (3219:54): [True: 0, False: 0]
  ------------------
 3220|      0|                            defVal.clear().appendInvariantChars(defUstr, defLen, subStatus);
 3221|       |#if defined(URES_TREE_DEBUG)
 3222|       |                            fprintf(stderr, "%s;%s -> default0 %s=%s,  %s\n", 
 3223|       |                                    path?path:"ICUDATA", full.data(), keyword, defVal.data(), u_errorName(subStatus));
 3224|       |#endif
 3225|      0|                            defLoc.copyFrom(full, subStatus);
 3226|      0|                          }
 3227|      0|                        } /* end of recalculate default KW */
 3228|       |#if defined(URES_TREE_DEBUG)
 3229|       |                        else {
 3230|       |                          fprintf(stderr, "No trim0,  %s <= %s\n", defLoc.data(), full.data());
 3231|       |                        }
 3232|       |#endif
 3233|  4.08k|                } else {
 3234|       |#if defined(URES_TREE_DEBUG)
 3235|       |                    fprintf(stderr, "err=%s in %s looking for %s\n", 
 3236|       |                        u_errorName(subStatus), parent.data(), kwVal.data());
 3237|       |#endif
 3238|      0|                }
 3239|  4.08k|            }
 3240|  12.2k|        }
 3241|       |        
 3242|  12.2k|        subStatus = U_ZERO_ERROR;
 3243|  12.2k|        UBool haveFound = false;
 3244|       |        // At least for collations which may be aliased, we need to use the VALID locale
 3245|       |        // as the parent instead of just truncating, as long as the VALID locale is not
 3246|       |        // root and has a different language than the parent. Use of the VALID locale
 3247|       |        // here is similar to the procedure used at the end of the previous do-while loop
 3248|       |        // for all resource types.
 3249|  12.2k|        if (res != nullptr && uprv_strcmp(resName, "collations") == 0) {
  ------------------
  |  |   38|  12.2k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  12.2k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (3249:13): [True: 12.2k, False: 0]
  |  Branch (3249:31): [True: 0, False: 12.2k]
  ------------------
 3250|      0|            const char *validLoc = ures_getLocaleByType(res, ULOC_VALID_LOCALE, &subStatus);
  ------------------
  |  | 1669|      0|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3251|      0|            if (U_SUCCESS(subStatus) && validLoc != nullptr && validLoc[0] != 0 && uprv_strcmp(validLoc, "root") != 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (3251:17): [True: 0, False: 0]
  |  Branch (3251:41): [True: 0, False: 0]
  |  Branch (3251:64): [True: 0, False: 0]
  |  Branch (3251:84): [True: 0, False: 0]
  ------------------
 3252|      0|                CharString validLang = ulocimp_getLanguage(validLoc, subStatus);
  ------------------
  |  | 1203|      0|#define ulocimp_getLanguage U_ICU_ENTRY_POINT_RENAME(ulocimp_getLanguage)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3253|      0|                CharString parentLang = ulocimp_getLanguage(parent.toStringPiece(), subStatus);
  ------------------
  |  | 1203|      0|#define ulocimp_getLanguage U_ICU_ENTRY_POINT_RENAME(ulocimp_getLanguage)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3254|      0|                if (U_SUCCESS(subStatus) && validLang != parentLang) {
  ------------------
  |  Branch (3254:21): [True: 0, False: 0]
  |  Branch (3254:45): [True: 0, False: 0]
  ------------------
 3255|       |                    // validLoc is not root and has a different language than parent, use it instead
 3256|      0|                    found.clear().append(validLoc, subStatus);
 3257|      0|                    haveFound = true;
 3258|      0|                }
 3259|      0|            }
 3260|      0|            subStatus = U_ZERO_ERROR;
 3261|      0|        }
 3262|  12.2k|        if (!haveFound) {
  ------------------
  |  Branch (3262:13): [True: 12.2k, False: 0]
  ------------------
 3263|  12.2k|            found.copyFrom(parent, subStatus);
 3264|  12.2k|        }
 3265|       |
 3266|  12.2k|        getParentForFunctionalEquivalent(found.data(),res,&bund1,parent);
 3267|  12.2k|        ures_close(res);
  ------------------
  |  | 1652|  12.2k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  12.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  12.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  12.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3268|  12.2k|        subStatus = U_ZERO_ERROR;
 3269|  12.2k|    } while(full.isEmpty() && !found.isEmpty() && U_SUCCESS(*status));
  ------------------
  |  Branch (3269:13): [True: 8.17k, False: 4.08k]
  |  Branch (3269:31): [True: 8.17k, False: 0]
  |  Branch (3269:51): [True: 8.17k, False: 0]
  ------------------
 3270|       |
 3271|  4.08k|    if(full.isEmpty() && kwVal != defVal) {
  ------------------
  |  Branch (3271:8): [True: 0, False: 4.08k]
  |  Branch (3271:26): [True: 0, False: 0]
  ------------------
 3272|       |#if defined(URES_TREE_DEBUG)
 3273|       |        fprintf(stderr, "Failed to locate kw %s - try default %s\n", kwVal.data(), defVal.data());
 3274|       |#endif
 3275|      0|        kwVal.clear().append(defVal, subStatus);
 3276|      0|        parent.copyFrom(base, subStatus);
 3277|      0|        found.copyFrom(base, subStatus);
 3278|       |
 3279|      0|        do { /* search for 'default' named item */
 3280|      0|            res = ures_open(path, parent.data(), &subStatus);
  ------------------
  |  | 1691|      0|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3281|      0|            if((subStatus == U_USING_FALLBACK_WARNING) && isAvailable) {
  ------------------
  |  Branch (3281:16): [True: 0, False: 0]
  |  Branch (3281:59): [True: 0, False: 0]
  ------------------
 3282|      0|                *isAvailable = false;
 3283|      0|            }
 3284|      0|            isAvailable = nullptr; /* only want to set this the first time around */
 3285|       |            
 3286|       |#if defined(URES_TREE_DEBUG)
 3287|       |            fprintf(stderr, "%s;%s -> %s (looking for default %s)\n",
 3288|       |                path?path:"ICUDATA", parent.data(), u_errorName(subStatus), kwVal.data());
 3289|       |#endif
 3290|      0|            if(U_FAILURE(subStatus)) {
  ------------------
  |  Branch (3290:16): [True: 0, False: 0]
  ------------------
 3291|      0|                *status = subStatus;
 3292|      0|            } else if(subStatus == U_ZERO_ERROR) {
  ------------------
  |  Branch (3292:23): [True: 0, False: 0]
  ------------------
 3293|      0|                ures_getByKey(res,resName,&bund1, &subStatus);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3294|      0|                if(subStatus == U_ZERO_ERROR) {
  ------------------
  |  Branch (3294:20): [True: 0, False: 0]
  ------------------
 3295|      0|                    ures_getByKey(&bund1, kwVal.data(), &bund2, &subStatus);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3296|      0|                    if(subStatus == U_ZERO_ERROR) {
  ------------------
  |  Branch (3296:24): [True: 0, False: 0]
  ------------------
 3297|       |#if defined(URES_TREE_DEBUG)
 3298|       |                        fprintf(stderr, "%s;%s -> full1 %s=%s,  %s\n", path?path:"ICUDATA",
 3299|       |                            parent.data(), keyword, kwVal.data(), u_errorName(subStatus));
 3300|       |#endif
 3301|      0|                        if (parent.isEmpty()) {
  ------------------
  |  Branch (3301:29): [True: 0, False: 0]
  ------------------
 3302|      0|                            full.clear().append("root", subStatus);
 3303|      0|                        } else {
 3304|      0|                            full.copyFrom(parent, subStatus);
 3305|      0|                        }
 3306|       |                        
 3307|       |                        /* now, recalculate default kw if need be */
 3308|      0|                        if(defLoc.length() > full.length()) {
  ------------------
  |  Branch (3308:28): [True: 0, False: 0]
  ------------------
 3309|      0|                          const char16_t *defUstr;
 3310|      0|                          int32_t defLen;
 3311|       |                          /* look for default item */
 3312|       |#if defined(URES_TREE_DEBUG)
 3313|       |                            fprintf(stderr, "%s;%s -> recalculating Default1\n", 
 3314|       |                                    path?path:"ICUDATA", full.data());
 3315|       |#endif
 3316|      0|                          defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus);
  ------------------
  |  | 1677|      0|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                                        defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus);
  ------------------
  |  | 2916|      0|#define DEFAULT_TAG       "default"
  ------------------
 3317|      0|                          if(U_SUCCESS(subStatus) && defLen) {
  ------------------
  |  Branch (3317:30): [True: 0, False: 0]
  |  Branch (3317:54): [True: 0, False: 0]
  ------------------
 3318|      0|                            defVal.clear().appendInvariantChars(defUstr, defLen, subStatus);
 3319|       |#if defined(URES_TREE_DEBUG)
 3320|       |                            fprintf(stderr, "%s;%s -> default %s=%s,  %s\n", 
 3321|       |                                    path?path:"ICUDATA", full.data(), keyword, defVal.data(), u_errorName(subStatus));
 3322|       |#endif
 3323|      0|                            defLoc.copyFrom(full, subStatus);
 3324|      0|                          }
 3325|      0|                        } /* end of recalculate default KW */
 3326|       |#if defined(URES_TREE_DEBUG)
 3327|       |                        else {
 3328|       |                          fprintf(stderr, "No trim1,  %s <= %s\n", defLoc.data(), full.data());
 3329|       |                        }
 3330|       |#endif
 3331|      0|                    }
 3332|      0|                }
 3333|      0|            }
 3334|       |            
 3335|      0|            subStatus = U_ZERO_ERROR;
 3336|      0|            found.copyFrom(parent, subStatus);
 3337|      0|            getParentForFunctionalEquivalent(found.data(),res,&bund1,parent);
 3338|      0|            ures_close(res);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3339|      0|            subStatus = U_ZERO_ERROR;
 3340|      0|        } while(full.isEmpty() && !found.isEmpty() && U_SUCCESS(*status));
  ------------------
  |  Branch (3340:17): [True: 0, False: 0]
  |  Branch (3340:35): [True: 0, False: 0]
  |  Branch (3340:55): [True: 0, False: 0]
  ------------------
 3341|      0|    }
 3342|       |    
 3343|  4.08k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (3343:8): [True: 4.08k, False: 0]
  ------------------
 3344|  4.08k|        if(full.isEmpty()) {
  ------------------
  |  Branch (3344:12): [True: 0, False: 4.08k]
  ------------------
 3345|       |#if defined(URES_TREE_DEBUG)
 3346|       |          fprintf(stderr, "Still could not load keyword %s=%s\n", keyword, kwVal.data());
 3347|       |#endif
 3348|      0|          *status = U_MISSING_RESOURCE_ERROR;
 3349|  4.08k|        } else if(omitDefault) {
  ------------------
  |  Branch (3349:19): [True: 0, False: 4.08k]
  ------------------
 3350|       |#if defined(URES_TREE_DEBUG)
 3351|       |          fprintf(stderr,"Trim? full=%s, defLoc=%s, found=%s\n", full.data(), defLoc.data(), found.data());
 3352|       |#endif        
 3353|      0|          if(defLoc.length() <= full.length()) {
  ------------------
  |  Branch (3353:14): [True: 0, False: 0]
  ------------------
 3354|       |            /* found the keyword in a *child* of where the default tag was present. */
 3355|      0|            if(kwVal == defVal) { /* if the requested kw is default, */
  ------------------
  |  Branch (3355:16): [True: 0, False: 0]
  ------------------
 3356|       |              /* and the default is in or in an ancestor of the current locale */
 3357|       |#if defined(URES_TREE_DEBUG)
 3358|       |              fprintf(stderr, "Removing unneeded var %s=%s\n", keyword, kwVal.data());
 3359|       |#endif
 3360|      0|              kwVal.clear();
 3361|      0|            }
 3362|      0|          }
 3363|      0|        }
 3364|  4.08k|        found.copyFrom(full, subStatus);
 3365|  4.08k|        if(!kwVal.isEmpty()) {
  ------------------
  |  Branch (3365:12): [True: 4.08k, False: 0]
  ------------------
 3366|  4.08k|            found
 3367|  4.08k|                .append("@", subStatus)
 3368|  4.08k|                .append(keyword, subStatus)
 3369|  4.08k|                .append("=", subStatus)
 3370|  4.08k|                .append(kwVal, subStatus);
 3371|  4.08k|        } else if(!omitDefault) {
  ------------------
  |  Branch (3371:19): [True: 0, False: 0]
  ------------------
 3372|      0|            found
 3373|      0|                .append("@", subStatus)
 3374|      0|                .append(keyword, subStatus)
 3375|      0|                .append("=", subStatus)
 3376|      0|                .append(defVal, subStatus);
 3377|      0|        }
 3378|  4.08k|    }
 3379|       |    /* we found the default locale - no need to repeat it.*/
 3380|       |    
 3381|  4.08k|    ures_close(&bund1);
  ------------------
  |  | 1652|  4.08k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  4.08k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.08k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.08k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3382|  4.08k|    ures_close(&bund2);
  ------------------
  |  | 1652|  4.08k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  4.08k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.08k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.08k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3383|       |    
 3384|  4.08k|    length = found.length();
 3385|       |
 3386|  4.08k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (3386:8): [True: 4.08k, False: 0]
  ------------------
 3387|  4.08k|        int32_t copyLength = uprv_min(length, resultCapacity);
  ------------------
  |  | 1529|  4.08k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|  4.08k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.08k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.08k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3388|  4.08k|        if(copyLength>0) {
  ------------------
  |  Branch (3388:12): [True: 4.08k, False: 0]
  ------------------
 3389|  4.08k|            found.extract(result, copyLength, subStatus);
 3390|  4.08k|        }
 3391|  4.08k|        if(length == 0) {
  ------------------
  |  Branch (3391:12): [True: 0, False: 4.08k]
  ------------------
 3392|      0|          *status = U_MISSING_RESOURCE_ERROR; 
 3393|      0|        }
 3394|  4.08k|    } else {
 3395|      0|        length = 0;
 3396|      0|        result[0]=0;
 3397|      0|    }
 3398|  4.08k|    return u_terminateChars(result, resultCapacity, length, status);
  ------------------
  |  |  406|  4.08k|#define u_terminateChars U_ICU_ENTRY_POINT_RENAME(u_terminateChars)
  |  |  ------------------
  |  |  |  |  123|  4.08k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.08k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.08k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3399|  4.08k|}
uresbund.cpp:_ZL21ures_setIsStackObjectP15UResourceBundlea:
  711|  1.55M|static void ures_setIsStackObject( UResourceBundle* resB, UBool state) {
  712|  1.55M|    if(state) {
  ------------------
  |  Branch (712:8): [True: 582k, False: 975k]
  ------------------
  713|   582k|        resB->fMagic1 = 0;
  714|   582k|        resB->fMagic2 = 0;
  715|   975k|    } else {
  716|   975k|        resB->fMagic1 = MAGIC1;
  ------------------
  |  |   30|   975k|#define MAGIC1 19700503
  ------------------
  717|   975k|        resB->fMagic2 = MAGIC2;
  ------------------
  |  |   31|   975k|#define MAGIC2 19641227
  ------------------
  718|   975k|    }
  719|  1.55M|}
uresbund.cpp:_ZL16ures_closeBundleP15UResourceBundlea:
 1123|  2.19M|{
 1124|  2.19M|    if(resB != nullptr) {
  ------------------
  |  Branch (1124:8): [True: 1.55M, False: 634k]
  ------------------
 1125|  1.55M|        if(resB->fData != nullptr) {
  ------------------
  |  Branch (1125:12): [True: 1.55M, False: 2]
  ------------------
 1126|  1.55M|            entryClose(resB->fData);
 1127|  1.55M|        }
 1128|  1.55M|        if(resB->fVersion != nullptr) {
  ------------------
  |  Branch (1128:12): [True: 0, False: 1.55M]
  ------------------
 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|  1.55M|        ures_freeResPath(resB);
 1132|       |
 1133|  1.55M|        if(ures_isStackObject(resB) == false && freeBundleObj) {
  ------------------
  |  Branch (1133:12): [True: 975k, False: 582k]
  |  Branch (1133:49): [True: 975k, False: 0]
  ------------------
 1134|   975k|            uprv_free(resB);
  ------------------
  |  | 1503|   975k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|   975k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   975k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   975k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1135|   975k|        }
 1136|       |#if 0 /*U_DEBUG*/
 1137|       |        else {
 1138|       |            /* poison the data */
 1139|       |            uprv_memset(resB, -1, sizeof(UResourceBundle));
 1140|       |        }
 1141|       |#endif
 1142|  1.55M|    }
 1143|  2.19M|}
uresbund.cpp:_ZL10entryCloseP18UResourceDataEntry:
 1061|  1.94M|static void entryClose(UResourceDataEntry *resB) {
 1062|  1.94M|  Mutex lock(&resbMutex);
 1063|  1.94M|  entryCloseInt(resB);
 1064|  1.94M|}
uresbund.cpp:_ZL13entryCloseIntP18UResourceDataEntry:
 1028|  1.94M|static void entryCloseInt(UResourceDataEntry *resB) {
 1029|  1.94M|    UResourceDataEntry *p = resB;
 1030|       |
 1031|  5.91M|    while(resB != nullptr) {
  ------------------
  |  Branch (1031:11): [True: 3.97M, False: 1.94M]
  ------------------
 1032|  3.97M|        p = resB->fParent;
 1033|  3.97M|        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|  3.97M|        resB = p;
 1054|  3.97M|    }
 1055|  1.94M|}
uresbund.cpp:_ZL18ures_isStackObjectPK15UResourceBundle:
  721|  1.55M|static UBool ures_isStackObject(const UResourceBundle* resB) {
  722|  1.55M|  return((resB->fMagic1 == MAGIC1 && resB->fMagic2 == MAGIC2)?false:true);
  ------------------
  |  |   30|  3.11M|#define MAGIC1 19700503
  ------------------
                return((resB->fMagic1 == MAGIC1 && resB->fMagic2 == MAGIC2)?false:true);
  ------------------
  |  |   31|   975k|#define MAGIC2 19641227
  ------------------
  |  Branch (722:11): [True: 975k, False: 582k]
  |  Branch (722:38): [True: 975k, False: 0]
  ------------------
  723|  1.55M|}
uresbund.cpp:_ZL18ures_appendResPathP15UResourceBundlePKciP10UErrorCode:
 1083|  3.52M|static void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t lenToAdd, UErrorCode *status) {
 1084|  3.52M|    int32_t resPathLenOrig = resB->fResPathLen;
 1085|  3.52M|    if(resB->fResPath == nullptr) {
  ------------------
  |  Branch (1085:8): [True: 1.52M, False: 2.00M]
  ------------------
 1086|  1.52M|        resB->fResPath = resB->fResBuf;
 1087|  1.52M|        *(resB->fResPath) = 0;
 1088|  1.52M|        resB->fResPathLen = 0;
 1089|  1.52M|    } 
 1090|  3.52M|    resB->fResPathLen += lenToAdd;
 1091|  3.52M|    if(RES_BUFSIZE <= resB->fResPathLen+1) {
  ------------------
  |  |   59|  3.52M|#define RES_BUFSIZE 64
  ------------------
  |  Branch (1091:8): [True: 0, False: 3.52M]
  ------------------
 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|  3.52M|    uprv_strcpy(resB->fResPath + resPathLenOrig, toAdd);
  ------------------
  |  |   36|  3.52M|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  3.52M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1111|  3.52M|}
uresbund.cpp:_ZL13entryIncreaseP18UResourceDataEntry:
  304|  1.39M|static void entryIncrease(UResourceDataEntry *entry) {
  305|  1.39M|    Mutex lock(&resbMutex);
  306|  1.39M|    entry->fCountExisting++;
  307|  2.55M|    while(entry->fParent != nullptr) {
  ------------------
  |  Branch (307:11): [True: 1.15M, False: 1.39M]
  ------------------
  308|  1.15M|      entry = entry->fParent;
  309|  1.15M|      entry->fCountExisting++;
  310|  1.15M|    }
  311|  1.39M|}
uresbund.cpp:_ZL23ures_getStringWithAliasPK15UResourceBundlejiPiP10UErrorCode:
 1709|   201k|static const char16_t* ures_getStringWithAlias(const UResourceBundle *resB, Resource r, int32_t sIndex, int32_t *len, UErrorCode *status) {
 1710|   201k|  if(RES_GET_TYPE(r) == URES_ALIAS) {
  ------------------
  |  |   68|   201k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (1710:6): [True: 0, False: 201k]
  ------------------
 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|   201k|  } else {
 1717|   201k|    return res_getString({resB, sIndex}, &resB->getResData(), r, len); 
 1718|   201k|  }
 1719|   201k|}
uresbund.cpp:_ZN12_GLOBAL__N_116init_resb_resultEP18UResourceDataEntryjPKciPK15UResourceBundlePS4_P10UErrorCode:
 1480|  1.16M|        UResourceBundle *resB, UErrorCode *status) {
 1481|  1.16M|    return init_resb_result(
 1482|  1.16M|        dataEntry, r, key, idx,
 1483|  1.16M|        container->fValidLocaleDataEntry, container->fResPath, 0, resB, status);
 1484|  1.16M|}
uresbund.cpp:_ZN12_GLOBAL__N_116init_resb_resultEP18UResourceDataEntryjPKciS1_S3_iP15UResourceBundleP10UErrorCode:
 1389|  1.30M|        UResourceBundle *resB, UErrorCode *status) {
 1390|       |    // TODO: When an error occurs: Should we return nullptr vs. resB?
 1391|  1.30M|    if(status == nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1391:8): [True: 0, False: 1.30M]
  |  Branch (1391:29): [True: 0, False: 1.30M]
  ------------------
 1392|      0|        return resB;
 1393|      0|    }
 1394|  1.30M|    if (validLocaleDataEntry == nullptr) {
  ------------------
  |  Branch (1394:9): [True: 0, False: 1.30M]
  ------------------
 1395|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1396|      0|        return nullptr;
 1397|      0|    }
 1398|  1.30M|    if(RES_GET_TYPE(r) == URES_ALIAS) {
  ------------------
  |  |   68|  1.30M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (1398:8): [True: 1, False: 1.30M]
  ------------------
 1399|       |        // This is an alias, need to exchange with real data.
 1400|      1|        if(recursionDepth >= URES_MAX_ALIAS_LEVEL) {
  ------------------
  |  |   33|      1|#define URES_MAX_ALIAS_LEVEL 256
  ------------------
  |  Branch (1400:12): [True: 0, False: 1]
  ------------------
 1401|      0|            *status = U_TOO_MANY_ALIASES_ERROR;
 1402|      0|            return resB;
 1403|      0|        }
 1404|      1|        return getAliasTargetAsResourceBundle(
 1405|      1|            dataEntry->fData, r, key, idx,
 1406|      1|            validLocaleDataEntry, containerResPath, recursionDepth, resB, status);
 1407|      1|    }
 1408|  1.30M|    if(resB == nullptr) {
  ------------------
  |  Branch (1408:8): [True: 433k, False: 870k]
  ------------------
 1409|   433k|        resB = static_cast<UResourceBundle*>(uprv_malloc(sizeof(UResourceBundle)));
  ------------------
  |  | 1524|   433k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|   433k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   433k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   433k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1410|   433k|        if (resB == nullptr) {
  ------------------
  |  Branch (1410:13): [True: 0, False: 433k]
  ------------------
 1411|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
 1412|      0|            return nullptr;
 1413|      0|        }
 1414|   433k|        ures_setIsStackObject(resB, false);
 1415|   433k|        resB->fResPath = nullptr;
 1416|   433k|        resB->fResPathLen = 0;
 1417|   870k|    } else {
 1418|   870k|        if(resB->fData != nullptr) {
  ------------------
  |  Branch (1418:12): [True: 382k, False: 487k]
  ------------------
 1419|   382k|            entryClose(resB->fData);
 1420|   382k|        }
 1421|   870k|        if(resB->fVersion != nullptr) {
  ------------------
  |  Branch (1421:12): [True: 0, False: 870k]
  ------------------
 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|   870k|        if(containerResPath != resB->fResPath) {
  ------------------
  |  Branch (1435:12): [True: 206k, False: 663k]
  ------------------
 1436|   206k|            ures_freeResPath(resB);
 1437|   206k|        }
 1438|   870k|    }
 1439|  1.30M|    resB->fData = dataEntry;
 1440|  1.30M|    entryIncrease(resB->fData);
 1441|  1.30M|    resB->fHasFallback = false;
 1442|  1.30M|    resB->fIsTopLevel = false;
 1443|  1.30M|    resB->fIndex = -1;
 1444|  1.30M|    resB->fKey = key; 
 1445|  1.30M|    resB->fValidLocaleDataEntry = validLocaleDataEntry;
 1446|  1.30M|    if(containerResPath != resB->fResPath) {
  ------------------
  |  Branch (1446:8): [True: 308k, False: 995k]
  ------------------
 1447|   308k|        ures_appendResPath(
 1448|   308k|            resB, containerResPath, static_cast<int32_t>(uprv_strlen(containerResPath)), status);
  ------------------
  |  |   37|   308k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   308k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1449|   308k|    }
 1450|  1.30M|    if(key != nullptr) {
  ------------------
  |  Branch (1450:8): [True: 1.22M, False: 80.0k]
  ------------------
 1451|  1.22M|        ures_appendResPath(resB, key, static_cast<int32_t>(uprv_strlen(key)), status);
  ------------------
  |  |   37|  1.22M|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.22M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1452|  1.22M|        if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  1.22M|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1452:12): [True: 1.17M, False: 50.5k]
  ------------------
 1453|  1.17M|            ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|  1.17M|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 1454|  1.17M|        }
 1455|  1.22M|    } else if(idx >= 0) {
  ------------------
  |  Branch (1455:15): [True: 80.0k, False: 0]
  ------------------
 1456|  80.0k|        char buf[256];
 1457|  80.0k|        int32_t len = T_CString_integerToString(buf, idx, 10);
  ------------------
  |  |   67|  80.0k|#define T_CString_integerToString U_ICU_ENTRY_POINT_RENAME(T_CString_integerToString)
  |  |  ------------------
  |  |  |  |  123|  80.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  80.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  80.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1458|  80.0k|        ures_appendResPath(resB, buf, len, status);
 1459|  80.0k|        if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  80.0k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1459:12): [True: 80.0k, False: 0]
  ------------------
 1460|  80.0k|            ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|  80.0k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 1461|  80.0k|        }
 1462|  80.0k|    }
 1463|       |    /* Make sure that Purify doesn't complain about uninitialized memory copies. */
 1464|  1.30M|    {
 1465|  1.30M|        int32_t usedLen = ((resB->fResBuf == resB->fResPath) ? resB->fResPathLen : 0);
  ------------------
  |  Branch (1465:28): [True: 1.30M, False: 0]
  ------------------
 1466|  1.30M|        uprv_memset(resB->fResBuf + usedLen, 0, sizeof(resB->fResBuf) - usedLen);
  ------------------
  |  |  100|  1.30M|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  1.30M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1467|  1.30M|    }
 1468|       |
 1469|  1.30M|    resB->fVersion = nullptr;
 1470|  1.30M|    resB->fRes = r;
 1471|  1.30M|    resB->fSize = res_countArrayItems(&resB->getResData(), resB->fRes);
  ------------------
  |  |  197|  1.30M|#define res_countArrayItems U_ICU_ENTRY_POINT_RENAME(res_countArrayItems)
  |  |  ------------------
  |  |  |  |  123|  1.30M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.30M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.30M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1472|  1.30M|    ResourceTracer(resB).trace("get");
 1473|  1.30M|    return resB;
 1474|  1.30M|}
uresbund.cpp:_ZN12_GLOBAL__N_130getAliasTargetAsResourceBundleERK12ResourceDatajPKciP18UResourceDataEntryS4_iP15UResourceBundleP10UErrorCode:
 1166|   134k|        UResourceBundle *resB, UErrorCode *status) {
 1167|       |    // TODO: When an error occurs: Should we return nullptr vs. resB?
 1168|   134k|    if (U_FAILURE(*status)) { return resB; }
  ------------------
  |  Branch (1168:9): [True: 0, False: 134k]
  ------------------
 1169|   134k|    U_ASSERT(RES_GET_TYPE(r) == URES_ALIAS);
  ------------------
  |  |   35|   134k|#   define U_ASSERT(exp) (void)0
  ------------------
 1170|   134k|    int32_t len = 0;
 1171|   134k|    const char16_t *alias = res_getAlias(&resData, r, &len);
  ------------------
  |  |  199|   134k|#define res_getAlias U_ICU_ENTRY_POINT_RENAME(res_getAlias)
  |  |  ------------------
  |  |  |  |  123|   134k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   134k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   134k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1172|   134k|    if(len <= 0) {
  ------------------
  |  Branch (1172:8): [True: 0, False: 134k]
  ------------------
 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|   134k|    CharString chAlias;
 1189|   134k|    chAlias.appendInvariantChars(alias, len, *status);
 1190|   134k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1190:9): [True: 0, False: 134k]
  ------------------
 1191|      0|        return nullptr;
 1192|      0|    }
 1193|       |
 1194|       |    // We have an alias, now let's cut it up.
 1195|   134k|    const char *path = nullptr, *locale = nullptr, *keyPath = nullptr;
 1196|   134k|    if(chAlias[0] == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   134k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1196:8): [True: 134k, False: 0]
  ------------------
 1197|       |        // There is a path included.
 1198|   134k|        char *chAliasData = chAlias.data();
 1199|   134k|        char *sep = chAliasData + 1;
 1200|   134k|        path = sep;
 1201|   134k|        sep = uprv_strchr(sep, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|   134k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   134k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1202|   134k|        if(sep != nullptr) {
  ------------------
  |  Branch (1202:12): [True: 134k, False: 0]
  ------------------
 1203|   134k|            *sep++ = 0;
 1204|   134k|        }
 1205|   134k|        if(uprv_strcmp(path, "LOCALE") == 0) {
  ------------------
  |  |   38|   134k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   134k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1205:12): [True: 134k, False: 1]
  ------------------
 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|   134k|            keyPath = sep;
 1213|       |            // Read from the valid locale which we already have.
 1214|   134k|            path = locale = nullptr;
 1215|   134k|        } else {
 1216|      1|            if(uprv_strcmp(path, "ICUDATA") == 0) { /* want ICU data */
  ------------------
  |  |   38|      1|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1216:16): [True: 1, False: 0]
  ------------------
 1217|      1|                path = nullptr;
 1218|      1|            }
 1219|      1|            if (sep == nullptr) {
  ------------------
  |  Branch (1219:17): [True: 0, False: 1]
  ------------------
 1220|       |                // TODO: This ends up using the root bundle. Can/should we forbid this?
 1221|      0|                locale = "";
 1222|      1|            } else {
 1223|      1|                locale = sep;
 1224|      1|                sep = uprv_strchr(sep, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|      1|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1225|      1|                if(sep != nullptr) {
  ------------------
  |  Branch (1225:20): [True: 1, False: 0]
  ------------------
 1226|      1|                    *sep++ = 0;
 1227|      1|                }
 1228|      1|                keyPath = sep;
 1229|      1|            }
 1230|      1|        }
 1231|   134k|    } 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|   134k|    LocalUResourceBundlePointer mainRes;
 1246|   134k|    UResourceDataEntry *dataEntry;
 1247|   134k|    if (locale == nullptr) {
  ------------------
  |  Branch (1247:9): [True: 134k, False: 1]
  ------------------
 1248|       |        // alias = /LOCALE/keyPath
 1249|       |        // Read from the valid locale which we already have.
 1250|   134k|        dataEntry = validLocaleDataEntry;
 1251|   134k|    } else {
 1252|      1|        UErrorCode intStatus = U_ZERO_ERROR;
 1253|       |        // TODO: Shouldn't we use ures_open() for locale data bundles (!noFallback)?
 1254|      1|        mainRes.adoptInstead(ures_openDirect(path, locale, &intStatus));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1255|      1|        if(U_FAILURE(intStatus)) {
  ------------------
  |  Branch (1255:12): [True: 0, False: 1]
  ------------------
 1256|       |            // We failed to open the resource bundle we're aliasing to.
 1257|      0|            *status = intStatus;
 1258|      0|            return resB;
 1259|      0|        }
 1260|      1|        dataEntry = mainRes->fData;
 1261|      1|    }
 1262|       |
 1263|   134k|    const char* temp = nullptr;
 1264|   134k|    if(keyPath == nullptr) {
  ------------------
  |  Branch (1264:8): [True: 0, False: 134k]
  ------------------
 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|   134k|    } 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|   134k|        CharString pathBuf(keyPath, *status);
 1317|   134k|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1317:13): [True: 0, False: 134k]
  ------------------
 1318|      0|            return nullptr;
 1319|      0|        }
 1320|   134k|        char *myPath = pathBuf.data();
 1321|   134k|        containerResPath = nullptr;
 1322|       |        // Now we have fallback following here.
 1323|   404k|        for(;;) {
 1324|   404k|            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|   539k|            while(*myPath && U_SUCCESS(*status)) {
  ------------------
  |  Branch (1329:19): [True: 404k, False: 134k]
  |  Branch (1329:30): [True: 404k, False: 0]
  ------------------
 1330|   404k|                r = res_findResource(&(dataEntry->fData), r, &myPath, &temp);
  ------------------
  |  |  198|   404k|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|   404k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   404k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   404k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1331|   404k|                if(r == RES_BOGUS) {
  ------------------
  |  |   65|   404k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1331:20): [True: 269k, False: 134k]
  ------------------
 1332|       |                    // No resource found, we don't really want to look anymore on this level.
 1333|   269k|                    break;
 1334|   269k|                }
 1335|       |                // Found a resource, but it might be an indirection.
 1336|   134k|                resB = init_resb_result(
 1337|   134k|                    dataEntry, r, temp, -1,
 1338|   134k|                    validLocaleDataEntry, containerResPath, recursionDepth+1,
 1339|   134k|                    resB, status);
 1340|   134k|                if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1340:21): [True: 0, False: 134k]
  ------------------
 1341|      0|                    break;
 1342|      0|                }
 1343|   134k|                if (temp == nullptr || uprv_strcmp(keyPath, temp) != 0) {
  ------------------
  |  |   38|   134k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   134k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1343:21): [True: 0, False: 134k]
  |  Branch (1343:40): [True: 134k, False: 0]
  ------------------
 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|   134k|                    ures_freeResPath(resB);
 1350|   134k|                    ures_appendResPath(resB, keyPath, static_cast<int32_t>(uprv_strlen(keyPath)), status);
  ------------------
  |  |   37|   134k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   134k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1351|   134k|                    if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   134k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1351:24): [True: 134k, False: 0]
  ------------------
 1352|   134k|                        ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|   134k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 1353|   134k|                    }
 1354|   134k|                    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1354:25): [True: 0, False: 134k]
  ------------------
 1355|      0|                        break;
 1356|      0|                    }
 1357|   134k|                }
 1358|   134k|                r = resB->fRes; /* switch to a new resource, possibly a new tree */
 1359|   134k|                dataEntry = resB->fData;
 1360|   134k|                containerResPath = resB->fResPath;
 1361|   134k|            }
 1362|   404k|            if (U_FAILURE(*status) || r != RES_BOGUS) {
  ------------------
  |  |   65|   404k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1362:17): [True: 0, False: 404k]
  |  Branch (1362:39): [True: 134k, False: 269k]
  ------------------
 1363|   134k|                break;
 1364|   134k|            }
 1365|       |            // Fall back to the parent bundle, if there is one.
 1366|   269k|            dataEntry = dataEntry->fParent;
 1367|   269k|            if (dataEntry == nullptr) {
  ------------------
  |  Branch (1367:17): [True: 0, False: 269k]
  ------------------
 1368|      0|                *status = U_MISSING_RESOURCE_ERROR;
 1369|      0|                break;
 1370|      0|            }
 1371|       |            // Copy the same keyPath again.
 1372|   269k|            myPath = pathBuf.data();
 1373|   269k|            uprv_strcpy(myPath, keyPath);
  ------------------
  |  |   36|   269k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|   269k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1374|   269k|        }
 1375|   134k|    }
 1376|   134k|    if(mainRes.getAlias() == resB) {
  ------------------
  |  Branch (1376:8): [True: 0, False: 134k]
  ------------------
 1377|      0|        mainRes.orphan();
 1378|      0|    }
 1379|   134k|    ResourceTracer(resB).maybeTrace("getalias");
 1380|   134k|    return resB;
 1381|   134k|}
uresbund.cpp:_ZL21getTableItemByKeyPathPK12ResourceDatajPKc:
 2059|   634k|static Resource getTableItemByKeyPath(const ResourceData *pResData, Resource table, const char *key) {
 2060|   634k|  Resource resource = table;  /* The current resource */
 2061|   634k|  icu::CharString path;
 2062|   634k|  UErrorCode errorCode = U_ZERO_ERROR;
 2063|   634k|  path.append(key, errorCode);
 2064|   634k|  if (U_FAILURE(errorCode)) { return RES_BOGUS; }
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2064:7): [True: 0, False: 634k]
  ------------------
 2065|   634k|  char *pathPart = path.data();  /* Path from current resource to desired resource */
 2066|   634k|  UResType type = static_cast<UResType>(RES_GET_TYPE(resource)); /* the current resource type */
  ------------------
  |  |   68|   634k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2067|  1.72M|  while (*pathPart && resource != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   65|  2.88M|#define RES_BOGUS 0xffffffff
  ------------------
                while (*pathPart && resource != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   85|  1.08M|#define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   84|  2.17M|#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.01M, False: 77.3k]
  |  |  |  |  |  Branch (84:61): [True: 77.3k, 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: 1.15M, False: 565k]
  |  Branch (2067:23): [True: 1.08M, False: 69.8k]
  ------------------
 2068|  1.08M|    char *nextPathPart = uprv_strchr(pathPart, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|  1.08M|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  1.08M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2069|  1.08M|    if (nextPathPart != nullptr) {
  ------------------
  |  Branch (2069:9): [True: 573k, False: 514k]
  ------------------
 2070|   573k|      *nextPathPart = 0;  /* Terminating null for this part of path. */
 2071|   573k|      nextPathPart++;
 2072|   573k|    } else {
 2073|   514k|      nextPathPart = uprv_strchr(pathPart, 0);
  ------------------
  |  |   40|   514k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   514k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2074|   514k|    }
 2075|  1.08M|    int32_t t;
 2076|  1.08M|    const char *pathP = pathPart;
 2077|  1.08M|    resource = res_getTableItemByKey(pResData, resource, &t, &pathP);
  ------------------
  |  |  207|  1.08M|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  1.08M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.08M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.08M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2078|  1.08M|    type = static_cast<UResType>(RES_GET_TYPE(resource));
  ------------------
  |  |   68|  1.08M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2079|  1.08M|    pathPart = nextPathPart; 
 2080|  1.08M|  }
 2081|   634k|  if (*pathPart) {
  ------------------
  |  Branch (2081:7): [True: 69.8k, False: 565k]
  ------------------
 2082|  69.8k|    return RES_BOGUS;
  ------------------
  |  |   65|  69.8k|#define RES_BOGUS 0xffffffff
  ------------------
 2083|  69.8k|  }
 2084|   565k|  return resource;
 2085|   634k|}
uresbund.cpp:_ZL10createPathPKciS0_iS0_RN6icu_7810CharStringEP10UErrorCode:
 2093|   662k|                       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|   662k|    path.clear();
 2107|   662k|    const char* key = inKey;
 2108|   662k|    if (resPathLen > 0) {
  ------------------
  |  Branch (2108:9): [True: 177k, False: 484k]
  ------------------
 2109|   177k|        path.append(resPath, resPathLen, *status);
 2110|   177k|        if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (2110:13): [True: 177k, False: 0]
  ------------------
 2111|   177k|            const char* resPathLimit = resPath + resPathLen;
 2112|   177k|            const char* origResPathLimit = origResPath + origResPathLen;
 2113|   177k|            const char* resPathPtr = resPath;
 2114|   177k|            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|   355k|            while (origResPathPtr < origResPathLimit && resPathPtr < resPathLimit) {
  ------------------
  |  Branch (2118:20): [True: 177k, False: 177k]
  |  Branch (2118:57): [True: 177k, False: 0]
  ------------------
 2119|  2.66M|                while (origResPathPtr < origResPathLimit && *origResPathPtr != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  2.66M|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2119:24): [True: 2.66M, False: 0]
  |  Branch (2119:61): [True: 2.48M, False: 177k]
  ------------------
 2120|  2.48M|                    ++origResPathPtr;
 2121|  2.48M|                }
 2122|   177k|                if (origResPathPtr < origResPathLimit && *origResPathPtr == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   177k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2122:21): [True: 177k, False: 0]
  |  Branch (2122:58): [True: 177k, False: 0]
  ------------------
 2123|   177k|                    ++origResPathPtr;
 2124|   177k|                }
 2125|  2.66M|                while (resPathPtr < resPathLimit && *resPathPtr != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  2.66M|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2125:24): [True: 2.66M, False: 0]
  |  Branch (2125:53): [True: 2.48M, False: 177k]
  ------------------
 2126|  2.48M|                    ++resPathPtr;
 2127|  2.48M|                }
 2128|   177k|                if (resPathPtr < resPathLimit && *resPathPtr == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   177k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2128:21): [True: 177k, False: 0]
  |  Branch (2128:50): [True: 177k, False: 0]
  ------------------
 2129|   177k|                    ++resPathPtr;
 2130|   177k|                }
 2131|   177k|            }
 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|   177k|            while (resPathPtr < resPathLimit && *key != '\0') {
  ------------------
  |  Branch (2135:20): [True: 0, False: 177k]
  |  Branch (2135:49): [True: 0, False: 0]
  ------------------
 2136|      0|                while (resPathPtr < resPathLimit && *resPathPtr != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|      0|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2136:24): [True: 0, False: 0]
  |  Branch (2136:53): [True: 0, False: 0]
  ------------------
 2137|      0|                    ++resPathPtr;
 2138|      0|                }
 2139|      0|                if (resPathPtr < resPathLimit && *resPathPtr == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|      0|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2139:21): [True: 0, False: 0]
  |  Branch (2139:50): [True: 0, False: 0]
  ------------------
 2140|      0|                    ++resPathPtr;
 2141|      0|                }
 2142|      0|                while (*key != '\0' && *key != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|      0|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2142:24): [True: 0, False: 0]
  |  Branch (2142:40): [True: 0, False: 0]
  ------------------
 2143|      0|                    ++key;
 2144|      0|                }
 2145|      0|                if (*key == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|      0|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2145:21): [True: 0, False: 0]
  ------------------
 2146|      0|                    ++key;
 2147|      0|                }
 2148|      0|            }
 2149|   177k|        }
 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|   177k|        path.append(key, *status);
 2155|   484k|    } else {
 2156|   484k|        path.append(inKey, *status);
 2157|   484k|    }
 2158|   662k|}
uresbund.cpp:_ZL16ures_freeResPathP15UResourceBundle:
 1113|  2.11M|static void ures_freeResPath(UResourceBundle *resB) {
 1114|  2.11M|    if (resB->fResPath && resB->fResPath != resB->fResBuf) {
  ------------------
  |  Branch (1114:9): [True: 1.52M, False: 593k]
  |  Branch (1114:27): [True: 0, False: 1.52M]
  ------------------
 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|  2.11M|    resB->fResPath = nullptr;
 1118|  2.11M|    resB->fResPathLen = 0;
 1119|  2.11M|}
uresbund.cpp:_ZN12_GLOBAL__N_118GetAllChildrenSinkC2ERN6icu_7812ResourceSinkE:
 2337|  6.12k|        : dest(dest) {}
uresbund.cpp:_ZN12_GLOBAL__N_118GetAllChildrenSink3putEPKcRN6icu_7813ResourceValueEaR10UErrorCode:
 2340|  12.2k|           UErrorCode &errorCode) override {
 2341|  12.2k|        ResourceTable itemsTable = value.getTable(errorCode);
 2342|  12.2k|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2342:13): [True: 0, False: 12.2k]
  ------------------
 2343|   518k|        for (int32_t i = 0; itemsTable.getKeyAndValue(i, key, value); ++i) {
  ------------------
  |  Branch (2343:29): [True: 506k, False: 12.2k]
  ------------------
 2344|   506k|            if (value.getType() == URES_ALIAS) {
  ------------------
  |  Branch (2344:17): [True: 89.8k, False: 416k]
  ------------------
 2345|  89.8k|                ResourceDataValue& rdv = static_cast<ResourceDataValue&>(value);
 2346|  89.8k|                StackUResourceBundle stackTempBundle;
 2347|  89.8k|                UResourceBundle* aliasRB = getAliasTargetAsResourceBundle(rdv.getData(), rdv.getResource(), nullptr, -1,
 2348|  89.8k|                                                                          rdv.getValidLocaleDataEntry(), nullptr, 0,
 2349|  89.8k|                                                                          stackTempBundle.getAlias(), &errorCode);
 2350|  89.8k|                if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (2350:21): [True: 89.8k, False: 0]
  ------------------
 2351|  89.8k|                    ResourceDataValue aliasedValue;
 2352|  89.8k|                    aliasedValue.setData(aliasRB->getResData());
 2353|  89.8k|                    aliasedValue.setValidLocaleDataEntry(aliasRB->fValidLocaleDataEntry);
 2354|  89.8k|                    aliasedValue.setResource(aliasRB->fRes, ResourceTracer(aliasRB));
 2355|       |                    
 2356|  89.8k|                    if (aliasedValue.getType() != URES_TABLE) {
  ------------------
  |  Branch (2356:25): [True: 0, False: 89.8k]
  ------------------
 2357|      0|                        dest.put(key, aliasedValue, isRoot, errorCode);
 2358|  89.8k|                    } 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|  89.8k|                        UResType aliasedValueType = URES_TABLE;
 2366|  89.8k|                        CharString tablePath;
 2367|  89.8k|                        tablePath.append(aliasRB->fResPath, errorCode);
 2368|  89.8k|                        const char* parentKey = key; // dest.put() changes the key
 2369|  89.8k|                        dest.put(parentKey, aliasedValue, isRoot, errorCode);
 2370|  89.8k|                        UResourceDataEntry* entry = aliasRB->fData;
 2371|  89.8k|                        Resource res = aliasRB->fRes;
 2372|   224k|                        while (aliasedValueType == URES_TABLE && entry->fParent != nullptr) {
  ------------------
  |  Branch (2372:32): [True: 224k, False: 0]
  |  Branch (2372:66): [True: 134k, False: 89.8k]
  ------------------
 2373|   134k|                            CharString localPath;
 2374|   134k|                            localPath.copyFrom(tablePath, errorCode);
 2375|   134k|                            char* localPathAsCharPtr = localPath.data();
 2376|   134k|                            const char* childKey;
 2377|   134k|                            entry = entry->fParent;
 2378|   134k|                            res = entry->fData.rootRes;
 2379|   134k|                            Resource newRes = res_findResource(&entry->fData, res, &localPathAsCharPtr, &childKey);
  ------------------
  |  |  198|   134k|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|   134k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   134k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   134k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2380|   134k|                            if (newRes != RES_BOGUS) {
  ------------------
  |  |   65|   134k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2380:33): [True: 134k, False: 0]
  ------------------
 2381|   134k|                                aliasedValue.setData(entry->fData);
 2382|       |                                // TODO: do I also need to call aliasedValue.setValueLocaleDataEntry() ?
 2383|   134k|                                aliasedValue.setResource(newRes, ResourceTracer(aliasRB)); // probably wrong to use aliasRB here
 2384|   134k|                                aliasedValueType = aliasedValue.getType();
 2385|   134k|                                if (aliasedValueType == URES_ALIAS) {
  ------------------
  |  Branch (2385:37): [True: 44.9k, False: 89.8k]
  ------------------
 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|  44.9k|                                    ResourceDataValue& rdv2 = static_cast<ResourceDataValue&>(aliasedValue);
 2392|  44.9k|                                    aliasRB = getAliasTargetAsResourceBundle(rdv2.getData(), rdv2.getResource(), nullptr, -1,
 2393|  44.9k|                                                                             rdv2.getValidLocaleDataEntry(), nullptr, 0,
 2394|  44.9k|                                                                             stackTempBundle.getAlias(), &errorCode);
 2395|  44.9k|                                    tablePath.clear();
 2396|  44.9k|                                    tablePath.append(aliasRB->fResPath, errorCode);
 2397|  44.9k|                                    entry = aliasRB->fData;
 2398|  44.9k|                                    res = aliasRB->fRes;
 2399|  44.9k|                                    aliasedValue.setData(entry->fData);
 2400|       |                                    // TODO: do I also need to call aliasedValue.setValueLocaleDataEntry() ?
 2401|  44.9k|                                    aliasedValue.setResource(res, ResourceTracer(aliasRB)); // probably wrong to use aliasRB here
 2402|  44.9k|                                    aliasedValueType = aliasedValue.getType();
 2403|  44.9k|                                }
 2404|   134k|                                if (aliasedValueType == URES_TABLE) {
  ------------------
  |  Branch (2404:37): [True: 134k, False: 0]
  ------------------
 2405|   134k|                                    dest.put(parentKey, aliasedValue, isRoot, errorCode);
 2406|   134k|                                } 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|   134k|                            }
 2413|   134k|                        }
 2414|  89.8k|                    }
 2415|  89.8k|                }
 2416|   416k|            } else {
 2417|   416k|                dest.put(key, value, isRoot, errorCode);
 2418|   416k|            }
 2419|   506k|            if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2419:17): [True: 0, False: 506k]
  ------------------
 2420|   506k|        }
 2421|  12.2k|    }
uresbund.cpp:_ZN12_GLOBAL__N_123getAllItemsWithFallbackEPK15UResourceBundleRN6icu_7817ResourceDataValueERNS3_12ResourceSinkER10UErrorCode:
 2278|   211k|        ResourceSink &sink, UErrorCode &errorCode) {
 2279|   211k|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2279:9): [True: 0, False: 211k]
  ------------------
 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|   211k|    value.setData(bundle->getResData());
 2291|   211k|    value.setValidLocaleDataEntry(bundle->fValidLocaleDataEntry);
 2292|   211k|    UResourceDataEntry *parentEntry = bundle->fData->fParent;
 2293|   211k|    UBool hasParent = parentEntry != nullptr && U_SUCCESS(parentEntry->fBogus);
  ------------------
  |  Branch (2293:23): [True: 95.0k, False: 116k]
  |  Branch (2293:49): [True: 95.0k, False: 0]
  ------------------
 2294|   211k|    value.setResource(bundle->fRes, ResourceTracer(bundle));
 2295|   211k|    sink.put(bundle->fKey, value, !hasParent, errorCode);
 2296|   211k|    if (hasParent) {
  ------------------
  |  Branch (2296:9): [True: 95.0k, False: 116k]
  ------------------
 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|  95.0k|        StackUResourceBundle parentBundle;
 2306|  95.0k|        UResourceBundle &parentRef = parentBundle.ref();
 2307|  95.0k|        parentRef.fData = parentEntry;
 2308|  95.0k|        parentRef.fValidLocaleDataEntry = bundle->fValidLocaleDataEntry;
 2309|  95.0k|        parentRef.fHasFallback = !parentRef.getResData().noFallback;
 2310|  95.0k|        parentRef.fIsTopLevel = true;
 2311|  95.0k|        parentRef.fRes = parentRef.getResData().rootRes;
 2312|  95.0k|        parentRef.fSize = res_countArrayItems(&parentRef.getResData(), parentRef.fRes);
  ------------------
  |  |  197|  95.0k|#define res_countArrayItems U_ICU_ENTRY_POINT_RENAME(res_countArrayItems)
  |  |  ------------------
  |  |  |  |  123|  95.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  95.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  95.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2313|  95.0k|        parentRef.fIndex = -1;
 2314|  95.0k|        entryIncrease(parentEntry);
 2315|       |
 2316|       |        // Look up the container item in the parent bundle.
 2317|  95.0k|        StackUResourceBundle containerBundle;
 2318|  95.0k|        const UResourceBundle *rb;
 2319|  95.0k|        UErrorCode pathErrorCode = U_ZERO_ERROR;  // Ignore if parents up to root do not have this path.
 2320|  95.0k|        if (bundle->fResPath == nullptr || *bundle->fResPath == 0) {
  ------------------
  |  Branch (2320:13): [True: 0, False: 95.0k]
  |  Branch (2320:44): [True: 0, False: 95.0k]
  ------------------
 2321|      0|            rb = parentBundle.getAlias();
 2322|  95.0k|        } else {
 2323|  95.0k|            rb = ures_getByKeyWithFallback(parentBundle.getAlias(), bundle->fResPath,
  ------------------
  |  | 1662|  95.0k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  95.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  95.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  95.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2324|  95.0k|                                           containerBundle.getAlias(), &pathErrorCode);
 2325|  95.0k|        }
 2326|  95.0k|        if (U_SUCCESS(pathErrorCode)) {
  ------------------
  |  Branch (2326:13): [True: 95.0k, False: 0]
  ------------------
 2327|  95.0k|            getAllItemsWithFallback(rb, value, sink, errorCode);
 2328|  95.0k|        }
 2329|  95.0k|    }
 2330|   211k|}
uresbund.cpp:_ZL15getFallbackDataPK15UResourceBundlePPKcPjP10UErrorCode:
  319|  42.9k|        const char **resTag, Resource *res, UErrorCode *status) {
  320|  42.9k|    UResourceDataEntry *dataEntry = resBundle->fData;
  321|  42.9k|    int32_t indexR = -1;
  322|  42.9k|    int32_t i = 0;
  323|  42.9k|    *res = RES_BOGUS;
  ------------------
  |  |   65|  42.9k|#define RES_BOGUS 0xffffffff
  ------------------
  324|  42.9k|    if(dataEntry == nullptr) {
  ------------------
  |  Branch (324:8): [True: 0, False: 42.9k]
  ------------------
  325|      0|        *status = U_MISSING_RESOURCE_ERROR;
  326|      0|        return nullptr;
  327|      0|    }
  328|  42.9k|    if(dataEntry->fBogus == U_ZERO_ERROR) { /* if this resource is real, */
  ------------------
  |  Branch (328:8): [True: 42.9k, False: 0]
  ------------------
  329|  42.9k|        *res = res_getTableItemByKey(&(dataEntry->fData), dataEntry->fData.rootRes, &indexR, resTag); /* try to get data from there */
  ------------------
  |  |  207|  42.9k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  42.9k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  42.9k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  42.9k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|  42.9k|        i++;
  331|  42.9k|    }
  332|  42.9k|    if(resBundle->fHasFallback) {
  ------------------
  |  Branch (332:8): [True: 42.9k, False: 0]
  ------------------
  333|       |        // Otherwise, we'll look in parents.
  334|   120k|        while(*res == RES_BOGUS && dataEntry->fParent != nullptr) {
  ------------------
  |  |   65|   241k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (334:15): [True: 102k, False: 18.3k]
  |  Branch (334:36): [True: 77.6k, False: 24.5k]
  ------------------
  335|  77.6k|            dataEntry = dataEntry->fParent;
  336|  77.6k|            if(dataEntry->fBogus == U_ZERO_ERROR) {
  ------------------
  |  Branch (336:16): [True: 77.6k, False: 0]
  ------------------
  337|  77.6k|                i++;
  338|  77.6k|                *res = res_getTableItemByKey(&(dataEntry->fData), dataEntry->fData.rootRes, &indexR, resTag);
  ------------------
  |  |  207|  77.6k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  77.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  77.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  77.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  339|  77.6k|            }
  340|  77.6k|        }
  341|  42.9k|    }
  342|       |
  343|  42.9k|    if(*res == RES_BOGUS) {
  ------------------
  |  |   65|  42.9k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (343:8): [True: 24.5k, False: 18.3k]
  ------------------
  344|       |        // If the resource is not found, we need to give an error.
  345|  24.5k|        *status = U_MISSING_RESOURCE_ERROR;
  346|  24.5k|        return nullptr;
  347|  24.5k|    }
  348|       |    // If the resource is found in parents, we need to adjust the error.
  349|  18.3k|    if(i>1) {
  ------------------
  |  Branch (349:8): [True: 18.3k, False: 0]
  ------------------
  350|  18.3k|        if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|  18.3k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  18.3k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                      if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|  18.3k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  18.3k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (350:12): [True: 0, False: 18.3k]
  |  Branch (350:67): [True: 0, False: 18.3k]
  ------------------
  351|      0|            *status = U_USING_DEFAULT_WARNING;
  352|  18.3k|        } else {
  353|  18.3k|            *status = U_USING_FALLBACK_WARNING;
  354|  18.3k|        }
  355|  18.3k|    }
  356|  18.3k|    return dataEntry;
  357|  42.9k|}
uresbund.cpp:_ZL17ures_openWithTypeP15UResourceBundlePKcS2_12UResOpenTypeP10UErrorCode:
 2712|   541k|                  UResOpenType openType, UErrorCode* status) {
 2713|   541k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (2713:8): [True: 0, False: 541k]
  ------------------
 2714|      0|        return nullptr;
 2715|      0|    }
 2716|       |
 2717|   541k|    UResourceDataEntry *entry;
 2718|   541k|    if(openType != URES_OPEN_DIRECT) {
  ------------------
  |  Branch (2718:8): [True: 409k, False: 131k]
  ------------------
 2719|   409k|        if (localeID == nullptr) {
  ------------------
  |  Branch (2719:13): [True: 0, False: 409k]
  ------------------
 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|   409k|        CharString canonLocaleID = ulocimp_getBaseName(localeID, *status);
  ------------------
  |  | 1199|   409k|#define ulocimp_getBaseName U_ICU_ENTRY_POINT_RENAME(ulocimp_getBaseName)
  |  |  ------------------
  |  |  |  |  123|   409k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   409k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   409k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2724|   409k|        if(U_FAILURE(*status)) {
  ------------------
  |  Branch (2724:12): [True: 0, False: 409k]
  ------------------
 2725|      0|            *status = U_ILLEGAL_ARGUMENT_ERROR;
 2726|      0|            return nullptr;
 2727|      0|        }
 2728|   409k|        entry = entryOpen(path, canonLocaleID.data(), openType, status);
 2729|   409k|    } else {
 2730|   131k|        entry = entryOpenDirect(path, localeID, status);
 2731|   131k|    }
 2732|   541k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (2732:8): [True: 0, False: 541k]
  ------------------
 2733|      0|        return nullptr;
 2734|      0|    }
 2735|   541k|    if(entry == nullptr) {
  ------------------
  |  Branch (2735:8): [True: 0, False: 541k]
  ------------------
 2736|      0|        *status = U_MISSING_RESOURCE_ERROR;
 2737|      0|        return nullptr;
 2738|      0|    }
 2739|       |
 2740|   541k|    UBool isStackObject;
 2741|   541k|    if(r == nullptr) {
  ------------------
  |  Branch (2741:8): [True: 541k, False: 0]
  ------------------
 2742|   541k|        r = static_cast<UResourceBundle*>(uprv_malloc(sizeof(UResourceBundle)));
  ------------------
  |  | 1524|   541k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|   541k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   541k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   541k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2743|   541k|        if(r == nullptr) {
  ------------------
  |  Branch (2743:12): [True: 0, False: 541k]
  ------------------
 2744|      0|            entryClose(entry);
 2745|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
 2746|      0|            return nullptr;
 2747|      0|        }
 2748|   541k|        isStackObject = false;
 2749|   541k|    } else {  // fill-in
 2750|      0|        isStackObject = ures_isStackObject(r);
 2751|      0|        ures_closeBundle(r, false);
 2752|      0|    }
 2753|   541k|    uprv_memset(r, 0, sizeof(UResourceBundle));
  ------------------
  |  |  100|   541k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|   541k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2754|   541k|    ures_setIsStackObject(r, isStackObject);
 2755|       |
 2756|   541k|    r->fValidLocaleDataEntry = r->fData = entry;
 2757|   541k|    r->fHasFallback = openType != URES_OPEN_DIRECT && !r->getResData().noFallback;
  ------------------
  |  Branch (2757:23): [True: 409k, False: 131k]
  |  Branch (2757:55): [True: 409k, False: 0]
  ------------------
 2758|   541k|    r->fIsTopLevel = true;
 2759|   541k|    r->fRes = r->getResData().rootRes;
 2760|   541k|    r->fSize = res_countArrayItems(&r->getResData(), r->fRes);
  ------------------
  |  |  197|   541k|#define res_countArrayItems U_ICU_ENTRY_POINT_RENAME(res_countArrayItems)
  |  |  ------------------
  |  |  |  |  123|   541k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   541k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   541k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2761|   541k|    r->fIndex = -1;
 2762|       |
 2763|   541k|    ResourceTracer(r).traceOpen();
 2764|       |
 2765|   541k|    return r;
 2766|   541k|}
uresbund.cpp:_ZL9entryOpenPKcS0_12UResOpenTypeP10UErrorCode:
  812|   409k|                                     UResOpenType openType, UErrorCode* status) {
  813|   409k|    U_ASSERT(openType != URES_OPEN_DIRECT);
  ------------------
  |  |   35|   409k|#   define U_ASSERT(exp) (void)0
  ------------------
  814|   409k|    UErrorCode intStatus = U_ZERO_ERROR;
  815|   409k|    UResourceDataEntry *r = nullptr;
  816|   409k|    UResourceDataEntry *t1 = nullptr;
  817|   409k|    UBool isDefault = false;
  818|   409k|    UBool isRoot = false;
  819|   409k|    UBool hasRealData = false;
  820|   409k|    UBool hasChopped = true;
  821|   409k|    UBool usingUSRData = U_USE_USRDATA && ( path == nullptr || uprv_strncmp(path,U_ICUDATA_NAME,8) == 0);
  ------------------
  |  |  157|   819k|#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|   409k|    char name[ULOC_FULLNAME_CAPACITY];
  824|   409k|    char usrDataPath[96];
  825|       |
  826|   409k|    initCache(status);
  827|       |
  828|   409k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (828:8): [True: 0, False: 409k]
  ------------------
  829|      0|        return nullptr;
  830|      0|    }
  831|       |
  832|   409k|    uprv_strncpy(name, localeID, sizeof(name) - 1);
  ------------------
  |  |   43|   409k|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|   409k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  833|   409k|    name[sizeof(name) - 1] = 0;
  834|       |
  835|   409k|    if ( usingUSRData ) {
  ------------------
  |  Branch (835:10): [True: 0, False: 409k]
  ------------------
  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|   409k|    const char *defaultLocale = uloc_getDefault();
  ------------------
  |  | 1118|   409k|#define uloc_getDefault U_ICU_ENTRY_POINT_RENAME(uloc_getDefault)
  |  |  ------------------
  |  |  |  |  123|   409k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   409k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   409k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  849|       |
  850|   409k|    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|   409k|    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|   409k|    if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (856:9): [True: 0, False: 409k]
  ------------------
  857|      0|        *status = intStatus;
  858|      0|        goto finish;
  859|      0|    }
  860|       |
  861|   409k|    if(r != nullptr) { /* if there is one real locale, we can look for parents. */
  ------------------
  |  Branch (861:8): [True: 409k, False: 0]
  ------------------
  862|   409k|        t1 = r;
  863|   409k|        hasRealData = true;
  864|   409k|        if ( usingUSRData ) {  /* This code inserts user override data into the inheritance chain */
  ------------------
  |  Branch (864:14): [True: 0, False: 409k]
  ------------------
  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|   409k|        if ((hasChopped || mayHaveParent(name)) && !isRoot) {
  ------------------
  |  Branch (882:14): [True: 242k, False: 166k]
  |  Branch (882:28): [True: 0, False: 166k]
  |  Branch (882:52): [True: 242k, False: 0]
  ------------------
  883|   242k|            if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) {
  ------------------
  |  |   99|   242k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (883:17): [True: 0, False: 242k]
  ------------------
  884|      0|                goto finish;
  885|      0|            }
  886|   242k|        }
  887|   409k|    }
  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|   409k|    if(r==nullptr && openType == URES_OPEN_LOCALE_DEFAULT_ROOT && !isDefault && !isRoot) {
  ------------------
  |  Branch (891:8): [True: 0, False: 409k]
  |  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|   409k|    if(r == nullptr) {
  ------------------
  |  Branch (916:8): [True: 0, False: 409k]
  ------------------
  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|   409k|    } else if(!isRoot && uprv_strcmp(t1->fName, kRootLocaleName) != 0 &&
  ------------------
  |  |   38|   405k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   405k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (932:15): [True: 405k, False: 4.08k]
  |  Branch (932:26): [True: 405k, False: 0]
  ------------------
  933|   409k|            t1->fParent == nullptr && !r->fData.noFallback) {
  ------------------
  |  Branch (933:13): [True: 3, False: 405k]
  |  Branch (933:39): [True: 3, False: 0]
  ------------------
  934|      3|        if (!insertRootBundle(t1, status)) {
  ------------------
  |  Branch (934:13): [True: 0, False: 3]
  ------------------
  935|      0|            goto finish;
  936|      0|        }
  937|      3|        if(!hasRealData) {
  ------------------
  |  Branch (937:12): [True: 0, False: 3]
  ------------------
  938|      0|            r->fBogus = U_USING_DEFAULT_WARNING;
  939|      0|        }
  940|      3|    }
  941|       |
  942|       |    // TODO: Does this ever loop?
  943|  1.29M|    while(r != nullptr && !isRoot && t1->fParent != nullptr) {
  ------------------
  |  Branch (943:11): [True: 1.29M, False: 0]
  |  Branch (943:27): [True: 1.28M, False: 4.08k]
  |  Branch (943:38): [True: 883k, False: 405k]
  ------------------
  944|   883k|        t1->fParent->fCountExisting++;
  945|   883k|        t1 = t1->fParent;
  946|   883k|    }
  947|       |
  948|   409k|finish:
  949|   409k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (949:8): [True: 409k, False: 0]
  ------------------
  950|   409k|        if(intStatus != U_ZERO_ERROR) {
  ------------------
  |  Branch (950:12): [True: 154k, False: 255k]
  ------------------
  951|   154k|            *status = intStatus;  
  952|   154k|        }
  953|   409k|        return r;
  954|   409k|    } else {
  955|      0|        return nullptr;
  956|      0|    }
  957|   409k|}
uresbund.cpp:_ZL9initCacheP10UErrorCode:
  483|   541k|static void initCache(UErrorCode *status) {
  484|   541k|    umtx_initOnce(gCacheInitOnce, &createCache, *status);
  485|   541k|}
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|  1.00M|static int32_t U_CALLCONV hashEntry(const UHashTok parm) {
   59|  1.00M|    UResourceDataEntry* b = static_cast<UResourceDataEntry*>(parm.pointer);
   60|  1.00M|    UHashTok namekey, pathkey;
   61|  1.00M|    namekey.pointer = b->fName;
   62|  1.00M|    pathkey.pointer = b->fPath;
   63|  1.00M|    return uhash_hashChars(namekey)+37u*uhash_hashChars(pathkey);
  ------------------
  |  | 1011|  1.00M|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  123|  1.00M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.00M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.00M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return uhash_hashChars(namekey)+37u*uhash_hashChars(pathkey);
  ------------------
  |  | 1011|  1.00M|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  123|  1.00M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.00M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.00M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   64|  1.00M|}
uresbund.cpp:_ZL14compareEntries8UElementS_:
   67|  1.00M|static UBool U_CALLCONV compareEntries(const UHashTok p1, const UHashTok p2) {
   68|  1.00M|    UResourceDataEntry* b1 = static_cast<UResourceDataEntry*>(p1.pointer);
   69|  1.00M|    UResourceDataEntry* b2 = static_cast<UResourceDataEntry*>(p2.pointer);
   70|  1.00M|    UHashTok name1, name2, path1, path2;
   71|  1.00M|    name1.pointer = b1->fName;
   72|  1.00M|    name2.pointer = b2->fName;
   73|  1.00M|    path1.pointer = b1->fPath;
   74|  1.00M|    path2.pointer = b2->fPath;
   75|  1.00M|    return uhash_compareChars(name1, name2) && uhash_compareChars(path1, path2);
  ------------------
  |  |  993|  1.00M|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|  1.00M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.00M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.00M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return uhash_compareChars(name1, name2) && uhash_compareChars(path1, path2);
  ------------------
  |  |  993|  1.00M|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|  1.00M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.00M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.00M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (75:12): [True: 1.00M, False: 0]
  |  Branch (75:48): [True: 1.00M, False: 0]
  ------------------
   76|  1.00M|}
uresbund.cpp:_ZL17findFirstExistingPKcPcS0_12UResOpenTypePaS3_S3_P10UErrorCode:
  665|   409k|                  UBool *isRoot, UBool *foundParent, UBool *isDefault, UErrorCode* status) {
  666|   409k|    UResourceDataEntry *r = nullptr;
  667|   409k|    UBool hasRealData = false;
  668|   409k|    *foundParent = true; /* we're starting with a fresh name */
  669|   409k|    char origName[ULOC_FULLNAME_CAPACITY];
  670|       |
  671|   409k|    uprv_strcpy(origName, name);
  ------------------
  |  |   36|   409k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|   409k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  672|  1.28M|    while(*foundParent && !hasRealData) {
  ------------------
  |  Branch (672:11): [True: 1.11M, False: 166k]
  |  Branch (672:27): [True: 873k, False: 242k]
  ------------------
  673|   873k|        r = init_entry(name, path, status);
  674|       |        /* Null pointer test */
  675|   873k|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (675:13): [True: 0, False: 873k]
  ------------------
  676|      0|            return nullptr;
  677|      0|        }
  678|   873k|        *isDefault = static_cast<UBool>(uprv_strncmp(name, defaultLocale, uprv_strlen(name)) == 0);
  ------------------
  |  |   44|   873k|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|   873k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  679|   873k|        hasRealData = static_cast<UBool>(r->fBogus == U_ZERO_ERROR);
  680|   873k|        if(!hasRealData) {
  ------------------
  |  Branch (680:12): [True: 463k, False: 409k]
  ------------------
  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|   463k|            r->fCountExisting--;
  687|       |            /*entryCloseInt(r);*/
  688|   463k|            r = nullptr;
  689|   463k|            *status = U_USING_FALLBACK_WARNING;
  690|   463k|        } else {
  691|   409k|            uprv_strcpy(name, r->fName); /* this is needed for supporting aliases */
  ------------------
  |  |   36|   409k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|   409k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  692|   409k|        }
  693|       |
  694|   873k|        *isRoot = static_cast<UBool>(uprv_strcmp(name, kRootLocaleName) == 0);
  ------------------
  |  |   38|   873k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   873k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  695|       |
  696|       |        /*Fallback data stuff*/
  697|   873k|        if (!hasRealData) {
  ------------------
  |  Branch (697:13): [True: 463k, False: 409k]
  ------------------
  698|   463k|            *foundParent = getParentLocaleID(name, origName, openType);
  699|   463k|        } 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|   409k|            *foundParent = chopLocale(name);
  703|   409k|        }
  704|   873k|        if (*foundParent && *name == '\0') {
  ------------------
  |  Branch (704:13): [True: 706k, False: 166k]
  |  Branch (704:29): [True: 0, False: 706k]
  ------------------
  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|   873k|    }
  708|   409k|    return r;
  709|   409k|}
uresbund.cpp:_ZL17getParentLocaleIDPcPKc12UResOpenType:
  211|   463k|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|   463k|    size_t nameLen = uprv_strlen(name);
  ------------------
  |  |   37|   463k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   463k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  214|   463k|    if (!nameLen || name[nameLen - 1] == '_' || hasVariant(name)) {
  ------------------
  |  Branch (214:9): [True: 0, False: 463k]
  |  Branch (214:21): [True: 0, False: 463k]
  |  Branch (214:49): [True: 154k, False: 309k]
  ------------------
  215|   154k|        return chopLocale(name);
  216|   154k|    }
  217|       |    
  218|   309k|    UErrorCode err = U_ZERO_ERROR;
  219|   309k|    CharString language;
  220|   309k|    CharString script;
  221|   309k|    CharString region;
  222|   309k|    ulocimp_getSubtags(name, &language, &script, &region, nullptr, nullptr, err);
  ------------------
  |  | 1209|   309k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|   309k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   309k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   309k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|       |
  224|   309k|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (224:9): [True: 0, False: 309k]
  ------------------
  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|   309k|    if (openType == URES_OPEN_LOCALE_DEFAULT_ROOT) {
  ------------------
  |  Branch (234:9): [True: 309k, False: 0]
  ------------------
  235|   309k|        const char* parentID = performFallbackLookup(name, parentLocaleChars, parentLocaleChars, parentLocaleTable, UPRV_LENGTHOF(parentLocaleTable));
  ------------------
  |  |   99|   309k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  236|   309k|        if (parentID != nullptr) {
  ------------------
  |  Branch (236:13): [True: 0, False: 309k]
  ------------------
  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|   309k|    }
  241|       |
  242|   309k|    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|   309k|    if (!script.isEmpty() && !region.isEmpty()) {
  ------------------
  |  Branch (246:9): [True: 154k, False: 154k]
  |  Branch (246:30): [True: 0, False: 154k]
  ------------------
  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|      0|        if (getDefaultScript(language, region) == script) {
  ------------------
  |  Branch (250:13): [True: 0, False: 0]
  ------------------
  251|      0|            workingLocale.append(language, err).append("_", err).append(region, err);
  252|      0|        } else {
  253|      0|            workingLocale.append(language, err).append("_", err).append(script, err);
  254|      0|        }
  255|   309k|    } else if (!region.isEmpty()) {
  ------------------
  |  Branch (255:16): [True: 154k, False: 154k]
  ------------------
  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|   154k|        UErrorCode err = U_ZERO_ERROR;
  260|   154k|        CharString origNameLanguage;
  261|   154k|        CharString origNameScript;
  262|   154k|        ulocimp_getSubtags(origName, &origNameLanguage, &origNameScript, nullptr, nullptr, nullptr, err);
  ------------------
  |  | 1209|   154k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|   154k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   154k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   154k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  263|   154k|        if (!origNameScript.isEmpty()) {
  ------------------
  |  Branch (263:13): [True: 0, False: 154k]
  ------------------
  264|      0|            workingLocale.append(language, err).append("_", err).append(origNameScript, err);
  265|   154k|        } else {
  266|   154k|            workingLocale.append(language, err).append("_", err).append(getDefaultScript(language, region), err);
  267|   154k|        }
  268|   154k|    } else if (!script.isEmpty()) {
  ------------------
  |  Branch (268:16): [True: 154k, 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|   154k|        if (openType != URES_OPEN_LOCALE_DEFAULT_ROOT || getDefaultScript(language, CharString()) == script) {
  ------------------
  |  Branch (275:13): [True: 0, False: 154k]
  |  Branch (275:13): [True: 154k, False: 0]
  |  Branch (275:58): [True: 154k, False: 0]
  ------------------
  276|   154k|            workingLocale.append(language, err);
  277|   154k|        } else {
  278|      0|            return false;
  279|      0|        }
  280|   154k|    } 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|   309k|    if (U_SUCCESS(err) && !workingLocale.isEmpty()) {
  ------------------
  |  Branch (284:9): [True: 309k, False: 0]
  |  Branch (284:27): [True: 309k, False: 0]
  ------------------
  285|   309k|        uprv_strcpy(name, workingLocale.data());
  ------------------
  |  |   36|   309k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|   309k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  286|   309k|        return true;
  287|   309k|    } else {
  288|      0|        return false;
  289|      0|    }
  290|   309k|}
uresbund.cpp:_ZL10hasVariantPKc:
   94|   463k|static UBool hasVariant(const char* localeID) {
   95|   463k|    UErrorCode err = U_ZERO_ERROR;
   96|   463k|    CheckedArrayByteSink sink(nullptr, 0);
   97|   463k|    ulocimp_getSubtags(
  ------------------
  |  | 1209|   463k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|   463k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   463k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   463k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|   463k|            localeID,
   99|   463k|            nullptr,
  100|   463k|            nullptr,
  101|   463k|            nullptr,
  102|   463k|            &sink,
  103|   463k|            nullptr,
  104|   463k|            err);
  105|   463k|    return sink.NumberOfBytesAppended() != 0;
  106|   463k|}
uresbund.cpp:_ZL21performFallbackLookupPKcS0_S0_PKii:
  118|   772k|                                         int32_t lookupTableLength) {
  119|   772k|    const int32_t* bottom = lookupTable;
  120|   772k|    const int32_t* top = lookupTable + lookupTableLength;
  121|       |
  122|  7.72M|    while (bottom < top) {
  ------------------
  |  Branch (122:12): [True: 6.95M, False: 772k]
  ------------------
  123|       |        // Effectively, divide by 2 and round down to an even index
  124|  6.95M|        const int32_t* middle = bottom + (((top - bottom) / 4) * 2);
  125|  6.95M|        const char* entryKey = &(keyStrs[*middle]);
  126|  6.95M|        int32_t strcmpResult = uprv_strcmp(key, entryKey);
  ------------------
  |  |   38|  6.95M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  6.95M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  127|  6.95M|        if (strcmpResult == 0) {
  ------------------
  |  Branch (127:13): [True: 0, False: 6.95M]
  ------------------
  128|      0|            return &(valueStrs[middle[1]]);
  129|  6.95M|        } else if (strcmpResult < 0) {
  ------------------
  |  Branch (129:20): [True: 4.17M, False: 2.78M]
  ------------------
  130|  4.17M|            top = middle;
  131|  4.17M|        } else {
  132|  2.78M|            bottom = middle + 2;
  133|  2.78M|        }
  134|  6.95M|    }
  135|   772k|    return nullptr;
  136|   772k|}
uresbund.cpp:_ZL16getDefaultScriptRKN6icu_7810CharStringES2_:
  138|   309k|static CharString getDefaultScript(const CharString& language, const CharString& region) {
  139|   309k|    const char* defaultScript = nullptr;
  140|   309k|    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|   309k|    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|   309k|    if (!region.isEmpty()) {
  ------------------
  |  Branch (147:9): [True: 154k, False: 154k]
  ------------------
  148|   154k|        CharString localeID;
  149|   154k|        localeID.append(language, err).append("_", err).append(region, err);
  150|   154k|        if (U_FAILURE(err)) {
  ------------------
  |  Branch (150:13): [True: 0, False: 154k]
  ------------------
  151|      0|            return result;
  152|      0|        }
  153|   154k|        defaultScript = performFallbackLookup(localeID.data(), dsLocaleIDChars, scriptCodeChars, defaultScriptTable, UPRV_LENGTHOF(defaultScriptTable));
  ------------------
  |  |   99|   154k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  154|   154k|    }
  155|       |    
  156|       |    // if we didn't find anything, look up just the language in the default script table
  157|   309k|    if (defaultScript == nullptr) {
  ------------------
  |  Branch (157:9): [True: 309k, False: 0]
  ------------------
  158|   309k|        defaultScript = performFallbackLookup(language.data(), dsLocaleIDChars, scriptCodeChars, defaultScriptTable, UPRV_LENGTHOF(defaultScriptTable));
  ------------------
  |  |   99|   309k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  159|   309k|    }
  160|       |    
  161|       |    // if either lookup above succeeded, copy the result from "defaultScript" into "result"; otherwise, return "Latn"
  162|   309k|    if (defaultScript != nullptr) {
  ------------------
  |  Branch (162:9): [True: 0, False: 309k]
  ------------------
  163|      0|        result.clear();
  164|      0|        result.append(defaultScript, err);
  165|      0|    }
  166|   309k|    return result;
  167|   309k|}
uresbund.cpp:_ZL10chopLocalePc:
   83|   564k|static UBool chopLocale(char *name) {
   84|   564k|    char *i = uprv_strrchr(name, '_');
  ------------------
  |  |   42|   564k|#define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   564k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   85|       |
   86|   564k|    if(i != nullptr) {
  ------------------
  |  Branch (86:8): [True: 397k, False: 166k]
  ------------------
   87|   397k|        *i = '\0';
   88|   397k|        return true;
   89|   397k|    }
   90|       |
   91|   166k|    return false;
   92|   564k|}
uresbund.cpp:_ZL10init_entryPKcS0_P10UErrorCode:
  514|  1.00M|static UResourceDataEntry *init_entry(const char *localeID, const char *path, UErrorCode *status) {
  515|  1.00M|    UResourceDataEntry *r = nullptr;
  516|  1.00M|    UResourceDataEntry find;
  517|       |    /*int32_t hashValue;*/
  518|  1.00M|    const char *name;
  519|  1.00M|    char aliasName[100] = { 0 };
  520|  1.00M|    int32_t aliasLen = 0;
  521|       |    /*UBool isAlias = false;*/
  522|       |    /*UHashTok hashkey; */
  523|       |
  524|  1.00M|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (524:8): [True: 0, False: 1.00M]
  ------------------
  525|      0|        return nullptr;
  526|      0|    }
  527|       |
  528|       |    /* here we try to deduce the right locale name */
  529|  1.00M|    if(localeID == nullptr) { /* if localeID is nullptr, we're trying to open default locale */
  ------------------
  |  Branch (529:8): [True: 0, False: 1.00M]
  ------------------
  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|  1.00M|    } else if(*localeID == 0) { /* if localeID is "" then we try to open root locale */
  ------------------
  |  Branch (531:15): [True: 4.08k, False: 1.00M]
  ------------------
  532|  4.08k|        name = kRootLocaleName;
  ------------------
  |  |   18|  4.08k|#define kRootLocaleName         "root"
  ------------------
  533|  1.00M|    } else { /* otherwise, we'll open what we're given */
  534|  1.00M|        name = localeID;
  535|  1.00M|    }
  536|       |
  537|  1.00M|    find.fName = const_cast<char*>(name);
  538|  1.00M|    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|  1.00M|    r = static_cast<UResourceDataEntry*>(uhash_get(cache, &find));
  ------------------
  |  | 1007|  1.00M|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|  1.00M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.00M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.00M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  546|  1.00M|    if(r == nullptr) {
  ------------------
  |  Branch (546:8): [True: 25, False: 1.00M]
  ------------------
  547|       |        /* if the entry is not yet in the hash table, we'll try to construct a new one */
  548|     25|        r = static_cast<UResourceDataEntry*>(uprv_malloc(sizeof(UResourceDataEntry)));
  ------------------
  |  | 1524|     25|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|     25|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     25|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     25|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  549|     25|        if(r == nullptr) {
  ------------------
  |  Branch (549:12): [True: 0, False: 25]
  ------------------
  550|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
  551|      0|            return nullptr;
  552|      0|        }
  553|       |
  554|     25|        uprv_memset(r, 0, sizeof(UResourceDataEntry));
  ------------------
  |  |  100|     25|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|     25|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  555|       |        /*r->fHashKey = hashValue;*/
  556|       |
  557|     25|        setEntryName(r, name, status);
  558|     25|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (558:13): [True: 0, False: 25]
  ------------------
  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|     25|        if(path != nullptr) {
  ------------------
  |  Branch (563:12): [True: 12, False: 13]
  ------------------
  564|     12|            r->fPath = uprv_strdup(path);
  ------------------
  |  | 1541|     12|#define uprv_strdup U_ICU_ENTRY_POINT_RENAME(uprv_strdup)
  |  |  ------------------
  |  |  |  |  123|     12|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     12|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     12|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  565|     12|            if(r->fPath == nullptr) {
  ------------------
  |  Branch (565:16): [True: 0, False: 12]
  ------------------
  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|     12|        }
  571|       |
  572|       |        /* this is the actual loading */
  573|     25|        res_load(&(r->fData), r->fPath, r->fName, status);
  ------------------
  |  |  208|     25|#define res_load U_ICU_ENTRY_POINT_RENAME(res_load)
  |  |  ------------------
  |  |  |  |  123|     25|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     25|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     25|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  574|       |
  575|     25|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (575:13): [True: 6, False: 19]
  ------------------
  576|       |            /* if we failed to load due to an out-of-memory error, exit early. */
  577|      6|            if (*status == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (577:17): [True: 0, False: 6]
  ------------------
  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|      6|            *status = U_USING_FALLBACK_WARNING;
  583|      6|            r->fBogus = U_USING_FALLBACK_WARNING;
  584|     19|        } else { /* if we have a regular entry */
  585|     19|            Resource aliasres;
  586|     19|            if (r->fData.usesPoolBundle) {
  ------------------
  |  Branch (586:17): [True: 6, False: 13]
  ------------------
  587|      6|                r->fPool = getPoolEntry(r->fPath, status);
  588|      6|                if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (588:21): [True: 6, False: 0]
  ------------------
  589|      6|                    const int32_t *poolIndexes = r->fPool->fData.pRoot + 1;
  590|      6|                    if(r->fData.pRoot[1 + URES_INDEX_POOL_CHECKSUM] == poolIndexes[URES_INDEX_POOL_CHECKSUM]) {
  ------------------
  |  Branch (590:24): [True: 6, False: 0]
  ------------------
  591|      6|                        r->fData.poolBundleKeys = reinterpret_cast<const char*>(poolIndexes + (poolIndexes[URES_INDEX_LENGTH] & 0xff));
  592|      6|                        r->fData.poolBundleStrings = r->fPool->fData.p16BitUnits;
  593|      6|                    } else {
  594|      0|                        r->fBogus = *status = U_INVALID_FORMAT_ERROR;
  595|      0|                    }
  596|      6|                } else {
  597|      0|                    r->fBogus = *status;
  598|      0|                }
  599|      6|            }
  600|     19|            if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (600:17): [True: 19, 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|     19|                aliasres = res_getResource(&(r->fData), "%%ALIAS");
  ------------------
  |  |  204|     19|#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
  |  |  ------------------
  |  |  |  |  123|     19|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     19|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     19|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  604|     19|                if (aliasres != RES_BOGUS) {
  ------------------
  |  |   65|     19|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (604:21): [True: 0, False: 19]
  ------------------
  605|       |                    // No tracing: called during initial data loading
  606|      0|                    const char16_t *alias = res_getStringNoTrace(&(r->fData), aliasres, &aliasLen);
  ------------------
  |  |  205|      0|#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  607|      0|                    if(alias != nullptr && aliasLen > 0) { /* if there is actual alias - unload and load new data */
  ------------------
  |  Branch (607:24): [True: 0, False: 0]
  |  Branch (607:44): [True: 0, False: 0]
  ------------------
  608|      0|                        u_UCharsToChars(alias, aliasName, aliasLen+1);
  ------------------
  |  |  211|      0|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  609|      0|                        r->fAlias = init_entry(aliasName, path, status);
  610|      0|                    }
  611|      0|                }
  612|     19|            }
  613|     19|        }
  614|       |
  615|     25|        {
  616|     25|            UResourceDataEntry *oldR = nullptr;
  617|     25|            if ((oldR = static_cast<UResourceDataEntry*>(uhash_get(cache, r))) == nullptr) { /* if the data is not cached */
  ------------------
  |  | 1007|     25|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|     25|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     25|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     25|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (617:17): [True: 25, False: 0]
  ------------------
  618|       |                /* just insert it in the cache */
  619|     25|                UErrorCode cacheStatus = U_ZERO_ERROR;
  620|     25|                uhash_put(cache, (void *)r, r, &cacheStatus);
  ------------------
  |  | 1032|     25|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|     25|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     25|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     25|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  621|     25|                if (U_FAILURE(cacheStatus)) {
  ------------------
  |  Branch (621:21): [True: 0, False: 25]
  ------------------
  622|      0|                    *status = cacheStatus;
  623|      0|                    free_entry(r);
  624|      0|                    r = nullptr;
  625|      0|                }
  626|     25|            } 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|     25|        }
  633|       |
  634|     25|    }
  635|  1.00M|    if(r != nullptr) {
  ------------------
  |  Branch (635:8): [True: 1.00M, False: 0]
  ------------------
  636|       |        /* return the real bundle */
  637|  1.00M|        while(r->fAlias != nullptr) {
  ------------------
  |  Branch (637:15): [True: 0, False: 1.00M]
  ------------------
  638|      0|            r = r->fAlias;
  639|      0|        }
  640|  1.00M|        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|  1.00M|        if(r->fBogus != U_ZERO_ERROR && U_SUCCESS(*status)) {
  ------------------
  |  Branch (643:12): [True: 463k, False: 541k]
  |  Branch (643:41): [True: 463k, False: 0]
  ------------------
  644|   463k|             *status = r->fBogus; /* set the returning status */
  645|   463k|        }
  646|  1.00M|    }
  647|  1.00M|    return r;
  648|  1.00M|}
uresbund.cpp:_ZL12setEntryNameP18UResourceDataEntryPKcP10UErrorCode:
  489|     25|static void setEntryName(UResourceDataEntry *res, const char *name, UErrorCode *status) {
  490|     25|    int32_t len = static_cast<int32_t>(uprv_strlen(name));
  ------------------
  |  |   37|     25|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|     25|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  491|     25|    if(res->fName != nullptr && res->fName != res->fNameBuffer) {
  ------------------
  |  Branch (491:8): [True: 0, False: 25]
  |  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|     25|    if (len < static_cast<int32_t>(sizeof(res->fNameBuffer))) {
  ------------------
  |  Branch (494:9): [True: 3, False: 22]
  ------------------
  495|      3|        res->fName = res->fNameBuffer;
  496|      3|    }
  497|     22|    else {
  498|     22|        res->fName = static_cast<char*>(uprv_malloc(len + 1));
  ------------------
  |  | 1524|     22|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  499|     22|    }
  500|     25|    if(res->fName == nullptr) {
  ------------------
  |  Branch (500:8): [True: 0, False: 25]
  ------------------
  501|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  502|     25|    } else {
  503|     25|        uprv_strcpy(res->fName, name);
  ------------------
  |  |   36|     25|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|     25|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  504|     25|    }
  505|     25|}
uresbund.cpp:_ZL12getPoolEntryPKcP10UErrorCode:
  651|      6|getPoolEntry(const char *path, UErrorCode *status) {
  652|      6|    UResourceDataEntry *poolBundle = init_entry(kPoolBundleName, path, status);
  ------------------
  |  |   19|      6|#define kPoolBundleName         "pool"
  ------------------
  653|      6|    if( U_SUCCESS(*status) &&
  ------------------
  |  Branch (653:9): [True: 6, False: 0]
  ------------------
  654|      6|        (poolBundle == nullptr || poolBundle->fBogus != U_ZERO_ERROR || !poolBundle->fData.isPoolBundle)
  ------------------
  |  Branch (654:10): [True: 0, False: 6]
  |  Branch (654:35): [True: 0, False: 6]
  |  Branch (654:73): [True: 0, False: 6]
  ------------------
  655|      6|    ) {
  656|      0|        *status = U_INVALID_FORMAT_ERROR;
  657|      0|    }
  658|      6|    return poolBundle;
  659|      6|}
uresbund.cpp:_ZL13mayHaveParentPc:
  297|   166k|static UBool mayHaveParent(char *name) {
  298|   166k|    return (name[0] != 0 && uprv_strstr("nb nn",name) != nullptr);
  ------------------
  |  |   41|   166k|#define uprv_strstr(s, c) U_STANDARD_CPP_NAMESPACE strstr(s, c)
  |  |  ------------------
  |  |  |  |  393|   166k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (298:13): [True: 166k, False: 0]
  |  Branch (298:29): [True: 0, False: 166k]
  ------------------
  299|   166k|}
uresbund.cpp:_ZL21loadParentsExceptRootRP18UResourceDataEntryPciaS2_P10UErrorCode:
  746|   242k|                      UBool usingUSRData, char usrDataPath[], UErrorCode *status) {
  747|   242k|    if (U_FAILURE(*status)) { return false; }
  ------------------
  |  Branch (747:9): [True: 0, False: 242k]
  ------------------
  748|   242k|    UBool checkParent = true;
  749|   242k|    while (checkParent && t1->fParent == nullptr && !t1->fData.noFallback &&
  ------------------
  |  Branch (749:12): [True: 242k, False: 1]
  |  Branch (749:27): [True: 2, False: 242k]
  |  Branch (749:53): [True: 2, False: 0]
  ------------------
  750|   242k|            res_getResource(&t1->fData,"%%ParentIsRoot") == RES_BOGUS) {
  ------------------
  |  |  204|      2|#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                          res_getResource(&t1->fData,"%%ParentIsRoot") == RES_BOGUS) {
  ------------------
  |  |   65|      2|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (750:13): [True: 2, False: 0]
  ------------------
  751|      2|        Resource parentRes = res_getResource(&t1->fData, "%%Parent");
  ------------------
  |  |  204|      2|#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  752|      2|        if (parentRes != RES_BOGUS) {  // An explicit parent was found.
  ------------------
  |  |   65|      2|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (752:13): [True: 0, False: 2]
  ------------------
  753|      0|            int32_t parentLocaleLen = 0;
  754|       |            // No tracing: called during initial data loading
  755|      0|            const char16_t *parentLocaleName = res_getStringNoTrace(&(t1->fData), parentRes, &parentLocaleLen);
  ------------------
  |  |  205|      0|#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  756|      0|            if(parentLocaleName != nullptr && 0 < parentLocaleLen && parentLocaleLen < nameCapacity) {
  ------------------
  |  Branch (756:16): [True: 0, False: 0]
  |  Branch (756:47): [True: 0, False: 0]
  |  Branch (756:70): [True: 0, False: 0]
  ------------------
  757|      0|                u_UCharsToChars(parentLocaleName, name, parentLocaleLen + 1);
  ------------------
  |  |  211|      0|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  758|      0|                if (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 (758:21): [True: 0, False: 0]
  ------------------
  759|      0|                    return true;
  760|      0|                }
  761|      0|            }
  762|      0|        }
  763|       |        // Insert regular parents.
  764|      2|        UErrorCode parentStatus = U_ZERO_ERROR;
  765|      2|        UResourceDataEntry *t2 = init_entry(name, t1->fPath, &parentStatus);
  766|      2|        if (U_FAILURE(parentStatus)) {
  ------------------
  |  Branch (766:13): [True: 0, False: 2]
  ------------------
  767|      0|            *status = parentStatus;
  768|      0|            return false;
  769|      0|        }
  770|      2|        UResourceDataEntry *u2 = nullptr;
  771|      2|        UErrorCode usrStatus = U_ZERO_ERROR;
  772|      2|        if (usingUSRData) {  // This code inserts user override data into the inheritance chain.
  ------------------
  |  Branch (772:13): [True: 0, False: 2]
  ------------------
  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|      2|        if (usingUSRData && U_SUCCESS(usrStatus) && u2->fBogus == U_ZERO_ERROR) {
  ------------------
  |  Branch (781:13): [True: 0, False: 2]
  |  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|      2|        } else {
  785|      2|            t1->fParent = t2;
  786|      2|            if (usingUSRData) {
  ------------------
  |  Branch (786:17): [True: 0, False: 2]
  ------------------
  787|       |                // The USR override data wasn't found, set it to be deleted.
  788|      0|                u2->fCountExisting = 0;
  789|      0|            }
  790|      2|        }
  791|      2|        t1 = t2;
  792|      2|        checkParent = chopLocale(name) || mayHaveParent(name);
  ------------------
  |  Branch (792:23): [True: 1, False: 1]
  |  Branch (792:43): [True: 0, False: 1]
  ------------------
  793|      2|    }
  794|   242k|    return true;
  795|   242k|}
uresbund.cpp:_ZL16insertRootBundleRP18UResourceDataEntryP10UErrorCode:
  798|      3|insertRootBundle(UResourceDataEntry *&t1, UErrorCode *status) {
  799|      3|    if (U_FAILURE(*status)) { return false; }
  ------------------
  |  Branch (799:9): [True: 0, False: 3]
  ------------------
  800|      3|    UErrorCode parentStatus = U_ZERO_ERROR;
  801|      3|    UResourceDataEntry *t2 = init_entry(kRootLocaleName, t1->fPath, &parentStatus);
  ------------------
  |  |   18|      3|#define kRootLocaleName         "root"
  ------------------
  802|      3|    if (U_FAILURE(parentStatus)) {
  ------------------
  |  Branch (802:9): [True: 0, False: 3]
  ------------------
  803|      0|        *status = parentStatus;
  804|      0|        return false;
  805|      0|    }
  806|      3|    t1->fParent = t2;
  807|      3|    t1 = t2;
  808|      3|    return true;
  809|      3|}
uresbund.cpp:_ZL15entryOpenDirectPKcS0_P10UErrorCode:
  966|   131k|entryOpenDirect(const char* path, const char* localeID, UErrorCode* status) {
  967|   131k|    initCache(status);
  968|   131k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (968:8): [True: 0, False: 131k]
  ------------------
  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|   131k|    if (localeID == nullptr) {
  ------------------
  |  Branch (974:9): [True: 0, False: 131k]
  ------------------
  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|   131k|    } else if (*localeID == 0) {
  ------------------
  |  Branch (976:16): [True: 0, False: 131k]
  ------------------
  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|   131k|    Mutex lock(&resbMutex);
  982|       |
  983|       |    // findFirstExisting() without fallbacks.
  984|   131k|    UResourceDataEntry *r = init_entry(localeID, path, status);
  985|   131k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (985:8): [True: 131k, False: 0]
  ------------------
  986|   131k|        if(r->fBogus != U_ZERO_ERROR) {
  ------------------
  |  Branch (986:12): [True: 0, False: 131k]
  ------------------
  987|      0|            r->fCountExisting--;
  988|      0|            r = nullptr;
  989|      0|        }
  990|   131k|    } 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|   131k|    UResourceDataEntry *t1 = r;
  997|   131k|    if(r != nullptr && uprv_strcmp(localeID, kRootLocaleName) != 0 &&  // not root
  ------------------
  |  |   38|   131k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   131k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (997:8): [True: 131k, False: 0]
  |  Branch (997:24): [True: 131k, False: 0]
  ------------------
  998|   131k|            r->fParent == nullptr && !r->fData.noFallback &&
  ------------------
  |  Branch (998:13): [True: 131k, False: 0]
  |  Branch (998:38): [True: 0, False: 131k]
  ------------------
  999|   131k|            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|   131k|    if(r != nullptr) {
  ------------------
  |  Branch (1013:8): [True: 131k, False: 0]
  ------------------
 1014|       |        // TODO: Does this ever loop?
 1015|   131k|        while(t1->fParent != nullptr) {
  ------------------
  |  Branch (1015:15): [True: 0, False: 131k]
  ------------------
 1016|      0|            t1->fParent->fCountExisting++;
 1017|      0|            t1 = t1->fParent;
 1018|      0|        }
 1019|   131k|    }
 1020|   131k|    return r;
 1021|   131k|}
uresbund.cpp:_ZL32getParentForFunctionalEquivalentPKcP15UResourceBundleS2_RN6icu_7810CharStringE:
 3042|  24.5k|                                             CharString&      parent) {
 3043|       |    // Get parent.
 3044|       |    // First check for a parent from %%Parent resource (Note that in resource trees
 3045|       |    // such as collation, data may have different parents than in parentLocales).
 3046|  24.5k|    UErrorCode subStatus = U_ZERO_ERROR;
 3047|  24.5k|    parent.clear();
 3048|  24.5k|    if (res != nullptr) {
  ------------------
  |  Branch (3048:9): [True: 24.5k, False: 0]
  ------------------
 3049|  24.5k|        ures_getByKey(res, "%%Parent", bund1, &subStatus);
  ------------------
  |  | 1661|  24.5k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  24.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  24.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  24.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3050|  24.5k|        if (U_SUCCESS(subStatus)) {
  ------------------
  |  Branch (3050:13): [True: 0, False: 24.5k]
  ------------------
 3051|      0|            int32_t length16;
 3052|      0|            const char16_t* s16 = ures_getString(bund1, &length16, &subStatus);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3053|      0|            parent.appendInvariantChars(s16, length16, subStatus);
 3054|      0|        }
 3055|  24.5k|    }
 3056|       |    
 3057|       |    // If none there, use normal truncation parent
 3058|  24.5k|    if (U_FAILURE(subStatus) || parent.isEmpty()) {
  ------------------
  |  Branch (3058:9): [True: 24.5k, False: 0]
  |  Branch (3058:33): [True: 0, False: 0]
  ------------------
 3059|  24.5k|        subStatus = U_ZERO_ERROR;
 3060|  24.5k|        parent = ulocimp_getParent(localeID, subStatus);
  ------------------
  |  | 1205|  24.5k|#define ulocimp_getParent U_ICU_ENTRY_POINT_RENAME(ulocimp_getParent)
  |  |  ------------------
  |  |  |  |  123|  24.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  24.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  24.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3061|  24.5k|    }
 3062|  24.5k|}

res_load_78:
  260|     25|         const char *path, const char *name, UErrorCode *errorCode) {
  261|     25|    UVersionInfo formatVersion;
  262|       |
  263|     25|    uprv_memset(pResData, 0, sizeof(ResourceData));
  ------------------
  |  |  100|     25|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|     25|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  264|       |
  265|       |    /* load the ResourceBundle file */
  266|     25|    pResData->data=udata_openChoice(path, "res", name, isAcceptable, formatVersion, errorCode);
  ------------------
  |  |  894|     25|#define udata_openChoice U_ICU_ENTRY_POINT_RENAME(udata_openChoice)
  |  |  ------------------
  |  |  |  |  123|     25|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     25|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     25|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|     25|    if(U_FAILURE(*errorCode)) {
  ------------------
  |  Branch (267:8): [True: 6, False: 19]
  ------------------
  268|      6|        return;
  269|      6|    }
  270|       |
  271|       |    /* get its memory and initialize *pResData */
  272|     19|    res_init(pResData, formatVersion, udata_getMemory(pResData->data), -1, errorCode);
  ------------------
  |  |  891|     19|#define udata_getMemory U_ICU_ENTRY_POINT_RENAME(udata_getMemory)
  |  |  ------------------
  |  |  |  |  123|     19|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     19|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     19|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  273|     19|}
res_getPublicType_78:
  306|   814k|res_getPublicType(Resource res) {
  307|   814k|    return (UResType)gPublicTypes[RES_GET_TYPE(res)];
  ------------------
  |  |   68|   814k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  308|   814k|}
res_getStringNoTrace_78:
  311|  1.89M|res_getStringNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength) {
  312|  1.89M|    const char16_t *p;
  313|  1.89M|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|  1.89M|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  314|  1.89M|    int32_t length;
  315|  1.89M|    if(RES_GET_TYPE(res)==URES_STRING_V2) {
  ------------------
  |  |   68|  1.89M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (315:8): [True: 1.89M, False: 4.08k]
  ------------------
  316|  1.89M|        int32_t first;
  317|  1.89M|        if((int32_t)offset<pResData->poolStringIndexLimit) {
  ------------------
  |  Branch (317:12): [True: 676k, False: 1.21M]
  ------------------
  318|   676k|            p=(const char16_t *)pResData->poolBundleStrings+offset;
  319|  1.21M|        } else {
  320|  1.21M|            p=(const char16_t *)pResData->p16BitUnits+(offset-pResData->poolStringIndexLimit);
  321|  1.21M|        }
  322|  1.89M|        first=*p;
  323|  1.89M|        if(!U16_IS_TRAIL(first)) {
  ------------------
  |  |   67|  1.89M|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  ------------------
  |  Branch (323:12): [True: 1.78M, False: 106k]
  ------------------
  324|  1.78M|            length=u_strlen(p);
  ------------------
  |  |  393|  1.78M|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|  1.78M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.78M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.78M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  325|  1.78M|        } else if(first<0xdfef) {
  ------------------
  |  Branch (325:19): [True: 106k, False: 0]
  ------------------
  326|   106k|            length=first&0x3ff;
  327|   106k|            ++p;
  328|   106k|        } 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|  1.89M|    } else if(res==offset) /* RES_GET_TYPE(res)==URES_STRING */ {
  ------------------
  |  Branch (335:15): [True: 0, False: 4.08k]
  ------------------
  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|  4.08k|    } else {
  340|  4.08k|        p=nullptr;
  341|  4.08k|        length=0;
  342|  4.08k|    }
  343|  1.89M|    if(pLength) {
  ------------------
  |  Branch (343:8): [True: 1.89M, False: 2]
  ------------------
  344|  1.89M|        *pLength=length;
  345|  1.89M|    }
  346|  1.89M|    return p;
  347|  1.89M|}
res_getAlias_78:
  420|   134k|res_getAlias(const ResourceData *pResData, Resource res, int32_t *pLength) {
  421|   134k|    const char16_t *p;
  422|   134k|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|   134k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  423|   134k|    int32_t length;
  424|   134k|    if(RES_GET_TYPE(res)==URES_ALIAS) {
  ------------------
  |  |   68|   134k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (424:8): [True: 134k, False: 0]
  ------------------
  425|   134k|        const int32_t *p32= offset==0 ? &gEmptyString.length : pResData->pRoot+offset;
  ------------------
  |  Branch (425:29): [True: 0, False: 134k]
  ------------------
  426|   134k|        length=*p32++;
  427|   134k|        p=(const char16_t *)p32;
  428|   134k|    } else {
  429|      0|        p=nullptr;
  430|      0|        length=0;
  431|      0|    }
  432|   134k|    if(pLength) {
  ------------------
  |  Branch (432:8): [True: 134k, False: 0]
  ------------------
  433|   134k|        *pLength=length;
  434|   134k|    }
  435|   134k|    return p;
  436|   134k|}
res_getBinaryNoTrace_78:
  439|      3|res_getBinaryNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength) {
  440|      3|    const uint8_t *p;
  441|      3|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|      3|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  442|      3|    int32_t length;
  443|      3|    if(RES_GET_TYPE(res)==URES_BINARY) {
  ------------------
  |  |   68|      3|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (443:8): [True: 3, False: 0]
  ------------------
  444|      3|        const int32_t *p32= offset==0 ? (const int32_t*)&gEmpty32 : pResData->pRoot+offset;
  ------------------
  |  Branch (444:29): [True: 0, False: 3]
  ------------------
  445|      3|        length=*p32++;
  446|      3|        p=(const uint8_t *)p32;
  447|      3|    } else {
  448|      0|        p=nullptr;
  449|      0|        length=0;
  450|      0|    }
  451|      3|    if(pLength) {
  ------------------
  |  Branch (451:8): [True: 3, False: 0]
  ------------------
  452|      3|        *pLength=length;
  453|      3|    }
  454|      3|    return p;
  455|      3|}
res_getIntVectorNoTrace_78:
  459|     17|res_getIntVectorNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength) {
  460|     17|    const int32_t *p;
  461|     17|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|     17|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  462|     17|    int32_t length;
  463|     17|    if(RES_GET_TYPE(res)==URES_INT_VECTOR) {
  ------------------
  |  |   68|     17|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (463:8): [True: 17, False: 0]
  ------------------
  464|     17|        p= offset==0 ? (const int32_t *)&gEmpty32 : pResData->pRoot+offset;
  ------------------
  |  Branch (464:12): [True: 0, False: 17]
  ------------------
  465|     17|        length=*p++;
  466|     17|    } else {
  467|      0|        p=nullptr;
  468|      0|        length=0;
  469|      0|    }
  470|     17|    if(pLength) {
  ------------------
  |  Branch (470:8): [True: 17, False: 0]
  ------------------
  471|     17|        *pLength=length;
  472|     17|    }
  473|     17|    return p;
  474|     17|}
res_countArrayItems_78:
  477|  1.94M|res_countArrayItems(const ResourceData *pResData, Resource res) {
  478|  1.94M|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|  1.94M|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  479|  1.94M|    switch(RES_GET_TYPE(res)) {
  ------------------
  |  |   68|  1.94M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  480|      0|    case URES_STRING:
  ------------------
  |  Branch (480:5): [True: 0, False: 1.94M]
  ------------------
  481|   213k|    case URES_STRING_V2:
  ------------------
  |  Branch (481:5): [True: 213k, False: 1.72M]
  ------------------
  482|   213k|    case URES_BINARY:
  ------------------
  |  Branch (482:5): [True: 0, False: 1.94M]
  ------------------
  483|   213k|    case URES_ALIAS:
  ------------------
  |  Branch (483:5): [True: 0, False: 1.94M]
  ------------------
  484|   302k|    case URES_INT:
  ------------------
  |  Branch (484:5): [True: 88.9k, False: 1.85M]
  ------------------
  485|   302k|    case URES_INT_VECTOR:
  ------------------
  |  Branch (485:5): [True: 14, False: 1.94M]
  ------------------
  486|   302k|        return 1;
  487|  65.6k|    case URES_ARRAY:
  ------------------
  |  Branch (487:5): [True: 65.6k, False: 1.87M]
  ------------------
  488|  65.6k|    case URES_TABLE32:
  ------------------
  |  Branch (488:5): [True: 0, False: 1.94M]
  ------------------
  489|  65.6k|        return offset==0 ? 0 : *(pResData->pRoot+offset);
  ------------------
  |  Branch (489:16): [True: 0, False: 65.6k]
  ------------------
  490|  1.21M|    case URES_TABLE:
  ------------------
  |  Branch (490:5): [True: 1.21M, False: 720k]
  ------------------
  491|  1.21M|        return offset==0 ? 0 : *((const uint16_t *)(pResData->pRoot+offset));
  ------------------
  |  Branch (491:16): [True: 52.6k, False: 1.16M]
  ------------------
  492|   133k|    case URES_ARRAY16:
  ------------------
  |  Branch (492:5): [True: 133k, False: 1.80M]
  ------------------
  493|   352k|    case URES_TABLE16:
  ------------------
  |  Branch (493:5): [True: 218k, False: 1.72M]
  ------------------
  494|   352k|        return pResData->p16BitUnits[offset];
  495|      0|    default:
  ------------------
  |  Branch (495:5): [True: 0, False: 1.94M]
  ------------------
  496|      0|        return 0;
  497|  1.94M|    }
  498|  1.94M|}
_ZN6icu_7817ResourceDataValueD2Ev:
  502|   206k|ResourceDataValue::~ResourceDataValue() {}
_ZNK6icu_7817ResourceDataValue7getTypeEv:
  504|   777k|UResType ResourceDataValue::getType() const {
  505|   777k|    return res_getPublicType(res);
  ------------------
  |  |  203|   777k|#define res_getPublicType U_ICU_ENTRY_POINT_RENAME(res_getPublicType)
  |  |  ------------------
  |  |  |  |  123|   777k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   777k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   777k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  506|   777k|}
_ZNK6icu_7817ResourceDataValue9getStringERiR10UErrorCode:
  508|  1.36M|const char16_t *ResourceDataValue::getString(int32_t &length, UErrorCode &errorCode) const {
  509|  1.36M|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (509:8): [True: 0, False: 1.36M]
  ------------------
  510|      0|        return nullptr;
  511|      0|    }
  512|  1.36M|    const char16_t *s = res_getString(fTraceInfo, &getData(), res, &length);
  513|  1.36M|    if(s == nullptr) {
  ------------------
  |  Branch (513:8): [True: 4.08k, False: 1.36M]
  ------------------
  514|  4.08k|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  515|  4.08k|    }
  516|  1.36M|    return s;
  517|  1.36M|}
_ZNK6icu_7817ResourceDataValue14getAliasStringERiR10UErrorCode:
  519|      4|const char16_t *ResourceDataValue::getAliasString(int32_t &length, UErrorCode &errorCode) const {
  520|      4|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (520:8): [True: 0, False: 4]
  ------------------
  521|      0|        return nullptr;
  522|      0|    }
  523|      4|    const char16_t *s = res_getAlias(&getData(), res, &length);
  ------------------
  |  |  199|      4|#define res_getAlias U_ICU_ENTRY_POINT_RENAME(res_getAlias)
  |  |  ------------------
  |  |  |  |  123|      4|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      4|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      4|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  524|      4|    if(s == nullptr) {
  ------------------
  |  Branch (524:8): [True: 0, False: 4]
  ------------------
  525|      0|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  526|      0|    }
  527|      4|    return s;
  528|      4|}
_ZNK6icu_7817ResourceDataValue12getIntVectorERiR10UErrorCode:
  550|      3|const int32_t *ResourceDataValue::getIntVector(int32_t &length, UErrorCode &errorCode) const {
  551|      3|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (551:8): [True: 0, False: 3]
  ------------------
  552|      0|        return nullptr;
  553|      0|    }
  554|      3|    const int32_t *iv = res_getIntVector(fTraceInfo, &getData(), res, &length);
  555|      3|    if(iv == nullptr) {
  ------------------
  |  Branch (555:8): [True: 0, False: 3]
  ------------------
  556|      0|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  557|      0|    }
  558|      3|    return iv;
  559|      3|}
_ZNK6icu_7817ResourceDataValue9getBinaryERiR10UErrorCode:
  561|      3|const uint8_t *ResourceDataValue::getBinary(int32_t &length, UErrorCode &errorCode) const {
  562|      3|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (562:8): [True: 0, False: 3]
  ------------------
  563|      0|        return nullptr;
  564|      0|    }
  565|      3|    const uint8_t *b = res_getBinary(fTraceInfo, &getData(), res, &length);
  566|      3|    if(b == nullptr) {
  ------------------
  |  Branch (566:8): [True: 0, False: 3]
  ------------------
  567|      0|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  568|      0|    }
  569|      3|    return b;
  570|      3|}
_ZNK6icu_7817ResourceDataValue8getArrayER10UErrorCode:
  572|  85.2k|ResourceArray ResourceDataValue::getArray(UErrorCode &errorCode) const {
  573|  85.2k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (573:8): [True: 0, False: 85.2k]
  ------------------
  574|      0|        return {};
  575|      0|    }
  576|  85.2k|    const uint16_t *items16 = nullptr;
  577|  85.2k|    const Resource *items32 = nullptr;
  578|  85.2k|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|  85.2k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  579|  85.2k|    int32_t length = 0;
  580|  85.2k|    switch(RES_GET_TYPE(res)) {
  ------------------
  |  |   68|  85.2k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  581|  21.2k|    case URES_ARRAY:
  ------------------
  |  Branch (581:5): [True: 21.2k, False: 63.9k]
  ------------------
  582|  21.2k|        if (offset!=0) {  // empty if offset==0
  ------------------
  |  Branch (582:13): [True: 21.2k, False: 0]
  ------------------
  583|  21.2k|            items32 = reinterpret_cast<const Resource*>(getData().pRoot) + offset;
  584|  21.2k|            length = *items32++;
  585|  21.2k|        }
  586|  21.2k|        break;
  587|  63.9k|    case URES_ARRAY16:
  ------------------
  |  Branch (587:5): [True: 63.9k, False: 21.2k]
  ------------------
  588|  63.9k|        items16 = getData().p16BitUnits+offset;
  589|  63.9k|        length = *items16++;
  590|  63.9k|        break;
  591|      0|    default:
  ------------------
  |  Branch (591:5): [True: 0, False: 85.2k]
  ------------------
  592|      0|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  593|      0|        return {};
  594|  85.2k|    }
  595|  85.2k|    return ResourceArray(items16, items32, length, fTraceInfo);
  596|  85.2k|}
_ZNK6icu_7817ResourceDataValue8getTableER10UErrorCode:
  598|   555k|ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const {
  599|   555k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (599:8): [True: 0, False: 555k]
  ------------------
  600|      0|        return {};
  601|      0|    }
  602|   555k|    const uint16_t *keys16 = nullptr;
  603|   555k|    const int32_t *keys32 = nullptr;
  604|   555k|    const uint16_t *items16 = nullptr;
  605|   555k|    const Resource *items32 = nullptr;
  606|   555k|    uint32_t offset = RES_GET_OFFSET(res);
  ------------------
  |  |   69|   555k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  607|   555k|    int32_t length = 0;
  608|   555k|    switch(RES_GET_TYPE(res)) {
  ------------------
  |  |   68|   555k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  609|   212k|    case URES_TABLE:
  ------------------
  |  Branch (609:5): [True: 212k, False: 342k]
  ------------------
  610|   212k|        if (offset != 0) {  // empty if offset==0
  ------------------
  |  Branch (610:13): [True: 212k, False: 0]
  ------------------
  611|   212k|            keys16 = reinterpret_cast<const uint16_t*>(getData().pRoot + offset);
  612|   212k|            length = *keys16++;
  613|   212k|            items32 = reinterpret_cast<const Resource*>(keys16 + length + (~length & 1));
  614|   212k|        }
  615|   212k|        break;
  616|   342k|    case URES_TABLE16:
  ------------------
  |  Branch (616:5): [True: 342k, False: 212k]
  ------------------
  617|   342k|        keys16 = getData().p16BitUnits+offset;
  618|   342k|        length = *keys16++;
  619|   342k|        items16 = keys16 + length;
  620|   342k|        break;
  621|      0|    case URES_TABLE32:
  ------------------
  |  Branch (621:5): [True: 0, False: 555k]
  ------------------
  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: 555k]
  ------------------
  629|      0|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  630|      0|        return {};
  631|   555k|    }
  632|   555k|    return ResourceTable(keys16, keys32, items16, items32, length, fTraceInfo);
  633|   555k|}
_ZNK6icu_7817ResourceDataValue14getStringArrayEPNS_13UnicodeStringEiR10UErrorCode:
  640|     52|                                          UErrorCode &errorCode) const {
  641|     52|    return ::getStringArray(&getData(), getArray(errorCode), dest, capacity, errorCode);
  642|     52|}
res_getTableItemByKey_78:
  713|  3.48M|                      int32_t *indexR, const char **key) {
  714|  3.48M|    uint32_t offset=RES_GET_OFFSET(table);
  ------------------
  |  |   69|  3.48M|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  715|  3.48M|    int32_t length;
  716|  3.48M|    int32_t idx;
  717|  3.48M|    if(key == nullptr || *key == nullptr) {
  ------------------
  |  Branch (717:8): [True: 0, False: 3.48M]
  |  Branch (717:26): [True: 0, False: 3.48M]
  ------------------
  718|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  719|      0|    }
  720|  3.48M|    switch(RES_GET_TYPE(table)) {
  ------------------
  |  |   68|  3.48M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  721|  3.34M|    case URES_TABLE: {
  ------------------
  |  Branch (721:5): [True: 3.34M, False: 141k]
  ------------------
  722|  3.34M|        if (offset!=0) { /* empty if offset==0 */
  ------------------
  |  Branch (722:13): [True: 2.98M, False: 358k]
  ------------------
  723|  2.98M|            const uint16_t *p= (const uint16_t *)(pResData->pRoot+offset);
  724|  2.98M|            length=*p++;
  725|  2.98M|            *indexR=idx=_res_findTableItem(pResData, p, length, *key, key);
  726|  2.98M|            if(idx>=0) {
  ------------------
  |  Branch (726:16): [True: 2.43M, False: 550k]
  ------------------
  727|  2.43M|                const Resource *p32=(const Resource *)(p+length+(~length&1));
  728|  2.43M|                return p32[idx];
  729|  2.43M|            }
  730|  2.98M|        }
  731|   908k|        break;
  732|  3.34M|    }
  733|   908k|    case URES_TABLE16: {
  ------------------
  |  Branch (733:5): [True: 141k, False: 3.34M]
  ------------------
  734|   141k|        const uint16_t *p=pResData->p16BitUnits+offset;
  735|   141k|        length=*p++;
  736|   141k|        *indexR=idx=_res_findTableItem(pResData, p, length, *key, key);
  737|   141k|        if(idx>=0) {
  ------------------
  |  Branch (737:12): [True: 98.5k, False: 42.4k]
  ------------------
  738|  98.5k|            return makeResourceFrom16(pResData, p[length+idx]);
  739|  98.5k|        }
  740|  42.4k|        break;
  741|   141k|    }
  742|  42.4k|    case URES_TABLE32: {
  ------------------
  |  Branch (742:5): [True: 0, False: 3.48M]
  ------------------
  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: 3.48M]
  ------------------
  754|      0|        break;
  755|  3.48M|    }
  756|   951k|    return RES_BOGUS;
  ------------------
  |  |   65|   951k|#define RES_BOGUS 0xffffffff
  ------------------
  757|  3.48M|}
res_getTableItemByIndex_78:
  761|  84.8k|                        int32_t indexR, const char **key) {
  762|  84.8k|    uint32_t offset=RES_GET_OFFSET(table);
  ------------------
  |  |   69|  84.8k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  763|  84.8k|    int32_t length;
  764|  84.8k|    if (indexR < 0) {
  ------------------
  |  Branch (764:9): [True: 0, False: 84.8k]
  ------------------
  765|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  766|      0|    }
  767|  84.8k|    switch(RES_GET_TYPE(table)) {
  ------------------
  |  |   68|  84.8k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  768|     10|    case URES_TABLE: {
  ------------------
  |  Branch (768:5): [True: 10, False: 84.8k]
  ------------------
  769|     10|        if (offset != 0) { /* empty if offset==0 */
  ------------------
  |  Branch (769:13): [True: 10, False: 0]
  ------------------
  770|     10|            const uint16_t *p= (const uint16_t *)(pResData->pRoot+offset);
  771|     10|            length=*p++;
  772|     10|            if(indexR<length) {
  ------------------
  |  Branch (772:16): [True: 10, False: 0]
  ------------------
  773|     10|                const Resource *p32=(const Resource *)(p+length+(~length&1));
  774|     10|                if(key!=nullptr) {
  ------------------
  |  Branch (774:20): [True: 10, False: 0]
  ------------------
  775|     10|                    *key=RES_GET_KEY16(pResData, p[indexR]);
  ------------------
  |  |   44|     10|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 0, False: 10]
  |  |  ------------------
  |  |   45|     10|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|     10|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
  776|     10|                }
  777|     10|                return p32[indexR];
  778|     10|            }
  779|     10|        }
  780|      0|        break;
  781|     10|    }
  782|  84.8k|    case URES_TABLE16: {
  ------------------
  |  Branch (782:5): [True: 84.8k, False: 10]
  ------------------
  783|  84.8k|        const uint16_t *p=pResData->p16BitUnits+offset;
  784|  84.8k|        length=*p++;
  785|  84.8k|        if(indexR<length) {
  ------------------
  |  Branch (785:12): [True: 84.8k, False: 0]
  ------------------
  786|  84.8k|            if(key!=nullptr) {
  ------------------
  |  Branch (786:16): [True: 84.8k, False: 0]
  ------------------
  787|  84.8k|                *key=RES_GET_KEY16(pResData, p[indexR]);
  ------------------
  |  |   44|  84.8k|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 84.8k, False: 0]
  |  |  ------------------
  |  |   45|  84.8k|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|  84.8k|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
  788|  84.8k|            }
  789|  84.8k|            return makeResourceFrom16(pResData, p[length+indexR]);
  790|  84.8k|        }
  791|      0|        break;
  792|  84.8k|    }
  793|      0|    case URES_TABLE32: {
  ------------------
  |  Branch (793:5): [True: 0, False: 84.8k]
  ------------------
  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: 84.8k]
  ------------------
  807|      0|        break;
  808|  84.8k|    }
  809|      0|    return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  810|  84.8k|}
res_getResource_78:
  813|     23|res_getResource(const ResourceData *pResData, const char *key) {
  814|     23|    const char *realKey=key;
  815|     23|    int32_t idx;
  816|     23|    return res_getTableItemByKey(pResData, pResData->rootRes, &idx, &realKey);
  ------------------
  |  |  207|     23|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|     23|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     23|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     23|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  817|     23|}
_ZNK6icu_7813ResourceTable14getKeyAndValueEiRPKcRNS_13ResourceValueE:
  821|  2.29M|                                         const char *&key, icu::ResourceValue &value) const {
  822|  2.29M|    if(0 <= i && i < length) {
  ------------------
  |  Branch (822:8): [True: 2.29M, False: 0]
  |  Branch (822:18): [True: 2.01M, False: 279k]
  ------------------
  823|  2.01M|        icu::ResourceDataValue &rdValue = static_cast<icu::ResourceDataValue &>(value);
  824|  2.01M|        if (keys16 != nullptr) {
  ------------------
  |  Branch (824:13): [True: 2.01M, False: 0]
  ------------------
  825|  2.01M|            key = RES_GET_KEY16(&rdValue.getData(), keys16[i]);
  ------------------
  |  |   44|  2.01M|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 828, False: 2.01M]
  |  |  ------------------
  |  |   45|  2.01M|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|  2.01M|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
  826|  2.01M|        } 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|  2.01M|        Resource res;
  830|  2.01M|        if (items16 != nullptr) {
  ------------------
  |  Branch (830:13): [True: 1.46M, False: 551k]
  ------------------
  831|  1.46M|            res = makeResourceFrom16(&rdValue.getData(), items16[i]);
  832|  1.46M|        } else {
  833|   551k|            res = items32[i];
  834|   551k|        }
  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|  2.01M|        rdValue.setResource(res, ResourceTracer(fTraceInfo, key));
  840|  2.01M|        return true;
  841|  2.01M|    }
  842|   279k|    return false;
  843|  2.29M|}
_ZNK6icu_7813ResourceTable9findValueEPKcRNS_13ResourceValueE:
  845|   275k|UBool icu::ResourceTable::findValue(const char *key, ResourceValue &value) const {
  846|   275k|    icu::ResourceDataValue &rdValue = static_cast<icu::ResourceDataValue &>(value);
  847|   275k|    const char *realKey = nullptr;
  848|   275k|    int32_t i;
  849|   275k|    if (keys16 != nullptr) {
  ------------------
  |  Branch (849:9): [True: 275k, False: 0]
  ------------------
  850|   275k|        i = _res_findTableItem(&rdValue.getData(), keys16, length, key, &realKey);
  851|   275k|    } else {
  852|      0|        i = _res_findTable32Item(&rdValue.getData(), keys32, length, key, &realKey);
  853|      0|    }
  854|   275k|    if (i >= 0) {
  ------------------
  |  Branch (854:9): [True: 275k, False: 0]
  ------------------
  855|   275k|        Resource res;
  856|   275k|        if (items16 != nullptr) {
  ------------------
  |  Branch (856:13): [True: 116k, False: 159k]
  ------------------
  857|   116k|            res = makeResourceFrom16(&rdValue.getData(), items16[i]);
  858|   159k|        } else {
  859|   159k|            res = items32[i];
  860|   159k|        }
  861|       |        // Same note about lifetime as in getKeyAndValue().
  862|   275k|        rdValue.setResource(res, ResourceTracer(fTraceInfo, key));
  863|   275k|        return true;
  864|   275k|    }
  865|      0|    return false;
  866|   275k|}
res_getArrayItem_78:
  869|   196k|res_getArrayItem(const ResourceData *pResData, Resource array, int32_t indexR) {
  870|   196k|    uint32_t offset=RES_GET_OFFSET(array);
  ------------------
  |  |   69|   196k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  871|   196k|    if (indexR < 0) {
  ------------------
  |  Branch (871:9): [True: 0, False: 196k]
  ------------------
  872|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  873|      0|    }
  874|   196k|    switch(RES_GET_TYPE(array)) {
  ------------------
  |  |   68|   196k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  875|  44.4k|    case URES_ARRAY: {
  ------------------
  |  Branch (875:5): [True: 44.4k, False: 151k]
  ------------------
  876|  44.4k|        if (offset!=0) { /* empty if offset==0 */
  ------------------
  |  Branch (876:13): [True: 44.4k, False: 0]
  ------------------
  877|  44.4k|            const int32_t *p= pResData->pRoot+offset;
  878|  44.4k|            if(indexR<*p) {
  ------------------
  |  Branch (878:16): [True: 44.4k, False: 0]
  ------------------
  879|  44.4k|                return (Resource)p[1+indexR];
  880|  44.4k|            }
  881|  44.4k|        }
  882|      0|        break;
  883|  44.4k|    }
  884|   151k|    case URES_ARRAY16: {
  ------------------
  |  Branch (884:5): [True: 151k, False: 44.4k]
  ------------------
  885|   151k|        const uint16_t *p=pResData->p16BitUnits+offset;
  886|   151k|        if(indexR<*p) {
  ------------------
  |  Branch (886:12): [True: 151k, False: 0]
  ------------------
  887|   151k|            return makeResourceFrom16(pResData, p[1+indexR]);
  888|   151k|        }
  889|      0|        break;
  890|   151k|    }
  891|      0|    default:
  ------------------
  |  Branch (891:5): [True: 0, False: 196k]
  ------------------
  892|      0|        break;
  893|   196k|    }
  894|      0|    return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  895|   196k|}
_ZNK6icu_7813ResourceArray19internalGetResourceEPK12ResourceDatai:
  897|   256k|uint32_t icu::ResourceArray::internalGetResource(const ResourceData *pResData, int32_t i) const {
  898|   256k|    if (items16 != nullptr) {
  ------------------
  |  Branch (898:9): [True: 192k, False: 63.6k]
  ------------------
  899|   192k|        return makeResourceFrom16(pResData, items16[i]);
  900|   192k|    } else {
  901|  63.6k|        return items32[i];
  902|  63.6k|    }
  903|   256k|}
_ZNK6icu_7813ResourceArray8getValueEiRNS_13ResourceValueE:
  905|   277k|UBool icu::ResourceArray::getValue(int32_t i, icu::ResourceValue &value) const {
  906|   277k|    if(0 <= i && i < length) {
  ------------------
  |  Branch (906:8): [True: 277k, False: 0]
  |  Branch (906:18): [True: 255k, False: 21.2k]
  ------------------
  907|   255k|        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|   255k|        rdValue.setResource(
  913|   255k|            internalGetResource(&rdValue.getData(), i),
  914|   255k|            ResourceTracer(fTraceInfo, i));
  915|   255k|        return true;
  916|   255k|    }
  917|  21.2k|    return false;
  918|   277k|}
res_findResource_78:
  921|   985k|res_findResource(const ResourceData *pResData, Resource r, char** path, const char** key) {
  922|   985k|  char *pathP = *path, *nextSepP = *path;
  923|   985k|  char *closeIndex = nullptr;
  924|   985k|  Resource t1 = r;
  925|   985k|  Resource t2;
  926|   985k|  int32_t indexR = 0;
  927|   985k|  UResType type = (UResType)RES_GET_TYPE(t1);
  ------------------
  |  |   68|   985k|#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|   985k|  if(!uprv_strlen(pathP)) {
  ------------------
  |  |   37|   985k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|   985k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (930:6): [True: 0, False: 985k]
  ------------------
  931|      0|      return r;
  932|      0|  }
  933|       |
  934|       |  /* one needs to have an aggregate resource in order to search in it */
  935|   985k|  if(!URES_IS_CONTAINER(type)) {
  ------------------
  |  |   85|   985k|#define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   84|  1.97M|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:30): [True: 985k, False: 0]
  |  |  |  |  |  Branch (84:61): [True: 0, 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|  2.58M|  while(nextSepP && *pathP && t1 != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   65|  4.57M|#define RES_BOGUS 0xffffffff
  ------------------
                while(nextSepP && *pathP && t1 != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   85|  1.59M|#define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   84|  3.19M|#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.59M, False: 0]
  |  |  |  |  |  Branch (84:61): [True: 0, 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 (939:9): [True: 2.17M, False: 410k]
  |  Branch (939:21): [True: 1.99M, False: 179k]
  |  Branch (939:31): [True: 1.59M, False: 395k]
  ------------------
  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|  1.59M|    nextSepP = uprv_strchr(pathP, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|  1.59M|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  1.59M|#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|  1.59M|    if(nextSepP != nullptr) {
  ------------------
  |  Branch (947:8): [True: 1.18M, False: 410k]
  ------------------
  948|  1.18M|      if(nextSepP == pathP) {
  ------------------
  |  Branch (948:10): [True: 0, False: 1.18M]
  ------------------
  949|       |        // Empty key string.
  950|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  951|      0|      }
  952|  1.18M|      *nextSepP = 0; /* overwrite the separator with a NUL to terminate the key */
  953|  1.18M|      *path = nextSepP+1;
  954|  1.18M|    } else {
  955|   410k|      *path = uprv_strchr(pathP, 0);
  ------------------
  |  |   40|   410k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   410k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  956|   410k|    }
  957|       |
  958|       |    /* if the resource is a table */
  959|       |    /* try the key based access */
  960|  1.59M|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|  1.59M|#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.59M, False: 0]
  |  |  |  Branch (84:61): [True: 0, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  961|  1.59M|      *key = pathP;
  962|  1.59M|      t2 = res_getTableItemByKey(pResData, t1, &indexR, key);
  ------------------
  |  |  207|  1.59M|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  1.59M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.59M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.59M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  963|  1.59M|    } 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|  1.59M|    t1 = t2;
  975|  1.59M|    type = (UResType)RES_GET_TYPE(t1);
  ------------------
  |  |   68|  1.59M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  976|       |    /* position pathP to next resource key/index */
  977|  1.59M|    pathP = *path;
  978|  1.59M|  }
  979|       |
  980|   985k|  return t1;
  981|   985k|}
uresdata.cpp:_ZL12isAcceptablePvPKcS1_PK9UDataInfo:
  141|     19|             const UDataInfo *pInfo) {
  142|     19|    uprv_memcpy(context, pInfo->formatVersion, 4);
  ------------------
  |  |   42|     19|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     19|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|     19|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|     19|    _Pragma("clang diagnostic push") \
  |  |   45|     19|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|     19|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     19|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|     19|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     19|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|     19|    _Pragma("clang diagnostic pop") \
  |  |   49|     19|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     19|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|     19|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     19|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  143|     19|    return
  144|     19|        pInfo->size>=20 &&
  ------------------
  |  Branch (144:9): [True: 19, False: 0]
  ------------------
  145|     19|        pInfo->isBigEndian==U_IS_BIG_ENDIAN &&
  ------------------
  |  |  353|     38|#   define U_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
  ------------------
  |  Branch (145:9): [True: 19, False: 0]
  ------------------
  146|     19|        pInfo->charsetFamily==U_CHARSET_FAMILY &&
  ------------------
  |  |  588|     19|#   define U_CHARSET_FAMILY U_ASCII_FAMILY
  |  |  ------------------
  |  |  |  |  531|     38|#define U_ASCII_FAMILY 0
  |  |  ------------------
  ------------------
  |  Branch (146:9): [True: 19, False: 0]
  ------------------
  147|     19|        pInfo->sizeofUChar==U_SIZEOF_UCHAR &&
  ------------------
  |  |  352|     38|#define U_SIZEOF_UCHAR 2
  ------------------
  |  Branch (147:9): [True: 19, False: 0]
  ------------------
  148|     19|        pInfo->dataFormat[0]==0x52 &&   /* dataFormat="ResB" */
  ------------------
  |  Branch (148:9): [True: 19, False: 0]
  ------------------
  149|     19|        pInfo->dataFormat[1]==0x65 &&
  ------------------
  |  Branch (149:9): [True: 19, False: 0]
  ------------------
  150|     19|        pInfo->dataFormat[2]==0x73 &&
  ------------------
  |  Branch (150:9): [True: 19, False: 0]
  ------------------
  151|     19|        pInfo->dataFormat[3]==0x42 &&
  ------------------
  |  Branch (151:9): [True: 19, False: 0]
  ------------------
  152|     19|        (1<=pInfo->formatVersion[0] && pInfo->formatVersion[0]<=3);
  ------------------
  |  Branch (152:10): [True: 19, False: 0]
  |  Branch (152:40): [True: 19, False: 0]
  ------------------
  153|     19|}
uresdata.cpp:_ZL8res_initP12ResourceDataPhPKviP10UErrorCode:
  160|     19|         UErrorCode *errorCode) {
  161|     19|    UResType rootType;
  162|       |
  163|       |    /* get the root resource */
  164|     19|    pResData->pRoot = static_cast<const int32_t*>(inBytes);
  165|     19|    pResData->rootRes = static_cast<Resource>(*pResData->pRoot);
  166|     19|    pResData->p16BitUnits=&gEmpty16;
  167|       |
  168|       |    /* formatVersion 1.1 must have a root item and at least 5 indexes */
  169|     19|    if(length>=0 && (length/4)<((formatVersion[0]==1 && formatVersion[1]==0) ? 1 : 1+5)) {
  ------------------
  |  Branch (169:8): [True: 0, False: 19]
  |  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|     19|    rootType = static_cast<UResType>(RES_GET_TYPE(pResData->rootRes));
  ------------------
  |  |   68|     19|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  177|     19|    if(!URES_IS_TABLE(rootType)) {
  ------------------
  |  |   84|     19|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 19, False: 0]
  |  |  |  Branch (84:61): [True: 0, 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|     19|    if(formatVersion[0]==1 && formatVersion[1]==0) {
  ------------------
  |  Branch (183:8): [True: 0, False: 19]
  |  Branch (183:31): [True: 0, False: 0]
  ------------------
  184|      0|        pResData->localKeyLimit=0x10000;  /* greater than any 16-bit key string offset */
  185|     19|    } else {
  186|       |        /* bundles with formatVersion 1.1 and later contain an indexes[] array */
  187|     19|        const int32_t *indexes=pResData->pRoot+1;
  188|     19|        int32_t indexLength=indexes[URES_INDEX_LENGTH]&0xff;
  189|     19|        if(indexLength<=URES_INDEX_MAX_TABLE_LENGTH) {
  ------------------
  |  Branch (189:12): [True: 0, False: 19]
  ------------------
  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|     19|        if( length>=0 &&
  ------------------
  |  Branch (194:13): [True: 0, False: 19]
  ------------------
  195|     19|            (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|     19|        ) {
  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|     19|        if(indexes[URES_INDEX_KEYS_TOP]>(1+indexLength)) {
  ------------------
  |  Branch (202:12): [True: 13, False: 6]
  ------------------
  203|     13|            pResData->localKeyLimit=indexes[URES_INDEX_KEYS_TOP]<<2;
  204|     13|        }
  205|     19|        if(formatVersion[0]>=3) {
  ------------------
  |  Branch (205:12): [True: 7, False: 12]
  ------------------
  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|      7|            pResData->poolStringIndexLimit = static_cast<int32_t>(static_cast<uint32_t>(indexes[URES_INDEX_LENGTH]) >> 8);
  211|      7|        }
  212|     19|        if(indexLength>URES_INDEX_ATTRIBUTES) {
  ------------------
  |  Branch (212:12): [True: 19, False: 0]
  ------------------
  213|     19|            int32_t att=indexes[URES_INDEX_ATTRIBUTES];
  214|     19|            pResData->noFallback = static_cast<UBool>(att & URES_ATT_NO_FALLBACK);
  ------------------
  |  |  148|     19|#define URES_ATT_NO_FALLBACK 1
  ------------------
  215|     19|            pResData->isPoolBundle = static_cast<UBool>((att & URES_ATT_IS_POOL_BUNDLE) != 0);
  ------------------
  |  |  156|     19|#define URES_ATT_IS_POOL_BUNDLE 2
  ------------------
  216|     19|            pResData->usesPoolBundle = static_cast<UBool>((att & URES_ATT_USES_POOL_BUNDLE) != 0);
  ------------------
  |  |  157|     19|#define URES_ATT_USES_POOL_BUNDLE 4
  ------------------
  217|     19|            pResData->poolStringIndexLimit|=(att&0xf000)<<12;  // bits 15..12 -> 27..24
  218|     19|            pResData->poolStringIndex16Limit = static_cast<int32_t>(static_cast<uint32_t>(att) >> 16);
  219|     19|        }
  220|     19|        if((pResData->isPoolBundle || pResData->usesPoolBundle) && indexLength<=URES_INDEX_POOL_CHECKSUM) {
  ------------------
  |  Branch (220:13): [True: 2, False: 17]
  |  Branch (220:39): [True: 6, False: 11]
  |  Branch (220:68): [True: 0, False: 8]
  ------------------
  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|     19|        if( indexLength>URES_INDEX_16BIT_TOP &&
  ------------------
  |  Branch (225:13): [True: 19, False: 0]
  ------------------
  226|     19|            indexes[URES_INDEX_16BIT_TOP]>indexes[URES_INDEX_KEYS_TOP]
  ------------------
  |  Branch (226:13): [True: 19, False: 0]
  ------------------
  227|     19|        ) {
  228|     19|            pResData->p16BitUnits = reinterpret_cast<const uint16_t*>(pResData->pRoot + indexes[URES_INDEX_KEYS_TOP]);
  229|     19|        }
  230|     19|    }
  231|       |
  232|     19|    if(formatVersion[0]==1 || U_CHARSET_FAMILY==U_ASCII_FAMILY) {
  ------------------
  |  |  588|     19|#   define U_CHARSET_FAMILY U_ASCII_FAMILY
  |  |  ------------------
  |  |  |  |  531|     19|#define U_ASCII_FAMILY 0
  |  |  ------------------
  ------------------
                  if(formatVersion[0]==1 || U_CHARSET_FAMILY==U_ASCII_FAMILY) {
  ------------------
  |  |  531|     19|#define U_ASCII_FAMILY 0
  ------------------
  |  Branch (232:8): [True: 0, False: 19]
  |  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|     19|        pResData->useNativeStrcmp=true;
  238|     19|    }
  239|     19|}
uresdata.cpp:_ZN12_GLOBAL__N_114getStringArrayEPK12ResourceDataRKN6icu_7813ResourceArrayEPNS3_13UnicodeStringEiR10UErrorCode:
  388|     52|                       UErrorCode &errorCode) {
  389|     52|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (389:8): [True: 0, False: 52]
  ------------------
  390|      0|        return 0;
  391|      0|    }
  392|     52|    if(dest == nullptr ? capacity != 0 : capacity < 0) {
  ------------------
  |  Branch (392:8): [True: 0, False: 52]
  |  Branch (392:8): [True: 0, False: 52]
  ------------------
  393|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  394|      0|        return 0;
  395|      0|    }
  396|     52|    int32_t length = array.getSize();
  397|     52|    if(length == 0) {
  ------------------
  |  Branch (397:8): [True: 0, False: 52]
  ------------------
  398|      0|        return 0;
  399|      0|    }
  400|     52|    if(length > capacity) {
  ------------------
  |  Branch (400:8): [True: 0, False: 52]
  ------------------
  401|      0|        errorCode = U_BUFFER_OVERFLOW_ERROR;
  402|      0|        return length;
  403|      0|    }
  404|    380|    for(int32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (404:24): [True: 328, False: 52]
  ------------------
  405|    328|        int32_t sLength;
  406|       |        // No tracing: handled by the caller
  407|    328|        const char16_t *s = res_getStringNoTrace(pResData, array.internalGetResource(pResData, i), &sLength);
  ------------------
  |  |  205|    328|#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
  |  |  ------------------
  |  |  |  |  123|    328|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    328|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    328|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  408|    328|        if(s == nullptr) {
  ------------------
  |  Branch (408:12): [True: 0, False: 328]
  ------------------
  409|      0|            errorCode = U_RESOURCE_TYPE_MISMATCH;
  410|      0|            return 0;
  411|      0|        }
  412|    328|        dest[i].setTo(true, s, sLength);
  413|    328|    }
  414|     52|    return length;
  415|     52|}
uresdata.cpp:_ZL18_res_findTableItemPK12ResourceDataPKtiPKcPS5_:
   76|  3.40M|                   const char *key, const char **realKey) {
   77|  3.40M|    const char *tableKey;
   78|  3.40M|    int32_t mid, start, limit;
   79|  3.40M|    int result;
   80|       |
   81|       |    /* do a binary search for the key */
   82|  3.40M|    start=0;
   83|  3.40M|    limit=length;
   84|  10.0M|    while(start<limit) {
  ------------------
  |  Branch (84:11): [True: 9.46M, False: 592k]
  ------------------
   85|  9.46M|        mid = (start + limit) / 2;
   86|  9.46M|        tableKey = RES_GET_KEY16(pResData, keyOffsets[mid]);
  ------------------
  |  |   44|  9.46M|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 1.91M, False: 7.55M]
  |  |  ------------------
  |  |   45|  9.46M|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|  9.46M|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
   87|  9.46M|        if (pResData->useNativeStrcmp) {
  ------------------
  |  Branch (87:13): [True: 9.46M, False: 0]
  ------------------
   88|  9.46M|            result = uprv_strcmp(key, tableKey);
  ------------------
  |  |   38|  9.46M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  9.46M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   89|  9.46M|        } 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|  9.46M|        if (result < 0) {
  ------------------
  |  Branch (92:13): [True: 3.59M, False: 5.87M]
  ------------------
   93|  3.59M|            limit = mid;
   94|  5.87M|        } else if (result > 0) {
  ------------------
  |  Branch (94:20): [True: 3.05M, False: 2.81M]
  ------------------
   95|  3.05M|            start = mid + 1;
   96|  3.05M|        } else {
   97|       |            /* We found it! */
   98|  2.81M|            *realKey=tableKey;
   99|  2.81M|            return mid;
  100|  2.81M|        }
  101|  9.46M|    }
  102|   592k|    return URESDATA_ITEM_NOT_FOUND;  /* not found or table is empty. */
  ------------------
  |  |   53|   592k|#define URESDATA_ITEM_NOT_FOUND -1
  ------------------
  103|  3.40M|}
uresdata.cpp:_ZL18makeResourceFrom16PK12ResourceDatai:
  700|  2.11M|makeResourceFrom16(const ResourceData *pResData, int32_t res16) {
  701|  2.11M|    if(res16<pResData->poolStringIndex16Limit) {
  ------------------
  |  Branch (701:8): [True: 760k, False: 1.35M]
  ------------------
  702|       |        // Pool string, nothing to do.
  703|  1.35M|    } else {
  704|       |        // Local string, adjust the 16-bit offset to a regular one,
  705|       |        // with a larger pool string index limit.
  706|  1.35M|        res16=res16-pResData->poolStringIndex16Limit+pResData->poolStringIndexLimit;
  707|  1.35M|    }
  708|  2.11M|    return URES_MAKE_RESOURCE(URES_STRING_V2, res16);
  ------------------
  |  |   87|  2.11M|#define URES_MAKE_RESOURCE(type, offset) (((Resource)(type)<<28)|(Resource)(offset))
  ------------------
  709|  2.11M|}

_ZN6icu_7817ResourceDataValueC2Ev:
  516|   206k|        pResData(nullptr),
  517|   206k|        validLocaleDataEntry(nullptr),
  518|   206k|        res(static_cast<Resource>(URES_NONE)),
  519|   206k|        fTraceInfo() {}
_ZN6icu_7817ResourceDataValue7setDataERK12ResourceData:
  522|   480k|    void setData(const ResourceData &data) {
  523|   480k|        pResData = &data;
  524|   480k|    }
_ZN6icu_7817ResourceDataValue23setValidLocaleDataEntryEP18UResourceDataEntry:
  526|   301k|    void setValidLocaleDataEntry(UResourceDataEntry *entry) {
  527|   301k|        validLocaleDataEntry = entry;
  528|   301k|    }
_ZN6icu_7817ResourceDataValue11setResourceEjONS_14ResourceTracerE:
  530|  3.03M|    void setResource(Resource r, ResourceTracer&& traceInfo) {
  531|  3.03M|        res = r;
  532|  3.03M|        fTraceInfo = traceInfo;
  533|  3.03M|    }
_ZNK6icu_7817ResourceDataValue7getDataEv:
  535|  10.3M|    const ResourceData &getData() const { return *pResData; }
_ZNK6icu_7817ResourceDataValue23getValidLocaleDataEntryEv:
  536|   134k|    UResourceDataEntry *getValidLocaleDataEntry() const { return validLocaleDataEntry; }
_ZNK6icu_7817ResourceDataValue11getResourceEv:
  537|   134k|    Resource getResource() const { return res; }
_ZN6icu_7813res_getStringERKNS_14ResourceTracerEPK12ResourceDatajPi:
  486|  1.89M|        const ResourceData *pResData, Resource res, int32_t *pLength) {
  487|  1.89M|    traceInfo.trace("string");
  488|  1.89M|    return res_getStringNoTrace(pResData, res, pLength);
  ------------------
  |  |  205|  1.89M|#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
  |  |  ------------------
  |  |  |  |  123|  1.89M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.89M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.89M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  489|  1.89M|}
_ZN6icu_7813res_getBinaryERKNS_14ResourceTracerEPK12ResourceDatajPi:
  492|      3|        const ResourceData *pResData, Resource res, int32_t *pLength) {
  493|      3|    traceInfo.trace("binary");
  494|      3|    return res_getBinaryNoTrace(pResData, res, pLength);
  ------------------
  |  |  201|      3|#define res_getBinaryNoTrace U_ICU_ENTRY_POINT_RENAME(res_getBinaryNoTrace)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  495|      3|}
_ZN6icu_7816res_getIntVectorERKNS_14ResourceTracerEPK12ResourceDatajPi:
  498|     17|        const ResourceData *pResData, Resource res, int32_t *pLength) {
  499|     17|    traceInfo.trace("intvector");
  500|     17|    return res_getIntVectorNoTrace(pResData, res, pLength);
  ------------------
  |  |  202|     17|#define res_getIntVectorNoTrace U_ICU_ENTRY_POINT_RENAME(res_getIntVectorNoTrace)
  |  |  ------------------
  |  |  |  |  123|     17|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     17|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     17|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  501|     17|}
_ZN6icu_7810res_getIntERKNS_14ResourceTracerEj:
  503|  88.9k|inline int32_t res_getInt(const ResourceTracer& traceInfo, Resource res) {
  504|  88.9k|    traceInfo.trace("int");
  505|  88.9k|    return RES_GET_INT_NO_TRACE(res);
  ------------------
  |  |   76|  88.9k|#   define RES_GET_INT_NO_TRACE(res) (((int32_t)((res)<<4L))>>4L)
  ------------------
  506|  88.9k|}

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

ustrcase_internalToLower_78:
 1262|  92.5k|                         UErrorCode &errorCode) {
 1263|  92.5k|    UCaseContext csc=UCASECONTEXT_INITIALIZER;
  ------------------
  |  |  241|  92.5k|#define UCASECONTEXT_INITIALIZER { NULL,  0, 0, 0,  0, 0,  0,  0, 0, 0 }
  ------------------
 1264|  92.5k|    csc.p=(void *)src;
 1265|  92.5k|    csc.limit=srcLength;
 1266|  92.5k|    int32_t destIndex = toLower(
 1267|  92.5k|        caseLocale, options,
 1268|  92.5k|        dest, destCapacity,
 1269|  92.5k|        src, &csc, 0, srcLength,
 1270|  92.5k|        edits, errorCode);
 1271|  92.5k|    return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode);
 1272|  92.5k|}
ustrcase.cpp:_ZN6icu_7812_GLOBAL__N_115appendUnchangedEPDsiiPKDsijPNS_5EditsE:
  165|  4.21M|                const char16_t *s, int32_t length, uint32_t options, icu::Edits *edits) {
  166|  4.21M|    if (length <= 0) {
  ------------------
  |  Branch (166:9): [True: 2.69M, False: 1.52M]
  ------------------
  167|  2.69M|        return destIndex;
  168|  2.69M|    }
  169|  1.52M|    return appendNonEmptyUnchanged(dest, destIndex, destCapacity, s, length, options, edits);
  170|  4.21M|}
ustrcase.cpp:_ZN6icu_7812_GLOBAL__N_123appendNonEmptyUnchangedEPDsiiPKDsijPNS_5EditsE:
  147|  1.52M|                        const char16_t *s, int32_t length, uint32_t options, icu::Edits *edits) {
  148|  1.52M|    if(edits!=nullptr) {
  ------------------
  |  Branch (148:8): [True: 746k, False: 775k]
  ------------------
  149|   746k|        edits->addUnchanged(length);
  150|   746k|    }
  151|  1.52M|    if(options & U_OMIT_UNCHANGED_TEXT) {
  ------------------
  |  |  152|  1.52M|#define U_OMIT_UNCHANGED_TEXT 0x4000
  ------------------
  |  Branch (151:8): [True: 746k, False: 775k]
  ------------------
  152|   746k|        return destIndex;
  153|   746k|    }
  154|   775k|    if(length>(INT32_MAX-destIndex)) {
  ------------------
  |  Branch (154:8): [True: 0, False: 775k]
  ------------------
  155|      0|        return -1;  // integer overflow
  156|      0|    }
  157|   775k|    if((destIndex+length)<=destCapacity) {
  ------------------
  |  Branch (157:8): [True: 774k, False: 1.21k]
  ------------------
  158|   774k|        u_memcpy(dest+destIndex, s, length);
  ------------------
  |  |  334|   774k|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|   774k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   774k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   774k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  159|   774k|    }
  160|   775k|    return destIndex + length;
  161|   775k|}
ustrcase.cpp:_ZN6icu_7812_GLOBAL__N_125utf16_caseContextIteratorEPva:
  173|  1.15M|utf16_caseContextIterator(void *context, int8_t dir) {
  174|  1.15M|    UCaseContext* csc = static_cast<UCaseContext*>(context);
  175|  1.15M|    UChar32 c;
  176|       |
  177|  1.15M|    if(dir<0) {
  ------------------
  |  Branch (177:8): [True: 571k, False: 584k]
  ------------------
  178|       |        /* reset for backward iteration */
  179|   571k|        csc->index=csc->cpStart;
  180|   571k|        csc->dir=dir;
  181|   584k|    } else if(dir>0) {
  ------------------
  |  Branch (181:15): [True: 580k, False: 3.95k]
  ------------------
  182|       |        /* reset for forward iteration */
  183|   580k|        csc->index=csc->cpLimit;
  184|   580k|        csc->dir=dir;
  185|   580k|    } else {
  186|       |        /* continue current iteration direction */
  187|  3.95k|        dir=csc->dir;
  188|  3.95k|    }
  189|       |
  190|  1.15M|    if(dir<0) {
  ------------------
  |  Branch (190:8): [True: 574k, False: 581k]
  ------------------
  191|   574k|        if(csc->start<csc->index) {
  ------------------
  |  Branch (191:12): [True: 573k, False: 1.51k]
  ------------------
  192|   573k|            U16_PREV((const char16_t *)csc->p, csc->start, csc->index, c);
  ------------------
  |  |  570|   573k|#define U16_PREV(s, start, i, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   573k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  571|   573k|    (c)=(s)[--(i)]; \
  |  |  572|   573k|    if(U16_IS_TRAIL(c)) { \
  |  |  ------------------
  |  |  |  |   67|   573k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 558k, False: 14.4k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  573|   558k|        uint16_t __c2; \
  |  |  574|   558k|        if((i)>(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \
  |  |  ------------------
  |  |  |  |   59|   558k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 4.27k, False: 554k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (574:12): [True: 558k, False: 202]
  |  |  ------------------
  |  |  575|  4.27k|            --(i); \
  |  |  576|  4.27k|            (c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \
  |  |  ------------------
  |  |  |  |  113|  4.27k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  |  |  ------------------
  |  |  |  |  |  |   99|  4.27k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  577|  4.27k|        } \
  |  |  578|   558k|    } \
  |  |  579|   573k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   573k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|   573k|            return c;
  194|   573k|        }
  195|   581k|    } else {
  196|   581k|        if(csc->index<csc->limit) {
  ------------------
  |  Branch (196:12): [True: 580k, False: 1.31k]
  ------------------
  197|   580k|            U16_NEXT((const char16_t *)csc->p, csc->index, csc->limit, c);
  ------------------
  |  |  309|   580k|#define U16_NEXT(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   580k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  310|   580k|    (c)=(s)[(i)++]; \
  |  |  311|   580k|    if(U16_IS_LEAD(c)) { \
  |  |  ------------------
  |  |  |  |   59|   580k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 5.93k, False: 574k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  312|  5.93k|        uint16_t __c2; \
  |  |  313|  5.93k|        if((i)!=(length) && U16_IS_TRAIL(__c2=(s)[(i)])) { \
  |  |  ------------------
  |  |  |  |   67|  5.45k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 2.83k, False: 2.62k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (313:12): [True: 5.45k, False: 482]
  |  |  ------------------
  |  |  314|  2.83k|            ++(i); \
  |  |  315|  2.83k|            (c)=U16_GET_SUPPLEMENTARY((c), __c2); \
  |  |  ------------------
  |  |  |  |  113|  2.83k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  |  |  ------------------
  |  |  |  |  |  |   99|  2.83k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  316|  2.83k|        } \
  |  |  317|  5.93k|    } \
  |  |  318|   580k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   580k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  198|   580k|            return c;
  199|   580k|        }
  200|   581k|    }
  201|  2.82k|    return U_SENTINEL;
  ------------------
  |  |  469|  2.82k|#define U_SENTINEL (-1)
  ------------------
  202|  1.15M|}
ustrcase.cpp:_ZN6icu_7812_GLOBAL__N_112appendResultEPDsiiiPKDsijPNS_5EditsE:
   65|  2.33M|             int32_t cpLength, uint32_t options, icu::Edits *edits) {
   66|  2.33M|    UChar32 c;
   67|  2.33M|    int32_t length;
   68|       |
   69|       |    /* decode the result */
   70|  2.33M|    if(result<0) {
  ------------------
  |  Branch (70:8): [True: 0, False: 2.33M]
  ------------------
   71|       |        /* (not) original code point */
   72|      0|        if(edits!=nullptr) {
  ------------------
  |  Branch (72:12): [True: 0, False: 0]
  ------------------
   73|      0|            edits->addUnchanged(cpLength);
   74|      0|        }
   75|      0|        if(options & U_OMIT_UNCHANGED_TEXT) {
  ------------------
  |  |  152|      0|#define U_OMIT_UNCHANGED_TEXT 0x4000
  ------------------
  |  Branch (75:12): [True: 0, False: 0]
  ------------------
   76|      0|            return destIndex;
   77|      0|        }
   78|      0|        c=~result;
   79|      0|        if(destIndex<destCapacity && c<=0xffff) {  // BMP slightly-fastpath
  ------------------
  |  Branch (79:12): [True: 0, False: 0]
  |  Branch (79:38): [True: 0, False: 0]
  ------------------
   80|      0|            dest[destIndex++] = static_cast<char16_t>(c);
   81|      0|            return destIndex;
   82|      0|        }
   83|      0|        length=cpLength;
   84|  2.33M|    } else {
   85|  2.33M|        if(result<=UCASE_MAX_STRING_LENGTH) {
  ------------------
  |  Branch (85:12): [True: 1.72M, False: 613k]
  ------------------
   86|  1.72M|            c=U_SENTINEL;
  ------------------
  |  |  469|  1.72M|#define U_SENTINEL (-1)
  ------------------
   87|  1.72M|            length=result;
   88|  1.72M|        } else if(destIndex<destCapacity && result<=0xffff) {  // BMP slightly-fastpath
  ------------------
  |  Branch (88:19): [True: 340k, False: 272k]
  |  Branch (88:45): [True: 332k, False: 8.32k]
  ------------------
   89|   332k|            dest[destIndex++] = static_cast<char16_t>(result);
   90|   332k|            if(edits!=nullptr) {
  ------------------
  |  Branch (90:16): [True: 39.8k, False: 292k]
  ------------------
   91|  39.8k|                edits->addReplace(cpLength, 1);
   92|  39.8k|            }
   93|   332k|            return destIndex;
   94|   332k|        } else {
   95|   280k|            c=result;
   96|   280k|            length=U16_LENGTH(c);
  ------------------
  |  |  141|   280k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 265k, False: 15.3k]
  |  |  ------------------
  ------------------
   97|   280k|        }
   98|  2.00M|        if(edits!=nullptr) {
  ------------------
  |  Branch (98:12): [True: 1.13M, False: 866k]
  ------------------
   99|  1.13M|            edits->addReplace(cpLength, length);
  100|  1.13M|        }
  101|  2.00M|    }
  102|  2.00M|    if(length>(INT32_MAX-destIndex)) {
  ------------------
  |  Branch (102:8): [True: 0, False: 2.00M]
  ------------------
  103|      0|        return -1;  // integer overflow
  104|      0|    }
  105|       |
  106|  2.00M|    if(destIndex<destCapacity) {
  ------------------
  |  Branch (106:8): [True: 982k, False: 1.02M]
  ------------------
  107|       |        /* append the result */
  108|   982k|        if(c>=0) {
  ------------------
  |  Branch (108:12): [True: 8.32k, False: 974k]
  ------------------
  109|       |            /* code point */
  110|  8.32k|            UBool isError=false;
  111|  8.32k|            U16_APPEND(dest, destIndex, destCapacity, c, isError);
  ------------------
  |  |  393|  8.32k|#define U16_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  8.32k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  394|  8.32k|    if((uint32_t)(c)<=0xffff) { \
  |  |  ------------------
  |  |  |  Branch (394:8): [True: 0, False: 8.32k]
  |  |  ------------------
  |  |  395|      0|        (s)[(i)++]=(uint16_t)(c); \
  |  |  396|  8.32k|    } else if((uint32_t)(c)<=0x10ffff && (i)+1<(capacity)) { \
  |  |  ------------------
  |  |  |  Branch (396:15): [True: 8.32k, False: 0]
  |  |  |  Branch (396:42): [True: 8.12k, False: 195]
  |  |  ------------------
  |  |  397|  8.12k|        (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
  |  |  398|  8.12k|        (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
  |  |  399|  8.12k|    } else /* c>0x10ffff or not enough space */ { \
  |  |  400|    195|        (isError)=true; \
  |  |  401|    195|    } \
  |  |  402|  8.32k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  8.32k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  112|  8.32k|            if(isError) {
  ------------------
  |  Branch (112:16): [True: 195, False: 8.12k]
  ------------------
  113|       |                /* overflow, nothing written */
  114|    195|                destIndex+=length;
  115|    195|            }
  116|   974k|        } else {
  117|       |            /* string */
  118|   974k|            if((destIndex+length)<=destCapacity) {
  ------------------
  |  Branch (118:16): [True: 973k, False: 800]
  ------------------
  119|  2.92M|                while(length>0) {
  ------------------
  |  Branch (119:23): [True: 1.94M, False: 973k]
  ------------------
  120|  1.94M|                    dest[destIndex++]=*s++;
  121|  1.94M|                    --length;
  122|  1.94M|                }
  123|   973k|            } else {
  124|       |                /* overflow */
  125|    800|                destIndex+=length;
  126|    800|            }
  127|   974k|        }
  128|  1.02M|    } else {
  129|       |        /* preflight */
  130|  1.02M|        destIndex+=length;
  131|  1.02M|    }
  132|  2.00M|    return destIndex;
  133|  2.00M|}
ustrcase.cpp:_ZN6icu_7812_GLOBAL__N_17toLowerEijPDsiPKDsP12UCaseContextiiPNS_5EditsER10UErrorCode:
  211|  92.5k|                icu::Edits *edits, UErrorCode &errorCode) {
  212|  92.5k|    const int8_t *latinToLower;
  213|  92.5k|    if (caseLocale == UCASE_LOC_ROOT ||
  ------------------
  |  Branch (213:9): [True: 92.5k, False: 0]
  ------------------
  214|  92.5k|            (caseLocale >= 0 ?
  ------------------
  |  Branch (214:13): [True: 0, False: 0]
  |  Branch (214:14): [True: 0, False: 0]
  ------------------
  215|      0|                !(caseLocale == UCASE_LOC_TURKISH || caseLocale == UCASE_LOC_LITHUANIAN) :
  ------------------
  |  Branch (215:19): [True: 0, False: 0]
  |  Branch (215:54): [True: 0, False: 0]
  ------------------
  216|  92.5k|                (options & _FOLD_CASE_OPTIONS_MASK) == U_FOLD_CASE_DEFAULT)) {
  ------------------
  |  |   83|      0|#define _FOLD_CASE_OPTIONS_MASK 7
  ------------------
                              (options & _FOLD_CASE_OPTIONS_MASK) == U_FOLD_CASE_DEFAULT)) {
  ------------------
  |  |   22|      0|#define U_FOLD_CASE_DEFAULT 0
  ------------------
  217|  92.5k|        latinToLower = LatinCase::TO_LOWER_NORMAL;
  218|  92.5k|    } else {
  219|      0|        latinToLower = LatinCase::TO_LOWER_TR_LT;
  220|      0|    }
  221|  92.5k|    const UTrie2 *trie = ucase_getTrie();
  ------------------
  |  |  574|  92.5k|#define ucase_getTrie U_ICU_ENTRY_POINT_RENAME(ucase_getTrie)
  |  |  ------------------
  |  |  |  |  123|  92.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  92.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  92.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  222|  92.5k|    int32_t destIndex = 0;
  223|  92.5k|    int32_t prev = srcStart;
  224|  92.5k|    int32_t srcIndex = srcStart;
  225|  3.54M|    for (;;) {
  226|       |        // fast path for simple cases
  227|  3.54M|        char16_t lead = 0;
  228|  12.4M|        while (srcIndex < srcLimit) {
  ------------------
  |  Branch (228:16): [True: 12.3M, False: 92.5k]
  ------------------
  229|  12.3M|            lead = src[srcIndex];
  230|  12.3M|            int32_t delta;
  231|  12.3M|            if (lead < LatinCase::LONG_S) {
  ------------------
  |  Branch (231:17): [True: 5.23M, False: 7.12M]
  ------------------
  232|  5.23M|                int8_t d = latinToLower[lead];
  233|  5.23M|                if (d == LatinCase::EXC) { break; }
  ------------------
  |  Branch (233:21): [True: 1.72M, False: 3.51M]
  ------------------
  234|  3.51M|                ++srcIndex;
  235|  3.51M|                if (d == 0) { continue; }
  ------------------
  |  Branch (235:21): [True: 1.78M, False: 1.72M]
  ------------------
  236|  1.72M|                delta = d;
  237|  7.12M|            } else if (lead >= 0xd800) {
  ------------------
  |  Branch (237:24): [True: 1.12M, False: 6.00M]
  ------------------
  238|  1.12M|                break;  // surrogate or higher
  239|  6.00M|            } else {
  240|  6.00M|                uint16_t props = UTRIE2_GET16_FROM_U16_SINGLE_LEAD(trie, lead);
  ------------------
  |  |  557|  6.00M|#define UTRIE2_GET16_FROM_U16_SINGLE_LEAD(trie, c) _UTRIE2_GET_FROM_U16_SINGLE_LEAD((trie), index, c)
  |  |  ------------------
  |  |  |  |  859|  6.00M|    (trie)->data[_UTRIE2_INDEX_FROM_U16_SINGLE_LEAD((trie)->index, c)]
  |  |  |  |  ------------------
  |  |  |  |  |  |  820|  6.00M|#define _UTRIE2_INDEX_FROM_U16_SINGLE_LEAD(trieIndex, c) _UTRIE2_INDEX_RAW(0, trieIndex, c)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|  6.00M|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  816|  6.00M|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|  6.00M|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  241|  6.00M|                if (UCASE_HAS_EXCEPTION(props)) { break; }
  ------------------
  |  |  380|  6.00M|#define UCASE_HAS_EXCEPTION(props) ((props)&UCASE_EXCEPTION)
  |  |  ------------------
  |  |  |  |  377|  6.00M|#define UCASE_EXCEPTION         8
  |  |  ------------------
  |  |  |  Branch (380:36): [True: 603k, False: 5.40M]
  |  |  ------------------
  ------------------
  242|  5.40M|                ++srcIndex;
  243|  5.40M|                if (!UCASE_IS_UPPER_OR_TITLE(props) || (delta = UCASE_GET_DELTA(props)) == 0) {
  ------------------
  |  |  374|  10.8M|#define UCASE_IS_UPPER_OR_TITLE(props) ((props)&2)
  ------------------
                              if (!UCASE_IS_UPPER_OR_TITLE(props) || (delta = UCASE_GET_DELTA(props)) == 0) {
  ------------------
  |  |  397|  54.0k|#   define UCASE_GET_DELTA(props) ((int16_t)(props)>>UCASE_DELTA_SHIFT)
  |  |  ------------------
  |  |  |  |  391|  54.0k|#define UCASE_DELTA_SHIFT   7
  |  |  ------------------
  ------------------
  |  Branch (243:21): [True: 5.34M, False: 54.0k]
  |  Branch (243:56): [True: 552, False: 53.4k]
  ------------------
  244|  5.34M|                    continue;
  245|  5.34M|                }
  246|  5.40M|            }
  247|  1.78M|            lead += static_cast<char16_t>(delta);
  248|  1.78M|            destIndex = appendUnchanged(dest, destIndex, destCapacity,
  249|  1.78M|                                        src + prev, srcIndex - 1 - prev, options, edits);
  250|  1.78M|            if (destIndex >= 0) {
  ------------------
  |  Branch (250:17): [True: 1.78M, False: 0]
  ------------------
  251|  1.78M|                destIndex = appendUChar(dest, destIndex, destCapacity, lead);
  252|  1.78M|                if (edits != nullptr) {
  ------------------
  |  Branch (252:21): [True: 891k, False: 891k]
  ------------------
  253|   891k|                    edits->addReplace(1, 1);
  254|   891k|                }
  255|  1.78M|            }
  256|  1.78M|            if (destIndex < 0) {
  ------------------
  |  Branch (256:17): [True: 0, False: 1.78M]
  ------------------
  257|      0|                errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
  258|      0|                return 0;
  259|      0|            }
  260|  1.78M|            prev = srcIndex;
  261|  1.78M|        }
  262|  3.54M|        if (srcIndex >= srcLimit) {
  ------------------
  |  Branch (262:13): [True: 92.5k, False: 3.45M]
  ------------------
  263|  92.5k|            break;
  264|  92.5k|        }
  265|       |        // slow path
  266|  3.45M|        int32_t cpStart = srcIndex++;
  267|  3.45M|        char16_t trail;
  268|  3.45M|        UChar32 c;
  269|  3.45M|        if (U16_IS_LEAD(lead) && srcIndex < srcLimit && U16_IS_TRAIL(trail = src[srcIndex])) {
  ------------------
  |  |   59|  6.90M|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 76.0k, False: 3.37M]
  |  |  ------------------
  ------------------
                      if (U16_IS_LEAD(lead) && srcIndex < srcLimit && U16_IS_TRAIL(trail = src[srcIndex])) {
  ------------------
  |  |   67|  75.5k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 25.6k, False: 49.8k]
  |  |  ------------------
  ------------------
  |  Branch (269:34): [True: 75.5k, False: 510]
  ------------------
  270|  25.6k|            c = U16_GET_SUPPLEMENTARY(lead, trail);
  ------------------
  |  |  113|  25.6k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|  25.6k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
  271|  25.6k|            ++srcIndex;
  272|  3.42M|        } else {
  273|  3.42M|            c = lead;
  274|  3.42M|        }
  275|  3.45M|        const char16_t *s = nullptr;
  276|  3.45M|        if (caseLocale >= 0) {
  ------------------
  |  Branch (276:13): [True: 3.45M, False: 0]
  ------------------
  277|  3.45M|            csc->cpStart = cpStart;
  278|  3.45M|            csc->cpLimit = srcIndex;
  279|  3.45M|            c = ucase_toFullLower(c, utf16_caseContextIterator, csc, &s, caseLocale);
  ------------------
  |  |  581|  3.45M|#define ucase_toFullLower U_ICU_ENTRY_POINT_RENAME(ucase_toFullLower)
  |  |  ------------------
  |  |  |  |  123|  3.45M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.45M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.45M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  280|  3.45M|        } else {
  281|      0|            c = ucase_toFullFolding(c, &s, options);
  ------------------
  |  |  580|      0|#define ucase_toFullFolding U_ICU_ENTRY_POINT_RENAME(ucase_toFullFolding)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  282|      0|        }
  283|  3.45M|        if (c >= 0) {
  ------------------
  |  Branch (283:13): [True: 2.33M, False: 1.11M]
  ------------------
  284|  2.33M|            destIndex = appendUnchanged(dest, destIndex, destCapacity,
  285|  2.33M|                                        src + prev, cpStart - prev, options, edits);
  286|  2.33M|            if (destIndex >= 0) {
  ------------------
  |  Branch (286:17): [True: 2.33M, False: 0]
  ------------------
  287|  2.33M|                destIndex = appendResult(dest, destIndex, destCapacity, c, s,
  288|  2.33M|                                         srcIndex - cpStart, options, edits);
  289|  2.33M|            }
  290|  2.33M|            if (destIndex < 0) {
  ------------------
  |  Branch (290:17): [True: 0, False: 2.33M]
  ------------------
  291|      0|                errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
  292|      0|                return 0;
  293|      0|            }
  294|  2.33M|            prev = srcIndex;
  295|  2.33M|        }
  296|  3.45M|    }
  297|  92.5k|    destIndex = appendUnchanged(dest, destIndex, destCapacity,
  298|  92.5k|                                src + prev, srcIndex - prev, options, edits);
  299|  92.5k|    if (destIndex < 0) {
  ------------------
  |  Branch (299:9): [True: 0, False: 92.5k]
  ------------------
  300|      0|        errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
  301|      0|        return 0;
  302|      0|    }
  303|  92.5k|    return destIndex;
  304|  92.5k|}
ustrcase.cpp:_ZN6icu_7812_GLOBAL__N_126checkOverflowAndEditsErrorEiiPNS_5EditsER10UErrorCode:
   50|  92.5k|                                   Edits *edits, UErrorCode &errorCode) {
   51|  92.5k|    if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (51:9): [True: 92.5k, False: 0]
  ------------------
   52|  92.5k|        if (destIndex > destCapacity) {
  ------------------
  |  Branch (52:13): [True: 2.82k, False: 89.6k]
  ------------------
   53|  2.82k|            errorCode = U_BUFFER_OVERFLOW_ERROR;
   54|  89.6k|        } else if (edits != nullptr) {
  ------------------
  |  Branch (54:20): [True: 4.64k, False: 85.0k]
  ------------------
   55|  4.64k|            edits->copyErrorTo(errorCode);
   56|  4.64k|        }
   57|  92.5k|    }
   58|  92.5k|    return destIndex;
   59|  92.5k|}
ustrcase.cpp:_ZN6icu_7812_GLOBAL__N_111appendUCharEPDsiiDs:
  136|  1.78M|appendUChar(char16_t *dest, int32_t destIndex, int32_t destCapacity, char16_t c) {
  137|  1.78M|    if(destIndex<destCapacity) {
  ------------------
  |  Branch (137:8): [True: 1.27M, False: 506k]
  ------------------
  138|  1.27M|        dest[destIndex]=c;
  139|  1.27M|    } else if(destIndex==INT32_MAX) {
  ------------------
  |  Branch (139:15): [True: 0, False: 506k]
  ------------------
  140|      0|        return -1;  // integer overflow
  141|      0|    }
  142|  1.78M|    return destIndex+1;
  143|  1.78M|}

ustrcase_getCaseLocale_78:
   31|  90.0k|ustrcase_getCaseLocale(const char *locale) {
   32|  90.0k|    if (locale == nullptr) {
  ------------------
  |  Branch (32:9): [True: 0, False: 90.0k]
  ------------------
   33|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   34|      0|    }
   35|  90.0k|    if (*locale == 0) {
  ------------------
  |  Branch (35:9): [True: 90.0k, False: 0]
  ------------------
   36|  90.0k|        return UCASE_LOC_ROOT;
   37|  90.0k|    } else {
   38|      0|        return ucase_getCaseLocale(locale);
  ------------------
  |  |  572|      0|#define ucase_getCaseLocale U_ICU_ENTRY_POINT_RENAME(ucase_getCaseLocale)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   39|      0|    }
   40|  90.0k|}

u_strFindFirst_78:
   57|   190k|               const char16_t *sub, int32_t subLength) {
   58|   190k|    const char16_t *start, *p, *q, *subLimit;
   59|   190k|    char16_t c, cs, cq;
   60|       |
   61|   190k|    if(sub==nullptr || subLength<-1) {
  ------------------
  |  Branch (61:8): [True: 0, False: 190k]
  |  Branch (61:24): [True: 0, False: 190k]
  ------------------
   62|      0|        return (char16_t *)s;
   63|      0|    }
   64|   190k|    if(s==nullptr || length<-1) {
  ------------------
  |  Branch (64:8): [True: 0, False: 190k]
  |  Branch (64:22): [True: 0, False: 190k]
  ------------------
   65|      0|        return nullptr;
   66|      0|    }
   67|       |
   68|   190k|    start=s;
   69|       |
   70|   190k|    if(length<0 && subLength<0) {
  ------------------
  |  Branch (70:8): [True: 0, False: 190k]
  |  Branch (70:20): [True: 0, False: 0]
  ------------------
   71|       |        /* both strings are NUL-terminated */
   72|      0|        if((cs=*sub++)==0) {
  ------------------
  |  Branch (72:12): [True: 0, False: 0]
  ------------------
   73|      0|            return (char16_t *)s;
   74|      0|        }
   75|      0|        if(*sub==0 && !U16_IS_SURROGATE(cs)) {
  ------------------
  |  |   75|      0|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|      0|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  ------------------
  ------------------
  |  Branch (75:12): [True: 0, False: 0]
  |  Branch (75:23): [True: 0, False: 0]
  ------------------
   76|       |            /* the substring consists of a single, non-surrogate BMP code point */
   77|      0|            return u_strchr(s, cs);
  ------------------
  |  |  385|      0|#define u_strchr U_ICU_ENTRY_POINT_RENAME(u_strchr)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   78|      0|        }
   79|       |
   80|      0|        while((c=*s++)!=0) {
  ------------------
  |  Branch (80:15): [True: 0, False: 0]
  ------------------
   81|      0|            if(c==cs) {
  ------------------
  |  Branch (81:16): [True: 0, False: 0]
  ------------------
   82|       |                /* found first substring char16_t, compare rest */
   83|      0|                p=s;
   84|      0|                q=sub;
   85|      0|                for(;;) {
   86|      0|                    if((cq=*q)==0) {
  ------------------
  |  Branch (86:24): [True: 0, False: 0]
  ------------------
   87|      0|                        if(isMatchAtCPBoundary(start, s-1, p, nullptr)) {
  ------------------
  |  Branch (87:28): [True: 0, False: 0]
  ------------------
   88|      0|                            return (char16_t *)(s-1); /* well-formed match */
   89|      0|                        } else {
   90|      0|                            break; /* no match because surrogate pair is split */
   91|      0|                        }
   92|      0|                    }
   93|      0|                    if((c=*p)==0) {
  ------------------
  |  Branch (93:24): [True: 0, False: 0]
  ------------------
   94|      0|                        return nullptr; /* no match, and none possible after s */
   95|      0|                    }
   96|      0|                    if(c!=cq) {
  ------------------
  |  Branch (96:24): [True: 0, False: 0]
  ------------------
   97|      0|                        break; /* no match */
   98|      0|                    }
   99|      0|                    ++p;
  100|      0|                    ++q;
  101|      0|                }
  102|      0|            }
  103|      0|        }
  104|       |
  105|       |        /* not found */
  106|      0|        return nullptr;
  107|      0|    }
  108|       |
  109|   190k|    if(subLength<0) {
  ------------------
  |  Branch (109:8): [True: 84.8k, False: 106k]
  ------------------
  110|  84.8k|        subLength=u_strlen(sub);
  ------------------
  |  |  393|  84.8k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|  84.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  84.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  84.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  111|  84.8k|    }
  112|   190k|    if(subLength==0) {
  ------------------
  |  Branch (112:8): [True: 0, False: 190k]
  ------------------
  113|      0|        return (char16_t *)s;
  114|      0|    }
  115|       |
  116|       |    /* get sub[0] to search for it fast */
  117|   190k|    cs=*sub++;
  118|   190k|    --subLength;
  119|   190k|    subLimit=sub+subLength;
  120|       |
  121|   190k|    if(subLength==0 && !U16_IS_SURROGATE(cs)) {
  ------------------
  |  |   75|      0|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|      0|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  ------------------
  ------------------
  |  Branch (121:8): [True: 0, False: 190k]
  |  Branch (121:24): [True: 0, False: 0]
  ------------------
  122|       |        /* the substring consists of a single, non-surrogate BMP code point */
  123|      0|        return length<0 ? u_strchr(s, cs) : u_memchr(s, cs, length);
  ------------------
  |  |  385|      0|#define u_strchr U_ICU_ENTRY_POINT_RENAME(u_strchr)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      return length<0 ? u_strchr(s, cs) : u_memchr(s, cs, length);
  ------------------
  |  |  330|      0|#define u_memchr U_ICU_ENTRY_POINT_RENAME(u_memchr)
  |  |  ------------------
  |  |  |  |  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 (123:16): [True: 0, False: 0]
  ------------------
  124|      0|    }
  125|       |
  126|   190k|    if(length<0) {
  ------------------
  |  Branch (126:8): [True: 0, False: 190k]
  ------------------
  127|       |        /* s is NUL-terminated */
  128|      0|        while((c=*s++)!=0) {
  ------------------
  |  Branch (128:15): [True: 0, False: 0]
  ------------------
  129|      0|            if(c==cs) {
  ------------------
  |  Branch (129:16): [True: 0, False: 0]
  ------------------
  130|       |                /* found first substring char16_t, compare rest */
  131|      0|                p=s;
  132|      0|                q=sub;
  133|      0|                for(;;) {
  134|      0|                    if(q==subLimit) {
  ------------------
  |  Branch (134:24): [True: 0, False: 0]
  ------------------
  135|      0|                        if(isMatchAtCPBoundary(start, s-1, p, nullptr)) {
  ------------------
  |  Branch (135:28): [True: 0, False: 0]
  ------------------
  136|      0|                            return (char16_t *)(s-1); /* well-formed match */
  137|      0|                        } else {
  138|      0|                            break; /* no match because surrogate pair is split */
  139|      0|                        }
  140|      0|                    }
  141|      0|                    if((c=*p)==0) {
  ------------------
  |  Branch (141:24): [True: 0, False: 0]
  ------------------
  142|      0|                        return nullptr; /* no match, and none possible after s */
  143|      0|                    }
  144|      0|                    if(c!=*q) {
  ------------------
  |  Branch (144:24): [True: 0, False: 0]
  ------------------
  145|      0|                        break; /* no match */
  146|      0|                    }
  147|      0|                    ++p;
  148|      0|                    ++q;
  149|      0|                }
  150|      0|            }
  151|      0|        }
  152|   190k|    } else {
  153|   190k|        const char16_t *limit, *preLimit;
  154|       |
  155|       |        /* subLength was decremented above */
  156|   190k|        if(length<=subLength) {
  ------------------
  |  Branch (156:12): [True: 21.2k, False: 169k]
  ------------------
  157|  21.2k|            return nullptr; /* s is shorter than sub */
  158|  21.2k|        }
  159|       |
  160|   169k|        limit=s+length;
  161|       |
  162|       |        /* the substring must start before preLimit */
  163|   169k|        preLimit=limit-subLength;
  164|       |
  165|  6.87M|        while(s!=preLimit) {
  ------------------
  |  Branch (165:15): [True: 6.74M, False: 127k]
  ------------------
  166|  6.74M|            c=*s++;
  167|  6.74M|            if(c==cs) {
  ------------------
  |  Branch (167:16): [True: 127k, False: 6.61M]
  ------------------
  168|       |                /* found first substring char16_t, compare rest */
  169|   127k|                p=s;
  170|   127k|                q=sub;
  171|   169k|                for(;;) {
  172|   169k|                    if(q==subLimit) {
  ------------------
  |  Branch (172:24): [True: 42.4k, False: 127k]
  ------------------
  173|  42.4k|                        if(isMatchAtCPBoundary(start, s-1, p, limit)) {
  ------------------
  |  Branch (173:28): [True: 42.4k, False: 0]
  ------------------
  174|  42.4k|                            return (char16_t *)(s-1); /* well-formed match */
  175|  42.4k|                        } else {
  176|      0|                            break; /* no match because surrogate pair is split */
  177|      0|                        }
  178|  42.4k|                    }
  179|   127k|                    if(*p!=*q) {
  ------------------
  |  Branch (179:24): [True: 84.8k, False: 42.4k]
  ------------------
  180|  84.8k|                        break; /* no match */
  181|  84.8k|                    }
  182|  42.4k|                    ++p;
  183|  42.4k|                    ++q;
  184|  42.4k|                }
  185|   127k|            }
  186|  6.74M|        }
  187|   169k|    }
  188|       |
  189|       |    /* not found */
  190|   127k|    return nullptr;
  191|   190k|}
u_memchr_78:
  241|  1.39M|u_memchr(const char16_t *s, char16_t c, int32_t count) {
  242|  1.39M|    if(count<=0) {
  ------------------
  |  Branch (242:8): [True: 150, False: 1.39M]
  ------------------
  243|    150|        return nullptr; /* no string */
  244|  1.39M|    } else if(U16_IS_SURROGATE(c)) {
  ------------------
  |  |   75|  1.39M|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|  1.39M|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:27): [True: 0, False: 1.39M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  245|       |        /* make sure to not find half of a surrogate pair */
  246|      0|        return u_strFindFirst(s, count, &c, 1);
  ------------------
  |  |  361|      0|#define u_strFindFirst U_ICU_ENTRY_POINT_RENAME(u_strFindFirst)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  247|  1.39M|    } else {
  248|       |        /* trivial search for a BMP code point */
  249|  1.39M|        const char16_t *limit=s+count;
  250|  36.6M|        do {
  251|  36.6M|            if(*s==c) {
  ------------------
  |  Branch (251:16): [True: 567k, False: 36.0M]
  ------------------
  252|   567k|                return (char16_t *)s;
  253|   567k|            }
  254|  36.6M|        } while(++s!=limit);
  ------------------
  |  Branch (254:17): [True: 35.2M, False: 827k]
  ------------------
  255|   827k|        return nullptr;
  256|  1.39M|    }
  257|  1.39M|}
u_strcpy_78:
  969|  1.04M|{
  970|  1.04M|    char16_t *anchor = dst;            /* save a pointer to start of dst */
  971|       |
  972|  4.17M|    while((*(dst++) = *(src++)) != 0) {     /* copy string 2 over              */
  ------------------
  |  Branch (972:11): [True: 3.12M, False: 1.04M]
  ------------------
  973|  3.12M|    }
  974|       |
  975|  1.04M|    return anchor;
  976|  1.04M|}
u_strncpy_78:
  982|   232k|{
  983|   232k|    char16_t *anchor = dst;            /* save a pointer to start of dst */
  984|       |
  985|       |    /* copy string 2 over */
  986|   928k|    while(n > 0 && (*(dst++) = *(src++)) != 0) {
  ------------------
  |  Branch (986:11): [True: 696k, False: 232k]
  |  Branch (986:20): [True: 696k, False: 0]
  ------------------
  987|   696k|        --n;
  988|   696k|    }
  989|       |
  990|   232k|    return anchor;
  991|   232k|}
u_strlen_78:
  995|  2.50M|{
  996|       |#if U_SIZEOF_WCHAR_T == U_SIZEOF_UCHAR
  997|       |    return (int32_t)uprv_wcslen((const wchar_t *)s);
  998|       |#else
  999|  2.50M|    const char16_t *t = s;
 1000|  15.8M|    while(*t != 0) {
  ------------------
  |  Branch (1000:11): [True: 13.3M, False: 2.50M]
  ------------------
 1001|  13.3M|      ++t;
 1002|  13.3M|    }
 1003|  2.50M|    return t - s;
 1004|  2.50M|#endif
 1005|  2.50M|}
u_countChar32_78:
 1008|   489k|u_countChar32(const char16_t *s, int32_t length) {
 1009|   489k|    int32_t count;
 1010|       |
 1011|   489k|    if(s==nullptr || length<-1) {
  ------------------
  |  Branch (1011:8): [True: 0, False: 489k]
  |  Branch (1011:22): [True: 0, False: 489k]
  ------------------
 1012|      0|        return 0;
 1013|      0|    }
 1014|       |
 1015|   489k|    count=0;
 1016|   489k|    if(length>=0) {
  ------------------
  |  Branch (1016:8): [True: 489k, False: 0]
  ------------------
 1017|  1.37M|        while(length>0) {
  ------------------
  |  Branch (1017:15): [True: 889k, False: 489k]
  ------------------
 1018|   889k|            ++count;
 1019|   889k|            if(U16_IS_LEAD(*s) && length>=2 && U16_IS_TRAIL(*(s+1))) {
  ------------------
  |  |   59|  1.77M|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 889k]
  |  |  ------------------
  ------------------
                          if(U16_IS_LEAD(*s) && length>=2 && U16_IS_TRAIL(*(s+1))) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1019:35): [True: 0, False: 0]
  ------------------
 1020|      0|                s+=2;
 1021|      0|                length-=2;
 1022|   889k|            } else {
 1023|   889k|                ++s;
 1024|   889k|                --length;
 1025|   889k|            }
 1026|   889k|        }
 1027|   489k|    } 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|   489k|    return count;
 1046|   489k|}
u_memcpy_78:
 1117|  2.02M|u_memcpy(char16_t *dest, const char16_t *src, int32_t count) {
 1118|  2.02M|    if(count > 0) {
  ------------------
  |  Branch (1118:8): [True: 2.02M, False: 0]
  ------------------
 1119|  2.02M|        uprv_memcpy(dest, src, (size_t)count*U_SIZEOF_UCHAR);
  ------------------
  |  |   42|  2.02M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.02M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  2.02M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  2.02M|    _Pragma("clang diagnostic push") \
  |  |   45|  2.02M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  2.02M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.02M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  2.02M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.02M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  2.02M|    _Pragma("clang diagnostic pop") \
  |  |   49|  2.02M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  2.02M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  2.02M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.02M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1120|  2.02M|    }
 1121|  2.02M|    return dest;
 1122|  2.02M|}
u_memcmp_78:
 1146|  44.3k|u_memcmp(const char16_t *buf1, const char16_t *buf2, int32_t count) {
 1147|  44.3k|    if(count > 0) {
  ------------------
  |  Branch (1147:8): [True: 44.3k, False: 0]
  ------------------
 1148|  44.3k|        const char16_t *limit = buf1 + count;
 1149|  44.3k|        int32_t result;
 1150|       |
 1151|   195k|        while (buf1 < limit) {
  ------------------
  |  Branch (1151:16): [True: 173k, False: 22.0k]
  ------------------
 1152|   173k|            result = (int32_t)(uint16_t)*buf1 - (int32_t)(uint16_t)*buf2;
 1153|   173k|            if (result != 0) {
  ------------------
  |  Branch (1153:17): [True: 22.3k, False: 151k]
  ------------------
 1154|  22.3k|                return result;
 1155|  22.3k|            }
 1156|   151k|            buf1++;
 1157|   151k|            buf2++;
 1158|   151k|        }
 1159|  44.3k|    }
 1160|  22.0k|    return 0;
 1161|  44.3k|}
u_unescapeAt_78:
 1216|      2|             void *context) {
 1217|       |
 1218|      2|    int32_t start = *offset;
 1219|      2|    UChar32 c;
 1220|      2|    UChar32 result = 0;
 1221|      2|    int8_t n = 0;
 1222|      2|    int8_t minDig = 0;
 1223|      2|    int8_t maxDig = 0;
 1224|      2|    int8_t bitsPerDigit = 4; 
 1225|      2|    int32_t dig;
 1226|      2|    UBool braces = false;
 1227|       |
 1228|       |    /* Check that offset is in range */
 1229|      2|    if (*offset < 0 || *offset >= length) {
  ------------------
  |  Branch (1229:9): [True: 0, False: 2]
  |  Branch (1229:24): [True: 0, False: 2]
  ------------------
 1230|      0|        goto err;
 1231|      0|    }
 1232|       |
 1233|       |    /* Fetch first char16_t after '\\' */
 1234|      2|    c = charAt((*offset)++, context);
 1235|       |
 1236|       |    /* Convert hexadecimal and octal escapes */
 1237|      2|    switch (c) {
 1238|      2|    case u'u':
  ------------------
  |  Branch (1238:5): [True: 2, False: 0]
  ------------------
 1239|      2|        minDig = maxDig = 4;
 1240|      2|        break;
 1241|      0|    case u'U':
  ------------------
  |  Branch (1241:5): [True: 0, False: 2]
  ------------------
 1242|      0|        minDig = maxDig = 8;
 1243|      0|        break;
 1244|      0|    case u'x':
  ------------------
  |  Branch (1244:5): [True: 0, False: 2]
  ------------------
 1245|      0|        minDig = 1;
 1246|      0|        if (*offset < length && charAt(*offset, context) == u'{') {
  ------------------
  |  Branch (1246:13): [True: 0, False: 0]
  |  Branch (1246:33): [True: 0, False: 0]
  ------------------
 1247|      0|            ++(*offset);
 1248|      0|            braces = true;
 1249|      0|            maxDig = 8;
 1250|      0|        } else {
 1251|      0|            maxDig = 2;
 1252|      0|        }
 1253|      0|        break;
 1254|      0|    default:
  ------------------
  |  Branch (1254:5): [True: 0, False: 2]
  ------------------
 1255|      0|        dig = _digit8(c);
 1256|      0|        if (dig >= 0) {
  ------------------
  |  Branch (1256:13): [True: 0, False: 0]
  ------------------
 1257|      0|            minDig = 1;
 1258|      0|            maxDig = 3;
 1259|      0|            n = 1; /* Already have first octal digit */
 1260|      0|            bitsPerDigit = 3;
 1261|      0|            result = dig;
 1262|      0|        }
 1263|      0|        break;
 1264|      2|    }
 1265|      2|    if (minDig != 0) {
  ------------------
  |  Branch (1265:9): [True: 2, False: 0]
  ------------------
 1266|     10|        while (*offset < length && n < maxDig) {
  ------------------
  |  Branch (1266:16): [True: 10, False: 0]
  |  Branch (1266:36): [True: 8, False: 2]
  ------------------
 1267|      8|            c = charAt(*offset, context);
 1268|      8|            dig = (bitsPerDigit == 3) ? _digit8(c) : _digit16(c);
  ------------------
  |  Branch (1268:19): [True: 0, False: 8]
  ------------------
 1269|      8|            if (dig < 0) {
  ------------------
  |  Branch (1269:17): [True: 0, False: 8]
  ------------------
 1270|      0|                break;
 1271|      0|            }
 1272|      8|            result = (result << bitsPerDigit) | dig;
 1273|      8|            ++(*offset);
 1274|      8|            ++n;
 1275|      8|        }
 1276|      2|        if (n < minDig) {
  ------------------
  |  Branch (1276:13): [True: 0, False: 2]
  ------------------
 1277|      0|            goto err;
 1278|      0|        }
 1279|      2|        if (braces) {
  ------------------
  |  Branch (1279:13): [True: 0, False: 2]
  ------------------
 1280|      0|            if (c != u'}') {
  ------------------
  |  Branch (1280:17): [True: 0, False: 0]
  ------------------
 1281|      0|                goto err;
 1282|      0|            }
 1283|      0|            ++(*offset);
 1284|      0|        }
 1285|      2|        if (result < 0 || result >= 0x110000) {
  ------------------
  |  Branch (1285:13): [True: 0, False: 2]
  |  Branch (1285:27): [True: 0, False: 2]
  ------------------
 1286|      0|            goto err;
 1287|      0|        }
 1288|       |        /* If an escape sequence specifies a lead surrogate, see if
 1289|       |         * there is a trail surrogate after it, either as an escape or
 1290|       |         * as a literal.  If so, join them up into a supplementary.
 1291|       |         */
 1292|      2|        if (*offset < length && U16_IS_LEAD(result)) {
  ------------------
  |  |   59|      2|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  |  Branch (1292:13): [True: 2, False: 0]
  ------------------
 1293|      0|            int32_t ahead = *offset + 1;
 1294|      0|            c = charAt(*offset, context);
 1295|      0|            if (c == u'\\' && ahead < length) {
  ------------------
  |  Branch (1295:17): [True: 0, False: 0]
  |  Branch (1295:31): [True: 0, False: 0]
  ------------------
 1296|       |                // Calling ourselves recursively may cause a stack overflow if
 1297|       |                // we have repeated escaped lead surrogates.
 1298|       |                // Limit the length to 11 ("x{0000DFFF}") after ahead.
 1299|      0|                int32_t tailLimit = ahead + 11;
 1300|      0|                if (tailLimit > length) {
  ------------------
  |  Branch (1300:21): [True: 0, False: 0]
  ------------------
 1301|      0|                    tailLimit = length;
 1302|      0|                }
 1303|      0|                c = u_unescapeAt(charAt, &ahead, tailLimit, context);
  ------------------
  |  |  416|      0|#define u_unescapeAt U_ICU_ENTRY_POINT_RENAME(u_unescapeAt)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1304|      0|            }
 1305|      0|            if (U16_IS_TRAIL(c)) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1306|      0|                *offset = ahead;
 1307|      0|                result = U16_GET_SUPPLEMENTARY(result, c);
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
 1308|      0|            }
 1309|      0|        }
 1310|      2|        return result;
 1311|      2|    }
 1312|       |
 1313|       |    /* Convert C-style escapes in table */
 1314|      0|    for (int32_t i=0; i<UNESCAPE_MAP_LENGTH; i+=2) {
  ------------------
  |  Branch (1314:23): [True: 0, False: 0]
  ------------------
 1315|      0|        if (c == UNESCAPE_MAP[i]) {
  ------------------
  |  Branch (1315:13): [True: 0, False: 0]
  ------------------
 1316|      0|            return UNESCAPE_MAP[i+1];
 1317|      0|        } else if (c < UNESCAPE_MAP[i]) {
  ------------------
  |  Branch (1317:20): [True: 0, False: 0]
  ------------------
 1318|      0|            break;
 1319|      0|        }
 1320|      0|    }
 1321|       |
 1322|       |    /* Map \cX to control-X: X & 0x1F */
 1323|      0|    if (c == u'c' && *offset < length) {
  ------------------
  |  Branch (1323:9): [True: 0, False: 0]
  |  Branch (1323:22): [True: 0, False: 0]
  ------------------
 1324|      0|        c = charAt((*offset)++, context);
 1325|      0|        if (U16_IS_LEAD(c) && *offset < length) {
  ------------------
  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1325:31): [True: 0, False: 0]
  ------------------
 1326|      0|            char16_t c2 = charAt(*offset, context);
 1327|      0|            if (U16_IS_TRAIL(c2)) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1328|      0|                ++(*offset);
 1329|      0|                c = U16_GET_SUPPLEMENTARY(c, c2);
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
 1330|      0|            }
 1331|      0|        }
 1332|      0|        return 0x1F & c;
 1333|      0|    }
 1334|       |
 1335|       |    /* If no special forms are recognized, then consider
 1336|       |     * the backslash to generically escape the next character.
 1337|       |     * Deal with surrogate pairs. */
 1338|      0|    if (U16_IS_LEAD(c) && *offset < length) {
  ------------------
  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1338:27): [True: 0, False: 0]
  ------------------
 1339|      0|        char16_t c2 = charAt(*offset, context);
 1340|      0|        if (U16_IS_TRAIL(c2)) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1341|      0|            ++(*offset);
 1342|      0|            return U16_GET_SUPPLEMENTARY(c, c2);
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
 1343|      0|        }
 1344|      0|    }
 1345|      0|    return c;
 1346|       |
 1347|      0| err:
 1348|       |    /* Invalid escape sequence */
 1349|      0|    *offset = start; /* Reset to initial value */
 1350|      0|    return (UChar32)0xFFFFFFFF;
 1351|      0|}
u_terminateUChars_78:
 1469|  44.4k|u_terminateUChars(char16_t *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode) {
 1470|  44.4k|    __TERMINATE_STRING(dest, destCapacity, length, pErrorCode);
  ------------------
  |  | 1437|  44.4k|#define __TERMINATE_STRING(dest, destCapacity, length, pErrorCode) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  44.4k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1438|  44.4k|    if(pErrorCode!=nullptr && U_SUCCESS(*pErrorCode)) {                    \
  |  |  ------------------
  |  |  |  Branch (1438:8): [True: 44.4k, False: 0]
  |  |  |  Branch (1438:31): [True: 44.4k, False: 0]
  |  |  ------------------
  |  | 1439|  44.4k|        /* not a public function, so no complete argument checking */   \
  |  | 1440|  44.4k|                                                                        \
  |  | 1441|  44.4k|        if(length<0) {                                                  \
  |  |  ------------------
  |  |  |  Branch (1441:12): [True: 0, False: 44.4k]
  |  |  ------------------
  |  | 1442|      0|            /* assume that the caller handles this */                   \
  |  | 1443|  44.4k|        } else if(length<destCapacity) {                                \
  |  |  ------------------
  |  |  |  Branch (1443:19): [True: 44.4k, False: 0]
  |  |  ------------------
  |  | 1444|  44.4k|            /* NUL-terminate the string, the NUL fits */                \
  |  | 1445|  44.4k|            dest[length]=0;                                             \
  |  | 1446|  44.4k|            /* unset the not-terminated warning but leave all others */ \
  |  | 1447|  44.4k|            if(*pErrorCode==U_STRING_NOT_TERMINATED_WARNING) {          \
  |  |  ------------------
  |  |  |  Branch (1447:16): [True: 0, False: 44.4k]
  |  |  ------------------
  |  | 1448|      0|                *pErrorCode=U_ZERO_ERROR;                               \
  |  | 1449|      0|            }                                                           \
  |  | 1450|  44.4k|        } 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|  44.4k|    } \
  |  | 1458|  44.4k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  44.4k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1471|  44.4k|    return length;
 1472|  44.4k|}
u_terminateChars_78:
 1475|   635k|u_terminateChars(char *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode) {
 1476|   635k|    __TERMINATE_STRING(dest, destCapacity, length, pErrorCode);
  ------------------
  |  | 1437|   635k|#define __TERMINATE_STRING(dest, destCapacity, length, pErrorCode) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   635k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1438|   635k|    if(pErrorCode!=nullptr && U_SUCCESS(*pErrorCode)) {                    \
  |  |  ------------------
  |  |  |  Branch (1438:8): [True: 635k, False: 0]
  |  |  |  Branch (1438:31): [True: 635k, False: 0]
  |  |  ------------------
  |  | 1439|   635k|        /* not a public function, so no complete argument checking */   \
  |  | 1440|   635k|                                                                        \
  |  | 1441|   635k|        if(length<0) {                                                  \
  |  |  ------------------
  |  |  |  Branch (1441:12): [True: 0, False: 635k]
  |  |  ------------------
  |  | 1442|      0|            /* assume that the caller handles this */                   \
  |  | 1443|   635k|        } else if(length<destCapacity) {                                \
  |  |  ------------------
  |  |  |  Branch (1443:19): [True: 631k, False: 4.08k]
  |  |  ------------------
  |  | 1444|   631k|            /* NUL-terminate the string, the NUL fits */                \
  |  | 1445|   631k|            dest[length]=0;                                             \
  |  | 1446|   631k|            /* unset the not-terminated warning but leave all others */ \
  |  | 1447|   631k|            if(*pErrorCode==U_STRING_NOT_TERMINATED_WARNING) {          \
  |  |  ------------------
  |  |  |  Branch (1447:16): [True: 0, False: 631k]
  |  |  ------------------
  |  | 1448|      0|                *pErrorCode=U_ZERO_ERROR;                               \
  |  | 1449|      0|            }                                                           \
  |  | 1450|   631k|        } else if(length==destCapacity) {                               \
  |  |  ------------------
  |  |  |  Branch (1450:19): [True: 4.08k, False: 0]
  |  |  ------------------
  |  | 1451|  4.08k|            /* unable to NUL-terminate, but the string itself fit - set a warning code */ \
  |  | 1452|  4.08k|            *pErrorCode=U_STRING_NOT_TERMINATED_WARNING;                \
  |  | 1453|  4.08k|        } 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|   635k|    } \
  |  | 1458|   635k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   635k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1477|   635k|    return length;
 1478|   635k|}
ustr_hashUCharsN_78:
 1523|   374k|ustr_hashUCharsN(const char16_t *str, int32_t length) {
 1524|   374k|    STRING_HASH(char16_t, str, length, *p);
  ------------------
  |  | 1506|   374k|#define STRING_HASH(TYPE, STR, STRLEN, DEREF) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   374k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1507|   374k|    uint32_t hash = 0;                        \
  |  | 1508|   374k|    const TYPE *p = (const TYPE*) STR;        \
  |  | 1509|   374k|    if (p != nullptr) {                          \
  |  |  ------------------
  |  |  |  Branch (1509:9): [True: 374k, False: 0]
  |  |  ------------------
  |  | 1510|   374k|        int32_t len = (int32_t)(STRLEN);      \
  |  | 1511|   374k|        int32_t inc = ((len - 32) / 32) + 1;  \
  |  | 1512|   374k|        const TYPE *limit = p + len;          \
  |  | 1513|  2.23M|        while (p<limit) {                     \
  |  |  ------------------
  |  |  |  Branch (1513:16): [True: 1.86M, False: 374k]
  |  |  ------------------
  |  | 1514|  1.86M|            hash = (hash * 37) + DEREF;       \
  |  | 1515|  1.86M|            p += inc;                         \
  |  | 1516|  1.86M|        }                                     \
  |  | 1517|   374k|    }                                         \
  |  | 1518|   374k|    return static_cast<int32_t>(hash);        \
  |  | 1519|   374k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   374k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1525|   374k|}
ustr_hashCharsN_78:
 1528|  2.13M|ustr_hashCharsN(const char *str, int32_t length) {
 1529|  2.13M|    STRING_HASH(uint8_t, str, length, *p);
  ------------------
  |  | 1506|  2.13M|#define STRING_HASH(TYPE, STR, STRLEN, DEREF) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.13M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1507|  2.13M|    uint32_t hash = 0;                        \
  |  | 1508|  2.13M|    const TYPE *p = (const TYPE*) STR;        \
  |  | 1509|  2.13M|    if (p != nullptr) {                          \
  |  |  ------------------
  |  |  |  Branch (1509:9): [True: 2.13M, False: 0]
  |  |  ------------------
  |  | 1510|  2.13M|        int32_t len = (int32_t)(STRLEN);      \
  |  | 1511|  2.13M|        int32_t inc = ((len - 32) / 32) + 1;  \
  |  | 1512|  2.13M|        const TYPE *limit = p + len;          \
  |  | 1513|  28.4M|        while (p<limit) {                     \
  |  |  ------------------
  |  |  |  Branch (1513:16): [True: 26.3M, False: 2.13M]
  |  |  ------------------
  |  | 1514|  26.3M|            hash = (hash * 37) + DEREF;       \
  |  | 1515|  26.3M|            p += inc;                         \
  |  | 1516|  26.3M|        }                                     \
  |  | 1517|  2.13M|    }                                         \
  |  | 1518|  2.13M|    return static_cast<int32_t>(hash);        \
  |  | 1519|  2.13M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.13M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1530|  2.13M|}
ustring.cpp:_ZL19isMatchAtCPBoundaryPKDsS0_S0_S0_:
   43|  42.4k|isMatchAtCPBoundary(const char16_t *start, const char16_t *match, const char16_t *matchLimit, const char16_t *limit) {
   44|  42.4k|    if(U16_IS_TRAIL(*match) && start!=match && U16_IS_LEAD(*(match-1))) {
  ------------------
  |  |   67|  84.8k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 42.4k]
  |  |  ------------------
  ------------------
                  if(U16_IS_TRAIL(*match) && start!=match && U16_IS_LEAD(*(match-1))) {
  ------------------
  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (44:32): [True: 0, False: 0]
  ------------------
   45|       |        /* the leading edge of the match is in the middle of a surrogate pair */
   46|      0|        return false;
   47|      0|    }
   48|  42.4k|    if(U16_IS_LEAD(*(matchLimit-1)) && matchLimit!=limit && U16_IS_TRAIL(*matchLimit)) {
  ------------------
  |  |   59|  84.8k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 42.4k]
  |  |  ------------------
  ------------------
                  if(U16_IS_LEAD(*(matchLimit-1)) && matchLimit!=limit && U16_IS_TRAIL(*matchLimit)) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (48:40): [True: 0, False: 0]
  ------------------
   49|       |        /* the trailing edge of the match is in the middle of a surrogate pair */
   50|      0|        return false;
   51|      0|    }
   52|  42.4k|    return true;
   53|  42.4k|}
ustring.cpp:_ZL8_digit16Ds:
 1196|      8|static int32_t _digit16(char16_t c) {
 1197|      8|    if (c >= u'0' && c <= u'9') {
  ------------------
  |  Branch (1197:9): [True: 8, False: 0]
  |  Branch (1197:22): [True: 6, False: 2]
  ------------------
 1198|      6|        return c - u'0';
 1199|      6|    }
 1200|      2|    if (c >= u'A' && c <= u'F') {
  ------------------
  |  Branch (1200:9): [True: 2, False: 0]
  |  Branch (1200:22): [True: 2, False: 0]
  ------------------
 1201|      2|        return c - (u'A' - 10);
 1202|      2|    }
 1203|      0|    if (c >= u'a' && c <= u'f') {
  ------------------
  |  Branch (1203:9): [True: 0, False: 0]
  |  Branch (1203:22): [True: 0, False: 0]
  ------------------
 1204|      0|        return c - (u'a' - 10);
 1205|      0|    }
 1206|      0|    return -1;
 1207|      0|}

u_strFromUTF8WithSub_78:
  266|      3|              UErrorCode *pErrorCode){
  267|       |    /* args check */
  268|      3|    if(U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (268:8): [True: 0, False: 3]
  ------------------
  269|      0|        return nullptr;
  270|      0|    }
  271|      3|    if( (src==nullptr && srcLength!=0) || srcLength < -1 ||
  ------------------
  |  Branch (271:10): [True: 0, False: 3]
  |  Branch (271:26): [True: 0, False: 0]
  |  Branch (271:43): [True: 0, False: 3]
  ------------------
  272|      3|        (destCapacity<0) || (dest == nullptr && destCapacity > 0) ||
  ------------------
  |  Branch (272:9): [True: 0, False: 3]
  |  Branch (272:30): [True: 0, False: 3]
  |  Branch (272:49): [True: 0, False: 0]
  ------------------
  273|      3|        subchar > 0x10ffff || U_IS_SURROGATE(subchar)
  ------------------
  |  |  193|      3|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  ------------------
  |  |  |  Branch (193:27): [True: 0, False: 3]
  |  |  ------------------
  ------------------
  |  Branch (273:9): [True: 0, False: 3]
  ------------------
  274|      3|    ) {
  275|      0|        *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
  276|      0|        return nullptr;
  277|      0|    }
  278|       |
  279|      3|    if(pNumSubstitutions!=nullptr) {
  ------------------
  |  Branch (279:8): [True: 0, False: 3]
  ------------------
  280|      0|        *pNumSubstitutions=0;
  281|      0|    }
  282|      3|    char16_t *pDest = dest;
  283|      3|    char16_t *pDestLimit = dest+destCapacity;
  284|      3|    int32_t reqLength = 0;
  285|      3|    int32_t numSubstitutions=0;
  286|       |
  287|       |    /*
  288|       |     * Inline processing of UTF-8 byte sequences:
  289|       |     *
  290|       |     * Byte sequences for the most common characters are handled inline in
  291|       |     * the conversion loops. In order to reduce the path lengths for those
  292|       |     * characters, the tests are arranged in a kind of binary search.
  293|       |     * ASCII (<=0x7f) is checked first, followed by the dividing point
  294|       |     * between 2- and 3-byte sequences (0xe0).
  295|       |     * The 3-byte branch is tested first to speed up CJK text.
  296|       |     * The compiler should combine the subtractions for the two tests for 0xe0.
  297|       |     * Each branch then tests for the other end of its range.
  298|       |     */
  299|       |
  300|      3|    if(srcLength < 0){
  ------------------
  |  Branch (300:8): [True: 0, False: 3]
  ------------------
  301|       |        /*
  302|       |         * Transform a NUL-terminated string.
  303|       |         * The code explicitly checks for NULs only in the lead byte position.
  304|       |         * A NUL byte in the trail byte position fails the trail byte range check anyway.
  305|       |         */
  306|      0|        int32_t i;
  307|      0|        UChar32 c;
  308|      0|        for(i = 0; (c = (uint8_t)src[i]) != 0 && (pDest < pDestLimit);) {
  ------------------
  |  Branch (308:20): [True: 0, False: 0]
  |  Branch (308:50): [True: 0, False: 0]
  ------------------
  309|       |            // modified copy of U8_NEXT()
  310|      0|            ++i;
  311|      0|            if(U8_IS_SINGLE(c)) {
  ------------------
  |  |  173|      0|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  312|      0|                *pDest++=(char16_t)c;
  313|      0|            } else {
  314|      0|                uint8_t __t1, __t2;
  315|      0|                if( /* handle U+0800..U+FFFF inline */
  316|      0|                        (0xe0<=(c) && (c)<0xf0) &&
  ------------------
  |  Branch (316:26): [True: 0, False: 0]
  |  Branch (316:39): [True: 0, False: 0]
  ------------------
  317|      0|                        U8_IS_VALID_LEAD3_AND_T1((c), src[i]) &&
  ------------------
  |  |   98|      0|#define U8_IS_VALID_LEAD3_AND_T1(lead, t1) (U8_LEAD3_T1_BITS[(lead)&0xf]&(1<<((uint8_t)(t1)>>5)))
  |  |  ------------------
  |  |  |  |   91|      0|#define U8_LEAD3_T1_BITS "\x20\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x10\x30\x30"
  |  |  ------------------
  |  |  |  Branch (98:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  318|      0|                        (__t2=src[(i)+1]-0x80)<=0x3f) {
  ------------------
  |  Branch (318:25): [True: 0, False: 0]
  ------------------
  319|      0|                    *pDest++ = (((c)&0xf)<<12)|((src[i]&0x3f)<<6)|__t2;
  320|      0|                    i+=2;
  321|      0|                } else if( /* handle U+0080..U+07FF inline */
  322|      0|                        ((c)<0xe0 && (c)>=0xc2) &&
  ------------------
  |  Branch (322:26): [True: 0, False: 0]
  |  Branch (322:38): [True: 0, False: 0]
  ------------------
  323|      0|                        (__t1=src[i]-0x80)<=0x3f) {
  ------------------
  |  Branch (323:25): [True: 0, False: 0]
  ------------------
  324|      0|                    *pDest++ = (((c)&0x1f)<<6)|__t1;
  325|      0|                    ++(i);
  326|      0|                } else {
  327|       |                    /* function call for "complicated" and error cases */
  328|      0|                    (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), -1, c, -1);
  ------------------
  |  | 1920|      0|#define utf8_nextCharSafeBody U_ICU_ENTRY_POINT_RENAME(utf8_nextCharSafeBody)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  329|      0|                    if(c<0 && (++numSubstitutions, c = subchar) < 0) {
  ------------------
  |  Branch (329:24): [True: 0, False: 0]
  |  Branch (329:31): [True: 0, False: 0]
  ------------------
  330|      0|                        *pErrorCode = U_INVALID_CHAR_FOUND;
  331|      0|                        return nullptr;
  332|      0|                    } else if(c<=0xFFFF) {
  ------------------
  |  Branch (332:31): [True: 0, False: 0]
  ------------------
  333|      0|                        *(pDest++)=(char16_t)c;
  334|      0|                    } else {
  335|      0|                        *(pDest++)=U16_LEAD(c);
  ------------------
  |  |  123|      0|#define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
  ------------------
  336|      0|                        if(pDest<pDestLimit) {
  ------------------
  |  Branch (336:28): [True: 0, False: 0]
  ------------------
  337|      0|                            *(pDest++)=U16_TRAIL(c);
  ------------------
  |  |  132|      0|#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
  ------------------
  338|      0|                        } else {
  339|      0|                            reqLength++;
  340|      0|                            break;
  341|      0|                        }
  342|      0|                    }
  343|      0|                }
  344|      0|            }
  345|      0|        }
  346|       |
  347|       |        /* Pre-flight the rest of the string. */
  348|      0|        while((c = (uint8_t)src[i]) != 0) {
  ------------------
  |  Branch (348:15): [True: 0, False: 0]
  ------------------
  349|       |            // modified copy of U8_NEXT()
  350|      0|            ++i;
  351|      0|            if(U8_IS_SINGLE(c)) {
  ------------------
  |  |  173|      0|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  352|      0|                ++reqLength;
  353|      0|            } else {
  354|      0|                uint8_t __t1, __t2;
  355|      0|                if( /* handle U+0800..U+FFFF inline */
  356|      0|                        (0xe0<=(c) && (c)<0xf0) &&
  ------------------
  |  Branch (356:26): [True: 0, False: 0]
  |  Branch (356:39): [True: 0, False: 0]
  ------------------
  357|      0|                        U8_IS_VALID_LEAD3_AND_T1((c), src[i]) &&
  ------------------
  |  |   98|      0|#define U8_IS_VALID_LEAD3_AND_T1(lead, t1) (U8_LEAD3_T1_BITS[(lead)&0xf]&(1<<((uint8_t)(t1)>>5)))
  |  |  ------------------
  |  |  |  |   91|      0|#define U8_LEAD3_T1_BITS "\x20\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x10\x30\x30"
  |  |  ------------------
  |  |  |  Branch (98:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  358|      0|                        (__t2=src[(i)+1]-0x80)<=0x3f) {
  ------------------
  |  Branch (358:25): [True: 0, False: 0]
  ------------------
  359|      0|                    ++reqLength;
  360|      0|                    i+=2;
  361|      0|                } else if( /* handle U+0080..U+07FF inline */
  362|      0|                        ((c)<0xe0 && (c)>=0xc2) &&
  ------------------
  |  Branch (362:26): [True: 0, False: 0]
  |  Branch (362:38): [True: 0, False: 0]
  ------------------
  363|      0|                        (__t1=src[i]-0x80)<=0x3f) {
  ------------------
  |  Branch (363:25): [True: 0, False: 0]
  ------------------
  364|      0|                    ++reqLength;
  365|      0|                    ++(i);
  366|      0|                } else {
  367|       |                    /* function call for "complicated" and error cases */
  368|      0|                    (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), -1, c, -1);
  ------------------
  |  | 1920|      0|#define utf8_nextCharSafeBody U_ICU_ENTRY_POINT_RENAME(utf8_nextCharSafeBody)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  369|      0|                    if(c<0 && (++numSubstitutions, c = subchar) < 0) {
  ------------------
  |  Branch (369:24): [True: 0, False: 0]
  |  Branch (369:31): [True: 0, False: 0]
  ------------------
  370|      0|                        *pErrorCode = U_INVALID_CHAR_FOUND;
  371|      0|                        return nullptr;
  372|      0|                    }
  373|      0|                    reqLength += U16_LENGTH(c);
  ------------------
  |  |  141|      0|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  374|      0|                }
  375|      0|            }
  376|      0|        }
  377|      3|    } else /* srcLength >= 0 */ {
  378|       |        /* Faster loop without ongoing checking for srcLength and pDestLimit. */
  379|      3|        int32_t i = 0;
  380|      3|        UChar32 c;
  381|      5|        for(;;) {
  382|       |            /*
  383|       |             * Each iteration of the inner loop progresses by at most 3 UTF-8
  384|       |             * bytes and one char16_t, for most characters.
  385|       |             * For supplementary code points (4 & 2), which are rare,
  386|       |             * there is an additional adjustment.
  387|       |             */
  388|      5|            int32_t count = (int32_t)(pDestLimit - pDest);
  389|      5|            int32_t count2 = (srcLength - i) / 3;
  390|      5|            if(count > count2) {
  ------------------
  |  Branch (390:16): [True: 5, False: 0]
  ------------------
  391|      5|                count = count2; /* min(remaining dest, remaining src/3) */
  392|      5|            }
  393|      5|            if(count < 3) {
  ------------------
  |  Branch (393:16): [True: 3, False: 2]
  ------------------
  394|       |                /*
  395|       |                 * Too much overhead if we get near the end of the string,
  396|       |                 * continue with the next loop.
  397|       |                 */
  398|      3|                break;
  399|      3|            }
  400|       |
  401|      6|            do {
  402|       |                // modified copy of U8_NEXT()
  403|      6|                c = (uint8_t)src[i++];
  404|      6|                if(U8_IS_SINGLE(c)) {
  ------------------
  |  |  173|      6|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 6, False: 0]
  |  |  ------------------
  ------------------
  405|      6|                    *pDest++=(char16_t)c;
  406|      6|                } else {
  407|      0|                    uint8_t __t1, __t2;
  408|      0|                    if( /* handle U+0800..U+FFFF inline */
  409|      0|                            (0xe0<=(c) && (c)<0xf0) &&
  ------------------
  |  Branch (409:30): [True: 0, False: 0]
  |  Branch (409:43): [True: 0, False: 0]
  ------------------
  410|      0|                            ((i)+1)<srcLength &&
  ------------------
  |  Branch (410:29): [True: 0, False: 0]
  ------------------
  411|      0|                            U8_IS_VALID_LEAD3_AND_T1((c), src[i]) &&
  ------------------
  |  |   98|      0|#define U8_IS_VALID_LEAD3_AND_T1(lead, t1) (U8_LEAD3_T1_BITS[(lead)&0xf]&(1<<((uint8_t)(t1)>>5)))
  |  |  ------------------
  |  |  |  |   91|      0|#define U8_LEAD3_T1_BITS "\x20\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x10\x30\x30"
  |  |  ------------------
  |  |  |  Branch (98:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  412|      0|                            (__t2=src[(i)+1]-0x80)<=0x3f) {
  ------------------
  |  Branch (412:29): [True: 0, False: 0]
  ------------------
  413|      0|                        *pDest++ = (((c)&0xf)<<12)|((src[i]&0x3f)<<6)|__t2;
  414|      0|                        i+=2;
  415|      0|                    } else if( /* handle U+0080..U+07FF inline */
  416|      0|                            ((c)<0xe0 && (c)>=0xc2) &&
  ------------------
  |  Branch (416:30): [True: 0, False: 0]
  |  Branch (416:42): [True: 0, False: 0]
  ------------------
  417|      0|                            ((i)!=srcLength) &&
  ------------------
  |  Branch (417:29): [True: 0, False: 0]
  ------------------
  418|      0|                            (__t1=src[i]-0x80)<=0x3f) {
  ------------------
  |  Branch (418:29): [True: 0, False: 0]
  ------------------
  419|      0|                        *pDest++ = (((c)&0x1f)<<6)|__t1;
  420|      0|                        ++(i);
  421|      0|                    } else {
  422|      0|                        if(c >= 0xf0 || subchar > 0xffff) {
  ------------------
  |  Branch (422:28): [True: 0, False: 0]
  |  Branch (422:41): [True: 0, False: 0]
  ------------------
  423|       |                            // We may read up to four bytes and write up to two UChars,
  424|       |                            // which we didn't account for with computing count,
  425|       |                            // so we adjust it here.
  426|      0|                            if(--count == 0) {
  ------------------
  |  Branch (426:32): [True: 0, False: 0]
  ------------------
  427|      0|                                --i;  // back out byte c
  428|      0|                                break;
  429|      0|                            }
  430|      0|                        }
  431|       |
  432|       |                        /* function call for "complicated" and error cases */
  433|      0|                        (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, c, -1);
  ------------------
  |  | 1920|      0|#define utf8_nextCharSafeBody U_ICU_ENTRY_POINT_RENAME(utf8_nextCharSafeBody)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  434|      0|                        if(c<0 && (++numSubstitutions, c = subchar) < 0) {
  ------------------
  |  Branch (434:28): [True: 0, False: 0]
  |  Branch (434:35): [True: 0, False: 0]
  ------------------
  435|      0|                            *pErrorCode = U_INVALID_CHAR_FOUND;
  436|      0|                            return nullptr;
  437|      0|                        } else if(c<=0xFFFF) {
  ------------------
  |  Branch (437:35): [True: 0, False: 0]
  ------------------
  438|      0|                            *(pDest++)=(char16_t)c;
  439|      0|                        } else {
  440|      0|                            *(pDest++)=U16_LEAD(c);
  ------------------
  |  |  123|      0|#define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
  ------------------
  441|      0|                            *(pDest++)=U16_TRAIL(c);
  ------------------
  |  |  132|      0|#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
  ------------------
  442|      0|                        }
  443|      0|                    }
  444|      0|                }
  445|      6|            } while(--count > 0);
  ------------------
  |  Branch (445:21): [True: 4, False: 2]
  ------------------
  446|      2|        }
  447|       |
  448|     25|        while(i < srcLength && (pDest < pDestLimit)) {
  ------------------
  |  Branch (448:15): [True: 22, False: 3]
  |  Branch (448:32): [True: 22, False: 0]
  ------------------
  449|       |            // modified copy of U8_NEXT()
  450|     22|            c = (uint8_t)src[i++];
  451|     22|            if(U8_IS_SINGLE(c)) {
  ------------------
  |  |  173|     22|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 22, False: 0]
  |  |  ------------------
  ------------------
  452|     22|                *pDest++=(char16_t)c;
  453|     22|            } else {
  454|      0|                uint8_t __t1, __t2;
  455|      0|                if( /* handle U+0800..U+FFFF inline */
  456|      0|                        (0xe0<=(c) && (c)<0xf0) &&
  ------------------
  |  Branch (456:26): [True: 0, False: 0]
  |  Branch (456:39): [True: 0, False: 0]
  ------------------
  457|      0|                        ((i)+1)<srcLength &&
  ------------------
  |  Branch (457:25): [True: 0, False: 0]
  ------------------
  458|      0|                        U8_IS_VALID_LEAD3_AND_T1((c), src[i]) &&
  ------------------
  |  |   98|      0|#define U8_IS_VALID_LEAD3_AND_T1(lead, t1) (U8_LEAD3_T1_BITS[(lead)&0xf]&(1<<((uint8_t)(t1)>>5)))
  |  |  ------------------
  |  |  |  |   91|      0|#define U8_LEAD3_T1_BITS "\x20\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x10\x30\x30"
  |  |  ------------------
  |  |  |  Branch (98:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  459|      0|                        (__t2=src[(i)+1]-0x80)<=0x3f) {
  ------------------
  |  Branch (459:25): [True: 0, False: 0]
  ------------------
  460|      0|                    *pDest++ = (((c)&0xf)<<12)|((src[i]&0x3f)<<6)|__t2;
  461|      0|                    i+=2;
  462|      0|                } else if( /* handle U+0080..U+07FF inline */
  463|      0|                        ((c)<0xe0 && (c)>=0xc2) &&
  ------------------
  |  Branch (463:26): [True: 0, False: 0]
  |  Branch (463:38): [True: 0, False: 0]
  ------------------
  464|      0|                        ((i)!=srcLength) &&
  ------------------
  |  Branch (464:25): [True: 0, False: 0]
  ------------------
  465|      0|                        (__t1=src[i]-0x80)<=0x3f) {
  ------------------
  |  Branch (465:25): [True: 0, False: 0]
  ------------------
  466|      0|                    *pDest++ = (((c)&0x1f)<<6)|__t1;
  467|      0|                    ++(i);
  468|      0|                } else {
  469|       |                    /* function call for "complicated" and error cases */
  470|      0|                    (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, c, -1);
  ------------------
  |  | 1920|      0|#define utf8_nextCharSafeBody U_ICU_ENTRY_POINT_RENAME(utf8_nextCharSafeBody)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  471|      0|                    if(c<0 && (++numSubstitutions, c = subchar) < 0) {
  ------------------
  |  Branch (471:24): [True: 0, False: 0]
  |  Branch (471:31): [True: 0, False: 0]
  ------------------
  472|      0|                        *pErrorCode = U_INVALID_CHAR_FOUND;
  473|      0|                        return nullptr;
  474|      0|                    } else if(c<=0xFFFF) {
  ------------------
  |  Branch (474:31): [True: 0, False: 0]
  ------------------
  475|      0|                        *(pDest++)=(char16_t)c;
  476|      0|                    } else {
  477|      0|                        *(pDest++)=U16_LEAD(c);
  ------------------
  |  |  123|      0|#define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
  ------------------
  478|      0|                        if(pDest<pDestLimit) {
  ------------------
  |  Branch (478:28): [True: 0, False: 0]
  ------------------
  479|      0|                            *(pDest++)=U16_TRAIL(c);
  ------------------
  |  |  132|      0|#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
  ------------------
  480|      0|                        } else {
  481|      0|                            reqLength++;
  482|      0|                            break;
  483|      0|                        }
  484|      0|                    }
  485|      0|                }
  486|      0|            }
  487|     22|        }
  488|       |
  489|       |        /* Pre-flight the rest of the string. */
  490|      3|        while(i < srcLength) {
  ------------------
  |  Branch (490:15): [True: 0, False: 3]
  ------------------
  491|       |            // modified copy of U8_NEXT()
  492|      0|            c = (uint8_t)src[i++];
  493|      0|            if(U8_IS_SINGLE(c)) {
  ------------------
  |  |  173|      0|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  494|      0|                ++reqLength;
  495|      0|            } else {
  496|      0|                uint8_t __t1, __t2;
  497|      0|                if( /* handle U+0800..U+FFFF inline */
  498|      0|                        (0xe0<=(c) && (c)<0xf0) &&
  ------------------
  |  Branch (498:26): [True: 0, False: 0]
  |  Branch (498:39): [True: 0, False: 0]
  ------------------
  499|      0|                        ((i)+1)<srcLength &&
  ------------------
  |  Branch (499:25): [True: 0, False: 0]
  ------------------
  500|      0|                        U8_IS_VALID_LEAD3_AND_T1((c), src[i]) &&
  ------------------
  |  |   98|      0|#define U8_IS_VALID_LEAD3_AND_T1(lead, t1) (U8_LEAD3_T1_BITS[(lead)&0xf]&(1<<((uint8_t)(t1)>>5)))
  |  |  ------------------
  |  |  |  |   91|      0|#define U8_LEAD3_T1_BITS "\x20\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x10\x30\x30"
  |  |  ------------------
  |  |  |  Branch (98:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  501|      0|                        (__t2=src[(i)+1]-0x80)<=0x3f) {
  ------------------
  |  Branch (501:25): [True: 0, False: 0]
  ------------------
  502|      0|                    ++reqLength;
  503|      0|                    i+=2;
  504|      0|                } else if( /* handle U+0080..U+07FF inline */
  505|      0|                        ((c)<0xe0 && (c)>=0xc2) &&
  ------------------
  |  Branch (505:26): [True: 0, False: 0]
  |  Branch (505:38): [True: 0, False: 0]
  ------------------
  506|      0|                        ((i)!=srcLength) &&
  ------------------
  |  Branch (506:25): [True: 0, False: 0]
  ------------------
  507|      0|                        (__t1=src[i]-0x80)<=0x3f) {
  ------------------
  |  Branch (507:25): [True: 0, False: 0]
  ------------------
  508|      0|                    ++reqLength;
  509|      0|                    ++(i);
  510|      0|                } else {
  511|       |                    /* function call for "complicated" and error cases */
  512|      0|                    (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, c, -1);
  ------------------
  |  | 1920|      0|#define utf8_nextCharSafeBody U_ICU_ENTRY_POINT_RENAME(utf8_nextCharSafeBody)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  513|      0|                    if(c<0 && (++numSubstitutions, c = subchar) < 0) {
  ------------------
  |  Branch (513:24): [True: 0, False: 0]
  |  Branch (513:31): [True: 0, False: 0]
  ------------------
  514|      0|                        *pErrorCode = U_INVALID_CHAR_FOUND;
  515|      0|                        return nullptr;
  516|      0|                    }
  517|      0|                    reqLength += U16_LENGTH(c);
  ------------------
  |  |  141|      0|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  518|      0|                }
  519|      0|            }
  520|      0|        }
  521|      3|    }
  522|       |
  523|      3|    reqLength+=(int32_t)(pDest - dest);
  524|       |
  525|      3|    if(pNumSubstitutions!=nullptr) {
  ------------------
  |  Branch (525:8): [True: 0, False: 3]
  ------------------
  526|      0|        *pNumSubstitutions=numSubstitutions;
  527|      0|    }
  528|       |
  529|      3|    if(pDestLength){
  ------------------
  |  Branch (529:8): [True: 3, False: 0]
  ------------------
  530|      3|        *pDestLength = reqLength;
  531|      3|    }
  532|       |
  533|       |    /* Terminate the buffer */
  534|      3|    u_terminateUChars(dest,destCapacity,reqLength,pErrorCode);
  ------------------
  |  |  408|      3|#define u_terminateUChars U_ICU_ENTRY_POINT_RENAME(u_terminateUChars)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  535|       |
  536|      3|    return dest;
  537|      3|}

_ZN6icu_7811ICU_Utility21shouldAlwaysBeEscapedEi:
   72|      2|UBool ICU_Utility::shouldAlwaysBeEscaped(UChar32 c) {
   73|      2|    if (c < 0x20) {
  ------------------
  |  Branch (73:9): [True: 0, False: 2]
  ------------------
   74|      0|        return true;  // C0 control codes
   75|      2|    } else if (c <= 0x7e) {
  ------------------
  |  Branch (75:16): [True: 0, False: 2]
  ------------------
   76|      0|        return false;  // printable ASCII
   77|      2|    } else if (c <= 0x9f) {
  ------------------
  |  Branch (77:16): [True: 0, False: 2]
  ------------------
   78|      0|        return true;  // C1 control codes
   79|      2|    } else if (c < 0xd800) {
  ------------------
  |  Branch (79:16): [True: 2, False: 0]
  ------------------
   80|      2|        return false;  // most of the BMP
   81|      2|    } else if (c <= 0xdfff || (0xfdd0 <= c && c <= 0xfdef) || (c & 0xfffe) == 0xfffe) {
  ------------------
  |  Branch (81:16): [True: 0, False: 0]
  |  Branch (81:32): [True: 0, False: 0]
  |  Branch (81:47): [True: 0, False: 0]
  |  Branch (81:63): [True: 0, False: 0]
  ------------------
   82|      0|        return true;  // surrogate or noncharacter code points
   83|      0|    } else if (c <= 0x10ffff) {
  ------------------
  |  Branch (83:16): [True: 0, False: 0]
  ------------------
   84|      0|        return false;  // all else
   85|      0|    } else {
   86|      0|        return true;  // not a code point
   87|      0|    }
   88|      2|}
_ZN6icu_7811ICU_Utility14skipWhitespaceERKNS_13UnicodeStringERia:
  150|      5|                                    UBool advance) {
  151|      5|    int32_t p = pos;
  152|      5|    const char16_t* s = str.getBuffer();
  153|      5|    p = static_cast<int32_t>(PatternProps::skipWhiteSpace(s + p, str.length() - p) - s);
  154|      5|    if (advance) {
  ------------------
  |  Branch (154:9): [True: 3, False: 2]
  ------------------
  155|      3|        pos = p;
  156|      3|    }
  157|      5|    return p;
  158|      5|}

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

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

utrie2_enum_78:
  622|      1|            UTrie2EnumValue *enumValue, UTrie2EnumRange *enumRange, const void *context) {
  623|      1|    enumEitherTrie(trie, 0, 0x110000, enumValue, enumRange, context);
  624|      1|}
utrie2.cpp:_ZL14enumEitherTriePK6UTrie2iiPFjPKvjEPFaS3_iijES3_:
  445|      1|               UTrie2EnumValue *enumValue, UTrie2EnumRange *enumRange, const void *context) {
  446|      1|    const uint32_t *data32;
  447|      1|    const uint16_t *idx;
  448|       |
  449|      1|    uint32_t value, prevValue, initialValue;
  450|      1|    UChar32 c, prev, highStart;
  451|      1|    int32_t j, i2Block, prevI2Block, index2NullOffset, block, prevBlock, nullBlock;
  452|       |
  453|      1|    if(enumRange==nullptr) {
  ------------------
  |  Branch (453:8): [True: 0, False: 1]
  ------------------
  454|      0|        return;
  455|      0|    }
  456|      1|    if(enumValue==nullptr) {
  ------------------
  |  Branch (456:8): [True: 1, False: 0]
  ------------------
  457|      1|        enumValue=enumSameValue;
  458|      1|    }
  459|       |
  460|      1|    if(trie->newTrie==nullptr) {
  ------------------
  |  Branch (460:8): [True: 1, False: 0]
  ------------------
  461|       |        /* frozen trie */
  462|      1|        idx=trie->index;
  463|      1|        U_ASSERT(idx!=nullptr); /* the following code assumes trie->newTrie is not nullptr when idx is nullptr */
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  464|      1|        data32=trie->data32;
  465|       |
  466|      1|        index2NullOffset=trie->index2NullOffset;
  467|      1|        nullBlock=trie->dataNullOffset;
  468|      1|    } else {
  469|       |        /* unfrozen, mutable trie */
  470|      0|        idx=nullptr;
  471|      0|        data32=trie->newTrie->data;
  472|      0|        U_ASSERT(data32!=nullptr); /* the following code assumes idx is not nullptr when data32 is nullptr */
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  473|       |
  474|      0|        index2NullOffset=trie->newTrie->index2NullOffset;
  475|      0|        nullBlock=trie->newTrie->dataNullOffset;
  476|      0|    }
  477|       |
  478|      1|    highStart=trie->highStart;
  479|       |
  480|       |    /* get the enumeration value that corresponds to an initial-value trie data entry */
  481|      1|    initialValue=enumValue(context, trie->initialValue);
  482|       |
  483|       |    /* set variables for previous range */
  484|      1|    prevI2Block=-1;
  485|      1|    prevBlock=-1;
  486|      1|    prev=start;
  487|      1|    prevValue=0;
  488|       |
  489|       |    /* enumerate index-2 blocks */
  490|    546|    for(c=start; c<limit && c<highStart;) {
  ------------------
  |  Branch (490:18): [True: 545, False: 1]
  |  Branch (490:29): [True: 545, False: 0]
  ------------------
  491|       |        /* Code point limit for iterating inside this i2Block. */
  492|    545|        UChar32 tempLimit=c+UTRIE2_CP_PER_INDEX_1_ENTRY;
  493|    545|        if(limit<tempLimit) {
  ------------------
  |  Branch (493:12): [True: 0, False: 545]
  ------------------
  494|      0|            tempLimit=limit;
  495|      0|        }
  496|    545|        if(c<=0xffff) {
  ------------------
  |  Branch (496:12): [True: 33, False: 512]
  ------------------
  497|     33|            if(!U_IS_SURROGATE(c)) {
  ------------------
  |  |  193|     33|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  ------------------
  |  Branch (497:16): [True: 31, False: 2]
  ------------------
  498|     31|                i2Block=c>>UTRIE2_SHIFT_2;
  499|     31|            } else if(U_IS_SURROGATE_LEAD(c)) {
  ------------------
  |  |  202|      2|#define U_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  ------------------
  |  |  |  Branch (202:32): [True: 1, False: 1]
  |  |  ------------------
  ------------------
  500|       |                /*
  501|       |                 * Enumerate values for lead surrogate code points, not code units:
  502|       |                 * This special block has half the normal length.
  503|       |                 */
  504|      1|                i2Block=UTRIE2_LSCP_INDEX_2_OFFSET;
  505|      1|                tempLimit=MIN_VALUE(0xdc00, limit);
  ------------------
  |  |  421|      1|#define MIN_VALUE(a, b) ((a)<(b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (421:26): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  506|      1|            } else {
  507|       |                /*
  508|       |                 * Switch back to the normal part of the index-2 table.
  509|       |                 * Enumerate the second half of the surrogates block.
  510|       |                 */
  511|      1|                i2Block=0xd800>>UTRIE2_SHIFT_2;
  512|      1|                tempLimit=MIN_VALUE(0xe000, limit);
  ------------------
  |  |  421|      1|#define MIN_VALUE(a, b) ((a)<(b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (421:26): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  513|      1|            }
  514|    512|        } else {
  515|       |            /* supplementary code points */
  516|    512|            if(idx!=nullptr) {
  ------------------
  |  Branch (516:16): [True: 512, False: 0]
  ------------------
  517|    512|                i2Block=idx[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+
  518|    512|                              (c>>UTRIE2_SHIFT_1)];
  519|    512|            } else {
  520|      0|                i2Block=trie->newTrie->index1[c>>UTRIE2_SHIFT_1];
  521|      0|            }
  522|    512|            if(i2Block==prevI2Block && (c-prev)>=UTRIE2_CP_PER_INDEX_1_ENTRY) {
  ------------------
  |  Branch (522:16): [True: 454, False: 58]
  |  Branch (522:40): [True: 454, False: 0]
  ------------------
  523|       |                /*
  524|       |                 * The index-2 block is the same as the previous one, and filled with prevValue.
  525|       |                 * Only possible for supplementary code points because the linear-BMP index-2
  526|       |                 * table creates unique i2Block values.
  527|       |                 */
  528|    454|                c+=UTRIE2_CP_PER_INDEX_1_ENTRY;
  529|    454|                continue;
  530|    454|            }
  531|    512|        }
  532|     91|        prevI2Block=i2Block;
  533|     91|        if(i2Block==index2NullOffset) {
  ------------------
  |  Branch (533:12): [True: 6, False: 85]
  ------------------
  534|       |            /* this is the null index-2 block */
  535|      6|            if(prevValue!=initialValue) {
  ------------------
  |  Branch (535:16): [True: 0, False: 6]
  ------------------
  536|      0|                if(prev<c && !enumRange(context, prev, c-1, prevValue)) {
  ------------------
  |  Branch (536:20): [True: 0, False: 0]
  |  Branch (536:30): [True: 0, False: 0]
  ------------------
  537|      0|                    return;
  538|      0|                }
  539|      0|                prevBlock=nullBlock;
  540|      0|                prev=c;
  541|      0|                prevValue=initialValue;
  542|      0|            }
  543|      6|            c+=UTRIE2_CP_PER_INDEX_1_ENTRY;
  544|     85|        } else {
  545|       |            /* enumerate data blocks for one index-2 block */
  546|     85|            int32_t i2, i2Limit;
  547|     85|            i2=(c>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK;
  548|     85|            if((c>>UTRIE2_SHIFT_1)==(tempLimit>>UTRIE2_SHIFT_1)) {
  ------------------
  |  Branch (548:16): [True: 1, False: 84]
  ------------------
  549|      1|                i2Limit=(tempLimit>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK;
  550|     84|            } else {
  551|     84|                i2Limit=UTRIE2_INDEX_2_BLOCK_LENGTH;
  552|     84|            }
  553|  5.46k|            for(; i2<i2Limit; ++i2) {
  ------------------
  |  Branch (553:19): [True: 5.37k, False: 85]
  ------------------
  554|  5.37k|                if(idx!=nullptr) {
  ------------------
  |  Branch (554:20): [True: 5.37k, False: 0]
  ------------------
  555|  5.37k|                    block = static_cast<int32_t>(idx[i2Block + i2]) << UTRIE2_INDEX_SHIFT;
  556|  5.37k|                } else {
  557|      0|                    block=trie->newTrie->index2[i2Block+i2];
  558|      0|                }
  559|  5.37k|                if(block==prevBlock && (c-prev)>=UTRIE2_DATA_BLOCK_LENGTH) {
  ------------------
  |  Branch (559:20): [True: 4.37k, False: 999]
  |  Branch (559:40): [True: 4.36k, False: 9]
  ------------------
  560|       |                    /* the block is the same as the previous one, and filled with prevValue */
  561|  4.36k|                    c+=UTRIE2_DATA_BLOCK_LENGTH;
  562|  4.36k|                    continue;
  563|  4.36k|                }
  564|  1.00k|                prevBlock=block;
  565|  1.00k|                if(block==nullBlock) {
  ------------------
  |  Branch (565:20): [True: 64, False: 944]
  ------------------
  566|       |                    /* this is the null data block */
  567|     64|                    if(prevValue!=initialValue) {
  ------------------
  |  Branch (567:24): [True: 9, False: 55]
  ------------------
  568|      9|                        if(prev<c && !enumRange(context, prev, c-1, prevValue)) {
  ------------------
  |  Branch (568:28): [True: 9, False: 0]
  |  Branch (568:38): [True: 0, False: 9]
  ------------------
  569|      0|                            return;
  570|      0|                        }
  571|      9|                        prev=c;
  572|      9|                        prevValue=initialValue;
  573|      9|                    }
  574|     64|                    c+=UTRIE2_DATA_BLOCK_LENGTH;
  575|    944|                } else {
  576|  31.1k|                    for(j=0; j<UTRIE2_DATA_BLOCK_LENGTH; ++j) {
  ------------------
  |  Branch (576:30): [True: 30.2k, False: 944]
  ------------------
  577|  30.2k|                        value=enumValue(context, data32!=nullptr ? data32[block+j] : idx[block+j]);
  ------------------
  |  Branch (577:50): [True: 0, False: 30.2k]
  ------------------
  578|  30.2k|                        if(value!=prevValue) {
  ------------------
  |  Branch (578:28): [True: 5.97k, False: 24.2k]
  ------------------
  579|  5.97k|                            if(prev<c && !enumRange(context, prev, c-1, prevValue)) {
  ------------------
  |  Branch (579:32): [True: 5.97k, False: 1]
  |  Branch (579:42): [True: 0, False: 5.97k]
  ------------------
  580|      0|                                return;
  581|      0|                            }
  582|  5.97k|                            prev=c;
  583|  5.97k|                            prevValue=value;
  584|  5.97k|                        }
  585|  30.2k|                        ++c;
  586|  30.2k|                    }
  587|    944|                }
  588|  1.00k|            }
  589|     85|        }
  590|     91|    }
  591|       |
  592|      1|    if(c>limit) {
  ------------------
  |  Branch (592:8): [True: 0, False: 1]
  ------------------
  593|      0|        c=limit;  /* could be higher if in the index2NullOffset */
  594|      1|    } else if(c<limit) {
  ------------------
  |  Branch (594:15): [True: 0, False: 1]
  ------------------
  595|       |        /* c==highStart<limit */
  596|      0|        uint32_t highValue;
  597|      0|        if(idx!=nullptr) {
  ------------------
  |  Branch (597:12): [True: 0, False: 0]
  ------------------
  598|      0|            highValue=
  599|      0|                data32!=nullptr ?
  ------------------
  |  Branch (599:17): [True: 0, False: 0]
  ------------------
  600|      0|                    data32[trie->highValueIndex] :
  601|      0|                    idx[trie->highValueIndex];
  602|      0|        } else {
  603|      0|            highValue=trie->newTrie->data[trie->newTrie->dataLength-UTRIE2_DATA_GRANULARITY];
  604|      0|        }
  605|      0|        value=enumValue(context, highValue);
  606|      0|        if(value!=prevValue) {
  ------------------
  |  Branch (606:12): [True: 0, False: 0]
  ------------------
  607|      0|            if(prev<c && !enumRange(context, prev, c-1, prevValue)) {
  ------------------
  |  Branch (607:16): [True: 0, False: 0]
  |  Branch (607:26): [True: 0, False: 0]
  ------------------
  608|      0|                return;
  609|      0|            }
  610|      0|            prev=c;
  611|      0|            prevValue=value;
  612|      0|        }
  613|      0|        c=limit;
  614|      0|    }
  615|       |
  616|       |    /* deliver last range */
  617|      1|    enumRange(context, prev, c-1, prevValue);
  618|      1|}
utrie2.cpp:_ZL13enumSameValuePKvj:
  425|  30.2k|enumSameValue(const void * /*context*/, uint32_t value) {
  426|  30.2k|    return value;
  427|  30.2k|}

_ZN6icu_787UVectorC2ER10UErrorCode:
   33|   158k|        UVector(nullptr, nullptr, DEFAULT_CAPACITY, status) {
   34|   158k|}
_ZN6icu_787UVectorC2EPFvPvEPFa8UElementS4_ER10UErrorCode:
   41|      3|        UVector(d, c, DEFAULT_CAPACITY, status) {
   42|      3|}
_ZN6icu_787UVectorC2EPFvPvEPFa8UElementS4_EiR10UErrorCode:
   45|   158k|    deleter(d),
   46|   158k|    comparer(c)
   47|   158k|{
   48|   158k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (48:9): [True: 0, False: 158k]
  ------------------
   49|      0|        return;
   50|      0|    }
   51|       |    // Fix bogus initialCapacity values; avoid malloc(0) and integer overflow
   52|   158k|    if ((initialCapacity < 1) || (initialCapacity > static_cast<int32_t>(INT32_MAX / sizeof(UElement)))) {
  ------------------
  |  Branch (52:9): [True: 0, False: 158k]
  |  Branch (52:34): [True: 0, False: 158k]
  ------------------
   53|      0|        initialCapacity = DEFAULT_CAPACITY;
   54|      0|    }
   55|   158k|    elements = static_cast<UElement*>(uprv_malloc(sizeof(UElement) * initialCapacity));
  ------------------
  |  | 1524|   158k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   56|   158k|    if (elements == nullptr) {
  ------------------
  |  Branch (56:9): [True: 0, False: 158k]
  ------------------
   57|      0|        status = U_MEMORY_ALLOCATION_ERROR;
   58|   158k|    } else {
   59|   158k|        capacity = initialCapacity;
   60|   158k|    }
   61|   158k|}
_ZN6icu_787UVectorD2Ev:
   63|   158k|UVector::~UVector() {
   64|   158k|    removeAllElements();
   65|   158k|    uprv_free(elements);
  ------------------
  |  | 1503|   158k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   66|   158k|    elements = nullptr;
   67|   158k|}
_ZN6icu_787UVector12adoptElementEPvR10UErrorCode:
  109|  13.3M|void UVector::adoptElement(void* obj, UErrorCode &status) {
  110|  13.3M|    U_ASSERT(deleter != nullptr);
  ------------------
  |  |   35|  13.3M|#   define U_ASSERT(exp) (void)0
  ------------------
  111|  13.3M|    if (ensureCapacity(count + 1, status)) {
  ------------------
  |  Branch (111:9): [True: 13.3M, False: 0]
  ------------------
  112|  13.3M|        elements[count++].pointer = obj;
  113|  13.3M|    } else {
  114|      0|        (*deleter)(obj);
  115|      0|    }
  116|  13.3M|}
_ZNK6icu_787UVector9elementAtEi:
  185|  13.1M|void* UVector::elementAt(int32_t index) const {
  186|  13.1M|    return (0 <= index && index < count) ? elements[index].pointer : nullptr;
  ------------------
  |  Branch (186:13): [True: 13.1M, False: 0]
  |  Branch (186:27): [True: 13.1M, False: 0]
  ------------------
  187|  13.1M|}
_ZN6icu_787UVector17removeAllElementsEv:
  251|   158k|void UVector::removeAllElements() {
  252|   158k|    if (deleter != nullptr) {
  ------------------
  |  Branch (252:9): [True: 157k, False: 1.50k]
  ------------------
  253|  13.5M|        for (int32_t i=0; i<count; ++i) {
  ------------------
  |  Branch (253:27): [True: 13.3M, False: 157k]
  ------------------
  254|  13.3M|            if (elements[i].pointer != nullptr) {
  ------------------
  |  Branch (254:17): [True: 13.3M, False: 0]
  ------------------
  255|  13.3M|                (*deleter)(elements[i].pointer);
  256|  13.3M|            }
  257|  13.3M|        }
  258|   157k|    }
  259|   158k|    count = 0;
  260|   158k|}
_ZN6icu_787UVector14ensureCapacityEiR10UErrorCode:
  326|  13.3M|UBool UVector::ensureCapacity(int32_t minimumCapacity, UErrorCode &status) {
  327|  13.3M|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (327:9): [True: 0, False: 13.3M]
  ------------------
  328|      0|        return false;
  329|      0|    }
  330|  13.3M|    if (minimumCapacity < 0) {
  ------------------
  |  Branch (330:9): [True: 0, False: 13.3M]
  ------------------
  331|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  332|      0|        return false;
  333|      0|    }
  334|  13.3M|    if (capacity < minimumCapacity) {
  ------------------
  |  Branch (334:9): [True: 4.61k, False: 13.3M]
  ------------------
  335|  4.61k|        if (capacity > (INT32_MAX - 1) / 2) {        	// integer overflow check
  ------------------
  |  Branch (335:13): [True: 0, False: 4.61k]
  ------------------
  336|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  337|      0|            return false;
  338|      0|        }
  339|  4.61k|        int32_t newCap = capacity * 2;
  340|  4.61k|        if (newCap < minimumCapacity) {
  ------------------
  |  Branch (340:13): [True: 0, False: 4.61k]
  ------------------
  341|      0|            newCap = minimumCapacity;
  342|      0|        }
  343|  4.61k|        if (newCap > static_cast<int32_t>(INT32_MAX / sizeof(UElement))) { // integer overflow check
  ------------------
  |  Branch (343:13): [True: 0, False: 4.61k]
  ------------------
  344|       |            // We keep the original memory contents on bad minimumCapacity.
  345|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  346|      0|            return false;
  347|      0|        }
  348|  4.61k|        UElement* newElems = static_cast<UElement*>(uprv_realloc(elements, sizeof(UElement) * newCap));
  ------------------
  |  | 1536|  4.61k|#define uprv_realloc U_ICU_ENTRY_POINT_RENAME(uprv_realloc)
  |  |  ------------------
  |  |  |  |  123|  4.61k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.61k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.61k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  349|  4.61k|        if (newElems == nullptr) {
  ------------------
  |  Branch (349:13): [True: 0, False: 4.61k]
  ------------------
  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|  4.61k|        elements = newElems;
  355|  4.61k|        capacity = newCap;
  356|  4.61k|    }
  357|  13.3M|    return true;
  358|  13.3M|}
_ZN6icu_787UVector10setDeleterEPFvPvE:
  397|   157k|UObjectDeleter *UVector::setDeleter(UObjectDeleter *d) {
  398|   157k|    UObjectDeleter *old = deleter;
  399|   157k|    deleter = d;
  400|   157k|    return old;
  401|   157k|}
_ZN6icu_787UVector11setComparerEPFa8UElementS1_E:
  403|   127k|UElementsAreEqual *UVector::setComparer(UElementsAreEqual *d) {
  404|   127k|    UElementsAreEqual *old = comparer;
  405|   127k|    comparer = d;
  406|   127k|    return old;
  407|   127k|}

_ZNK6icu_787UVector4sizeEv:
  190|   283k|    inline int32_t size() const {return count;}
_ZNK6icu_787UVectorixEi:
  218|  6.57k|    inline void* operator[](int32_t index) const {return elementAt(index);}

_ZN6icu_789UVector32C2ER10UErrorCode:
   30|   127k|    count(0),
   31|   127k|    capacity(0),
   32|   127k|    maxCapacity(0),
   33|   127k|    elements(nullptr)
   34|   127k|{
   35|   127k|    _init(DEFAULT_CAPACITY, status);
  ------------------
  |  |   19|   127k|#define DEFAULT_CAPACITY 8
  ------------------
   36|   127k|}
_ZN6icu_789UVector325_initEiR10UErrorCode:
   49|   127k|void UVector32::_init(int32_t initialCapacity, UErrorCode &status) {
   50|       |    // Fix bogus initialCapacity values; avoid malloc(0)
   51|   127k|    if (initialCapacity < 1) {
  ------------------
  |  Branch (51:9): [True: 0, False: 127k]
  ------------------
   52|      0|        initialCapacity = DEFAULT_CAPACITY;
  ------------------
  |  |   19|      0|#define DEFAULT_CAPACITY 8
  ------------------
   53|      0|    }
   54|   127k|    if (maxCapacity>0 && maxCapacity<initialCapacity) {
  ------------------
  |  Branch (54:9): [True: 0, False: 127k]
  |  Branch (54:26): [True: 0, False: 0]
  ------------------
   55|      0|        initialCapacity = maxCapacity;
   56|      0|    }
   57|   127k|    if (initialCapacity > static_cast<int32_t>(INT32_MAX / sizeof(int32_t))) {
  ------------------
  |  Branch (57:9): [True: 0, False: 127k]
  ------------------
   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|   127k|    elements = static_cast<int32_t*>(uprv_malloc(sizeof(int32_t) * initialCapacity));
  ------------------
  |  | 1524|   127k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|   127k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   127k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   127k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   61|   127k|    if (elements == nullptr) {
  ------------------
  |  Branch (61:9): [True: 0, False: 127k]
  ------------------
   62|      0|        status = U_MEMORY_ALLOCATION_ERROR;
   63|   127k|    } else {
   64|   127k|        capacity = initialCapacity;
   65|   127k|    }
   66|   127k|}
_ZN6icu_789UVector32D2Ev:
   68|   127k|UVector32::~UVector32() {
   69|   127k|    uprv_free(elements);
  ------------------
  |  | 1503|   127k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|   127k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   127k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   127k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   70|   127k|    elements = nullptr;
   71|   127k|}
_ZN6icu_789UVector3212setElementAtEii:
   98|   254k|void UVector32::setElementAt(int32_t elem, int32_t index) {
   99|   254k|    if (0 <= index && index < count) {
  ------------------
  |  Branch (99:9): [True: 254k, False: 0]
  |  Branch (99:23): [True: 254k, False: 0]
  ------------------
  100|   254k|        elements[index] = elem;
  101|   254k|    }
  102|       |    /* else index out of range */
  103|   254k|}

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

_ZN6icu_7813BasicTimeZoneC2ERKNS_13UnicodeStringE:
   28|      1|: TimeZone(id) {
   29|      1|}
_ZN6icu_7813BasicTimeZoneC2ERKS0_:
   32|   112k|: TimeZone(source) {
   33|   112k|}
_ZN6icu_7813BasicTimeZoneD2Ev:
   35|   112k|BasicTimeZone::~BasicTimeZone() {
   36|   112k|}

_ZN6icu_7814SharedCalendarD2Ev:
  208|      1|SharedCalendar::~SharedCalendar() {
  209|      1|    delete ptr;
  210|      1|}
_ZNK6icu_7814LocaleCacheKeyINS_14SharedCalendarEE12createObjectEPKvR10UErrorCode:
  214|      2|        const void * /*unusedCreationContext*/, UErrorCode &status) const {
  215|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (215:9): [True: 0, False: 2]
  ------------------
  216|      0|       return nullptr;
  217|      0|    }
  218|      2|    Calendar *calendar = Calendar::makeInstance(fLoc, status);
  219|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (219:9): [True: 0, False: 2]
  ------------------
  220|      0|        return nullptr;
  221|      0|    }
  222|      2|    SharedCalendar *shared = new SharedCalendar(calendar);
  223|      2|    if (shared == nullptr) {
  ------------------
  |  Branch (223:9): [True: 0, False: 2]
  ------------------
  224|      0|        delete calendar;
  225|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  226|      0|        return nullptr;
  227|      0|    }
  228|      2|    shared->addRef();
  229|      2|    return shared;
  230|      2|}
_ZN6icu_788CalendarC2EPNS_8TimeZoneERKNS_6LocaleER10UErrorCode:
  721|      3|:   UObject(),
  722|      3|fIsTimeSet(false),
  723|      3|fAreFieldsSet(false),
  724|      3|fAreAllFieldsSet(false),
  725|      3|fAreFieldsVirtuallySet(false),
  726|      3|fLenient(true),
  727|      3|fRepeatedWallTime(UCAL_WALLTIME_LAST),
  728|      3|fSkippedWallTime(UCAL_WALLTIME_LAST)
  729|      3|{
  730|      3|    LocalPointer<TimeZone> zone(adoptZone, success);
  731|      3|    if (U_FAILURE(success)) {
  ------------------
  |  Branch (731:9): [True: 0, False: 3]
  ------------------
  732|      0|        return;
  733|      0|    }
  734|      3|    if (zone.isNull()) {
  ------------------
  |  Branch (734:9): [True: 0, False: 3]
  ------------------
  735|       |#if defined (U_DEBUG_CAL)
  736|       |        fprintf(stderr, "%s:%d: ILLEGAL ARG because timezone cannot be 0\n",
  737|       |            __FILE__, __LINE__);
  738|       |#endif
  739|      0|        success = U_ILLEGAL_ARGUMENT_ERROR;
  740|      0|        return;
  741|      0|    }
  742|       |
  743|      3|    clear();
  744|      3|    fZone = zone.orphan();
  745|      3|    setWeekData(aLocale, nullptr, success);
  746|      3|}
_ZN6icu_788CalendarD2Ev:
  775|  56.1k|{
  776|  56.1k|    delete fZone;
  777|  56.1k|    delete actualLocale;
  778|  56.1k|    delete validLocale;
  779|  56.1k|}
_ZN6icu_788CalendarC2ERKS0_:
  784|  56.1k|:   UObject(source)
  785|  56.1k|{
  786|  56.1k|    *this = source;
  787|  56.1k|}
_ZN6icu_788CalendaraSERKS0_:
  793|  56.1k|{
  794|  56.1k|    if (this != &right) {
  ------------------
  |  Branch (794:9): [True: 56.1k, False: 0]
  ------------------
  795|  56.1k|        uprv_arrayCopy(right.fFields, fFields, UCAL_FIELD_COUNT);
  796|  56.1k|        uprv_arrayCopy(right.fStamp, fStamp, UCAL_FIELD_COUNT);
  797|  56.1k|        fTime                    = right.fTime;
  798|  56.1k|        fIsTimeSet               = right.fIsTimeSet;
  799|  56.1k|        fAreAllFieldsSet         = right.fAreAllFieldsSet;
  800|  56.1k|        fAreFieldsSet            = right.fAreFieldsSet;
  801|  56.1k|        fAreFieldsVirtuallySet   = right.fAreFieldsVirtuallySet;
  802|  56.1k|        fLenient                 = right.fLenient;
  803|  56.1k|        fRepeatedWallTime        = right.fRepeatedWallTime;
  804|  56.1k|        fSkippedWallTime         = right.fSkippedWallTime;
  805|  56.1k|        delete fZone;
  806|  56.1k|        fZone = nullptr;
  807|  56.1k|        if (right.fZone != nullptr) {
  ------------------
  |  Branch (807:13): [True: 56.1k, False: 0]
  ------------------
  808|  56.1k|            fZone                = right.fZone->clone();
  809|  56.1k|        }
  810|  56.1k|        fFirstDayOfWeek          = right.fFirstDayOfWeek;
  811|  56.1k|        fMinimalDaysInFirstWeek  = right.fMinimalDaysInFirstWeek;
  812|  56.1k|        fWeekendOnset            = right.fWeekendOnset;
  813|  56.1k|        fWeekendOnsetMillis      = right.fWeekendOnsetMillis;
  814|  56.1k|        fWeekendCease            = right.fWeekendCease;
  815|  56.1k|        fWeekendCeaseMillis      = right.fWeekendCeaseMillis;
  816|  56.1k|        fNextStamp               = right.fNextStamp;
  817|  56.1k|        UErrorCode status = U_ZERO_ERROR;
  818|  56.1k|        U_LOCALE_BASED(locBased, *this);
  ------------------
  |  |   25|  56.1k|  LocaleBased varname((objname).validLocale, (objname).actualLocale)
  ------------------
  819|  56.1k|        locBased.setLocaleIDs(right.validLocale, right.actualLocale, status);
  820|  56.1k|        U_ASSERT(U_SUCCESS(status));
  ------------------
  |  |   35|  56.1k|#   define U_ASSERT(exp) (void)0
  ------------------
  821|  56.1k|    }
  822|       |
  823|  56.1k|    return *this;
  824|  56.1k|}
_ZN6icu_788Calendar12makeInstanceERKNS_6LocaleER10UErrorCode:
  855|      2|Calendar::makeInstance(const Locale& aLocale, UErrorCode& success) {
  856|      2|    if (U_FAILURE(success)) {
  ------------------
  |  Branch (856:9): [True: 0, False: 2]
  ------------------
  857|      0|        return nullptr;
  858|      0|    }
  859|       |
  860|      2|    Locale actualLoc;
  861|      2|    UObject* u = nullptr;
  862|       |
  863|      2|#if !UCONFIG_NO_SERVICE
  864|      2|    if (isCalendarServiceUsed()) {
  ------------------
  |  Branch (864:9): [True: 0, False: 2]
  ------------------
  865|      0|        u = getCalendarService(success)->get(aLocale, LocaleKey::KIND_ANY, &actualLoc, success);
  866|      0|    }
  867|      2|    else
  868|      2|#endif
  869|      2|    {
  870|      2|        u = createStandardCalendar(getCalendarTypeForLocale(aLocale.getName()), aLocale, success);
  871|      2|    }
  872|      2|    Calendar* c = nullptr;
  873|       |
  874|      2|    if(U_FAILURE(success) || !u) {
  ------------------
  |  Branch (874:8): [True: 0, False: 2]
  |  Branch (874:30): [True: 0, False: 2]
  ------------------
  875|      0|        if(U_SUCCESS(success)) { // Propagate some kind of err
  ------------------
  |  Branch (875:12): [True: 0, False: 0]
  ------------------
  876|      0|            success = U_INTERNAL_PROGRAM_ERROR;
  877|      0|        }
  878|      0|        return nullptr;
  879|      0|    }
  880|       |
  881|      2|#if !UCONFIG_NO_SERVICE
  882|      2|    const UnicodeString* str = dynamic_cast<const UnicodeString*>(u);
  883|      2|    if(str != nullptr) {
  ------------------
  |  Branch (883:8): [True: 0, False: 2]
  ------------------
  884|       |        // It's a unicode string telling us what type of calendar to load ("gregorian", etc)
  885|       |        // Create a Locale over this string
  886|      0|        Locale l("");
  887|      0|        LocaleUtility::initLocaleFromName(*str, l);
  888|       |
  889|       |#ifdef U_DEBUG_CALSVC
  890|       |        fprintf(stderr, "Calendar::createInstance(%s), looking up [%s]\n", aLocale.getName(), l.getName());
  891|       |#endif
  892|       |
  893|      0|        Locale actualLoc2;
  894|      0|        delete u;
  895|      0|        u = nullptr;
  896|       |
  897|       |        // Don't overwrite actualLoc, since the actual loc from this call
  898|       |        // may be something like "@calendar=gregorian" -- TODO investigate
  899|       |        // further...
  900|      0|        c = (Calendar*)getCalendarService(success)->get(l, LocaleKey::KIND_ANY, &actualLoc2, success);
  901|       |
  902|      0|        if(U_FAILURE(success) || !c) {
  ------------------
  |  Branch (902:12): [True: 0, False: 0]
  |  Branch (902:34): [True: 0, False: 0]
  ------------------
  903|      0|            if(U_SUCCESS(success)) {
  ------------------
  |  Branch (903:16): [True: 0, False: 0]
  ------------------
  904|      0|                success = U_INTERNAL_PROGRAM_ERROR; // Propagate some err
  905|      0|            }
  906|      0|            return nullptr;
  907|      0|        }
  908|       |
  909|      0|        str = dynamic_cast<const UnicodeString*>(c);
  910|      0|        if(str != nullptr) {
  ------------------
  |  Branch (910:12): [True: 0, False: 0]
  ------------------
  911|       |            // recursed! Second lookup returned a UnicodeString.
  912|       |            // Perhaps DefaultCalendar{} was set to another locale.
  913|       |#ifdef U_DEBUG_CALSVC
  914|       |            char tmp[200];
  915|       |            // Extract a char* out of it..
  916|       |            int32_t len = str->length();
  917|       |            int32_t actLen = sizeof(tmp)-1;
  918|       |            if(len > actLen) {
  919|       |                len = actLen;
  920|       |            }
  921|       |            str->extract(0,len,tmp);
  922|       |            tmp[len]=0;
  923|       |
  924|       |            fprintf(stderr, "err - recursed, 2nd lookup was unistring %s\n", tmp);
  925|       |#endif
  926|      0|            success = U_MISSING_RESOURCE_ERROR;  // requested a calendar type which could NOT be found.
  927|      0|            delete c;
  928|      0|            return nullptr;
  929|      0|        }
  930|       |#ifdef U_DEBUG_CALSVC
  931|       |        fprintf(stderr, "%p: setting week count data to locale %s, actual locale %s\n", c, (const char*)aLocale.getName(), (const char *)actualLoc.getName());
  932|       |#endif
  933|      0|        c->setWeekData(aLocale, c->getType(), success);  // set the correct locale (this was an indirect calendar)
  934|       |
  935|      0|        char keyword[ULOC_FULLNAME_CAPACITY] = "";
  936|      0|        UErrorCode tmpStatus = U_ZERO_ERROR;
  937|      0|        l.getKeywordValue("calendar", keyword, ULOC_FULLNAME_CAPACITY, tmpStatus);
  ------------------
  |  |  264|      0|#define ULOC_FULLNAME_CAPACITY 157
  ------------------
  938|      0|        if (U_SUCCESS(tmpStatus) && uprv_strcmp(keyword, "iso8601") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (938:13): [True: 0, False: 0]
  |  Branch (938:37): [True: 0, False: 0]
  ------------------
  939|      0|            c->setFirstDayOfWeek(UCAL_MONDAY);
  940|      0|            c->setMinimalDaysInFirstWeek(4);
  941|      0|        }
  942|      0|    }
  943|      2|    else
  944|      2|#endif /* UCONFIG_NO_SERVICE */
  945|      2|    {
  946|       |        // a calendar was returned - we assume the factory did the right thing.
  947|      2|        c = (Calendar*)u;
  948|      2|    }
  949|       |
  950|      2|    return c;
  951|      2|}
_ZN6icu_788Calendar14createInstanceEPNS_8TimeZoneERKNS_6LocaleER10UErrorCode:
  955|  56.1k|{
  956|  56.1k|    LocalPointer<TimeZone> zonePtr(zone);
  957|  56.1k|    const SharedCalendar *shared = nullptr;
  958|  56.1k|    UnifiedCache::getByLocale(aLocale, shared, success);
  959|  56.1k|    if (U_FAILURE(success)) {
  ------------------
  |  Branch (959:9): [True: 0, False: 56.1k]
  ------------------
  960|      0|        return nullptr;
  961|      0|    }
  962|  56.1k|    Calendar *c = (*shared)->clone();
  963|  56.1k|    shared->removeRef();
  964|  56.1k|    if (c == nullptr) {
  ------------------
  |  Branch (964:9): [True: 0, False: 56.1k]
  ------------------
  965|      0|        success = U_MEMORY_ALLOCATION_ERROR;
  966|      0|        return nullptr;
  967|      0|    }
  968|       |
  969|       |    // Now, reset calendar to default state:
  970|  56.1k|    c->adoptTimeZone(zonePtr.orphan()); //  Set the correct time zone
  971|  56.1k|    c->setTimeInMillis(getNow(), success); // let the new calendar have the current time.
  972|       |
  973|  56.1k|    return c;
  974|  56.1k|}
_ZN6icu_788Calendar25getCalendarTypeFromLocaleERKNS_6LocaleEPciR10UErrorCode:
  995|  2.04k|        UErrorCode &success) {
  996|  2.04k|    const SharedCalendar *shared = nullptr;
  997|  2.04k|    UnifiedCache::getByLocale(aLocale, shared, success);
  998|  2.04k|    if (U_FAILURE(success)) {
  ------------------
  |  Branch (998:9): [True: 0, False: 2.04k]
  ------------------
  999|      0|        return;
 1000|      0|    }
 1001|  2.04k|    uprv_strncpy(typeBuffer, (*shared)->getType(), typeBufferSize);
  ------------------
  |  |   43|  2.04k|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|  2.04k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1002|  2.04k|    shared->removeRef();
 1003|  2.04k|    if (typeBuffer[typeBufferSize - 1]) {
  ------------------
  |  Branch (1003:9): [True: 0, False: 2.04k]
  ------------------
 1004|      0|        success = U_BUFFER_OVERFLOW_ERROR;
 1005|      0|    }
 1006|  2.04k|}
_ZN6icu_788Calendar6getNowEv:
 1093|  56.1k|{
 1094|  56.1k|    return uprv_getUTCtime(); // return as milliseconds
  ------------------
  |  | 1512|  56.1k|#define uprv_getUTCtime U_ICU_ENTRY_POINT_RENAME(uprv_getUTCtime)
  |  |  ------------------
  |  |  |  |  123|  56.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  56.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  56.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1095|  56.1k|}
_ZNK6icu_788Calendar15getTimeInMillisER10UErrorCode:
 1105|      1|{
 1106|      1|    if(U_FAILURE(status))
  ------------------
  |  Branch (1106:8): [True: 0, False: 1]
  ------------------
 1107|      0|        return 0.0;
 1108|       |
 1109|      1|    if ( ! fIsTimeSet)
  ------------------
  |  Branch (1109:10): [True: 1, False: 0]
  ------------------
 1110|      1|        const_cast<Calendar*>(this)->updateTime(status);
 1111|       |
 1112|       |    /* Test for buffer overflows */
 1113|      1|    if(U_FAILURE(status)) {
  ------------------
  |  Branch (1113:8): [True: 0, False: 1]
  ------------------
 1114|      0|        return 0.0;
 1115|      0|    }
 1116|      1|    return fTime;
 1117|      1|}
_ZN6icu_788Calendar15setTimeInMillisEdR10UErrorCode:
 1129|  56.1k|Calendar::setTimeInMillis( double millis, UErrorCode& status ) {
 1130|  56.1k|    if(U_FAILURE(status))
  ------------------
  |  Branch (1130:8): [True: 0, False: 56.1k]
  ------------------
 1131|      0|        return;
 1132|       |
 1133|  56.1k|    if (millis > MAX_MILLIS) {
  ------------------
  |  |  158|  56.1k|#define MAX_MILLIS ((MAX_JULIAN - kEpochStartAsJulianDay) * kOneDay)
  |  |  ------------------
  |  |  |  |  152|  56.1k|#define MAX_JULIAN (+0x7F000000)
  |  |  ------------------
  |  |               #define MAX_MILLIS ((MAX_JULIAN - kEpochStartAsJulianDay) * kOneDay)
  |  |  ------------------
  |  |  |  |  127|  56.1k|#define kEpochStartAsJulianDay  2440588 // January 1, 1970 (Gregorian)
  |  |  ------------------
  |  |               #define MAX_MILLIS ((MAX_JULIAN - kEpochStartAsJulianDay) * kOneDay)
  |  |  ------------------
  |  |  |  |  117|  56.1k|#define kOneDay    (1.0 * U_MILLIS_PER_DAY)       //  86,400,000
  |  |  |  |  ------------------
  |  |  |  |  |  |  227|  56.1k|#define U_MILLIS_PER_DAY       (86400000)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1133:9): [True: 0, False: 56.1k]
  ------------------
 1134|      0|        if(isLenient()) {
  ------------------
  |  Branch (1134:12): [True: 0, False: 0]
  ------------------
 1135|      0|            millis = MAX_MILLIS;
  ------------------
  |  |  158|      0|#define MAX_MILLIS ((MAX_JULIAN - kEpochStartAsJulianDay) * kOneDay)
  |  |  ------------------
  |  |  |  |  152|      0|#define MAX_JULIAN (+0x7F000000)
  |  |  ------------------
  |  |               #define MAX_MILLIS ((MAX_JULIAN - kEpochStartAsJulianDay) * kOneDay)
  |  |  ------------------
  |  |  |  |  127|      0|#define kEpochStartAsJulianDay  2440588 // January 1, 1970 (Gregorian)
  |  |  ------------------
  |  |               #define MAX_MILLIS ((MAX_JULIAN - kEpochStartAsJulianDay) * kOneDay)
  |  |  ------------------
  |  |  |  |  117|      0|#define kOneDay    (1.0 * U_MILLIS_PER_DAY)       //  86,400,000
  |  |  |  |  ------------------
  |  |  |  |  |  |  227|      0|#define U_MILLIS_PER_DAY       (86400000)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1136|      0|        } else {
 1137|      0|		    status = U_ILLEGAL_ARGUMENT_ERROR;
 1138|      0|		    return;
 1139|      0|        }
 1140|  56.1k|    } else if (millis < MIN_MILLIS) {
  ------------------
  |  |  146|  56.1k|#define MIN_MILLIS ((MIN_JULIAN - kEpochStartAsJulianDay) * kOneDay)
  |  |  ------------------
  |  |  |  |  140|  56.1k|#define MIN_JULIAN (-0x7F000000)
  |  |  ------------------
  |  |               #define MIN_MILLIS ((MIN_JULIAN - kEpochStartAsJulianDay) * kOneDay)
  |  |  ------------------
  |  |  |  |  127|  56.1k|#define kEpochStartAsJulianDay  2440588 // January 1, 1970 (Gregorian)
  |  |  ------------------
  |  |               #define MIN_MILLIS ((MIN_JULIAN - kEpochStartAsJulianDay) * kOneDay)
  |  |  ------------------
  |  |  |  |  117|  56.1k|#define kOneDay    (1.0 * U_MILLIS_PER_DAY)       //  86,400,000
  |  |  |  |  ------------------
  |  |  |  |  |  |  227|  56.1k|#define U_MILLIS_PER_DAY       (86400000)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1140:16): [True: 0, False: 56.1k]
  ------------------
 1141|      0|        if(isLenient()) {
  ------------------
  |  Branch (1141:12): [True: 0, False: 0]
  ------------------
 1142|      0|            millis = MIN_MILLIS;
  ------------------
  |  |  146|      0|#define MIN_MILLIS ((MIN_JULIAN - kEpochStartAsJulianDay) * kOneDay)
  |  |  ------------------
  |  |  |  |  140|      0|#define MIN_JULIAN (-0x7F000000)
  |  |  ------------------
  |  |               #define MIN_MILLIS ((MIN_JULIAN - kEpochStartAsJulianDay) * kOneDay)
  |  |  ------------------
  |  |  |  |  127|      0|#define kEpochStartAsJulianDay  2440588 // January 1, 1970 (Gregorian)
  |  |  ------------------
  |  |               #define MIN_MILLIS ((MIN_JULIAN - kEpochStartAsJulianDay) * kOneDay)
  |  |  ------------------
  |  |  |  |  117|      0|#define kOneDay    (1.0 * U_MILLIS_PER_DAY)       //  86,400,000
  |  |  |  |  ------------------
  |  |  |  |  |  |  227|      0|#define U_MILLIS_PER_DAY       (86400000)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1143|      0|        } else {
 1144|      0|    		status = U_ILLEGAL_ARGUMENT_ERROR;
 1145|      0|	    	return;
 1146|      0|        }
 1147|  56.1k|    } else if (uprv_isNaN(millis)) {
  ------------------
  |  | 1519|  56.1k|#define uprv_isNaN U_ICU_ENTRY_POINT_RENAME(uprv_isNaN)
  |  |  ------------------
  |  |  |  |  123|  56.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  56.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  56.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1147:16): [True: 0, False: 56.1k]
  ------------------
 1148|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 1149|      0|        return;
 1150|      0|    }
 1151|       |
 1152|  56.1k|    fTime = millis;
 1153|  56.1k|    fAreFieldsSet = fAreAllFieldsSet = false;
 1154|  56.1k|    fIsTimeSet = fAreFieldsVirtuallySet = true;
 1155|       |
 1156|  56.1k|    uprv_memset(fFields, 0, sizeof(fFields));
  ------------------
  |  |  100|  56.1k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  56.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1157|  56.1k|    uprv_memset(fStamp, kUnset, sizeof(fStamp));
  ------------------
  |  |  100|  56.1k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  56.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1158|  56.1k|    fNextStamp = kMinimumUserStamp;
 1159|  56.1k|}
_ZNK6icu_788Calendar3getE19UCalendarDateFieldsR10UErrorCode:
 1165|      5|{
 1166|      5|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1166:9): [True: 0, False: 5]
  ------------------
 1167|      0|        return 0;
 1168|      0|    }
 1169|      5|    if (field < 0 || field >= UCAL_FIELD_COUNT) {
  ------------------
  |  Branch (1169:9): [True: 0, False: 5]
  |  Branch (1169:22): [True: 0, False: 5]
  ------------------
 1170|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 1171|      0|        return 0;
 1172|      0|    }
 1173|       |    // field values are only computed when actually requested; for more on when computation
 1174|       |    // of various things happens, see the "data flow in Calendar" description at the top
 1175|       |    // of this file
 1176|      5|    if (U_SUCCESS(status)) const_cast<Calendar*>(this)->complete(status); // Cast away const
  ------------------
  |  Branch (1176:9): [True: 5, False: 0]
  ------------------
 1177|      5|    return U_SUCCESS(status) ? fFields[field] : 0;
  ------------------
  |  Branch (1177:12): [True: 5, False: 0]
  ------------------
 1178|      5|}
_ZN6icu_788Calendar3setE19UCalendarDateFieldsi:
 1184|      3|{
 1185|      3|    if (field < 0 || field >= UCAL_FIELD_COUNT) {
  ------------------
  |  Branch (1185:9): [True: 0, False: 3]
  |  Branch (1185:22): [True: 0, False: 3]
  ------------------
 1186|      0|        return;
 1187|      0|    }
 1188|      3|    if (fAreFieldsVirtuallySet) {
  ------------------
  |  Branch (1188:9): [True: 1, False: 2]
  ------------------
 1189|      1|        UErrorCode ec = U_ZERO_ERROR;
 1190|      1|        computeFields(ec);
 1191|      1|    }
 1192|      3|    fFields[field]     = value;
 1193|       |    /* Ensure that the fNextStamp value doesn't go pass max value for int8_t */
 1194|      3|    if (fNextStamp == STAMP_MAX) {
  ------------------
  |  |  159|      3|#define STAMP_MAX 127
  ------------------
  |  Branch (1194:9): [True: 0, False: 3]
  ------------------
 1195|      0|        recalculateStamp();
 1196|      0|    }
 1197|      3|    fStamp[field]     = fNextStamp++;
 1198|      3|    fIsTimeSet = fAreFieldsSet = fAreFieldsVirtuallySet = false;
 1199|      3|}
_ZN6icu_788Calendar5clearEv:
 1268|      3|{
 1269|      3|    uprv_memset(fFields, 0, sizeof(fFields));
  ------------------
  |  |  100|      3|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1270|      3|    uprv_memset(fStamp, kUnset, sizeof(fStamp));
  ------------------
  |  |  100|      3|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1271|      3|    fNextStamp = kMinimumUserStamp;
 1272|      3|    fIsTimeSet = fAreFieldsSet = fAreAllFieldsSet = fAreFieldsVirtuallySet = false;
 1273|       |    // fTime is not 'cleared' - may be used if no fields are set.
 1274|      3|}
_ZNK6icu_788Calendar5isSetE19UCalendarDateFields:
 1305|      4|{
 1306|      4|    if (field < 0 || field >= UCAL_FIELD_COUNT) {
  ------------------
  |  Branch (1306:9): [True: 0, False: 4]
  |  Branch (1306:22): [True: 0, False: 4]
  ------------------
 1307|      0|        return false;
 1308|      0|    }
 1309|      4|    return fAreFieldsVirtuallySet || (fStamp[field] != kUnset);
  ------------------
  |  Branch (1309:12): [True: 0, False: 4]
  |  Branch (1309:38): [True: 4, False: 0]
  ------------------
 1310|      4|}
_ZNK6icu_788Calendar11newestStampE19UCalendarDateFieldsS1_i:
 1314|      1|{
 1315|      1|    int32_t bestStamp = bestStampSoFar;
 1316|      7|    for (int32_t i = static_cast<int32_t>(first); i <= static_cast<int32_t>(last); ++i) {
  ------------------
  |  Branch (1316:51): [True: 6, False: 1]
  ------------------
 1317|      6|        if (fStamp[i] > bestStamp) {
  ------------------
  |  Branch (1317:13): [True: 1, False: 5]
  ------------------
 1318|      1|            bestStamp = fStamp[i];
 1319|      1|        }
 1320|      6|    }
 1321|      1|    return bestStamp;
 1322|      1|}
_ZN6icu_788Calendar8completeER10UErrorCode:
 1329|      5|{
 1330|      5|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1330:9): [True: 0, False: 5]
  ------------------
 1331|      0|       return;
 1332|      0|    }
 1333|      5|    if (!fIsTimeSet) {
  ------------------
  |  Branch (1333:9): [True: 1, False: 4]
  ------------------
 1334|      1|        updateTime(status);
 1335|       |        /* Test for buffer overflows */
 1336|      1|        if(U_FAILURE(status)) {
  ------------------
  |  Branch (1336:12): [True: 0, False: 1]
  ------------------
 1337|      0|            return;
 1338|      0|        }
 1339|      1|    }
 1340|      5|    if (!fAreFieldsSet) {
  ------------------
  |  Branch (1340:9): [True: 3, False: 2]
  ------------------
 1341|      3|        computeFields(status); // fills in unset fields
 1342|       |        /* Test for buffer overflows */
 1343|      3|        if(U_FAILURE(status)) {
  ------------------
  |  Branch (1343:12): [True: 0, False: 3]
  ------------------
 1344|      0|            return;
 1345|      0|        }
 1346|      3|        fAreFieldsSet         = true;
 1347|      3|        fAreAllFieldsSet     = true;
 1348|      3|    }
 1349|      5|}
_ZN6icu_788Calendar8pinFieldE19UCalendarDateFieldsR10UErrorCode:
 1383|      1|void Calendar::pinField(UCalendarDateFields field, UErrorCode& status) {
 1384|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1384:9): [True: 0, False: 1]
  ------------------
 1385|      0|       return;
 1386|      0|    }
 1387|      1|    if (field < 0 || field >= UCAL_FIELD_COUNT) {
  ------------------
  |  Branch (1387:9): [True: 0, False: 1]
  |  Branch (1387:22): [True: 0, False: 1]
  ------------------
 1388|      0|       status = U_ILLEGAL_ARGUMENT_ERROR;
 1389|      0|       return;
 1390|      0|    }
 1391|      1|    int32_t max = getActualMaximum(field, status);
 1392|      1|    int32_t min = getActualMinimum(field, status);
 1393|       |
 1394|      1|    if (fFields[field] > max) {
  ------------------
  |  Branch (1394:9): [True: 0, False: 1]
  ------------------
 1395|      0|        set(field, max);
 1396|      1|    } else if (fFields[field] < min) {
  ------------------
  |  Branch (1396:16): [True: 0, False: 1]
  ------------------
 1397|      0|        set(field, min);
 1398|      0|    }
 1399|      1|}
_ZN6icu_788Calendar13computeFieldsER10UErrorCode:
 1403|      4|{
 1404|      4|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (1404:9): [True: 0, False: 4]
  ------------------
 1405|      0|        return;
 1406|      0|    }
 1407|       |    // Compute local wall millis
 1408|      4|    double localMillis = internalGetTime();
 1409|      4|    int32_t rawOffset, dstOffset;
 1410|      4|    getTimeZone().getOffset(localMillis, false, rawOffset, dstOffset, ec);
 1411|      4|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (1411:9): [True: 0, False: 4]
  ------------------
 1412|      0|        return;
 1413|      0|    }
 1414|      4|    localMillis += (rawOffset + dstOffset);
 1415|       |
 1416|       |    // Mark fields as set.  Do this before calling handleComputeFields().
 1417|      4|    uint32_t mask =   //fInternalSetMask;
 1418|      4|        (1 << UCAL_ERA) |
 1419|      4|        (1 << UCAL_YEAR) |
 1420|      4|        (1 << UCAL_MONTH) |
 1421|      4|        (1 << UCAL_DAY_OF_MONTH) | // = UCAL_DATE
 1422|      4|        (1 << UCAL_DAY_OF_YEAR) |
 1423|      4|        (1 << UCAL_EXTENDED_YEAR) |
 1424|      4|        (1 << UCAL_ORDINAL_MONTH);
 1425|       |
 1426|    100|    for (int32_t i=0; i<UCAL_FIELD_COUNT; ++i) {
  ------------------
  |  Branch (1426:23): [True: 96, False: 4]
  ------------------
 1427|     96|        if ((mask & 1) == 0) {
  ------------------
  |  Branch (1427:13): [True: 68, False: 28]
  ------------------
 1428|     68|            fStamp[i] = kInternallySet;
 1429|     68|        } else {
 1430|     28|            fStamp[i] = kUnset;
 1431|     28|        }
 1432|     96|        mask >>= 1;
 1433|     96|    }
 1434|       |
 1435|       |    // We used to check for and correct extreme millis values (near
 1436|       |    // Long.MIN_VALUE or Long.MAX_VALUE) here.  Such values would cause
 1437|       |    // overflows from positive to negative (or vice versa) and had to
 1438|       |    // be manually tweaked.  We no longer need to do this because we
 1439|       |    // have limited the range of supported dates to those that have a
 1440|       |    // Julian day that fits into an int.  This allows us to implement a
 1441|       |    // JULIAN_DAY field and also removes some inelegant code. - Liu
 1442|       |    // 11/6/00
 1443|       |
 1444|      4|    int32_t millisInDay;
 1445|      4|    double days = ClockMath::floorDivide(
 1446|      4|        localMillis, U_MILLIS_PER_DAY, &millisInDay) +
  ------------------
  |  |  227|      4|#define U_MILLIS_PER_DAY       (86400000)
  ------------------
 1447|      4|        kEpochStartAsJulianDay;
  ------------------
  |  |  127|      4|#define kEpochStartAsJulianDay  2440588 // January 1, 1970 (Gregorian)
  ------------------
 1448|      4|    if (days > INT32_MAX || days < INT32_MIN) {
  ------------------
  |  Branch (1448:9): [True: 0, False: 4]
  |  Branch (1448:29): [True: 0, False: 4]
  ------------------
 1449|      0|        ec = U_ILLEGAL_ARGUMENT_ERROR;
 1450|      0|        return;
 1451|      0|    }
 1452|       |
 1453|      4|    internalSet(UCAL_JULIAN_DAY, static_cast<int32_t>(days));
 1454|       |
 1455|       |#if defined (U_DEBUG_CAL)
 1456|       |    //fprintf(stderr, "%s:%d- Hmm! Jules @ %d, as per %.0lf millis\n",
 1457|       |    //__FILE__, __LINE__, fFields[UCAL_JULIAN_DAY], localMillis);
 1458|       |#endif
 1459|       |
 1460|      4|    computeGregorianFields(fFields[UCAL_JULIAN_DAY], ec);
 1461|       |
 1462|       |    // Call framework method to have subclass compute its fields.
 1463|       |    // These must include, at a minimum, MONTH, DAY_OF_MONTH,
 1464|       |    // EXTENDED_YEAR, YEAR, DAY_OF_YEAR.  This method will call internalSet(),
 1465|       |    // which will update stamp[].
 1466|      4|    handleComputeFields(fFields[UCAL_JULIAN_DAY], ec);
 1467|       |
 1468|       |    // Compute week-related fields, based on the subclass-computed
 1469|       |    // fields computed by handleComputeFields().
 1470|      4|    computeWeekFields(ec);
 1471|       |
 1472|       |    // Compute time-related fields.  These are independent of the date and
 1473|       |    // of the subclass algorithm.  They depend only on the local zone
 1474|       |    // wall milliseconds in day.
 1475|      4|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (1475:9): [True: 0, False: 4]
  ------------------
 1476|      0|        return;
 1477|      0|    }
 1478|       |
 1479|      4|    fFields[UCAL_MILLISECONDS_IN_DAY] = millisInDay;
 1480|      4|    U_ASSERT(getMinimum(UCAL_MILLISECONDS_IN_DAY) <=
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1481|      4|             fFields[UCAL_MILLISECONDS_IN_DAY]);
 1482|      4|    U_ASSERT(fFields[UCAL_MILLISECONDS_IN_DAY] <=
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1483|      4|             getMaximum(UCAL_MILLISECONDS_IN_DAY));
 1484|       |
 1485|      4|    fFields[UCAL_MILLISECOND] = millisInDay % 1000;
 1486|      4|    U_ASSERT(getMinimum(UCAL_MILLISECOND) <= fFields[UCAL_MILLISECOND]);
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1487|      4|    U_ASSERT(fFields[UCAL_MILLISECOND] <= getMaximum(UCAL_MILLISECOND));
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1488|       |
 1489|      4|    millisInDay /= 1000;
 1490|      4|    fFields[UCAL_SECOND] = millisInDay % 60;
 1491|      4|    U_ASSERT(getMinimum(UCAL_SECOND) <= fFields[UCAL_SECOND]);
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1492|      4|    U_ASSERT(fFields[UCAL_SECOND] <= getMaximum(UCAL_SECOND));
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1493|       |
 1494|      4|    millisInDay /= 60;
 1495|      4|    fFields[UCAL_MINUTE] = millisInDay % 60;
 1496|      4|    U_ASSERT(getMinimum(UCAL_MINUTE) <= fFields[UCAL_MINUTE]);
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1497|      4|    U_ASSERT(fFields[UCAL_MINUTE] <= getMaximum(UCAL_MINUTE));
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1498|       |
 1499|      4|    millisInDay /= 60;
 1500|      4|    fFields[UCAL_HOUR_OF_DAY] = millisInDay;
 1501|      4|    U_ASSERT(getMinimum(UCAL_HOUR_OF_DAY) <= fFields[UCAL_HOUR_OF_DAY]);
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1502|      4|    U_ASSERT(fFields[UCAL_HOUR_OF_DAY] <= getMaximum(UCAL_HOUR_OF_DAY));
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1503|       |
 1504|      4|    fFields[UCAL_AM_PM] = millisInDay / 12; // Assume AM == 0
 1505|      4|    U_ASSERT(getMinimum(UCAL_AM_PM) <= fFields[UCAL_AM_PM]);
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1506|      4|    U_ASSERT(fFields[UCAL_AM_PM] <= getMaximum(UCAL_AM_PM));
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1507|       |
 1508|      4|    fFields[UCAL_HOUR] = millisInDay % 12;
 1509|      4|    U_ASSERT(getMinimum(UCAL_HOUR) <= fFields[UCAL_HOUR]);
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1510|      4|    U_ASSERT(fFields[UCAL_HOUR] <= getMaximum(UCAL_HOUR));
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1511|       |
 1512|      4|    fFields[UCAL_ZONE_OFFSET] = rawOffset;
 1513|      4|    U_ASSERT(getMinimum(UCAL_ZONE_OFFSET) <= fFields[UCAL_ZONE_OFFSET]);
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1514|      4|    U_ASSERT(fFields[UCAL_ZONE_OFFSET] <= getMaximum(UCAL_ZONE_OFFSET));
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1515|       |
 1516|      4|    fFields[UCAL_DST_OFFSET] = dstOffset;
 1517|      4|    U_ASSERT(getMinimum(UCAL_DST_OFFSET) <= fFields[UCAL_DST_OFFSET]);
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1518|      4|    U_ASSERT(fFields[UCAL_DST_OFFSET] <= getMaximum(UCAL_DST_OFFSET));
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1519|      4|}
_ZN6icu_788Calendar22computeGregorianFieldsEiR10UErrorCode:
 1538|      4|void Calendar::computeGregorianFields(int32_t julianDay, UErrorCode& ec) {
 1539|      4|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (1539:9): [True: 0, False: 4]
  ------------------
 1540|      0|        return;
 1541|      0|    }
 1542|      4|    if (uprv_add32_overflow(
  ------------------
  |  | 1394|      4|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|      4|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      4|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      4|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1542:9): [True: 0, False: 4]
  ------------------
 1543|      4|            julianDay, -kEpochStartAsJulianDay, &julianDay)) {
  ------------------
  |  |  127|      4|#define kEpochStartAsJulianDay  2440588 // January 1, 1970 (Gregorian)
  ------------------
 1544|      0|        ec = U_ILLEGAL_ARGUMENT_ERROR;
 1545|      0|        return;
 1546|      0|    }
 1547|      4|    int8_t dayOfWeek;
 1548|      4|    Grego::dayToFields(julianDay, fGregorianYear, fGregorianMonth,
 1549|      4|                       fGregorianDayOfMonth,
 1550|      4|                       dayOfWeek,
 1551|      4|                       fGregorianDayOfYear, ec);
 1552|      4|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (1552:9): [True: 0, False: 4]
  ------------------
 1553|      0|        return;
 1554|      0|    }
 1555|      4|    internalSet(UCAL_DAY_OF_WEEK, dayOfWeek);
 1556|      4|}
_ZN6icu_788Calendar17computeWeekFieldsER10UErrorCode:
 1578|      4|void Calendar::computeWeekFields(UErrorCode &ec) {
 1579|      4|    if(U_FAILURE(ec)) {
  ------------------
  |  Branch (1579:8): [True: 0, False: 4]
  ------------------
 1580|      0|        return;
 1581|      0|    }
 1582|       |
 1583|       |    // Compute day of week: JD 0 = Monday
 1584|      4|    int32_t dayOfWeek = fFields[UCAL_DAY_OF_WEEK];
 1585|      4|    int32_t firstDayOfWeek = getFirstDayOfWeek();
 1586|       |    // Calculate 1-based localized day of week
 1587|      4|    int32_t dowLocal = dayOfWeek - firstDayOfWeek + 1;
 1588|      4|    if (dowLocal < 1) {
  ------------------
  |  Branch (1588:9): [True: 0, False: 4]
  ------------------
 1589|      0|        dowLocal += 7;
 1590|      0|    }
 1591|      4|    internalSet(UCAL_DOW_LOCAL,dowLocal);
 1592|       |
 1593|      4|    int32_t eyear = fFields[UCAL_EXTENDED_YEAR];
 1594|      4|    int32_t dayOfYear = fFields[UCAL_DAY_OF_YEAR];
 1595|       |
 1596|       |    // WEEK_OF_YEAR start
 1597|       |    // Compute the week of the year.  For the Gregorian calendar, valid week
 1598|       |    // numbers run from 1 to 52 or 53, depending on the year, the first day
 1599|       |    // of the week, and the minimal days in the first week.  For other
 1600|       |    // calendars, the valid range may be different -- it depends on the year
 1601|       |    // length.  Days at the start of the year may fall into the last week of
 1602|       |    // the previous year; days at the end of the year may fall into the
 1603|       |    // first week of the next year.  ASSUME that the year length is less than
 1604|       |    // 7000 days.
 1605|      4|    int32_t yearOfWeekOfYear = eyear;
 1606|      4|    int32_t relDow = (dayOfWeek + 7 - firstDayOfWeek) % 7; // 0..6
 1607|      4|    int32_t relDowJan1 = (dayOfWeek - dayOfYear + 7001 - firstDayOfWeek) % 7; // 0..6
 1608|      4|    int32_t woy = (dayOfYear - 1 + relDowJan1) / 7; // 0..53
 1609|      4|    int32_t minimalDaysInFirstWeek = getMinimalDaysInFirstWeek();
 1610|      4|    if ((7 - relDowJan1) >= minimalDaysInFirstWeek) {
  ------------------
  |  Branch (1610:9): [True: 4, False: 0]
  ------------------
 1611|      4|        ++woy;
 1612|      4|    }
 1613|       |
 1614|       |    // Adjust for weeks at the year end that overlap into the previous or
 1615|       |    // next calendar year.
 1616|      4|    if (woy == 0) {
  ------------------
  |  Branch (1616:9): [True: 0, False: 4]
  ------------------
 1617|       |        // We are the last week of the previous year.
 1618|       |        // Check to see if we are in the last week; if so, we need
 1619|       |        // to handle the case in which we are the first week of the
 1620|       |        // next year.
 1621|       |
 1622|      0|        int32_t prevDoy = dayOfYear + handleGetYearLength(eyear - 1, ec);
 1623|      0|        if(U_FAILURE(ec)) return;
  ------------------
  |  Branch (1623:12): [True: 0, False: 0]
  ------------------
 1624|      0|        woy = weekNumber(prevDoy, dayOfWeek);
 1625|      0|        yearOfWeekOfYear--;
 1626|      4|    } else {
 1627|      4|        int32_t lastDoy = handleGetYearLength(eyear, ec);
 1628|      4|        if(U_FAILURE(ec)) return;
  ------------------
  |  Branch (1628:12): [True: 0, False: 4]
  ------------------
 1629|       |        // Fast check: For it to be week 1 of the next year, the DOY
 1630|       |        // must be on or after L-5, where L is yearLength(), then it
 1631|       |        // cannot possibly be week 1 of the next year:
 1632|       |        //          L-5                  L
 1633|       |        // doy: 359 360 361 362 363 364 365 001
 1634|       |        // dow:      1   2   3   4   5   6   7
 1635|      4|        if (dayOfYear >= (lastDoy - 5)) {
  ------------------
  |  Branch (1635:13): [True: 0, False: 4]
  ------------------
 1636|      0|            int32_t lastRelDow = (relDow + lastDoy - dayOfYear) % 7;
 1637|      0|            if (lastRelDow < 0) {
  ------------------
  |  Branch (1637:17): [True: 0, False: 0]
  ------------------
 1638|      0|                lastRelDow += 7;
 1639|      0|            }
 1640|      0|            if (((6 - lastRelDow) >= minimalDaysInFirstWeek) &&
  ------------------
  |  Branch (1640:17): [True: 0, False: 0]
  ------------------
 1641|      0|                ((dayOfYear + 7 - relDow) > lastDoy)) {
  ------------------
  |  Branch (1641:17): [True: 0, False: 0]
  ------------------
 1642|      0|                    woy = 1;
 1643|      0|                    yearOfWeekOfYear++;
 1644|      0|                }
 1645|      0|        }
 1646|      4|    }
 1647|      4|    fFields[UCAL_WEEK_OF_YEAR] = woy;
 1648|      4|    fFields[UCAL_YEAR_WOY] = yearOfWeekOfYear;
 1649|       |    // min/max of years are not constrains for caller, so not assert here.
 1650|       |    // WEEK_OF_YEAR end
 1651|       |
 1652|      4|    int32_t dayOfMonth = fFields[UCAL_DAY_OF_MONTH];
 1653|      4|    fFields[UCAL_WEEK_OF_MONTH] = weekNumber(dayOfMonth, dayOfWeek);
 1654|      4|    U_ASSERT(getMinimum(UCAL_WEEK_OF_MONTH) <= fFields[UCAL_WEEK_OF_MONTH]);
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1655|      4|    U_ASSERT(fFields[UCAL_WEEK_OF_MONTH] <= getMaximum(UCAL_WEEK_OF_MONTH));
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1656|       |
 1657|      4|    fFields[UCAL_DAY_OF_WEEK_IN_MONTH] = (dayOfMonth-1) / 7 + 1;
 1658|      4|    U_ASSERT(getMinimum(UCAL_DAY_OF_WEEK_IN_MONTH) <=
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1659|      4|             fFields[UCAL_DAY_OF_WEEK_IN_MONTH]);
 1660|      4|    U_ASSERT(fFields[UCAL_DAY_OF_WEEK_IN_MONTH] <=
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1661|      4|             getMaximum(UCAL_DAY_OF_WEEK_IN_MONTH));
 1662|       |
 1663|       |#if defined (U_DEBUG_CAL)
 1664|       |    if(fFields[UCAL_DAY_OF_WEEK_IN_MONTH]==0) fprintf(stderr, "%s:%d: DOWIM %d on %g\n",
 1665|       |        __FILE__, __LINE__,fFields[UCAL_DAY_OF_WEEK_IN_MONTH], fTime);
 1666|       |#endif
 1667|      4|}
_ZN6icu_788Calendar10weekNumberEiii:
 1671|      4|{
 1672|       |    // Determine the day of the week of the first day of the period
 1673|       |    // in question (either a year or a month).  Zero represents the
 1674|       |    // first day of the week on this calendar.
 1675|      4|    int32_t periodStartDayOfWeek = (dayOfWeek - getFirstDayOfWeek() - dayOfPeriod + 1) % 7;
 1676|      4|    if (periodStartDayOfWeek < 0) periodStartDayOfWeek += 7;
  ------------------
  |  Branch (1676:9): [True: 1, False: 3]
  ------------------
 1677|       |
 1678|       |    // Compute the week number.  Initially, ignore the first week, which
 1679|       |    // may be fractional (or may not be).  We add periodStartDayOfWeek in
 1680|       |    // order to fill out the first week, if it is fractional.
 1681|      4|    int32_t weekNo = (desiredDay + periodStartDayOfWeek - 1)/7;
 1682|       |
 1683|       |    // If the first week is long enough, then count it.  If
 1684|       |    // the minimal days in the first week is one, or if the period start
 1685|       |    // is zero, we always increment weekNo.
 1686|      4|    if ((7 - periodStartDayOfWeek) >= getMinimalDaysInFirstWeek()) ++weekNo;
  ------------------
  |  Branch (1686:9): [True: 4, False: 0]
  ------------------
 1687|       |
 1688|      4|    return weekNo;
 1689|      4|}
_ZN6icu_788Calendar3addE19UCalendarDateFieldsiR10UErrorCode:
 2096|      1|{
 2097|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (2097:9): [True: 0, False: 1]
  ------------------
 2098|      0|       return;
 2099|      0|    }
 2100|      1|    if (field < 0 || field >= UCAL_FIELD_COUNT) {
  ------------------
  |  Branch (2100:9): [True: 0, False: 1]
  |  Branch (2100:22): [True: 0, False: 1]
  ------------------
 2101|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 2102|      0|        return;
 2103|      0|    }
 2104|      1|    if (amount == 0) {
  ------------------
  |  Branch (2104:9): [True: 0, False: 1]
  ------------------
 2105|      0|        return;   // Do nothing!
 2106|      0|    }
 2107|       |
 2108|       |    // We handle most fields in the same way.  The algorithm is to add
 2109|       |    // a computed amount of millis to the current millis.  The only
 2110|       |    // wrinkle is with DST (and/or a change to the zone's UTC offset, which
 2111|       |    // we'll include with DST) -- for some fields, like the DAY_OF_MONTH,
 2112|       |    // we don't want the wall time to shift due to changes in DST.  If the
 2113|       |    // result of the add operation is to move from DST to Standard, or
 2114|       |    // vice versa, we need to adjust by an hour forward or back,
 2115|       |    // respectively.  For such fields we set keepWallTimeInvariant to true.
 2116|       |
 2117|       |    // We only adjust the DST for fields larger than an hour.  For
 2118|       |    // fields smaller than an hour, we cannot adjust for DST without
 2119|       |    // causing problems.  for instance, if you add one hour to April 5,
 2120|       |    // 1998, 1:00 AM, in PST, the time becomes "2:00 AM PDT" (an
 2121|       |    // illegal value), but then the adjustment sees the change and
 2122|       |    // compensates by subtracting an hour.  As a result the time
 2123|       |    // doesn't advance at all.
 2124|       |
 2125|       |    // For some fields larger than a day, such as a UCAL_MONTH, we pin the
 2126|       |    // UCAL_DAY_OF_MONTH.  This allows <March 31>.add(UCAL_MONTH, 1) to be
 2127|       |    // <April 30>, rather than <April 31> => <May 1>.
 2128|       |
 2129|      1|    double delta = amount; // delta in ms
 2130|      1|    UBool keepWallTimeInvariant = true;
 2131|       |
 2132|      1|    switch (field) {
 2133|      0|    case UCAL_ERA:
  ------------------
  |  Branch (2133:5): [True: 0, False: 1]
  ------------------
 2134|      0|      {
 2135|      0|        int32_t era = get(UCAL_ERA, status);
 2136|      0|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (2136:13): [True: 0, False: 0]
  ------------------
 2137|      0|            return;
 2138|      0|        }
 2139|      0|        if (uprv_add32_overflow(era, amount, &era)) {
  ------------------
  |  | 1394|      0|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (2139:13): [True: 0, False: 0]
  ------------------
 2140|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
 2141|      0|            return;
 2142|      0|        }
 2143|      0|        set(UCAL_ERA, era);
 2144|      0|        pinField(UCAL_ERA, status);
 2145|      0|        return;
 2146|      0|      }
 2147|       |
 2148|      1|    case UCAL_YEAR:
  ------------------
  |  Branch (2148:5): [True: 1, False: 0]
  ------------------
 2149|      1|    case UCAL_YEAR_WOY:
  ------------------
  |  Branch (2149:5): [True: 0, False: 1]
  ------------------
 2150|      1|      {
 2151|       |        // * If era=0 and years go backwards in time, change sign of amount.
 2152|       |        // * Until we have new API per #9393, we temporarily hardcode knowledge of
 2153|       |        //   which calendars have era 0 years that go backwards.
 2154|       |        // * Note that for UCAL_YEAR (but not UCAL_YEAR_WOY) we could instead handle
 2155|       |        //   this by applying the amount to the UCAL_EXTENDED_YEAR field; but since
 2156|       |        //   we would still need to handle UCAL_YEAR_WOY as below, might as well
 2157|       |        //   also handle UCAL_YEAR the same way.
 2158|      1|        if (get(UCAL_ERA, status) == 0 && isEra0CountingBackward()) {
  ------------------
  |  Branch (2158:13): [True: 0, False: 1]
  |  Branch (2158:43): [True: 0, False: 0]
  ------------------
 2159|      0|          if (uprv_mul32_overflow(amount, -1, &amount)) {
  ------------------
  |  | 1531|      0|#define uprv_mul32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_mul32_overflow)
  |  |  ------------------
  |  |  |  |  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 (2159:15): [True: 0, False: 0]
  ------------------
 2160|      0|              status = U_ILLEGAL_ARGUMENT_ERROR;
 2161|      0|              return;
 2162|      0|          }
 2163|      0|        }
 2164|      1|      }
 2165|       |      // Fall through into normal handling
 2166|      1|      U_FALLTHROUGH;
  ------------------
  |  |  511|      1|#       define U_FALLTHROUGH [[clang::fallthrough]]
  ------------------
 2167|      1|    case UCAL_EXTENDED_YEAR:
  ------------------
  |  Branch (2167:5): [True: 0, False: 1]
  ------------------
 2168|      1|    case UCAL_MONTH:
  ------------------
  |  Branch (2168:5): [True: 0, False: 1]
  ------------------
 2169|      1|    case UCAL_ORDINAL_MONTH:
  ------------------
  |  Branch (2169:5): [True: 0, False: 1]
  ------------------
 2170|      1|      {
 2171|      1|        UBool oldLenient = isLenient();
 2172|      1|        setLenient(true);
 2173|      1|        int32_t value = get(field, status);
 2174|      1|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (2174:13): [True: 0, False: 1]
  ------------------
 2175|      0|            return;
 2176|      0|        }
 2177|      1|        if (uprv_add32_overflow(value, amount, &value)) {
  ------------------
  |  | 1394|      1|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (2177:13): [True: 0, False: 1]
  ------------------
 2178|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
 2179|      0|            return;
 2180|      0|        }
 2181|      1|        set(field, value);
 2182|       |
 2183|      1|        pinField(UCAL_DAY_OF_MONTH, status);
 2184|      1|        if(oldLenient==false) {
  ------------------
  |  Branch (2184:12): [True: 0, False: 1]
  ------------------
 2185|      0|          complete(status); /* force recalculate */
 2186|      0|          setLenient(oldLenient);
 2187|      0|        }
 2188|      1|      }
 2189|      0|      return;
 2190|       |
 2191|      0|    case UCAL_WEEK_OF_YEAR:
  ------------------
  |  Branch (2191:5): [True: 0, False: 1]
  ------------------
 2192|      0|    case UCAL_WEEK_OF_MONTH:
  ------------------
  |  Branch (2192:5): [True: 0, False: 1]
  ------------------
 2193|      0|    case UCAL_DAY_OF_WEEK_IN_MONTH:
  ------------------
  |  Branch (2193:5): [True: 0, False: 1]
  ------------------
 2194|      0|        delta *= kOneWeek;
  ------------------
  |  |  122|      0|#define kOneWeek   (7.0 * kOneDay) // 604,800,000
  |  |  ------------------
  |  |  |  |  117|      0|#define kOneDay    (1.0 * U_MILLIS_PER_DAY)       //  86,400,000
  |  |  |  |  ------------------
  |  |  |  |  |  |  227|      0|#define U_MILLIS_PER_DAY       (86400000)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2195|      0|        break;
 2196|       |
 2197|      0|    case UCAL_AM_PM:
  ------------------
  |  Branch (2197:5): [True: 0, False: 1]
  ------------------
 2198|      0|        delta *= 12 * kOneHour;
  ------------------
  |  |  118|      0|#define kOneHour   (60*60*1000)
  ------------------
 2199|      0|        break;
 2200|       |
 2201|      0|    case UCAL_DAY_OF_MONTH:
  ------------------
  |  Branch (2201:5): [True: 0, False: 1]
  ------------------
 2202|      0|    case UCAL_DAY_OF_YEAR:
  ------------------
  |  Branch (2202:5): [True: 0, False: 1]
  ------------------
 2203|      0|    case UCAL_DAY_OF_WEEK:
  ------------------
  |  Branch (2203:5): [True: 0, False: 1]
  ------------------
 2204|      0|    case UCAL_DOW_LOCAL:
  ------------------
  |  Branch (2204:5): [True: 0, False: 1]
  ------------------
 2205|      0|    case UCAL_JULIAN_DAY:
  ------------------
  |  Branch (2205:5): [True: 0, False: 1]
  ------------------
 2206|      0|        delta *= kOneDay;
  ------------------
  |  |  117|      0|#define kOneDay    (1.0 * U_MILLIS_PER_DAY)       //  86,400,000
  |  |  ------------------
  |  |  |  |  227|      0|#define U_MILLIS_PER_DAY       (86400000)
  |  |  ------------------
  ------------------
 2207|      0|        break;
 2208|       |
 2209|      0|    case UCAL_HOUR_OF_DAY:
  ------------------
  |  Branch (2209:5): [True: 0, False: 1]
  ------------------
 2210|      0|    case UCAL_HOUR:
  ------------------
  |  Branch (2210:5): [True: 0, False: 1]
  ------------------
 2211|      0|        delta *= kOneHour;
  ------------------
  |  |  118|      0|#define kOneHour   (60*60*1000)
  ------------------
 2212|      0|        keepWallTimeInvariant = false;
 2213|      0|        break;
 2214|       |
 2215|      0|    case UCAL_MINUTE:
  ------------------
  |  Branch (2215:5): [True: 0, False: 1]
  ------------------
 2216|      0|        delta *= kOneMinute;
  ------------------
  |  |  119|      0|#define kOneMinute 60000
  ------------------
 2217|      0|        keepWallTimeInvariant = false;
 2218|      0|        break;
 2219|       |
 2220|      0|    case UCAL_SECOND:
  ------------------
  |  Branch (2220:5): [True: 0, False: 1]
  ------------------
 2221|      0|        delta *= kOneSecond;
  ------------------
  |  |  120|      0|#define kOneSecond 1000
  ------------------
 2222|      0|        keepWallTimeInvariant = false;
 2223|      0|        break;
 2224|       |
 2225|      0|    case UCAL_MILLISECOND:
  ------------------
  |  Branch (2225:5): [True: 0, False: 1]
  ------------------
 2226|      0|    case UCAL_MILLISECONDS_IN_DAY:
  ------------------
  |  Branch (2226:5): [True: 0, False: 1]
  ------------------
 2227|      0|        keepWallTimeInvariant = false;
 2228|      0|        break;
 2229|       |
 2230|      0|    default:
  ------------------
  |  Branch (2230:5): [True: 0, False: 1]
  ------------------
 2231|       |#if defined (U_DEBUG_CAL)
 2232|       |        fprintf(stderr, "%s:%d: ILLEGAL ARG because field %s not addable",
 2233|       |            __FILE__, __LINE__, fldName(field));
 2234|       |#endif
 2235|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 2236|      0|        return;
 2237|       |        //  throw new IllegalArgumentException("Calendar.add(" + fieldName(field) +
 2238|       |        //                                     ") not supported");
 2239|      1|    }
 2240|       |
 2241|       |    // In order to keep the wall time invariant (for fields where this is
 2242|       |    // appropriate), check the combined DST & ZONE offset before and
 2243|       |    // after the add() operation. If it changes, then adjust the millis
 2244|       |    // to compensate.
 2245|      0|    int32_t prevOffset = 0;
 2246|      0|    int32_t prevWallTime = 0;
 2247|      0|    if (keepWallTimeInvariant) {
  ------------------
  |  Branch (2247:9): [True: 0, False: 0]
  ------------------
 2248|      0|        prevOffset = get(UCAL_DST_OFFSET, status) + get(UCAL_ZONE_OFFSET, status);
 2249|      0|        prevWallTime = get(UCAL_MILLISECONDS_IN_DAY, status);
 2250|      0|    }
 2251|       |
 2252|      0|    setTimeInMillis(getTimeInMillis(status) + delta, status);
 2253|       |
 2254|      0|    if (keepWallTimeInvariant) {
  ------------------
  |  Branch (2254:9): [True: 0, False: 0]
  ------------------
 2255|      0|        int32_t newWallTime = get(UCAL_MILLISECONDS_IN_DAY, status);
 2256|      0|        if (newWallTime != prevWallTime) {
  ------------------
  |  Branch (2256:13): [True: 0, False: 0]
  ------------------
 2257|       |            // There is at least one zone transition between the base
 2258|       |            // time and the result time. As the result, wall time has
 2259|       |            // changed.
 2260|      0|            UDate t = internalGetTime();
 2261|      0|            int32_t newOffset = get(UCAL_DST_OFFSET, status) + get(UCAL_ZONE_OFFSET, status);
 2262|      0|            if (newOffset != prevOffset) {
  ------------------
  |  Branch (2262:17): [True: 0, False: 0]
  ------------------
 2263|       |                // When the difference of the previous UTC offset and
 2264|       |                // the new UTC offset exceeds 1 full day, we do not want
 2265|       |                // to roll over/back the date. For now, this only happens
 2266|       |                // in Samoa (Pacific/Apia) on Dec 30, 2011. See ticket:9452.
 2267|      0|                int32_t adjAmount = prevOffset - newOffset;
 2268|      0|                adjAmount = adjAmount >= 0 ? adjAmount % static_cast<int32_t>(kOneDay) : -(-adjAmount % static_cast<int32_t>(kOneDay));
  ------------------
  |  |  117|      0|#define kOneDay    (1.0 * U_MILLIS_PER_DAY)       //  86,400,000
  |  |  ------------------
  |  |  |  |  227|      0|#define U_MILLIS_PER_DAY       (86400000)
  |  |  ------------------
  ------------------
                              adjAmount = adjAmount >= 0 ? adjAmount % static_cast<int32_t>(kOneDay) : -(-adjAmount % static_cast<int32_t>(kOneDay));
  ------------------
  |  |  117|      0|#define kOneDay    (1.0 * U_MILLIS_PER_DAY)       //  86,400,000
  |  |  ------------------
  |  |  |  |  227|      0|#define U_MILLIS_PER_DAY       (86400000)
  |  |  ------------------
  ------------------
  |  Branch (2268:29): [True: 0, False: 0]
  ------------------
 2269|      0|                if (adjAmount != 0) {
  ------------------
  |  Branch (2269:21): [True: 0, False: 0]
  ------------------
 2270|      0|                    setTimeInMillis(t + adjAmount, status);
 2271|      0|                    newWallTime = get(UCAL_MILLISECONDS_IN_DAY, status);
 2272|      0|                }
 2273|      0|                if (newWallTime != prevWallTime) {
  ------------------
  |  Branch (2273:21): [True: 0, False: 0]
  ------------------
 2274|       |                    // The result wall time or adjusted wall time was shifted because
 2275|       |                    // the target wall time does not exist on the result date.
 2276|      0|                    switch (fSkippedWallTime) {
  ------------------
  |  Branch (2276:29): [True: 0, False: 0]
  ------------------
 2277|      0|                    case UCAL_WALLTIME_FIRST:
  ------------------
  |  Branch (2277:21): [True: 0, False: 0]
  ------------------
 2278|      0|                        if (adjAmount > 0) {
  ------------------
  |  Branch (2278:29): [True: 0, False: 0]
  ------------------
 2279|      0|                            setTimeInMillis(t, status);
 2280|      0|                        }
 2281|      0|                        break;
 2282|      0|                    case UCAL_WALLTIME_LAST:
  ------------------
  |  Branch (2282:21): [True: 0, False: 0]
  ------------------
 2283|      0|                        if (adjAmount < 0) {
  ------------------
  |  Branch (2283:29): [True: 0, False: 0]
  ------------------
 2284|      0|                            setTimeInMillis(t, status);
 2285|      0|                        }
 2286|      0|                        break;
 2287|      0|                    case UCAL_WALLTIME_NEXT_VALID:
  ------------------
  |  Branch (2287:21): [True: 0, False: 0]
  ------------------
 2288|      0|                        UDate tmpT = adjAmount > 0 ? internalGetTime() : t;
  ------------------
  |  Branch (2288:38): [True: 0, False: 0]
  ------------------
 2289|      0|                        UDate immediatePrevTrans;
 2290|      0|                        UBool hasTransition = getImmediatePreviousZoneTransition(tmpT, &immediatePrevTrans, status);
 2291|      0|                        if (U_SUCCESS(status) && hasTransition) {
  ------------------
  |  Branch (2291:29): [True: 0, False: 0]
  |  Branch (2291:50): [True: 0, False: 0]
  ------------------
 2292|      0|                            setTimeInMillis(immediatePrevTrans, status);
 2293|      0|                        }
 2294|      0|                        break;
 2295|      0|                    }
 2296|      0|                }
 2297|      0|            }
 2298|      0|        }
 2299|      0|    }
 2300|      0|}
_ZN6icu_788Calendar13adoptTimeZoneEPNS_8TimeZoneE:
 2419|  56.1k|{
 2420|       |    // Do nothing if passed-in zone is nullptr
 2421|  56.1k|    if (zone == nullptr) {
  ------------------
  |  Branch (2421:9): [True: 0, False: 56.1k]
  ------------------
 2422|      0|        return;
 2423|      0|    }
 2424|       |
 2425|       |    // fZone should always be non-null
 2426|  56.1k|    delete fZone;
 2427|  56.1k|    fZone = zone;
 2428|       |
 2429|       |    // if the zone changes, we need to recompute the time fields
 2430|  56.1k|    fAreFieldsSet = false;
 2431|  56.1k|}
_ZNK6icu_788Calendar11getTimeZoneEv:
 2444|      4|{
 2445|      4|    U_ASSERT(fZone != nullptr);
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 2446|      4|    return *fZone;
 2447|      4|}
_ZN6icu_788Calendar10setLenientEa:
 2469|      2|{
 2470|      2|    fLenient = lenient;
 2471|      2|}
_ZNK6icu_788Calendar9isLenientEv:
 2477|      7|{
 2478|      7|    return fLenient;
 2479|      7|}
_ZNK6icu_788Calendar17getFirstDayOfWeekEv:
 2530|      8|{
 2531|      8|    return static_cast<Calendar::EDaysOfWeek>(fFirstDayOfWeek);
 2532|      8|}
_ZNK6icu_788Calendar25getMinimalDaysInFirstWeekEv:
 2562|      8|{
 2563|      8|    return fMinimalDaysInFirstWeek;
 2564|      8|}
_ZNK6icu_788Calendar10getMinimumE19UCalendarDateFields:
 2680|      1|{
 2681|      1|    return getLimit(field,UCAL_LIMIT_MINIMUM);
 2682|      1|}
_ZNK6icu_788Calendar18getGreatestMinimumE19UCalendarDateFields:
 2706|      1|{
 2707|      1|    return getLimit(field,UCAL_LIMIT_GREATEST_MINIMUM);
 2708|      1|}
_ZNK6icu_788Calendar8getLimitE19UCalendarDateFieldsNS0_10ELimitTypeE:
 2730|      2|int32_t Calendar::getLimit(UCalendarDateFields field, ELimitType limitType) const {
 2731|      2|    switch (field) {
 2732|      0|    case UCAL_DAY_OF_WEEK:
  ------------------
  |  Branch (2732:5): [True: 0, False: 2]
  ------------------
 2733|      0|    case UCAL_AM_PM:
  ------------------
  |  Branch (2733:5): [True: 0, False: 2]
  ------------------
 2734|      0|    case UCAL_HOUR:
  ------------------
  |  Branch (2734:5): [True: 0, False: 2]
  ------------------
 2735|      0|    case UCAL_HOUR_OF_DAY:
  ------------------
  |  Branch (2735:5): [True: 0, False: 2]
  ------------------
 2736|      0|    case UCAL_MINUTE:
  ------------------
  |  Branch (2736:5): [True: 0, False: 2]
  ------------------
 2737|      0|    case UCAL_SECOND:
  ------------------
  |  Branch (2737:5): [True: 0, False: 2]
  ------------------
 2738|      0|    case UCAL_MILLISECOND:
  ------------------
  |  Branch (2738:5): [True: 0, False: 2]
  ------------------
 2739|      0|    case UCAL_ZONE_OFFSET:
  ------------------
  |  Branch (2739:5): [True: 0, False: 2]
  ------------------
 2740|      0|    case UCAL_DST_OFFSET:
  ------------------
  |  Branch (2740:5): [True: 0, False: 2]
  ------------------
 2741|      0|    case UCAL_DOW_LOCAL:
  ------------------
  |  Branch (2741:5): [True: 0, False: 2]
  ------------------
 2742|      0|    case UCAL_JULIAN_DAY:
  ------------------
  |  Branch (2742:5): [True: 0, False: 2]
  ------------------
 2743|      0|    case UCAL_MILLISECONDS_IN_DAY:
  ------------------
  |  Branch (2743:5): [True: 0, False: 2]
  ------------------
 2744|      0|    case UCAL_IS_LEAP_MONTH:
  ------------------
  |  Branch (2744:5): [True: 0, False: 2]
  ------------------
 2745|      0|        return kCalendarLimits[field][limitType];
 2746|       |
 2747|      0|    case UCAL_WEEK_OF_MONTH:
  ------------------
  |  Branch (2747:5): [True: 0, False: 2]
  ------------------
 2748|      0|        {
 2749|      0|            int32_t limit;
 2750|      0|            if (limitType == UCAL_LIMIT_MINIMUM) {
  ------------------
  |  Branch (2750:17): [True: 0, False: 0]
  ------------------
 2751|      0|                limit = getMinimalDaysInFirstWeek() == 1 ? 1 : 0;
  ------------------
  |  Branch (2751:25): [True: 0, False: 0]
  ------------------
 2752|      0|            } else if (limitType == UCAL_LIMIT_GREATEST_MINIMUM) {
  ------------------
  |  Branch (2752:24): [True: 0, False: 0]
  ------------------
 2753|      0|                limit = 1;
 2754|      0|            } else {
 2755|      0|                int32_t minDaysInFirst = getMinimalDaysInFirstWeek();
 2756|      0|                int32_t daysInMonth = handleGetLimit(UCAL_DAY_OF_MONTH, limitType);
 2757|      0|                if (limitType == UCAL_LIMIT_LEAST_MAXIMUM) {
  ------------------
  |  Branch (2757:21): [True: 0, False: 0]
  ------------------
 2758|      0|                    limit = (daysInMonth + (7 - minDaysInFirst)) / 7;
 2759|      0|                } else { // limitType == UCAL_LIMIT_MAXIMUM
 2760|      0|                    limit = (daysInMonth + 6 + (7 - minDaysInFirst)) / 7;
 2761|      0|                }
 2762|      0|            }
 2763|      0|            return limit;
 2764|      0|        }
 2765|      2|    default:
  ------------------
  |  Branch (2765:5): [True: 2, False: 0]
  ------------------
 2766|      2|        return handleGetLimit(field, limitType);
 2767|      2|    }
 2768|      2|}
_ZNK6icu_788Calendar23getFieldResolutionTableEv:
 2979|      2|const UFieldResolutionTable* Calendar::getFieldResolutionTable() const {
 2980|      2|    return kDatePrecedence;
 2981|      2|}
_ZNK6icu_788Calendar10newerFieldE19UCalendarDateFieldsS1_:
 2985|      4|{
 2986|      4|    if (fStamp[alternateField] > fStamp[defaultField]) {
  ------------------
  |  Branch (2986:9): [True: 2, False: 2]
  ------------------
 2987|      2|        return alternateField;
 2988|      2|    }
 2989|      2|    return defaultField;
 2990|      4|}
_ZNK6icu_788Calendar13resolveFieldsEPA12_A8_Ki:
 2992|      4|UCalendarDateFields Calendar::resolveFields(const UFieldResolutionTable* precedenceTable) const {
 2993|      4|    int32_t bestField = UCAL_FIELD_COUNT;
 2994|      4|    int32_t tempBestField;
 2995|      8|    for (int32_t g=0; precedenceTable[g][0][0] != -1 && (bestField == UCAL_FIELD_COUNT); ++g) {
  ------------------
  |  Branch (2995:23): [True: 6, False: 2]
  |  Branch (2995:57): [True: 4, False: 2]
  ------------------
 2996|      4|        int32_t bestStamp = kUnset;
 2997|     28|        for (int32_t l=0; precedenceTable[g][l][0] != -1; ++l) {
  ------------------
  |  Branch (2997:27): [True: 24, False: 4]
  ------------------
 2998|     24|            int32_t lineStamp = kUnset;
 2999|       |            // Skip over first entry if it is negative
 3000|     60|            for (int32_t i=((precedenceTable[g][l][0]>=kResolveRemap)?1:0); precedenceTable[g][l][i]!=-1; ++i) {
  ------------------
  |  Branch (3000:29): [True: 4, False: 20]
  |  Branch (3000:77): [True: 36, False: 24]
  ------------------
 3001|     36|                U_ASSERT(precedenceTable[g][l][i] < UCAL_FIELD_COUNT);
  ------------------
  |  |   35|     36|#   define U_ASSERT(exp) (void)0
  ------------------
 3002|     36|                int32_t s = fStamp[precedenceTable[g][l][i]];
 3003|       |                // If any field is unset then don't use this line
 3004|     36|                if (s == kUnset) {
  ------------------
  |  Branch (3004:21): [True: 0, False: 36]
  ------------------
 3005|      0|                    goto linesInGroup;
 3006|     36|                } else if(s > lineStamp) {
  ------------------
  |  Branch (3006:27): [True: 24, False: 12]
  ------------------
 3007|     24|                    lineStamp = s;
 3008|     24|                }
 3009|     36|            }
 3010|       |            // Record new maximum stamp & field no.
 3011|     24|            if (lineStamp > bestStamp) {
  ------------------
  |  Branch (3011:17): [True: 5, False: 19]
  ------------------
 3012|      5|                tempBestField = precedenceTable[g][l][0]; // First field refers to entire line
 3013|      5|                if (tempBestField >= kResolveRemap) {
  ------------------
  |  Branch (3013:21): [True: 1, False: 4]
  ------------------
 3014|      1|                    tempBestField &= (kResolveRemap-1);
 3015|       |                    // This check is needed to resolve some issues with UCAL_YEAR precedence mapping
 3016|      1|                    if (tempBestField != UCAL_DATE || (fStamp[UCAL_WEEK_OF_MONTH] < fStamp[tempBestField])) {
  ------------------
  |  Branch (3016:25): [True: 0, False: 1]
  |  Branch (3016:55): [True: 0, False: 1]
  ------------------
 3017|      0|                        bestField = tempBestField;
 3018|      0|                    }
 3019|      4|                } else {
 3020|      4|                    bestField = tempBestField;
 3021|      4|                }
 3022|       |
 3023|      5|                if (bestField == tempBestField) {
  ------------------
  |  Branch (3023:21): [True: 5, False: 0]
  ------------------
 3024|      5|                    bestStamp = lineStamp;
 3025|      5|                }
 3026|      5|            }
 3027|     24|linesInGroup:
 3028|     24|            ;
 3029|     24|        }
 3030|      4|    }
 3031|      4|    return static_cast<UCalendarDateFields>(bestField);
 3032|      4|}
_ZN6icu_788Calendar11computeTimeER10UErrorCode:
 3097|      2|void Calendar::computeTime(UErrorCode& status) {
 3098|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (3098:9): [True: 0, False: 2]
  ------------------
 3099|      0|       return;
 3100|      0|    }
 3101|      2|    if (!isLenient()) {
  ------------------
  |  Branch (3101:9): [True: 0, False: 2]
  ------------------
 3102|      0|        validateFields(status);
 3103|      0|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (3103:13): [True: 0, False: 0]
  ------------------
 3104|      0|            return;
 3105|      0|        }
 3106|      0|    }
 3107|       |
 3108|       |    // Compute the Julian day
 3109|      2|    int32_t julianDay = computeJulianDay(status);
 3110|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (3110:9): [True: 0, False: 2]
  ------------------
 3111|      0|        return;
 3112|      0|    }
 3113|       |
 3114|      2|    double millis = Grego::julianDayToMillis(julianDay);
 3115|       |
 3116|       |#if defined (U_DEBUG_CAL)
 3117|       |    //  int32_t julianInsanityCheck =  (int32_t)ClockMath::floorDivide(millis, kOneDay);
 3118|       |    //  julianInsanityCheck += kEpochStartAsJulianDay;
 3119|       |    //  if(1 || julianInsanityCheck != julianDay) {
 3120|       |    //    fprintf(stderr, "%s:%d- D'oh- computed jules %d, to mills (%s)%.lf, recomputed %d\n",
 3121|       |    //            __FILE__, __LINE__, julianDay, millis<0.0?"NEG":"", millis, julianInsanityCheck);
 3122|       |    //  }
 3123|       |#endif
 3124|       |
 3125|      2|    double millisInDay;
 3126|       |
 3127|       |    // We only use MILLISECONDS_IN_DAY if it has been set by the user.
 3128|       |    // This makes it possible for the caller to set the calendar to a
 3129|       |    // time and call clear(MONTH) to reset the MONTH to January.  This
 3130|       |    // is legacy behavior.  Without this, clear(MONTH) has no effect,
 3131|       |    // since the internally set JULIAN_DAY is used.
 3132|      2|    if (fStamp[UCAL_MILLISECONDS_IN_DAY] >= static_cast<int32_t>(kMinimumUserStamp) &&
  ------------------
  |  Branch (3132:9): [True: 1, False: 1]
  ------------------
 3133|      2|            newestStamp(UCAL_AM_PM, UCAL_MILLISECOND, kUnset) <= fStamp[UCAL_MILLISECONDS_IN_DAY]) {
  ------------------
  |  Branch (3133:13): [True: 1, False: 0]
  ------------------
 3134|      1|        millisInDay = internalGet(UCAL_MILLISECONDS_IN_DAY);
 3135|      1|    } else {
 3136|      1|        millisInDay = computeMillisInDay();
 3137|      1|    }
 3138|       |
 3139|      2|    UDate t = 0;
 3140|      2|    if (fStamp[UCAL_ZONE_OFFSET] >= static_cast<int32_t>(kMinimumUserStamp) ||
  ------------------
  |  Branch (3140:9): [True: 0, False: 2]
  ------------------
 3141|      2|        fStamp[UCAL_DST_OFFSET] >= static_cast<int32_t>(kMinimumUserStamp)) {
  ------------------
  |  Branch (3141:9): [True: 0, False: 2]
  ------------------
 3142|      0|        t = millis + millisInDay - internalGet(UCAL_ZONE_OFFSET) - internalGet(UCAL_DST_OFFSET);
 3143|      2|    } else {
 3144|       |        // Compute the time zone offset and DST offset.  There are two potential
 3145|       |        // ambiguities here.  We'll assume a 2:00 am (wall time) switchover time
 3146|       |        // for discussion purposes here.
 3147|       |        //
 3148|       |        // 1. The positive offset change such as transition into DST.
 3149|       |        //    Here, a designated time of 2:00 am - 2:59 am does not actually exist.
 3150|       |        //    For this case, skippedWallTime option specifies the behavior.
 3151|       |        //    For example, 2:30 am is interpreted as;
 3152|       |        //      - WALLTIME_LAST(default): 3:30 am (DST) (interpreting 2:30 am as 31 minutes after 1:59 am (STD))
 3153|       |        //      - WALLTIME_FIRST: 1:30 am (STD) (interpreting 2:30 am as 30 minutes before 3:00 am (DST))
 3154|       |        //      - WALLTIME_NEXT_VALID: 3:00 am (DST) (next valid time after 2:30 am on a wall clock)
 3155|       |        // 2. The negative offset change such as transition out of DST.
 3156|       |        //    Here, a designated time of 1:00 am - 1:59 am can be in standard or DST.  Both are valid
 3157|       |        //    representations (the rep jumps from 1:59:59 DST to 1:00:00 Std).
 3158|       |        //    For this case, repeatedWallTime option specifies the behavior.
 3159|       |        //    For example, 1:30 am is interpreted as;
 3160|       |        //      - WALLTIME_LAST(default): 1:30 am (STD) - latter occurrence
 3161|       |        //      - WALLTIME_FIRST: 1:30 am (DST) - former occurrence
 3162|       |        //
 3163|       |        // In addition to above, when calendar is strict (not default), wall time falls into
 3164|       |        // the skipped time range will be processed as an error case.
 3165|       |        //
 3166|       |        // These special cases are mostly handled in #computeZoneOffset(long), except WALLTIME_NEXT_VALID
 3167|       |        // at positive offset change. The protected method computeZoneOffset(long) is exposed to Calendar
 3168|       |        // subclass implementations and marked as @stable. Strictly speaking, WALLTIME_NEXT_VALID
 3169|       |        // should be also handled in the same place, but we cannot change the code flow without deprecating
 3170|       |        // the protected method.
 3171|       |        //
 3172|       |        // We use the TimeZone object, unless the user has explicitly set the ZONE_OFFSET
 3173|       |        // or DST_OFFSET fields; then we use those fields.
 3174|       |
 3175|      2|        if (!isLenient() || fSkippedWallTime == UCAL_WALLTIME_NEXT_VALID) {
  ------------------
  |  Branch (3175:13): [True: 0, False: 2]
  |  Branch (3175:29): [True: 0, False: 2]
  ------------------
 3176|       |            // When strict, invalidate a wall time falls into a skipped wall time range.
 3177|       |            // When lenient and skipped wall time option is WALLTIME_NEXT_VALID,
 3178|       |            // the result time will be adjusted to the next valid time (on wall clock).
 3179|      0|            int32_t zoneOffset = computeZoneOffset(millis, millisInDay, status);
 3180|      0|            UDate tmpTime = millis + millisInDay - zoneOffset;
 3181|       |
 3182|      0|            int32_t raw, dst;
 3183|      0|            fZone->getOffset(tmpTime, false, raw, dst, status);
 3184|       |
 3185|      0|            if (U_SUCCESS(status)) {
  ------------------
  |  Branch (3185:17): [True: 0, False: 0]
  ------------------
 3186|       |                // zoneOffset != (raw + dst) only when the given wall time fall into
 3187|       |                // a skipped wall time range caused by positive zone offset transition.
 3188|      0|                if (zoneOffset != (raw + dst)) {
  ------------------
  |  Branch (3188:21): [True: 0, False: 0]
  ------------------
 3189|      0|                    if (!isLenient()) {
  ------------------
  |  Branch (3189:25): [True: 0, False: 0]
  ------------------
 3190|      0|                        status = U_ILLEGAL_ARGUMENT_ERROR;
 3191|      0|                    } else {
 3192|      0|                        U_ASSERT(fSkippedWallTime == UCAL_WALLTIME_NEXT_VALID);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 3193|       |                        // Adjust time to the next valid wall clock time.
 3194|       |                        // At this point, tmpTime is on or after the zone offset transition causing
 3195|       |                        // the skipped time range.
 3196|      0|                        UDate immediatePrevTransition;
 3197|      0|                        UBool hasTransition = getImmediatePreviousZoneTransition(tmpTime, &immediatePrevTransition, status);
 3198|      0|                        if (U_SUCCESS(status) && hasTransition) {
  ------------------
  |  Branch (3198:29): [True: 0, False: 0]
  |  Branch (3198:50): [True: 0, False: 0]
  ------------------
 3199|      0|                            t = immediatePrevTransition;
 3200|      0|                        }
 3201|      0|                    }
 3202|      0|                } else {
 3203|      0|                    t = tmpTime;
 3204|      0|                }
 3205|      0|            }
 3206|      2|        } else {
 3207|      2|            t = millis + millisInDay - computeZoneOffset(millis, millisInDay, status);
 3208|      2|        }
 3209|      2|    }
 3210|      2|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (3210:9): [True: 2, False: 0]
  ------------------
 3211|      2|        internalSetTime(t);
 3212|      2|    }
 3213|      2|}
_ZN6icu_788Calendar18computeMillisInDayEv:
 3249|      1|double Calendar::computeMillisInDay() {
 3250|       |  // Do the time portion of the conversion.
 3251|       |
 3252|      1|    double millisInDay = 0;
 3253|       |
 3254|       |    // Find the best set of fields specifying the time of day.  There
 3255|       |    // are only two possibilities here; the HOUR_OF_DAY or the
 3256|       |    // AM_PM and the HOUR.
 3257|      1|    int32_t hourOfDayStamp = fStamp[UCAL_HOUR_OF_DAY];
 3258|      1|    int32_t hourStamp = (fStamp[UCAL_HOUR] > fStamp[UCAL_AM_PM])?fStamp[UCAL_HOUR]:fStamp[UCAL_AM_PM];
  ------------------
  |  Branch (3258:25): [True: 0, False: 1]
  ------------------
 3259|      1|    int32_t bestStamp = (hourStamp > hourOfDayStamp) ? hourStamp : hourOfDayStamp;
  ------------------
  |  Branch (3259:25): [True: 0, False: 1]
  ------------------
 3260|       |
 3261|       |    // Hours
 3262|      1|    if (bestStamp != kUnset) {
  ------------------
  |  Branch (3262:9): [True: 1, False: 0]
  ------------------
 3263|      1|        if (bestStamp == hourOfDayStamp) {
  ------------------
  |  Branch (3263:13): [True: 1, False: 0]
  ------------------
 3264|       |            // Don't normalize here; let overflow bump into the next period.
 3265|       |            // This is consistent with how we handle other fields.
 3266|      1|            millisInDay += internalGet(UCAL_HOUR_OF_DAY);
 3267|      1|        } else {
 3268|       |            // Don't normalize here; let overflow bump into the next period.
 3269|       |            // This is consistent with how we handle other fields.
 3270|      0|            millisInDay += internalGet(UCAL_HOUR);
 3271|       |            // Treat even number as AM and odd nubmber as PM to align with the
 3272|       |            // logic in roll()
 3273|      0|            millisInDay += (internalGet(UCAL_AM_PM) % 2 == 0) ? 0 : 12;
  ------------------
  |  Branch (3273:28): [True: 0, False: 0]
  ------------------
 3274|      0|        }
 3275|      1|    }
 3276|       |
 3277|       |    // We use the fact that unset == 0; we start with millisInDay
 3278|       |    // == HOUR_OF_DAY.
 3279|      1|    millisInDay *= 60;
 3280|      1|    millisInDay += internalGet(UCAL_MINUTE); // now have minutes
 3281|      1|    millisInDay *= 60;
 3282|      1|    millisInDay += internalGet(UCAL_SECOND); // now have seconds
 3283|      1|    millisInDay *= 1000;
 3284|      1|    millisInDay += internalGet(UCAL_MILLISECOND); // now have millis
 3285|       |
 3286|      1|    return millisInDay;
 3287|      1|}
_ZN6icu_788Calendar17computeZoneOffsetEddR10UErrorCode:
 3296|      2|int32_t Calendar::computeZoneOffset(double millis, double millisInDay, UErrorCode &ec) {
 3297|      2|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (3297:9): [True: 0, False: 2]
  ------------------
 3298|      0|       return 0;
 3299|      0|    }
 3300|      2|    int32_t rawOffset, dstOffset;
 3301|      2|    UDate wall = millis + millisInDay;
 3302|      2|    BasicTimeZone* btz = getBasicTimeZone();
 3303|      2|    if (btz) {
  ------------------
  |  Branch (3303:9): [True: 2, False: 0]
  ------------------
 3304|      2|        UTimeZoneLocalOption duplicatedTimeOpt = (fRepeatedWallTime == UCAL_WALLTIME_FIRST) ? UCAL_TZ_LOCAL_FORMER : UCAL_TZ_LOCAL_LATTER;
  ------------------
  |  Branch (3304:50): [True: 0, False: 2]
  ------------------
 3305|      2|        UTimeZoneLocalOption nonExistingTimeOpt = (fSkippedWallTime == UCAL_WALLTIME_FIRST) ? UCAL_TZ_LOCAL_LATTER : UCAL_TZ_LOCAL_FORMER;
  ------------------
  |  Branch (3305:51): [True: 0, False: 2]
  ------------------
 3306|      2|        btz->getOffsetFromLocal(wall, nonExistingTimeOpt, duplicatedTimeOpt, rawOffset, dstOffset, ec);
 3307|      2|    } else {
 3308|      0|        const TimeZone& tz = getTimeZone();
 3309|       |        // By default, TimeZone::getOffset behaves UCAL_WALLTIME_LAST for both.
 3310|      0|        tz.getOffset(wall, true, rawOffset, dstOffset, ec);
 3311|       |
 3312|      0|        UBool sawRecentNegativeShift = false;
 3313|      0|        if (fRepeatedWallTime == UCAL_WALLTIME_FIRST) {
  ------------------
  |  Branch (3313:13): [True: 0, False: 0]
  ------------------
 3314|       |            // Check if the given wall time falls into repeated time range
 3315|      0|            UDate tgmt = wall - (rawOffset + dstOffset);
 3316|       |
 3317|       |            // Any negative zone transition within last 6 hours?
 3318|       |            // Note: The maximum historic negative zone transition is -3 hours in the tz database.
 3319|       |            // 6 hour window would be sufficient for this purpose.
 3320|      0|            int32_t tmpRaw, tmpDst;
 3321|      0|            tz.getOffset(tgmt - 6*60*60*1000, false, tmpRaw, tmpDst, ec);
 3322|      0|            int32_t offsetDelta = (rawOffset + dstOffset) - (tmpRaw + tmpDst);
 3323|       |
 3324|      0|            U_ASSERT(offsetDelta < -6*60*60*1000);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
 3325|      0|            if (offsetDelta < 0) {
  ------------------
  |  Branch (3325:17): [True: 0, False: 0]
  ------------------
 3326|      0|                sawRecentNegativeShift = true;
 3327|       |                // Negative shift within last 6 hours. When UCAL_WALLTIME_FIRST is used and the given wall time falls
 3328|       |                // into the repeated time range, use offsets before the transition.
 3329|       |                // Note: If it does not fall into the repeated time range, offsets remain unchanged below.
 3330|      0|                tz.getOffset(wall + offsetDelta, true, rawOffset, dstOffset, ec);
 3331|      0|            }
 3332|      0|        }
 3333|      0|        if (!sawRecentNegativeShift && fSkippedWallTime == UCAL_WALLTIME_FIRST) {
  ------------------
  |  Branch (3333:13): [True: 0, False: 0]
  |  Branch (3333:40): [True: 0, False: 0]
  ------------------
 3334|       |            // When skipped wall time option is WALLTIME_FIRST,
 3335|       |            // recalculate offsets from the resolved time (non-wall).
 3336|       |            // When the given wall time falls into skipped wall time,
 3337|       |            // the offsets will be based on the zone offsets AFTER
 3338|       |            // the transition (which means, earliest possible interpretation).
 3339|      0|            UDate tgmt = wall - (rawOffset + dstOffset);
 3340|      0|            tz.getOffset(tgmt, false, rawOffset, dstOffset, ec);
 3341|      0|        }
 3342|      0|    }
 3343|      2|    return rawOffset + dstOffset;
 3344|      2|}
_ZN6icu_788Calendar16computeJulianDayER10UErrorCode:
 3347|      2|{
 3348|       |    // We want to see if any of the date fields is newer than the
 3349|       |    // JULIAN_DAY.  If not, then we use JULIAN_DAY.  If so, then we do
 3350|       |    // the normal resolution.  We only use JULIAN_DAY if it has been
 3351|       |    // set by the user.  This makes it possible for the caller to set
 3352|       |    // the calendar to a time and call clear(MONTH) to reset the MONTH
 3353|       |    // to January.  This is legacy behavior.  Without this,
 3354|       |    // clear(MONTH) has no effect, since the internally set JULIAN_DAY
 3355|       |    // is used.
 3356|      2|    if (fStamp[UCAL_JULIAN_DAY] >= static_cast<int32_t>(kMinimumUserStamp)) {
  ------------------
  |  Branch (3356:9): [True: 0, False: 2]
  ------------------
 3357|      0|        int32_t bestStamp = newestStamp(UCAL_ERA, UCAL_DAY_OF_WEEK_IN_MONTH, kUnset);
 3358|      0|        bestStamp = newestStamp(UCAL_YEAR_WOY, UCAL_EXTENDED_YEAR, bestStamp);
 3359|      0|        bestStamp = newestStamp(UCAL_ORDINAL_MONTH, UCAL_ORDINAL_MONTH, bestStamp);
 3360|      0|        if (bestStamp <= fStamp[UCAL_JULIAN_DAY]) {
  ------------------
  |  Branch (3360:13): [True: 0, False: 0]
  ------------------
 3361|      0|            return internalGet(UCAL_JULIAN_DAY);
 3362|      0|        }
 3363|      0|    }
 3364|       |
 3365|      2|    UCalendarDateFields bestField = resolveFields(getFieldResolutionTable());
 3366|      2|    if (bestField == UCAL_FIELD_COUNT) {
  ------------------
  |  Branch (3366:9): [True: 0, False: 2]
  ------------------
 3367|      0|        bestField = UCAL_DAY_OF_MONTH;
 3368|      0|    }
 3369|       |
 3370|      2|    return handleComputeJulianDay(bestField, status);
 3371|      2|}
_ZN6icu_788Calendar22handleComputeJulianDayE19UCalendarDateFieldsR10UErrorCode:
 3375|      2|int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField, UErrorCode &status)  {
 3376|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (3376:9): [True: 0, False: 2]
  ------------------
 3377|      0|       return 0;
 3378|      0|    }
 3379|      2|    UBool useMonth = (bestField == UCAL_DAY_OF_MONTH ||
  ------------------
  |  Branch (3379:23): [True: 2, False: 0]
  ------------------
 3380|      2|        bestField == UCAL_WEEK_OF_MONTH ||
  ------------------
  |  Branch (3380:9): [True: 0, False: 0]
  ------------------
 3381|      2|        bestField == UCAL_DAY_OF_WEEK_IN_MONTH);
  ------------------
  |  Branch (3381:9): [True: 0, False: 0]
  ------------------
 3382|      2|    int32_t year;
 3383|       |
 3384|      2|    if (bestField == UCAL_WEEK_OF_YEAR && newerField(UCAL_YEAR_WOY, UCAL_YEAR) == UCAL_YEAR_WOY) {
  ------------------
  |  Branch (3384:9): [True: 0, False: 2]
  |  Branch (3384:43): [True: 0, False: 0]
  ------------------
 3385|      0|        year = internalGet(UCAL_YEAR_WOY);
 3386|      2|    } else {
 3387|      2|        year = handleGetExtendedYear(status);
 3388|      2|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (3388:13): [True: 0, False: 2]
  ------------------
 3389|      0|           return 0;
 3390|      0|        }
 3391|      2|    }
 3392|       |
 3393|      2|    internalSet(UCAL_EXTENDED_YEAR, year);
 3394|       |    // Return U_ILLEGAL_ARGUMENT_ERROR if year is too large that may cuase int32_t overflow
 3395|       |    // later.
 3396|      2|    if (year > INT32_MAX / 400) {
  ------------------
  |  Branch (3396:9): [True: 0, False: 2]
  ------------------
 3397|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 3398|      0|        return 0;
 3399|      0|    }
 3400|       |
 3401|       |#if defined (U_DEBUG_CAL)
 3402|       |    fprintf(stderr, "%s:%d: bestField= %s - y=%d\n", __FILE__, __LINE__, fldName(bestField), year);
 3403|       |#endif
 3404|       |
 3405|       |    // Get the Julian day of the day BEFORE the start of this year.
 3406|       |    // If useMonth is true, get the day before the start of the month.
 3407|       |
 3408|       |    // give calendar subclass a chance to have a default 'first' month
 3409|      2|    int32_t month;
 3410|       |
 3411|      2|    if(isSet(UCAL_MONTH) || isSet(UCAL_ORDINAL_MONTH)) {
  ------------------
  |  Branch (3411:8): [True: 2, False: 0]
  |  Branch (3411:29): [True: 0, False: 0]
  ------------------
 3412|      2|        month = internalGetMonth(status);
 3413|      2|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (3413:13): [True: 0, False: 2]
  ------------------
 3414|      0|           return 0;
 3415|      0|        }
 3416|      2|    } else {
 3417|      0|        month = getDefaultMonthInYear(year, status);
 3418|      0|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (3418:13): [True: 0, False: 0]
  ------------------
 3419|      0|           return 0;
 3420|      0|        }
 3421|      0|    }
 3422|       |
 3423|      2|    int32_t julianDay = handleComputeMonthStart(year, useMonth ? month : 0, useMonth, status);
  ------------------
  |  Branch (3423:55): [True: 2, False: 0]
  ------------------
 3424|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (3424:9): [True: 0, False: 2]
  ------------------
 3425|      0|        return 0;
 3426|      0|    }
 3427|       |
 3428|      2|    if (bestField == UCAL_DAY_OF_MONTH) {
  ------------------
  |  Branch (3428:9): [True: 2, False: 0]
  ------------------
 3429|       |
 3430|       |        // give calendar subclass a chance to have a default 'first' dom
 3431|      2|        int32_t dayOfMonth;
 3432|      2|        if(isSet(UCAL_DAY_OF_MONTH)) {
  ------------------
  |  Branch (3432:12): [True: 2, False: 0]
  ------------------
 3433|      2|            dayOfMonth = internalGet(UCAL_DAY_OF_MONTH,1);
 3434|      2|        } else {
 3435|      0|            dayOfMonth = getDefaultDayInMonth(year, month, status);
 3436|      0|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (3436:17): [True: 0, False: 0]
  ------------------
 3437|      0|               return 0;
 3438|      0|            }
 3439|      0|        }
 3440|      2|        if (uprv_add32_overflow(dayOfMonth, julianDay, &dayOfMonth)) {
  ------------------
  |  | 1394|      2|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (3440:13): [True: 0, False: 2]
  ------------------
 3441|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
 3442|      0|            return 0;
 3443|      0|        }
 3444|      2|        return dayOfMonth;
 3445|      2|    }
 3446|       |
 3447|      0|    if (bestField == UCAL_DAY_OF_YEAR) {
  ------------------
  |  Branch (3447:9): [True: 0, False: 0]
  ------------------
 3448|      0|        int32_t result;
 3449|      0|        if (uprv_add32_overflow(internalGet(UCAL_DAY_OF_YEAR), julianDay, &result)) {
  ------------------
  |  | 1394|      0|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3449:13): [True: 0, False: 0]
  ------------------
 3450|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
 3451|      0|            return 0;
 3452|      0|        }
 3453|      0|        return result;
 3454|      0|    }
 3455|       |
 3456|      0|    int32_t firstDayOfWeek = getFirstDayOfWeek(); // Localized fdw
 3457|       |
 3458|       |    // At this point julianDay is the 0-based day BEFORE the first day of
 3459|       |    // January 1, year 1 of the given calendar.  If julianDay == 0, it
 3460|       |    // specifies (Jan. 1, 1) - 1, in whatever calendar we are using (Julian
 3461|       |    // or Gregorian). (or it is before the month we are in, if useMonth is True)
 3462|       |
 3463|       |    // At this point we need to process the WEEK_OF_MONTH or
 3464|       |    // WEEK_OF_YEAR, which are similar, or the DAY_OF_WEEK_IN_MONTH.
 3465|       |    // First, perform initial shared computations.  These locate the
 3466|       |    // first week of the period.
 3467|       |
 3468|       |    // Get the 0-based localized DOW of day one of the month or year.
 3469|       |    // Valid range 0..6.
 3470|      0|    int32_t first = julianDayToDayOfWeek(julianDay + 1) - firstDayOfWeek;
 3471|      0|    if (first < 0) {
  ------------------
  |  Branch (3471:9): [True: 0, False: 0]
  ------------------
 3472|      0|        first += 7;
 3473|      0|    }
 3474|       |
 3475|      0|    int32_t dowLocal = getLocalDOW(status);
 3476|      0|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (3476:9): [True: 0, False: 0]
  ------------------
 3477|      0|        return 0;
 3478|      0|    }
 3479|       |
 3480|       |    // Find the first target DOW (dowLocal) in the month or year.
 3481|       |    // Actually, it may be just before the first of the month or year.
 3482|       |    // It will be an integer from -5..7.
 3483|      0|    int32_t date = 1 - first + dowLocal;
 3484|       |
 3485|      0|    if (bestField == UCAL_DAY_OF_WEEK_IN_MONTH) {
  ------------------
  |  Branch (3485:9): [True: 0, False: 0]
  ------------------
 3486|       |        // Adjust the target DOW to be in the month or year.
 3487|      0|        if (date < 1) {
  ------------------
  |  Branch (3487:13): [True: 0, False: 0]
  ------------------
 3488|      0|            date += 7;
 3489|      0|        }
 3490|       |
 3491|       |        // The only trickiness occurs if the day-of-week-in-month is
 3492|       |        // negative.
 3493|      0|        int32_t dim = internalGet(UCAL_DAY_OF_WEEK_IN_MONTH, 1);
 3494|      0|        if (dim >= 0) {
  ------------------
  |  Branch (3494:13): [True: 0, False: 0]
  ------------------
 3495|      0|            int32_t temp;
 3496|      0|            if (uprv_mul32_overflow(7, dim - 1, &temp)  ||
  ------------------
  |  | 1531|      0|#define uprv_mul32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_mul32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3496:17): [True: 0, False: 0]
  ------------------
 3497|      0|                uprv_add32_overflow(date, temp, &date)) {
  ------------------
  |  | 1394|      0|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3497:17): [True: 0, False: 0]
  ------------------
 3498|      0|                status = U_ILLEGAL_ARGUMENT_ERROR;
 3499|      0|                return 0;
 3500|      0|            }
 3501|       |
 3502|      0|        } else {
 3503|       |            // Move date to the last of this day-of-week in this month,
 3504|       |            // then back up as needed.  If dim==-1, we don't back up at
 3505|       |            // all.  If dim==-2, we back up once, etc.  Don't back up
 3506|       |            // past the first of the given day-of-week in this month.
 3507|       |            // Note that we handle -2, -3, etc. correctly, even though
 3508|       |            // values < -1 are technically disallowed.
 3509|      0|            int32_t m = internalGetMonth(UCAL_JANUARY, status);
 3510|      0|            int32_t monthLength = handleGetMonthLength(year, m, status);
 3511|      0|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (3511:17): [True: 0, False: 0]
  ------------------
 3512|      0|                return 0;
 3513|      0|            }
 3514|      0|            int32_t temp;
 3515|      0|            if (uprv_add32_overflow((monthLength - date) / 7, dim+1, &temp) ||
  ------------------
  |  | 1394|      0|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3515:17): [True: 0, False: 0]
  ------------------
 3516|      0|                uprv_mul32_overflow(temp, 7, &temp) ||
  ------------------
  |  | 1531|      0|#define uprv_mul32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_mul32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3516:17): [True: 0, False: 0]
  ------------------
 3517|      0|                uprv_add32_overflow(date, temp, &date)) {
  ------------------
  |  | 1394|      0|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3517:17): [True: 0, False: 0]
  ------------------
 3518|      0|                status = U_ILLEGAL_ARGUMENT_ERROR;
 3519|      0|                return 0;
 3520|      0|            }
 3521|      0|        }
 3522|      0|    } else {
 3523|       |#if defined (U_DEBUG_CAL)
 3524|       |        fprintf(stderr, "%s:%d - bf= %s\n", __FILE__, __LINE__, fldName(bestField));
 3525|       |#endif
 3526|       |
 3527|      0|        if(bestField == UCAL_WEEK_OF_YEAR) {  // ------------------------------------- WOY -------------
  ------------------
  |  Branch (3527:12): [True: 0, False: 0]
  ------------------
 3528|      0|            if(!isSet(UCAL_YEAR_WOY) ||  // YWOY not set at all or
  ------------------
  |  Branch (3528:16): [True: 0, False: 0]
  ------------------
 3529|      0|                ( (resolveFields(kYearPrecedence) != UCAL_YEAR_WOY) // YWOY doesn't have precedence
  ------------------
  |  Branch (3529:19): [True: 0, False: 0]
  ------------------
 3530|      0|                && (fStamp[UCAL_YEAR_WOY]!=kInternallySet) ) ) // (excluding where all fields are internally set - then YWOY is used)
  ------------------
  |  Branch (3530:20): [True: 0, False: 0]
  ------------------
 3531|      0|            {
 3532|       |                // need to be sure to stay in 'real' year.
 3533|      0|                int32_t woy = internalGet(bestField);
 3534|       |
 3535|      0|                int32_t nextJulianDay = handleComputeMonthStart(year+1, 0, false, status); // jd of day before jan 1
 3536|      0|                if (U_FAILURE(status)) {
  ------------------
  |  Branch (3536:21): [True: 0, False: 0]
  ------------------
 3537|      0|                    return 0;
 3538|      0|                }
 3539|      0|                int32_t nextFirst = julianDayToDayOfWeek(nextJulianDay + 1) - firstDayOfWeek;
 3540|       |
 3541|      0|                if (nextFirst < 0) { // 0..6 ldow of Jan 1
  ------------------
  |  Branch (3541:21): [True: 0, False: 0]
  ------------------
 3542|      0|                    nextFirst += 7;
 3543|      0|                }
 3544|       |
 3545|      0|                if(woy==1) {  // FIRST WEEK ---------------------------------
  ------------------
  |  Branch (3545:20): [True: 0, False: 0]
  ------------------
 3546|       |#if defined (U_DEBUG_CAL)
 3547|       |                    fprintf(stderr, "%s:%d - woy=%d, yp=%d, nj(%d)=%d, nf=%d", __FILE__, __LINE__,
 3548|       |                        internalGet(bestField), resolveFields(kYearPrecedence), year+1,
 3549|       |                        nextJulianDay, nextFirst);
 3550|       |
 3551|       |                    fprintf(stderr, " next: %d DFW,  min=%d   \n", (7-nextFirst), getMinimalDaysInFirstWeek() );
 3552|       |#endif
 3553|       |
 3554|       |                    // nextFirst is now the localized DOW of Jan 1  of y-woy+1
 3555|      0|                    if((nextFirst > 0) &&   // Jan 1 starts on FDOW
  ------------------
  |  Branch (3555:24): [True: 0, False: 0]
  ------------------
 3556|      0|                        (7-nextFirst) >= getMinimalDaysInFirstWeek()) // or enough days in the week
  ------------------
  |  Branch (3556:25): [True: 0, False: 0]
  ------------------
 3557|      0|                    {
 3558|       |                        // Jan 1 of (yearWoy+1) is in yearWoy+1 - recalculate JD to next year
 3559|       |#if defined (U_DEBUG_CAL)
 3560|       |                        fprintf(stderr, "%s:%d - was going to move JD from %d to %d [d%d]\n", __FILE__, __LINE__,
 3561|       |                            julianDay, nextJulianDay, (nextJulianDay-julianDay));
 3562|       |#endif
 3563|      0|                        julianDay = nextJulianDay;
 3564|       |
 3565|       |                        // recalculate 'first' [0-based local dow of jan 1]
 3566|      0|                        first = julianDayToDayOfWeek(julianDay + 1) - firstDayOfWeek;
 3567|      0|                        if (first < 0) {
  ------------------
  |  Branch (3567:29): [True: 0, False: 0]
  ------------------
 3568|      0|                            first += 7;
 3569|      0|                        }
 3570|       |                        // recalculate date.
 3571|      0|                        date = 1 - first + dowLocal;
 3572|      0|                    }
 3573|      0|                } else if(woy>=getLeastMaximum(bestField)) {
  ------------------
  |  Branch (3573:27): [True: 0, False: 0]
  ------------------
 3574|       |                    // could be in the last week- find out if this JD would overstep
 3575|      0|                    int32_t testDate = date;
 3576|      0|                    if ((7 - first) < getMinimalDaysInFirstWeek()) {
  ------------------
  |  Branch (3576:25): [True: 0, False: 0]
  ------------------
 3577|      0|                        testDate += 7;
 3578|      0|                    }
 3579|       |
 3580|       |                    // Now adjust for the week number.
 3581|      0|                    int32_t weeks;
 3582|      0|                    if (uprv_mul32_overflow(woy-1, 7, &weeks) ||
  ------------------
  |  | 1531|      0|#define uprv_mul32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_mul32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3582:25): [True: 0, False: 0]
  ------------------
 3583|      0|                        uprv_add32_overflow(weeks, testDate, &testDate)) {
  ------------------
  |  | 1394|      0|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3583:25): [True: 0, False: 0]
  ------------------
 3584|      0|                        status = U_ILLEGAL_ARGUMENT_ERROR;
 3585|      0|                        return 0;
 3586|      0|                    }
 3587|       |
 3588|       |#if defined (U_DEBUG_CAL)
 3589|       |                    fprintf(stderr, "%s:%d - y=%d, y-1=%d doy%d, njd%d (C.F. %d)\n",
 3590|       |                        __FILE__, __LINE__, year, year-1, testDate, julianDay+testDate, nextJulianDay);
 3591|       |#endif
 3592|      0|                    if (uprv_add32_overflow(julianDay, testDate, &testDate)) {
  ------------------
  |  | 1394|      0|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3592:25): [True: 0, False: 0]
  ------------------
 3593|      0|                        status = U_ILLEGAL_ARGUMENT_ERROR;
 3594|      0|                        return 0;
 3595|      0|                    }
 3596|       |
 3597|      0|                    if(testDate > nextJulianDay) { // is it past Dec 31?  (nextJulianDay is day BEFORE year+1's  Jan 1)
  ------------------
  |  Branch (3597:24): [True: 0, False: 0]
  ------------------
 3598|       |                        // Fire up the calculating engines.. retry YWOY = (year-1)
 3599|      0|                        int32_t prevYear;
 3600|      0|                        if (uprv_add32_overflow(year, -1, &prevYear)) {
  ------------------
  |  | 1394|      0|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3600:29): [True: 0, False: 0]
  ------------------
 3601|      0|                            status = U_ILLEGAL_ARGUMENT_ERROR;
 3602|      0|                            return 0;
 3603|      0|                        }
 3604|      0|                        julianDay = handleComputeMonthStart(prevYear, 0, false, status); // jd before Jan 1 of previous year
 3605|      0|                        if (U_FAILURE(status)) {
  ------------------
  |  Branch (3605:29): [True: 0, False: 0]
  ------------------
 3606|      0|                            return 0;
 3607|      0|                        }
 3608|      0|                        first = julianDayToDayOfWeek(julianDay + 1) - firstDayOfWeek; // 0 based local dow   of first week
 3609|       |
 3610|      0|                        if(first < 0) { // 0..6
  ------------------
  |  Branch (3610:28): [True: 0, False: 0]
  ------------------
 3611|      0|                            first += 7;
 3612|      0|                        }
 3613|      0|                        date = 1 - first + dowLocal;
 3614|       |
 3615|       |#if defined (U_DEBUG_CAL)
 3616|       |                        fprintf(stderr, "%s:%d - date now %d, jd%d, ywoy%d\n",
 3617|       |                            __FILE__, __LINE__, date, julianDay, year-1);
 3618|       |#endif
 3619|       |
 3620|       |
 3621|      0|                    } /* correction needed */
 3622|      0|                } /* leastmaximum */
 3623|      0|            } /* resolvefields(year) != year_woy */
 3624|      0|        } /* bestfield != week_of_year */
 3625|       |
 3626|       |        // assert(bestField == WEEK_OF_MONTH || bestField == WEEK_OF_YEAR)
 3627|       |        // Adjust for minimal days in first week
 3628|      0|        if ((7 - first) < getMinimalDaysInFirstWeek()) {
  ------------------
  |  Branch (3628:13): [True: 0, False: 0]
  ------------------
 3629|      0|            date += 7;
 3630|      0|        }
 3631|       |
 3632|       |        // Now adjust for the week number.
 3633|      0|        int32_t weeks = internalGet(bestField);
 3634|      0|        if (uprv_add32_overflow(weeks, -1, &weeks) ||
  ------------------
  |  | 1394|      0|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3634:13): [True: 0, False: 0]
  ------------------
 3635|      0|            uprv_mul32_overflow(7, weeks, &weeks) ||
  ------------------
  |  | 1531|      0|#define uprv_mul32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_mul32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3635:13): [True: 0, False: 0]
  ------------------
 3636|      0|            uprv_add32_overflow(date, weeks, &date)) {
  ------------------
  |  | 1394|      0|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3636:13): [True: 0, False: 0]
  ------------------
 3637|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
 3638|      0|            return 0;
 3639|      0|        }
 3640|      0|    }
 3641|       |
 3642|      0|    if (uprv_add32_overflow(julianDay, date, &julianDay)) {
  ------------------
  |  | 1394|      0|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (3642:9): [True: 0, False: 0]
  ------------------
 3643|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 3644|      0|        return 0;
 3645|      0|    }
 3646|      0|    return julianDay;
 3647|      0|}
_ZNK6icu_788Calendar16getActualMaximumE19UCalendarDateFieldsR10UErrorCode:
 3848|      1|{
 3849|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (3849:9): [True: 0, False: 1]
  ------------------
 3850|      0|       return 0;
 3851|      0|    }
 3852|      1|    if (field < 0 || field >= UCAL_FIELD_COUNT) {
  ------------------
  |  Branch (3852:9): [True: 0, False: 1]
  |  Branch (3852:22): [True: 0, False: 1]
  ------------------
 3853|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 3854|      0|        return 0;
 3855|      0|    }
 3856|      1|    int32_t result;
 3857|      1|    switch (field) {
 3858|      1|    case UCAL_DATE:
  ------------------
  |  Branch (3858:5): [True: 1, False: 0]
  ------------------
 3859|      1|        {
 3860|      1|            Calendar *cal = clone();
 3861|      1|            if(!cal) {
  ------------------
  |  Branch (3861:16): [True: 0, False: 1]
  ------------------
 3862|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 3863|      0|                return 0;
 3864|      0|            }
 3865|      1|            cal->setLenient(true);
 3866|      1|            cal->prepareGetActual(field,false,status);
 3867|      1|            result = handleGetMonthLength(cal->get(UCAL_EXTENDED_YEAR, status), cal->get(UCAL_MONTH, status), status);
 3868|      1|            delete cal;
 3869|      1|        }
 3870|      0|        break;
 3871|       |
 3872|      0|    case UCAL_DAY_OF_YEAR:
  ------------------
  |  Branch (3872:5): [True: 0, False: 1]
  ------------------
 3873|      0|        {
 3874|      0|            Calendar *cal = clone();
 3875|      0|            if(!cal) {
  ------------------
  |  Branch (3875:16): [True: 0, False: 0]
  ------------------
 3876|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 3877|      0|                return 0;
 3878|      0|            }
 3879|      0|            cal->setLenient(true);
 3880|      0|            cal->prepareGetActual(field,false,status);
 3881|      0|            result = handleGetYearLength(cal->get(UCAL_EXTENDED_YEAR, status), status);
 3882|      0|            delete cal;
 3883|      0|        }
 3884|      0|        break;
 3885|       |
 3886|      0|    case UCAL_DAY_OF_WEEK:
  ------------------
  |  Branch (3886:5): [True: 0, False: 1]
  ------------------
 3887|      0|    case UCAL_AM_PM:
  ------------------
  |  Branch (3887:5): [True: 0, False: 1]
  ------------------
 3888|      0|    case UCAL_HOUR:
  ------------------
  |  Branch (3888:5): [True: 0, False: 1]
  ------------------
 3889|      0|    case UCAL_HOUR_OF_DAY:
  ------------------
  |  Branch (3889:5): [True: 0, False: 1]
  ------------------
 3890|      0|    case UCAL_MINUTE:
  ------------------
  |  Branch (3890:5): [True: 0, False: 1]
  ------------------
 3891|      0|    case UCAL_SECOND:
  ------------------
  |  Branch (3891:5): [True: 0, False: 1]
  ------------------
 3892|      0|    case UCAL_MILLISECOND:
  ------------------
  |  Branch (3892:5): [True: 0, False: 1]
  ------------------
 3893|      0|    case UCAL_ZONE_OFFSET:
  ------------------
  |  Branch (3893:5): [True: 0, False: 1]
  ------------------
 3894|      0|    case UCAL_DST_OFFSET:
  ------------------
  |  Branch (3894:5): [True: 0, False: 1]
  ------------------
 3895|      0|    case UCAL_DOW_LOCAL:
  ------------------
  |  Branch (3895:5): [True: 0, False: 1]
  ------------------
 3896|      0|    case UCAL_JULIAN_DAY:
  ------------------
  |  Branch (3896:5): [True: 0, False: 1]
  ------------------
 3897|      0|    case UCAL_MILLISECONDS_IN_DAY:
  ------------------
  |  Branch (3897:5): [True: 0, False: 1]
  ------------------
 3898|       |        // These fields all have fixed minima/maxima
 3899|      0|        result = getMaximum(field);
 3900|      0|        break;
 3901|       |
 3902|      0|    case UCAL_ORDINAL_MONTH:
  ------------------
  |  Branch (3902:5): [True: 0, False: 1]
  ------------------
 3903|      0|        result = inTemporalLeapYear(status) ? getMaximum(UCAL_ORDINAL_MONTH) : getLeastMaximum(UCAL_ORDINAL_MONTH);
  ------------------
  |  Branch (3903:18): [True: 0, False: 0]
  ------------------
 3904|      0|        break;
 3905|       |
 3906|      0|    default:
  ------------------
  |  Branch (3906:5): [True: 0, False: 1]
  ------------------
 3907|       |        // For all other fields, do it the hard way....
 3908|      0|        result = getActualHelper(field, getLeastMaximum(field), getMaximum(field),status);
 3909|      0|        break;
 3910|      1|    }
 3911|      1|    return result;
 3912|      1|}
_ZN6icu_788Calendar16prepareGetActualE19UCalendarDateFieldsaR10UErrorCode:
 3937|      1|{
 3938|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (3938:9): [True: 0, False: 1]
  ------------------
 3939|      0|       return;
 3940|      0|    }
 3941|      1|    if (field < 0 || field >= UCAL_FIELD_COUNT) {
  ------------------
  |  Branch (3941:9): [True: 0, False: 1]
  |  Branch (3941:22): [True: 0, False: 1]
  ------------------
 3942|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 3943|      0|        return;
 3944|      0|    }
 3945|      1|    set(UCAL_MILLISECONDS_IN_DAY, 0);
 3946|       |
 3947|      1|    switch (field) {
 3948|      0|    case UCAL_YEAR:
  ------------------
  |  Branch (3948:5): [True: 0, False: 1]
  ------------------
 3949|      0|    case UCAL_EXTENDED_YEAR:
  ------------------
  |  Branch (3949:5): [True: 0, False: 1]
  ------------------
 3950|      0|        set(UCAL_DAY_OF_YEAR, getGreatestMinimum(UCAL_DAY_OF_YEAR));
 3951|      0|        break;
 3952|       |
 3953|      0|    case UCAL_YEAR_WOY:
  ------------------
  |  Branch (3953:5): [True: 0, False: 1]
  ------------------
 3954|      0|        set(UCAL_WEEK_OF_YEAR, getGreatestMinimum(UCAL_WEEK_OF_YEAR));
 3955|      0|        U_FALLTHROUGH;
  ------------------
  |  |  511|      0|#       define U_FALLTHROUGH [[clang::fallthrough]]
  ------------------
 3956|      0|    case UCAL_MONTH:
  ------------------
  |  Branch (3956:5): [True: 0, False: 1]
  ------------------
 3957|      0|        set(UCAL_DATE, getGreatestMinimum(UCAL_DATE));
 3958|      0|        break;
 3959|       |
 3960|      0|    case UCAL_DAY_OF_WEEK_IN_MONTH:
  ------------------
  |  Branch (3960:5): [True: 0, False: 1]
  ------------------
 3961|       |        // For dowim, the maximum occurs for the DOW of the first of the
 3962|       |        // month.
 3963|      0|        set(UCAL_DATE, 1);
 3964|      0|        set(UCAL_DAY_OF_WEEK, get(UCAL_DAY_OF_WEEK, status)); // Make this user set
 3965|      0|        break;
 3966|       |
 3967|      0|    case UCAL_WEEK_OF_MONTH:
  ------------------
  |  Branch (3967:5): [True: 0, False: 1]
  ------------------
 3968|      0|    case UCAL_WEEK_OF_YEAR:
  ------------------
  |  Branch (3968:5): [True: 0, False: 1]
  ------------------
 3969|       |        // If we're counting weeks, set the day of the week to either the
 3970|       |        // first or last localized DOW.  We know the last week of a month
 3971|       |        // or year will contain the first day of the week, and that the
 3972|       |        // first week will contain the last DOW.
 3973|      0|        {
 3974|      0|            int32_t dow = fFirstDayOfWeek;
 3975|      0|            if (isMinimum) {
  ------------------
  |  Branch (3975:17): [True: 0, False: 0]
  ------------------
 3976|      0|                dow = (dow + 6) % 7; // set to last DOW
 3977|      0|                if (dow < UCAL_SUNDAY) {
  ------------------
  |  Branch (3977:21): [True: 0, False: 0]
  ------------------
 3978|      0|                    dow += 7;
 3979|      0|                }
 3980|      0|            }
 3981|       |#if defined (U_DEBUG_CAL)
 3982|       |            fprintf(stderr, "prepareGetActualHelper(WOM/WOY) - dow=%d\n", dow);
 3983|       |#endif
 3984|      0|            set(UCAL_DAY_OF_WEEK, dow);
 3985|      0|        }
 3986|      0|        break;
 3987|      1|    default:
  ------------------
  |  Branch (3987:5): [True: 1, False: 0]
  ------------------
 3988|      1|        break;
 3989|      1|    }
 3990|       |
 3991|       |    // Do this last to give it the newest time stamp
 3992|      1|    set(field, getGreatestMinimum(field));
 3993|      1|}
_ZN6icu_788Calendar11setWeekDataERKNS_6LocaleEPKcR10UErrorCode:
 4075|      3|{
 4076|       |
 4077|      3|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (4077:9): [True: 0, False: 3]
  ------------------
 4078|      0|        return;
 4079|      0|    }
 4080|       |
 4081|      3|    fFirstDayOfWeek = UCAL_SUNDAY;
 4082|      3|    fMinimalDaysInFirstWeek = 1;
 4083|      3|    fWeekendOnset = UCAL_SATURDAY;
 4084|      3|    fWeekendOnsetMillis = 0;
 4085|      3|    fWeekendCease = UCAL_SUNDAY;
 4086|      3|    fWeekendCeaseMillis = 86400000; // 24*60*60*1000
 4087|       |
 4088|       |    // Since week and weekend data is territory based instead of language based,
 4089|       |    // we may need to tweak the locale that we are using to try to get the appropriate
 4090|       |    // values, using the following logic:
 4091|       |    // 1). If the locale has a language but no territory, use the territory as defined by
 4092|       |    //     the likely subtags.
 4093|       |    // 2). If the locale has a script designation then we ignore it,
 4094|       |    //     then remove it ( i.e. "en_Latn_US" becomes "en_US" )
 4095|       |
 4096|      3|    UErrorCode myStatus = U_ZERO_ERROR;
 4097|       |
 4098|      3|    Locale min(desiredLocale);
 4099|      3|    min.minimizeSubtags(myStatus);
 4100|      3|    Locale useLocale;
 4101|      3|    if ( uprv_strlen(desiredLocale.getCountry()) == 0 ||
  ------------------
  |  |   37|      3|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (4101:10): [True: 1, False: 2]
  ------------------
 4102|      3|         (uprv_strlen(desiredLocale.getScript()) > 0 && uprv_strlen(min.getScript()) == 0) ) {
  ------------------
  |  |   37|      2|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      2|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                       (uprv_strlen(desiredLocale.getScript()) > 0 && uprv_strlen(min.getScript()) == 0) ) {
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (4102:11): [True: 0, False: 2]
  |  Branch (4102:57): [True: 0, False: 0]
  ------------------
 4103|      1|        myStatus = U_ZERO_ERROR;
 4104|      1|        Locale max(desiredLocale);
 4105|      1|        max.addLikelySubtags(myStatus);
 4106|      1|        useLocale = Locale(max.getLanguage(),max.getCountry());
 4107|      2|    } else {
 4108|      2|        useLocale = desiredLocale;
 4109|      2|    }
 4110|       |
 4111|       |    /* The code here is somewhat of a hack, since week data and weekend data aren't really tied to
 4112|       |       a specific calendar, they aren't truly locale data.  But this is the only place where valid and
 4113|       |       actual locale can be set, so we take a shot at it here by loading a representative resource
 4114|       |       from the calendar data.  The code used to use the dateTimeElements resource to get first day
 4115|       |       of week data, but this was moved to supplemental data under ticket 7755. (JCE) */
 4116|       |
 4117|       |    // Get the monthNames resource bundle for the calendar 'type'. Fallback to gregorian if the resource is not
 4118|       |    // found.
 4119|      3|    LocalUResourceBundlePointer calData(ures_open(nullptr, useLocale.getBaseName(), &status));
  ------------------
  |  | 1691|      3|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4120|      3|    ures_getByKey(calData.getAlias(), gCalendar, calData.getAlias(), &status);
  ------------------
  |  | 1661|      3|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4121|       |
 4122|      3|    LocalUResourceBundlePointer monthNames;
 4123|      3|    if (type != nullptr && *type != '\0' && uprv_strcmp(type, gGregorian) != 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (4123:9): [True: 0, False: 3]
  |  Branch (4123:28): [True: 0, False: 0]
  |  Branch (4123:45): [True: 0, False: 0]
  ------------------
 4124|      0|        monthNames.adoptInstead(ures_getByKeyWithFallback(calData.getAlias(), type, nullptr, &status));
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4125|      0|        ures_getByKeyWithFallback(monthNames.getAlias(), gMonthNames,
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4126|      0|                                  monthNames.getAlias(), &status);
 4127|      0|    }
 4128|       |
 4129|      3|    if (monthNames.isNull() || status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (4129:9): [True: 3, False: 0]
  |  Branch (4129:32): [True: 0, False: 0]
  ------------------
 4130|      3|        status = U_ZERO_ERROR;
 4131|      3|        monthNames.adoptInstead(ures_getByKeyWithFallback(calData.getAlias(), gGregorian,
  ------------------
  |  | 1662|      3|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4132|      3|                                                          monthNames.orphan(), &status));
 4133|      3|        ures_getByKeyWithFallback(monthNames.getAlias(), gMonthNames,
  ------------------
  |  | 1662|      3|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4134|      3|                                  monthNames.getAlias(), &status);
 4135|      3|    }
 4136|       |
 4137|      3|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (4137:9): [True: 3, False: 0]
  ------------------
 4138|      3|        U_LOCALE_BASED(locBased,*this);
  ------------------
  |  |   25|      3|  LocaleBased varname((objname).validLocale, (objname).actualLocale)
  ------------------
 4139|      3|        locBased.setLocaleIDs(ures_getLocaleByType(monthNames.getAlias(), ULOC_VALID_LOCALE, &status),
  ------------------
  |  | 1669|      3|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4140|      3|                              ures_getLocaleByType(monthNames.getAlias(), ULOC_ACTUAL_LOCALE, &status), status);
  ------------------
  |  | 1669|      3|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4141|      3|    } else {
 4142|      0|        status = U_USING_FALLBACK_WARNING;
 4143|      0|        return;
 4144|      0|    }
 4145|       |
 4146|      3|    CharString region = ulocimp_getRegionForSupplementalData(desiredLocale.getName(), true, status);
  ------------------
  |  | 1207|      3|#define ulocimp_getRegionForSupplementalData U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegionForSupplementalData)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4147|       |
 4148|       |    // Read week data values from supplementalData week data
 4149|      3|    UResourceBundle *rb = ures_openDirect(nullptr, "supplementalData", &status);
  ------------------
  |  | 1693|      3|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4150|      3|    ures_getByKey(rb, "weekData", rb, &status);
  ------------------
  |  | 1661|      3|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4151|      3|    UResourceBundle *weekData = ures_getByKey(rb, region.data(), nullptr, &status);
  ------------------
  |  | 1661|      3|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4152|      3|    if (status == U_MISSING_RESOURCE_ERROR && rb != nullptr) {
  ------------------
  |  Branch (4152:9): [True: 0, False: 3]
  |  Branch (4152:47): [True: 0, False: 0]
  ------------------
 4153|      0|        status = U_ZERO_ERROR;
 4154|      0|        weekData = ures_getByKey(rb, "001", 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4155|      0|    }
 4156|       |
 4157|      3|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (4157:9): [True: 0, False: 3]
  ------------------
 4158|      0|        status = U_USING_FALLBACK_WARNING;
 4159|      3|    } else {
 4160|      3|        int32_t arrLen;
 4161|      3|        const int32_t *weekDataArr = ures_getIntVector(weekData,&arrLen,&status);
  ------------------
  |  | 1665|      3|#define ures_getIntVector U_ICU_ENTRY_POINT_RENAME(ures_getIntVector)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4162|      3|        if( U_SUCCESS(status) && arrLen == 6
  ------------------
  |  Branch (4162:13): [True: 3, False: 0]
  |  Branch (4162:34): [True: 3, False: 0]
  ------------------
 4163|      3|                && 1 <= weekDataArr[0] && weekDataArr[0] <= 7
  ------------------
  |  Branch (4163:20): [True: 3, False: 0]
  |  Branch (4163:43): [True: 3, False: 0]
  ------------------
 4164|      3|                && 1 <= weekDataArr[1] && weekDataArr[1] <= 7
  ------------------
  |  Branch (4164:20): [True: 3, False: 0]
  |  Branch (4164:43): [True: 3, False: 0]
  ------------------
 4165|      3|                && 1 <= weekDataArr[2] && weekDataArr[2] <= 7
  ------------------
  |  Branch (4165:20): [True: 3, False: 0]
  |  Branch (4165:43): [True: 3, False: 0]
  ------------------
 4166|      3|                && 1 <= weekDataArr[4] && weekDataArr[4] <= 7) {
  ------------------
  |  Branch (4166:20): [True: 3, False: 0]
  |  Branch (4166:43): [True: 3, False: 0]
  ------------------
 4167|      3|            fFirstDayOfWeek = static_cast<UCalendarDaysOfWeek>(weekDataArr[0]);
 4168|      3|            fMinimalDaysInFirstWeek = static_cast<uint8_t>(weekDataArr[1]);
 4169|      3|            fWeekendOnset = static_cast<UCalendarDaysOfWeek>(weekDataArr[2]);
 4170|      3|            fWeekendOnsetMillis = weekDataArr[3];
 4171|      3|            fWeekendCease = static_cast<UCalendarDaysOfWeek>(weekDataArr[4]);
 4172|      3|            fWeekendCeaseMillis = weekDataArr[5];
 4173|      3|        } else {
 4174|      0|            status = U_INVALID_FORMAT_ERROR;
 4175|      0|        }
 4176|       |
 4177|       |        // Check if the locale has a "fw" u extension and we honor it if present.
 4178|       |        // And we don't change the overal status, as the presence / lack of "fw" is not an error.
 4179|      3|        UErrorCode fwStatus = U_ZERO_ERROR;
 4180|      3|        char fwExt[ULOC_FULLNAME_CAPACITY] = "";
 4181|      3|        desiredLocale.getKeywordValue("fw", fwExt, ULOC_FULLNAME_CAPACITY, fwStatus);
  ------------------
  |  |  264|      3|#define ULOC_FULLNAME_CAPACITY 157
  ------------------
 4182|      3|        if (U_SUCCESS(fwStatus)) {
  ------------------
  |  Branch (4182:13): [True: 3, False: 0]
  ------------------
 4183|      3|            if (uprv_strcmp(fwExt, "sun") == 0) {
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (4183:17): [True: 0, False: 3]
  ------------------
 4184|      0|                fFirstDayOfWeek = UCAL_SUNDAY;
 4185|      3|            } else if (uprv_strcmp(fwExt, "mon") == 0) {
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (4185:24): [True: 0, False: 3]
  ------------------
 4186|      0|                fFirstDayOfWeek = UCAL_MONDAY;
 4187|      3|            } else if (uprv_strcmp(fwExt, "tue") == 0) {
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (4187:24): [True: 0, False: 3]
  ------------------
 4188|      0|                fFirstDayOfWeek = UCAL_TUESDAY;
 4189|      3|            } else if (uprv_strcmp(fwExt, "wed") == 0) {
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (4189:24): [True: 0, False: 3]
  ------------------
 4190|      0|                fFirstDayOfWeek = UCAL_WEDNESDAY;
 4191|      3|            } else if (uprv_strcmp(fwExt, "thu") == 0) {
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (4191:24): [True: 0, False: 3]
  ------------------
 4192|      0|                fFirstDayOfWeek = UCAL_THURSDAY;
 4193|      3|            } else if (uprv_strcmp(fwExt, "fri") == 0) {
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (4193:24): [True: 0, False: 3]
  ------------------
 4194|      0|                fFirstDayOfWeek = UCAL_FRIDAY;
 4195|      3|            } else if (uprv_strcmp(fwExt, "sat") == 0) {
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (4195:24): [True: 0, False: 3]
  ------------------
 4196|      0|                fFirstDayOfWeek = UCAL_SATURDAY;
 4197|      0|            }
 4198|      3|        }
 4199|      3|    }
 4200|      3|    ures_close(weekData);
  ------------------
  |  | 1652|      3|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4201|      3|    ures_close(rb);
  ------------------
  |  | 1652|      3|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4202|      3|}
_ZN6icu_788Calendar10updateTimeER10UErrorCode:
 4211|      2|{
 4212|      2|    computeTime(status);
 4213|      2|    if(U_FAILURE(status))
  ------------------
  |  Branch (4213:8): [True: 0, False: 2]
  ------------------
 4214|      0|        return;
 4215|       |
 4216|       |    // If we are lenient, we need to recompute the fields to normalize
 4217|       |    // the values.  Also, if we haven't set all the fields yet (i.e.,
 4218|       |    // in a newly-created object), we need to fill in the fields. [LIU]
 4219|      2|    if (isLenient() || ! fAreAllFieldsSet)
  ------------------
  |  Branch (4219:9): [True: 2, False: 0]
  |  Branch (4219:24): [True: 0, False: 0]
  ------------------
 4220|      2|        fAreFieldsSet = false;
 4221|       |
 4222|      2|    fIsTimeSet = true;
 4223|      2|    fAreFieldsVirtuallySet = false;
 4224|      2|}
_ZNK6icu_788Calendar16internalGetMonthER10UErrorCode:
 4270|      2|int32_t Calendar::internalGetMonth(UErrorCode& status) const {
 4271|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (4271:9): [True: 0, False: 2]
  ------------------
 4272|      0|        return 0;
 4273|      0|    }
 4274|      2|    if (resolveFields(kMonthPrecedence) == UCAL_ORDINAL_MONTH) {
  ------------------
  |  Branch (4274:9): [True: 0, False: 2]
  ------------------
 4275|      0|        return internalGet(UCAL_ORDINAL_MONTH);
 4276|      0|    }
 4277|      2|    return internalGet(UCAL_MONTH);
 4278|      2|}
_ZNK6icu_788Calendar16getBasicTimeZoneEv:
 4291|      2|Calendar::getBasicTimeZone() const {
 4292|      2|    if (dynamic_cast<const OlsonTimeZone *>(fZone) != nullptr
  ------------------
  |  Branch (4292:9): [True: 2, False: 0]
  ------------------
 4293|      2|        || dynamic_cast<const SimpleTimeZone *>(fZone) != nullptr
  ------------------
  |  Branch (4293:12): [True: 0, False: 0]
  ------------------
 4294|      2|        || dynamic_cast<const RuleBasedTimeZone *>(fZone) != nullptr
  ------------------
  |  Branch (4294:12): [True: 0, False: 0]
  ------------------
 4295|      2|        || dynamic_cast<const VTimeZone *>(fZone) != nullptr) {
  ------------------
  |  Branch (4295:12): [True: 0, False: 0]
  ------------------
 4296|      2|        return (BasicTimeZone*)fZone;
 4297|      2|    }
 4298|      0|    return nullptr;
 4299|      2|}
calendar.cpp:_ZN6icu_78L21isCalendarServiceUsedEv:
  552|      2|isCalendarServiceUsed() {
  553|      2|    return !gServiceInitOnce.isReset();
  554|      2|}
calendar.cpp:_ZN6icu_78L22createStandardCalendarE8ECalTypeRKNS_6LocaleER10UErrorCode:
  310|      2|static Calendar *createStandardCalendar(ECalType calType, const Locale &loc, UErrorCode& status) {
  311|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (311:9): [True: 0, False: 2]
  ------------------
  312|      0|        return nullptr;
  313|      0|    }
  314|      2|    LocalPointer<Calendar> cal;
  315|       |
  316|      2|    switch (calType) {
  317|      2|        case CALTYPE_GREGORIAN:
  ------------------
  |  Branch (317:9): [True: 2, False: 0]
  ------------------
  318|      2|            cal.adoptInsteadAndCheckErrorCode(new GregorianCalendar(loc, status), status);
  319|      2|            break;
  320|      0|        case CALTYPE_JAPANESE:
  ------------------
  |  Branch (320:9): [True: 0, False: 2]
  ------------------
  321|      0|            cal.adoptInsteadAndCheckErrorCode(new JapaneseCalendar(loc, status), status);
  322|      0|            break;
  323|      0|        case CALTYPE_BUDDHIST:
  ------------------
  |  Branch (323:9): [True: 0, False: 2]
  ------------------
  324|      0|            cal.adoptInsteadAndCheckErrorCode(new BuddhistCalendar(loc, status), status);
  325|      0|            break;
  326|      0|        case CALTYPE_ROC:
  ------------------
  |  Branch (326:9): [True: 0, False: 2]
  ------------------
  327|      0|            cal.adoptInsteadAndCheckErrorCode(new TaiwanCalendar(loc, status), status);
  328|      0|            break;
  329|      0|        case CALTYPE_PERSIAN:
  ------------------
  |  Branch (329:9): [True: 0, False: 2]
  ------------------
  330|      0|            cal.adoptInsteadAndCheckErrorCode(new PersianCalendar(loc, status), status);
  331|      0|            break;
  332|      0|        case CALTYPE_ISLAMIC_TBLA:
  ------------------
  |  Branch (332:9): [True: 0, False: 2]
  ------------------
  333|      0|            cal.adoptInsteadAndCheckErrorCode(new IslamicTBLACalendar(loc, status), status);
  334|      0|            break;
  335|      0|        case CALTYPE_ISLAMIC_CIVIL:
  ------------------
  |  Branch (335:9): [True: 0, False: 2]
  ------------------
  336|      0|            cal.adoptInsteadAndCheckErrorCode(new IslamicCivilCalendar(loc, status), status);
  337|      0|            break;
  338|      0|        case CALTYPE_ISLAMIC_RGSA:
  ------------------
  |  Branch (338:9): [True: 0, False: 2]
  ------------------
  339|      0|            cal.adoptInsteadAndCheckErrorCode(new IslamicRGSACalendar(loc, status), status);
  340|      0|            break;
  341|      0|        case CALTYPE_ISLAMIC:
  ------------------
  |  Branch (341:9): [True: 0, False: 2]
  ------------------
  342|      0|            cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status), status);
  343|      0|            break;
  344|      0|        case CALTYPE_ISLAMIC_UMALQURA:
  ------------------
  |  Branch (344:9): [True: 0, False: 2]
  ------------------
  345|      0|            cal.adoptInsteadAndCheckErrorCode(new IslamicUmalquraCalendar(loc, status), status);
  346|      0|            break;
  347|      0|        case CALTYPE_HEBREW:
  ------------------
  |  Branch (347:9): [True: 0, False: 2]
  ------------------
  348|      0|            cal.adoptInsteadAndCheckErrorCode(new HebrewCalendar(loc, status), status);
  349|      0|            break;
  350|      0|        case CALTYPE_CHINESE:
  ------------------
  |  Branch (350:9): [True: 0, False: 2]
  ------------------
  351|      0|            cal.adoptInsteadAndCheckErrorCode(new ChineseCalendar(loc, status), status);
  352|      0|            break;
  353|      0|        case CALTYPE_INDIAN:
  ------------------
  |  Branch (353:9): [True: 0, False: 2]
  ------------------
  354|      0|            cal.adoptInsteadAndCheckErrorCode(new IndianCalendar(loc, status), status);
  355|      0|            break;
  356|      0|        case CALTYPE_COPTIC:
  ------------------
  |  Branch (356:9): [True: 0, False: 2]
  ------------------
  357|      0|            cal.adoptInsteadAndCheckErrorCode(new CopticCalendar(loc, status), status);
  358|      0|            break;
  359|      0|        case CALTYPE_ETHIOPIC:
  ------------------
  |  Branch (359:9): [True: 0, False: 2]
  ------------------
  360|      0|            cal.adoptInsteadAndCheckErrorCode(new EthiopicCalendar(loc, status), status);
  361|      0|            break;
  362|      0|        case CALTYPE_ETHIOPIC_AMETE_ALEM:
  ------------------
  |  Branch (362:9): [True: 0, False: 2]
  ------------------
  363|      0|            cal.adoptInsteadAndCheckErrorCode(new EthiopicAmeteAlemCalendar(loc, status), status);
  364|      0|            break;
  365|      0|        case CALTYPE_ISO8601:
  ------------------
  |  Branch (365:9): [True: 0, False: 2]
  ------------------
  366|      0|            cal.adoptInsteadAndCheckErrorCode(new ISO8601Calendar(loc, status), status);
  367|      0|            break;
  368|      0|        case CALTYPE_DANGI:
  ------------------
  |  Branch (368:9): [True: 0, False: 2]
  ------------------
  369|      0|            cal.adoptInsteadAndCheckErrorCode(new DangiCalendar(loc, status), status);
  370|      0|            break;
  371|      0|        default:
  ------------------
  |  Branch (371:9): [True: 0, False: 2]
  ------------------
  372|      0|            status = U_UNSUPPORTED_ERROR;
  373|      2|    }
  374|      2|    return cal.orphan();
  375|      2|}
calendar.cpp:_ZN6icu_78L24getCalendarTypeForLocaleEPKc:
  253|      2|static ECalType getCalendarTypeForLocale(const char *locid) {
  254|      2|    UErrorCode status = U_ZERO_ERROR;
  255|      2|    ECalType calType = CALTYPE_UNKNOWN;
  256|       |
  257|       |    // Canonicalize, so that an old-style variant will be transformed to keywords.
  258|       |    // e.g ja_JP_TRADITIONAL -> ja_JP@calendar=japanese
  259|       |    // NOTE: Since ICU-20187, ja_JP_TRADITIONAL no longer canonicalizes, and
  260|       |    // the Gregorian calendar is returned instead.
  261|      2|    CharString canonicalName = ulocimp_canonicalize(locid, status);
  ------------------
  |  | 1197|      2|#define ulocimp_canonicalize U_ICU_ENTRY_POINT_RENAME(ulocimp_canonicalize)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  262|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (262:9): [True: 0, False: 2]
  ------------------
  263|      0|        return CALTYPE_GREGORIAN;
  264|      0|    }
  265|       |
  266|      2|    CharString calTypeBuf = ulocimp_getKeywordValue(canonicalName.data(), "calendar", status);
  ------------------
  |  | 1200|      2|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|      2|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (267:9): [True: 2, False: 0]
  ------------------
  268|      2|        calType = getCalendarType(calTypeBuf.data());
  269|      2|        if (calType != CALTYPE_UNKNOWN) {
  ------------------
  |  Branch (269:13): [True: 0, False: 2]
  ------------------
  270|      0|            return calType;
  271|      0|        }
  272|      2|    }
  273|      2|    status = U_ZERO_ERROR;
  274|       |
  275|       |    // when calendar keyword is not available or not supported, read supplementalData
  276|       |    // to get the default calendar type for the locale's region
  277|      2|    CharString region = ulocimp_getRegionForSupplementalData(canonicalName.data(), true, status);
  ------------------
  |  | 1207|      2|#define ulocimp_getRegionForSupplementalData U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegionForSupplementalData)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  278|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (278:9): [True: 0, False: 2]
  ------------------
  279|      0|        return CALTYPE_GREGORIAN;
  280|      0|    }
  281|       |
  282|       |    // Read preferred calendar values from supplementalData calendarPreference
  283|      2|    UResourceBundle *rb = ures_openDirect(nullptr, "supplementalData", &status);
  ------------------
  |  | 1693|      2|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  284|      2|    ures_getByKey(rb, "calendarPreferenceData", rb, &status);
  ------------------
  |  | 1661|      2|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  285|      2|    UResourceBundle *order = ures_getByKey(rb, region.data(), nullptr, &status);
  ------------------
  |  | 1661|      2|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  286|      2|    if (status == U_MISSING_RESOURCE_ERROR && rb != nullptr) {
  ------------------
  |  Branch (286:9): [True: 2, False: 0]
  |  Branch (286:47): [True: 2, False: 0]
  ------------------
  287|      2|        status = U_ZERO_ERROR;
  288|      2|        order = ures_getByKey(rb, "001", nullptr, &status);
  ------------------
  |  | 1661|      2|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  289|      2|    }
  290|       |
  291|      2|    calTypeBuf.clear();
  292|      2|    if (U_SUCCESS(status) && order != nullptr) {
  ------------------
  |  Branch (292:9): [True: 2, False: 0]
  |  Branch (292:30): [True: 2, False: 0]
  ------------------
  293|       |        // the first calendar type is the default for the region
  294|      2|        int32_t len = 0;
  295|      2|        const char16_t *uCalType = ures_getStringByIndex(order, 0, &len, &status);
  ------------------
  |  | 1676|      2|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  296|      2|        calTypeBuf.appendInvariantChars(uCalType, len, status);
  297|      2|        calType = getCalendarType(calTypeBuf.data());
  298|      2|    }
  299|       |
  300|      2|    ures_close(order);
  ------------------
  |  | 1652|      2|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  301|      2|    ures_close(rb);
  ------------------
  |  | 1652|      2|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  302|       |
  303|      2|    if (calType == CALTYPE_UNKNOWN) {
  ------------------
  |  Branch (303:9): [True: 0, False: 2]
  ------------------
  304|       |        // final fallback
  305|      0|        calType = CALTYPE_GREGORIAN;
  306|      0|    }
  307|      2|    return calType;
  308|      2|}
calendar.cpp:_ZN6icu_78L15getCalendarTypeEPKc:
  232|      4|static ECalType getCalendarType(const char *s) {
  233|     40|    for (int i = 0; gCalTypes[i] != nullptr; i++) {
  ------------------
  |  Branch (233:21): [True: 38, False: 2]
  ------------------
  234|     38|        if (uprv_stricmp(s, gCalTypes[i]) == 0) {
  ------------------
  |  | 1542|     38|#define uprv_stricmp U_ICU_ENTRY_POINT_RENAME(uprv_stricmp)
  |  |  ------------------
  |  |  |  |  123|     38|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     38|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     38|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (234:13): [True: 2, False: 36]
  ------------------
  235|      2|            return static_cast<ECalType>(i);
  236|      2|        }
  237|     38|    }
  238|      2|    return CALTYPE_UNKNOWN;
  239|      4|}

_ZN6icu_7812CurrencyUnitC2ERKS0_:
   82|   400k|CurrencyUnit::CurrencyUnit(const CurrencyUnit& other) : MeasureUnit(other) {
   83|   400k|    u_strcpy(isoCode, other.isoCode);
  ------------------
  |  |  390|   400k|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|   400k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   400k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   400k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   84|   400k|}
_ZN6icu_7812CurrencyUnitC2Ev:
   99|   386k|CurrencyUnit::CurrencyUnit() : MeasureUnit() {
  100|   386k|    u_strcpy(isoCode, kDefaultCurrency);
  ------------------
  |  |  390|   386k|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|   386k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   386k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   386k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  101|   386k|    char simpleIsoCode[4];
  102|   386k|    u_UCharsToChars(isoCode, simpleIsoCode, 4);
  ------------------
  |  |  211|   386k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|   386k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   386k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   386k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  103|   386k|    initCurrency(simpleIsoCode);
  104|   386k|}
_ZN6icu_7812CurrencyUnitaSERKS0_:
  106|   210k|CurrencyUnit& CurrencyUnit::operator=(const CurrencyUnit& other) {
  107|   210k|    if (this == &other) {
  ------------------
  |  Branch (107:9): [True: 0, False: 210k]
  ------------------
  108|      0|        return *this;
  109|      0|    }
  110|   210k|    MeasureUnit::operator=(other);
  111|   210k|    u_strcpy(isoCode, other.isoCode);
  ------------------
  |  |  390|   210k|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|   210k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   210k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   210k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  112|   210k|    return *this;
  113|   210k|}
_ZN6icu_7812CurrencyUnitD2Ev:
  119|   787k|CurrencyUnit::~CurrencyUnit() {
  120|   787k|}

_ZN6icu_7818DateFmtBestPatternD2Ev:
   60|  1.04k|DateFmtBestPattern::~DateFmtBestPattern() {
   61|  1.04k|}
_ZN6icu_7821DateFmtBestPatternKeyD2Ev:
  122|  37.9k|DateFmtBestPatternKey::~DateFmtBestPatternKey() { }
_ZN6icu_7810DateFormatC2Ev:
  126|  56.1k|:   fCalendar(nullptr),
  127|  56.1k|    fNumberFormat(nullptr),
  128|  56.1k|    fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
  129|  56.1k|{
  130|  56.1k|}
_ZN6icu_7810DateFormatD2Ev:
  170|  56.1k|{
  171|  56.1k|    delete fCalendar;
  172|  56.1k|    delete fNumberFormat;
  173|  56.1k|}
_ZN6icu_7810DateFormat18createDateInstanceENS0_6EStyleERKNS_6LocaleE:
  419|  19.2k|{
  420|  19.2k|    return createDateTimeInstance(style, kNone, aLocale);
  421|  19.2k|}
_ZN6icu_7810DateFormat22createDateTimeInstanceENS0_6EStyleES1_RKNS_6LocaleE:
  429|  19.2k|{
  430|  19.2k|   if(dateStyle != kNone)
  ------------------
  |  Branch (430:7): [True: 19.2k, False: 0]
  ------------------
  431|  19.2k|   {
  432|  19.2k|       dateStyle = static_cast<EStyle>(dateStyle + kDateOffset);
  433|  19.2k|   }
  434|  19.2k|   return create(timeStyle, dateStyle, aLocale);
  435|  19.2k|}
_ZN6icu_7810DateFormat14getBestPatternERKNS_6LocaleERKNS_13UnicodeStringER10UErrorCode:
  451|  36.9k|        UErrorCode &status) {
  452|  36.9k|    UnifiedCache *cache = UnifiedCache::getInstance(status);
  453|  36.9k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (453:9): [True: 0, False: 36.9k]
  ------------------
  454|      0|        return {};
  455|      0|    }
  456|  36.9k|    DateFmtBestPatternKey key(locale, skeleton, status);
  457|  36.9k|    const DateFmtBestPattern *patternPtr = nullptr;
  458|  36.9k|    cache->get(key, patternPtr, status);
  459|  36.9k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (459:9): [True: 0, False: 36.9k]
  ------------------
  460|      0|        return {};
  461|      0|    }
  462|  36.9k|    UnicodeString result(patternPtr->fPattern);
  463|  36.9k|    patternPtr->removeRef();
  464|  36.9k|    return result;
  465|  36.9k|}
_ZN6icu_7810DateFormat25createInstanceForSkeletonERKNS_13UnicodeStringERKNS_6LocaleER10UErrorCode:
  498|  36.9k|        UErrorCode &status) {
  499|  36.9k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (499:9): [True: 0, False: 36.9k]
  ------------------
  500|      0|        return nullptr;
  501|      0|    }
  502|  36.9k|    LocalPointer<DateFormat> df(
  503|  36.9k|        new SimpleDateFormat(
  504|  36.9k|            getBestPattern(locale, skeleton, status),
  505|  36.9k|            locale, status),
  506|  36.9k|        status);
  507|  36.9k|    return U_SUCCESS(status) ? df.orphan() : nullptr;
  ------------------
  |  Branch (507:12): [True: 36.9k, False: 0]
  ------------------
  508|  36.9k|}
_ZN6icu_7810DateFormat6createENS0_6EStyleES1_RKNS_6LocaleE:
  522|  19.2k|{
  523|  19.2k|    UErrorCode status = U_ZERO_ERROR;
  524|       |#if U_PLATFORM_USES_ONLY_WIN32_API
  525|       |    char buffer[8];
  526|       |    int32_t count = locale.getKeywordValue("compat", buffer, sizeof(buffer), status);
  527|       |
  528|       |    // if the locale has "@compat=host", create a host-specific DateFormat...
  529|       |    if (count > 0 && uprv_strcmp(buffer, "host") == 0) {
  530|       |        Win32DateFormat *f = new Win32DateFormat(timeStyle, dateStyle, locale, status);
  531|       |
  532|       |        if (U_SUCCESS(status)) {
  533|       |            return f;
  534|       |        }
  535|       |
  536|       |        delete f;
  537|       |    }
  538|       |#endif
  539|       |
  540|       |    // is it relative?
  541|  19.2k|    if(/*((timeStyle!=UDAT_NONE)&&(timeStyle & UDAT_RELATIVE)) || */((dateStyle!=kNone)&&((dateStyle-kDateOffset) & UDAT_RELATIVE))) {
  ------------------
  |  Branch (541:70): [True: 19.2k, False: 0]
  |  Branch (541:90): [True: 0, False: 19.2k]
  ------------------
  542|      0|        RelativeDateFormat* r = new RelativeDateFormat(static_cast<UDateFormatStyle>(timeStyle), static_cast<UDateFormatStyle>(dateStyle - kDateOffset), locale, status);
  543|      0|        if(U_SUCCESS(status)) return r;
  ------------------
  |  Branch (543:12): [True: 0, False: 0]
  ------------------
  544|      0|        delete r;
  545|      0|        status = U_ZERO_ERROR;
  546|      0|    }
  547|       |
  548|       |    // Try to create a SimpleDateFormat of the desired style.
  549|  19.2k|    SimpleDateFormat *f = new SimpleDateFormat(timeStyle, dateStyle, locale, status);
  550|  19.2k|    if (U_SUCCESS(status)) return f;
  ------------------
  |  Branch (550:9): [True: 19.2k, False: 0]
  ------------------
  551|      0|    delete f;
  552|       |
  553|       |    // If that fails, try to create a format using the default pattern and
  554|       |    // the DateFormatSymbols for this locale.
  555|      0|    status = U_ZERO_ERROR;
  556|      0|    f = new SimpleDateFormat(locale, status);
  557|      0|    if (U_SUCCESS(status)) return f;
  ------------------
  |  Branch (557:9): [True: 0, False: 0]
  ------------------
  558|      0|    delete f;
  559|       |
  560|       |    // This should never really happen, because the preceding constructor
  561|       |    // should always succeed.  If the resource data is unavailable, a last
  562|       |    // resort object should be returned.
  563|      0|    return nullptr;
  564|      0|}
_ZN6icu_7810DateFormat19setBooleanAttributeE27UDateFormatBooleanAttributeaR10UErrorCode:
  750|   224k|    									UErrorCode &status) {
  751|   224k|    if(!fBoolFlags.isValidValue(newValue)) {
  ------------------
  |  Branch (751:8): [True: 0, False: 224k]
  ------------------
  752|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  753|   224k|    } else {
  754|   224k|        fBoolFlags.set(attr, newValue);
  755|   224k|    }
  756|       |
  757|   224k|    return *this;
  758|   224k|}
_ZN6icu_7821DateFmtBestPatternKeyC2ERKNS_6LocaleERKNS_13UnicodeStringER10UErrorCode:
   86|  36.9k|            : LocaleCacheKey<DateFmtBestPattern>(loc),
   87|  36.9k|              fSkeleton(DateTimePatternGenerator::staticGetSkeleton(skeleton, status)) { }
_ZNK6icu_7821DateFmtBestPatternKey8hashCodeEv:
   92|  40.9k|    virtual int32_t hashCode() const override {
   93|  40.9k|        return static_cast<int32_t>(37u * static_cast<uint32_t>(LocaleCacheKey<DateFmtBestPattern>::hashCode()) + static_cast<uint32_t>(fSkeleton.hashCode()));
   94|  40.9k|    }
_ZNK6icu_7821DateFmtBestPatternKey5cloneEv:
   98|  2.04k|    virtual CacheKeyBase *clone() const override {
   99|  2.04k|        return new DateFmtBestPatternKey(*this);
  100|  2.04k|    }
_ZN6icu_7821DateFmtBestPatternKeyC2ERKS0_:
   89|  2.04k|            LocaleCacheKey<DateFmtBestPattern>(other),
   90|  2.04k|            fSkeleton(other.fSkeleton) { }
_ZNK6icu_7821DateFmtBestPatternKey12createObjectEPKvR10UErrorCode:
  102|  2.04k|            const void * /*unused*/, UErrorCode &status) const override {
  103|  2.04k|        LocalPointer<DateTimePatternGenerator> dtpg(
  104|  2.04k|                    DateTimePatternGenerator::createInstance(fLoc, status));
  105|  2.04k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (105:13): [True: 0, False: 2.04k]
  ------------------
  106|      0|            return nullptr;
  107|      0|        }
  108|       |  
  109|  2.04k|        LocalPointer<DateFmtBestPattern> pattern(
  110|  2.04k|                new DateFmtBestPattern(
  111|  2.04k|                        dtpg->getBestPattern(fSkeleton, status)),
  112|  2.04k|                status);
  113|  2.04k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (113:13): [True: 0, False: 2.04k]
  ------------------
  114|      0|            return nullptr;
  115|      0|        }
  116|  2.04k|        DateFmtBestPattern *result = pattern.orphan();
  117|  2.04k|        result->addRef();
  118|  2.04k|        return result;
  119|  2.04k|    }
_ZN6icu_7818DateFmtBestPatternC2ERKNS_13UnicodeStringE:
   56|  2.04k|            : fPattern(pattern) { }
_ZNK6icu_7821DateFmtBestPatternKey6equalsERKNS_12CacheKeyBaseE:
   74|  39.5k|    virtual bool equals(const CacheKeyBase &other) const override {
   75|  39.5k|       if (!LocaleCacheKey<DateFmtBestPattern>::equals(other)) {
  ------------------
  |  Branch (75:12): [True: 0, False: 39.5k]
  ------------------
   76|      0|           return false;
   77|      0|       }
   78|       |       // We know that this and other are of same class if we get this far.
   79|  39.5k|       return operator==(static_cast<const DateFmtBestPatternKey &>(other));
   80|  39.5k|    }
_ZNK6icu_7821DateFmtBestPatternKeyeqERKS0_:
   95|  39.5k|    inline bool operator==(const DateFmtBestPatternKey &other) const {
   96|  39.5k|        return fSkeleton == other.fSkeleton;
   97|  39.5k|    }

_ZN6icu_7820DecimalFormatSymbolsC2ER10UErrorCode:
  102|  21.2k|        : UObject(), locale() {
  103|  21.2k|    initialize(locale, status, true);
  104|  21.2k|}
_ZN6icu_7820DecimalFormatSymbolsC2ERKNS_6LocaleER10UErrorCode:
  110|  23.2k|        : UObject(), locale(loc) {
  111|  23.2k|    initialize(locale, status);
  112|  23.2k|}
_ZN6icu_7820DecimalFormatSymbolsD2Ev:
  137|   297k|{
  138|   297k|    delete actualLocale;
  139|   297k|    delete validLocale;
  140|   297k|}
_ZN6icu_7820DecimalFormatSymbolsC2ERKS0_:
  146|   253k|    : UObject(source)
  147|   253k|{
  148|   253k|    *this = source;
  149|   253k|}
_ZN6icu_7820DecimalFormatSymbolsaSERKS0_:
  156|   253k|{
  157|   253k|    if (this != &rhs) {
  ------------------
  |  Branch (157:9): [True: 253k, False: 0]
  ------------------
  158|  7.59M|        for (int32_t i = 0; i < static_cast<int32_t>(kFormatSymbolCount); ++i) {
  ------------------
  |  Branch (158:29): [True: 7.34M, False: 253k]
  ------------------
  159|       |            // fastCopyFrom is safe, see docs on fSymbols
  160|  7.34M|            fSymbols[static_cast<ENumberFormatSymbol>(i)].fastCopyFrom(rhs.fSymbols[static_cast<ENumberFormatSymbol>(i)]);
  161|  7.34M|        }
  162|  1.01M|        for (int32_t i = 0; i < static_cast<int32_t>(UNUM_CURRENCY_SPACING_COUNT); ++i) {
  ------------------
  |  Branch (162:29): [True: 759k, False: 253k]
  ------------------
  163|   759k|            currencySpcBeforeSym[i].fastCopyFrom(rhs.currencySpcBeforeSym[i]);
  164|   759k|            currencySpcAfterSym[i].fastCopyFrom(rhs.currencySpcAfterSym[i]);
  165|   759k|        }
  166|   253k|        locale = rhs.locale;
  167|       |
  168|   253k|        UErrorCode status = U_ZERO_ERROR;
  169|   253k|        U_LOCALE_BASED(locBased, *this);
  ------------------
  |  |   25|   253k|  LocaleBased varname((objname).validLocale, (objname).actualLocale)
  ------------------
  170|   253k|        locBased.setLocaleIDs(rhs.validLocale, rhs.actualLocale, status);
  171|   253k|        U_ASSERT(U_SUCCESS(status));
  ------------------
  |  |   35|   253k|#   define U_ASSERT(exp) (void)0
  ------------------
  172|       |
  173|   253k|        fIsCustomCurrencySymbol = rhs.fIsCustomCurrencySymbol; 
  174|   253k|        fIsCustomIntlCurrencySymbol = rhs.fIsCustomIntlCurrencySymbol; 
  175|   253k|        fCodePointZero = rhs.fCodePointZero;
  176|   253k|        currPattern = rhs.currPattern;
  177|   253k|        uprv_strcpy(nsName, rhs.nsName);
  ------------------
  |  |   36|   253k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|   253k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  178|   253k|    }
  179|   253k|    return *this;
  180|   253k|}
_ZN6icu_7820DecimalFormatSymbols10initializeERKNS_6LocaleER10UErrorCodeaPKNS_15NumberingSystemE:
  359|  44.4k|{
  360|  44.4k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (360:9): [True: 0, False: 44.4k]
  ------------------
  361|       |
  362|       |    // First initialize all the symbols to the fallbacks for anything we can't find
  363|  44.4k|    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|  44.4k|    LocalPointer<NumberingSystem> nsLocal;
  370|  44.4k|    if (ns == nullptr) {
  ------------------
  |  Branch (370:9): [True: 44.4k, False: 0]
  ------------------
  371|       |        // Use the numbering system according to the locale.
  372|       |        // Save it into a LocalPointer so it gets cleaned up.
  373|  44.4k|        nsLocal.adoptInstead(NumberingSystem::createInstance(loc, status));
  374|  44.4k|        ns = nsLocal.getAlias();
  375|  44.4k|    }
  376|  44.4k|    const char *nsName;
  377|  44.4k|    if (U_SUCCESS(status) && ns->getRadix() == 10 && !ns->isAlgorithmic()) {
  ------------------
  |  Branch (377:9): [True: 44.4k, False: 0]
  |  Branch (377:30): [True: 44.4k, False: 0]
  |  Branch (377:54): [True: 44.4k, False: 0]
  ------------------
  378|  44.4k|        nsName = ns->getName();
  379|  44.4k|        UnicodeString digitString(ns->getDescription());
  380|  44.4k|        int32_t digitIndex = 0;
  381|  44.4k|        UChar32 digit = digitString.char32At(0);
  382|  44.4k|        fSymbols[kZeroDigitSymbol].setTo(digit);
  383|   444k|        for (int32_t i = kOneDigitSymbol; i <= kNineDigitSymbol; ++i) {
  ------------------
  |  Branch (383:43): [True: 400k, False: 44.4k]
  ------------------
  384|   400k|            digitIndex += U16_LENGTH(digit);
  ------------------
  |  |  141|   400k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 400k, False: 0]
  |  |  ------------------
  ------------------
  385|   400k|            digit = digitString.char32At(digitIndex);
  386|   400k|            fSymbols[i].setTo(digit);
  387|   400k|        }
  388|  44.4k|    } else {
  389|      0|        nsName = gLatn;
  390|      0|    }
  391|  44.4k|    uprv_strcpy(this->nsName, nsName);
  ------------------
  |  |   36|  44.4k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  44.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  392|       |
  393|       |    // Open resource bundles
  394|  44.4k|    const char* locStr = loc.getName();
  395|  44.4k|    LocalUResourceBundlePointer resource(ures_open(nullptr, locStr, &status));
  ------------------
  |  | 1691|  44.4k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  396|  44.4k|    LocalUResourceBundlePointer numberElementsRes(
  397|  44.4k|        ures_getByKeyWithFallback(resource.getAlias(), gNumberElements, nullptr, &status));
  ------------------
  |  | 1662|  44.4k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  398|       |
  399|  44.4k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (399:9): [True: 0, False: 44.4k]
  ------------------
  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|  44.4k|    U_LOCALE_BASED(locBased, *this);
  ------------------
  |  |   25|  44.4k|  LocaleBased varname((objname).validLocale, (objname).actualLocale)
  ------------------
  410|  44.4k|    locBased.setLocaleIDs(
  411|  44.4k|        ures_getLocaleByType(
  ------------------
  |  | 1669|  44.4k|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  412|  44.4k|            numberElementsRes.getAlias(),
  413|  44.4k|            ULOC_VALID_LOCALE, &status),
  414|  44.4k|        ures_getLocaleByType(
  ------------------
  |  | 1669|  44.4k|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  415|  44.4k|            numberElementsRes.getAlias(),
  416|  44.4k|            ULOC_ACTUAL_LOCALE, &status),
  417|  44.4k|        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|  44.4k|    DecFmtSymDataSink sink(*this);
  422|  44.4k|    if (uprv_strcmp(nsName, gLatn) != 0) {
  ------------------
  |  |   38|  44.4k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  44.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (422:9): [True: 0, False: 44.4k]
  ------------------
  423|      0|        CharString path;
  424|      0|        path.append(gNumberElements, status)
  425|      0|            .append('/', status)
  426|      0|            .append(nsName, status)
  427|      0|            .append('/', status)
  428|      0|            .append(gSymbols, status);
  429|      0|        ures_getAllItemsWithFallback(resource.getAlias(), path.data(), sink, status);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  430|       |
  431|       |        // If no symbols exist for the given nsName and resource bundle, silently ignore
  432|       |        // and fall back to Latin.
  433|      0|        if (status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (433:13): [True: 0, False: 0]
  ------------------
  434|      0|            status = U_ZERO_ERROR;
  435|      0|        } else if (U_FAILURE(status)) {
  ------------------
  |  Branch (435:20): [True: 0, False: 0]
  ------------------
  436|      0|            return;
  437|      0|        }
  438|      0|    }
  439|       |
  440|       |    // Continue with Latin if necessary.
  441|  44.4k|    if (!sink.seenAll()) {
  ------------------
  |  Branch (441:9): [True: 44.4k, False: 0]
  ------------------
  442|  44.4k|        ures_getAllItemsWithFallback(resource.getAlias(), gNumberElementsLatnSymbols, sink, status);
  ------------------
  |  | 1658|  44.4k|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  443|  44.4k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (443:13): [True: 0, False: 44.4k]
  ------------------
  444|  44.4k|    }
  445|       |
  446|       |    // Let the monetary number separators equal the default number separators if necessary.
  447|  44.4k|    sink.resolveMissingMonetarySeparators(fSymbols);
  448|       |
  449|       |    // Resolve codePointZero
  450|  44.4k|    UChar32 tempCodePointZero = -1;
  451|   489k|    for (int32_t i=0; i<=9; i++) {
  ------------------
  |  Branch (451:23): [True: 444k, False: 44.4k]
  ------------------
  452|   444k|        const UnicodeString& stringDigit = getConstDigitSymbol(i);
  453|   444k|        if (stringDigit.countChar32() != 1) {
  ------------------
  |  Branch (453:13): [True: 0, False: 444k]
  ------------------
  454|      0|            tempCodePointZero = -1;
  455|      0|            break;
  456|      0|        }
  457|   444k|        UChar32 cp = stringDigit.char32At(0);
  458|   444k|        if (i == 0) {
  ------------------
  |  Branch (458:13): [True: 44.4k, False: 400k]
  ------------------
  459|  44.4k|            tempCodePointZero = cp;
  460|   400k|        } else if (cp != tempCodePointZero + i) {
  ------------------
  |  Branch (460:20): [True: 0, False: 400k]
  ------------------
  461|      0|            tempCodePointZero = -1;
  462|      0|            break;
  463|      0|        }
  464|   444k|    }
  465|  44.4k|    fCodePointZero = tempCodePointZero;
  466|       |
  467|       |    // Get the default currency from the currency API.
  468|  44.4k|    UErrorCode internalStatus = U_ZERO_ERROR; // don't propagate failures out
  469|  44.4k|    char16_t curriso[4];
  470|  44.4k|    UnicodeString tempStr;
  471|  44.4k|    int32_t currisoLength = ucurr_forLocale(locStr, curriso, UPRV_LENGTHOF(curriso), &internalStatus);
  ------------------
  |  |  832|  44.4k|#define ucurr_forLocale U_ICU_ENTRY_POINT_RENAME(ucurr_forLocale)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  int32_t currisoLength = ucurr_forLocale(locStr, curriso, UPRV_LENGTHOF(curriso), &internalStatus);
  ------------------
  |  |   99|  44.4k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  472|  44.4k|    if (U_SUCCESS(internalStatus) && currisoLength == 3) {
  ------------------
  |  Branch (472:9): [True: 44.4k, False: 0]
  |  Branch (472:38): [True: 44.4k, False: 0]
  ------------------
  473|  44.4k|        setCurrency(curriso, status);
  474|  44.4k|    } else {
  475|      0|        setCurrency(nullptr, status);
  476|      0|    }
  477|       |
  478|       |    // Currency Spacing.
  479|  44.4k|    LocalUResourceBundlePointer currencyResource(ures_open(U_ICUDATA_CURR, locStr, &status));
  ------------------
  |  | 1691|  44.4k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  LocalUResourceBundlePointer currencyResource(ures_open(U_ICUDATA_CURR, locStr, &status));
  ------------------
  |  |   21|  44.4k|#define U_ICUDATA_CURR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "curr"
  |  |  ------------------
  |  |  |  |  154|  44.4k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  480|  44.4k|    CurrencySpacingSink currencySink(*this);
  481|  44.4k|    ures_getAllItemsWithFallback(currencyResource.getAlias(), gCurrencySpacingTag, currencySink, status);
  ------------------
  |  | 1658|  44.4k|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  482|  44.4k|    currencySink.resolveMissing();
  483|  44.4k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (483:9): [True: 0, False: 44.4k]
  ------------------
  484|  44.4k|}
_ZN6icu_7820DecimalFormatSymbols10initializeEv:
  487|  44.4k|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|  44.4k|    fSymbols[kDecimalSeparatorSymbol] = static_cast<char16_t>(0x2e); // '.' decimal separator
  494|  44.4k|    fSymbols[kGroupingSeparatorSymbol].remove();        //     group (thousands) separator
  495|  44.4k|    fSymbols[kPatternSeparatorSymbol] = static_cast<char16_t>(0x3b); // ';' pattern separator
  496|  44.4k|    fSymbols[kPercentSymbol] = static_cast<char16_t>(0x25);          // '%' percent sign
  497|  44.4k|    fSymbols[kZeroDigitSymbol] = static_cast<char16_t>(0x30);        // '0' native 0 digit
  498|  44.4k|    fSymbols[kOneDigitSymbol] = static_cast<char16_t>(0x31);         // '1' native 1 digit
  499|  44.4k|    fSymbols[kTwoDigitSymbol] = static_cast<char16_t>(0x32);         // '2' native 2 digit
  500|  44.4k|    fSymbols[kThreeDigitSymbol] = static_cast<char16_t>(0x33);       // '3' native 3 digit
  501|  44.4k|    fSymbols[kFourDigitSymbol] = static_cast<char16_t>(0x34);        // '4' native 4 digit
  502|  44.4k|    fSymbols[kFiveDigitSymbol] = static_cast<char16_t>(0x35);        // '5' native 5 digit
  503|  44.4k|    fSymbols[kSixDigitSymbol] = static_cast<char16_t>(0x36);         // '6' native 6 digit
  504|  44.4k|    fSymbols[kSevenDigitSymbol] = static_cast<char16_t>(0x37);       // '7' native 7 digit
  505|  44.4k|    fSymbols[kEightDigitSymbol] = static_cast<char16_t>(0x38);       // '8' native 8 digit
  506|  44.4k|    fSymbols[kNineDigitSymbol] = static_cast<char16_t>(0x39);        // '9' native 9 digit
  507|  44.4k|    fSymbols[kDigitSymbol] = static_cast<char16_t>(0x23);            // '#' pattern digit
  508|  44.4k|    fSymbols[kPlusSignSymbol] = static_cast<char16_t>(0x002b);       // '+' plus sign
  509|  44.4k|    fSymbols[kMinusSignSymbol] = static_cast<char16_t>(0x2d);        // '-' minus sign
  510|  44.4k|    fSymbols[kCurrencySymbol] = static_cast<char16_t>(0xa4);         // 'OX' currency symbol
  511|  44.4k|    fSymbols[kIntlCurrencySymbol].setTo(true, INTL_CURRENCY_SYMBOL_STR, 2);
  512|  44.4k|    fSymbols[kMonetarySeparatorSymbol] = static_cast<char16_t>(0x2e);  // '.' monetary decimal separator
  513|  44.4k|    fSymbols[kExponentialSymbol] = static_cast<char16_t>(0x45);        // 'E' exponential
  514|  44.4k|    fSymbols[kPerMillSymbol] = static_cast<char16_t>(0x2030);          // '%o' per mill
  515|  44.4k|    fSymbols[kPadEscapeSymbol] = static_cast<char16_t>(0x2a);          // '*' pad escape symbol
  516|  44.4k|    fSymbols[kInfinitySymbol] = static_cast<char16_t>(0x221e);         // 'oo' infinite
  517|  44.4k|    fSymbols[kNaNSymbol] = static_cast<char16_t>(0xfffd);              // SUB NaN
  518|  44.4k|    fSymbols[kSignificantDigitSymbol] = static_cast<char16_t>(0x0040); // '@' significant digit
  519|  44.4k|    fSymbols[kMonetaryGroupingSeparatorSymbol].remove(); // 
  520|  44.4k|    fSymbols[kExponentMultiplicationSymbol] = static_cast<char16_t>(0xd7); // 'x' multiplication symbol for exponents
  521|  44.4k|    fSymbols[kApproximatelySignSymbol] = u'~';          // '~' approximately sign
  522|  44.4k|    fIsCustomCurrencySymbol = false; 
  523|  44.4k|    fIsCustomIntlCurrencySymbol = false;
  524|  44.4k|    fCodePointZero = 0x30;
  525|  44.4k|    U_ASSERT(fCodePointZero == fSymbols[kZeroDigitSymbol].char32At(0));
  ------------------
  |  |   35|  44.4k|#   define U_ASSERT(exp) (void)0
  ------------------
  526|  44.4k|    currPattern = nullptr;
  527|  44.4k|    nsName[0] = 0;
  528|  44.4k|}
_ZN6icu_7820DecimalFormatSymbols11setCurrencyEPKDsR10UErrorCode:
  530|  44.4k|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|  44.4k|    if (!currency) {
  ------------------
  |  Branch (534:9): [True: 0, False: 44.4k]
  ------------------
  535|      0|        return;
  536|      0|    }
  537|       |
  538|  44.4k|    UnicodeString tempStr;
  539|  44.4k|    uprv_getStaticCurrencyName(currency, locale.getName(), tempStr, status);
  ------------------
  |  | 1511|  44.4k|#define uprv_getStaticCurrencyName U_ICU_ENTRY_POINT_RENAME(uprv_getStaticCurrencyName)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  540|  44.4k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (540:9): [True: 44.4k, False: 0]
  ------------------
  541|  44.4k|        fSymbols[kIntlCurrencySymbol].setTo(currency, 3);
  542|  44.4k|        fSymbols[kCurrencySymbol] = tempStr;
  543|  44.4k|    }
  544|       |
  545|  44.4k|    char cc[4]={0};
  546|  44.4k|    u_UCharsToChars(currency, cc, 3);
  ------------------
  |  |  211|  44.4k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       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|  44.4k|    UErrorCode localStatus = U_ZERO_ERROR;
  551|  44.4k|    LocalUResourceBundlePointer rbTop(ures_open(U_ICUDATA_CURR, locale.getName(), &localStatus));
  ------------------
  |  | 1691|  44.4k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  LocalUResourceBundlePointer rbTop(ures_open(U_ICUDATA_CURR, locale.getName(), &localStatus));
  ------------------
  |  |   21|  44.4k|#define U_ICUDATA_CURR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "curr"
  |  |  ------------------
  |  |  |  |  154|  44.4k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  552|  44.4k|    LocalUResourceBundlePointer rb(
  553|  44.4k|        ures_getByKeyWithFallback(rbTop.getAlias(), "Currencies", nullptr, &localStatus));
  ------------------
  |  | 1662|  44.4k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  554|  44.4k|    ures_getByKeyWithFallback(rb.getAlias(), cc, rb.getAlias(), &localStatus);
  ------------------
  |  | 1662|  44.4k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  555|  44.4k|    if(U_SUCCESS(localStatus) && ures_getSize(rb.getAlias())>2) { // the length is 3 if more data is present
  ------------------
  |  | 1674|  44.4k|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  123|  44.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  44.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  44.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (555:8): [True: 44.4k, False: 0]
  |  Branch (555:34): [True: 0, False: 44.4k]
  ------------------
  556|      0|        ures_getByIndex(rb.getAlias(), 2, rb.getAlias(), &localStatus);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  557|      0|        int32_t currPatternLen = 0;
  558|      0|        currPattern =
  559|      0|            ures_getStringByIndex(rb.getAlias(), static_cast<int32_t>(0), &currPatternLen, &localStatus);
  ------------------
  |  | 1676|      0|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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|        UnicodeString decimalSep =
  561|      0|            ures_getUnicodeStringByIndex(rb.getAlias(), static_cast<int32_t>(1), &localStatus);
  562|      0|        UnicodeString groupingSep =
  563|      0|            ures_getUnicodeStringByIndex(rb.getAlias(), static_cast<int32_t>(2), &localStatus);
  564|      0|        if(U_SUCCESS(localStatus)){
  ------------------
  |  Branch (564:12): [True: 0, False: 0]
  ------------------
  565|      0|            fSymbols[kMonetaryGroupingSeparatorSymbol] = groupingSep;
  566|      0|            fSymbols[kMonetarySeparatorSymbol] = decimalSep;
  567|       |            //pattern.setTo(true, currPattern, currPatternLen);
  568|      0|        }
  569|      0|    }
  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|  44.4k|}
_ZNK6icu_7820DecimalFormatSymbols28getPatternForCurrencySpacingE16UCurrencySpacingaR10UErrorCode:
  582|   266k|                                                 UErrorCode& status) const {
  583|   266k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (583:9): [True: 0, False: 266k]
  ------------------
  584|      0|      return fNoSymbol;  // always empty.
  585|      0|    }
  586|   266k|    if (beforeCurrency) {
  ------------------
  |  Branch (586:9): [True: 133k, False: 133k]
  ------------------
  587|   133k|      return currencySpcBeforeSym[static_cast<int32_t>(type)];
  588|   133k|    } else {
  589|   133k|      return currencySpcAfterSym[static_cast<int32_t>(type)];
  590|   133k|    }
  591|   266k|}
_ZN6icu_7820DecimalFormatSymbols28setPatternForCurrencySpacingE16UCurrencySpacingaRKNS_13UnicodeStringE:
  596|   266k|                                             const UnicodeString& pattern) {
  597|   266k|  if (beforeCurrency) {
  ------------------
  |  Branch (597:7): [True: 133k, False: 133k]
  ------------------
  598|   133k|    currencySpcBeforeSym[static_cast<int32_t>(type)] = pattern;
  599|   133k|  } else {
  600|   133k|    currencySpcAfterSym[static_cast<int32_t>(type)] = pattern;
  601|   133k|  }
  602|   266k|}
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_117DecFmtSymDataSinkC2ERNS_20DecimalFormatSymbolsE:
  235|  44.4k|    DecFmtSymDataSink(DecimalFormatSymbols& _dfs) : dfs(_dfs) {
  236|  44.4k|        uprv_memset(seenSymbol, false, sizeof(seenSymbol));
  ------------------
  |  |  100|  44.4k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  44.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  237|  44.4k|    }
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_117DecFmtSymDataSink3putEPKcRNS_13ResourceValueEaR10UErrorCode:
  241|   133k|            UErrorCode &errorCode) override {
  242|   133k|        ResourceTable symbolsTable = value.getTable(errorCode);
  243|   133k|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (243:13): [True: 0, False: 133k]
  ------------------
  244|  1.28M|        for (int32_t j = 0; symbolsTable.getKeyAndValue(j, key, value); ++j) {
  ------------------
  |  Branch (244:29): [True: 1.15M, False: 133k]
  ------------------
  245|  15.9M|            for (int32_t i=0; i<DecimalFormatSymbols::kFormatSymbolCount; i++) {
  ------------------
  |  Branch (245:31): [True: 15.8M, False: 133k]
  ------------------
  246|  15.8M|                if (gNumberElementKeys[i] != nullptr && uprv_strcmp(key, gNumberElementKeys[i]) == 0) {
  ------------------
  |  |   38|  8.49M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  8.49M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (246:21): [True: 8.49M, False: 7.33M]
  |  Branch (246:57): [True: 1.02M, False: 7.46M]
  ------------------
  247|  1.02M|                    if (!seenSymbol[i]) {
  ------------------
  |  Branch (247:25): [True: 489k, False: 533k]
  ------------------
  248|   489k|                        seenSymbol[i] = true;
  249|   489k|                        dfs.setSymbol(
  250|   489k|                            static_cast<DecimalFormatSymbols::ENumberFormatSymbol>(i),
  251|   489k|                            value.getUnicodeString(errorCode));
  252|   489k|                        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (252:29): [True: 0, False: 489k]
  ------------------
  253|   489k|                    }
  254|  1.02M|                    break;
  255|  1.02M|                }
  256|  15.8M|            }
  257|  1.15M|        }
  258|   133k|    }
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_117DecFmtSymDataSink7seenAllEv:
  261|  44.4k|    UBool seenAll() {
  262|  44.4k|        for (int32_t i=0; i<DecimalFormatSymbols::kFormatSymbolCount; i++) {
  ------------------
  |  Branch (262:27): [True: 44.4k, False: 0]
  ------------------
  263|  44.4k|            if (!seenSymbol[i]) {
  ------------------
  |  Branch (263:17): [True: 44.4k, False: 0]
  ------------------
  264|  44.4k|                return false;
  265|  44.4k|            }
  266|  44.4k|        }
  267|      0|        return true;
  268|  44.4k|    }
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_117DecFmtSymDataSink32resolveMissingMonetarySeparatorsEPKNS_13UnicodeStringE:
  272|  44.4k|    void resolveMissingMonetarySeparators(const UnicodeString* fSymbols) {
  273|  44.4k|        if (!seenSymbol[DecimalFormatSymbols::kMonetarySeparatorSymbol]) {
  ------------------
  |  Branch (273:13): [True: 44.4k, False: 0]
  ------------------
  274|  44.4k|            dfs.setSymbol(
  275|  44.4k|                DecimalFormatSymbols::kMonetarySeparatorSymbol,
  276|  44.4k|                fSymbols[DecimalFormatSymbols::kDecimalSeparatorSymbol]);
  277|  44.4k|        }
  278|  44.4k|        if (!seenSymbol[DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol]) {
  ------------------
  |  Branch (278:13): [True: 44.4k, False: 0]
  ------------------
  279|  44.4k|            dfs.setSymbol(
  280|  44.4k|                DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol,
  281|  44.4k|                fSymbols[DecimalFormatSymbols::kGroupingSeparatorSymbol]);
  282|  44.4k|        }
  283|  44.4k|    }
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_119CurrencySpacingSinkC2ERNS_20DecimalFormatSymbolsE:
  292|  44.4k|        : dfs(_dfs), hasBeforeCurrency(false), hasAfterCurrency(false) {}
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_119CurrencySpacingSink3putEPKcRNS_13ResourceValueEaR10UErrorCode:
  296|  44.4k|            UErrorCode &errorCode) override {
  297|  44.4k|        ResourceTable spacingTypesTable = value.getTable(errorCode);
  298|   133k|        for (int32_t i = 0; spacingTypesTable.getKeyAndValue(i, key, value); ++i) {
  ------------------
  |  Branch (298:29): [True: 88.9k, False: 44.4k]
  ------------------
  299|  88.9k|            UBool beforeCurrency;
  300|  88.9k|            if (uprv_strcmp(key, gBeforeCurrencyTag) == 0) {
  ------------------
  |  |   38|  88.9k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  88.9k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (300:17): [True: 44.4k, False: 44.4k]
  ------------------
  301|  44.4k|                beforeCurrency = true;
  302|  44.4k|                hasBeforeCurrency = true;
  303|  44.4k|            } else if (uprv_strcmp(key, gAfterCurrencyTag) == 0) {
  ------------------
  |  |   38|  44.4k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  44.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (303:24): [True: 44.4k, False: 0]
  ------------------
  304|  44.4k|                beforeCurrency = false;
  305|  44.4k|                hasAfterCurrency = true;
  306|  44.4k|            } else {
  307|      0|                continue;
  308|      0|            }
  309|       |
  310|  88.9k|            ResourceTable patternsTable = value.getTable(errorCode);
  311|   355k|            for (int32_t j = 0; patternsTable.getKeyAndValue(j, key, value); ++j) {
  ------------------
  |  Branch (311:33): [True: 266k, False: 88.9k]
  ------------------
  312|   266k|                UCurrencySpacing pattern;
  313|   266k|                if (uprv_strcmp(key, gCurrencyMatchTag) == 0) {
  ------------------
  |  |   38|   266k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   266k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (313:21): [True: 88.9k, False: 177k]
  ------------------
  314|  88.9k|                    pattern = UNUM_CURRENCY_MATCH;
  315|   177k|                } else if (uprv_strcmp(key, gCurrencySudMatchTag) == 0) {
  ------------------
  |  |   38|   177k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   177k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (315:28): [True: 88.9k, False: 88.9k]
  ------------------
  316|  88.9k|                    pattern = UNUM_CURRENCY_SURROUNDING_MATCH;
  317|  88.9k|                } else if (uprv_strcmp(key, gCurrencyInsertBtnTag) == 0) {
  ------------------
  |  |   38|  88.9k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  88.9k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (317:28): [True: 88.9k, False: 0]
  ------------------
  318|  88.9k|                    pattern = UNUM_CURRENCY_INSERT;
  319|  88.9k|                } else {
  320|      0|                    continue;
  321|      0|                }
  322|       |
  323|   266k|                const UnicodeString& current = dfs.getPatternForCurrencySpacing(
  324|   266k|                    pattern, beforeCurrency, errorCode);
  325|   266k|                if (current.isEmpty()) {
  ------------------
  |  Branch (325:21): [True: 266k, False: 0]
  ------------------
  326|   266k|                    dfs.setPatternForCurrencySpacing(
  327|   266k|                        pattern, beforeCurrency, value.getUnicodeString(errorCode));
  328|   266k|                }
  329|   266k|            }
  330|  88.9k|        }
  331|  44.4k|    }
dcfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_119CurrencySpacingSink14resolveMissingEv:
  333|  44.4k|    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|  44.4k|        static const char* defaults[] = { "[:letter:]", "[:digit:]", " " };
  337|  44.4k|        if (!hasBeforeCurrency || !hasAfterCurrency) {
  ------------------
  |  Branch (337:13): [True: 0, False: 44.4k]
  |  Branch (337:35): [True: 0, False: 44.4k]
  ------------------
  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|  44.4k|    }

_ZN6icu_7813DecimalFormatC2ERKNS_13UnicodeStringEPNS_20DecimalFormatSymbolsE18UNumberFormatStyleR10UErrorCode:
   78|      2|        : DecimalFormat(symbolsToAdopt, status) {
   79|      2|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (79:9): [True: 0, False: 2]
  ------------------
   80|       |    // If choice is a currency type, ignore the rounding information.
   81|      2|    if (style == UNumberFormatStyle::UNUM_CURRENCY ||
  ------------------
  |  Branch (81:9): [True: 0, False: 2]
  ------------------
   82|      2|        style == UNumberFormatStyle::UNUM_CURRENCY_ISO ||
  ------------------
  |  Branch (82:9): [True: 0, False: 2]
  ------------------
   83|      2|        style == UNumberFormatStyle::UNUM_CURRENCY_ACCOUNTING ||
  ------------------
  |  Branch (83:9): [True: 0, False: 2]
  ------------------
   84|      2|        style == UNumberFormatStyle::UNUM_CASH_CURRENCY ||
  ------------------
  |  Branch (84:9): [True: 0, False: 2]
  ------------------
   85|      2|        style == UNumberFormatStyle::UNUM_CURRENCY_STANDARD ||
  ------------------
  |  Branch (85:9): [True: 0, False: 2]
  ------------------
   86|      2|        style == UNumberFormatStyle::UNUM_CURRENCY_PLURAL) {
  ------------------
  |  Branch (86:9): [True: 0, False: 2]
  ------------------
   87|      0|        setPropertiesFromPattern(pattern, IGNORE_ROUNDING_ALWAYS, status);
   88|      2|    } else {
   89|      2|        setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status);
   90|      2|    }
   91|       |    // Note: in Java, CurrencyPluralInfo is set in NumberFormat.java, but in C++, it is not set there,
   92|       |    // so we have to set it here.
   93|      2|    if (style == UNumberFormatStyle::UNUM_CURRENCY_PLURAL) {
  ------------------
  |  Branch (93:9): [True: 0, False: 2]
  ------------------
   94|      0|        LocalPointer<CurrencyPluralInfo> cpi(
   95|      0|                new CurrencyPluralInfo(fields->symbols->getLocale(), status),
   96|      0|                status);
   97|      0|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (97:13): [True: 0, False: 0]
  ------------------
   98|      0|        fields->properties.currencyPluralInfo.fPtr.adoptInstead(cpi.orphan());
   99|      0|    }
  100|      2|    touch(status);
  101|      2|}
_ZN6icu_7813DecimalFormatC2EPKNS_20DecimalFormatSymbolsER10UErrorCode:
  103|  21.2k|DecimalFormat::DecimalFormat(const DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status) {
  104|       |    // we must take ownership of symbolsToAdopt, even in a failure case.
  105|  21.2k|    LocalPointer<const DecimalFormatSymbols> adoptedSymbols(symbolsToAdopt);
  106|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (106:9): [True: 0, False: 21.2k]
  ------------------
  107|      0|        return;
  108|      0|    }
  109|  21.2k|    fields = new DecimalFormatFields();
  110|  21.2k|    if (fields == nullptr) {
  ------------------
  |  Branch (110:9): [True: 0, False: 21.2k]
  ------------------
  111|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  112|      0|        return;
  113|      0|    }
  114|  21.2k|    if (adoptedSymbols.isNull()) {
  ------------------
  |  Branch (114:9): [True: 21.2k, False: 2]
  ------------------
  115|  21.2k|        fields->symbols.adoptInsteadAndCheckErrorCode(new DecimalFormatSymbols(status), status);
  116|  21.2k|    } else {
  117|      2|        fields->symbols.adoptInsteadAndCheckErrorCode(adoptedSymbols.orphan(), status);
  118|      2|    }
  119|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (119:9): [True: 0, False: 21.2k]
  ------------------
  120|      0|        delete fields;
  121|      0|        fields = nullptr;
  122|      0|    }
  123|  21.2k|}
_ZN6icu_7813DecimalFormat15setGroupingUsedEa:
  371|  56.1k|void DecimalFormat::setGroupingUsed(UBool enabled) {
  372|  56.1k|    if (fields == nullptr) {
  ------------------
  |  Branch (372:9): [True: 0, False: 56.1k]
  ------------------
  373|      0|        return;
  374|      0|    }
  375|  56.1k|    if (UBOOL_TO_BOOL(enabled) == fields->properties.groupingUsed) { return; }
  ------------------
  |  |   39|  56.1k|#define UBOOL_TO_BOOL(b) b
  ------------------
  |  Branch (375:9): [True: 56.1k, False: 0]
  ------------------
  376|      0|    NumberFormat::setGroupingUsed(enabled); // to set field for compatibility
  377|      0|    fields->properties.groupingUsed = enabled;
  378|      0|    touchNoError();
  379|      0|}
_ZN6icu_7813DecimalFormat19setParseIntegerOnlyEa:
  381|  56.1k|void DecimalFormat::setParseIntegerOnly(UBool value) {
  382|  56.1k|    if (fields == nullptr) {
  ------------------
  |  Branch (382:9): [True: 0, False: 56.1k]
  ------------------
  383|      0|        return;
  384|      0|    }
  385|  56.1k|    if (UBOOL_TO_BOOL(value) == fields->properties.parseIntegerOnly) { return; }
  ------------------
  |  |   39|  56.1k|#define UBOOL_TO_BOOL(b) b
  ------------------
  |  Branch (385:9): [True: 0, False: 56.1k]
  ------------------
  386|  56.1k|    NumberFormat::setParseIntegerOnly(value); // to set field for compatibility
  387|  56.1k|    fields->properties.parseIntegerOnly = value;
  388|  56.1k|    touchNoError();
  389|  56.1k|}
_ZN6icu_7813DecimalFormatC2ERKNS_13UnicodeStringERKNS_20DecimalFormatSymbolsER10UErrorCode:
  413|  21.2k|        : DecimalFormat(nullptr, status) {
  414|  21.2k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (414:9): [True: 0, False: 21.2k]
  ------------------
  415|  21.2k|    LocalPointer<DecimalFormatSymbols> dfs(new DecimalFormatSymbols(symbols), status);
  416|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (416:9): [True: 0, False: 21.2k]
  ------------------
  417|       |        // If we failed to allocate DecimalFormatSymbols, then release fields and its members.
  418|       |        // We must have a fully complete fields object, we cannot have partially populated members.
  419|      0|        delete fields;
  420|      0|        fields = nullptr;
  421|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  422|      0|        return;
  423|      0|    }
  424|  21.2k|    fields->symbols.adoptInstead(dfs.orphan());
  425|  21.2k|    setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status);
  426|  21.2k|    touch(status);
  427|  21.2k|}
_ZN6icu_7813DecimalFormatC2ERKS0_:
  429|  77.3k|DecimalFormat::DecimalFormat(const DecimalFormat& source) : NumberFormat(source) {
  430|       |    // If the object that we are copying from is invalid, no point in going further.
  431|  77.3k|    if (source.fields == nullptr) {
  ------------------
  |  Branch (431:9): [True: 0, False: 77.3k]
  ------------------
  432|      0|        return;
  433|      0|    }
  434|       |    // Note: it is not safe to copy fields->formatter or fWarehouse directly because fields->formatter might have
  435|       |    // dangling pointers to fields inside fWarehouse. The safe thing is to re-construct fields->formatter from
  436|       |    // the property bag, despite being somewhat slower.
  437|  77.3k|    fields = new DecimalFormatFields(source.fields->properties);
  438|  77.3k|    if (fields == nullptr) {
  ------------------
  |  Branch (438:9): [True: 0, False: 77.3k]
  ------------------
  439|      0|        return; // no way to report an error.
  440|      0|    }
  441|  77.3k|    UErrorCode status = U_ZERO_ERROR;
  442|  77.3k|    fields->symbols.adoptInsteadAndCheckErrorCode(new DecimalFormatSymbols(*source.getDecimalFormatSymbols()), status);
  443|       |    // In order to simplify error handling logic in the various getters/setters/etc, we do not allow
  444|       |    // any partially populated DecimalFormatFields object. We must have a fully complete fields object
  445|       |    // or else we set it to nullptr.
  446|  77.3k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (446:9): [True: 0, False: 77.3k]
  ------------------
  447|      0|        delete fields;
  448|      0|        fields = nullptr;
  449|      0|        return;
  450|      0|    }
  451|  77.3k|    touch(status);
  452|  77.3k|}
_ZN6icu_7813DecimalFormatD2Ev:
  480|  98.5k|DecimalFormat::~DecimalFormat() {
  481|  98.5k|    if (fields == nullptr) { return; }
  ------------------
  |  Branch (481:9): [True: 0, False: 98.5k]
  ------------------
  482|       |
  483|  98.5k|    delete fields->atomicParser.exchange(nullptr);
  484|  98.5k|    delete fields->atomicCurrencyParser.exchange(nullptr);
  485|  98.5k|    delete fields;
  486|  98.5k|}
_ZNK6icu_7813DecimalFormat5cloneEv:
  488|  77.3k|DecimalFormat* DecimalFormat::clone() const {
  489|       |    // can only clone valid objects.
  490|  77.3k|    if (fields == nullptr) {
  ------------------
  |  Branch (490:9): [True: 0, False: 77.3k]
  ------------------
  491|      0|        return nullptr;
  492|      0|    }
  493|  77.3k|    LocalPointer<DecimalFormat> df(new DecimalFormat(*this));
  494|  77.3k|    if (df.isValid() && df->fields != nullptr) {
  ------------------
  |  Branch (494:9): [True: 77.3k, False: 0]
  |  Branch (494:25): [True: 77.3k, False: 0]
  ------------------
  495|  77.3k|        return df.orphan();
  496|  77.3k|    }
  497|      0|    return nullptr;
  498|  77.3k|}
_ZNK6icu_7813DecimalFormat23getDecimalFormatSymbolsEv:
  793|   443k|const DecimalFormatSymbols* DecimalFormat::getDecimalFormatSymbols() const {
  794|   443k|    if (fields == nullptr) {
  ------------------
  |  Branch (794:9): [True: 0, False: 443k]
  ------------------
  795|      0|        return nullptr;
  796|      0|    }
  797|   443k|    if (!fields->symbols.isNull()) {
  ------------------
  |  Branch (797:9): [True: 98.5k, False: 344k]
  ------------------
  798|  98.5k|        return fields->symbols.getAlias();
  799|   344k|    } else {
  800|   344k|        return fields->formatter.getDecimalFormatSymbols();
  801|   344k|    }
  802|   443k|}
_ZN6icu_7813DecimalFormat30setDecimalSeparatorAlwaysShownEa:
 1238|  56.1k|void DecimalFormat::setDecimalSeparatorAlwaysShown(UBool newValue) {
 1239|  56.1k|    if (fields == nullptr) { return; }
  ------------------
  |  Branch (1239:9): [True: 0, False: 56.1k]
  ------------------
 1240|  56.1k|    if (UBOOL_TO_BOOL(newValue) == fields->properties.decimalSeparatorAlwaysShown) { return; }
  ------------------
  |  |   39|  56.1k|#define UBOOL_TO_BOOL(b) b
  ------------------
  |  Branch (1240:9): [True: 56.1k, False: 0]
  ------------------
 1241|      0|    fields->properties.decimalSeparatorAlwaysShown = newValue;
 1242|      0|    touchNoError();
 1243|      0|}
_ZN6icu_7813DecimalFormat24setMinimumFractionDigitsEi:
 1427|  56.1k|void DecimalFormat::setMinimumFractionDigits(int32_t newValue) {
 1428|  56.1k|    if (fields == nullptr) { return; }
  ------------------
  |  Branch (1428:9): [True: 0, False: 56.1k]
  ------------------
 1429|  56.1k|    if (newValue == fields->properties.minimumFractionDigits) { return; }
  ------------------
  |  Branch (1429:9): [True: 56.1k, False: 0]
  ------------------
 1430|       |    // For backwards compatibility, conflicting min/max need to keep the most recent setting.
 1431|      0|    int32_t max = fields->properties.maximumFractionDigits;
 1432|      0|    if (max >= 0 && max < newValue) {
  ------------------
  |  Branch (1432:9): [True: 0, False: 0]
  |  Branch (1432:21): [True: 0, False: 0]
  ------------------
 1433|      0|        fields->properties.maximumFractionDigits = newValue;
 1434|      0|    }
 1435|      0|    fields->properties.minimumFractionDigits = newValue;
 1436|      0|    touchNoError();
 1437|      0|}
_ZN6icu_7813DecimalFormat5touchER10UErrorCode:
 1603|   154k|void DecimalFormat::touch(UErrorCode& status) {
 1604|   154k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1604:9): [True: 0, False: 154k]
  ------------------
 1605|      0|        return;
 1606|      0|    }
 1607|   154k|    if (fields == nullptr) {
  ------------------
  |  Branch (1607:9): [True: 0, False: 154k]
  ------------------
 1608|       |        // We only get here if an OOM error happened during construction, copy construction, assignment, or modification.
 1609|       |        // For regular construction, the caller should have checked the status variable for errors.
 1610|       |        // For copy construction, there is unfortunately nothing to report the error, so we need to guard against
 1611|       |        // this possible bad state here and set the status to an error.
 1612|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1613|      0|        return;
 1614|      0|    }
 1615|       |
 1616|       |    // In C++, fields->symbols (or, if it's null, the DecimalFormatSymbols owned by the underlying LocalizedNumberFormatter)
 1617|       |    // is the source of truth for the locale.
 1618|   154k|    const DecimalFormatSymbols* symbols = getDecimalFormatSymbols();
 1619|   154k|    Locale locale = symbols->getLocale();
 1620|       |    
 1621|       |    // Note: The formatter is relatively cheap to create, and we need it to populate fields->exportedProperties,
 1622|       |    // so automatically recompute it here. The parser is a bit more expensive and is not needed until the
 1623|       |    // parse method is called, so defer that until needed.
 1624|       |    // TODO: Only update the pieces that changed instead of re-computing the whole formatter?
 1625|       | 
 1626|       |    // Since memory has already been allocated for the formatter, we can move assign a stack-allocated object
 1627|       |    // and don't need to call new. (Which is slower and could possibly fail).
 1628|       |    // [Note that "symbols" above might point to the DecimalFormatSymbols object owned by fields->formatter.
 1629|       |    // That's okay, because NumberPropertyMapper::create() will clone it before fields->formatter's assignment
 1630|       |    // operator deletes it.  But it does mean that "symbols" can't be counted on to be good after this line.]
 1631|   154k|    fields->formatter = NumberPropertyMapper::create(
 1632|   154k|        fields->properties, *symbols, fields->warehouse, fields->exportedProperties, status
 1633|   154k|    ).locale(locale);
 1634|   154k|    fields->symbols.adoptInstead(nullptr); // the fields->symbols property is only temporary, until we can copy it into a new LocalizedNumberFormatter
 1635|       |    
 1636|       |    // Do this after fields->exportedProperties are set up
 1637|   154k|    setupFastFormat();
 1638|       |
 1639|       |    // Delete the parsers if they were made previously
 1640|   154k|    delete fields->atomicParser.exchange(nullptr);
 1641|   154k|    delete fields->atomicCurrencyParser.exchange(nullptr);
 1642|       |
 1643|       |    // In order for the getters to work, we need to populate some fields in NumberFormat.
 1644|   154k|    NumberFormat::setCurrency(fields->exportedProperties.currency.get(status).getISOCurrency(), status);
 1645|   154k|    NumberFormat::setMaximumIntegerDigits(fields->exportedProperties.maximumIntegerDigits);
 1646|   154k|    NumberFormat::setMinimumIntegerDigits(fields->exportedProperties.minimumIntegerDigits);
 1647|   154k|    NumberFormat::setMaximumFractionDigits(fields->exportedProperties.maximumFractionDigits);
 1648|   154k|    NumberFormat::setMinimumFractionDigits(fields->exportedProperties.minimumFractionDigits);
 1649|       |    // fImpl->properties, not fields->exportedProperties, since this information comes from the pattern:
 1650|   154k|    NumberFormat::setGroupingUsed(fields->properties.groupingUsed);
 1651|   154k|}
_ZN6icu_7813DecimalFormat12touchNoErrorEv:
 1653|  56.1k|void DecimalFormat::touchNoError() {
 1654|  56.1k|    UErrorCode localStatus = U_ZERO_ERROR;
 1655|  56.1k|    touch(localStatus);
 1656|  56.1k|}
_ZN6icu_7813DecimalFormat24setPropertiesFromPatternERKNS_13UnicodeStringEiR10UErrorCode:
 1659|  21.2k|                                             UErrorCode& status) {
 1660|  21.2k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1660:9): [True: 21.2k, False: 0]
  ------------------
 1661|       |        // Cast workaround to get around putting the enum in the public header file
 1662|  21.2k|        auto actualIgnoreRounding = static_cast<IgnoreRounding>(ignoreRounding);
 1663|  21.2k|        PatternParser::parseToExistingProperties(pattern, fields->properties,  actualIgnoreRounding, status);
 1664|  21.2k|    }
 1665|  21.2k|}
_ZN6icu_7813DecimalFormat15setupFastFormatEv:
 1767|   154k|void DecimalFormat::setupFastFormat() {
 1768|       |    // Check the majority of properties:
 1769|   154k|    if (!fields->properties.equalsDefaultExceptFastFormat()) {
  ------------------
  |  Branch (1769:9): [True: 0, False: 154k]
  ------------------
 1770|      0|        trace("no fast format: equality\n");
  ------------------
  |  | 1765|      0|#define trace(x) void(x)
  ------------------
 1771|      0|        fields->canUseFastFormat = false;
 1772|      0|        return;
 1773|      0|    }
 1774|       |
 1775|       |    // Now check the remaining properties.
 1776|       |    // Nontrivial affixes:
 1777|   154k|    UBool trivialPP = fields->properties.positivePrefixPattern.isEmpty();
 1778|   154k|    UBool trivialPS = fields->properties.positiveSuffixPattern.isEmpty();
 1779|   154k|    UBool trivialNP = fields->properties.negativePrefixPattern.isBogus() || (
  ------------------
  |  Branch (1779:23): [True: 154k, False: 0]
  ------------------
 1780|      0|            fields->properties.negativePrefixPattern.length() == 1 &&
  ------------------
  |  Branch (1780:13): [True: 0, False: 0]
  ------------------
 1781|      0|            fields->properties.negativePrefixPattern.charAt(0) == u'-');
  ------------------
  |  Branch (1781:13): [True: 0, False: 0]
  ------------------
 1782|   154k|    UBool trivialNS = fields->properties.negativeSuffixPattern.isEmpty();
 1783|   154k|    if (!trivialPP || !trivialPS || !trivialNP || !trivialNS) {
  ------------------
  |  Branch (1783:9): [True: 0, False: 154k]
  |  Branch (1783:23): [True: 0, False: 154k]
  |  Branch (1783:37): [True: 0, False: 154k]
  |  Branch (1783:51): [True: 0, False: 154k]
  ------------------
 1784|      0|        trace("no fast format: affixes\n");
  ------------------
  |  | 1765|      0|#define trace(x) void(x)
  ------------------
 1785|      0|        fields->canUseFastFormat = false;
 1786|      0|        return;
 1787|      0|    }
 1788|       |
 1789|   154k|    const DecimalFormatSymbols* symbols = getDecimalFormatSymbols();
 1790|       |    
 1791|       |    // Grouping (secondary grouping is forbidden in equalsDefaultExceptFastFormat):
 1792|   154k|    bool groupingUsed = fields->properties.groupingUsed;
 1793|   154k|    int32_t groupingSize = fields->properties.groupingSize;
 1794|   154k|    bool unusualGroupingSize = groupingSize > 0 && groupingSize != 3;
  ------------------
  |  Branch (1794:32): [True: 21.2k, False: 133k]
  |  Branch (1794:52): [True: 0, False: 21.2k]
  ------------------
 1795|   154k|    const UnicodeString& groupingString = symbols->getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol);
 1796|   154k|    if (groupingUsed && (unusualGroupingSize || groupingString.length() != 1)) {
  ------------------
  |  Branch (1796:9): [True: 21.2k, False: 133k]
  |  Branch (1796:26): [True: 0, False: 21.2k]
  |  Branch (1796:49): [True: 0, False: 21.2k]
  ------------------
 1797|      0|        trace("no fast format: grouping\n");
  ------------------
  |  | 1765|      0|#define trace(x) void(x)
  ------------------
 1798|      0|        fields->canUseFastFormat = false;
 1799|      0|        return;
 1800|      0|    }
 1801|       |
 1802|       |    // Integer length:
 1803|   154k|    int32_t minInt = fields->exportedProperties.minimumIntegerDigits;
 1804|   154k|    int32_t maxInt = fields->exportedProperties.maximumIntegerDigits;
 1805|       |    // Fastpath supports up to only 10 digits (length of INT32_MIN)
 1806|   154k|    if (minInt > 10) {
  ------------------
  |  Branch (1806:9): [True: 0, False: 154k]
  ------------------
 1807|      0|        trace("no fast format: integer\n");
  ------------------
  |  | 1765|      0|#define trace(x) void(x)
  ------------------
 1808|      0|        fields->canUseFastFormat = false;
 1809|      0|        return;
 1810|      0|    }
 1811|       |
 1812|       |    // Fraction length (no fraction part allowed in fast path):
 1813|   154k|    int32_t minFrac = fields->exportedProperties.minimumFractionDigits;
 1814|   154k|    if (minFrac > 0) {
  ------------------
  |  Branch (1814:9): [True: 0, False: 154k]
  ------------------
 1815|      0|        trace("no fast format: fraction\n");
  ------------------
  |  | 1765|      0|#define trace(x) void(x)
  ------------------
 1816|      0|        fields->canUseFastFormat = false;
 1817|      0|        return;
 1818|      0|    }
 1819|       |
 1820|       |    // Other symbols:
 1821|   154k|    const UnicodeString& minusSignString = symbols->getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol);
 1822|   154k|    UChar32 codePointZero = symbols->getCodePointZero();
 1823|   154k|    if (minusSignString.length() != 1 || U16_LENGTH(codePointZero) != 1) {
  ------------------
  |  |  141|   154k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 154k, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1823:9): [True: 0, False: 154k]
  |  Branch (1823:42): [True: 0, False: 154k]
  ------------------
 1824|      0|        trace("no fast format: symbols\n");
  ------------------
  |  | 1765|      0|#define trace(x) void(x)
  ------------------
 1825|      0|        fields->canUseFastFormat = false;
 1826|      0|        return;
 1827|      0|    }
 1828|       |
 1829|       |    // Good to go!
 1830|   154k|    trace("can use fast format!\n");
  ------------------
  |  | 1765|   154k|#define trace(x) void(x)
  ------------------
 1831|   154k|    fields->canUseFastFormat = true;
 1832|   154k|    fields->fastData.cpZero = static_cast<char16_t>(codePointZero);
 1833|   154k|    fields->fastData.cpGroupingSeparator = groupingUsed && groupingSize == 3 ? groupingString.charAt(0) : 0;
  ------------------
  |  Branch (1833:44): [True: 21.2k, False: 133k]
  |  Branch (1833:60): [True: 21.2k, False: 0]
  ------------------
 1834|   154k|    fields->fastData.cpMinusSign = minusSignString.charAt(0);
 1835|   154k|    fields->fastData.minInt = (minInt < 0 || minInt > 127) ? 0 : static_cast<int8_t>(minInt);
  ------------------
  |  Branch (1835:32): [True: 0, False: 154k]
  |  Branch (1835:46): [True: 0, False: 154k]
  ------------------
 1836|   154k|    fields->fastData.maxInt = (maxInt < 0 || maxInt > 127) ? 127 : static_cast<int8_t>(maxInt);
  ------------------
  |  Branch (1836:32): [True: 0, False: 154k]
  |  Branch (1836:46): [True: 154k, False: 0]
  ------------------
 1837|   154k|}

_ZN6icu_7823SharedDateFormatSymbolsD2Ev:
  199|      1|SharedDateFormatSymbols::~SharedDateFormatSymbols() {
  200|      1|}
_ZNK6icu_7814LocaleCacheKeyINS_23SharedDateFormatSymbolsEE12createObjectEPKvR10UErrorCode:
  205|      2|                const void * /*unusedContext*/, UErrorCode &status) const {
  206|      2|    char type[256];
  207|      2|    Calendar::getCalendarTypeFromLocale(fLoc, type, UPRV_LENGTHOF(type), status);
  ------------------
  |  |   99|      2|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  208|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (208:9): [True: 0, False: 2]
  ------------------
  209|      0|        return nullptr;
  210|      0|    }
  211|      2|    SharedDateFormatSymbols *shared
  212|      2|            = new SharedDateFormatSymbols(fLoc, type, status);
  213|      2|    if (shared == nullptr) {
  ------------------
  |  Branch (213:9): [True: 0, False: 2]
  ------------------
  214|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  215|      0|        return nullptr;
  216|      0|    }
  217|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (217:9): [True: 0, False: 2]
  ------------------
  218|      0|        delete shared;
  219|      0|        return nullptr;
  220|      0|    }
  221|      2|    shared->addRef();
  222|      2|    return shared;
  223|      2|}
_ZN6icu_7817DateFormatSymbols15createForLocaleERKNS_6LocaleER10UErrorCode:
  277|  56.1k|        const Locale& locale, UErrorCode &status) {
  278|  56.1k|    const SharedDateFormatSymbols *shared = nullptr;
  279|  56.1k|    UnifiedCache::getByLocale(locale, shared, status);
  280|  56.1k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (280:9): [True: 0, False: 56.1k]
  ------------------
  281|      0|        return nullptr;
  282|      0|    }
  283|  56.1k|    DateFormatSymbols *result = new DateFormatSymbols(shared->get());
  284|  56.1k|    shared->removeRef();
  285|  56.1k|    if (result == nullptr) {
  ------------------
  |  Branch (285:9): [True: 0, False: 56.1k]
  ------------------
  286|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  287|      0|        return nullptr;
  288|      0|    }
  289|  56.1k|    return result;
  290|  56.1k|}
_ZN6icu_7817DateFormatSymbolsC2ERKNS_6LocaleEPKcR10UErrorCode:
  309|      2|    : UObject()
  310|      2|{
  311|      2|  initializeData(locale, type,  status);
  312|      2|}
_ZN6icu_7817DateFormatSymbolsC2ERKS0_:
  321|  56.1k|    : UObject(other)
  322|  56.1k|{
  323|  56.1k|    copyData(other);
  324|  56.1k|}
_ZN6icu_7817DateFormatSymbols11assignArrayERPNS_13UnicodeStringERiPKS1_i:
  331|  1.74M|{
  332|       |    // assignArray() is only called by copyData() and initializeData(), which in turn
  333|       |    // implements the copy constructor and the assignment operator.
  334|       |    // All strings in a DateFormatSymbols object are created in one of the following
  335|       |    // three ways that all allow to safely use UnicodeString::fastCopyFrom():
  336|       |    // - readonly-aliases from resource bundles
  337|       |    // - readonly-aliases or allocated strings from constants
  338|       |    // - safely cloned strings (with owned buffers) from setXYZ() functions
  339|       |    //
  340|       |    // Note that this is true for as long as DateFormatSymbols can be constructed
  341|       |    // only from a locale bundle or set via the cloning API,
  342|       |    // *and* for as long as all the strings are in *private* fields, preventing
  343|       |    // a subclass from creating these strings in an "unsafe" way (with respect to fastCopyFrom()).
  344|  1.74M|    if(srcArray == nullptr) {
  ------------------
  |  Branch (344:8): [True: 0, False: 1.74M]
  ------------------
  345|       |        // Do not attempt to copy bogus input (which will crash).
  346|       |        // Note that this assignArray method already had the potential to return a null dstArray;
  347|       |        // see handling below for "if(dstArray != nullptr)".
  348|      0|        dstCount = 0;
  349|      0|        dstArray = nullptr;
  350|      0|        return;
  351|      0|    }
  352|  1.74M|    dstCount = srcCount;
  353|  1.74M|    dstArray = newUnicodeStringArray(srcCount);
  354|  1.74M|    if(dstArray != nullptr) {
  ------------------
  |  Branch (354:8): [True: 1.74M, False: 0]
  ------------------
  355|  1.74M|        int32_t i;
  356|  14.6M|        for(i=0; i<srcCount; ++i) {
  ------------------
  |  Branch (356:18): [True: 12.9M, False: 1.74M]
  ------------------
  357|  12.9M|            dstArray[i].fastCopyFrom(srcArray[i]);
  358|  12.9M|        }
  359|  1.74M|    }
  360|  1.74M|}
_ZN6icu_7817DateFormatSymbols8copyDataERKS0_:
  402|  56.1k|DateFormatSymbols::copyData(const DateFormatSymbols& other) {
  403|  56.1k|    UErrorCode status = U_ZERO_ERROR;
  404|  56.1k|    U_LOCALE_BASED(locBased, *this);
  ------------------
  |  |   25|  56.1k|  LocaleBased varname((objname).validLocale, (objname).actualLocale)
  ------------------
  405|  56.1k|    locBased.setLocaleIDs(other.validLocale, other.actualLocale, status);
  406|  56.1k|    U_ASSERT(U_SUCCESS(status));
  ------------------
  |  |   35|  56.1k|#   define U_ASSERT(exp) (void)0
  ------------------
  407|  56.1k|    assignArray(fEras, fErasCount, other.fEras, other.fErasCount);
  408|  56.1k|    assignArray(fEraNames, fEraNamesCount, other.fEraNames, other.fEraNamesCount);
  409|  56.1k|    assignArray(fNarrowEras, fNarrowErasCount, other.fNarrowEras, other.fNarrowErasCount);
  410|  56.1k|    assignArray(fMonths, fMonthsCount, other.fMonths, other.fMonthsCount);
  411|  56.1k|    assignArray(fShortMonths, fShortMonthsCount, other.fShortMonths, other.fShortMonthsCount);
  412|  56.1k|    assignArray(fNarrowMonths, fNarrowMonthsCount, other.fNarrowMonths, other.fNarrowMonthsCount);
  413|  56.1k|    assignArray(fStandaloneMonths, fStandaloneMonthsCount, other.fStandaloneMonths, other.fStandaloneMonthsCount);
  414|  56.1k|    assignArray(fStandaloneShortMonths, fStandaloneShortMonthsCount, other.fStandaloneShortMonths, other.fStandaloneShortMonthsCount);
  415|  56.1k|    assignArray(fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, other.fStandaloneNarrowMonths, other.fStandaloneNarrowMonthsCount);
  416|  56.1k|    assignArray(fWeekdays, fWeekdaysCount, other.fWeekdays, other.fWeekdaysCount);
  417|  56.1k|    assignArray(fShortWeekdays, fShortWeekdaysCount, other.fShortWeekdays, other.fShortWeekdaysCount);
  418|  56.1k|    assignArray(fShorterWeekdays, fShorterWeekdaysCount, other.fShorterWeekdays, other.fShorterWeekdaysCount);
  419|  56.1k|    assignArray(fNarrowWeekdays, fNarrowWeekdaysCount, other.fNarrowWeekdays, other.fNarrowWeekdaysCount);
  420|  56.1k|    assignArray(fStandaloneWeekdays, fStandaloneWeekdaysCount, other.fStandaloneWeekdays, other.fStandaloneWeekdaysCount);
  421|  56.1k|    assignArray(fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, other.fStandaloneShortWeekdays, other.fStandaloneShortWeekdaysCount);
  422|  56.1k|    assignArray(fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount, other.fStandaloneShorterWeekdays, other.fStandaloneShorterWeekdaysCount);
  423|  56.1k|    assignArray(fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, other.fStandaloneNarrowWeekdays, other.fStandaloneNarrowWeekdaysCount);
  424|  56.1k|    assignArray(fAmPms, fAmPmsCount, other.fAmPms, other.fAmPmsCount);
  425|  56.1k|    assignArray(fNarrowAmPms, fNarrowAmPmsCount, other.fNarrowAmPms, other.fNarrowAmPmsCount );
  426|  56.1k|    fTimeSeparator.fastCopyFrom(other.fTimeSeparator);  // fastCopyFrom() - see assignArray comments
  427|  56.1k|    assignArray(fQuarters, fQuartersCount, other.fQuarters, other.fQuartersCount);
  428|  56.1k|    assignArray(fShortQuarters, fShortQuartersCount, other.fShortQuarters, other.fShortQuartersCount);
  429|  56.1k|    assignArray(fNarrowQuarters, fNarrowQuartersCount, other.fNarrowQuarters, other.fNarrowQuartersCount);
  430|  56.1k|    assignArray(fStandaloneQuarters, fStandaloneQuartersCount, other.fStandaloneQuarters, other.fStandaloneQuartersCount);
  431|  56.1k|    assignArray(fStandaloneShortQuarters, fStandaloneShortQuartersCount, other.fStandaloneShortQuarters, other.fStandaloneShortQuartersCount);
  432|  56.1k|    assignArray(fStandaloneNarrowQuarters, fStandaloneNarrowQuartersCount, other.fStandaloneNarrowQuarters, other.fStandaloneNarrowQuartersCount);
  433|  56.1k|    assignArray(fWideDayPeriods, fWideDayPeriodsCount,
  434|  56.1k|                other.fWideDayPeriods, other.fWideDayPeriodsCount);
  435|  56.1k|    assignArray(fNarrowDayPeriods, fNarrowDayPeriodsCount,
  436|  56.1k|                other.fNarrowDayPeriods, other.fNarrowDayPeriodsCount);
  437|  56.1k|    assignArray(fAbbreviatedDayPeriods, fAbbreviatedDayPeriodsCount,
  438|  56.1k|                other.fAbbreviatedDayPeriods, other.fAbbreviatedDayPeriodsCount);
  439|  56.1k|    assignArray(fStandaloneWideDayPeriods, fStandaloneWideDayPeriodsCount,
  440|  56.1k|                other.fStandaloneWideDayPeriods, other.fStandaloneWideDayPeriodsCount);
  441|  56.1k|    assignArray(fStandaloneNarrowDayPeriods, fStandaloneNarrowDayPeriodsCount,
  442|  56.1k|                other.fStandaloneNarrowDayPeriods, other.fStandaloneNarrowDayPeriodsCount);
  443|  56.1k|    assignArray(fStandaloneAbbreviatedDayPeriods, fStandaloneAbbreviatedDayPeriodsCount,
  444|  56.1k|                other.fStandaloneAbbreviatedDayPeriods, other.fStandaloneAbbreviatedDayPeriodsCount);
  445|  56.1k|    if (other.fLeapMonthPatterns != nullptr) {
  ------------------
  |  Branch (445:9): [True: 0, False: 56.1k]
  ------------------
  446|      0|        assignArray(fLeapMonthPatterns, fLeapMonthPatternsCount, other.fLeapMonthPatterns, other.fLeapMonthPatternsCount);
  447|  56.1k|    } else {
  448|  56.1k|        fLeapMonthPatterns = nullptr;
  449|  56.1k|        fLeapMonthPatternsCount = 0;
  450|  56.1k|    }
  451|  56.1k|    if (other.fShortYearNames != nullptr) {
  ------------------
  |  Branch (451:9): [True: 0, False: 56.1k]
  ------------------
  452|      0|        assignArray(fShortYearNames, fShortYearNamesCount, other.fShortYearNames, other.fShortYearNamesCount);
  453|  56.1k|    } else {
  454|  56.1k|        fShortYearNames = nullptr;
  455|  56.1k|        fShortYearNamesCount = 0;
  456|  56.1k|    }
  457|  56.1k|    if (other.fShortZodiacNames != nullptr) {
  ------------------
  |  Branch (457:9): [True: 0, False: 56.1k]
  ------------------
  458|      0|        assignArray(fShortZodiacNames, fShortZodiacNamesCount, other.fShortZodiacNames, other.fShortZodiacNamesCount);
  459|  56.1k|    } else {
  460|  56.1k|        fShortZodiacNames = nullptr;
  461|  56.1k|        fShortZodiacNamesCount = 0;
  462|  56.1k|    }
  463|       |
  464|  56.1k|    if (other.fZoneStrings != nullptr) {
  ------------------
  |  Branch (464:9): [True: 0, False: 56.1k]
  ------------------
  465|      0|        fZoneStringsColCount = other.fZoneStringsColCount;
  466|      0|        fZoneStringsRowCount = other.fZoneStringsRowCount;
  467|      0|        createZoneStrings((const UnicodeString**)other.fZoneStrings);
  468|       |
  469|  56.1k|    } else {
  470|  56.1k|        fZoneStrings = nullptr;
  471|  56.1k|        fZoneStringsColCount = 0;
  472|  56.1k|        fZoneStringsRowCount = 0;
  473|  56.1k|    }
  474|  56.1k|    fZSFLocale = other.fZSFLocale;
  475|       |    // Other zone strings data is created on demand
  476|  56.1k|    fLocaleZoneStrings = nullptr;
  477|       |
  478|       |    // fastCopyFrom() - see assignArray comments
  479|  56.1k|    fLocalPatternChars.fastCopyFrom(other.fLocalPatternChars);
  480|       |
  481|  56.1k|    uprv_memcpy(fCapitalization, other.fCapitalization, sizeof(fCapitalization));
  ------------------
  |  |   42|  56.1k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  56.1k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  56.1k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  56.1k|    _Pragma("clang diagnostic push") \
  |  |   45|  56.1k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  56.1k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  56.1k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  56.1k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  56.1k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  56.1k|    _Pragma("clang diagnostic pop") \
  |  |   49|  56.1k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  56.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  56.1k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  56.1k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  482|  56.1k|}
_ZN6icu_7817DateFormatSymbolsD2Ev:
  497|  56.1k|{
  498|  56.1k|    dispose();
  499|  56.1k|    delete actualLocale;
  500|  56.1k|    delete validLocale;
  501|  56.1k|}
_ZN6icu_7817DateFormatSymbols7disposeEv:
  504|  56.1k|{
  505|  56.1k|    delete[] fEras;
  506|  56.1k|    delete[] fEraNames;
  507|  56.1k|    delete[] fNarrowEras;
  508|  56.1k|    delete[] fMonths;
  509|  56.1k|    delete[] fShortMonths;
  510|  56.1k|    delete[] fNarrowMonths;
  511|  56.1k|    delete[] fStandaloneMonths;
  512|  56.1k|    delete[] fStandaloneShortMonths;
  513|  56.1k|    delete[] fStandaloneNarrowMonths;
  514|  56.1k|    delete[] fWeekdays;
  515|  56.1k|    delete[] fShortWeekdays;
  516|  56.1k|    delete[] fShorterWeekdays;
  517|  56.1k|    delete[] fNarrowWeekdays;
  518|  56.1k|    delete[] fStandaloneWeekdays;
  519|  56.1k|    delete[] fStandaloneShortWeekdays;
  520|  56.1k|    delete[] fStandaloneShorterWeekdays;
  521|  56.1k|    delete[] fStandaloneNarrowWeekdays;
  522|  56.1k|    delete[] fAmPms;
  523|  56.1k|    delete[] fNarrowAmPms;
  524|  56.1k|    delete[] fQuarters;
  525|  56.1k|    delete[] fShortQuarters;
  526|  56.1k|    delete[] fNarrowQuarters;
  527|  56.1k|    delete[] fStandaloneQuarters;
  528|  56.1k|    delete[] fStandaloneShortQuarters;
  529|  56.1k|    delete[] fStandaloneNarrowQuarters;
  530|  56.1k|    delete[] fLeapMonthPatterns;
  531|  56.1k|    delete[] fShortYearNames;
  532|  56.1k|    delete[] fShortZodiacNames;
  533|  56.1k|    delete[] fAbbreviatedDayPeriods;
  534|  56.1k|    delete[] fWideDayPeriods;
  535|  56.1k|    delete[] fNarrowDayPeriods;
  536|  56.1k|    delete[] fStandaloneAbbreviatedDayPeriods;
  537|  56.1k|    delete[] fStandaloneWideDayPeriods;
  538|  56.1k|    delete[] fStandaloneNarrowDayPeriods;
  539|       |
  540|  56.1k|    delete actualLocale;
  541|  56.1k|    actualLocale = nullptr;
  542|  56.1k|    delete validLocale;
  543|  56.1k|    validLocale = nullptr;
  544|  56.1k|    disposeZoneStrings();
  545|  56.1k|}
_ZN6icu_7817DateFormatSymbols18disposeZoneStringsEv:
  548|  56.1k|{
  549|  56.1k|    if (fZoneStrings) {
  ------------------
  |  Branch (549:9): [True: 0, False: 56.1k]
  ------------------
  550|      0|        for (int32_t row = 0; row < fZoneStringsRowCount; ++row) {
  ------------------
  |  Branch (550:31): [True: 0, False: 0]
  ------------------
  551|      0|            delete[] fZoneStrings[row];
  552|      0|        }
  553|      0|        uprv_free(fZoneStrings);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  554|      0|    }
  555|  56.1k|    if (fLocaleZoneStrings) {
  ------------------
  |  Branch (555:9): [True: 0, False: 56.1k]
  ------------------
  556|      0|        for (int32_t row = 0; row < fZoneStringsRowCount; ++row) {
  ------------------
  |  Branch (556:31): [True: 0, False: 0]
  ------------------
  557|      0|            delete[] fLocaleZoneStrings[row];
  558|      0|        }
  559|      0|        uprv_free(fLocaleZoneStrings);
  ------------------
  |  | 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|    }
  561|       |
  562|  56.1k|    fZoneStrings = nullptr;
  563|  56.1k|    fLocaleZoneStrings = nullptr;
  564|  56.1k|    fZoneStringsRowCount = 0;
  565|  56.1k|    fZoneStringsColCount = 0;
  566|  56.1k|}
_ZN6icu_7817DateFormatSymbols14initializeDataERKNS_6LocaleEPKcR10UErrorCodea:
 2022|      2|{
 2023|      2|    int32_t len = 0;
 2024|       |    /* In case something goes wrong, initialize all of the data to nullptr. */
 2025|      2|    fEras = nullptr;
 2026|      2|    fErasCount = 0;
 2027|      2|    fEraNames = nullptr;
 2028|      2|    fEraNamesCount = 0;
 2029|      2|    fNarrowEras = nullptr;
 2030|      2|    fNarrowErasCount = 0;
 2031|      2|    fMonths = nullptr;
 2032|      2|    fMonthsCount=0;
 2033|      2|    fShortMonths = nullptr;
 2034|      2|    fShortMonthsCount=0;
 2035|      2|    fNarrowMonths = nullptr;
 2036|      2|    fNarrowMonthsCount=0;
 2037|      2|    fStandaloneMonths = nullptr;
 2038|      2|    fStandaloneMonthsCount=0;
 2039|      2|    fStandaloneShortMonths = nullptr;
 2040|      2|    fStandaloneShortMonthsCount=0;
 2041|      2|    fStandaloneNarrowMonths = nullptr;
 2042|      2|    fStandaloneNarrowMonthsCount=0;
 2043|      2|    fWeekdays = nullptr;
 2044|      2|    fWeekdaysCount=0;
 2045|      2|    fShortWeekdays = nullptr;
 2046|      2|    fShortWeekdaysCount=0;
 2047|      2|    fShorterWeekdays = nullptr;
 2048|      2|    fShorterWeekdaysCount=0;
 2049|      2|    fNarrowWeekdays = nullptr;
 2050|      2|    fNarrowWeekdaysCount=0;
 2051|      2|    fStandaloneWeekdays = nullptr;
 2052|      2|    fStandaloneWeekdaysCount=0;
 2053|      2|    fStandaloneShortWeekdays = nullptr;
 2054|      2|    fStandaloneShortWeekdaysCount=0;
 2055|      2|    fStandaloneShorterWeekdays = nullptr;
 2056|      2|    fStandaloneShorterWeekdaysCount=0;
 2057|      2|    fStandaloneNarrowWeekdays = nullptr;
 2058|      2|    fStandaloneNarrowWeekdaysCount=0;
 2059|      2|    fAmPms = nullptr;
 2060|      2|    fAmPmsCount=0;
 2061|      2|    fNarrowAmPms = nullptr;
 2062|      2|    fNarrowAmPmsCount=0;
 2063|      2|    fTimeSeparator.setToBogus();
 2064|      2|    fQuarters = nullptr;
 2065|      2|    fQuartersCount = 0;
 2066|      2|    fShortQuarters = nullptr;
 2067|      2|    fShortQuartersCount = 0;
 2068|      2|    fNarrowQuarters = nullptr;
 2069|      2|    fNarrowQuartersCount = 0;
 2070|      2|    fStandaloneQuarters = nullptr;
 2071|      2|    fStandaloneQuartersCount = 0;
 2072|      2|    fStandaloneShortQuarters = nullptr;
 2073|      2|    fStandaloneShortQuartersCount = 0;
 2074|      2|    fStandaloneNarrowQuarters = nullptr;
 2075|      2|    fStandaloneNarrowQuartersCount = 0;
 2076|      2|    fLeapMonthPatterns = nullptr;
 2077|      2|    fLeapMonthPatternsCount = 0;
 2078|      2|    fShortYearNames = nullptr;
 2079|      2|    fShortYearNamesCount = 0;
 2080|      2|    fShortZodiacNames = nullptr;
 2081|      2|    fShortZodiacNamesCount = 0;
 2082|      2|    fZoneStringsRowCount = 0;
 2083|      2|    fZoneStringsColCount = 0;
 2084|      2|    fZoneStrings = nullptr;
 2085|      2|    fLocaleZoneStrings = nullptr;
 2086|      2|    fAbbreviatedDayPeriods = nullptr;
 2087|      2|    fAbbreviatedDayPeriodsCount = 0;
 2088|      2|    fWideDayPeriods = nullptr;
 2089|      2|    fWideDayPeriodsCount = 0;
 2090|      2|    fNarrowDayPeriods = nullptr;
 2091|      2|    fNarrowDayPeriodsCount = 0;
 2092|      2|    fStandaloneAbbreviatedDayPeriods = nullptr;
 2093|      2|    fStandaloneAbbreviatedDayPeriodsCount = 0;
 2094|      2|    fStandaloneWideDayPeriods = nullptr;
 2095|      2|    fStandaloneWideDayPeriodsCount = 0;
 2096|      2|    fStandaloneNarrowDayPeriods = nullptr;
 2097|      2|    fStandaloneNarrowDayPeriodsCount = 0;
 2098|      2|    uprv_memset(fCapitalization, 0, sizeof(fCapitalization));
  ------------------
  |  |  100|      2|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|      2|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2099|       |
 2100|       |    // We need to preserve the requested locale for
 2101|       |    // lazy ZoneStringFormat instantiation.  ZoneStringFormat
 2102|       |    // is region sensitive, thus, bundle locale bundle's locale
 2103|       |    // is not sufficient.
 2104|      2|    fZSFLocale = locale;
 2105|       |
 2106|      2|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (2106:9): [True: 0, False: 2]
  ------------------
 2107|       |
 2108|       |    // Create a CalendarDataSink to process this data and the resource bundles
 2109|      2|    CalendarDataSink calendarSink(status);
 2110|      2|    LocalUResourceBundlePointer rb(ures_open(nullptr, locale.getBaseName(), &status));
  ------------------
  |  | 1691|      2|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2111|      2|    LocalUResourceBundlePointer cb(ures_getByKey(rb.getAlias(), gCalendarTag, nullptr, &status));
  ------------------
  |  | 1661|      2|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2112|       |
 2113|      2|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (2113:9): [True: 0, False: 2]
  ------------------
 2114|       |
 2115|       |    // Iterate over the resource bundle data following the fallbacks through different calendar types
 2116|      2|    UnicodeString calendarType((type != nullptr && *type != '\0')? type : gGregorianTag, -1, US_INV);
  ------------------
  |  |   98|      2|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  |  Branch (2116:33): [True: 2, False: 0]
  |  Branch (2116:52): [True: 2, False: 0]
  ------------------
 2117|      2|    while (!calendarType.isBogus()) {
  ------------------
  |  Branch (2117:12): [True: 2, False: 0]
  ------------------
 2118|      2|        CharString calendarTypeBuffer;
 2119|      2|        calendarTypeBuffer.appendInvariantChars(calendarType, status);
 2120|      2|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (2120:13): [True: 0, False: 2]
  ------------------
 2121|      2|        const char *calendarTypeCArray = calendarTypeBuffer.data();
 2122|       |
 2123|       |        // Enumerate this calendar type. If the calendar is not found fallback to gregorian
 2124|      2|        UErrorCode oldStatus = status;
 2125|      2|        LocalUResourceBundlePointer ctb(ures_getByKeyWithFallback(cb.getAlias(), calendarTypeCArray, nullptr, &status));
  ------------------
  |  | 1662|      2|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2126|      2|        if (status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (2126:13): [True: 0, False: 2]
  ------------------
 2127|      0|            if (uprv_strcmp(calendarTypeCArray, gGregorianTag) != 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (2127:17): [True: 0, False: 0]
  ------------------
 2128|      0|                calendarType.setTo(false, kGregorianTagUChar, UPRV_LENGTHOF(kGregorianTagUChar));
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 2129|      0|                calendarSink.visitAllResources();
 2130|      0|                status = oldStatus;
 2131|      0|                continue;
 2132|      0|            }
 2133|      0|            return;
 2134|      0|        }
 2135|       |
 2136|      2|        calendarSink.preEnumerate(calendarType);
 2137|      2|        ures_getAllItemsWithFallback(ctb.getAlias(), "", calendarSink, status);
  ------------------
  |  | 1658|      2|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2138|      2|        if (U_FAILURE(status)) break;
  ------------------
  |  Branch (2138:13): [True: 0, False: 2]
  ------------------
 2139|       |
 2140|       |        // Stop loading when gregorian was loaded
 2141|      2|        if (uprv_strcmp(calendarTypeCArray, gGregorianTag) == 0) {
  ------------------
  |  |   38|      2|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      2|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (2141:13): [True: 2, False: 0]
  ------------------
 2142|      2|            break;
 2143|      2|        }
 2144|       |
 2145|       |        // Get the next calendar type to process from the sink
 2146|      0|        calendarType = calendarSink.nextCalendarType;
 2147|       |
 2148|       |        // Gregorian is always the last fallback
 2149|      0|        if (calendarType.isBogus()) {
  ------------------
  |  Branch (2149:13): [True: 0, False: 0]
  ------------------
 2150|      0|            calendarType.setTo(false, kGregorianTagUChar, UPRV_LENGTHOF(kGregorianTagUChar));
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 2151|      0|            calendarSink.visitAllResources();
 2152|      0|        }
 2153|      0|    }
 2154|       |
 2155|       |    // CharString object to build paths
 2156|      2|    CharString path;
 2157|       |
 2158|       |    // Load Leap Month Patterns
 2159|      2|    UErrorCode tempStatus = status;
 2160|      2|    fLeapMonthPatterns = newUnicodeStringArray(kMonthPatternsCount);
 2161|      2|    if (fLeapMonthPatterns) {
  ------------------
  |  Branch (2161:9): [True: 2, False: 0]
  ------------------
 2162|      2|        initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternFormatWide, calendarSink,
 2163|      2|                             buildResourcePath(path, gMonthPatternsTag, gNamesFormatTag, gNamesWideTag, tempStatus), tempStatus);
 2164|      2|        initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternFormatAbbrev, calendarSink,
 2165|      2|                             buildResourcePath(path, gMonthPatternsTag, gNamesFormatTag, gNamesAbbrTag, tempStatus), tempStatus);
 2166|      2|        initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternFormatNarrow, calendarSink,
 2167|      2|                             buildResourcePath(path, gMonthPatternsTag, gNamesFormatTag, gNamesNarrowTag, tempStatus), tempStatus);
 2168|      2|        initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternStandaloneWide, calendarSink,
 2169|      2|                             buildResourcePath(path, gMonthPatternsTag, gNamesStandaloneTag, gNamesWideTag, tempStatus), tempStatus);
 2170|      2|        initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternStandaloneAbbrev, calendarSink,
 2171|      2|                             buildResourcePath(path, gMonthPatternsTag, gNamesStandaloneTag, gNamesAbbrTag, tempStatus), tempStatus);
 2172|      2|        initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternStandaloneNarrow, calendarSink,
 2173|      2|                             buildResourcePath(path, gMonthPatternsTag, gNamesStandaloneTag, gNamesNarrowTag, tempStatus), tempStatus);
 2174|      2|        initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternNumeric, calendarSink,
 2175|      2|                             buildResourcePath(path, gMonthPatternsTag, gNamesNumericTag, gNamesAllTag, tempStatus), tempStatus);
 2176|      2|        if (U_SUCCESS(tempStatus)) {
  ------------------
  |  Branch (2176:13): [True: 0, False: 2]
  ------------------
 2177|       |            // Hack to fix bad C inheritance for dangi monthPatterns (OK in J); this should be handled by aliases in root, but isn't.
 2178|       |            // The ordering of the following statements is important.
 2179|      0|            if (fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev].isEmpty()) {
  ------------------
  |  Branch (2179:17): [True: 0, False: 0]
  ------------------
 2180|      0|                fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatWide]);
 2181|      0|            }
 2182|      0|            if (fLeapMonthPatterns[kLeapMonthPatternFormatNarrow].isEmpty()) {
  ------------------
  |  Branch (2182:17): [True: 0, False: 0]
  ------------------
 2183|      0|                fLeapMonthPatterns[kLeapMonthPatternFormatNarrow].setTo(fLeapMonthPatterns[kLeapMonthPatternStandaloneNarrow]);
 2184|      0|            }
 2185|      0|            if (fLeapMonthPatterns[kLeapMonthPatternStandaloneWide].isEmpty()) {
  ------------------
  |  Branch (2185:17): [True: 0, False: 0]
  ------------------
 2186|      0|                fLeapMonthPatterns[kLeapMonthPatternStandaloneWide].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatWide]);
 2187|      0|            }
 2188|      0|            if (fLeapMonthPatterns[kLeapMonthPatternStandaloneAbbrev].isEmpty()) {
  ------------------
  |  Branch (2188:17): [True: 0, False: 0]
  ------------------
 2189|      0|                fLeapMonthPatterns[kLeapMonthPatternStandaloneAbbrev].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev]);
 2190|      0|            }
 2191|       |            // end of hack
 2192|      0|            fLeapMonthPatternsCount = kMonthPatternsCount;
 2193|      2|        } else {
 2194|      2|            delete[] fLeapMonthPatterns;
 2195|      2|            fLeapMonthPatterns = nullptr;
 2196|      2|        }
 2197|      2|    }
 2198|       |
 2199|       |    // Load cyclic names sets
 2200|      2|    tempStatus = status;
 2201|      2|    initField(&fShortYearNames, fShortYearNamesCount, calendarSink,
 2202|      2|              buildResourcePath(path, gCyclicNameSetsTag, gNameSetYearsTag, gNamesFormatTag, gNamesAbbrTag, tempStatus), tempStatus);
 2203|      2|    initField(&fShortZodiacNames, fShortZodiacNamesCount, calendarSink,
 2204|      2|              buildResourcePath(path, gCyclicNameSetsTag, gNameSetZodiacsTag, gNamesFormatTag, gNamesAbbrTag, tempStatus), tempStatus);
 2205|       |
 2206|       |    // Load context transforms and capitalization
 2207|      2|    tempStatus = U_ZERO_ERROR;
 2208|      2|    LocalUResourceBundlePointer localeBundle(ures_open(nullptr, locale.getName(), &tempStatus));
  ------------------
  |  | 1691|      2|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2209|      2|    if (U_SUCCESS(tempStatus)) {
  ------------------
  |  Branch (2209:9): [True: 2, False: 0]
  ------------------
 2210|      2|        LocalUResourceBundlePointer contextTransforms(ures_getByKeyWithFallback(localeBundle.getAlias(), gContextTransformsTag, nullptr, &tempStatus));
  ------------------
  |  | 1662|      2|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2211|      2|        if (U_SUCCESS(tempStatus)) {
  ------------------
  |  Branch (2211:13): [True: 2, False: 0]
  ------------------
 2212|      2|            for (LocalUResourceBundlePointer contextTransformUsage;
 2213|     12|                 contextTransformUsage.adoptInstead(ures_getNextResource(contextTransforms.getAlias(), nullptr, &tempStatus)),
  ------------------
  |  | 1672|     12|#define ures_getNextResource U_ICU_ENTRY_POINT_RENAME(ures_getNextResource)
  |  |  ------------------
  |  |  |  |  123|     12|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     12|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     12|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2213:18): [True: 10, False: 2]
  ------------------
 2214|     12|                 contextTransformUsage.isValid();) {
 2215|     10|                const int32_t * intVector = ures_getIntVector(contextTransformUsage.getAlias(), &len, &status);
  ------------------
  |  | 1665|     10|#define ures_getIntVector U_ICU_ENTRY_POINT_RENAME(ures_getIntVector)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2216|     10|                if (U_SUCCESS(tempStatus) && intVector != nullptr && len >= 2) {
  ------------------
  |  Branch (2216:21): [True: 10, False: 0]
  |  Branch (2216:46): [True: 10, False: 0]
  |  Branch (2216:70): [True: 10, False: 0]
  ------------------
 2217|     10|                    const char* usageType = ures_getKey(contextTransformUsage.getAlias());
  ------------------
  |  | 1666|     10|#define ures_getKey U_ICU_ENTRY_POINT_RENAME(ures_getKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2218|     10|                    if (usageType != nullptr) {
  ------------------
  |  Branch (2218:25): [True: 10, False: 0]
  ------------------
 2219|     10|                        const ContextUsageTypeNameToEnumValue * typeMapPtr = contextUsageTypeMap;
 2220|     10|                        int32_t compResult = 0;
 2221|       |                        // linear search; list is short and we cannot be sure that bsearch is available
 2222|     88|                        while ( typeMapPtr->usageTypeName != nullptr && (compResult = uprv_strcmp(usageType, typeMapPtr->usageTypeName)) > 0 ) {
  ------------------
  |  |   38|     88|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     88|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (2222:33): [True: 88, False: 0]
  |  Branch (2222:73): [True: 78, False: 10]
  ------------------
 2223|     78|                            ++typeMapPtr;
 2224|     78|                        }
 2225|     10|                        if (typeMapPtr->usageTypeName != nullptr && compResult == 0) {
  ------------------
  |  Branch (2225:29): [True: 10, False: 0]
  |  Branch (2225:69): [True: 0, False: 10]
  ------------------
 2226|      0|                            fCapitalization[typeMapPtr->usageTypeEnumValue][0] = static_cast<UBool>(intVector[0]);
 2227|      0|                            fCapitalization[typeMapPtr->usageTypeEnumValue][1] = static_cast<UBool>(intVector[1]);
 2228|      0|                        }
 2229|     10|                    }
 2230|     10|                }
 2231|     10|                tempStatus = U_ZERO_ERROR;
 2232|     10|            }
 2233|      2|        }
 2234|       |
 2235|      2|        tempStatus = U_ZERO_ERROR;
 2236|      2|        const LocalPointer<NumberingSystem> numberingSystem(
 2237|      2|                NumberingSystem::createInstance(locale, tempStatus), tempStatus);
 2238|      2|        if (U_SUCCESS(tempStatus)) {
  ------------------
  |  Branch (2238:13): [True: 2, False: 0]
  ------------------
 2239|       |            // These functions all fail gracefully if passed nullptr pointers and
 2240|       |            // do nothing unless U_SUCCESS(tempStatus), so it's only necessary
 2241|       |            // to check for errors once after all calls are made.
 2242|      2|            const LocalUResourceBundlePointer numberElementsData(ures_getByKeyWithFallback(
  ------------------
  |  | 1662|      2|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2243|      2|                    localeBundle.getAlias(), gNumberElementsTag, nullptr, &tempStatus));
 2244|      2|            const LocalUResourceBundlePointer nsNameData(ures_getByKeyWithFallback(
  ------------------
  |  | 1662|      2|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2245|      2|                    numberElementsData.getAlias(), numberingSystem->getName(), nullptr, &tempStatus));
 2246|      2|            const LocalUResourceBundlePointer symbolsData(ures_getByKeyWithFallback(
  ------------------
  |  | 1662|      2|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2247|      2|                    nsNameData.getAlias(), gSymbolsTag, nullptr, &tempStatus));
 2248|      2|            fTimeSeparator = ures_getUnicodeStringByKey(
 2249|      2|                    symbolsData.getAlias(), gTimeSeparatorTag, &tempStatus);
 2250|      2|            if (U_FAILURE(tempStatus)) {
  ------------------
  |  Branch (2250:17): [True: 2, False: 0]
  ------------------
 2251|      2|                fTimeSeparator.setToBogus();
 2252|      2|            }
 2253|      2|        }
 2254|       |
 2255|      2|    }
 2256|       |
 2257|      2|    if (fTimeSeparator.isBogus()) {
  ------------------
  |  Branch (2257:9): [True: 2, False: 0]
  ------------------
 2258|      2|        fTimeSeparator.setTo(DateFormatSymbols::DEFAULT_TIME_SEPARATOR);
 2259|      2|    }
 2260|       |
 2261|       |    // Load day periods
 2262|      2|    fAbbreviatedDayPeriods = loadDayPeriodStrings(calendarSink,
 2263|      2|                            buildResourcePath(path, gDayPeriodTag, gNamesFormatTag, gNamesAbbrTag, status),
 2264|      2|                            fAbbreviatedDayPeriodsCount, status);
 2265|       |
 2266|      2|    fWideDayPeriods = loadDayPeriodStrings(calendarSink,
 2267|      2|                            buildResourcePath(path, gDayPeriodTag, gNamesFormatTag, gNamesWideTag, status),
 2268|      2|                            fWideDayPeriodsCount, status);
 2269|      2|    fNarrowDayPeriods = loadDayPeriodStrings(calendarSink,
 2270|      2|                            buildResourcePath(path, gDayPeriodTag, gNamesFormatTag, gNamesNarrowTag, status),
 2271|      2|                            fNarrowDayPeriodsCount, status);
 2272|       |
 2273|      2|    fStandaloneAbbreviatedDayPeriods = loadDayPeriodStrings(calendarSink,
 2274|      2|                            buildResourcePath(path, gDayPeriodTag, gNamesStandaloneTag, gNamesAbbrTag, status),
 2275|      2|                            fStandaloneAbbreviatedDayPeriodsCount, status);
 2276|       |
 2277|      2|    fStandaloneWideDayPeriods = loadDayPeriodStrings(calendarSink,
 2278|      2|                            buildResourcePath(path, gDayPeriodTag, gNamesStandaloneTag, gNamesWideTag, status),
 2279|      2|                            fStandaloneWideDayPeriodsCount, status);
 2280|      2|    fStandaloneNarrowDayPeriods = loadDayPeriodStrings(calendarSink,
 2281|      2|                            buildResourcePath(path, gDayPeriodTag, gNamesStandaloneTag, gNamesNarrowTag, status),
 2282|      2|                            fStandaloneNarrowDayPeriodsCount, status);
 2283|       |
 2284|       |    // Fill in for missing/bogus items (dayPeriods are a map so single items might be missing)
 2285|      2|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (2285:9): [True: 2, False: 0]
  ------------------
 2286|     22|        for (int32_t dpidx = 0; dpidx < fAbbreviatedDayPeriodsCount; ++dpidx) {
  ------------------
  |  Branch (2286:33): [True: 20, False: 2]
  ------------------
 2287|     20|            if (dpidx < fWideDayPeriodsCount && fWideDayPeriods != nullptr && fWideDayPeriods[dpidx].isBogus()) {
  ------------------
  |  Branch (2287:17): [True: 20, False: 0]
  |  Branch (2287:49): [True: 20, False: 0]
  |  Branch (2287:79): [True: 8, False: 12]
  ------------------
 2288|      8|                fWideDayPeriods[dpidx].fastCopyFrom(fAbbreviatedDayPeriods[dpidx]);
 2289|      8|            }
 2290|     20|            if (dpidx < fNarrowDayPeriodsCount && fNarrowDayPeriods != nullptr && fNarrowDayPeriods[dpidx].isBogus()) {
  ------------------
  |  Branch (2290:17): [True: 20, False: 0]
  |  Branch (2290:51): [True: 20, False: 0]
  |  Branch (2290:83): [True: 8, False: 12]
  ------------------
 2291|      8|                fNarrowDayPeriods[dpidx].fastCopyFrom(fAbbreviatedDayPeriods[dpidx]);
 2292|      8|            }
 2293|     20|            if (dpidx < fStandaloneAbbreviatedDayPeriodsCount && fStandaloneAbbreviatedDayPeriods != nullptr && fStandaloneAbbreviatedDayPeriods[dpidx].isBogus()) {
  ------------------
  |  Branch (2293:17): [True: 20, False: 0]
  |  Branch (2293:66): [True: 20, False: 0]
  |  Branch (2293:113): [True: 8, False: 12]
  ------------------
 2294|      8|                fStandaloneAbbreviatedDayPeriods[dpidx].fastCopyFrom(fAbbreviatedDayPeriods[dpidx]);
 2295|      8|            }
 2296|     20|            if (dpidx < fStandaloneWideDayPeriodsCount && fStandaloneWideDayPeriods != nullptr && fStandaloneWideDayPeriods[dpidx].isBogus()) {
  ------------------
  |  Branch (2296:17): [True: 20, False: 0]
  |  Branch (2296:59): [True: 20, False: 0]
  |  Branch (2296:99): [True: 8, False: 12]
  ------------------
 2297|      8|                fStandaloneWideDayPeriods[dpidx].fastCopyFrom(fStandaloneAbbreviatedDayPeriods[dpidx]);
 2298|      8|            }
 2299|     20|            if (dpidx < fStandaloneNarrowDayPeriodsCount && fStandaloneNarrowDayPeriods != nullptr && fStandaloneNarrowDayPeriods[dpidx].isBogus()) {
  ------------------
  |  Branch (2299:17): [True: 20, False: 0]
  |  Branch (2299:61): [True: 20, False: 0]
  |  Branch (2299:103): [True: 8, False: 12]
  ------------------
 2300|      8|                fStandaloneNarrowDayPeriods[dpidx].fastCopyFrom(fStandaloneAbbreviatedDayPeriods[dpidx]);
 2301|      8|            }
 2302|     20|        }
 2303|      2|    }
 2304|       |
 2305|      2|    U_LOCALE_BASED(locBased, *this);
  ------------------
  |  |   25|      2|  LocaleBased varname((objname).validLocale, (objname).actualLocale)
  ------------------
 2306|       |    // if we make it to here, the resource data is cool, and we can get everything out
 2307|       |    // of it that we need except for the time-zone and localized-pattern data, which
 2308|       |    // are stored in a separate file
 2309|      2|    locBased.setLocaleIDs(ures_getLocaleByType(cb.getAlias(), ULOC_VALID_LOCALE, &status),
  ------------------
  |  | 1669|      2|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2310|      2|                          ures_getLocaleByType(cb.getAlias(), ULOC_ACTUAL_LOCALE, &status), status);
  ------------------
  |  | 1669|      2|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2311|       |
 2312|       |    // Load eras
 2313|      2|    initField(&fEras, fErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesAbbrTag, status), status);
 2314|      2|    UErrorCode oldStatus = status;
 2315|      2|    initField(&fEraNames, fEraNamesCount, calendarSink, buildResourcePath(path, gErasTag, gNamesWideTag, status), status);
 2316|      2|    if (status == U_MISSING_RESOURCE_ERROR) { // Workaround because eras/wide was omitted from CLDR 1.3
  ------------------
  |  Branch (2316:9): [True: 0, False: 2]
  ------------------
 2317|      0|        status = oldStatus;
 2318|      0|        assignArray(fEraNames, fEraNamesCount, fEras, fErasCount);
 2319|      0|    }
 2320|       |    // current ICU4J falls back to abbreviated if narrow eras are missing, so we will too
 2321|      2|    oldStatus = status;
 2322|      2|    initField(&fNarrowEras, fNarrowErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesNarrowTag, status), status);
 2323|      2|    if (status == U_MISSING_RESOURCE_ERROR) { // Workaround because eras/wide was omitted from CLDR 1.3
  ------------------
  |  Branch (2323:9): [True: 0, False: 2]
  ------------------
 2324|      0|        status = oldStatus;
 2325|      0|        assignArray(fNarrowEras, fNarrowErasCount, fEras, fErasCount);
 2326|      0|    }
 2327|       |
 2328|       |    // Load month names
 2329|      2|    initField(&fMonths, fMonthsCount, calendarSink,
 2330|      2|              buildResourcePath(path, gMonthNamesTag, gNamesFormatTag, gNamesWideTag, status), status);
 2331|      2|    initField(&fShortMonths, fShortMonthsCount, calendarSink,
 2332|      2|              buildResourcePath(path, gMonthNamesTag, gNamesFormatTag, gNamesAbbrTag, status), status);
 2333|      2|    initField(&fStandaloneMonths, fStandaloneMonthsCount, calendarSink,
 2334|      2|              buildResourcePath(path, gMonthNamesTag, gNamesStandaloneTag, gNamesWideTag, status), status);
 2335|      2|    if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/wide not available, use format/wide */
  ------------------
  |  Branch (2335:9): [True: 0, False: 2]
  ------------------
 2336|      0|        status = U_ZERO_ERROR;
 2337|      0|        assignArray(fStandaloneMonths, fStandaloneMonthsCount, fMonths, fMonthsCount);
 2338|      0|    }
 2339|      2|    initField(&fStandaloneShortMonths, fStandaloneShortMonthsCount, calendarSink,
 2340|      2|              buildResourcePath(path, gMonthNamesTag, gNamesStandaloneTag, gNamesAbbrTag, status), status);
 2341|      2|    if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/abbreviated not available, use format/abbreviated */
  ------------------
  |  Branch (2341:9): [True: 0, False: 2]
  ------------------
 2342|      0|        status = U_ZERO_ERROR;
 2343|      0|        assignArray(fStandaloneShortMonths, fStandaloneShortMonthsCount, fShortMonths, fShortMonthsCount);
 2344|      0|    }
 2345|       |
 2346|      2|    UErrorCode narrowMonthsEC = status;
 2347|      2|    UErrorCode standaloneNarrowMonthsEC = status;
 2348|      2|    initField(&fNarrowMonths, fNarrowMonthsCount, calendarSink,
 2349|      2|              buildResourcePath(path, gMonthNamesTag, gNamesFormatTag, gNamesNarrowTag, narrowMonthsEC), narrowMonthsEC);
 2350|      2|    initField(&fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, calendarSink,
 2351|      2|              buildResourcePath(path, gMonthNamesTag, gNamesStandaloneTag, gNamesNarrowTag, narrowMonthsEC), standaloneNarrowMonthsEC);
 2352|      2|    if (narrowMonthsEC == U_MISSING_RESOURCE_ERROR && standaloneNarrowMonthsEC != U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (2352:9): [True: 0, False: 2]
  |  Branch (2352:55): [True: 0, False: 0]
  ------------------
 2353|       |        // If format/narrow not available, use standalone/narrow
 2354|      0|        assignArray(fNarrowMonths, fNarrowMonthsCount, fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount);
 2355|      2|    } else if (narrowMonthsEC != U_MISSING_RESOURCE_ERROR && standaloneNarrowMonthsEC == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (2355:16): [True: 2, False: 0]
  |  Branch (2355:62): [True: 0, False: 2]
  ------------------
 2356|       |        // If standalone/narrow not available, use format/narrow
 2357|      0|        assignArray(fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, fNarrowMonths, fNarrowMonthsCount);
 2358|      2|    } else if (narrowMonthsEC == U_MISSING_RESOURCE_ERROR && standaloneNarrowMonthsEC == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (2358:16): [True: 0, False: 2]
  |  Branch (2358:62): [True: 0, False: 0]
  ------------------
 2359|       |        // If neither is available, use format/abbreviated
 2360|      0|        assignArray(fNarrowMonths, fNarrowMonthsCount, fShortMonths, fShortMonthsCount);
 2361|      0|        assignArray(fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, fShortMonths, fShortMonthsCount);
 2362|      0|    }
 2363|       |
 2364|       |    // Load AM/PM markers; if wide or narrow not available, use short
 2365|      2|    UErrorCode ampmStatus = U_ZERO_ERROR;
 2366|      2|    initField(&fAmPms, fAmPmsCount, calendarSink,
 2367|      2|              buildResourcePath(path, gAmPmMarkersTag, ampmStatus), ampmStatus);
 2368|      2|    if (U_FAILURE(ampmStatus)) {
  ------------------
  |  Branch (2368:9): [True: 0, False: 2]
  ------------------
 2369|      0|        initField(&fAmPms, fAmPmsCount, calendarSink,
 2370|      0|                  buildResourcePath(path, gAmPmMarkersAbbrTag, status), status);
 2371|      0|    }
 2372|      2|    ampmStatus = U_ZERO_ERROR;
 2373|      2|    initField(&fNarrowAmPms, fNarrowAmPmsCount, calendarSink,
 2374|      2|              buildResourcePath(path, gAmPmMarkersNarrowTag, ampmStatus), ampmStatus);
 2375|      2|    if (U_FAILURE(ampmStatus)) {
  ------------------
  |  Branch (2375:9): [True: 0, False: 2]
  ------------------
 2376|      0|        initField(&fNarrowAmPms, fNarrowAmPmsCount, calendarSink,
 2377|      0|                  buildResourcePath(path, gAmPmMarkersAbbrTag, status), status);
 2378|      0|    }
 2379|      2|    if(status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (2379:8): [True: 0, False: 2]
  ------------------
 2380|      0|        status = U_ZERO_ERROR;
 2381|      0|        assignArray(fNarrowAmPms, fNarrowAmPmsCount, fAmPms, fAmPmsCount);
 2382|      0|    }
 2383|       |
 2384|       |    // Load quarters
 2385|      2|    initField(&fQuarters, fQuartersCount, calendarSink,
 2386|      2|              buildResourcePath(path, gQuartersTag, gNamesFormatTag, gNamesWideTag, status), status);
 2387|      2|    initField(&fShortQuarters, fShortQuartersCount, calendarSink,
 2388|      2|              buildResourcePath(path, gQuartersTag, gNamesFormatTag, gNamesAbbrTag, status), status);
 2389|      2|    if(status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (2389:8): [True: 0, False: 2]
  ------------------
 2390|      0|        status = U_ZERO_ERROR;
 2391|      0|        assignArray(fShortQuarters, fShortQuartersCount, fQuarters, fQuartersCount);
 2392|      0|    }
 2393|       |
 2394|      2|    initField(&fStandaloneQuarters, fStandaloneQuartersCount, calendarSink,
 2395|      2|              buildResourcePath(path, gQuartersTag, gNamesStandaloneTag, gNamesWideTag, status), status);
 2396|      2|    if(status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (2396:8): [True: 0, False: 2]
  ------------------
 2397|      0|        status = U_ZERO_ERROR;
 2398|      0|        assignArray(fStandaloneQuarters, fStandaloneQuartersCount, fQuarters, fQuartersCount);
 2399|      0|    }
 2400|      2|    initField(&fStandaloneShortQuarters, fStandaloneShortQuartersCount, calendarSink,
 2401|      2|              buildResourcePath(path, gQuartersTag, gNamesStandaloneTag, gNamesAbbrTag, status), status);
 2402|      2|    if(status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (2402:8): [True: 0, False: 2]
  ------------------
 2403|      0|        status = U_ZERO_ERROR;
 2404|      0|        assignArray(fStandaloneShortQuarters, fStandaloneShortQuartersCount, fShortQuarters, fShortQuartersCount);
 2405|      0|    }
 2406|       |
 2407|       |    // unlike the fields above, narrow format quarters fall back on narrow standalone quarters
 2408|      2|    initField(&fStandaloneNarrowQuarters, fStandaloneNarrowQuartersCount, calendarSink,
 2409|      2|              buildResourcePath(path, gQuartersTag, gNamesStandaloneTag, gNamesNarrowTag, status), status);
 2410|      2|    initField(&fNarrowQuarters, fNarrowQuartersCount, calendarSink,
 2411|      2|              buildResourcePath(path, gQuartersTag, gNamesFormatTag, gNamesNarrowTag, status), status);
 2412|      2|    if(status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (2412:8): [True: 0, False: 2]
  ------------------
 2413|      0|        status = U_ZERO_ERROR;
 2414|      0|        assignArray(fNarrowQuarters, fNarrowQuartersCount, fStandaloneNarrowQuarters, fStandaloneNarrowQuartersCount);
 2415|      0|    }
 2416|       |    
 2417|       |    // ICU 3.8 or later version no longer uses localized date-time pattern characters by default (ticket#5597)
 2418|       |    /*
 2419|       |    // fastCopyFrom()/setTo() - see assignArray comments
 2420|       |    resStr = ures_getStringByKey(fResourceBundle, gLocalPatternCharsTag, &len, &status);
 2421|       |    fLocalPatternChars.setTo(true, resStr, len);
 2422|       |    // If the locale data does not include new pattern chars, use the defaults
 2423|       |    // TODO: Consider making this an error, since this may add conflicting characters.
 2424|       |    if (len < PATTERN_CHARS_LEN) {
 2425|       |        fLocalPatternChars.append(UnicodeString(true, &gPatternChars[len], PATTERN_CHARS_LEN-len));
 2426|       |    }
 2427|       |    */
 2428|      2|    fLocalPatternChars.setTo(true, gPatternChars, PATTERN_CHARS_LEN);
  ------------------
  |  |   66|      2|#define PATTERN_CHARS_LEN 37
  ------------------
 2429|       |
 2430|       |    // Format wide weekdays -> fWeekdays
 2431|       |    // {sfb} fixed to handle 1-based weekdays
 2432|      2|    initField(&fWeekdays, fWeekdaysCount, calendarSink,
 2433|      2|              buildResourcePath(path, gDayNamesTag, gNamesFormatTag, gNamesWideTag, status), 1, status);
 2434|       |
 2435|       |    // Format abbreviated weekdays -> fShortWeekdays
 2436|      2|    initField(&fShortWeekdays, fShortWeekdaysCount, calendarSink,
 2437|      2|              buildResourcePath(path, gDayNamesTag, gNamesFormatTag, gNamesAbbrTag, status), 1, status);
 2438|       |
 2439|       |    // Format short weekdays -> fShorterWeekdays (fall back to abbreviated)
 2440|      2|    initField(&fShorterWeekdays, fShorterWeekdaysCount, calendarSink,
 2441|      2|              buildResourcePath(path, gDayNamesTag, gNamesFormatTag, gNamesShortTag, status), 1, status);
 2442|      2|    if (status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (2442:9): [True: 0, False: 2]
  ------------------
 2443|      0|        status = U_ZERO_ERROR;
 2444|      0|        assignArray(fShorterWeekdays, fShorterWeekdaysCount, fShortWeekdays, fShortWeekdaysCount);
 2445|      0|    }
 2446|       |
 2447|       |    // Stand-alone wide weekdays -> fStandaloneWeekdays
 2448|      2|    initField(&fStandaloneWeekdays, fStandaloneWeekdaysCount, calendarSink,
 2449|      2|              buildResourcePath(path, gDayNamesTag, gNamesStandaloneTag, gNamesWideTag, status), 1, status);
 2450|      2|    if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/wide is not available, use format/wide */
  ------------------
  |  Branch (2450:9): [True: 0, False: 2]
  ------------------
 2451|      0|        status = U_ZERO_ERROR;
 2452|      0|        assignArray(fStandaloneWeekdays, fStandaloneWeekdaysCount, fWeekdays, fWeekdaysCount);
 2453|      0|    }
 2454|       |
 2455|       |    // Stand-alone abbreviated weekdays -> fStandaloneShortWeekdays
 2456|      2|    initField(&fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, calendarSink,
 2457|      2|              buildResourcePath(path, gDayNamesTag, gNamesStandaloneTag, gNamesAbbrTag, status), 1, status);
 2458|      2|    if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/abbreviated is not available, use format/abbreviated */
  ------------------
  |  Branch (2458:9): [True: 0, False: 2]
  ------------------
 2459|      0|        status = U_ZERO_ERROR;
 2460|      0|        assignArray(fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, fShortWeekdays, fShortWeekdaysCount);
 2461|      0|    }
 2462|       |
 2463|       |    // Stand-alone short weekdays -> fStandaloneShorterWeekdays (fall back to format abbreviated)
 2464|      2|    initField(&fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount, calendarSink,
 2465|      2|              buildResourcePath(path, gDayNamesTag, gNamesStandaloneTag, gNamesShortTag, status), 1, status);
 2466|      2|    if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/short is not available, use format/short */
  ------------------
  |  Branch (2466:9): [True: 0, False: 2]
  ------------------
 2467|      0|        status = U_ZERO_ERROR;
 2468|      0|        assignArray(fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount, fShorterWeekdays, fShorterWeekdaysCount);
 2469|      0|    }
 2470|       |
 2471|       |    // Format narrow weekdays -> fNarrowWeekdays
 2472|      2|    UErrorCode narrowWeeksEC = status;
 2473|      2|    initField(&fNarrowWeekdays, fNarrowWeekdaysCount, calendarSink,
 2474|      2|              buildResourcePath(path, gDayNamesTag, gNamesFormatTag, gNamesNarrowTag, status), 1, narrowWeeksEC);
 2475|       |    // Stand-alone narrow weekdays -> fStandaloneNarrowWeekdays
 2476|      2|    UErrorCode standaloneNarrowWeeksEC = status;
 2477|      2|    initField(&fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, calendarSink,
 2478|      2|              buildResourcePath(path, gDayNamesTag, gNamesStandaloneTag, gNamesNarrowTag, status), 1, standaloneNarrowWeeksEC);
 2479|       |
 2480|      2|    if (narrowWeeksEC == U_MISSING_RESOURCE_ERROR && standaloneNarrowWeeksEC != U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (2480:9): [True: 0, False: 2]
  |  Branch (2480:54): [True: 0, False: 0]
  ------------------
 2481|       |        // If format/narrow not available, use standalone/narrow
 2482|      0|        assignArray(fNarrowWeekdays, fNarrowWeekdaysCount, fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount);
 2483|      2|    } else if (narrowWeeksEC != U_MISSING_RESOURCE_ERROR && standaloneNarrowWeeksEC == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (2483:16): [True: 2, False: 0]
  |  Branch (2483:61): [True: 0, False: 2]
  ------------------
 2484|       |        // If standalone/narrow not available, use format/narrow
 2485|      0|        assignArray(fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, fNarrowWeekdays, fNarrowWeekdaysCount);
 2486|      2|    } else if (narrowWeeksEC == U_MISSING_RESOURCE_ERROR && standaloneNarrowWeeksEC == U_MISSING_RESOURCE_ERROR ) {
  ------------------
  |  Branch (2486:16): [True: 0, False: 2]
  |  Branch (2486:61): [True: 0, False: 0]
  ------------------
 2487|       |        // If neither is available, use format/abbreviated
 2488|      0|        assignArray(fNarrowWeekdays, fNarrowWeekdaysCount, fShortWeekdays, fShortWeekdaysCount);
 2489|      0|        assignArray(fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, fShortWeekdays, fShortWeekdaysCount);
 2490|      0|    }
 2491|       |
 2492|       |    // Last resort fallback in case previous data wasn't loaded
 2493|      2|    if (U_FAILURE(status))
  ------------------
  |  Branch (2493:9): [True: 0, False: 2]
  ------------------
 2494|      0|    {
 2495|      0|        if (useLastResortData)
  ------------------
  |  Branch (2495:13): [True: 0, False: 0]
  ------------------
 2496|      0|        {
 2497|       |            // Handle the case in which there is no resource data present.
 2498|       |            // We don't have to generate usable patterns in this situation;
 2499|       |            // we just need to produce something that will be semi-intelligible
 2500|       |            // in most locales.
 2501|       |
 2502|      0|            status = U_USING_FALLBACK_WARNING;
 2503|       |            //TODO(fabalbon): make sure we are storing las resort data for all fields in here.
 2504|      0|            initField(&fEras, fErasCount, reinterpret_cast<const char16_t*>(gLastResortEras), kEraNum, kEraLen, status);
 2505|      0|            initField(&fEraNames, fEraNamesCount, reinterpret_cast<const char16_t*>(gLastResortEras), kEraNum, kEraLen, status);
 2506|      0|            initField(&fNarrowEras, fNarrowErasCount, reinterpret_cast<const char16_t*>(gLastResortEras), kEraNum, kEraLen, status);
 2507|      0|            initField(&fMonths, fMonthsCount, reinterpret_cast<const char16_t*>(gLastResortMonthNames), kMonthNum, kMonthLen, status);
 2508|      0|            initField(&fShortMonths, fShortMonthsCount, reinterpret_cast<const char16_t*>(gLastResortMonthNames), kMonthNum, kMonthLen, status);
 2509|      0|            initField(&fNarrowMonths, fNarrowMonthsCount, reinterpret_cast<const char16_t*>(gLastResortMonthNames), kMonthNum, kMonthLen, status);
 2510|      0|            initField(&fStandaloneMonths, fStandaloneMonthsCount, reinterpret_cast<const char16_t*>(gLastResortMonthNames), kMonthNum, kMonthLen, status);
 2511|      0|            initField(&fStandaloneShortMonths, fStandaloneShortMonthsCount, reinterpret_cast<const char16_t*>(gLastResortMonthNames), kMonthNum, kMonthLen, status);
 2512|      0|            initField(&fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, reinterpret_cast<const char16_t*>(gLastResortMonthNames), kMonthNum, kMonthLen, status);
 2513|      0|            initField(&fWeekdays, fWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status);
 2514|      0|            initField(&fShortWeekdays, fShortWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status);
 2515|      0|            initField(&fShorterWeekdays, fShorterWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status);
 2516|      0|            initField(&fNarrowWeekdays, fNarrowWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status);
 2517|      0|            initField(&fStandaloneWeekdays, fStandaloneWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status);
 2518|      0|            initField(&fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status);
 2519|      0|            initField(&fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status);
 2520|      0|            initField(&fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status);
 2521|      0|            initField(&fAmPms, fAmPmsCount, reinterpret_cast<const char16_t*>(gLastResortAmPmMarkers), kAmPmNum, kAmPmLen, status);
 2522|      0|            initField(&fNarrowAmPms, fNarrowAmPmsCount, reinterpret_cast<const char16_t*>(gLastResortAmPmMarkers), kAmPmNum, kAmPmLen, status);
 2523|      0|            initField(&fQuarters, fQuartersCount, reinterpret_cast<const char16_t*>(gLastResortQuarters), kQuarterNum, kQuarterLen, status);
 2524|      0|            initField(&fShortQuarters, fShortQuartersCount, reinterpret_cast<const char16_t*>(gLastResortQuarters), kQuarterNum, kQuarterLen, status);
 2525|      0|            initField(&fNarrowQuarters, fNarrowQuartersCount, reinterpret_cast<const char16_t*>(gLastResortQuarters), kQuarterNum, kQuarterLen, status);
 2526|      0|            initField(&fStandaloneQuarters, fStandaloneQuartersCount, reinterpret_cast<const char16_t*>(gLastResortQuarters), kQuarterNum, kQuarterLen, status);
 2527|      0|            initField(&fStandaloneShortQuarters, fStandaloneShortQuartersCount, reinterpret_cast<const char16_t*>(gLastResortQuarters), kQuarterNum, kQuarterLen, status);
 2528|      0|            initField(&fStandaloneNarrowQuarters, fStandaloneNarrowQuartersCount, reinterpret_cast<const char16_t*>(gLastResortQuarters), kQuarterNum, kQuarterLen, status);
 2529|      0|            fLocalPatternChars.setTo(true, gPatternChars, PATTERN_CHARS_LEN);
  ------------------
  |  |   66|      0|#define PATTERN_CHARS_LEN 37
  ------------------
 2530|      0|        }
 2531|      0|    }
 2532|      2|}
dtfmtsym.cpp:_ZN6icu_78L21newUnicodeStringArrayEm:
  269|  1.74M|static inline UnicodeString* newUnicodeStringArray(size_t count) {
  270|  1.74M|    return new UnicodeString[count ? count : 1];
  ------------------
  |  Branch (270:30): [True: 1.74M, False: 0]
  ------------------
  271|  1.74M|}
dtfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_116CalendarDataSinkC2ER10UErrorCode:
 1531|      2|    :   arrays(false, status), arraySizes(false, status), maps(false, status),
 1532|      2|        mapRefs(),
 1533|      2|        aliasPathPairs(uprv_deleteUObject, uhash_compareUnicodeString, status),
  ------------------
  |  | 1489|      2|#define uprv_deleteUObject U_ICU_ENTRY_POINT_RENAME(uprv_deleteUObject)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      aliasPathPairs(uprv_deleteUObject, uhash_compareUnicodeString, status),
  ------------------
  |  |  999|      2|#define uhash_compareUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_compareUnicodeString)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1534|      2|        currentCalendarType(), nextCalendarType(),
 1535|      2|        resourcesToVisit(nullptr), aliasRelativePath() {
 1536|      2|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1536:13): [True: 0, False: 2]
  ------------------
 1537|      2|    }
dtfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_116CalendarDataSink3putEPKcRNS_13ResourceValueEaR10UErrorCode:
 1552|      4|    virtual void put(const char *key, ResourceValue &value, UBool, UErrorCode &errorCode) override {
 1553|      4|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1553:13): [True: 0, False: 4]
  ------------------
 1554|      4|        U_ASSERT(!currentCalendarType.isEmpty());
  ------------------
  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  ------------------
 1555|       |
 1556|       |        // Stores the resources to visit on the next calendar.
 1557|      4|        LocalPointer<UVector> resourcesToVisitNext(nullptr);
 1558|      4|        ResourceTable calendarData = value.getTable(errorCode);
 1559|      4|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1559:13): [True: 0, False: 4]
  ------------------
 1560|       |
 1561|       |        // Enumerate all resources for this calendar
 1562|     62|        for (int i = 0; calendarData.getKeyAndValue(i, key, value); i++) {
  ------------------
  |  Branch (1562:25): [True: 58, False: 4]
  ------------------
 1563|     58|            UnicodeString keyUString(key, -1, US_INV);
  ------------------
  |  |   98|     58|#define US_INV icu::UnicodeString::kInvariant
  ------------------
 1564|       |
 1565|       |            // == Handle aliases ==
 1566|     58|            AliasType aliasType = processAliasFromValue(keyUString, value, errorCode);
 1567|     58|            if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1567:17): [True: 0, False: 58]
  ------------------
 1568|     58|            if (aliasType == GREGORIAN) {
  ------------------
  |  Branch (1568:17): [True: 0, False: 58]
  ------------------
 1569|       |                // Ignore aliases to the gregorian calendar, all of its resources will be loaded anyway.
 1570|      0|                continue;
 1571|       |
 1572|     58|            } else if (aliasType == DIFFERENT_CALENDAR) {
  ------------------
  |  Branch (1572:24): [True: 0, False: 58]
  ------------------
 1573|       |                // Whenever an alias to the next calendar (except gregorian) is encountered, register the
 1574|       |                // calendar type it's pointing to
 1575|      0|                if (resourcesToVisitNext.isNull()) {
  ------------------
  |  Branch (1575:21): [True: 0, False: 0]
  ------------------
 1576|      0|                    resourcesToVisitNext
 1577|      0|                        .adoptInsteadAndCheckErrorCode(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, errorCode),
  ------------------
  |  | 1489|      0|#define uprv_deleteUObject U_ICU_ENTRY_POINT_RENAME(uprv_deleteUObject)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                                      .adoptInsteadAndCheckErrorCode(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, errorCode),
  ------------------
  |  |  999|      0|#define uhash_compareUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_compareUnicodeString)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1578|      0|                                                       errorCode);
 1579|      0|                    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1579:25): [True: 0, False: 0]
  ------------------
 1580|      0|                }
 1581|      0|                LocalPointer<UnicodeString> aliasRelativePathCopy(aliasRelativePath.clone(), errorCode);
 1582|      0|                resourcesToVisitNext->adoptElement(aliasRelativePathCopy.orphan(), errorCode);
 1583|      0|                if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1583:21): [True: 0, False: 0]
  ------------------
 1584|      0|                continue;
 1585|       |
 1586|     58|            } else if (aliasType == SAME_CALENDAR) {
  ------------------
  |  Branch (1586:24): [True: 4, False: 54]
  ------------------
 1587|       |                // Register same-calendar alias
 1588|      4|                if (arrays.get(aliasRelativePath) == nullptr && maps.get(aliasRelativePath) == nullptr) {
  ------------------
  |  Branch (1588:21): [True: 0, False: 4]
  |  Branch (1588:65): [True: 0, False: 0]
  ------------------
 1589|      0|                    LocalPointer<UnicodeString> aliasRelativePathCopy(aliasRelativePath.clone(), errorCode);
 1590|      0|                    aliasPathPairs.adoptElement(aliasRelativePathCopy.orphan(), errorCode);
 1591|      0|                    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1591:25): [True: 0, False: 0]
  ------------------
 1592|      0|                    LocalPointer<UnicodeString> keyUStringCopy(keyUString.clone(), errorCode);
 1593|      0|                    aliasPathPairs.adoptElement(keyUStringCopy.orphan(), errorCode);
 1594|      0|                    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1594:25): [True: 0, False: 0]
  ------------------
 1595|      0|                }
 1596|      4|                continue;
 1597|      4|            }
 1598|       |
 1599|       |            // Only visit the resources that were referenced by an alias on the previous calendar
 1600|       |            // (AmPmMarkersAbbr is an exception).
 1601|     54|            if (!resourcesToVisit.isNull() && !resourcesToVisit->isEmpty() && !resourcesToVisit->contains(&keyUString)
  ------------------
  |  Branch (1601:17): [True: 0, False: 54]
  |  Branch (1601:47): [True: 0, False: 0]
  |  Branch (1601:79): [True: 0, False: 0]
  ------------------
 1602|     54|                && uprv_strcmp(key, gAmPmMarkersAbbrTag) != 0) { continue; }
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1602:20): [True: 0, False: 0]
  ------------------
 1603|       |
 1604|       |            // == Handle data ==
 1605|     54|            if (uprv_strcmp(key, gAmPmMarkersTag) == 0
  ------------------
  |  |   38|     54|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     54|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1605:17): [True: 2, False: 52]
  ------------------
 1606|     54|                || uprv_strcmp(key, gAmPmMarkersAbbrTag) == 0
  ------------------
  |  |   38|     52|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     52|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1606:20): [True: 4, False: 48]
  ------------------
 1607|     54|                || uprv_strcmp(key, gAmPmMarkersNarrowTag) == 0) {
  ------------------
  |  |   38|     48|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     48|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1607:20): [True: 2, False: 46]
  ------------------
 1608|      8|                if (arrays.get(keyUString) == nullptr) {
  ------------------
  |  Branch (1608:21): [True: 6, False: 2]
  ------------------
 1609|      6|                    ResourceArray resourceArray = value.getArray(errorCode);
 1610|      6|                    int32_t arraySize = resourceArray.getSize();
 1611|      6|                    LocalArray<UnicodeString> stringArray(new UnicodeString[arraySize], errorCode);
 1612|      6|                    value.getStringArray(stringArray.getAlias(), arraySize, errorCode);
 1613|      6|                    arrays.put(keyUString, stringArray.orphan(), errorCode);
 1614|      6|                    arraySizes.puti(keyUString, arraySize, errorCode);
 1615|      6|                    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1615:25): [True: 0, False: 6]
  ------------------
 1616|      6|                }
 1617|     46|            } else if (uprv_strcmp(key, gErasTag) == 0
  ------------------
  |  |   38|     46|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     46|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1617:24): [True: 4, False: 42]
  ------------------
 1618|     46|                       || uprv_strcmp(key, gDayNamesTag) == 0
  ------------------
  |  |   38|     42|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     42|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1618:27): [True: 4, False: 38]
  ------------------
 1619|     46|                       || uprv_strcmp(key, gMonthNamesTag) == 0
  ------------------
  |  |   38|     38|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     38|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1619:27): [True: 4, False: 34]
  ------------------
 1620|     46|                       || uprv_strcmp(key, gQuartersTag) == 0
  ------------------
  |  |   38|     34|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     34|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1620:27): [True: 4, False: 30]
  ------------------
 1621|     46|                       || uprv_strcmp(key, gDayPeriodTag) == 0
  ------------------
  |  |   38|     30|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     30|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1621:27): [True: 2, False: 28]
  ------------------
 1622|     46|                       || uprv_strcmp(key, gMonthPatternsTag) == 0
  ------------------
  |  |   38|     28|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     28|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1622:27): [True: 0, False: 28]
  ------------------
 1623|     46|                       || uprv_strcmp(key, gCyclicNameSetsTag) == 0) {
  ------------------
  |  |   38|     28|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|     28|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1623:27): [True: 0, False: 28]
  ------------------
 1624|     18|                processResource(keyUString, key, value, errorCode);
 1625|     18|            }
 1626|     54|        }
 1627|       |
 1628|       |        // Apply same-calendar aliases
 1629|      4|        UBool modified;
 1630|      4|        do {
 1631|      4|            modified = false;
 1632|      4|            for (int32_t i = 0; i < aliasPathPairs.size();) {
  ------------------
  |  Branch (1632:33): [True: 0, False: 4]
  ------------------
 1633|      0|                UBool mod = false;
 1634|      0|                UnicodeString* alias = static_cast<UnicodeString*>(aliasPathPairs[i]);
 1635|      0|                UnicodeString *aliasArray;
 1636|      0|                Hashtable *aliasMap;
 1637|      0|                if ((aliasArray = static_cast<UnicodeString*>(arrays.get(*alias))) != nullptr) {
  ------------------
  |  Branch (1637:21): [True: 0, False: 0]
  ------------------
 1638|      0|                    UnicodeString* path = static_cast<UnicodeString*>(aliasPathPairs[i + 1]);
 1639|      0|                    if (arrays.get(*path) == nullptr) {
  ------------------
  |  Branch (1639:25): [True: 0, False: 0]
  ------------------
 1640|       |                        // Clone the array
 1641|      0|                        int32_t aliasArraySize = arraySizes.geti(*alias);
 1642|      0|                        LocalArray<UnicodeString> aliasArrayCopy(new UnicodeString[aliasArraySize], errorCode);
 1643|      0|                        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1643:29): [True: 0, False: 0]
  ------------------
 1644|      0|                        uprv_arrayCopy(aliasArray, aliasArrayCopy.getAlias(), aliasArraySize);
 1645|       |                        // Put the array on the 'arrays' map
 1646|      0|                        arrays.put(*path, aliasArrayCopy.orphan(), errorCode);
 1647|      0|                        arraySizes.puti(*path, aliasArraySize, errorCode);
 1648|      0|                    }
 1649|      0|                    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1649:25): [True: 0, False: 0]
  ------------------
 1650|      0|                    mod = true;
 1651|      0|                } else if ((aliasMap = static_cast<Hashtable*>(maps.get(*alias))) != nullptr) {
  ------------------
  |  Branch (1651:28): [True: 0, False: 0]
  ------------------
 1652|      0|                    UnicodeString* path = static_cast<UnicodeString*>(aliasPathPairs[i + 1]);
 1653|      0|                    if (maps.get(*path) == nullptr) {
  ------------------
  |  Branch (1653:25): [True: 0, False: 0]
  ------------------
 1654|      0|                        maps.put(*path, aliasMap, errorCode);
 1655|      0|                    }
 1656|      0|                    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1656:25): [True: 0, False: 0]
  ------------------
 1657|      0|                    mod = true;
 1658|      0|                }
 1659|      0|                if (mod) {
  ------------------
  |  Branch (1659:21): [True: 0, False: 0]
  ------------------
 1660|      0|                    aliasPathPairs.removeElementAt(i + 1);
 1661|      0|                    aliasPathPairs.removeElementAt(i);
 1662|      0|                    modified = true;
 1663|      0|                } else {
 1664|      0|                    i += 2;
 1665|      0|                }
 1666|      0|            }
 1667|      4|        } while (modified && !aliasPathPairs.isEmpty());
  ------------------
  |  Branch (1667:18): [True: 0, False: 4]
  |  Branch (1667:30): [True: 0, False: 0]
  ------------------
 1668|       |
 1669|       |        // Set the resources to visit on the next calendar
 1670|      4|        if (!resourcesToVisitNext.isNull()) {
  ------------------
  |  Branch (1670:13): [True: 0, False: 4]
  ------------------
 1671|      0|            resourcesToVisit = std::move(resourcesToVisitNext);
 1672|      0|        }
 1673|      4|    }
dtfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_116CalendarDataSink21processAliasFromValueERNS_13UnicodeStringERNS_13ResourceValueER10UErrorCode:
 1797|    144|                                    UErrorCode &errorCode) {
 1798|    144|        if (U_FAILURE(errorCode)) { return NONE; }
  ------------------
  |  Branch (1798:13): [True: 0, False: 144]
  ------------------
 1799|       |
 1800|    144|        if (value.getType() == URES_ALIAS) {
  ------------------
  |  Branch (1800:13): [True: 4, False: 140]
  ------------------
 1801|      4|            int32_t aliasPathSize;
 1802|      4|            const char16_t* aliasPathUChar = value.getAliasString(aliasPathSize, errorCode);
 1803|      4|            if (U_FAILURE(errorCode)) { return NONE; }
  ------------------
  |  Branch (1803:17): [True: 0, False: 4]
  ------------------
 1804|      4|            UnicodeString aliasPath(aliasPathUChar, aliasPathSize);
 1805|      4|            const int32_t aliasPrefixLength = UPRV_LENGTHOF(kCalendarAliasPrefixUChar);
  ------------------
  |  |   99|      4|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1806|      4|            if (aliasPath.startsWith(kCalendarAliasPrefixUChar, aliasPrefixLength)
  ------------------
  |  Branch (1806:17): [True: 4, False: 0]
  |  Branch (1806:17): [True: 4, False: 0]
  ------------------
 1807|      4|                && aliasPath.length() > aliasPrefixLength) {
  ------------------
  |  Branch (1807:20): [True: 4, False: 0]
  ------------------
 1808|      4|                int32_t typeLimit = aliasPath.indexOf(SOLIDUS, aliasPrefixLength);
  ------------------
  |  |   35|      4|#define SOLIDUS           ((char16_t)0x002F)
  ------------------
 1809|      4|                if (typeLimit > aliasPrefixLength) {
  ------------------
  |  Branch (1809:21): [True: 4, False: 0]
  ------------------
 1810|      4|                    const UnicodeString aliasCalendarType =
 1811|      4|                        aliasPath.tempSubStringBetween(aliasPrefixLength, typeLimit);
 1812|      4|                    aliasRelativePath.setTo(aliasPath, typeLimit + 1, aliasPath.length());
 1813|       |
 1814|      4|                    if (currentCalendarType == aliasCalendarType
  ------------------
  |  Branch (1814:25): [True: 4, False: 0]
  ------------------
 1815|      4|                        && currentRelativePath != aliasRelativePath) {
  ------------------
  |  Branch (1815:28): [True: 4, False: 0]
  ------------------
 1816|       |                        // If we have an alias to the same calendar, the path to the resource must be different
 1817|      4|                        return SAME_CALENDAR;
 1818|       |
 1819|      4|                    } else if (currentCalendarType != aliasCalendarType
  ------------------
  |  Branch (1819:32): [True: 0, False: 0]
  ------------------
 1820|      0|                               && currentRelativePath == aliasRelativePath) {
  ------------------
  |  Branch (1820:35): [True: 0, False: 0]
  ------------------
 1821|       |                        // If we have an alias to a different calendar, the path to the resource must be the same
 1822|      0|                        if (aliasCalendarType.compare(kGregorianTagUChar, UPRV_LENGTHOF(kGregorianTagUChar)) == 0) {
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1822:29): [True: 0, False: 0]
  ------------------
 1823|      0|                            return GREGORIAN;
 1824|      0|                        } else if (nextCalendarType.isBogus()) {
  ------------------
  |  Branch (1824:36): [True: 0, False: 0]
  ------------------
 1825|      0|                            nextCalendarType = aliasCalendarType;
 1826|      0|                            return DIFFERENT_CALENDAR;
 1827|      0|                        } else if (nextCalendarType == aliasCalendarType) {
  ------------------
  |  Branch (1827:36): [True: 0, False: 0]
  ------------------
 1828|      0|                            return DIFFERENT_CALENDAR;
 1829|      0|                        }
 1830|      0|                    }
 1831|      4|                }
 1832|      4|            }
 1833|      0|            errorCode = U_INTERNAL_PROGRAM_ERROR;
 1834|      0|            return NONE;
 1835|      4|        }
 1836|    140|        return NONE;
 1837|    144|    }
dtfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_116CalendarDataSink15processResourceERNS_13UnicodeStringEPKcRNS_13ResourceValueER10UErrorCode:
 1676|     58|    void processResource(UnicodeString &path, const char *key, ResourceValue &value, UErrorCode &errorCode) {
 1677|     58|        if (U_FAILURE(errorCode)) return;
  ------------------
  |  Branch (1677:13): [True: 0, False: 58]
  ------------------
 1678|       |
 1679|     58|        ResourceTable table = value.getTable(errorCode);
 1680|     58|        if (U_FAILURE(errorCode)) return;
  ------------------
  |  Branch (1680:13): [True: 0, False: 58]
  ------------------
 1681|     58|        Hashtable* stringMap = nullptr;
 1682|       |
 1683|       |        // Iterate over all the elements of the table and add them to the map
 1684|    278|        for (int i = 0; table.getKeyAndValue(i, key, value); i++) {
  ------------------
  |  Branch (1684:25): [True: 220, False: 58]
  ------------------
 1685|    220|            UnicodeString keyUString(key, -1, US_INV);
  ------------------
  |  |   98|    220|#define US_INV icu::UnicodeString::kInvariant
  ------------------
 1686|       |
 1687|       |            // Ignore '%variant' keys
 1688|    220|            if (keyUString.endsWith(kVariantTagUChar, UPRV_LENGTHOF(kVariantTagUChar))) {
  ------------------
  |  |   99|    220|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1688:17): [True: 4, False: 216]
  ------------------
 1689|      4|                continue;
 1690|      4|            }
 1691|       |
 1692|       |            // == Handle String elements ==
 1693|    216|            if (value.getType() == URES_STRING) {
  ------------------
  |  Branch (1693:17): [True: 84, False: 132]
  ------------------
 1694|       |                // We are on a leaf, store the map elements into the stringMap
 1695|     84|                if (i == 0) {
  ------------------
  |  Branch (1695:21): [True: 12, False: 72]
  ------------------
 1696|       |                    // mapRefs will keep ownership of 'stringMap':
 1697|     12|                    stringMap = mapRefs.create(false, errorCode);
 1698|     12|                    if (stringMap == nullptr) {
  ------------------
  |  Branch (1698:25): [True: 0, False: 12]
  ------------------
 1699|      0|                        errorCode = U_MEMORY_ALLOCATION_ERROR;
 1700|      0|                        return;
 1701|      0|                    }
 1702|     12|                    maps.put(path, stringMap, errorCode);
 1703|     12|                    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1703:25): [True: 0, False: 12]
  ------------------
 1704|     12|                    stringMap->setValueDeleter(uprv_deleteUObject);
  ------------------
  |  | 1489|     12|#define uprv_deleteUObject U_ICU_ENTRY_POINT_RENAME(uprv_deleteUObject)
  |  |  ------------------
  |  |  |  |  123|     12|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     12|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     12|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1705|     12|                }
 1706|     84|                U_ASSERT(stringMap != nullptr);
  ------------------
  |  |   35|     84|#   define U_ASSERT(exp) (void)0
  ------------------
 1707|     84|                int32_t valueStringSize;
 1708|     84|                const char16_t *valueString = value.getString(valueStringSize, errorCode);
 1709|     84|                if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1709:21): [True: 0, False: 84]
  ------------------
 1710|     84|                LocalPointer<UnicodeString> valueUString(new UnicodeString(true, valueString, valueStringSize), errorCode);
 1711|     84|                stringMap->put(keyUString, valueUString.orphan(), errorCode);
 1712|     84|                if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1712:21): [True: 0, False: 84]
  ------------------
 1713|     84|                continue;
 1714|     84|            }
 1715|    132|            U_ASSERT(stringMap == nullptr);
  ------------------
  |  |   35|    132|#   define U_ASSERT(exp) (void)0
  ------------------
 1716|       |
 1717|       |            // Store the current path's length and append the current key to the path.
 1718|    132|            int32_t pathLength = path.length();
 1719|    132|            path.append(SOLIDUS).append(keyUString);
  ------------------
  |  |   35|    132|#define SOLIDUS           ((char16_t)0x002F)
  ------------------
 1720|       |
 1721|       |            // In cyclicNameSets ignore everything but years/format/abbreviated
 1722|       |            // and zodiacs/format/abbreviated
 1723|    132|            if (path.startsWith(kCyclicNameSetsTagUChar, UPRV_LENGTHOF(kCyclicNameSetsTagUChar))) {
  ------------------
  |  |   99|    132|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1723:17): [True: 0, False: 132]
  ------------------
 1724|      0|                UBool skip = true;
 1725|      0|                int32_t startIndex = UPRV_LENGTHOF(kCyclicNameSetsTagUChar);
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1726|      0|                int32_t length = 0;
 1727|      0|                if (startIndex == path.length()
  ------------------
  |  Branch (1727:21): [True: 0, False: 0]
  ------------------
 1728|      0|                    || path.compare(startIndex, (length = UPRV_LENGTHOF(kZodiacsUChar)), kZodiacsUChar, 0, UPRV_LENGTHOF(kZodiacsUChar)) == 0
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
                                  || path.compare(startIndex, (length = UPRV_LENGTHOF(kZodiacsUChar)), kZodiacsUChar, 0, UPRV_LENGTHOF(kZodiacsUChar)) == 0
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1728:24): [True: 0, False: 0]
  ------------------
 1729|      0|                    || path.compare(startIndex, (length = UPRV_LENGTHOF(kYearsTagUChar)), kYearsTagUChar, 0, UPRV_LENGTHOF(kYearsTagUChar)) == 0
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
                                  || path.compare(startIndex, (length = UPRV_LENGTHOF(kYearsTagUChar)), kYearsTagUChar, 0, UPRV_LENGTHOF(kYearsTagUChar)) == 0
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1729:24): [True: 0, False: 0]
  ------------------
 1730|      0|                    || path.compare(startIndex, (length = UPRV_LENGTHOF(kDayPartsTagUChar)), kDayPartsTagUChar, 0, UPRV_LENGTHOF(kDayPartsTagUChar)) == 0) {
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
                                  || path.compare(startIndex, (length = UPRV_LENGTHOF(kDayPartsTagUChar)), kDayPartsTagUChar, 0, UPRV_LENGTHOF(kDayPartsTagUChar)) == 0) {
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1730:24): [True: 0, False: 0]
  ------------------
 1731|      0|                    startIndex += length;
 1732|      0|                    length = 0;
 1733|      0|                    if (startIndex == path.length()
  ------------------
  |  Branch (1733:25): [True: 0, False: 0]
  ------------------
 1734|      0|                        || path.compare(startIndex, (length = UPRV_LENGTHOF(kFormatTagUChar)), kFormatTagUChar, 0, UPRV_LENGTHOF(kFormatTagUChar)) == 0) {
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
                                      || path.compare(startIndex, (length = UPRV_LENGTHOF(kFormatTagUChar)), kFormatTagUChar, 0, UPRV_LENGTHOF(kFormatTagUChar)) == 0) {
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1734:28): [True: 0, False: 0]
  ------------------
 1735|      0|                        startIndex += length;
 1736|      0|                        length = 0;
 1737|      0|                        if (startIndex == path.length()
  ------------------
  |  Branch (1737:29): [True: 0, False: 0]
  ------------------
 1738|      0|                            || path.compare(startIndex, (length = UPRV_LENGTHOF(kAbbrTagUChar)), kAbbrTagUChar, 0, UPRV_LENGTHOF(kAbbrTagUChar)) == 0) {
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
                                          || path.compare(startIndex, (length = UPRV_LENGTHOF(kAbbrTagUChar)), kAbbrTagUChar, 0, UPRV_LENGTHOF(kAbbrTagUChar)) == 0) {
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1738:32): [True: 0, False: 0]
  ------------------
 1739|      0|                            skip = false;
 1740|      0|                        }
 1741|      0|                    }
 1742|      0|                }
 1743|      0|                if (skip) {
  ------------------
  |  Branch (1743:21): [True: 0, False: 0]
  ------------------
 1744|       |                    // Drop the latest key on the path and continue
 1745|      0|                    path.retainBetween(0, pathLength);
 1746|      0|                    continue;
 1747|      0|                }
 1748|      0|            }
 1749|       |
 1750|       |            // == Handle aliases ==
 1751|    132|            if (arrays.get(path) != nullptr || maps.get(path) != nullptr) {
  ------------------
  |  Branch (1751:17): [True: 46, False: 86]
  |  Branch (1751:48): [True: 0, False: 86]
  ------------------
 1752|       |                // Drop the latest key on the path and continue
 1753|     46|                path.retainBetween(0, pathLength);
 1754|     46|                continue;
 1755|     46|            }
 1756|       |
 1757|     86|            AliasType aliasType = processAliasFromValue(path, value, errorCode);
 1758|     86|            if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1758:17): [True: 0, False: 86]
  ------------------
 1759|     86|            if (aliasType == SAME_CALENDAR) {
  ------------------
  |  Branch (1759:17): [True: 0, False: 86]
  ------------------
 1760|       |                // Store the alias path and the current path on aliasPathPairs
 1761|      0|                LocalPointer<UnicodeString> aliasRelativePathCopy(aliasRelativePath.clone(), errorCode);
 1762|      0|                aliasPathPairs.adoptElement(aliasRelativePathCopy.orphan(), errorCode);
 1763|      0|                if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1763:21): [True: 0, False: 0]
  ------------------
 1764|      0|                LocalPointer<UnicodeString> pathCopy(path.clone(), errorCode);
 1765|      0|                aliasPathPairs.adoptElement(pathCopy.orphan(), errorCode);
 1766|      0|                if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1766:21): [True: 0, False: 0]
  ------------------
 1767|       |
 1768|       |                // Drop the latest key on the path and continue
 1769|      0|                path.retainBetween(0, pathLength);
 1770|      0|                continue;
 1771|      0|            }
 1772|     86|            U_ASSERT(aliasType == NONE);
  ------------------
  |  |   35|     86|#   define U_ASSERT(exp) (void)0
  ------------------
 1773|       |
 1774|       |            // == Handle data ==
 1775|     86|            if (value.getType() == URES_ARRAY) {
  ------------------
  |  Branch (1775:17): [True: 46, False: 40]
  ------------------
 1776|       |                // We are on a leaf, store the array
 1777|     46|                ResourceArray rDataArray = value.getArray(errorCode);
 1778|     46|                int32_t dataArraySize = rDataArray.getSize();
 1779|     46|                LocalArray<UnicodeString> dataArray(new UnicodeString[dataArraySize], errorCode);
 1780|     46|                value.getStringArray(dataArray.getAlias(), dataArraySize, errorCode);
 1781|     46|                arrays.put(path, dataArray.orphan(), errorCode);
 1782|     46|                arraySizes.puti(path, dataArraySize, errorCode);
 1783|     46|                if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1783:21): [True: 0, False: 46]
  ------------------
 1784|     46|            } else if (value.getType() == URES_TABLE) {
  ------------------
  |  Branch (1784:24): [True: 40, False: 0]
  ------------------
 1785|       |                // We are not on a leaf, recursively process the subtable.
 1786|     40|                processResource(path, key, value, errorCode);
 1787|     40|                if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1787:21): [True: 0, False: 40]
  ------------------
 1788|     40|            }
 1789|       |
 1790|       |            // Drop the latest key on the path
 1791|     86|            path.retainBetween(0, pathLength);
 1792|     86|        }
 1793|     58|    }
dtfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_116CalendarDataSink12preEnumerateERKNS_13UnicodeStringE:
 1546|      2|    void preEnumerate(const UnicodeString &calendarType) {
 1547|      2|        currentCalendarType = calendarType;
 1548|      2|        nextCalendarType.setToBogus();
 1549|      2|        aliasPathPairs.removeAllElements();
 1550|      2|    }
dtfmtsym.cpp:_ZN6icu_78L20initLeapMonthPatternEPNS_13UnicodeStringEiRNS_12_GLOBAL__N_116CalendarDataSinkERNS_10CharStringER10UErrorCode:
 1912|     14|initLeapMonthPattern(UnicodeString *field, int32_t index, CalendarDataSink &sink, CharString &path, UErrorCode &status) {
 1913|     14|    field[index].remove();
 1914|     14|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1914:9): [True: 2, False: 12]
  ------------------
 1915|      2|        UnicodeString pathUString(path.data(), -1, US_INV);
  ------------------
  |  |   98|      2|#define US_INV icu::UnicodeString::kInvariant
  ------------------
 1916|      2|        Hashtable *leapMonthTable = static_cast<Hashtable*>(sink.maps.get(pathUString));
 1917|      2|        if (leapMonthTable != nullptr) {
  ------------------
  |  Branch (1917:13): [True: 0, False: 2]
  ------------------
 1918|      0|            UnicodeString leapLabel(false, kLeapTagUChar, UPRV_LENGTHOF(kLeapTagUChar));
  ------------------
  |  |   99|      0|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1919|      0|            UnicodeString *leapMonthPattern = static_cast<UnicodeString*>(leapMonthTable->get(leapLabel));
 1920|      0|            if (leapMonthPattern != nullptr) {
  ------------------
  |  Branch (1920:17): [True: 0, False: 0]
  ------------------
 1921|      0|                field[index].fastCopyFrom(*leapMonthPattern);
 1922|      0|            } else {
 1923|      0|                field[index].setToBogus();
 1924|      0|            }
 1925|      0|            return;
 1926|      0|        }
 1927|      2|        status = U_MISSING_RESOURCE_ERROR;
 1928|      2|    }
 1929|     14|}
dtfmtsym.cpp:_ZN6icu_78L17buildResourcePathERNS_10CharStringEPKcS3_S3_R10UErrorCode:
 1945|     70|                   const char* segment3, UErrorCode &errorCode) {
 1946|     70|    return buildResourcePath(path, segment1, segment2, errorCode).append('/', errorCode)
 1947|     70|                                                                 .append(segment3, -1, errorCode);
 1948|     70|}
dtfmtsym.cpp:_ZN6icu_78L9initFieldEPPNS_13UnicodeStringERiRNS_12_GLOBAL__N_116CalendarDataSinkERNS_10CharStringER10UErrorCode:
 1872|     38|initField(UnicodeString **field, int32_t& length, CalendarDataSink &sink, CharString &key, UErrorCode &status) {
 1873|     38|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1873:9): [True: 36, False: 2]
  ------------------
 1874|     36|        UnicodeString keyUString(key.data(), -1, US_INV);
  ------------------
  |  |   98|     36|#define US_INV icu::UnicodeString::kInvariant
  ------------------
 1875|     36|        UnicodeString* array = static_cast<UnicodeString*>(sink.arrays.get(keyUString));
 1876|       |
 1877|     36|        if (array != nullptr) {
  ------------------
  |  Branch (1877:13): [True: 34, False: 2]
  ------------------
 1878|     34|            length = sink.arraySizes.geti(keyUString);
 1879|     34|            *field = array;
 1880|       |            // DateFormatSymbols takes ownership of the array:
 1881|     34|            sink.arrays.remove(keyUString);
 1882|     34|        } else {
 1883|      2|            length = 0;
 1884|      2|            status = U_MISSING_RESOURCE_ERROR;
 1885|      2|        }
 1886|     36|    }
 1887|     38|}
dtfmtsym.cpp:_ZN6icu_78L17buildResourcePathERNS_10CharStringEPKcS3_S3_S3_R10UErrorCode:
 1952|      4|                   const char* segment3, const char* segment4, UErrorCode &errorCode) {
 1953|      4|    return buildResourcePath(path, segment1, segment2, segment3, errorCode).append('/', errorCode)
 1954|      4|                                                                           .append(segment4, -1, errorCode);
 1955|      4|}
dtfmtsym.cpp:_ZN6icu_7820loadDayPeriodStringsERNS_12_GLOBAL__N_116CalendarDataSinkERNS_10CharStringERiR10UErrorCode:
 1988|     12|                                    int32_t &stringCount,  UErrorCode &status) {
 1989|     12|    if (U_FAILURE(status)) { return nullptr; }
  ------------------
  |  Branch (1989:9): [True: 0, False: 12]
  ------------------
 1990|       |
 1991|     12|    UnicodeString pathUString(path.data(), -1, US_INV);
  ------------------
  |  |   98|     12|#define US_INV icu::UnicodeString::kInvariant
  ------------------
 1992|     12|    Hashtable* map = static_cast<Hashtable*>(sink.maps.get(pathUString));
 1993|       |
 1994|     12|    stringCount = UPRV_LENGTHOF(dayPeriodKeys);
  ------------------
  |  |   99|     12|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1995|     12|    UnicodeString *strings = new UnicodeString[stringCount];
 1996|     12|    if (strings == nullptr) {
  ------------------
  |  Branch (1996:9): [True: 0, False: 12]
  ------------------
 1997|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1998|      0|        return nullptr;
 1999|      0|    }
 2000|       |
 2001|     12|    if (map != nullptr) {
  ------------------
  |  Branch (2001:9): [True: 12, False: 0]
  ------------------
 2002|    132|        for (int32_t i = 0; i < stringCount; ++i) {
  ------------------
  |  Branch (2002:29): [True: 120, False: 12]
  ------------------
 2003|    120|            UnicodeString dayPeriodKey(dayPeriodKeys[i], -1, US_INV);
  ------------------
  |  |   98|    120|#define US_INV icu::UnicodeString::kInvariant
  ------------------
 2004|    120|            UnicodeString *dayPeriod = static_cast<UnicodeString*>(map->get(dayPeriodKey));
 2005|    120|            if (dayPeriod != nullptr) {
  ------------------
  |  Branch (2005:17): [True: 72, False: 48]
  ------------------
 2006|     72|                strings[i].fastCopyFrom(*dayPeriod);
 2007|     72|            } else {
 2008|     48|                strings[i].setToBogus();
 2009|     48|            }
 2010|    120|        }
 2011|     12|    } else {
 2012|      0|        for (int32_t i = 0; i < stringCount; i++) {
  ------------------
  |  Branch (2012:29): [True: 0, False: 0]
  ------------------
 2013|      0|            strings[i].setToBogus();
 2014|      0|        }
 2015|      0|    }
 2016|     12|    return strings;
 2017|     12|}
dtfmtsym.cpp:_ZN6icu_78L17buildResourcePathERNS_10CharStringEPKcS3_R10UErrorCode:
 1938|     76|                   UErrorCode &errorCode) {
 1939|     76|    return buildResourcePath(path, segment1, errorCode).append('/', errorCode)
 1940|     76|                                                       .append(segment2, -1, errorCode);
 1941|     76|}
dtfmtsym.cpp:_ZN6icu_78L17buildResourcePathERNS_10CharStringEPKcR10UErrorCode:
 1932|     80|&buildResourcePath(CharString &path, const char* segment1, UErrorCode &errorCode) {
 1933|     80|    return path.clear().append(segment1, -1, errorCode);
 1934|     80|}
dtfmtsym.cpp:_ZN6icu_78L9initFieldEPPNS_13UnicodeStringERiRNS_12_GLOBAL__N_116CalendarDataSinkERNS_10CharStringEiR10UErrorCode:
 1890|     16|initField(UnicodeString **field, int32_t& length, CalendarDataSink &sink, CharString &key, int32_t arrayOffset, UErrorCode &status) {
 1891|     16|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1891:9): [True: 16, False: 0]
  ------------------
 1892|     16|        UnicodeString keyUString(key.data(), -1, US_INV);
  ------------------
  |  |   98|     16|#define US_INV icu::UnicodeString::kInvariant
  ------------------
 1893|     16|        UnicodeString* array = static_cast<UnicodeString*>(sink.arrays.get(keyUString));
 1894|       |
 1895|     16|        if (array != nullptr) {
  ------------------
  |  Branch (1895:13): [True: 16, False: 0]
  ------------------
 1896|     16|            int32_t arrayLength = sink.arraySizes.geti(keyUString);
 1897|     16|            length = arrayLength + arrayOffset;
 1898|     16|            *field = new UnicodeString[length];
 1899|     16|            if (*field == nullptr) {
  ------------------
  |  Branch (1899:17): [True: 0, False: 16]
  ------------------
 1900|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 1901|      0|                return;
 1902|      0|            }
 1903|     16|            uprv_arrayCopy(array, 0, *field, arrayOffset, arrayLength);
 1904|     16|        } else {
 1905|      0|            length = 0;
 1906|      0|            status = U_MISSING_RESOURCE_ERROR;
 1907|      0|        }
 1908|     16|    }
 1909|     16|}
dtfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_116CalendarDataSinkD2Ev:
 1845|      2|CalendarDataSink::~CalendarDataSink() {
 1846|      2|    arrays.setValueDeleter(deleteUnicodeStringArray);
 1847|      2|}
dtfmtsym.cpp:_ZN6icu_7812_GLOBAL__N_116CalendarDataSink24deleteUnicodeStringArrayEPv:
 1840|     18|    static void U_CALLCONV deleteUnicodeStringArray(void *uArray) {
 1841|     18|        delete[] static_cast<UnicodeString *>(uArray);
 1842|     18|    }

_ZN6icu_7824DateTimePatternGenerator14createInstanceERKNS_6LocaleER10UErrorCode:
  306|  2.04k|DateTimePatternGenerator::createInstance(const Locale& locale, UErrorCode& status) {
  307|  2.04k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (307:9): [True: 0, False: 2.04k]
  ------------------
  308|      0|        return nullptr;
  309|      0|    }
  310|  2.04k|    LocalPointer<DateTimePatternGenerator> result(
  311|  2.04k|            new DateTimePatternGenerator(locale, status), status);
  312|  2.04k|    return U_SUCCESS(status) ? result.orphan() : nullptr;
  ------------------
  |  Branch (312:12): [True: 2.04k, False: 0]
  ------------------
  313|  2.04k|}
_ZN6icu_7824DateTimePatternGeneratorC2ERKNS_6LocaleER10UErrorCodea:
  351|  2.04k|    skipMatcher(nullptr),
  352|  2.04k|    fAvailableFormatKeyHash(nullptr),
  353|  2.04k|    fDefaultHourFormatChar(0),
  354|  2.04k|    internalErrorCode(U_ZERO_ERROR)
  355|  2.04k|{
  356|  2.04k|    fp = new FormatParser();
  357|  2.04k|    dtMatcher = new DateTimeMatcher();
  358|  2.04k|    distanceInfo = new DistanceInfo();
  359|  2.04k|    patternMap = new PatternMap();
  360|  2.04k|    if (fp == nullptr || dtMatcher == nullptr || distanceInfo == nullptr || patternMap == nullptr) {
  ------------------
  |  Branch (360:9): [True: 0, False: 2.04k]
  |  Branch (360:26): [True: 0, False: 2.04k]
  |  Branch (360:50): [True: 0, False: 2.04k]
  |  Branch (360:77): [True: 0, False: 2.04k]
  ------------------
  361|      0|        internalErrorCode = status = U_MEMORY_ALLOCATION_ERROR;
  362|      0|    }
  363|  2.04k|    else {
  364|  2.04k|        initData(locale, status, skipStdPatterns);
  365|  2.04k|    }
  366|  2.04k|}
_ZN6icu_7824DateTimePatternGeneratorD2Ev:
  465|  2.04k|DateTimePatternGenerator::~DateTimePatternGenerator() {
  466|  2.04k|    delete fAvailableFormatKeyHash;
  467|  2.04k|    delete fp;
  468|  2.04k|    delete dtMatcher;
  469|  2.04k|    delete distanceInfo;
  470|  2.04k|    delete patternMap;
  471|  2.04k|    delete skipMatcher;
  472|  2.04k|}
_ZN6icu_7824DateTimePatternGenerator8initDataERKNS_6LocaleER10UErrorCodea:
  508|  2.04k|DateTimePatternGenerator::initData(const Locale& locale, UErrorCode &status, UBool skipStdPatterns) {
  509|       |    //const char *baseLangName = locale.getBaseName(); // unused
  510|  2.04k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (510:9): [True: 0, False: 2.04k]
  ------------------
  511|  2.04k|    if (locale.isBogus()) {
  ------------------
  |  Branch (511:9): [True: 0, False: 2.04k]
  ------------------
  512|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  513|      0|        return;
  514|      0|    }
  515|       |
  516|  2.04k|    skipMatcher = nullptr;
  517|  2.04k|    fAvailableFormatKeyHash=nullptr;
  518|  2.04k|    addCanonicalItems(status);
  519|  2.04k|    if (!skipStdPatterns) { // skip to prevent circular dependency when called from SimpleDateFormat::construct
  ------------------
  |  Branch (519:9): [True: 2.04k, False: 0]
  ------------------
  520|  2.04k|        addICUPatterns(locale, status);
  521|  2.04k|    }
  522|  2.04k|    addCLDRData(locale, status);
  523|  2.04k|    setDateTimeFromCalendar(locale, status);
  524|  2.04k|    setDecimalSymbols(locale, status);
  525|  2.04k|    umtx_initOnce(initOnce, loadAllowedHourFormatsData, status);
  526|  2.04k|    getAllowedHourFormats(locale, status);
  527|       |    // If any of the above methods failed then the object is in an invalid state.
  528|  2.04k|    internalErrorCode = status;
  529|  2.04k|} // DateTimePatternGenerator::initData
_ZN6icu_7824DateTimePatternGenerator26loadAllowedHourFormatsDataER10UErrorCode:
  621|      1|U_CFUNC void U_CALLCONV DateTimePatternGenerator::loadAllowedHourFormatsData(UErrorCode &status) {
  622|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (622:9): [True: 0, False: 1]
  ------------------
  623|      1|    localeToAllowedHourFormatsMap = 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  624|      1|        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_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  625|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (625:9): [True: 0, False: 1]
  ------------------
  626|       |
  627|      1|    uhash_setValueDeleter(localeToAllowedHourFormatsMap, deleteAllowedHourFormats);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  uhash_setValueDeleter(localeToAllowedHourFormatsMap, deleteAllowedHourFormats);
  ------------------
  |  |  121|      1|#define deleteAllowedHourFormats U_ICU_ENTRY_POINT_RENAME(deleteAllowedHourFormats)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  628|      1|    ucln_i18n_registerCleanup(UCLN_I18N_ALLOWED_HOUR_FORMATS, allowedHourFormatsCleanup);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  ucln_i18n_registerCleanup(UCLN_I18N_ALLOWED_HOUR_FORMATS, allowedHourFormatsCleanup);
  ------------------
  |  |  118|      1|#define allowedHourFormatsCleanup U_ICU_ENTRY_POINT_RENAME(allowedHourFormatsCleanup)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  629|       |
  630|      1|    LocalUResourceBundlePointer rb(ures_openDirect(nullptr, "supplementalData", &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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  631|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (631:9): [True: 0, False: 1]
  ------------------
  632|       |
  633|      1|    AllowedHourFormatsSink sink;
  634|       |    // TODO: Currently in the enumeration each table allocates a new array.
  635|       |    // Try to reduce the number of memory allocations. Consider storing a
  636|       |    // UVector32 with the concatenation of all of the sub-arrays, put the start index
  637|       |    // into the hashmap, store 6 single-value sub-arrays right at the beginning of the
  638|       |    // vector (at index enum*2) for easy data sharing, copy sub-arrays into runtime
  639|       |    // object. Remember to clean up the vector, too.
  640|      1|    ures_getAllItemsWithFallback(rb.getAlias(), "timeData", 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  641|      1|}
_ZN6icu_7824DateTimePatternGenerator21getAllowedHourFormatsERKNS_6LocaleER10UErrorCode:
  658|  2.04k|void DateTimePatternGenerator::getAllowedHourFormats(const Locale &locale, UErrorCode &status) {
  659|  2.04k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (659:9): [True: 0, False: 2.04k]
  ------------------
  660|       |
  661|  2.04k|    const char *language = locale.getLanguage();
  662|  2.04k|    CharString baseCountry = ulocimp_getRegionForSupplementalData(locale.getName(), false, status);
  ------------------
  |  | 1207|  2.04k|#define ulocimp_getRegionForSupplementalData U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegionForSupplementalData)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  663|  2.04k|    const char* country = baseCountry.data();
  664|       |
  665|  2.04k|    Locale maxLocale;  // must be here for correct lifetime
  666|  2.04k|    if (*language == '\0' || *country == '\0') {
  ------------------
  |  Branch (666:9): [True: 0, False: 2.04k]
  |  Branch (666:30): [True: 0, False: 2.04k]
  ------------------
  667|      0|        maxLocale = locale;
  668|      0|        UErrorCode localStatus = U_ZERO_ERROR;
  669|      0|        maxLocale.addLikelySubtags(localStatus);
  670|      0|        if (U_SUCCESS(localStatus)) {
  ------------------
  |  Branch (670:13): [True: 0, False: 0]
  ------------------
  671|      0|            language = maxLocale.getLanguage();
  672|      0|            country = maxLocale.getCountry();
  673|      0|        }
  674|      0|    }
  675|  2.04k|    if (*language == '\0') {
  ------------------
  |  Branch (675:9): [True: 0, False: 2.04k]
  ------------------
  676|       |        // Unexpected, but fail gracefully
  677|      0|        language = "und";
  678|      0|    }
  679|  2.04k|    if (*country == '\0') {
  ------------------
  |  Branch (679:9): [True: 0, False: 2.04k]
  ------------------
  680|      0|        country = "001";
  681|      0|    }
  682|       |
  683|  2.04k|    int32_t* allowedFormats = getAllowedHourFormatsLangCountry(language, country, status);
  684|       |
  685|       |    // We need to check if there is an hour cycle on locale
  686|  2.04k|    char buffer[8];
  687|  2.04k|    int32_t count = locale.getKeywordValue("hours", buffer, sizeof(buffer), status);
  688|       |
  689|  2.04k|    fDefaultHourFormatChar = 0;
  690|  2.04k|    if (U_SUCCESS(status) && count > 0) {
  ------------------
  |  Branch (690:9): [True: 2.04k, False: 0]
  |  Branch (690:30): [True: 0, False: 2.04k]
  ------------------
  691|      0|        if(uprv_strcmp(buffer, "h24") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (691:12): [True: 0, False: 0]
  ------------------
  692|      0|            fDefaultHourFormatChar = LOW_K;
  ------------------
  |  |   79|      0|#define LOW_K             ((char16_t)0x006B)
  ------------------
  693|      0|        } else if(uprv_strcmp(buffer, "h23") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (693:19): [True: 0, False: 0]
  ------------------
  694|      0|            fDefaultHourFormatChar = CAP_H;
  ------------------
  |  |   53|      0|#define CAP_H             ((char16_t)0x0048)
  ------------------
  695|      0|        } else if(uprv_strcmp(buffer, "h12") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (695:19): [True: 0, False: 0]
  ------------------
  696|      0|            fDefaultHourFormatChar = LOW_H;
  ------------------
  |  |   76|      0|#define LOW_H             ((char16_t)0x0068)
  ------------------
  697|      0|        } else if(uprv_strcmp(buffer, "h11") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (697:19): [True: 0, False: 0]
  ------------------
  698|      0|            fDefaultHourFormatChar = CAP_K;
  ------------------
  |  |   55|      0|#define CAP_K             ((char16_t)0x004B)
  ------------------
  699|      0|        }
  700|      0|    }
  701|       |
  702|       |    // Check if the region has an alias
  703|  2.04k|    if (allowedFormats == nullptr) {
  ------------------
  |  Branch (703:9): [True: 0, False: 2.04k]
  ------------------
  704|      0|        UErrorCode localStatus = U_ZERO_ERROR;
  705|      0|        const Region* region = Region::getInstance(country, localStatus);
  706|      0|        if (U_SUCCESS(localStatus)) {
  ------------------
  |  Branch (706:13): [True: 0, False: 0]
  ------------------
  707|      0|            country = region->getRegionCode(); // the real region code
  708|      0|            allowedFormats = getAllowedHourFormatsLangCountry(language, country, status);
  709|      0|        }
  710|      0|    }
  711|       |
  712|  2.04k|    if (allowedFormats != nullptr) {  // Lookup is successful
  ------------------
  |  Branch (712:9): [True: 2.04k, False: 0]
  ------------------
  713|       |        // Here allowedFormats points to a list consisting of key for preferredFormat,
  714|       |        // followed by one or more keys for allowedFormats, then followed by ALLOWED_HOUR_FORMAT_UNKNOWN.
  715|  2.04k|        if (!fDefaultHourFormatChar) {
  ------------------
  |  Branch (715:13): [True: 2.04k, False: 0]
  ------------------
  716|  2.04k|            switch (allowedFormats[0]) {
  717|  2.04k|                case ALLOWED_HOUR_FORMAT_h: fDefaultHourFormatChar = LOW_H; break;
  ------------------
  |  |   76|  2.04k|#define LOW_H             ((char16_t)0x0068)
  ------------------
  |  Branch (717:17): [True: 2.04k, False: 0]
  ------------------
  718|      0|                case ALLOWED_HOUR_FORMAT_H: fDefaultHourFormatChar = CAP_H; break;
  ------------------
  |  |   53|      0|#define CAP_H             ((char16_t)0x0048)
  ------------------
  |  Branch (718:17): [True: 0, False: 2.04k]
  ------------------
  719|      0|                case ALLOWED_HOUR_FORMAT_K: fDefaultHourFormatChar = CAP_K; break;
  ------------------
  |  |   55|      0|#define CAP_K             ((char16_t)0x004B)
  ------------------
  |  Branch (719:17): [True: 0, False: 2.04k]
  ------------------
  720|      0|                case ALLOWED_HOUR_FORMAT_k: fDefaultHourFormatChar = LOW_K; break;
  ------------------
  |  |   79|      0|#define LOW_K             ((char16_t)0x006B)
  ------------------
  |  Branch (720:17): [True: 0, False: 2.04k]
  ------------------
  721|      0|                default: fDefaultHourFormatChar = CAP_H; break;
  ------------------
  |  |   53|      0|#define CAP_H             ((char16_t)0x0048)
  ------------------
  |  Branch (721:17): [True: 0, False: 2.04k]
  ------------------
  722|  2.04k|            }
  723|  2.04k|        }
  724|       |
  725|  10.2k|        for (int32_t i = 0; i < UPRV_LENGTHOF(fAllowedHourFormats); ++i) {
  ------------------
  |  |   99|  10.2k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (725:29): [True: 10.2k, False: 0]
  ------------------
  726|  10.2k|            fAllowedHourFormats[i] = allowedFormats[i + 1];
  727|  10.2k|            if (fAllowedHourFormats[i] == ALLOWED_HOUR_FORMAT_UNKNOWN) {
  ------------------
  |  Branch (727:17): [True: 2.04k, False: 8.17k]
  ------------------
  728|  2.04k|                break;
  729|  2.04k|            }
  730|  10.2k|        }
  731|  2.04k|    } else {  // Lookup failed, twice
  732|      0|        if (!fDefaultHourFormatChar) {
  ------------------
  |  Branch (732:13): [True: 0, False: 0]
  ------------------
  733|      0|            fDefaultHourFormatChar = CAP_H;
  ------------------
  |  |   53|      0|#define CAP_H             ((char16_t)0x0048)
  ------------------
  734|      0|        }
  735|      0|        fAllowedHourFormats[0] = ALLOWED_HOUR_FORMAT_H;
  736|      0|        fAllowedHourFormats[1] = ALLOWED_HOUR_FORMAT_UNKNOWN;
  737|      0|    }
  738|  2.04k|}
_ZN6icu_7824DateTimePatternGenerator17staticGetSkeletonERKNS_13UnicodeStringER10UErrorCode:
  777|  36.9k|        const UnicodeString& pattern, UErrorCode& /*status*/) {
  778|  36.9k|    FormatParser fp;
  779|  36.9k|    DateTimeMatcher matcher;
  780|  36.9k|    PtnSkeleton localSkeleton;
  781|  36.9k|    matcher.set(pattern, &fp, localSkeleton);
  782|  36.9k|    return localSkeleton.getSkeleton();
  783|  36.9k|}
_ZN6icu_7824DateTimePatternGenerator14addICUPatternsERKNS_6LocaleER10UErrorCode:
  805|  2.04k|DateTimePatternGenerator::addICUPatterns(const Locale& locale, UErrorCode& status) {
  806|  2.04k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (806:9): [True: 0, False: 2.04k]
  ------------------
  807|      0|        return;
  808|      0|    }
  809|       |    
  810|  2.04k|    LocalUResourceBundlePointer rb(ures_open(nullptr, locale.getBaseName(), &status));
  ------------------
  |  | 1691|  2.04k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  811|  2.04k|    CharString calendarTypeToUse; // to be filled in with the type to use, if all goes well
  812|  2.04k|    getCalendarTypeToUse(locale, calendarTypeToUse, status);
  813|       |
  814|       |    // HACK to get around the fact that the old SimpleDateFormat code (actually, Calendar::getCalendarTypeForLocale() )
  815|       |    // returns "gregorian" for ja_JP_TRADITIONAL instead of "japanese"
  816|  2.04k|    if (uprv_strcmp(locale.getBaseName(), "ja_JP_TRADITIONAL") == 0) {
  ------------------
  |  |   38|  2.04k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  2.04k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (816:9): [True: 0, False: 2.04k]
  ------------------
  817|      0|        calendarTypeToUse.clear().append("gregorian", status);
  818|      0|    }
  819|       |    
  820|  2.04k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (820:9): [True: 0, False: 2.04k]
  ------------------
  821|      0|        return;
  822|      0|    }
  823|       |
  824|       |    // TODO: See ICU-22867
  825|  2.04k|    CharString patternResourcePath;
  826|  2.04k|    patternResourcePath.append(DT_DateTimeCalendarTag, status)
  827|  2.04k|        .append('/', status)
  828|  2.04k|        .append(calendarTypeToUse, status)
  829|  2.04k|        .append('/', status)
  830|  2.04k|        .append(DT_DateTimePatternsTag, status);
  831|       |
  832|  2.04k|    LocalUResourceBundlePointer dateTimePatterns(ures_getByKeyWithFallback(rb.getAlias(), patternResourcePath.data(),
  ------------------
  |  | 1662|  2.04k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  833|  2.04k|                                                                           nullptr, &status));
  834|  2.04k|    if (ures_getType(dateTimePatterns.getAlias()) != URES_ARRAY || ures_getSize(dateTimePatterns.getAlias()) < 8) {
  ------------------
  |  | 1679|  2.04k|#define ures_getType U_ICU_ENTRY_POINT_RENAME(ures_getType)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  if (ures_getType(dateTimePatterns.getAlias()) != URES_ARRAY || ures_getSize(dateTimePatterns.getAlias()) < 8) {
  ------------------
  |  | 1674|  2.04k|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (834:9): [True: 0, False: 2.04k]
  |  Branch (834:68): [True: 0, False: 2.04k]
  ------------------
  835|      0|        status = U_INVALID_FORMAT_ERROR;
  836|      0|        return;
  837|      0|    }
  838|       |
  839|  18.3k|    for (int32_t i = 0; U_SUCCESS(status) && i < DateFormat::kDateTime; i++) {
  ------------------
  |  Branch (839:25): [True: 18.3k, False: 0]
  |  Branch (839:46): [True: 16.3k, False: 2.04k]
  ------------------
  840|  16.3k|        LocalUResourceBundlePointer patternRes(ures_getByIndex(dateTimePatterns.getAlias(), i, nullptr, &status));
  ------------------
  |  | 1660|  16.3k|#define ures_getByIndex U_ICU_ENTRY_POINT_RENAME(ures_getByIndex)
  |  |  ------------------
  |  |  |  |  123|  16.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  16.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  16.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  841|  16.3k|        UnicodeString pattern;
  842|  16.3k|        switch (ures_getType(patternRes.getAlias())) {
  ------------------
  |  | 1679|  16.3k|#define ures_getType U_ICU_ENTRY_POINT_RENAME(ures_getType)
  |  |  ------------------
  |  |  |  |  123|  16.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  16.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  16.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  843|  16.3k|            case URES_STRING:
  ------------------
  |  Branch (843:13): [True: 16.3k, False: 0]
  ------------------
  844|  16.3k|                pattern = ures_getUnicodeString(patternRes.getAlias(), &status);
  845|  16.3k|                break;
  846|      0|            case URES_ARRAY:
  ------------------
  |  Branch (846:13): [True: 0, False: 16.3k]
  ------------------
  847|      0|                pattern = ures_getUnicodeStringByIndex(patternRes.getAlias(), 0, &status);
  848|      0|                break;
  849|      0|            default:
  ------------------
  |  Branch (849:13): [True: 0, False: 16.3k]
  ------------------
  850|      0|                status = U_INVALID_FORMAT_ERROR;
  851|      0|                return;
  852|  16.3k|        }
  853|       |        
  854|  16.3k|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (854:13): [True: 16.3k, False: 0]
  ------------------
  855|  16.3k|            UnicodeString conflictingPattern;
  856|  16.3k|            addPatternWithSkeleton(pattern, nullptr, false, conflictingPattern, status);
  857|  16.3k|        }
  858|  16.3k|    }
  859|  2.04k|}
_ZN6icu_7824DateTimePatternGenerator20getCalendarTypeToUseERKNS_6LocaleERNS_10CharStringER10UErrorCode:
  910|  4.08k|DateTimePatternGenerator::getCalendarTypeToUse(const Locale& locale, CharString& destination, UErrorCode& err) {
  911|  4.08k|    destination.clear().append(DT_DateTimeGregorianTag, -1, err); // initial default
  912|  4.08k|    if ( U_SUCCESS(err) ) {
  ------------------
  |  Branch (912:10): [True: 4.08k, False: 0]
  ------------------
  913|  4.08k|        UErrorCode localStatus = U_ZERO_ERROR;
  914|  4.08k|        char localeWithCalendarKey[ULOC_LOCALE_IDENTIFIER_CAPACITY];
  915|       |        // obtain a locale that always has the calendar key value that should be used
  916|  4.08k|        ures_getFunctionalEquivalent(
  ------------------
  |  | 1663|  4.08k|#define ures_getFunctionalEquivalent U_ICU_ENTRY_POINT_RENAME(ures_getFunctionalEquivalent)
  |  |  ------------------
  |  |  |  |  123|  4.08k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.08k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.08k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  917|  4.08k|            localeWithCalendarKey,
  918|  4.08k|            ULOC_LOCALE_IDENTIFIER_CAPACITY,
  ------------------
  |  |  907|  4.08k|#define ULOC_LOCALE_IDENTIFIER_CAPACITY (ULOC_FULLNAME_CAPACITY + 1 + ULOC_KEYWORD_AND_VALUES_CAPACITY)
  |  |  ------------------
  |  |  |  |  264|  4.08k|#define ULOC_FULLNAME_CAPACITY 157
  |  |  ------------------
  |  |               #define ULOC_LOCALE_IDENTIFIER_CAPACITY (ULOC_FULLNAME_CAPACITY + 1 + ULOC_KEYWORD_AND_VALUES_CAPACITY)
  |  |  ------------------
  |  |  |  |  283|  4.08k|#define ULOC_KEYWORD_AND_VALUES_CAPACITY 100
  |  |  ------------------
  ------------------
  919|  4.08k|            nullptr,
  920|  4.08k|            "calendar",
  921|  4.08k|            "calendar",
  922|  4.08k|            locale.getName(),
  923|  4.08k|            nullptr,
  924|  4.08k|            false,
  925|  4.08k|            &localStatus);
  926|  4.08k|        localeWithCalendarKey[ULOC_LOCALE_IDENTIFIER_CAPACITY-1] = 0; // ensure null termination
  ------------------
  |  |  907|  4.08k|#define ULOC_LOCALE_IDENTIFIER_CAPACITY (ULOC_FULLNAME_CAPACITY + 1 + ULOC_KEYWORD_AND_VALUES_CAPACITY)
  |  |  ------------------
  |  |  |  |  264|  4.08k|#define ULOC_FULLNAME_CAPACITY 157
  |  |  ------------------
  |  |               #define ULOC_LOCALE_IDENTIFIER_CAPACITY (ULOC_FULLNAME_CAPACITY + 1 + ULOC_KEYWORD_AND_VALUES_CAPACITY)
  |  |  ------------------
  |  |  |  |  283|  4.08k|#define ULOC_KEYWORD_AND_VALUES_CAPACITY 100
  |  |  ------------------
  ------------------
  927|       |        // now get the calendar key value from that locale
  928|       |        // (the call to ures_getFunctionalEquivalent() above might fail, and if it does, localeWithCalendarKey
  929|       |        // won't contain a `calendar` keyword.  If this happens, the line below will stomp on `destination`,
  930|       |        // so we have to check the return code before overwriting `destination`.)
  931|  4.08k|        if (U_SUCCESS(localStatus)) {
  ------------------
  |  Branch (931:13): [True: 4.08k, False: 0]
  ------------------
  932|  4.08k|            destination = ulocimp_getKeywordValue(localeWithCalendarKey, "calendar", localStatus);
  ------------------
  |  | 1200|  4.08k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|  4.08k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.08k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.08k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  933|  4.08k|        }
  934|       |        // If the input locale was invalid, don't fail with missing resource error, instead
  935|       |        // continue with default of Gregorian.
  936|  4.08k|        if (U_FAILURE(localStatus) && localStatus != U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (936:13): [True: 0, False: 4.08k]
  |  Branch (936:39): [True: 0, False: 0]
  ------------------
  937|      0|            err = localStatus;
  938|      0|        }
  939|  4.08k|    }
  940|  4.08k|}
_ZN6icu_7824DateTimePatternGenerator21AppendItemFormatsSinkD2Ev:
 1058|  2.04k|DateTimePatternGenerator::AppendItemFormatsSink::~AppendItemFormatsSink() {}
_ZN6icu_7824DateTimePatternGenerator19AppendItemNamesSinkD2Ev:
 1059|  2.04k|DateTimePatternGenerator::AppendItemNamesSink::~AppendItemNamesSink() {}
_ZN6icu_7824DateTimePatternGenerator20AvailableFormatsSinkD2Ev:
 1060|  2.04k|DateTimePatternGenerator::AvailableFormatsSink::~AvailableFormatsSink() {}
_ZN6icu_7824DateTimePatternGenerator11addCLDRDataERKNS_6LocaleER10UErrorCode:
 1063|  2.04k|DateTimePatternGenerator::addCLDRData(const Locale& locale, UErrorCode& errorCode) {
 1064|  2.04k|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1064:9): [True: 0, False: 2.04k]
  ------------------
 1065|  2.04k|    UnicodeString rbPattern, value, field;
 1066|  2.04k|    CharString path;
 1067|       |
 1068|  2.04k|    LocalUResourceBundlePointer rb(ures_open(nullptr, locale.getName(), &errorCode));
  ------------------
  |  | 1691|  2.04k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1069|  2.04k|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1069:9): [True: 0, False: 2.04k]
  ------------------
 1070|       |
 1071|  2.04k|    CharString calendarTypeToUse; // to be filled in with the type to use, if all goes well
 1072|  2.04k|    getCalendarTypeToUse(locale, calendarTypeToUse, errorCode);
 1073|  2.04k|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1073:9): [True: 0, False: 2.04k]
  ------------------
 1074|       |
 1075|       |    // Local err to ignore resource not found exceptions
 1076|  2.04k|    UErrorCode err = U_ZERO_ERROR;
 1077|       |
 1078|       |    // Load append item formats.
 1079|  2.04k|    AppendItemFormatsSink appendItemFormatsSink(*this);
 1080|  2.04k|    path.clear()
 1081|  2.04k|        .append(DT_DateTimeCalendarTag, errorCode)
 1082|  2.04k|        .append('/', errorCode)
 1083|  2.04k|        .append(calendarTypeToUse, errorCode)
 1084|  2.04k|        .append('/', errorCode)
 1085|  2.04k|        .append(DT_DateTimeAppendItemsTag, errorCode); // i.e., calendar/xxx/appendItems
 1086|  2.04k|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1086:9): [True: 0, False: 2.04k]
  ------------------
 1087|  2.04k|    ures_getAllChildrenWithFallback(rb.getAlias(), path.data(), appendItemFormatsSink, err);
  ------------------
  |  | 1657|  2.04k|#define ures_getAllChildrenWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllChildrenWithFallback)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1088|  2.04k|    appendItemFormatsSink.fillInMissing();
 1089|       |
 1090|       |    // Load CLDR item names.
 1091|  2.04k|    err = U_ZERO_ERROR;
 1092|  2.04k|    AppendItemNamesSink appendItemNamesSink(*this);
 1093|  2.04k|    ures_getAllChildrenWithFallback(rb.getAlias(), DT_DateTimeFieldsTag, appendItemNamesSink, err);
  ------------------
  |  | 1657|  2.04k|#define ures_getAllChildrenWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllChildrenWithFallback)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1094|  2.04k|    appendItemNamesSink.fillInMissing();
 1095|       |
 1096|       |    // Load the available formats from CLDR.
 1097|  2.04k|    err = U_ZERO_ERROR;
 1098|  2.04k|    initHashtable(errorCode);
 1099|  2.04k|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1099:9): [True: 0, False: 2.04k]
  ------------------
 1100|  2.04k|    AvailableFormatsSink availableFormatsSink(*this);
 1101|  2.04k|    path.clear()
 1102|  2.04k|        .append(DT_DateTimeCalendarTag, errorCode)
 1103|  2.04k|        .append('/', errorCode)
 1104|  2.04k|        .append(calendarTypeToUse, errorCode)
 1105|  2.04k|        .append('/', errorCode)
 1106|  2.04k|        .append(DT_DateTimeAvailableFormatsTag, errorCode); // i.e., calendar/xxx/availableFormats
 1107|  2.04k|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (1107:9): [True: 0, False: 2.04k]
  ------------------
 1108|  2.04k|    ures_getAllChildrenWithFallback(rb.getAlias(), path.data(), availableFormatsSink, err);
  ------------------
  |  | 1657|  2.04k|#define ures_getAllChildrenWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllChildrenWithFallback)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1109|  2.04k|}
_ZN6icu_7824DateTimePatternGenerator13initHashtableER10UErrorCode:
 1112|  2.04k|DateTimePatternGenerator::initHashtable(UErrorCode& err) {
 1113|  2.04k|    if (U_FAILURE(err)) { return; }
  ------------------
  |  Branch (1113:9): [True: 0, False: 2.04k]
  ------------------
 1114|  2.04k|    if (fAvailableFormatKeyHash!=nullptr) {
  ------------------
  |  Branch (1114:9): [True: 0, False: 2.04k]
  ------------------
 1115|      0|        return;
 1116|      0|    }
 1117|  2.04k|    LocalPointer<Hashtable> hash(new Hashtable(false, err), err);
 1118|  2.04k|    if (U_SUCCESS(err)) {
  ------------------
  |  Branch (1118:9): [True: 2.04k, False: 0]
  ------------------
 1119|  2.04k|        fAvailableFormatKeyHash = hash.orphan();
 1120|  2.04k|    }
 1121|  2.04k|}
_ZN6icu_7824DateTimePatternGenerator19setAppendItemFormatE21UDateTimePatternFieldRKNS_13UnicodeStringE:
 1124|  32.6k|DateTimePatternGenerator::setAppendItemFormat(UDateTimePatternField field, const UnicodeString& value) {
 1125|  32.6k|    appendItemFormats[field] = value;
 1126|       |    // NUL-terminate for the C API.
 1127|  32.6k|    appendItemFormats[field].getTerminatedBuffer();
 1128|  32.6k|}
_ZNK6icu_7824DateTimePatternGenerator19getAppendItemFormatE21UDateTimePatternField:
 1131|  77.6k|DateTimePatternGenerator::getAppendItemFormat(UDateTimePatternField field) const {
 1132|  77.6k|    return appendItemFormats[field];
 1133|  77.6k|}
_ZN6icu_7824DateTimePatternGenerator19setFieldDisplayNameE21UDateTimePatternField23UDateTimePGDisplayWidthRKNS_13UnicodeStringE:
 1146|  91.9k|DateTimePatternGenerator::setFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width, const UnicodeString& value) {
 1147|  91.9k|    fieldDisplayNames[field][width] = value;
 1148|       |    // NUL-terminate for the C API.
 1149|  91.9k|    fieldDisplayNames[field][width].getTerminatedBuffer();
 1150|  91.9k|}
_ZNK6icu_7824DateTimePatternGenerator19getFieldDisplayNameE21UDateTimePatternField23UDateTimePGDisplayWidth:
 1153|   279k|DateTimePatternGenerator::getFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width) const {
 1154|   279k|    return fieldDisplayNames[field][width];
 1155|   279k|}
_ZN6icu_7824DateTimePatternGenerator26getMutableFieldDisplayNameE21UDateTimePatternField23UDateTimePGDisplayWidth:
 1158|  98.0k|DateTimePatternGenerator::getMutableFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width) {
 1159|  98.0k|    return fieldDisplayNames[field][width];
 1160|  98.0k|}
_ZN6icu_7824DateTimePatternGenerator13getAppendNameE21UDateTimePatternFieldRNS_13UnicodeStringE:
 1163|  1.64k|DateTimePatternGenerator::getAppendName(UDateTimePatternField field, UnicodeString& value) {
 1164|  1.64k|    value = SINGLE_QUOTE;
  ------------------
  |  |   35|  1.64k|#define SINGLE_QUOTE      ((char16_t)0x0027)
  ------------------
 1165|  1.64k|    value += fieldDisplayNames[field][UDATPG_WIDTH_APPENDITEM];
 1166|  1.64k|    value += SINGLE_QUOTE;
  ------------------
  |  |   35|  1.64k|#define SINGLE_QUOTE      ((char16_t)0x0027)
  ------------------
 1167|  1.64k|}
_ZN6icu_7824DateTimePatternGenerator14getBestPatternERKNS_13UnicodeStringER10UErrorCode:
 1170|  2.04k|DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UErrorCode& status) {
 1171|  2.04k|    return getBestPattern(patternForm, UDATPG_MATCH_NO_OPTIONS, status);
 1172|  2.04k|}
_ZN6icu_7824DateTimePatternGenerator14getBestPatternERKNS_13UnicodeStringE28UDateTimePatternMatchOptionsR10UErrorCode:
 1175|  2.04k|DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDateTimePatternMatchOptions options, UErrorCode& status) {
 1176|  2.04k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1176:9): [True: 0, False: 2.04k]
  ------------------
 1177|      0|        return {};
 1178|      0|    }
 1179|  2.04k|    if (U_FAILURE(internalErrorCode)) {
  ------------------
  |  Branch (1179:9): [True: 0, False: 2.04k]
  ------------------
 1180|      0|        status = internalErrorCode;
 1181|      0|        return {};
 1182|      0|    }
 1183|  2.04k|    const UnicodeString *bestPattern = nullptr;
 1184|  2.04k|    UnicodeString dtFormat;
 1185|  2.04k|    UnicodeString resultPattern;
 1186|  2.04k|    int32_t flags = kDTPGNoFlags;
 1187|       |
 1188|  2.04k|    int32_t dateMask=(1<<UDATPG_DAYPERIOD_FIELD) - 1;
 1189|  2.04k|    int32_t timeMask=(1<<UDATPG_FIELD_COUNT) - 1 - dateMask;
 1190|       |
 1191|       |    // Replace hour metacharacters 'j', 'C' and 'J', set flags as necessary
 1192|  2.04k|    UnicodeString patternFormMapped = mapSkeletonMetacharacters(patternForm, &flags, status);
 1193|  2.04k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1193:9): [True: 0, False: 2.04k]
  ------------------
 1194|      0|        return {};
 1195|      0|    }
 1196|       |
 1197|  2.04k|    resultPattern.remove();
 1198|  2.04k|    dtMatcher->set(patternFormMapped, fp);
 1199|  2.04k|    const PtnSkeleton* specifiedSkeleton = nullptr;
 1200|  2.04k|    bestPattern=getBestRaw(*dtMatcher, -1, distanceInfo, status, &specifiedSkeleton);
 1201|  2.04k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1201:9): [True: 0, False: 2.04k]
  ------------------
 1202|      0|        return {};
 1203|      0|    }
 1204|       |
 1205|  2.04k|    if ( distanceInfo->missingFieldMask==0 && distanceInfo->extraFieldMask==0 ) {
  ------------------
  |  Branch (1205:10): [True: 271, False: 1.77k]
  |  Branch (1205:47): [True: 269, False: 2]
  ------------------
 1206|    269|        resultPattern = adjustFieldTypes(*bestPattern, specifiedSkeleton, flags, options);
 1207|       |
 1208|    269|        return resultPattern;
 1209|    269|    }
 1210|  1.77k|    int32_t neededFields = dtMatcher->getFieldMask();
 1211|  1.77k|    UnicodeString datePattern=getBestAppending(neededFields & dateMask, flags, status, options);
 1212|  1.77k|    UnicodeString timePattern=getBestAppending(neededFields & timeMask, flags, status, options);
 1213|  1.77k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1213:9): [True: 0, False: 1.77k]
  ------------------
 1214|      0|        return {};
 1215|      0|    }
 1216|  1.77k|    if (datePattern.length()==0) {
  ------------------
  |  Branch (1216:9): [True: 127, False: 1.64k]
  ------------------
 1217|    127|        if (timePattern.length()==0) {
  ------------------
  |  Branch (1217:13): [True: 2, False: 125]
  ------------------
 1218|      2|            resultPattern.remove();
 1219|      2|        }
 1220|    125|        else {
 1221|    125|            return timePattern;
 1222|    125|        }
 1223|    127|    }
 1224|  1.64k|    if (timePattern.length()==0) {
  ------------------
  |  Branch (1224:9): [True: 89, False: 1.56k]
  ------------------
 1225|     89|        return datePattern;
 1226|     89|    }
 1227|  1.56k|    resultPattern.remove();
 1228|  1.56k|    status = U_ZERO_ERROR;
 1229|       |    // determine which dateTimeFormat to use
 1230|  1.56k|    PtnSkeleton* reqSkeleton = dtMatcher->getSkeletonPtr();
 1231|  1.56k|    UDateFormatStyle style = UDAT_SHORT;
 1232|  1.56k|    int32_t monthFieldLen = reqSkeleton->baseOriginal.getFieldLength(UDATPG_MONTH_FIELD);
 1233|  1.56k|    if (monthFieldLen == 4) {
  ------------------
  |  Branch (1233:9): [True: 32, False: 1.52k]
  ------------------
 1234|     32|        if (reqSkeleton->baseOriginal.getFieldLength(UDATPG_WEEKDAY_FIELD) > 0) {
  ------------------
  |  Branch (1234:13): [True: 17, False: 15]
  ------------------
 1235|     17|            style = UDAT_FULL;
 1236|     17|        } else {
 1237|     15|            style = UDAT_LONG;
 1238|     15|        }
 1239|  1.52k|    } else if (monthFieldLen == 3) {
  ------------------
  |  Branch (1239:16): [True: 7, False: 1.52k]
  ------------------
 1240|      7|        style = UDAT_MEDIUM;
 1241|      7|    }
 1242|       |    // and now use it to compose date and time
 1243|  1.56k|    dtFormat=getDateTimeFormat(style, status);
 1244|  1.56k|    SimpleFormatter(dtFormat, 2, 2, status).format(timePattern, datePattern, resultPattern, status);
 1245|  1.56k|    return resultPattern;
 1246|  1.64k|}
_ZN6icu_7824DateTimePatternGenerator25mapSkeletonMetacharactersERKNS_13UnicodeStringEPiR10UErrorCode:
 1256|  2.04k|DateTimePatternGenerator::mapSkeletonMetacharacters(const UnicodeString& patternForm, int32_t* flags, UErrorCode& status) {
 1257|  2.04k|    UnicodeString patternFormMapped;
 1258|  2.04k|    patternFormMapped.remove();
 1259|  2.04k|    UBool inQuoted = false;
 1260|  2.04k|    int32_t patPos, patLen = patternForm.length();
 1261|  31.2k|    for (patPos = 0; patPos < patLen; patPos++) {
  ------------------
  |  Branch (1261:22): [True: 29.2k, False: 2.04k]
  ------------------
 1262|  29.2k|        char16_t patChr = patternForm.charAt(patPos);
 1263|  29.2k|        if (patChr == SINGLE_QUOTE) {
  ------------------
  |  |   35|  29.2k|#define SINGLE_QUOTE      ((char16_t)0x0027)
  ------------------
  |  Branch (1263:13): [True: 0, False: 29.2k]
  ------------------
 1264|      0|            inQuoted = !inQuoted;
 1265|  29.2k|        } else if (!inQuoted) {
  ------------------
  |  Branch (1265:20): [True: 29.2k, False: 0]
  ------------------
 1266|       |            // Handle special mappings for 'j' and 'C' in which fields lengths
 1267|       |            // 1,3,5 => hour field length 1
 1268|       |            // 2,4,6 => hour field length 2
 1269|       |            // 1,2 => abbreviated dayPeriod (field length 1..3)
 1270|       |            // 3,4 => long dayPeriod (field length 4)
 1271|       |            // 5,6 => narrow dayPeriod (field length 5)
 1272|  29.2k|            if (patChr == LOW_J || patChr == CAP_C) {
  ------------------
  |  |   78|  58.4k|#define LOW_J             ((char16_t)0x006A)
  ------------------
                          if (patChr == LOW_J || patChr == CAP_C) {
  ------------------
  |  |   48|  29.1k|#define CAP_C             ((char16_t)0x0043)
  ------------------
  |  Branch (1272:17): [True: 18, False: 29.1k]
  |  Branch (1272:36): [True: 840, False: 28.3k]
  ------------------
 1273|    858|                int32_t extraLen = 0; // 1 less than total field length
 1274|  13.6k|                while (patPos+1 < patLen && patternForm.charAt(patPos+1)==patChr) {
  ------------------
  |  Branch (1274:24): [True: 13.4k, False: 146]
  |  Branch (1274:45): [True: 12.7k, False: 712]
  ------------------
 1275|  12.7k|                    extraLen++;
 1276|  12.7k|                    patPos++;
 1277|  12.7k|                }
 1278|    858|                int32_t hourLen = 1 + (extraLen & 1);
 1279|    858|                int32_t dayPeriodLen = (extraLen < 2)? 1: 3 + (extraLen >> 1);
  ------------------
  |  Branch (1279:40): [True: 293, False: 565]
  ------------------
 1280|    858|                char16_t hourChar = LOW_H;
  ------------------
  |  |   76|    858|#define LOW_H             ((char16_t)0x0068)
  ------------------
 1281|    858|                char16_t dayPeriodChar = LOW_A;
  ------------------
  |  |   69|    858|#define LOW_A             ((char16_t)0x0061)
  ------------------
 1282|    858|                if (patChr == LOW_J) {
  ------------------
  |  |   78|    858|#define LOW_J             ((char16_t)0x006A)
  ------------------
  |  Branch (1282:21): [True: 18, False: 840]
  ------------------
 1283|     18|                    hourChar = fDefaultHourFormatChar;
 1284|    840|                } else {
 1285|    840|                    AllowedHourFormat bestAllowed;
 1286|    840|                    if (fAllowedHourFormats[0] != ALLOWED_HOUR_FORMAT_UNKNOWN) {
  ------------------
  |  Branch (1286:25): [True: 840, False: 0]
  ------------------
 1287|    840|                        bestAllowed = static_cast<AllowedHourFormat>(fAllowedHourFormats[0]);
 1288|    840|                    } else {
 1289|      0|                        status = U_INVALID_FORMAT_ERROR;
 1290|      0|                        return {};
 1291|      0|                    }
 1292|    840|                    if (bestAllowed == ALLOWED_HOUR_FORMAT_H || bestAllowed == ALLOWED_HOUR_FORMAT_HB || bestAllowed == ALLOWED_HOUR_FORMAT_Hb) {
  ------------------
  |  Branch (1292:25): [True: 0, False: 840]
  |  Branch (1292:65): [True: 0, False: 840]
  |  Branch (1292:106): [True: 0, False: 840]
  ------------------
 1293|      0|                        hourChar = CAP_H;
  ------------------
  |  |   53|      0|#define CAP_H             ((char16_t)0x0048)
  ------------------
 1294|    840|                    } else if (bestAllowed == ALLOWED_HOUR_FORMAT_K || bestAllowed == ALLOWED_HOUR_FORMAT_KB || bestAllowed == ALLOWED_HOUR_FORMAT_Kb) {
  ------------------
  |  Branch (1294:32): [True: 0, False: 840]
  |  Branch (1294:72): [True: 0, False: 840]
  |  Branch (1294:113): [True: 0, False: 840]
  ------------------
 1295|      0|                        hourChar = CAP_K;
  ------------------
  |  |   55|      0|#define CAP_K             ((char16_t)0x004B)
  ------------------
 1296|    840|                    } else if (bestAllowed == ALLOWED_HOUR_FORMAT_k) {
  ------------------
  |  Branch (1296:32): [True: 0, False: 840]
  ------------------
 1297|      0|                        hourChar = LOW_K;
  ------------------
  |  |   79|      0|#define LOW_K             ((char16_t)0x006B)
  ------------------
 1298|      0|                    }
 1299|       |                    // in #13183 just add b/B to skeleton, no longer need to set special flags
 1300|    840|                    if (bestAllowed == ALLOWED_HOUR_FORMAT_HB || bestAllowed == ALLOWED_HOUR_FORMAT_hB || bestAllowed == ALLOWED_HOUR_FORMAT_KB) {
  ------------------
  |  Branch (1300:25): [True: 0, False: 840]
  |  Branch (1300:66): [True: 0, False: 840]
  |  Branch (1300:107): [True: 0, False: 840]
  ------------------
 1301|      0|                        dayPeriodChar = CAP_B;
  ------------------
  |  |   47|      0|#define CAP_B             ((char16_t)0x0042)
  ------------------
 1302|    840|                    } else if (bestAllowed == ALLOWED_HOUR_FORMAT_Hb || bestAllowed == ALLOWED_HOUR_FORMAT_hb || bestAllowed == ALLOWED_HOUR_FORMAT_Kb) {
  ------------------
  |  Branch (1302:32): [True: 0, False: 840]
  |  Branch (1302:73): [True: 0, False: 840]
  |  Branch (1302:114): [True: 0, False: 840]
  ------------------
 1303|      0|                        dayPeriodChar = LOW_B;
  ------------------
  |  |   70|      0|#define LOW_B             ((char16_t)0x0062)
  ------------------
 1304|      0|                    }
 1305|    840|                }
 1306|    858|                if (hourChar==CAP_H || hourChar==LOW_K) {
  ------------------
  |  |   53|  1.71k|#define CAP_H             ((char16_t)0x0048)
  ------------------
                              if (hourChar==CAP_H || hourChar==LOW_K) {
  ------------------
  |  |   79|    858|#define LOW_K             ((char16_t)0x006B)
  ------------------
  |  Branch (1306:21): [True: 0, False: 858]
  |  Branch (1306:40): [True: 0, False: 858]
  ------------------
 1307|      0|                    dayPeriodLen = 0;
 1308|      0|                }
 1309|  9.05k|                while (dayPeriodLen-- > 0) {
  ------------------
  |  Branch (1309:24): [True: 8.19k, False: 858]
  ------------------
 1310|  8.19k|                    patternFormMapped.append(dayPeriodChar);
 1311|  8.19k|                }
 1312|  2.05k|                while (hourLen-- > 0) {
  ------------------
  |  Branch (1312:24): [True: 1.19k, False: 858]
  ------------------
 1313|  1.19k|                    patternFormMapped.append(hourChar);
 1314|  1.19k|                }
 1315|  28.3k|            } else if (patChr == CAP_J) {
  ------------------
  |  |   54|  28.3k|#define CAP_J             ((char16_t)0x004A)
  ------------------
  |  Branch (1315:24): [True: 234, False: 28.1k]
  ------------------
 1316|       |                // Get pattern for skeleton with H, then replace H or k
 1317|       |                // with fDefaultHourFormatChar (if different)
 1318|    234|                patternFormMapped.append(CAP_H);
  ------------------
  |  |   53|    234|#define CAP_H             ((char16_t)0x0048)
  ------------------
 1319|    234|                *flags |= kDTPGSkeletonUsesCapJ;
 1320|  28.1k|            } else {
 1321|  28.1k|                patternFormMapped.append(patChr);
 1322|  28.1k|            }
 1323|  29.2k|        }
 1324|  29.2k|    }
 1325|  2.04k|    return patternFormMapped;
 1326|  2.04k|}
_ZN6icu_7824DateTimePatternGenerator17addCanonicalItemsER10UErrorCode:
 1365|  2.04k|DateTimePatternGenerator::addCanonicalItems(UErrorCode& status) {
 1366|  2.04k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1366:9): [True: 0, False: 2.04k]
  ------------------
 1367|  2.04k|    UnicodeString  conflictingPattern;
 1368|       |
 1369|  34.7k|    for (int32_t i=0; i<UDATPG_FIELD_COUNT; i++) {
  ------------------
  |  Branch (1369:23): [True: 32.6k, False: 2.04k]
  ------------------
 1370|  32.6k|        if (Canonical_Items[i] > 0) {
  ------------------
  |  Branch (1370:13): [True: 32.6k, False: 0]
  ------------------
 1371|  32.6k|            addPattern(UnicodeString(Canonical_Items[i]), false, conflictingPattern, status);
 1372|  32.6k|        }
 1373|  32.6k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1373:13): [True: 0, False: 32.6k]
  ------------------
 1374|  32.6k|    }
 1375|  2.04k|}
_ZN6icu_7824DateTimePatternGenerator17setDateTimeFormatE16UDateFormatStyleRKNS_13UnicodeStringER10UErrorCode:
 1392|  8.17k|DateTimePatternGenerator::setDateTimeFormat(UDateFormatStyle style, const UnicodeString& dtFormat, UErrorCode& status) {
 1393|  8.17k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1393:9): [True: 0, False: 8.17k]
  ------------------
 1394|      0|        return;
 1395|      0|    }
 1396|  8.17k|    if (style < UDAT_FULL || style > UDAT_SHORT) {
  ------------------
  |  Branch (1396:9): [True: 0, False: 8.17k]
  |  Branch (1396:30): [True: 0, False: 8.17k]
  ------------------
 1397|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 1398|      0|        return;
 1399|      0|    }
 1400|  8.17k|    dateTimeFormat[style] = dtFormat;
 1401|       |    // Note for the following: getTerminatedBuffer() can re-allocate the UnicodeString
 1402|       |    // buffer so we do this here before clients request a const ref to the UnicodeString
 1403|       |    // or its buffer.
 1404|  8.17k|    dateTimeFormat[style].getTerminatedBuffer(); // NUL-terminate for the C API.
 1405|  8.17k|}
_ZNK6icu_7824DateTimePatternGenerator17getDateTimeFormatE16UDateFormatStyleR10UErrorCode:
 1408|  1.56k|DateTimePatternGenerator::getDateTimeFormat(UDateFormatStyle style, UErrorCode& status) const {
 1409|  1.56k|    static const UnicodeString emptyString = UNICODE_STRING_SIMPLE("");
  ------------------
  |  |  135|  1.56k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  1.56k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
 1410|  1.56k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1410:9): [True: 0, False: 1.56k]
  ------------------
 1411|      0|        return emptyString;
 1412|      0|    }
 1413|  1.56k|    if (style < UDAT_FULL || style > UDAT_SHORT) {
  ------------------
  |  Branch (1413:9): [True: 0, False: 1.56k]
  |  Branch (1413:30): [True: 0, False: 1.56k]
  ------------------
 1414|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 1415|      0|        return emptyString;
 1416|      0|    }
 1417|  1.56k|    return dateTimeFormat[style];
 1418|  1.56k|}
_ZN6icu_7824DateTimePatternGenerator23setDateTimeFromCalendarERKNS_6LocaleER10UErrorCode:
 1423|  2.04k|DateTimePatternGenerator::setDateTimeFromCalendar(const Locale& locale, UErrorCode& status) {
 1424|  2.04k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1424:9): [True: 0, False: 2.04k]
  ------------------
 1425|       |
 1426|  2.04k|    const char16_t *resStr;
 1427|  2.04k|    int32_t resStrLen = 0;
 1428|       |
 1429|  2.04k|    LocalUResourceBundlePointer calData(ures_open(nullptr, locale.getBaseName(), &status));
  ------------------
  |  | 1691|  2.04k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1430|  2.04k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1430:9): [True: 0, False: 2.04k]
  ------------------
 1431|  2.04k|    ures_getByKey(calData.getAlias(), DT_DateTimeCalendarTag, calData.getAlias(), &status);
  ------------------
  |  | 1661|  2.04k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1432|  2.04k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1432:9): [True: 0, False: 2.04k]
  ------------------
 1433|       |
 1434|  2.04k|    char cType[cTypeBufMax + 1];
 1435|  2.04k|    Calendar::getCalendarTypeFromLocale(locale, cType, cTypeBufMax, status);
 1436|  2.04k|    cType[cTypeBufMax] = 0;
 1437|  2.04k|    if (U_FAILURE(status) || cType[0] == 0) {
  ------------------
  |  Branch (1437:9): [True: 0, False: 2.04k]
  |  Branch (1437:30): [True: 0, False: 2.04k]
  ------------------
 1438|      0|        status = U_ZERO_ERROR;
 1439|      0|        uprv_strcpy(cType, DT_DateTimeGregorianTag);
  ------------------
  |  |   36|      0|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1440|      0|    }
 1441|  2.04k|    UBool cTypeIsGregorian = (uprv_strcmp(cType, DT_DateTimeGregorianTag) == 0);
  ------------------
  |  |   38|  2.04k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  2.04k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1442|       |
 1443|       |    // Currently, for compatibility with pre-CLDR-42 data, we default to the "atTime"
 1444|       |    // combining patterns. Depending on guidance in CLDR 42 spec and on DisplayOptions,
 1445|       |    // we may change this.
 1446|  2.04k|    LocalUResourceBundlePointer specificCalBundle;
 1447|  2.04k|    LocalUResourceBundlePointer dateTimePatterns;
 1448|  2.04k|    int32_t dateTimeOffset = 0; // initially for DateTimePatterns%atTime
 1449|  2.04k|    if (!cTypeIsGregorian) {
  ------------------
  |  Branch (1449:9): [True: 0, False: 2.04k]
  ------------------
 1450|      0|        specificCalBundle.adoptInstead(ures_getByKeyWithFallback(calData.getAlias(), cType,
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1451|      0|                                        nullptr, &status));
 1452|      0|        dateTimePatterns.adoptInstead(ures_getByKeyWithFallback(specificCalBundle.getAlias(), DT_DateAtTimePatternsTag, // the %atTime variant, 4 entries
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1453|      0|                                        nullptr, &status));
 1454|      0|    }
 1455|  2.04k|    if (dateTimePatterns.isNull() || status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (1455:9): [True: 2.04k, False: 0]
  |  Branch (1455:38): [True: 0, False: 0]
  ------------------
 1456|  2.04k|        status = U_ZERO_ERROR;
 1457|  2.04k|        specificCalBundle.adoptInstead(ures_getByKeyWithFallback(calData.getAlias(), DT_DateTimeGregorianTag,
  ------------------
  |  | 1662|  2.04k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1458|  2.04k|                                        nullptr, &status));
 1459|  2.04k|        dateTimePatterns.adoptInstead(ures_getByKeyWithFallback(specificCalBundle.getAlias(), DT_DateAtTimePatternsTag, // the %atTime variant, 4 entries
  ------------------
  |  | 1662|  2.04k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1460|  2.04k|                                        nullptr, &status));
 1461|  2.04k|    }
 1462|  2.04k|    if (U_SUCCESS(status) && (ures_getSize(dateTimePatterns.getAlias()) < 4)) {
  ------------------
  |  | 1674|  2.04k|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1462:9): [True: 2.04k, False: 0]
  |  Branch (1462:30): [True: 0, False: 2.04k]
  ------------------
 1463|      0|        status = U_INVALID_FORMAT_ERROR;
 1464|      0|    }
 1465|  2.04k|    if (status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (1465:9): [True: 0, False: 2.04k]
  ------------------
 1466|       |        // Try again with standard variant
 1467|      0|        status = U_ZERO_ERROR;
 1468|      0|        dateTimePatterns.orphan();
 1469|      0|        dateTimeOffset = static_cast<int32_t>(DateFormat::kDateTimeOffset);
 1470|      0|        if (!cTypeIsGregorian) {
  ------------------
  |  Branch (1470:13): [True: 0, False: 0]
  ------------------
 1471|      0|            specificCalBundle.adoptInstead(ures_getByKeyWithFallback(calData.getAlias(), cType,
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1472|      0|                                            nullptr, &status));
 1473|      0|            dateTimePatterns.adoptInstead(ures_getByKeyWithFallback(specificCalBundle.getAlias(), DT_DateTimePatternsTag, // the standard variant, 13 entries
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1474|      0|                                            nullptr, &status));
 1475|      0|        }
 1476|      0|        if (dateTimePatterns.isNull() || status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (1476:13): [True: 0, False: 0]
  |  Branch (1476:42): [True: 0, False: 0]
  ------------------
 1477|      0|            status = U_ZERO_ERROR;
 1478|      0|            specificCalBundle.adoptInstead(ures_getByKeyWithFallback(calData.getAlias(), DT_DateTimeGregorianTag,
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1479|      0|                                            nullptr, &status));
 1480|      0|            dateTimePatterns.adoptInstead(ures_getByKeyWithFallback(specificCalBundle.getAlias(), DT_DateTimePatternsTag, // the standard variant, 13 entries
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1481|      0|                                            nullptr, &status));
 1482|      0|        }
 1483|      0|        if (U_SUCCESS(status) && (ures_getSize(dateTimePatterns.getAlias()) <= DateFormat::kDateTimeOffset + DateFormat::kShort)) {
  ------------------
  |  | 1674|      0|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  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 (1483:13): [True: 0, False: 0]
  |  Branch (1483:34): [True: 0, False: 0]
  ------------------
 1484|      0|            status = U_INVALID_FORMAT_ERROR;
 1485|      0|        }
 1486|      0|    }
 1487|  2.04k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1487:9): [True: 0, False: 2.04k]
  ------------------
 1488|  10.2k|    for (int32_t style = UDAT_FULL; style <= UDAT_SHORT; style++) {
  ------------------
  |  Branch (1488:37): [True: 8.17k, False: 2.04k]
  ------------------
 1489|  8.17k|        resStr = ures_getStringByIndex(dateTimePatterns.getAlias(), dateTimeOffset + style, &resStrLen, &status);
  ------------------
  |  | 1676|  8.17k|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  123|  8.17k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  8.17k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  8.17k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1490|  8.17k|        setDateTimeFormat(static_cast<UDateFormatStyle>(style), UnicodeString(true, resStr, resStrLen), status);
 1491|  8.17k|    }
 1492|  2.04k|}
_ZN6icu_7824DateTimePatternGenerator17setDecimalSymbolsERKNS_6LocaleER10UErrorCode:
 1495|  2.04k|DateTimePatternGenerator::setDecimalSymbols(const Locale& locale, UErrorCode& status) {
 1496|  2.04k|    DecimalFormatSymbols dfs = DecimalFormatSymbols(locale, status);
 1497|  2.04k|    if(U_SUCCESS(status)) {
  ------------------
  |  Branch (1497:8): [True: 2.04k, False: 0]
  ------------------
 1498|  2.04k|        decimal = dfs.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol);
 1499|       |        // NUL-terminate for the C API.
 1500|  2.04k|        decimal.getTerminatedBuffer();
 1501|  2.04k|    }
 1502|  2.04k|}
_ZN6icu_7824DateTimePatternGenerator10addPatternERKNS_13UnicodeStringEaRS1_R10UErrorCode:
 1510|  32.6k|{
 1511|  32.6k|    if (U_FAILURE(internalErrorCode)) {
  ------------------
  |  Branch (1511:9): [True: 0, False: 32.6k]
  ------------------
 1512|      0|        status = internalErrorCode;
 1513|      0|        return UDATPG_NO_CONFLICT;
 1514|      0|    }
 1515|       |
 1516|  32.6k|    return addPatternWithSkeleton(pattern, nullptr, override, conflictingPattern, status);
 1517|  32.6k|}
_ZN6icu_7824DateTimePatternGenerator22addPatternWithSkeletonERKNS_13UnicodeStringEPS2_aRS1_R10UErrorCode:
 1536|   145k|{
 1537|   145k|    if (U_FAILURE(internalErrorCode)) {
  ------------------
  |  Branch (1537:9): [True: 0, False: 145k]
  ------------------
 1538|      0|        status = internalErrorCode;
 1539|      0|        return UDATPG_NO_CONFLICT;
 1540|      0|    }
 1541|       |
 1542|   145k|    UnicodeString basePattern;
 1543|   145k|    PtnSkeleton   skeleton;
 1544|   145k|    UDateTimePatternConflict conflictingStatus = UDATPG_NO_CONFLICT;
 1545|       |
 1546|   145k|    DateTimeMatcher matcher;
 1547|   145k|    if ( skeletonToUse == nullptr ) {
  ------------------
  |  Branch (1547:10): [True: 49.0k, False: 96.0k]
  ------------------
 1548|  49.0k|        matcher.set(pattern, fp, skeleton);
 1549|  49.0k|        matcher.getBasePattern(basePattern);
 1550|  96.0k|    } else {
 1551|  96.0k|        matcher.set(*skeletonToUse, fp, skeleton); // no longer trims skeleton fields to max len 3, per #7930
 1552|  96.0k|        matcher.getBasePattern(basePattern); // or perhaps instead: basePattern = *skeletonToUse;
 1553|  96.0k|    }
 1554|       |    // We only care about base conflicts - and replacing the pattern associated with a base - if:
 1555|       |    // 1. the conflicting previous base pattern did *not* have an explicit skeleton; in that case the previous
 1556|       |    // base + pattern combination was derived from either (a) a canonical item, (b) a standard format, or
 1557|       |    // (c) a pattern specified programmatically with a previous call to addPattern (which would only happen
 1558|       |    // if we are getting here from a subsequent call to addPattern).
 1559|       |    // 2. a skeleton is specified for the current pattern, but override=false; in that case we are checking
 1560|       |    // availableFormats items from root, which should not override any previous entry with the same base.
 1561|   145k|    UBool entryHadSpecifiedSkeleton;
 1562|   145k|    const UnicodeString *duplicatePattern = patternMap->getPatternFromBasePattern(basePattern, entryHadSpecifiedSkeleton);
 1563|   145k|    if (duplicatePattern != nullptr && (!entryHadSpecifiedSkeleton || (skeletonToUse != nullptr && !override))) {
  ------------------
  |  Branch (1563:9): [True: 18.3k, False: 126k]
  |  Branch (1563:41): [True: 18.3k, False: 0]
  |  Branch (1563:72): [True: 0, False: 0]
  |  Branch (1563:100): [True: 0, False: 0]
  ------------------
 1564|  18.3k|        conflictingStatus = UDATPG_BASE_CONFLICT;
 1565|  18.3k|        conflictingPattern = *duplicatePattern;
 1566|  18.3k|        if (!override) {
  ------------------
  |  Branch (1566:13): [True: 0, False: 18.3k]
  ------------------
 1567|      0|            return conflictingStatus;
 1568|      0|        }
 1569|  18.3k|    }
 1570|       |    // The only time we get here with override=true and skeletonToUse!=null is when adding availableFormats
 1571|       |    // items from CLDR data. In that case, we don't want an item from a parent locale to replace an item with
 1572|       |    // same skeleton from the specified locale, so skip the current item if skeletonWasSpecified is true for
 1573|       |    // the previously-specified conflicting item.
 1574|   145k|    const PtnSkeleton* entrySpecifiedSkeleton = nullptr;
 1575|   145k|    duplicatePattern = patternMap->getPatternFromSkeleton(skeleton, &entrySpecifiedSkeleton);
 1576|   145k|    if (duplicatePattern != nullptr ) {
  ------------------
  |  Branch (1576:9): [True: 12.2k, False: 132k]
  ------------------
 1577|  12.2k|        conflictingStatus = UDATPG_CONFLICT;
 1578|  12.2k|        conflictingPattern = *duplicatePattern;
 1579|  12.2k|        if (!override || (skeletonToUse != nullptr && entrySpecifiedSkeleton != nullptr)) {
  ------------------
  |  Branch (1579:13): [True: 0, False: 12.2k]
  |  Branch (1579:27): [True: 12.2k, False: 0]
  |  Branch (1579:55): [True: 0, False: 12.2k]
  ------------------
 1580|      0|            return conflictingStatus;
 1581|      0|        }
 1582|  12.2k|    }
 1583|   145k|    patternMap->add(basePattern, skeleton, pattern, skeletonToUse != nullptr, status);
 1584|   145k|    if(U_FAILURE(status)) {
  ------------------
  |  Branch (1584:8): [True: 0, False: 145k]
  ------------------
 1585|      0|        return conflictingStatus;
 1586|      0|    }
 1587|       |
 1588|   145k|    return UDATPG_NO_CONFLICT;
 1589|   145k|}
_ZNK6icu_7824DateTimePatternGenerator21getAppendFormatNumberEPKc:
 1593|  44.9k|DateTimePatternGenerator::getAppendFormatNumber(const char* field) const {
 1594|   355k|    for (int32_t i=0; i<UDATPG_FIELD_COUNT; ++i ) {
  ------------------
  |  Branch (1594:23): [True: 355k, False: 0]
  ------------------
 1595|   355k|        if (uprv_strcmp(CLDR_FIELD_APPEND[i], field)==0) {
  ------------------
  |  |   38|   355k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   355k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1595:13): [True: 44.9k, False: 310k]
  ------------------
 1596|  44.9k|            return static_cast<UDateTimePatternField>(i);
 1597|  44.9k|        }
 1598|   355k|    }
 1599|      0|    return UDATPG_FIELD_COUNT;
 1600|  44.9k|}
_ZNK6icu_7824DateTimePatternGenerator23getFieldAndWidthIndicesEPKcP23UDateTimePGDisplayWidth:
 1603|   404k|DateTimePatternGenerator::getFieldAndWidthIndices(const char* key, UDateTimePGDisplayWidth* widthP) const {
 1604|   404k|    char cldrFieldKey[UDATPG_FIELD_KEY_MAX + 1];
 1605|   404k|    uprv_strncpy(cldrFieldKey, key, UDATPG_FIELD_KEY_MAX);
  ------------------
  |  |   43|   404k|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|   404k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1606|   404k|    cldrFieldKey[UDATPG_FIELD_KEY_MAX]=0; // ensure termination
 1607|   404k|    *widthP = UDATPG_WIDE;
 1608|   404k|    char* hyphenPtr = uprv_strchr(cldrFieldKey, '-');
  ------------------
  |  |   40|   404k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   404k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1609|   404k|    if (hyphenPtr) {
  ------------------
  |  Branch (1609:9): [True: 314k, False: 89.8k]
  ------------------
 1610|   449k|        for (int32_t i=UDATPG_WIDTH_COUNT-1; i>0; --i) {
  ------------------
  |  Branch (1610:46): [True: 449k, False: 0]
  ------------------
 1611|   449k|            if (uprv_strcmp(CLDR_FIELD_WIDTH[i], hyphenPtr)==0) {
  ------------------
  |  |   38|   449k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   449k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1611:17): [True: 314k, False: 134k]
  ------------------
 1612|   314k|                *widthP = static_cast<UDateTimePGDisplayWidth>(i);
 1613|   314k|                break;
 1614|   314k|            }
 1615|   449k|        }
 1616|   314k|        *hyphenPtr = 0; // now delete width portion of key
 1617|   314k|    }
 1618|  4.41M|    for (int32_t i=0; i<UDATPG_FIELD_COUNT; ++i ) {
  ------------------
  |  Branch (1618:23): [True: 4.28M, False: 128k]
  ------------------
 1619|  4.28M|        if (uprv_strcmp(CLDR_FIELD_NAME[i],cldrFieldKey)==0) {
  ------------------
  |  |   38|  4.28M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  4.28M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1619:13): [True: 275k, False: 4.00M]
  ------------------
 1620|   275k|            return static_cast<UDateTimePatternField>(i);
 1621|   275k|        }
 1622|  4.28M|    }
 1623|   128k|    return UDATPG_FIELD_COUNT;
 1624|   404k|}
_ZN6icu_7824DateTimePatternGenerator10getBestRawERNS_15DateTimeMatcherEiPNS_12DistanceInfoER10UErrorCodePPKNS_11PtnSkeletonE:
 1631|  7.02k|                                     const PtnSkeleton** specifiedSkeletonPtr) {
 1632|  7.02k|    int32_t bestDistance = 0x7fffffff;
 1633|  7.02k|    int32_t bestMissingFieldMask = -1;
 1634|  7.02k|    DistanceInfo tempInfo;
 1635|  7.02k|    const UnicodeString *bestPattern=nullptr;
 1636|  7.02k|    const PtnSkeleton* specifiedSkeleton=nullptr;
 1637|       |
 1638|  7.02k|    PatternMapIterator it(status);
 1639|  7.02k|    if (U_FAILURE(status)) { return nullptr; }
  ------------------
  |  Branch (1639:9): [True: 0, False: 7.02k]
  ------------------
 1640|       |
 1641|   424k|    for (it.set(*patternMap); it.hasNext(); ) {
  ------------------
  |  Branch (1641:31): [True: 418k, False: 6.15k]
  ------------------
 1642|   418k|        DateTimeMatcher trial = it.next();
 1643|   418k|        if (trial.equals(skipMatcher)) {
  ------------------
  |  Branch (1643:13): [True: 0, False: 418k]
  ------------------
 1644|      0|            continue;
 1645|      0|        }
 1646|   418k|        int32_t distance=source.getDistance(trial, includeMask, tempInfo);
 1647|       |        // Because we iterate over a map the order is undefined. Can change between implementations,
 1648|       |        // versions, and will very likely be different between Java and C/C++.
 1649|       |        // So if we have patterns with the same distance we also look at the missingFieldMask,
 1650|       |        // and we favour the smallest one. Because the field is a bitmask this technically means we
 1651|       |        // favour differences in the "least significant fields". For example we prefer the one with differences
 1652|       |        // in seconds field vs one with difference in the hours field.
 1653|   418k|        if (distance<bestDistance || (distance==bestDistance && bestMissingFieldMask<tempInfo.missingFieldMask)) {
  ------------------
  |  Branch (1653:13): [True: 25.2k, False: 393k]
  |  Branch (1653:39): [True: 13.7k, False: 379k]
  |  Branch (1653:65): [True: 917, False: 12.8k]
  ------------------
 1654|  26.1k|            bestDistance=distance;
 1655|  26.1k|            bestMissingFieldMask=tempInfo.missingFieldMask;
 1656|  26.1k|            bestPattern=patternMap->getPatternFromSkeleton(*trial.getSkeletonPtr(), &specifiedSkeleton);
 1657|  26.1k|            missingFields->setTo(tempInfo);
 1658|  26.1k|            if (distance==0) {
  ------------------
  |  Branch (1658:17): [True: 867, False: 25.2k]
  ------------------
 1659|    867|                break;
 1660|    867|            }
 1661|  26.1k|        }
 1662|   418k|    }
 1663|       |
 1664|       |    // If the best raw match had a specified skeleton and that skeleton was requested by the caller,
 1665|       |    // then return it too. This generally happens when the caller needs to pass that skeleton
 1666|       |    // through to adjustFieldTypes so the latter can do a better job.
 1667|  7.02k|    if (bestPattern && specifiedSkeletonPtr) {
  ------------------
  |  Branch (1667:9): [True: 7.02k, False: 0]
  |  Branch (1667:24): [True: 7.02k, False: 0]
  ------------------
 1668|  7.02k|        *specifiedSkeletonPtr = specifiedSkeleton;
 1669|  7.02k|    }
 1670|  7.02k|    return bestPattern;
 1671|  7.02k|}
_ZN6icu_7824DateTimePatternGenerator16adjustFieldTypesERKNS_13UnicodeStringEPKNS_11PtnSkeletonEi28UDateTimePatternMatchOptions:
 1677|  5.66k|                                           UDateTimePatternMatchOptions options) {
 1678|  5.66k|    UnicodeString newPattern;
 1679|  5.66k|    fp->set(pattern);
 1680|  20.6k|    for (int32_t i=0; i < fp->itemNumber; i++) {
  ------------------
  |  Branch (1680:23): [True: 15.0k, False: 5.66k]
  ------------------
 1681|  15.0k|        UnicodeString field = fp->items[i];
 1682|  15.0k|        if ( fp->isQuoteLiteral(field) ) {
  ------------------
  |  Branch (1682:14): [True: 0, False: 15.0k]
  ------------------
 1683|       |
 1684|      0|            UnicodeString quoteLiteral;
 1685|      0|            fp->getQuoteLiteral(quoteLiteral, &i);
 1686|      0|            newPattern += quoteLiteral;
 1687|      0|        }
 1688|  15.0k|        else {
 1689|  15.0k|            if (fp->isPatternSeparator(field)) {
  ------------------
  |  Branch (1689:17): [True: 3.09k, False: 11.9k]
  ------------------
 1690|  3.09k|                newPattern+=field;
 1691|  3.09k|                continue;
 1692|  3.09k|            }
 1693|  11.9k|            int32_t canonicalIndex = fp->getCanonicalIndex(field);
 1694|  11.9k|            if (canonicalIndex < 0) {
  ------------------
  |  Branch (1694:17): [True: 1.67k, False: 10.2k]
  ------------------
 1695|  1.67k|                newPattern+=field;
 1696|  1.67k|                continue;  // don't adjust
 1697|  1.67k|            }
 1698|  10.2k|            const dtTypeElem *row = &dtTypes[canonicalIndex];
 1699|  10.2k|            int32_t typeValue = row->field;
 1700|       |
 1701|       |            // handle day periods - with #13183, no longer need special handling here, integrated with normal types
 1702|       |
 1703|  10.2k|            if ((flags & kDTPGFixFractionalSeconds) != 0 && typeValue == UDATPG_SECOND_FIELD) {
  ------------------
  |  Branch (1703:17): [True: 1.64k, False: 8.60k]
  |  Branch (1703:61): [True: 414, False: 1.23k]
  ------------------
 1704|    414|                field += decimal;
 1705|    414|                dtMatcher->skeleton.original.appendFieldTo(UDATPG_FRACTIONAL_SECOND_FIELD, field);
 1706|  9.83k|            } else if (dtMatcher->skeleton.type[typeValue]!=0) {
  ------------------
  |  Branch (1706:24): [True: 9.83k, False: 0]
  ------------------
 1707|       |                    // Here:
 1708|       |                    // - "reqField" is the field from the originally requested skeleton after replacement
 1709|       |                    // of metacharacters 'j', 'C' and 'J', with length "reqFieldLen".
 1710|       |                    // - "field" is the field from the found pattern.
 1711|       |                    //
 1712|       |                    // The adjusted field should consist of characters from the originally requested
 1713|       |                    // skeleton, except in the case of UDATPG_MONTH_FIELD or
 1714|       |                    // UDATPG_WEEKDAY_FIELD or UDATPG_YEAR_FIELD, in which case it should consist
 1715|       |                    // of characters from the found pattern. In some cases of UDATPG_HOUR_FIELD,
 1716|       |                    // there is adjustment following the "defaultHourFormatChar". There is explanation
 1717|       |                    // how it is done below.
 1718|       |                    //
 1719|       |                    // The length of the adjusted field (adjFieldLen) should match that in the originally
 1720|       |                    // requested skeleton, except that in the following cases the length of the adjusted field
 1721|       |                    // should match that in the found pattern (i.e. the length of this pattern field should
 1722|       |                    // not be adjusted):
 1723|       |                    // 1. typeValue is UDATPG_HOUR_FIELD/MINUTE/SECOND and the corresponding bit in options is
 1724|       |                    //    not set (ticket #7180). Note, we may want to implement a similar change for other
 1725|       |                    //    numeric fields (MM, dd, etc.) so the default behavior is to get locale preference for
 1726|       |                    //    field length, but options bits can be used to override this.
 1727|       |                    // 2. There is a specified skeleton for the found pattern and one of the following is true:
 1728|       |                    //    a) The length of the field in the skeleton (skelFieldLen) is equal to reqFieldLen.
 1729|       |                    //    b) The pattern field is numeric and the skeleton field is not, or vice versa.
 1730|       |
 1731|  9.83k|                    char16_t reqFieldChar = dtMatcher->skeleton.original.getFieldChar(typeValue);
 1732|  9.83k|                    int32_t reqFieldLen = dtMatcher->skeleton.original.getFieldLength(typeValue);
 1733|  9.83k|                    if (reqFieldChar == CAP_E && reqFieldLen < 3)
  ------------------
  |  |   50|  19.6k|#define CAP_E             ((char16_t)0x0045)
  ------------------
  |  Branch (1733:25): [True: 885, False: 8.95k]
  |  Branch (1733:50): [True: 643, False: 242]
  ------------------
 1734|    643|                        reqFieldLen = 3; // 1-3 for E are equivalent to 3 for c,e
 1735|  9.83k|                    int32_t adjFieldLen = reqFieldLen;
 1736|  9.83k|                    if ( (typeValue==UDATPG_HOUR_FIELD && (options & UDATPG_MATCH_HOUR_FIELD_LENGTH)==0) ||
  ------------------
  |  Branch (1736:27): [True: 1.74k, False: 8.09k]
  |  Branch (1736:59): [True: 1.74k, False: 0]
  ------------------
 1737|  9.83k|                         (typeValue==UDATPG_MINUTE_FIELD && (options & UDATPG_MATCH_MINUTE_FIELD_LENGTH)==0) ||
  ------------------
  |  Branch (1737:27): [True: 1.24k, False: 6.85k]
  |  Branch (1737:61): [True: 1.24k, False: 0]
  ------------------
 1738|  9.83k|                         (typeValue==UDATPG_SECOND_FIELD && (options & UDATPG_MATCH_SECOND_FIELD_LENGTH)==0) ) {
  ------------------
  |  Branch (1738:27): [True: 906, False: 5.94k]
  |  Branch (1738:61): [True: 906, False: 0]
  ------------------
 1739|  3.89k|                         adjFieldLen = field.length();
 1740|  5.94k|                    } else if (specifiedSkeleton && reqFieldChar != LOW_C && reqFieldChar != LOW_E) {
  ------------------
  |  |   71|  9.72k|#define LOW_C             ((char16_t)0x0063)
  ------------------
                                  } else if (specifiedSkeleton && reqFieldChar != LOW_C && reqFieldChar != LOW_E) {
  ------------------
  |  |   73|  3.69k|#define LOW_E             ((char16_t)0x0065)
  ------------------
  |  Branch (1740:32): [True: 3.77k, False: 2.17k]
  |  Branch (1740:53): [True: 3.69k, False: 80]
  |  Branch (1740:78): [True: 3.64k, False: 51]
  ------------------
 1741|       |                        // (we skip this section for 'c' and 'e' because unlike the other characters considered in this function,
 1742|       |                        // they have no minimum field length-- 'E' and 'EE' are equivalent to 'EEE', but 'e' and 'ee' are not
 1743|       |                        // equivalent to 'eee' -- see the entries for "week day" in
 1744|       |                        // https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table for more info)
 1745|  3.64k|                        int32_t skelFieldLen = specifiedSkeleton->original.getFieldLength(typeValue);
 1746|  3.64k|                        UBool patFieldIsNumeric = (row->type > 0);
 1747|  3.64k|                        UBool skelFieldIsNumeric = (specifiedSkeleton->type[typeValue] > 0);
 1748|  3.64k|                        if (skelFieldLen == reqFieldLen || (patFieldIsNumeric && !skelFieldIsNumeric) || (skelFieldIsNumeric && !patFieldIsNumeric)) {
  ------------------
  |  Branch (1748:29): [True: 1.98k, False: 1.66k]
  |  Branch (1748:61): [True: 23, False: 1.63k]
  |  Branch (1748:82): [True: 0, False: 23]
  |  Branch (1748:107): [True: 23, False: 1.63k]
  |  Branch (1748:129): [True: 0, False: 23]
  ------------------
 1749|       |                            // don't adjust the field length in the found pattern
 1750|  1.98k|                            adjFieldLen = field.length();
 1751|  1.98k|                        }
 1752|  3.64k|                    }
 1753|  9.83k|                    char16_t c = (typeValue!= UDATPG_HOUR_FIELD
  ------------------
  |  Branch (1753:35): [True: 8.09k, False: 1.74k]
  ------------------
 1754|  9.83k|                            && typeValue!= UDATPG_MONTH_FIELD
  ------------------
  |  Branch (1754:32): [True: 7.31k, False: 776]
  ------------------
 1755|  9.83k|                            && typeValue!= UDATPG_WEEKDAY_FIELD
  ------------------
  |  Branch (1755:32): [True: 6.30k, False: 1.01k]
  ------------------
 1756|  9.83k|                            && (typeValue!= UDATPG_YEAR_FIELD || reqFieldChar==CAP_Y))
  ------------------
  |  |   66|    418|#define CAP_Y             ((char16_t)0x0059)
  ------------------
  |  Branch (1756:33): [True: 5.88k, False: 418]
  |  Branch (1756:66): [True: 40, False: 378]
  ------------------
 1757|  9.83k|                            ? reqFieldChar
 1758|  9.83k|                            : field.charAt(0);
 1759|  9.83k|                    if (c == CAP_E && adjFieldLen < 3) {
  ------------------
  |  |   50|  19.6k|#define CAP_E             ((char16_t)0x0045)
  ------------------
  |  Branch (1759:25): [True: 192, False: 9.64k]
  |  Branch (1759:39): [True: 26, False: 166]
  ------------------
 1760|     26|                        c = LOW_E;
  ------------------
  |  |   73|     26|#define LOW_E             ((char16_t)0x0065)
  ------------------
 1761|     26|                    }
 1762|  9.83k|                    if (typeValue == UDATPG_HOUR_FIELD && fDefaultHourFormatChar != 0) {
  ------------------
  |  Branch (1762:25): [True: 1.74k, False: 8.09k]
  |  Branch (1762:59): [True: 1.74k, False: 0]
  ------------------
 1763|       |                        // The adjustment here is required to match spec (https://www.unicode.org/reports/tr35/tr35-dates.html#dfst-hour).
 1764|       |                        // It is necessary to match the hour-cycle preferred by the Locale.
 1765|       |                        // Given that, we need to do the following adjustments:
 1766|       |                        // 1. When hour-cycle is h11 it should replace 'h' by 'K'.
 1767|       |                        // 2. When hour-cycle is h23 it should replace 'H' by 'k'.
 1768|       |                        // 3. When hour-cycle is h24 it should replace 'k' by 'H'.
 1769|       |                        // 4. When hour-cycle is h12 it should replace 'K' by 'h'.
 1770|       |
 1771|  1.74k|                        if ((flags & kDTPGSkeletonUsesCapJ) != 0 || reqFieldChar == fDefaultHourFormatChar) {
  ------------------
  |  Branch (1771:29): [True: 23, False: 1.72k]
  |  Branch (1771:69): [True: 1.18k, False: 534]
  ------------------
 1772|  1.21k|                            c = fDefaultHourFormatChar;
 1773|  1.21k|                        } else if (reqFieldChar == LOW_H && fDefaultHourFormatChar == CAP_K) {
  ------------------
  |  |   76|  1.06k|#define LOW_H             ((char16_t)0x0068)
  ------------------
                                      } else if (reqFieldChar == LOW_H && fDefaultHourFormatChar == CAP_K) {
  ------------------
  |  |   55|      0|#define CAP_K             ((char16_t)0x004B)
  ------------------
  |  Branch (1773:36): [True: 0, False: 534]
  |  Branch (1773:61): [True: 0, False: 0]
  ------------------
 1774|      0|                            c = CAP_K;
  ------------------
  |  |   55|      0|#define CAP_K             ((char16_t)0x004B)
  ------------------
 1775|    534|                        } else if (reqFieldChar == CAP_H && fDefaultHourFormatChar == LOW_K) {
  ------------------
  |  |   53|  1.06k|#define CAP_H             ((char16_t)0x0048)
  ------------------
                                      } else if (reqFieldChar == CAP_H && fDefaultHourFormatChar == LOW_K) {
  ------------------
  |  |   79|    442|#define LOW_K             ((char16_t)0x006B)
  ------------------
  |  Branch (1775:36): [True: 442, False: 92]
  |  Branch (1775:61): [True: 0, False: 442]
  ------------------
 1776|      0|                            c = LOW_K;
  ------------------
  |  |   79|      0|#define LOW_K             ((char16_t)0x006B)
  ------------------
 1777|    534|                        } else if (reqFieldChar == LOW_K && fDefaultHourFormatChar == CAP_H) {
  ------------------
  |  |   79|  1.06k|#define LOW_K             ((char16_t)0x006B)
  ------------------
                                      } else if (reqFieldChar == LOW_K && fDefaultHourFormatChar == CAP_H) {
  ------------------
  |  |   53|     17|#define CAP_H             ((char16_t)0x0048)
  ------------------
  |  Branch (1777:36): [True: 17, False: 517]
  |  Branch (1777:61): [True: 0, False: 17]
  ------------------
 1778|      0|                            c = CAP_H;
  ------------------
  |  |   53|      0|#define CAP_H             ((char16_t)0x0048)
  ------------------
 1779|    534|                        } else if (reqFieldChar == CAP_K && fDefaultHourFormatChar == LOW_H) {
  ------------------
  |  |   55|  1.06k|#define CAP_K             ((char16_t)0x004B)
  ------------------
                                      } else if (reqFieldChar == CAP_K && fDefaultHourFormatChar == LOW_H) {
  ------------------
  |  |   76|     75|#define LOW_H             ((char16_t)0x0068)
  ------------------
  |  Branch (1779:36): [True: 75, False: 459]
  |  Branch (1779:61): [True: 75, False: 0]
  ------------------
 1780|     75|                            c = LOW_H;
  ------------------
  |  |   76|     75|#define LOW_H             ((char16_t)0x0068)
  ------------------
 1781|     75|                        }
 1782|  1.74k|                    }
 1783|       |
 1784|  9.83k|                    field.remove();
 1785|  47.1k|                    for (int32_t j=adjFieldLen; j>0; --j) {
  ------------------
  |  Branch (1785:49): [True: 37.3k, False: 9.83k]
  ------------------
 1786|  37.3k|                        field += c;
 1787|  37.3k|                    }
 1788|  9.83k|            }
 1789|  10.2k|            newPattern+=field;
 1790|  10.2k|        }
 1791|  15.0k|    }
 1792|  5.66k|    return newPattern;
 1793|  5.66k|}
_ZN6icu_7824DateTimePatternGenerator16getBestAppendingEiiR10UErrorCode28UDateTimePatternMatchOptions:
 1796|  3.54k|DateTimePatternGenerator::getBestAppending(int32_t missingFields, int32_t flags, UErrorCode &status, UDateTimePatternMatchOptions options) {
 1797|  3.54k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1797:9): [True: 0, False: 3.54k]
  ------------------
 1798|      0|        return {};
 1799|      0|    }
 1800|  3.54k|    UnicodeString  resultPattern, tempPattern;
 1801|  3.54k|    const UnicodeString* tempPatternPtr;
 1802|  3.54k|    int32_t lastMissingFieldMask=0;
 1803|  3.54k|    if (missingFields!=0) {
  ------------------
  |  Branch (1803:9): [True: 3.34k, False: 206]
  ------------------
 1804|  3.34k|        resultPattern=UnicodeString();
 1805|  3.34k|        const PtnSkeleton* specifiedSkeleton=nullptr;
 1806|  3.34k|        tempPatternPtr = getBestRaw(*dtMatcher, missingFields, distanceInfo, status, &specifiedSkeleton);
 1807|  3.34k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1807:13): [True: 0, False: 3.34k]
  ------------------
 1808|      0|            return {};
 1809|      0|        }
 1810|  3.34k|        tempPattern = *tempPatternPtr;
 1811|  3.34k|        resultPattern = adjustFieldTypes(tempPattern, specifiedSkeleton, flags, options);
 1812|  3.34k|        if ( distanceInfo->missingFieldMask==0 ) {
  ------------------
  |  Branch (1812:14): [True: 1.32k, False: 2.02k]
  ------------------
 1813|  1.32k|            return resultPattern;
 1814|  1.32k|        }
 1815|  4.07k|        while (distanceInfo->missingFieldMask!=0) { // precondition: EVERY single field must work!
  ------------------
  |  Branch (1815:16): [True: 2.53k, False: 1.54k]
  ------------------
 1816|  2.53k|            if ( lastMissingFieldMask == distanceInfo->missingFieldMask ) {
  ------------------
  |  Branch (1816:18): [True: 480, False: 2.05k]
  ------------------
 1817|    480|                break;  // cannot find the proper missing field
 1818|    480|            }
 1819|  2.05k|            if (((distanceInfo->missingFieldMask & UDATPG_SECOND_AND_FRACTIONAL_MASK)==UDATPG_FRACTIONAL_MASK) &&
  ------------------
  |  Branch (1819:17): [True: 452, False: 1.60k]
  ------------------
 1820|  2.05k|                ((missingFields & UDATPG_SECOND_AND_FRACTIONAL_MASK) == UDATPG_SECOND_AND_FRACTIONAL_MASK)) {
  ------------------
  |  Branch (1820:17): [True: 414, False: 38]
  ------------------
 1821|    414|                resultPattern = adjustFieldTypes(resultPattern, specifiedSkeleton, flags | kDTPGFixFractionalSeconds, options);
 1822|    414|                distanceInfo->missingFieldMask &= ~UDATPG_FRACTIONAL_MASK;
 1823|    414|                continue;
 1824|    414|            }
 1825|  1.64k|            int32_t startingMask = distanceInfo->missingFieldMask;
 1826|  1.64k|            tempPatternPtr = getBestRaw(*dtMatcher, distanceInfo->missingFieldMask, distanceInfo, status, &specifiedSkeleton);
 1827|  1.64k|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (1827:17): [True: 0, False: 1.64k]
  ------------------
 1828|      0|                return {};
 1829|      0|            }
 1830|  1.64k|            tempPattern = *tempPatternPtr;
 1831|  1.64k|            tempPattern = adjustFieldTypes(tempPattern, specifiedSkeleton, flags, options);
 1832|  1.64k|            int32_t foundMask=startingMask& ~distanceInfo->missingFieldMask;
 1833|  1.64k|            int32_t topField=getTopBitNumber(foundMask);
 1834|       |
 1835|  1.64k|            if (appendItemFormats[topField].length() != 0) {
  ------------------
  |  Branch (1835:17): [True: 1.64k, False: 0]
  ------------------
 1836|  1.64k|                UnicodeString appendName;
 1837|  1.64k|                getAppendName(static_cast<UDateTimePatternField>(topField), appendName);
 1838|  1.64k|                const UnicodeString *values[3] = {
 1839|  1.64k|                    &resultPattern,
 1840|  1.64k|                    &tempPattern,
 1841|  1.64k|                    &appendName
 1842|  1.64k|                };
 1843|  1.64k|                SimpleFormatter(appendItemFormats[topField], 2, 3, status).
 1844|  1.64k|                    formatAndReplace(values, 3, resultPattern, nullptr, 0, status);
 1845|  1.64k|            }
 1846|  1.64k|            lastMissingFieldMask = distanceInfo->missingFieldMask;
 1847|  1.64k|        }
 1848|  2.02k|    }
 1849|  2.22k|    return resultPattern;
 1850|  3.54k|}
_ZNK6icu_7824DateTimePatternGenerator15getTopBitNumberEi:
 1853|  1.64k|DateTimePatternGenerator::getTopBitNumber(int32_t foundMask) const {
 1854|  1.64k|    if ( foundMask==0 ) {
  ------------------
  |  Branch (1854:10): [True: 0, False: 1.64k]
  ------------------
 1855|      0|        return 0;
 1856|      0|    }
 1857|  1.64k|    int32_t i=0;
 1858|  16.5k|    while (foundMask!=0) {
  ------------------
  |  Branch (1858:12): [True: 14.9k, False: 1.64k]
  ------------------
 1859|  14.9k|        foundMask >>=1;
 1860|  14.9k|        ++i;
 1861|  14.9k|    }
 1862|  1.64k|    if (i-1 >UDATPG_ZONE_FIELD) {
  ------------------
  |  Branch (1862:9): [True: 0, False: 1.64k]
  ------------------
 1863|      0|        return UDATPG_ZONE_FIELD;
 1864|      0|    }
 1865|  1.64k|    else
 1866|  1.64k|        return i-1;
 1867|  1.64k|}
_ZN6icu_7824DateTimePatternGenerator18setAvailableFormatERKNS_13UnicodeStringER10UErrorCode:
 1871|  96.0k|{
 1872|  96.0k|    fAvailableFormatKeyHash->puti(key, 1, err);
 1873|  96.0k|}
_ZNK6icu_7824DateTimePatternGenerator20isAvailableFormatSetERKNS_13UnicodeStringE:
 1876|   192k|DateTimePatternGenerator::isAvailableFormatSet(const UnicodeString &key) const {
 1877|   192k|    return fAvailableFormatKeyHash->geti(key) == 1;
 1878|   192k|}
_ZN6icu_7810PatternMapC2Ev:
 2014|  2.04k|PatternMap::PatternMap() {
 2015|   108k|   for (int32_t i=0; i < MAX_PATTERN_ENTRIES; ++i ) {
  ------------------
  |  |   26|   108k|#define MAX_PATTERN_ENTRIES 52
  ------------------
  |  Branch (2015:22): [True: 106k, False: 2.04k]
  ------------------
 2016|   106k|       boot[i] = nullptr;
 2017|   106k|   }
 2018|  2.04k|   isDupAllowed = true;
 2019|  2.04k|}
_ZNK6icu_7810PatternMap9getHeaderEDs:
 2063|   316k|PatternMap::getHeader(char16_t baseChar) const {
 2064|   316k|    PtnElem* curElem;
 2065|       |
 2066|   316k|    if ( (baseChar >= CAP_A) && (baseChar <= CAP_Z) ) {
  ------------------
  |  |   46|   316k|#define CAP_A             ((char16_t)0x0041)
  ------------------
                  if ( (baseChar >= CAP_A) && (baseChar <= CAP_Z) ) {
  ------------------
  |  |   67|   316k|#define CAP_Z             ((char16_t)0x005A)
  ------------------
  |  Branch (2066:10): [True: 316k, False: 0]
  |  Branch (2066:33): [True: 176k, False: 139k]
  ------------------
 2067|   176k|         curElem = boot[baseChar-CAP_A];
  ------------------
  |  |   46|   176k|#define CAP_A             ((char16_t)0x0041)
  ------------------
 2068|   176k|    }
 2069|   139k|    else {
 2070|   139k|        if ( (baseChar >=LOW_A) && (baseChar <= LOW_Z) ) {
  ------------------
  |  |   69|   139k|#define LOW_A             ((char16_t)0x0061)
  ------------------
                      if ( (baseChar >=LOW_A) && (baseChar <= LOW_Z) ) {
  ------------------
  |  |   94|   139k|#define LOW_Z             ((char16_t)0x007A)
  ------------------
  |  Branch (2070:14): [True: 139k, False: 0]
  |  Branch (2070:36): [True: 139k, False: 0]
  ------------------
 2071|   139k|            curElem = boot[26+baseChar-LOW_A];
  ------------------
  |  |   69|   139k|#define LOW_A             ((char16_t)0x0061)
  ------------------
 2072|   139k|        }
 2073|      0|        else {
 2074|      0|            return nullptr;
 2075|      0|        }
 2076|   139k|    }
 2077|   316k|    return curElem;
 2078|   316k|}
_ZN6icu_7810PatternMapD2Ev:
 2080|  2.04k|PatternMap::~PatternMap() {
 2081|   108k|   for (int32_t i=0; i < MAX_PATTERN_ENTRIES; ++i ) {
  ------------------
  |  |   26|   108k|#define MAX_PATTERN_ENTRIES 52
  ------------------
  |  Branch (2081:22): [True: 106k, False: 2.04k]
  ------------------
 2082|   106k|       if (boot[i] != nullptr ) {
  ------------------
  |  Branch (2082:12): [True: 34.7k, False: 71.5k]
  ------------------
 2083|  34.7k|           delete boot[i];
 2084|  34.7k|           boot[i] = nullptr;
 2085|  34.7k|       }
 2086|   106k|   }
 2087|  2.04k|}  // PatternMap destructor
_ZN6icu_7810PatternMap3addERKNS_13UnicodeStringERKNS_11PtnSkeletonES3_aR10UErrorCode:
 2094|   145k|                UErrorCode &status) {
 2095|   145k|    char16_t baseChar = basePattern.charAt(0);
 2096|   145k|    PtnElem *curElem, *baseElem;
 2097|   145k|    status = U_ZERO_ERROR;
 2098|       |
 2099|       |    // the baseChar must be A-Z or a-z
 2100|   145k|    if ((baseChar >= CAP_A) && (baseChar <= CAP_Z)) {
  ------------------
  |  |   46|   145k|#define CAP_A             ((char16_t)0x0041)
  ------------------
                  if ((baseChar >= CAP_A) && (baseChar <= CAP_Z)) {
  ------------------
  |  |   67|   145k|#define CAP_Z             ((char16_t)0x005A)
  ------------------
  |  Branch (2100:9): [True: 145k, False: 0]
  |  Branch (2100:32): [True: 77.6k, False: 67.4k]
  ------------------
 2101|  77.6k|        baseElem = boot[baseChar-CAP_A];
  ------------------
  |  |   46|  77.6k|#define CAP_A             ((char16_t)0x0041)
  ------------------
 2102|  77.6k|    }
 2103|  67.4k|    else {
 2104|  67.4k|        if ((baseChar >=LOW_A) && (baseChar <= LOW_Z)) {
  ------------------
  |  |   69|  67.4k|#define LOW_A             ((char16_t)0x0061)
  ------------------
                      if ((baseChar >=LOW_A) && (baseChar <= LOW_Z)) {
  ------------------
  |  |   94|  67.4k|#define LOW_Z             ((char16_t)0x007A)
  ------------------
  |  Branch (2104:13): [True: 67.4k, False: 0]
  |  Branch (2104:35): [True: 67.4k, False: 0]
  ------------------
 2105|  67.4k|            baseElem = boot[26+baseChar-LOW_A];
  ------------------
  |  |   69|  67.4k|#define LOW_A             ((char16_t)0x0061)
  ------------------
 2106|  67.4k|         }
 2107|      0|         else {
 2108|      0|             status = U_ILLEGAL_CHARACTER;
 2109|      0|             return;
 2110|      0|         }
 2111|  67.4k|    }
 2112|       |
 2113|   145k|    if (baseElem == nullptr) {
  ------------------
  |  Branch (2113:9): [True: 34.7k, False: 110k]
  ------------------
 2114|  34.7k|        LocalPointer<PtnElem> newElem(new PtnElem(basePattern, value), status);
 2115|  34.7k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (2115:13): [True: 0, False: 34.7k]
  ------------------
 2116|      0|            return; // out of memory
 2117|      0|        }
 2118|  34.7k|        newElem->skeleton.adoptInsteadAndCheckErrorCode(new PtnSkeleton(skeleton), status);
 2119|  34.7k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (2119:13): [True: 0, False: 34.7k]
  ------------------
 2120|      0|            return; // out of memory
 2121|      0|        }
 2122|  34.7k|        newElem->skeletonWasSpecified = skeletonWasSpecified;
 2123|  34.7k|        if (baseChar >= LOW_A) {
  ------------------
  |  |   69|  34.7k|#define LOW_A             ((char16_t)0x0061)
  ------------------
  |  Branch (2123:13): [True: 14.3k, False: 20.4k]
  ------------------
 2124|  14.3k|            boot[26 + (baseChar - LOW_A)] = newElem.orphan(); // the boot array now owns the PtnElem.
  ------------------
  |  |   69|  14.3k|#define LOW_A             ((char16_t)0x0061)
  ------------------
 2125|  14.3k|        }
 2126|  20.4k|        else {
 2127|  20.4k|            boot[baseChar - CAP_A] = newElem.orphan(); // the boot array now owns the PtnElem.
  ------------------
  |  |   46|  20.4k|#define CAP_A             ((char16_t)0x0041)
  ------------------
 2128|  20.4k|        }
 2129|  34.7k|    }
 2130|   145k|    if ( baseElem != nullptr ) {
  ------------------
  |  Branch (2130:10): [True: 110k, False: 34.7k]
  ------------------
 2131|   110k|        curElem = getDuplicateElem(basePattern, skeleton, baseElem);
 2132|       |
 2133|   110k|        if (curElem == nullptr) {
  ------------------
  |  Branch (2133:13): [True: 98.0k, False: 12.2k]
  ------------------
 2134|       |            // add new element to the list.
 2135|  98.0k|            curElem = baseElem;
 2136|   451k|            while( curElem -> next != nullptr )
  ------------------
  |  Branch (2136:20): [True: 353k, False: 98.0k]
  ------------------
 2137|   353k|            {
 2138|   353k|                curElem = curElem->next.getAlias();
 2139|   353k|            }
 2140|       |
 2141|  98.0k|            LocalPointer<PtnElem> newElem(new PtnElem(basePattern, value), status);
 2142|  98.0k|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (2142:17): [True: 0, False: 98.0k]
  ------------------
 2143|      0|                return; // out of memory
 2144|      0|            }
 2145|  98.0k|            newElem->skeleton.adoptInsteadAndCheckErrorCode(new PtnSkeleton(skeleton), status);
 2146|  98.0k|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (2146:17): [True: 0, False: 98.0k]
  ------------------
 2147|      0|                return; // out of memory
 2148|      0|            }
 2149|  98.0k|            newElem->skeletonWasSpecified = skeletonWasSpecified;
 2150|  98.0k|            curElem->next.adoptInstead(newElem.orphan());
 2151|  98.0k|            curElem = curElem->next.getAlias();
 2152|  98.0k|        }
 2153|  12.2k|        else {
 2154|       |            // Pattern exists in the list already.
 2155|  12.2k|            if ( !isDupAllowed ) {
  ------------------
  |  Branch (2155:18): [True: 0, False: 12.2k]
  ------------------
 2156|      0|                return;
 2157|      0|            }
 2158|       |            // Overwrite the value.
 2159|  12.2k|            curElem->pattern = value;
 2160|       |            // It was a bug that we were not doing the following previously,
 2161|       |            // though that bug hid other problems by making things partly work.
 2162|  12.2k|            curElem->skeletonWasSpecified = skeletonWasSpecified;
 2163|  12.2k|        }
 2164|   110k|    }
 2165|   145k|}  // PatternMap::add
_ZNK6icu_7810PatternMap25getPatternFromBasePatternERKNS_13UnicodeStringERa:
 2169|   145k|PatternMap::getPatternFromBasePattern(const UnicodeString& basePattern, UBool& skeletonWasSpecified) const { // key to search for
 2170|   145k|   PtnElem *curElem;
 2171|       |
 2172|   145k|   if ((curElem=getHeader(basePattern.charAt(0)))==nullptr) {
  ------------------
  |  Branch (2172:8): [True: 34.7k, False: 110k]
  ------------------
 2173|  34.7k|       return nullptr;  // no match
 2174|  34.7k|   }
 2175|       |
 2176|   451k|   do  {
 2177|   451k|       if ( basePattern.compare(curElem->basePattern)==0 ) {
  ------------------
  |  Branch (2177:13): [True: 18.3k, False: 433k]
  ------------------
 2178|  18.3k|          skeletonWasSpecified = curElem->skeletonWasSpecified;
 2179|  18.3k|          return &(curElem->pattern);
 2180|  18.3k|       }
 2181|   433k|       curElem = curElem->next.getAlias();
 2182|   433k|   } while (curElem != nullptr);
  ------------------
  |  Branch (2182:13): [True: 341k, False: 91.9k]
  ------------------
 2183|       |
 2184|  91.9k|   return nullptr;
 2185|   110k|}  // PatternMap::getFromBasePattern
_ZNK6icu_7810PatternMap22getPatternFromSkeletonERKNS_11PtnSkeletonEPPS2_:
 2195|   171k|PatternMap::getPatternFromSkeleton(const PtnSkeleton& skeleton, const PtnSkeleton** specifiedSkeletonPtr) const { // key to search for
 2196|   171k|   PtnElem *curElem;
 2197|       |
 2198|   171k|   if (specifiedSkeletonPtr) {
  ------------------
  |  Branch (2198:8): [True: 171k, False: 0]
  ------------------
 2199|   171k|       *specifiedSkeletonPtr = nullptr;
 2200|   171k|   }
 2201|       |
 2202|       |   // find boot entry
 2203|   171k|   char16_t baseChar = skeleton.getFirstChar();
 2204|   171k|   if ((curElem=getHeader(baseChar))==nullptr) {
  ------------------
  |  Branch (2204:8): [True: 34.7k, False: 136k]
  ------------------
 2205|  34.7k|       return nullptr;  // no match
 2206|  34.7k|   }
 2207|       |
 2208|   527k|   do  {
 2209|   527k|       UBool equal;
 2210|   527k|       if (specifiedSkeletonPtr != nullptr) { // called from DateTimePatternGenerator::getBestRaw or addPattern, use original
  ------------------
  |  Branch (2210:12): [True: 527k, False: 0]
  ------------------
 2211|   527k|           equal = curElem->skeleton->original == skeleton.original;
 2212|   527k|       } else { // called from DateTimePatternGenerator::getRedundants, use baseOriginal
 2213|      0|           equal = curElem->skeleton->baseOriginal == skeleton.baseOriginal;
 2214|      0|       }
 2215|   527k|       if (equal) {
  ------------------
  |  Branch (2215:12): [True: 38.4k, False: 488k]
  ------------------
 2216|  38.4k|           if (specifiedSkeletonPtr && curElem->skeletonWasSpecified) {
  ------------------
  |  Branch (2216:16): [True: 38.4k, False: 0]
  |  Branch (2216:40): [True: 18.9k, False: 19.4k]
  ------------------
 2217|  18.9k|               *specifiedSkeletonPtr = curElem->skeleton.getAlias();
 2218|  18.9k|           }
 2219|  38.4k|           return &(curElem->pattern);
 2220|  38.4k|       }
 2221|   488k|       curElem = curElem->next.getAlias();
 2222|   488k|   } while (curElem != nullptr);
  ------------------
  |  Branch (2222:13): [True: 390k, False: 98.0k]
  ------------------
 2223|       |
 2224|  98.0k|   return nullptr;
 2225|   136k|}
_ZN6icu_7810PatternMap16getDuplicateElemERKNS_13UnicodeStringERKNS_11PtnSkeletonEPNS_7PtnElemE:
 2269|   110k|            PtnElem *baseElem) {
 2270|   110k|   PtnElem *curElem;
 2271|       |
 2272|   110k|   if ( baseElem == nullptr ) {
  ------------------
  |  Branch (2272:9): [True: 0, False: 110k]
  ------------------
 2273|      0|         return nullptr;
 2274|      0|   }
 2275|   110k|   else {
 2276|   110k|         curElem = baseElem;
 2277|   110k|   }
 2278|   469k|   do {
 2279|   469k|     if ( basePattern.compare(curElem->basePattern)==0 ) {
  ------------------
  |  Branch (2279:11): [True: 18.3k, False: 451k]
  ------------------
 2280|  18.3k|         UBool isEqual = true;
 2281|   265k|         for (int32_t i = 0; i < UDATPG_FIELD_COUNT; ++i) {
  ------------------
  |  Branch (2281:30): [True: 253k, False: 12.2k]
  ------------------
 2282|   253k|            if (curElem->skeleton->type[i] != skeleton.type[i] ) {
  ------------------
  |  Branch (2282:17): [True: 6.12k, False: 247k]
  ------------------
 2283|  6.12k|                isEqual = false;
 2284|  6.12k|                break;
 2285|  6.12k|            }
 2286|   253k|        }
 2287|  18.3k|        if (isEqual) {
  ------------------
  |  Branch (2287:13): [True: 12.2k, False: 6.12k]
  ------------------
 2288|  12.2k|            return curElem;
 2289|  12.2k|        }
 2290|  18.3k|     }
 2291|   457k|     curElem = curElem->next.getAlias();
 2292|   457k|   } while( curElem != nullptr );
  ------------------
  |  Branch (2292:13): [True: 359k, False: 98.0k]
  ------------------
 2293|       |
 2294|       |   // end of the list
 2295|  98.0k|   return nullptr;
 2296|       |
 2297|   110k|}  // PatternMap::getDuplicateElem
_ZN6icu_7815DateTimeMatcherC2Ev:
 2299|   191k|DateTimeMatcher::DateTimeMatcher() {
 2300|   191k|}
_ZN6icu_7815DateTimeMatcherD2Ev:
 2302|   609k|DateTimeMatcher::~DateTimeMatcher() {}
_ZN6icu_7815DateTimeMatcherC2ERKS0_:
 2304|   418k|DateTimeMatcher::DateTimeMatcher(const DateTimeMatcher& other) {
 2305|   418k|    copyFrom(other.skeleton);
 2306|   418k|}
_ZN6icu_7815DateTimeMatcher3setERKNS_13UnicodeStringEPNS_12FormatParserE:
 2315|  2.04k|DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp) {
 2316|  2.04k|    PtnSkeleton localSkeleton;
 2317|  2.04k|    return set(pattern, fp, localSkeleton);
 2318|  2.04k|}
_ZN6icu_7815DateTimeMatcher3setERKNS_13UnicodeStringEPNS_12FormatParserERNS_11PtnSkeletonE:
 2321|   184k|DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton& skeletonResult) {
 2322|   184k|    int32_t i;
 2323|  3.12M|    for (i=0; i<UDATPG_FIELD_COUNT; ++i) {
  ------------------
  |  Branch (2323:15): [True: 2.94M, False: 184k]
  ------------------
 2324|  2.94M|        skeletonResult.type[i] = NONE;
  ------------------
  |  |   31|  2.94M|#define NONE          0
  ------------------
 2325|  2.94M|    }
 2326|   184k|    skeletonResult.original.clear();
 2327|   184k|    skeletonResult.baseOriginal.clear();
 2328|   184k|    skeletonResult.addedDefaultDayPeriod = false;
 2329|       |
 2330|   184k|    fp->set(pattern);
 2331|  1.44M|    for (i=0; i < fp->itemNumber; i++) {
  ------------------
  |  Branch (2331:15): [True: 1.25M, False: 184k]
  ------------------
 2332|  1.25M|        const UnicodeString& value = fp->items[i];
 2333|       |        // don't skip 'a' anymore, dayPeriod handled specially below
 2334|       |
 2335|  1.25M|        if ( fp->isQuoteLiteral(value) ) {
  ------------------
  |  Branch (2335:14): [True: 6.34k, False: 1.24M]
  ------------------
 2336|  6.34k|            UnicodeString quoteLiteral;
 2337|  6.34k|            fp->getQuoteLiteral(quoteLiteral, &i);
 2338|  6.34k|            continue;
 2339|  6.34k|        }
 2340|  1.24M|        int32_t canonicalIndex = fp->getCanonicalIndex(value);
 2341|  1.24M|        if (canonicalIndex < 0) {
  ------------------
  |  Branch (2341:13): [True: 690k, False: 558k]
  ------------------
 2342|   690k|            continue;
 2343|   690k|        }
 2344|   558k|        const dtTypeElem *row = &dtTypes[canonicalIndex];
 2345|   558k|        int32_t field = row->field;
 2346|   558k|        skeletonResult.original.populate(field, value);
 2347|   558k|        char16_t repeatChar = row->patternChar;
 2348|   558k|        int32_t repeatCount = row->minLen;
 2349|   558k|        skeletonResult.baseOriginal.populate(field, repeatChar, repeatCount);
 2350|   558k|        int16_t subField = row->type;
 2351|   558k|        if (row->type > 0) {
  ------------------
  |  Branch (2351:13): [True: 395k, False: 163k]
  ------------------
 2352|   395k|            U_ASSERT(value.length() < INT16_MAX);
  ------------------
  |  |   35|   395k|#   define U_ASSERT(exp) (void)0
  ------------------
 2353|   395k|            subField += static_cast<int16_t>(value.length());
 2354|   395k|        }
 2355|   558k|        skeletonResult.type[field] = subField;
 2356|   558k|    }
 2357|       |
 2358|       |    // #20739, we have a skeleton with minutes and milliseconds, but no seconds
 2359|       |    //
 2360|       |    // Theoretically we would need to check and fix all fields with "gaps":
 2361|       |    // for example year-day (no month), month-hour (no day), and so on, All the possible field combinations.
 2362|       |    // Plus some smartness: year + hour => should we add month, or add day-of-year?
 2363|       |    // What about month + day-of-week, or month + am/pm indicator.
 2364|       |    // I think beyond a certain point we should not try to fix bad developer input and try guessing what they mean.
 2365|       |    // Garbage in, garbage out.
 2366|   184k|    if (!skeletonResult.original.isFieldEmpty(UDATPG_MINUTE_FIELD)
  ------------------
  |  Branch (2366:9): [True: 61.0k, False: 122k]
  ------------------
 2367|   184k|        && !skeletonResult.original.isFieldEmpty(UDATPG_FRACTIONAL_SECOND_FIELD)
  ------------------
  |  Branch (2367:12): [True: 8.95k, False: 52.0k]
  ------------------
 2368|   184k|        && skeletonResult.original.isFieldEmpty(UDATPG_SECOND_FIELD)) {
  ------------------
  |  Branch (2368:12): [True: 1.22k, False: 7.72k]
  ------------------
 2369|       |        // Force the use of seconds
 2370|  79.6k|        for (i = 0; dtTypes[i].patternChar != 0; i++) {
  ------------------
  |  Branch (2370:21): [True: 79.6k, False: 0]
  ------------------
 2371|  79.6k|            if (dtTypes[i].field == UDATPG_SECOND_FIELD) {
  ------------------
  |  Branch (2371:17): [True: 1.22k, False: 78.4k]
  ------------------
 2372|       |                // first entry for UDATPG_SECOND_FIELD
 2373|  1.22k|                skeletonResult.original.populate(UDATPG_SECOND_FIELD, dtTypes[i].patternChar, dtTypes[i].minLen);
 2374|  1.22k|                skeletonResult.baseOriginal.populate(UDATPG_SECOND_FIELD, dtTypes[i].patternChar, dtTypes[i].minLen);
 2375|       |                // We add value.length, same as above, when type is first initialized.
 2376|       |                // The value we want to "fake" here is "s", and 1 means "s".length()
 2377|  1.22k|                int16_t subField = dtTypes[i].type;
 2378|  1.22k|                skeletonResult.type[UDATPG_SECOND_FIELD] = (subField > 0) ? subField + 1 : subField;
  ------------------
  |  Branch (2378:60): [True: 1.22k, False: 0]
  ------------------
 2379|  1.22k|                break;
 2380|  1.22k|            }
 2381|  79.6k|        }
 2382|  1.22k|    }
 2383|       |
 2384|       |    // #13183, handle special behavior for day period characters (a, b, B)
 2385|   184k|    if (!skeletonResult.original.isFieldEmpty(UDATPG_HOUR_FIELD)) {
  ------------------
  |  Branch (2385:9): [True: 80.3k, False: 103k]
  ------------------
 2386|  80.3k|        if (skeletonResult.original.getFieldChar(UDATPG_HOUR_FIELD)==LOW_H || skeletonResult.original.getFieldChar(UDATPG_HOUR_FIELD)==CAP_K) {
  ------------------
  |  |   76|   160k|#define LOW_H             ((char16_t)0x0068)
  ------------------
                      if (skeletonResult.original.getFieldChar(UDATPG_HOUR_FIELD)==LOW_H || skeletonResult.original.getFieldChar(UDATPG_HOUR_FIELD)==CAP_K) {
  ------------------
  |  |   55|  45.9k|#define CAP_K             ((char16_t)0x004B)
  ------------------
  |  Branch (2386:13): [True: 34.3k, False: 45.9k]
  |  Branch (2386:79): [True: 820, False: 45.1k]
  ------------------
 2387|       |            // We have a skeleton with 12-hour-cycle format
 2388|  35.1k|            if (skeletonResult.original.isFieldEmpty(UDATPG_DAYPERIOD_FIELD)) {
  ------------------
  |  Branch (2388:17): [True: 15.6k, False: 19.5k]
  ------------------
 2389|       |                // But we do not have a day period in the skeleton; add the default DAYPERIOD (currently "a")
 2390|   749k|                for (i = 0; dtTypes[i].patternChar != 0; i++) {
  ------------------
  |  Branch (2390:29): [True: 749k, False: 0]
  ------------------
 2391|   749k|                    if ( dtTypes[i].field == UDATPG_DAYPERIOD_FIELD ) {
  ------------------
  |  Branch (2391:26): [True: 15.6k, False: 733k]
  ------------------
 2392|       |                        // first entry for UDATPG_DAYPERIOD_FIELD
 2393|  15.6k|                        skeletonResult.original.populate(UDATPG_DAYPERIOD_FIELD, dtTypes[i].patternChar, dtTypes[i].minLen);
 2394|  15.6k|                        skeletonResult.baseOriginal.populate(UDATPG_DAYPERIOD_FIELD, dtTypes[i].patternChar, dtTypes[i].minLen);
 2395|  15.6k|                        skeletonResult.type[UDATPG_DAYPERIOD_FIELD] = dtTypes[i].type;
 2396|  15.6k|                        skeletonResult.addedDefaultDayPeriod = true;
 2397|  15.6k|                        break;
 2398|  15.6k|                    }
 2399|   749k|                }
 2400|  15.6k|            }
 2401|  45.1k|        } else {
 2402|       |            // Skeleton has 24-hour-cycle hour format and has dayPeriod, delete dayPeriod (i.e. ignore it)
 2403|  45.1k|            skeletonResult.original.clearField(UDATPG_DAYPERIOD_FIELD);
 2404|  45.1k|            skeletonResult.baseOriginal.clearField(UDATPG_DAYPERIOD_FIELD);
 2405|  45.1k|            skeletonResult.type[UDATPG_DAYPERIOD_FIELD] = NONE;
  ------------------
  |  |   31|  45.1k|#define NONE          0
  ------------------
 2406|  45.1k|        }
 2407|  80.3k|    }
 2408|   184k|    copyFrom(skeletonResult);
 2409|   184k|}
_ZN6icu_7815DateTimeMatcher14getBasePatternERNS_13UnicodeStringE:
 2412|   145k|DateTimeMatcher::getBasePattern(UnicodeString &result ) {
 2413|   145k|    result.remove(); // Reset the result first.
 2414|   145k|    skeleton.baseOriginal.appendTo(result);
 2415|   145k|}
_ZNK6icu_7815DateTimeMatcher11getDistanceERKS0_iRNS_12DistanceInfoE:
 2424|   418k|DateTimeMatcher::getDistance(const DateTimeMatcher& other, int32_t includeMask, DistanceInfo& distanceInfo) const {
 2425|   418k|    int32_t result = 0;
 2426|   418k|    distanceInfo.clear();
 2427|  7.11M|    for (int32_t i=0; i<UDATPG_FIELD_COUNT; ++i ) {
  ------------------
  |  Branch (2427:23): [True: 6.69M, False: 418k]
  ------------------
 2428|  6.69M|        int32_t myType = (includeMask&(1<<i))==0 ? 0 : skeleton.type[i];
  ------------------
  |  Branch (2428:26): [True: 3.89M, False: 2.80M]
  ------------------
 2429|  6.69M|        int32_t otherType = other.skeleton.type[i];
 2430|  6.69M|        if (myType==otherType) {
  ------------------
  |  Branch (2430:13): [True: 4.66M, False: 2.03M]
  ------------------
 2431|  4.66M|            continue;
 2432|  4.66M|        }
 2433|  2.03M|        if (myType==0) {// and other is not
  ------------------
  |  Branch (2433:13): [True: 805k, False: 1.22M]
  ------------------
 2434|   805k|            result += EXTRA_FIELD;
  ------------------
  |  |   32|   805k|#define EXTRA_FIELD   0x10000
  ------------------
 2435|   805k|            distanceInfo.addExtra(i);
 2436|   805k|        }
 2437|  1.22M|        else {
 2438|  1.22M|            if (otherType==0) {
  ------------------
  |  Branch (2438:17): [True: 1.03M, False: 190k]
  ------------------
 2439|  1.03M|                result += MISSING_FIELD;
  ------------------
  |  |   33|  1.03M|#define MISSING_FIELD  0x1000
  ------------------
 2440|  1.03M|                distanceInfo.addMissing(i);
 2441|  1.03M|            }
 2442|   190k|            else {
 2443|   190k|                result += abs(myType - otherType);
 2444|   190k|            }
 2445|  1.22M|        }
 2446|       |
 2447|  2.03M|    }
 2448|   418k|    return result;
 2449|   418k|}
_ZN6icu_7815DateTimeMatcher8copyFromERKNS_11PtnSkeletonE:
 2452|  1.02M|DateTimeMatcher::copyFrom(const PtnSkeleton& newSkeleton) {
 2453|  1.02M|    skeleton.copyFrom(newSkeleton);
 2454|  1.02M|}
_ZNK6icu_7815DateTimeMatcher6equalsEPKS0_:
 2463|   418k|DateTimeMatcher::equals(const DateTimeMatcher* other) const {
 2464|   418k|    if (other==nullptr) { return false; }
  ------------------
  |  Branch (2464:9): [True: 418k, False: 0]
  ------------------
 2465|      0|    return skeleton.original == other->skeleton.original;
 2466|   418k|}
_ZNK6icu_7815DateTimeMatcher12getFieldMaskEv:
 2469|  1.77k|DateTimeMatcher::getFieldMask() const {
 2470|  1.77k|    int32_t result = 0;
 2471|       |
 2472|  30.1k|    for (int32_t i=0; i<UDATPG_FIELD_COUNT; ++i) {
  ------------------
  |  Branch (2472:23): [True: 28.3k, False: 1.77k]
  ------------------
 2473|  28.3k|        if (skeleton.type[i]!=0) {
  ------------------
  |  Branch (2473:13): [True: 9.19k, False: 19.1k]
  ------------------
 2474|  9.19k|            result |= (1<<i);
 2475|  9.19k|        }
 2476|  28.3k|    }
 2477|  1.77k|    return result;
 2478|  1.77k|}
_ZN6icu_7815DateTimeMatcher14getSkeletonPtrEv:
 2481|  27.7k|DateTimeMatcher::getSkeletonPtr() {
 2482|  27.7k|    return &skeleton;
 2483|  27.7k|}
_ZN6icu_7812FormatParserC2Ev:
 2485|  38.9k|FormatParser::FormatParser () {
 2486|  38.9k|    status = START;
 2487|  38.9k|    itemNumber = 0;
 2488|  38.9k|}
_ZN6icu_7812FormatParserD2Ev:
 2491|  38.9k|FormatParser::~FormatParser () {
 2492|  38.9k|}
_ZN6icu_7812FormatParser9setTokensERKNS_13UnicodeStringEiPi:
 2498|  1.53M|FormatParser::setTokens(const UnicodeString& pattern, int32_t startPos, int32_t *len) {
 2499|  1.53M|    int32_t curLoc = startPos;
 2500|  1.53M|    if ( curLoc >= pattern.length()) {
  ------------------
  |  Branch (2500:10): [True: 182k, False: 1.35M]
  ------------------
 2501|   182k|        return DONE;
 2502|   182k|    }
 2503|       |    // check the current char is between A-Z or a-z
 2504|  3.57M|    do {
 2505|  3.57M|        char16_t c=pattern.charAt(curLoc);
 2506|  3.57M|        if ( (c>=CAP_A && c<=CAP_Z) || (c>=LOW_A && c<=LOW_Z) ) {
  ------------------
  |  |   46|  7.15M|#define CAP_A             ((char16_t)0x0041)
  ------------------
                      if ( (c>=CAP_A && c<=CAP_Z) || (c>=LOW_A && c<=LOW_Z) ) {
  ------------------
  |  |   67|  3.35M|#define CAP_Z             ((char16_t)0x005A)
  ------------------
                      if ( (c>=CAP_A && c<=CAP_Z) || (c>=LOW_A && c<=LOW_Z) ) {
  ------------------
  |  |   69|  2.30M|#define LOW_A             ((char16_t)0x0061)
  ------------------
                      if ( (c>=CAP_A && c<=CAP_Z) || (c>=LOW_A && c<=LOW_Z) ) {
  ------------------
  |  |   94|   927k|#define LOW_Z             ((char16_t)0x007A)
  ------------------
  |  Branch (2506:15): [True: 3.35M, False: 219k]
  |  Branch (2506:27): [True: 2.42M, False: 933k]
  |  Branch (2506:41): [True: 927k, False: 225k]
  |  Branch (2506:53): [True: 405k, False: 521k]
  ------------------
 2507|  2.83M|           curLoc++;
 2508|  2.83M|        }
 2509|   747k|        else {
 2510|   747k|               startPos = curLoc;
 2511|   747k|               *len=1;
 2512|   747k|               return ADD_TOKEN;
 2513|   747k|        }
 2514|       |
 2515|  2.83M|        if ( pattern.charAt(curLoc)!= pattern.charAt(startPos) ) {
  ------------------
  |  Branch (2515:14): [True: 606k, False: 2.22M]
  ------------------
 2516|   606k|            break;  // not the same token
 2517|   606k|        }
 2518|  2.83M|    } while(curLoc <= pattern.length());
  ------------------
  |  Branch (2518:13): [True: 2.22M, False: 0]
  ------------------
 2519|   606k|    *len = curLoc-startPos;
 2520|   606k|    return ADD_TOKEN;
 2521|  1.35M|}
_ZN6icu_7812FormatParser3setERKNS_13UnicodeStringE:
 2524|   189k|FormatParser::set(const UnicodeString& pattern) {
 2525|   189k|    int32_t startPos = 0;
 2526|   189k|    TokenStatus result = START;
 2527|   189k|    int32_t len = 0;
 2528|   189k|    itemNumber = 0;
 2529|       |
 2530|  1.53M|    do {
 2531|  1.53M|        result = setTokens( pattern, startPos, &len );
 2532|  1.53M|        if ( result == ADD_TOKEN )
  ------------------
  |  Branch (2532:14): [True: 1.35M, False: 182k]
  ------------------
 2533|  1.35M|        {
 2534|  1.35M|            items[itemNumber++] = UnicodeString(pattern, startPos, len );
 2535|  1.35M|            startPos += len;
 2536|  1.35M|        }
 2537|   182k|        else {
 2538|   182k|            break;
 2539|   182k|        }
 2540|  1.53M|    } while (result==ADD_TOKEN && itemNumber < MAX_DT_TOKEN);
  ------------------
  |  |   28|  1.35M|#define MAX_DT_TOKEN        50
  ------------------
  |  Branch (2540:14): [True: 1.35M, False: 0]
  |  Branch (2540:35): [True: 1.34M, False: 7.59k]
  ------------------
 2541|   189k|}
_ZN6icu_7812FormatParser17getCanonicalIndexERKNS_13UnicodeStringEa:
 2544|  1.26M|FormatParser::getCanonicalIndex(const UnicodeString& s, UBool strict) {
 2545|  1.26M|    int32_t len = s.length();
 2546|  1.26M|    if (len == 0) {
  ------------------
  |  Branch (2546:9): [True: 0, False: 1.26M]
  ------------------
 2547|      0|        return -1;
 2548|      0|    }
 2549|  1.26M|    char16_t ch = s.charAt(0);
 2550|       |
 2551|       |    // Verify that all are the same character.
 2552|  3.17M|    for (int32_t l = 1; l < len; l++) {
  ------------------
  |  Branch (2552:25): [True: 1.91M, False: 1.26M]
  ------------------
 2553|  1.91M|        if (ch != s.charAt(l)) {
  ------------------
  |  Branch (2553:13): [True: 0, False: 1.91M]
  ------------------
 2554|      0|            return -1;
 2555|      0|        }
 2556|  1.91M|    }
 2557|  1.26M|    int32_t i = 0;
 2558|  1.26M|    int32_t bestRow = -1;
 2559|  85.1M|    while (dtTypes[i].patternChar != 0x0000) {
  ------------------
  |  Branch (2559:12): [True: 84.4M, False: 692k]
  ------------------
 2560|  84.4M|        if ( dtTypes[i].patternChar != ch ) {
  ------------------
  |  Branch (2560:14): [True: 83.8M, False: 633k]
  ------------------
 2561|  83.8M|            ++i;
 2562|  83.8M|            continue;
 2563|  83.8M|        }
 2564|   633k|        bestRow = i;
 2565|   633k|        if (dtTypes[i].patternChar != dtTypes[i+1].patternChar) {
  ------------------
  |  Branch (2565:13): [True: 368k, False: 265k]
  ------------------
 2566|   368k|            return i;
 2567|   368k|        }
 2568|   265k|        if (dtTypes[i+1].minLen <= len) {
  ------------------
  |  Branch (2568:13): [True: 64.1k, False: 201k]
  ------------------
 2569|  64.1k|            ++i;
 2570|  64.1k|            continue;
 2571|  64.1k|        }
 2572|   201k|        return i;
 2573|   265k|    }
 2574|   692k|    return strict ? -1 : bestRow;
  ------------------
  |  Branch (2574:12): [True: 692k, False: 0]
  ------------------
 2575|  1.26M|}
_ZN6icu_7812FormatParser14isQuoteLiteralERKNS_13UnicodeStringE:
 2578|  1.27M|FormatParser::isQuoteLiteral(const UnicodeString& s) {
 2579|  1.27M|    return s.charAt(0) == SINGLE_QUOTE;
  ------------------
  |  |   35|  1.27M|#define SINGLE_QUOTE      ((char16_t)0x0027)
  ------------------
 2580|  1.27M|}
_ZN6icu_7812FormatParser15getQuoteLiteralERNS_13UnicodeStringEPi:
 2585|  6.34k|FormatParser::getQuoteLiteral(UnicodeString& quote, int32_t *itemIndex) {
 2586|  6.34k|    int32_t i = *itemIndex;
 2587|       |
 2588|  6.34k|    quote.remove();
 2589|  6.34k|    if (items[i].charAt(0)==SINGLE_QUOTE) {
  ------------------
  |  |   35|  6.34k|#define SINGLE_QUOTE      ((char16_t)0x0027)
  ------------------
  |  Branch (2589:9): [True: 6.34k, False: 0]
  ------------------
 2590|  6.34k|        quote += items[i];
 2591|  6.34k|        ++i;
 2592|  6.34k|    }
 2593|  83.4k|    while ( i < itemNumber ) {
  ------------------
  |  Branch (2593:13): [True: 82.4k, False: 1.05k]
  ------------------
 2594|  82.4k|        if ( items[i].charAt(0)==SINGLE_QUOTE ) {
  ------------------
  |  |   35|  82.4k|#define SINGLE_QUOTE      ((char16_t)0x0027)
  ------------------
  |  Branch (2594:14): [True: 5.84k, False: 76.5k]
  ------------------
 2595|  5.84k|            if ( (i+1<itemNumber) && (items[i+1].charAt(0)==SINGLE_QUOTE)) {
  ------------------
  |  |   35|  4.50k|#define SINGLE_QUOTE      ((char16_t)0x0027)
  ------------------
  |  Branch (2595:18): [True: 4.50k, False: 1.34k]
  |  Branch (2595:38): [True: 559, False: 3.94k]
  ------------------
 2596|       |                // two single quotes e.g. 'o''clock'
 2597|    559|                quote += items[i++];
 2598|    559|                quote += items[i++];
 2599|    559|                continue;
 2600|    559|            }
 2601|  5.28k|            else {
 2602|  5.28k|                quote += items[i];
 2603|  5.28k|                break;
 2604|  5.28k|            }
 2605|  5.84k|        }
 2606|  76.5k|        else {
 2607|  76.5k|            quote += items[i];
 2608|  76.5k|        }
 2609|  76.5k|        ++i;
 2610|  76.5k|    }
 2611|  6.34k|    *itemIndex=i;
 2612|  6.34k|}
_ZNK6icu_7812FormatParser18isPatternSeparatorERKNS_13UnicodeStringE:
 2615|  15.0k|FormatParser::isPatternSeparator(const UnicodeString& field) const {
 2616|  18.1k|    for (int32_t i=0; i<field.length(); ++i ) {
  ------------------
  |  Branch (2616:23): [True: 15.0k, False: 3.09k]
  ------------------
 2617|  15.0k|        char16_t c= field.charAt(i);
 2618|  15.0k|        if ( (c==SINGLE_QUOTE) || (c==BACKSLASH) || (c==SPACE) || (c==COLON) ||
  ------------------
  |  |   35|  15.0k|#define SINGLE_QUOTE      ((char16_t)0x0027)
  ------------------
                      if ( (c==SINGLE_QUOTE) || (c==BACKSLASH) || (c==SPACE) || (c==COLON) ||
  ------------------
  |  |   37|  15.0k|#define BACKSLASH         ((char16_t)0x005C)
  ------------------
                      if ( (c==SINGLE_QUOTE) || (c==BACKSLASH) || (c==SPACE) || (c==COLON) ||
  ------------------
  |  |   38|  15.0k|#define SPACE             ((char16_t)0x0020)
  ------------------
                      if ( (c==SINGLE_QUOTE) || (c==BACKSLASH) || (c==SPACE) || (c==COLON) ||
  ------------------
  |  |   45|  14.0k|#define COLON             ((char16_t)0x003A)
  ------------------
  |  Branch (2618:14): [True: 0, False: 15.0k]
  |  Branch (2618:35): [True: 0, False: 15.0k]
  |  Branch (2618:53): [True: 953, False: 14.0k]
  |  Branch (2618:67): [True: 1.99k, False: 12.0k]
  ------------------
 2619|  15.0k|             (c==QUOTATION_MARK) || (c==COMMA) || (c==HYPHEN) ||(items[i].charAt(0)==DOT) ) {
  ------------------
  |  |   39|  12.0k|#define QUOTATION_MARK    ((char16_t)0x0022)
  ------------------
                           (c==QUOTATION_MARK) || (c==COMMA) || (c==HYPHEN) ||(items[i].charAt(0)==DOT) ) {
  ------------------
  |  |   42|  12.0k|#define COMMA             ((char16_t)0x002C)
  ------------------
                           (c==QUOTATION_MARK) || (c==COMMA) || (c==HYPHEN) ||(items[i].charAt(0)==DOT) ) {
  ------------------
  |  |   43|  11.9k|#define HYPHEN            ((char16_t)0x002D)
  ------------------
                           (c==QUOTATION_MARK) || (c==COMMA) || (c==HYPHEN) ||(items[i].charAt(0)==DOT) ) {
  ------------------
  |  |   44|  11.9k|#define DOT               ((char16_t)0x002E)
  ------------------
  |  Branch (2619:14): [True: 0, False: 12.0k]
  |  Branch (2619:37): [True: 154, False: 11.9k]
  |  Branch (2619:51): [True: 0, False: 11.9k]
  |  Branch (2619:65): [True: 0, False: 11.9k]
  ------------------
 2620|  3.09k|            continue;
 2621|  3.09k|        }
 2622|  11.9k|        else {
 2623|  11.9k|            return false;
 2624|  11.9k|        }
 2625|  15.0k|    }
 2626|  3.09k|    return true;
 2627|  15.0k|}
_ZN6icu_7812DistanceInfoD2Ev:
 2629|  9.06k|DistanceInfo::~DistanceInfo() {}
_ZN6icu_7812DistanceInfo5setToERKS0_:
 2632|  26.1k|DistanceInfo::setTo(const DistanceInfo& other) {
 2633|  26.1k|    missingFieldMask = other.missingFieldMask;
 2634|  26.1k|    extraFieldMask= other.extraFieldMask;
 2635|  26.1k|}
_ZN6icu_7818PatternMapIteratorC2ER10UErrorCode:
 2638|  7.02k|    bootIndex(0), nodePtr(nullptr), matcher(nullptr), patternMap(nullptr)
 2639|  7.02k|{
 2640|  7.02k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (2640:9): [True: 0, False: 7.02k]
  ------------------
 2641|  7.02k|    matcher.adoptInsteadAndCheckErrorCode(new DateTimeMatcher(), status);
 2642|  7.02k|}
_ZN6icu_7818PatternMapIteratorD2Ev:
 2644|  7.02k|PatternMapIterator::~PatternMapIterator() {
 2645|  7.02k|}
_ZN6icu_7818PatternMapIterator3setERNS_10PatternMapE:
 2648|  7.02k|PatternMapIterator::set(PatternMap& newPatternMap) {
 2649|  7.02k|    this->patternMap=&newPatternMap;
 2650|  7.02k|}
_ZNK6icu_7818PatternMapIterator7hasNextEv:
 2663|   424k|PatternMapIterator::hasNext() const {
 2664|   424k|    int32_t headIndex = bootIndex;
 2665|   424k|    PtnElem *curPtr = nodePtr;
 2666|       |
 2667|   424k|    if (patternMap==nullptr) {
  ------------------
  |  Branch (2667:9): [True: 0, False: 424k]
  ------------------
 2668|      0|        return false;
 2669|      0|    }
 2670|   757k|    while ( headIndex < MAX_PATTERN_ENTRIES ) {
  ------------------
  |  |   26|   757k|#define MAX_PATTERN_ENTRIES 52
  ------------------
  |  Branch (2670:13): [True: 751k, False: 6.15k]
  ------------------
 2671|   751k|        if ( curPtr != nullptr ) {
  ------------------
  |  Branch (2671:14): [True: 417k, False: 333k]
  ------------------
 2672|   417k|            if ( curPtr->next != nullptr ) {
  ------------------
  |  Branch (2672:18): [True: 308k, False: 109k]
  ------------------
 2673|   308k|                return true;
 2674|   308k|            }
 2675|   109k|            else {
 2676|   109k|                headIndex++;
 2677|   109k|                curPtr=nullptr;
 2678|   109k|                continue;
 2679|   109k|            }
 2680|   417k|        }
 2681|   333k|        else {
 2682|   333k|            if ( patternMap->boot[headIndex] != nullptr ) {
  ------------------
  |  Branch (2682:18): [True: 110k, False: 223k]
  ------------------
 2683|   110k|                return true;
 2684|   110k|            }
 2685|   223k|            else {
 2686|   223k|                headIndex++;
 2687|   223k|                continue;
 2688|   223k|            }
 2689|   333k|        }
 2690|   751k|    }
 2691|  6.15k|    return false;
 2692|   424k|}
_ZN6icu_7818PatternMapIterator4nextEv:
 2695|   418k|PatternMapIterator::next() {
 2696|   739k|    while ( bootIndex < MAX_PATTERN_ENTRIES ) {
  ------------------
  |  |   26|   739k|#define MAX_PATTERN_ENTRIES 52
  ------------------
  |  Branch (2696:13): [True: 739k, False: 0]
  ------------------
 2697|   739k|        if ( nodePtr != nullptr ) {
  ------------------
  |  Branch (2697:14): [True: 411k, False: 327k]
  ------------------
 2698|   411k|            if ( nodePtr->next != nullptr ) {
  ------------------
  |  Branch (2698:18): [True: 308k, False: 103k]
  ------------------
 2699|   308k|                nodePtr = nodePtr->next.getAlias();
 2700|   308k|                break;
 2701|   308k|            }
 2702|   103k|            else {
 2703|   103k|                bootIndex++;
 2704|   103k|                nodePtr=nullptr;
 2705|   103k|                continue;
 2706|   103k|            }
 2707|   411k|        }
 2708|   327k|        else {
 2709|   327k|            if ( patternMap->boot[bootIndex] != nullptr ) {
  ------------------
  |  Branch (2709:18): [True: 110k, False: 217k]
  ------------------
 2710|   110k|                nodePtr = patternMap->boot[bootIndex];
 2711|   110k|                break;
 2712|   110k|            }
 2713|   217k|            else {
 2714|   217k|                bootIndex++;
 2715|   217k|                continue;
 2716|   217k|            }
 2717|   327k|        }
 2718|   739k|    }
 2719|   418k|    if (nodePtr!=nullptr) {
  ------------------
  |  Branch (2719:9): [True: 418k, False: 0]
  ------------------
 2720|   418k|        matcher->copyFrom(*nodePtr->skeleton);
 2721|   418k|    }
 2722|      0|    else {
 2723|      0|        matcher->copyFrom();
 2724|      0|    }
 2725|   418k|    return *matcher;
 2726|   418k|}
_ZN6icu_7814SkeletonFieldsC2Ev:
 2729|  1.85M|SkeletonFields::SkeletonFields() {
 2730|       |    // Set initial values to zero
 2731|  1.85M|    clear();
 2732|  1.85M|}
_ZN6icu_7814SkeletonFields5clearEv:
 2734|  2.22M|void SkeletonFields::clear() {
 2735|  2.22M|    uprv_memset(chars, 0, sizeof(chars));
  ------------------
  |  |  100|  2.22M|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  2.22M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2736|  2.22M|    uprv_memset(lengths, 0, sizeof(lengths));
  ------------------
  |  |  100|  2.22M|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  2.22M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2737|  2.22M|}
_ZN6icu_7814SkeletonFields8copyFromERKS0_:
 2739|  2.30M|void SkeletonFields::copyFrom(const SkeletonFields& other) {
 2740|  2.30M|    uprv_memcpy(chars, other.chars, sizeof(chars));
  ------------------
  |  |   42|  2.30M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.30M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  2.30M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  2.30M|    _Pragma("clang diagnostic push") \
  |  |   45|  2.30M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  2.30M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.30M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  2.30M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.30M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  2.30M|    _Pragma("clang diagnostic pop") \
  |  |   49|  2.30M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  2.30M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  2.30M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.30M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2741|  2.30M|    uprv_memcpy(lengths, other.lengths, sizeof(lengths));
  ------------------
  |  |   42|  2.30M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.30M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  2.30M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  2.30M|    _Pragma("clang diagnostic push") \
  |  |   45|  2.30M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  2.30M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.30M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  2.30M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.30M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  2.30M|    _Pragma("clang diagnostic pop") \
  |  |   49|  2.30M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  2.30M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  2.30M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.30M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2742|  2.30M|}
_ZN6icu_7814SkeletonFields10clearFieldEi:
 2744|  90.3k|void SkeletonFields::clearField(int32_t field) {
 2745|  90.3k|    chars[field] = 0;
 2746|  90.3k|    lengths[field] = 0;
 2747|  90.3k|}
_ZNK6icu_7814SkeletonFields12getFieldCharEi:
 2749|   136k|char16_t SkeletonFields::getFieldChar(int32_t field) const {
 2750|   136k|    return chars[field];
 2751|   136k|}
_ZNK6icu_7814SkeletonFields14getFieldLengthEi:
 2753|  15.0k|int32_t SkeletonFields::getFieldLength(int32_t field) const {
 2754|  15.0k|    return lengths[field];
 2755|  15.0k|}
_ZN6icu_7814SkeletonFields8populateEiRKNS_13UnicodeStringE:
 2757|   558k|void SkeletonFields::populate(int32_t field, const UnicodeString& value) {
 2758|   558k|    populate(field, value.charAt(0), value.length());
 2759|   558k|}
_ZN6icu_7814SkeletonFields8populateEiDsi:
 2761|  1.15M|void SkeletonFields::populate(int32_t field, char16_t ch, int32_t length) {
 2762|  1.15M|    chars[field] = static_cast<int8_t>(ch);
 2763|  1.15M|    lengths[field] = static_cast<int8_t>(length);
 2764|  1.15M|}
_ZNK6icu_7814SkeletonFields12isFieldEmptyEi:
 2766|   473k|UBool SkeletonFields::isFieldEmpty(int32_t field) const {
 2767|   473k|    return lengths[field] == 0;
 2768|   473k|}
_ZNK6icu_7814SkeletonFields8appendToERNS_13UnicodeStringE:
 2770|   181k|UnicodeString& SkeletonFields::appendTo(UnicodeString& string) const {
 2771|  3.09M|    for (int32_t i = 0; i < UDATPG_FIELD_COUNT; ++i) {
  ------------------
  |  Branch (2771:25): [True: 2.91M, False: 181k]
  ------------------
 2772|  2.91M|        appendFieldTo(i, string);
 2773|  2.91M|    }
 2774|   181k|    return string;
 2775|   181k|}
_ZNK6icu_7814SkeletonFields13appendFieldToEiRNS_13UnicodeStringE:
 2777|  2.91M|UnicodeString& SkeletonFields::appendFieldTo(int32_t field, UnicodeString& string) const {
 2778|  2.91M|    char16_t ch(chars[field]);
 2779|  2.91M|    int32_t length = static_cast<int32_t>(lengths[field]);
 2780|       |
 2781|  4.28M|    for (int32_t i=0; i<length; i++) {
  ------------------
  |  Branch (2781:23): [True: 1.37M, False: 2.91M]
  ------------------
 2782|  1.37M|        string += ch;
 2783|  1.37M|    }
 2784|  2.91M|    return string;
 2785|  2.91M|}
_ZNK6icu_7814SkeletonFields12getFirstCharEv:
 2787|   171k|char16_t SkeletonFields::getFirstChar() const {
 2788|  1.20M|    for (int32_t i = 0; i < UDATPG_FIELD_COUNT; ++i) {
  ------------------
  |  Branch (2788:25): [True: 1.20M, False: 0]
  ------------------
 2789|  1.20M|        if (lengths[i] != 0) {
  ------------------
  |  Branch (2789:13): [True: 171k, False: 1.03M]
  ------------------
 2790|   171k|            return chars[i];
 2791|   171k|        }
 2792|  1.20M|    }
 2793|      0|    return '\0';
 2794|   171k|}
_ZN6icu_7811PtnSkeletonC2Ev:
 2798|   793k|    : addedDefaultDayPeriod(false) {
 2799|   793k|}
_ZN6icu_7811PtnSkeletonC2ERKS0_:
 2801|   132k|PtnSkeleton::PtnSkeleton(const PtnSkeleton& other) {
 2802|   132k|    copyFrom(other);
 2803|   132k|}
_ZN6icu_7811PtnSkeleton8copyFromERKS0_:
 2805|  1.15M|void PtnSkeleton::copyFrom(const PtnSkeleton& other) {
 2806|  1.15M|    uprv_memcpy(type, other.type, sizeof(type));
  ------------------
  |  |   42|  1.15M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.15M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  1.15M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  1.15M|    _Pragma("clang diagnostic push") \
  |  |   45|  1.15M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  1.15M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.15M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  1.15M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.15M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  1.15M|    _Pragma("clang diagnostic pop") \
  |  |   49|  1.15M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  1.15M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  1.15M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.15M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2807|  1.15M|    original.copyFrom(other.original);
 2808|  1.15M|    baseOriginal.copyFrom(other.baseOriginal);
 2809|  1.15M|    addedDefaultDayPeriod = other.addedDefaultDayPeriod;
 2810|  1.15M|}
_ZNK6icu_7811PtnSkeleton11getSkeletonEv:
 2826|  36.9k|PtnSkeleton::getSkeleton() const {
 2827|  36.9k|    UnicodeString result;
 2828|  36.9k|    result = original.appendTo(result);
 2829|  36.9k|    int32_t pos;
 2830|  36.9k|    if (addedDefaultDayPeriod && (pos = result.indexOf(LOW_A)) >= 0) {
  ------------------
  |  |   69|  1.23k|#define LOW_A             ((char16_t)0x0061)
  ------------------
  |  Branch (2830:9): [True: 1.23k, False: 35.6k]
  |  Branch (2830:34): [True: 1.23k, False: 0]
  ------------------
 2831|       |        // for backward compatibility: if DateTimeMatcher.set added a single 'a' that
 2832|       |        // was not in the provided skeleton, remove it here before returning skeleton.
 2833|  1.23k|        result.remove(pos, 1);
 2834|  1.23k|    }
 2835|  36.9k|    return result;
 2836|  36.9k|}
_ZNK6icu_7811PtnSkeleton12getFirstCharEv:
 2852|   171k|PtnSkeleton::getFirstChar() const {
 2853|   171k|    return baseOriginal.getFirstChar();
 2854|   171k|}
_ZN6icu_7811PtnSkeletonD2Ev:
 2856|   926k|PtnSkeleton::~PtnSkeleton() {
 2857|   926k|}
_ZN6icu_787PtnElemC2ERKNS_13UnicodeStringES3_:
 2860|   132k|    basePattern(basePat), skeleton(nullptr), pattern(pat), next(nullptr)
 2861|   132k|{
 2862|   132k|}
_ZN6icu_787PtnElemD2Ev:
 2864|   132k|PtnElem::~PtnElem() {
 2865|   132k|}
dtptngen.cpp:_ZN6icu_7812_GLOBAL__N_122AllowedHourFormatsSinkC2Ev:
  535|      1|    AllowedHourFormatsSink() {}
dtptngen.cpp:_ZN6icu_7812_GLOBAL__N_122AllowedHourFormatsSink3putEPKcRNS_13ResourceValueEaR10UErrorCode:
  539|      1|                     UErrorCode &errorCode) override {
  540|      1|        ResourceTable timeData = value.getTable(errorCode);
  541|      1|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (541:13): [True: 0, False: 1]
  ------------------
  542|    277|        for (int32_t i = 0; timeData.getKeyAndValue(i, key, value); ++i) {
  ------------------
  |  Branch (542:29): [True: 276, False: 1]
  ------------------
  543|    276|            const char *regionOrLocale = key;
  544|    276|            ResourceTable formatList = value.getTable(errorCode);
  545|    276|            if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (545:17): [True: 0, False: 276]
  ------------------
  546|       |            // below we construct a list[] that has an entry for the "preferred" value at [0],
  547|       |            // followed by 1 or more entries for the "allowed" values, terminated with an
  548|       |            // entry for ALLOWED_HOUR_FORMAT_UNKNOWN (not included in length below)
  549|    276|            LocalMemory<int32_t> list;
  550|    276|            int32_t length = 0;
  551|    276|            int32_t preferredFormat = ALLOWED_HOUR_FORMAT_UNKNOWN;
  552|    828|            for (int32_t j = 0; formatList.getKeyAndValue(j, key, value); ++j) {
  ------------------
  |  Branch (552:33): [True: 552, False: 276]
  ------------------
  553|    552|                if (uprv_strcmp(key, "allowed") == 0) {
  ------------------
  |  |   38|    552|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|    552|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (553:21): [True: 276, False: 276]
  ------------------
  554|    276|                    if (value.getType() == URES_STRING) {
  ------------------
  |  Branch (554:25): [True: 14, False: 262]
  ------------------
  555|     14|                        length = 2; // 1 preferred to add later, 1 allowed to add now
  556|     14|                        if (list.allocateInsteadAndReset(length + 1) == nullptr) {
  ------------------
  |  Branch (556:29): [True: 0, False: 14]
  ------------------
  557|      0|                            errorCode = U_MEMORY_ALLOCATION_ERROR;
  558|      0|                            return;
  559|      0|                        }
  560|     14|                        list[1] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode));
  561|     14|                    }
  562|    262|                    else {
  563|    262|                        ResourceArray allowedFormats = value.getArray(errorCode);
  564|    262|                        length = allowedFormats.getSize() + 1; // 1 preferred, getSize allowed
  565|    262|                        if (list.allocateInsteadAndReset(length + 1) == nullptr) {
  ------------------
  |  Branch (565:29): [True: 0, False: 262]
  ------------------
  566|      0|                            errorCode = U_MEMORY_ALLOCATION_ERROR;
  567|      0|                            return;
  568|      0|                        }
  569|  1.11k|                        for (int32_t k = 1; k < length; ++k) {
  ------------------
  |  Branch (569:45): [True: 857, False: 262]
  ------------------
  570|    857|                            allowedFormats.getValue(k-1, value);
  571|    857|                            list[k] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode));
  572|    857|                        }
  573|    262|                    }
  574|    276|                } else if (uprv_strcmp(key, "preferred") == 0) {
  ------------------
  |  |   38|    276|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|    276|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (574:28): [True: 276, False: 0]
  ------------------
  575|    276|                    preferredFormat = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode));
  576|    276|                }
  577|    552|            }
  578|    276|            if (length > 1) {
  ------------------
  |  Branch (578:17): [True: 276, False: 0]
  ------------------
  579|    276|                list[0] = (preferredFormat!=ALLOWED_HOUR_FORMAT_UNKNOWN)? preferredFormat: list[1];
  ------------------
  |  Branch (579:27): [True: 276, False: 0]
  ------------------
  580|    276|            } else {
  581|       |                // fallback handling for missing data
  582|      0|                length = 2; // 1 preferred, 1 allowed
  583|      0|                if (list.allocateInsteadAndReset(length + 1) == nullptr) {
  ------------------
  |  Branch (583:21): [True: 0, False: 0]
  ------------------
  584|      0|                    errorCode = U_MEMORY_ALLOCATION_ERROR;
  585|      0|                    return;
  586|      0|                }
  587|      0|                list[0] = (preferredFormat!=ALLOWED_HOUR_FORMAT_UNKNOWN)? preferredFormat: ALLOWED_HOUR_FORMAT_H;
  ------------------
  |  Branch (587:27): [True: 0, False: 0]
  ------------------
  588|      0|                list[1] = list[0];
  589|      0|            }
  590|    276|            list[length] = ALLOWED_HOUR_FORMAT_UNKNOWN;
  591|       |            // At this point list[] will have at least two non-ALLOWED_HOUR_FORMAT_UNKNOWN entries,
  592|       |            // followed by ALLOWED_HOUR_FORMAT_UNKNOWN.
  593|    276|            uhash_put(localeToAllowedHourFormatsMap, const_cast<char *>(regionOrLocale), list.orphan(), &errorCode);
  ------------------
  |  | 1032|    276|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|    276|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    276|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    276|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  594|    276|            if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (594:17): [True: 0, False: 276]
  ------------------
  595|    276|        }
  596|      1|    }
dtptngen.cpp:_ZN6icu_7812_GLOBAL__N_122AllowedHourFormatsSink30getHourFormatFromUnicodeStringERKNS_13UnicodeStringE:
  598|  1.14k|    AllowedHourFormat getHourFormatFromUnicodeString(const UnicodeString &s) {
  599|  1.14k|        if (s.length() == 1) {
  ------------------
  |  Branch (599:13): [True: 768, False: 379]
  ------------------
  600|    768|            if (s[0] == LOW_H) { return ALLOWED_HOUR_FORMAT_h; }
  ------------------
  |  |   76|    768|#define LOW_H             ((char16_t)0x0068)
  ------------------
  |  Branch (600:17): [True: 332, False: 436]
  ------------------
  601|    436|            if (s[0] == CAP_H) { return ALLOWED_HOUR_FORMAT_H; }
  ------------------
  |  |   53|    436|#define CAP_H             ((char16_t)0x0048)
  ------------------
  |  Branch (601:17): [True: 435, False: 1]
  ------------------
  602|      1|            if (s[0] == CAP_K) { return ALLOWED_HOUR_FORMAT_K; }
  ------------------
  |  |   55|      1|#define CAP_K             ((char16_t)0x004B)
  ------------------
  |  Branch (602:17): [True: 1, False: 0]
  ------------------
  603|      0|            if (s[0] == LOW_K) { return ALLOWED_HOUR_FORMAT_k; }
  ------------------
  |  |   79|      0|#define LOW_K             ((char16_t)0x006B)
  ------------------
  |  Branch (603:17): [True: 0, False: 0]
  ------------------
  604|    379|        } else if (s.length() == 2) {
  ------------------
  |  Branch (604:20): [True: 379, False: 0]
  ------------------
  605|    379|            if (s[0] == LOW_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_hb; }
  ------------------
  |  |   76|    758|#define LOW_H             ((char16_t)0x0068)
  ------------------
                          if (s[0] == LOW_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_hb; }
  ------------------
  |  |   70|    379|#define LOW_B             ((char16_t)0x0062)
  ------------------
  |  Branch (605:17): [True: 379, False: 0]
  |  Branch (605:34): [True: 149, False: 230]
  ------------------
  606|    230|            if (s[0] == LOW_H && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_hB; }
  ------------------
  |  |   76|    460|#define LOW_H             ((char16_t)0x0068)
  ------------------
                          if (s[0] == LOW_H && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_hB; }
  ------------------
  |  |   47|    230|#define CAP_B             ((char16_t)0x0042)
  ------------------
  |  Branch (606:17): [True: 230, False: 0]
  |  Branch (606:34): [True: 230, False: 0]
  ------------------
  607|      0|            if (s[0] == CAP_K && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Kb; }
  ------------------
  |  |   55|      0|#define CAP_K             ((char16_t)0x004B)
  ------------------
                          if (s[0] == CAP_K && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Kb; }
  ------------------
  |  |   70|      0|#define LOW_B             ((char16_t)0x0062)
  ------------------
  |  Branch (607:17): [True: 0, False: 0]
  |  Branch (607:34): [True: 0, False: 0]
  ------------------
  608|      0|            if (s[0] == CAP_K && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_KB; }
  ------------------
  |  |   55|      0|#define CAP_K             ((char16_t)0x004B)
  ------------------
                          if (s[0] == CAP_K && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_KB; }
  ------------------
  |  |   47|      0|#define CAP_B             ((char16_t)0x0042)
  ------------------
  |  Branch (608:17): [True: 0, False: 0]
  |  Branch (608:34): [True: 0, False: 0]
  ------------------
  609|      0|            if (s[0] == CAP_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Hb; }
  ------------------
  |  |   53|      0|#define CAP_H             ((char16_t)0x0048)
  ------------------
                          if (s[0] == CAP_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Hb; }
  ------------------
  |  |   70|      0|#define LOW_B             ((char16_t)0x0062)
  ------------------
  |  Branch (609:17): [True: 0, False: 0]
  |  Branch (609:34): [True: 0, False: 0]
  ------------------
  610|      0|            if (s[0] == CAP_H && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_HB; }
  ------------------
  |  |   53|      0|#define CAP_H             ((char16_t)0x0048)
  ------------------
                          if (s[0] == CAP_H && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_HB; }
  ------------------
  |  |   47|      0|#define CAP_B             ((char16_t)0x0042)
  ------------------
  |  Branch (610:17): [True: 0, False: 0]
  |  Branch (610:34): [True: 0, False: 0]
  ------------------
  611|      0|        }
  612|       |
  613|      0|        return ALLOWED_HOUR_FORMAT_UNKNOWN;
  614|  1.14k|    }
dtptngen.cpp:_ZN6icu_78L32getAllowedHourFormatsLangCountryEPKcS1_R10UErrorCode:
  643|  2.04k|static int32_t* getAllowedHourFormatsLangCountry(const char* language, const char* country, UErrorCode& status) {
  644|  2.04k|    CharString langCountry;
  645|  2.04k|    langCountry.append(language, status);
  646|  2.04k|    langCountry.append('_', status);
  647|  2.04k|    langCountry.append(country, status);
  648|       |
  649|  2.04k|    int32_t* allowedFormats;
  650|  2.04k|    allowedFormats = static_cast<int32_t*>(uhash_get(localeToAllowedHourFormatsMap, langCountry.data()));
  ------------------
  |  | 1007|  2.04k|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  651|  2.04k|    if (allowedFormats == nullptr) {
  ------------------
  |  Branch (651:9): [True: 2.04k, False: 0]
  ------------------
  652|  2.04k|        allowedFormats = static_cast<int32_t*>(uhash_get(localeToAllowedHourFormatsMap, const_cast<char*>(country)));
  ------------------
  |  | 1007|  2.04k|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|  2.04k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.04k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.04k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  653|  2.04k|    }
  654|       |
  655|  2.04k|    return allowedFormats;
  656|  2.04k|}
_ZN6icu_7824DateTimePatternGenerator21AppendItemFormatsSinkC2ERS0_:
  959|  2.04k|    AppendItemFormatsSink(DateTimePatternGenerator& _dtpg) : dtpg(_dtpg) {}
_ZN6icu_7824DateTimePatternGenerator21AppendItemFormatsSink13fillInMissingEv:
  972|  2.04k|    void fillInMissing() {
  973|  2.04k|        UnicodeString defaultItemFormat(true, UDATPG_ItemFormat, UPRV_LENGTHOF(UDATPG_ItemFormat)-1);  // Read-only alias.
  ------------------
  |  |   99|  2.04k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  974|  34.7k|        for (int32_t i = 0; i < UDATPG_FIELD_COUNT; i++) {
  ------------------
  |  Branch (974:29): [True: 32.6k, False: 2.04k]
  ------------------
  975|  32.6k|            UDateTimePatternField field = static_cast<UDateTimePatternField>(i);
  976|  32.6k|            if (dtpg.getAppendItemFormat(field).isEmpty()) {
  ------------------
  |  Branch (976:17): [True: 10.2k, False: 22.4k]
  ------------------
  977|  10.2k|                dtpg.setAppendItemFormat(field, defaultItemFormat);
  978|  10.2k|            }
  979|  32.6k|        }
  980|  2.04k|    }
_ZN6icu_7824DateTimePatternGenerator19AppendItemNamesSinkC2ERS0_:
  988|  2.04k|    AppendItemNamesSink(DateTimePatternGenerator& _dtpg) : dtpg(_dtpg) {}
_ZN6icu_7824DateTimePatternGenerator19AppendItemNamesSink13fillInMissingEv:
 1005|  2.04k|    void fillInMissing() {
 1006|  34.7k|        for (int32_t i = 0; i < UDATPG_FIELD_COUNT; i++) {
  ------------------
  |  Branch (1006:29): [True: 32.6k, False: 2.04k]
  ------------------
 1007|  32.6k|            UnicodeString& valueStr = dtpg.getMutableFieldDisplayName(static_cast<UDateTimePatternField>(i), UDATPG_WIDE);
 1008|  32.6k|            if (valueStr.isEmpty()) {
  ------------------
  |  Branch (1008:17): [True: 2.04k, False: 30.6k]
  ------------------
 1009|  2.04k|                valueStr = CAP_F;
  ------------------
  |  |   51|  2.04k|#define CAP_F             ((char16_t)0x0046)
  ------------------
 1010|  2.04k|                U_ASSERT(i < 20);
  ------------------
  |  |   35|  2.04k|#   define U_ASSERT(exp) (void)0
  ------------------
 1011|  2.04k|                if (i < 10) {
  ------------------
  |  Branch (1011:21): [True: 0, False: 2.04k]
  ------------------
 1012|       |                    // F0, F1, ..., F9
 1013|      0|                    valueStr += static_cast<char16_t>(i + 0x30);
 1014|  2.04k|                } else {
 1015|       |                    // F10, F11, ...
 1016|  2.04k|                    valueStr += static_cast<char16_t>(0x31);
 1017|  2.04k|                    valueStr += static_cast<char16_t>(i - 10 + 0x30);
 1018|  2.04k|                }
 1019|       |                // NUL-terminate for the C API.
 1020|  2.04k|                valueStr.getTerminatedBuffer();
 1021|  2.04k|            }
 1022|  98.0k|            for (int32_t j = 1; j < UDATPG_WIDTH_COUNT; j++) {
  ------------------
  |  Branch (1022:33): [True: 65.3k, False: 32.6k]
  ------------------
 1023|  65.3k|                UnicodeString& valueStr2 = dtpg.getMutableFieldDisplayName(static_cast<UDateTimePatternField>(i), static_cast<UDateTimePGDisplayWidth>(j));
 1024|  65.3k|                if (valueStr2.isEmpty()) {
  ------------------
  |  Branch (1024:21): [True: 4.08k, False: 61.2k]
  ------------------
 1025|  4.08k|                    valueStr2 = dtpg.getFieldDisplayName(static_cast<UDateTimePatternField>(i), static_cast<UDateTimePGDisplayWidth>(j - 1));
 1026|  4.08k|                }
 1027|  65.3k|            }
 1028|  32.6k|        }
 1029|  2.04k|    }
_ZN6icu_7824DateTimePatternGenerator20AvailableFormatsSinkC2ERS0_:
 1040|  2.04k|    AvailableFormatsSink(DateTimePatternGenerator& _dtpg) : dtpg(_dtpg) {}
_ZN6icu_7824DateTimePatternGenerator21AppendItemFormatsSink3putEPKcRNS_13ResourceValueEaR10UErrorCode:
  963|  44.9k|            UErrorCode &errorCode) override {
  964|  44.9k|        UDateTimePatternField field = dtpg.getAppendFormatNumber(key);
  965|  44.9k|        if (field == UDATPG_FIELD_COUNT) { return; }
  ------------------
  |  Branch (965:13): [True: 0, False: 44.9k]
  ------------------
  966|  44.9k|        const UnicodeString& valueStr = value.getUnicodeString(errorCode);
  967|  44.9k|        if (dtpg.getAppendItemFormat(field).isEmpty() && !valueStr.isEmpty()) {
  ------------------
  |  Branch (967:13): [True: 22.4k, False: 22.4k]
  |  Branch (967:58): [True: 22.4k, False: 0]
  ------------------
  968|  22.4k|            dtpg.setAppendItemFormat(field, valueStr);
  969|  22.4k|        }
  970|  44.9k|    }
_ZN6icu_7824DateTimePatternGenerator19AppendItemNamesSink3putEPKcRNS_13ResourceValueEaR10UErrorCode:
  992|   404k|            UErrorCode &errorCode) override {
  993|   404k|        UDateTimePGDisplayWidth width;
  994|   404k|        UDateTimePatternField field = dtpg.getFieldAndWidthIndices(key, &width);
  995|   404k|        if (field == UDATPG_FIELD_COUNT) { return; }
  ------------------
  |  Branch (995:13): [True: 128k, False: 275k]
  ------------------
  996|   275k|        ResourceTable detailsTable = value.getTable(errorCode);
  997|   275k|        if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (997:13): [True: 0, False: 275k]
  ------------------
  998|   275k|        if (!detailsTable.findValue("dn", value)) { return; }
  ------------------
  |  Branch (998:13): [True: 0, False: 275k]
  ------------------
  999|   275k|        const UnicodeString& valueStr = value.getUnicodeString(errorCode);
 1000|   275k|        if (U_SUCCESS(errorCode) && dtpg.getFieldDisplayName(field,width).isEmpty() && !valueStr.isEmpty()) {
  ------------------
  |  Branch (1000:13): [True: 275k, False: 0]
  |  Branch (1000:13): [True: 91.9k, False: 183k]
  |  Branch (1000:37): [True: 91.9k, False: 183k]
  |  Branch (1000:88): [True: 91.9k, False: 0]
  ------------------
 1001|  91.9k|            dtpg.setFieldDisplayName(field,width,valueStr);
 1002|  91.9k|        }
 1003|   275k|    }
_ZN6icu_7824DateTimePatternGenerator20AvailableFormatsSink3putEPKcRNS_13ResourceValueEaR10UErrorCode:
 1044|   192k|            UErrorCode &errorCode) override {
 1045|   192k|        const UnicodeString formatKey(key, -1, US_INV);
  ------------------
  |  |   98|   192k|#define US_INV icu::UnicodeString::kInvariant
  ------------------
 1046|   192k|        if (!dtpg.isAvailableFormatSet(formatKey) ) {
  ------------------
  |  Branch (1046:13): [True: 96.0k, False: 96.0k]
  ------------------
 1047|  96.0k|            dtpg.setAvailableFormat(formatKey, errorCode);
 1048|       |            // Add pattern with its associated skeleton. Override any duplicate
 1049|       |            // derived from std patterns, but not a previous availableFormats entry:
 1050|  96.0k|            const UnicodeString& formatValue = value.getUnicodeString(errorCode);
 1051|  96.0k|            conflictingPattern.remove();
 1052|  96.0k|            dtpg.addPatternWithSkeleton(formatValue, &formatKey, true, conflictingPattern, errorCode);
 1053|  96.0k|        }
 1054|   192k|    }

_ZN6icu_7812DistanceInfoC2Ev:
  218|  9.06k|    DistanceInfo() {}
_ZN6icu_7812FormatParser17getCanonicalIndexERKNS_13UnicodeStringE:
  198|  1.26M|    static int32_t getCanonicalIndex(const UnicodeString& s) { return getCanonicalIndex(s, true); }
_ZNK6icu_7814SkeletonFieldseqERKS0_:
  145|   527k|inline bool SkeletonFields::operator==(const SkeletonFields& other) const {
  146|   527k|    return (uprv_memcmp(chars, other.chars, sizeof(chars)) == 0
  ------------------
  |  |  101|   527k|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|   527k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (146:13): [True: 86.7k, False: 440k]
  ------------------
  147|   527k|        && uprv_memcmp(lengths, other.lengths, sizeof(lengths)) == 0);
  ------------------
  |  |  101|  86.7k|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|  86.7k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (147:12): [True: 38.4k, False: 48.3k]
  ------------------
  148|   527k|}
_ZN6icu_7812DistanceInfo5clearEv:
  220|   418k|    void clear() { missingFieldMask = extraFieldMask = 0; }
_ZN6icu_7812DistanceInfo8addExtraEi:
  223|   805k|    void addExtra(int32_t field) { extraFieldMask |= (1<<field); }
_ZN6icu_7812DistanceInfo10addMissingEi:
  222|  1.03M|    void addMissing(int32_t field) { missingFieldMask |= (1<<field); }

_ZN6icu_786FormatC2Ev:
   74|   127k|    : UObject()
   75|   127k|{
   76|   127k|}
_ZN6icu_786FormatD2Ev:
   81|   204k|{
   82|   204k|    delete actualLocale;
   83|   204k|    delete validLocale;
   84|   204k|}
_ZN6icu_786FormatC2ERKS0_:
   90|  77.3k|    : UObject(that)
   91|  77.3k|{
   92|  77.3k|    *this = that;
   93|  77.3k|}
_ZN6icu_786FormataSERKS0_:
  100|   154k|{
  101|   154k|    if (this != &that) {
  ------------------
  |  Branch (101:9): [True: 154k, False: 0]
  ------------------
  102|   154k|        UErrorCode status = U_ZERO_ERROR;
  103|   154k|        U_LOCALE_BASED(locBased, *this);
  ------------------
  |  |   25|   154k|  LocaleBased varname((objname).validLocale, (objname).actualLocale)
  ------------------
  104|   154k|        locBased.setLocaleIDs(that.validLocale, that.actualLocale, status);
  105|   154k|        U_ASSERT(U_SUCCESS(status));
  ------------------
  |  |   35|   154k|#   define U_ASSERT(exp) (void)0
  ------------------
  106|   154k|    }
  107|   154k|    return *this;
  108|   154k|}
_ZN6icu_786Format12setLocaleIDsEPKcS2_:
  212|  48.0k|Format::setLocaleIDs(const char* valid, const char* actual) {
  213|  48.0k|    U_LOCALE_BASED(locBased, *this);
  ------------------
  |  |   25|  48.0k|  LocaleBased varname((objname).validLocale, (objname).actualLocale)
  ------------------
  214|  48.0k|    UErrorCode status = U_ZERO_ERROR;
  215|  48.0k|    locBased.setLocaleIDs(valid, actual, status);
  216|  48.0k|    U_ASSERT(U_SUCCESS(status));
  ------------------
  |  |   35|  48.0k|#   define U_ASSERT(exp) (void)0
  ------------------
  217|  48.0k|}

_ZN6icu_7822FormattedStringBuilderC2Ev:
   37|   449k|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|   449k|}
_ZN6icu_7822FormattedStringBuilderD2Ev:
   47|   898k|FormattedStringBuilder::~FormattedStringBuilder() {
   48|   898k|    if (fUsingHeap) {
  ------------------
  |  Branch (48:9): [True: 0, False: 898k]
  ------------------
   49|      0|        uprv_free(fChars.heap.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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   50|      0|        uprv_free(fFields.heap.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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   51|      0|    }
   52|   898k|}
_ZN6icu_7822FormattedStringBuilderC2ERKS0_:
   54|   449k|FormattedStringBuilder::FormattedStringBuilder(const FormattedStringBuilder &other) {
   55|   449k|    *this = other;
   56|   449k|}
_ZN6icu_7822FormattedStringBuilderaSERKS0_:
   58|   449k|FormattedStringBuilder &FormattedStringBuilder::operator=(const FormattedStringBuilder &other) {
   59|       |    // Check for self-assignment
   60|   449k|    if (this == &other) {
  ------------------
  |  Branch (60:9): [True: 0, False: 449k]
  ------------------
   61|      0|        return *this;
   62|      0|    }
   63|       |
   64|       |    // Continue with deallocation and copying
   65|   449k|    if (fUsingHeap) {
  ------------------
  |  Branch (65:9): [True: 0, False: 449k]
  ------------------
   66|      0|        uprv_free(fChars.heap.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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   67|      0|        uprv_free(fFields.heap.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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   68|      0|        fUsingHeap = false;
   69|      0|    }
   70|       |
   71|   449k|    int32_t capacity = other.getCapacity();
   72|   449k|    if (capacity > DEFAULT_CAPACITY) {
  ------------------
  |  Branch (72:9): [True: 0, False: 449k]
  ------------------
   73|       |        // FIXME: uprv_malloc
   74|       |        // C++ note: malloc appears in two places: here and in prepareForInsertHelper.
   75|      0|        auto* newChars = static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * capacity));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   76|      0|        auto* newFields = static_cast<Field*>(uprv_malloc(sizeof(Field) * capacity));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   77|      0|        if (newChars == nullptr || newFields == nullptr) {
  ------------------
  |  Branch (77:13): [True: 0, False: 0]
  |  Branch (77:36): [True: 0, False: 0]
  ------------------
   78|       |            // UErrorCode is not available; fail silently.
   79|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   80|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   81|      0|            *this = FormattedStringBuilder();  // can't fail
   82|      0|            return *this;
   83|      0|        }
   84|       |
   85|      0|        fUsingHeap = true;
   86|      0|        fChars.heap.capacity = capacity;
   87|      0|        fChars.heap.ptr = newChars;
   88|      0|        fFields.heap.capacity = capacity;
   89|      0|        fFields.heap.ptr = newFields;
   90|      0|    }
   91|       |
   92|   449k|    uprv_memcpy2(getCharPtr(), other.getCharPtr(), sizeof(char16_t) * capacity);
   93|   449k|    uprv_memcpy2(getFieldPtr(), other.getFieldPtr(), sizeof(Field) * capacity);
   94|       |
   95|   449k|    fZero = other.fZero;
   96|   449k|    fLength = other.fLength;
   97|   449k|    return *this;
   98|   449k|}
_ZN6icu_7822FormattedStringBuilder15insertCodePointEiiNS0_5FieldER10UErrorCode:
  150|   112k|FormattedStringBuilder::insertCodePoint(int32_t index, UChar32 codePoint, Field field, UErrorCode &status) {
  151|   112k|    int32_t count = U16_LENGTH(codePoint);
  ------------------
  |  |  141|   112k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 112k, False: 0]
  |  |  ------------------
  ------------------
  152|   112k|    int32_t position = prepareForInsert(index, count, status);
  153|   112k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (153:9): [True: 0, False: 112k]
  ------------------
  154|      0|        return count;
  155|      0|    }
  156|   112k|    auto* charPtr = getCharPtr();
  157|   112k|    auto* fieldPtr = getFieldPtr();
  158|   112k|    if (count == 1) {
  ------------------
  |  Branch (158:9): [True: 112k, False: 0]
  ------------------
  159|   112k|        charPtr[position] = static_cast<char16_t>(codePoint);
  160|   112k|        fieldPtr[position] = field;
  161|   112k|    } else {
  162|      0|        charPtr[position] = U16_LEAD(codePoint);
  ------------------
  |  |  123|      0|#define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
  ------------------
  163|      0|        charPtr[position + 1] = U16_TRAIL(codePoint);
  ------------------
  |  |  132|      0|#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
  ------------------
  164|      0|        fieldPtr[position] = fieldPtr[position + 1] = field;
  165|      0|    }
  166|   112k|    return count;
  167|   112k|}
_ZN6icu_7822FormattedStringBuilder6insertEiRKNS_13UnicodeStringENS0_5FieldER10UErrorCode:
  170|   112k|                                    UErrorCode &status) {
  171|   112k|    if (unistr.length() == 0) {
  ------------------
  |  Branch (171:9): [True: 0, False: 112k]
  ------------------
  172|       |        // Nothing to insert.
  173|      0|        return 0;
  174|   112k|    } else if (unistr.length() == 1) {
  ------------------
  |  Branch (174:16): [True: 112k, False: 0]
  ------------------
  175|       |        // Fast path: insert using insertCodePoint.
  176|   112k|        return insertCodePoint(index, unistr.charAt(0), field, status);
  177|   112k|    } else {
  178|      0|        return insert(index, unistr, 0, unistr.length(), field, status);
  179|      0|    }
  180|   112k|}
_ZN6icu_7822FormattedStringBuilder16prepareForInsertEiiR10UErrorCode:
  263|   112k|int32_t FormattedStringBuilder::prepareForInsert(int32_t index, int32_t count, UErrorCode &status) {
  264|   112k|    U_ASSERT(index >= 0);
  ------------------
  |  |   35|   112k|#   define U_ASSERT(exp) (void)0
  ------------------
  265|   112k|    U_ASSERT(index <= fLength);
  ------------------
  |  |   35|   112k|#   define U_ASSERT(exp) (void)0
  ------------------
  266|   112k|    U_ASSERT(count >= 0);
  ------------------
  |  |   35|   112k|#   define U_ASSERT(exp) (void)0
  ------------------
  267|   112k|    U_ASSERT(fZero >= 0);
  ------------------
  |  |   35|   112k|#   define U_ASSERT(exp) (void)0
  ------------------
  268|   112k|    U_ASSERT(fLength >= 0);
  ------------------
  |  |   35|   112k|#   define U_ASSERT(exp) (void)0
  ------------------
  269|   112k|    U_ASSERT(getCapacity() - fZero >= fLength);
  ------------------
  |  |   35|   112k|#   define U_ASSERT(exp) (void)0
  ------------------
  270|   112k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (270:9): [True: 0, False: 112k]
  ------------------
  271|      0|        return count;
  272|      0|    }
  273|   112k|    if (index == 0 && fZero - count >= 0) {
  ------------------
  |  Branch (273:9): [True: 112k, False: 0]
  |  Branch (273:23): [True: 112k, False: 0]
  ------------------
  274|       |        // Append to start
  275|   112k|        fZero -= count;
  276|   112k|        fLength += count;
  277|   112k|        return fZero;
  278|   112k|    } else if (index == fLength && count <= getCapacity() - fZero - fLength) {
  ------------------
  |  Branch (278:16): [True: 0, False: 0]
  |  Branch (278:36): [True: 0, False: 0]
  ------------------
  279|       |        // Append to end
  280|      0|        fLength += count;
  281|      0|        return fZero + fLength - count;
  282|      0|    } else {
  283|       |        // Move chars around and/or allocate more space
  284|      0|        return prepareForInsertHelper(index, count, status);
  285|      0|    }
  286|   112k|}
formatted_string_builder.cpp:_ZN12_GLOBAL__N_112uprv_memcpy2EPvPKvm:
   18|   898k|inline void uprv_memcpy2(void* dest, const void* src, size_t len) {
   19|   898k|    if (len > 0) {
  ------------------
  |  Branch (19:9): [True: 898k, False: 0]
  ------------------
   20|   898k|        uprv_memcpy(dest, src, len);
  ------------------
  |  |   42|   898k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   898k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   898k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   898k|    _Pragma("clang diagnostic push") \
  |  |   45|   898k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   898k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   898k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   898k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   898k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   898k|    _Pragma("clang diagnostic pop") \
  |  |   49|   898k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   898k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   898k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   898k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   21|   898k|    }
   22|   898k|}

_ZN6icu_7822FormattedStringBuilder10getCharPtrEv:
  191|   561k|    inline char16_t *getCharPtr() {
  192|   561k|        return fUsingHeap ? fChars.heap.ptr : fChars.value;
  ------------------
  |  Branch (192:16): [True: 0, False: 561k]
  ------------------
  193|   561k|    }
_ZNK6icu_7822FormattedStringBuilder10getCharPtrEv:
  195|   449k|    inline const char16_t *getCharPtr() const {
  196|   449k|        return fUsingHeap ? fChars.heap.ptr : fChars.value;
  ------------------
  |  Branch (196:16): [True: 0, False: 449k]
  ------------------
  197|   449k|    }
_ZN6icu_7822FormattedStringBuilder11getFieldPtrEv:
  199|   561k|    inline Field *getFieldPtr() {
  200|   561k|        return fUsingHeap ? fFields.heap.ptr : fFields.value;
  ------------------
  |  Branch (200:16): [True: 0, False: 561k]
  ------------------
  201|   561k|    }
_ZNK6icu_7822FormattedStringBuilder11getFieldPtrEv:
  203|   449k|    inline const Field *getFieldPtr() const {
  204|   449k|        return fUsingHeap ? fFields.heap.ptr : fFields.value;
  ------------------
  |  Branch (204:16): [True: 0, False: 449k]
  ------------------
  205|   449k|    }
_ZNK6icu_7822FormattedStringBuilder11getCapacityEv:
  207|   449k|    inline int32_t getCapacity() const {
  208|   449k|        return fUsingHeap ? fChars.heap.capacity : DEFAULT_CAPACITY;
  ------------------
  |  Branch (208:16): [True: 0, False: 449k]
  ------------------
  209|   449k|    }
_ZN6icu_7822FormattedStringBuilder5FieldC2Ehh:
  227|   112k|    : bits((
  228|   112k|        U_ASSERT(category <= 0xf),
  ------------------
  |  |   35|   112k|#   define U_ASSERT(exp) (void)0
  ------------------
  229|   112k|        U_ASSERT(field <= 0xf),
  ------------------
  |  |   35|   112k|#   define U_ASSERT(exp) (void)0
  ------------------
  230|   112k|        static_cast<uint8_t>((category << 4) | field)
  231|   112k|    )) {}

_ZN6icu_7817GregorianCalendarC2ERKNS_6LocaleER10UErrorCode:
  182|      3|:   GregorianCalendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, status)
  183|      3|{
  184|      3|}
_ZN6icu_7817GregorianCalendarC2EPNS_8TimeZoneERKNS_6LocaleER10UErrorCode:
  190|      3|                                     :   Calendar(zone, aLocale, status),
  191|      3|                                     fGregorianCutover(kPapalCutover),
  192|      3|                                     fCutoverJulianDay(kCutoverJulianDay), fGregorianCutoverYear(kDefaultCutoverYear),
  193|      3|                                     fIsGregorian(true), fInvertGregorian(false)
  194|      3|{
  195|      3|    setTimeInMillis(getNow(), status);
  196|      3|}
_ZN6icu_7817GregorianCalendarD2Ev:
  248|  56.1k|{
  249|  56.1k|}
_ZN6icu_7817GregorianCalendarC2ERKS0_:
  254|  56.1k|:   Calendar(source),
  255|  56.1k|fGregorianCutover(source.fGregorianCutover),
  256|  56.1k|fCutoverJulianDay(source.fCutoverJulianDay), fGregorianCutoverYear(source.fGregorianCutoverYear),
  257|  56.1k|fIsGregorian(source.fIsGregorian), fInvertGregorian(source.fInvertGregorian)
  258|  56.1k|{
  259|  56.1k|}
_ZNK6icu_7817GregorianCalendar5cloneEv:
  264|  56.1k|{
  265|  56.1k|    return new GregorianCalendar(*this);
  266|  56.1k|}
_ZN6icu_7817GregorianCalendar19handleComputeFieldsEiR10UErrorCode:
  341|      4|void GregorianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) {
  342|      4|    int32_t eyear, month, dayOfMonth, dayOfYear, unusedRemainder;
  343|       |
  344|      4|    if(U_FAILURE(status)) {
  ------------------
  |  Branch (344:8): [True: 0, False: 4]
  ------------------
  345|      0|        return;
  346|      0|    }
  347|       |
  348|       |#if defined (U_DEBUG_CAL)
  349|       |    fprintf(stderr, "%s:%d: jd%d- (greg's %d)- [cut=%d]\n", 
  350|       |        __FILE__, __LINE__, julianDay, getGregorianDayOfYear(), fCutoverJulianDay);
  351|       |#endif
  352|       |
  353|      4|    if (julianDay >= fCutoverJulianDay) {
  ------------------
  |  Branch (353:9): [True: 4, False: 0]
  ------------------
  354|      4|        month = getGregorianMonth();
  355|      4|        dayOfMonth = getGregorianDayOfMonth();
  356|      4|        dayOfYear = getGregorianDayOfYear();
  357|      4|        eyear = getGregorianYear();
  358|      4|    } else {
  359|       |        // The Julian epoch day (not the same as Julian Day)
  360|       |        // is zero on Saturday December 30, 0 (Gregorian).
  361|      0|        int32_t julianEpochDay = julianDay - (kJan1_1JulianDay - 2);
  ------------------
  |  |  125|      0|#define kJan1_1JulianDay  1721426 // January 1, year 1 (Gregorian)
  ------------------
  362|      0|		eyear = static_cast<int32_t>(ClockMath::floorDivide((4.0 * julianEpochDay) + 1464.0, static_cast<int32_t>(1461), &unusedRemainder));
  363|       |
  364|       |        // Compute the Julian calendar day number for January 1, eyear
  365|      0|        int32_t january1 = 365 * (eyear - 1) + ClockMath::floorDivide(eyear - 1, static_cast<int32_t>(4));
  366|      0|        dayOfYear = (julianEpochDay - january1); // 0-based
  367|       |
  368|       |        // Julian leap years occurred historically every 4 years starting
  369|       |        // with 8 AD.  Before 8 AD the spacing is irregular; every 3 years
  370|       |        // from 45 BC to 9 BC, and then none until 8 AD.  However, we don't
  371|       |        // implement this historical detail; instead, we implement the
  372|       |        // computationally cleaner proleptic calendar, which assumes
  373|       |        // consistent 4-year cycles throughout time.
  374|      0|        UBool isLeap = ((eyear&0x3) == 0); // equiv. to (eyear%4 == 0)
  375|       |
  376|       |        // Common Julian/Gregorian calculation
  377|      0|        int32_t correction = 0;
  378|      0|        int32_t march1 = isLeap ? 60 : 59; // zero-based DOY for March 1
  ------------------
  |  Branch (378:26): [True: 0, False: 0]
  ------------------
  379|      0|        if (dayOfYear >= march1) {
  ------------------
  |  Branch (379:13): [True: 0, False: 0]
  ------------------
  380|      0|            correction = isLeap ? 1 : 2;
  ------------------
  |  Branch (380:26): [True: 0, False: 0]
  ------------------
  381|      0|        }
  382|      0|        month = (12 * (dayOfYear + correction) + 6) / 367; // zero-based month
  383|      0|        dayOfMonth = dayOfYear - (isLeap?kLeapNumDays[month]:kNumDays[month]) + 1; // one-based DOM
  ------------------
  |  Branch (383:35): [True: 0, False: 0]
  ------------------
  384|      0|        ++dayOfYear;
  385|       |#if defined (U_DEBUG_CAL)
  386|       |        //     fprintf(stderr, "%d - %d[%d] + 1\n", dayOfYear, isLeap?kLeapNumDays[month]:kNumDays[month], month );
  387|       |        //           fprintf(stderr, "%s:%d:  greg's HCF %d -> %d/%d/%d not %d/%d/%d\n", 
  388|       |        //                   __FILE__, __LINE__,julianDay,
  389|       |        //          eyear,month,dayOfMonth,
  390|       |        //          getGregorianYear(), getGregorianMonth(), getGregorianDayOfMonth()  );
  391|       |        fprintf(stderr, "%s:%d: doy %d (greg's %d)- [cut=%d]\n", 
  392|       |            __FILE__, __LINE__, dayOfYear, getGregorianDayOfYear(), fCutoverJulianDay);
  393|       |#endif
  394|       |
  395|      0|    }
  396|       |
  397|       |    // [j81] if we are after the cutover in its year, shift the day of the year
  398|      4|    if((eyear == fGregorianCutoverYear) && (julianDay >= fCutoverJulianDay)) {
  ------------------
  |  Branch (398:8): [True: 0, False: 4]
  |  Branch (398:44): [True: 0, False: 0]
  ------------------
  399|       |        //from handleComputeMonthStart
  400|      0|        int32_t gregShift = Grego::gregorianShift(eyear);
  401|       |#if defined (U_DEBUG_CAL)
  402|       |        fprintf(stderr, "%s:%d:  gregorian shift %d :::  doy%d => %d [cut=%d]\n",
  403|       |            __FILE__, __LINE__,gregShift, dayOfYear, dayOfYear+gregShift, fCutoverJulianDay);
  404|       |#endif
  405|      0|        dayOfYear += gregShift;
  406|      0|    }
  407|       |
  408|      4|    internalSet(UCAL_MONTH, month);
  409|      4|    internalSet(UCAL_ORDINAL_MONTH, month);
  410|      4|    internalSet(UCAL_DAY_OF_MONTH, dayOfMonth);
  411|      4|    internalSet(UCAL_DAY_OF_YEAR, dayOfYear);
  412|      4|    internalSet(UCAL_EXTENDED_YEAR, eyear);
  413|      4|    int32_t era = AD;
  414|      4|    if (eyear < 1) {
  ------------------
  |  Branch (414:9): [True: 0, False: 4]
  ------------------
  415|      0|        era = BC;
  416|      0|        eyear = 1 - eyear;
  417|      0|    }
  418|      4|    internalSet(UCAL_ERA, era);
  419|      4|    internalSet(UCAL_YEAR, eyear);
  420|      4|}
_ZNK6icu_7817GregorianCalendar10isLeapYearEi:
  435|      5|{
  436|       |    // MSVC complains bitterly if we try to use Grego::isLeapYear here
  437|       |    // NOTE: year&0x3 == year%4
  438|      5|    return (year >= fGregorianCutoverYear ?
  ------------------
  |  Branch (438:13): [True: 5, False: 0]
  ------------------
  439|      5|        (((year&0x3) == 0) && ((year%100 != 0) || (year%400 == 0))) : // Gregorian
  ------------------
  |  Branch (439:10): [True: 0, False: 5]
  |  Branch (439:32): [True: 0, False: 0]
  |  Branch (439:51): [True: 0, False: 0]
  ------------------
  440|      5|    ((year&0x3) == 0)); // Julian
  441|      5|}
_ZN6icu_7817GregorianCalendar22handleComputeJulianDayE19UCalendarDateFieldsR10UErrorCode:
  446|      2|{
  447|      2|    fInvertGregorian = false;
  448|       |
  449|      2|    int32_t jd = Calendar::handleComputeJulianDay(bestField, status);
  450|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (450:9): [True: 0, False: 2]
  ------------------
  451|      0|        return 0;
  452|      0|    }
  453|       |
  454|      2|    if((bestField == UCAL_WEEK_OF_YEAR) &&  // if we are doing WOY calculations, we are counting relative to Jan 1 *julian*
  ------------------
  |  Branch (454:8): [True: 0, False: 2]
  ------------------
  455|      2|        (internalGet(UCAL_EXTENDED_YEAR)==fGregorianCutoverYear) && 
  ------------------
  |  Branch (455:9): [True: 0, False: 0]
  ------------------
  456|      2|        jd >= fCutoverJulianDay) { 
  ------------------
  |  Branch (456:9): [True: 0, False: 0]
  ------------------
  457|      0|            fInvertGregorian = true;  // So that the Julian Jan 1 will be used in handleComputeMonthStart
  458|      0|            return Calendar::handleComputeJulianDay(bestField, status);
  459|      0|        }
  460|       |
  461|       |
  462|       |        // The following check handles portions of the cutover year BEFORE the
  463|       |        // cutover itself happens.
  464|       |        //if ((fIsGregorian==true) != (jd >= fCutoverJulianDay)) {  /*  cutoverJulianDay)) { */
  465|      2|        if ((fIsGregorian) != (jd >= fCutoverJulianDay)) {  /*  cutoverJulianDay)) { */
  ------------------
  |  Branch (465:13): [True: 0, False: 2]
  ------------------
  466|       |#if defined (U_DEBUG_CAL)
  467|       |            fprintf(stderr, "%s:%d: jd [invert] %d\n", 
  468|       |                __FILE__, __LINE__, jd);
  469|       |#endif
  470|      0|            fInvertGregorian = true;
  471|      0|            jd = Calendar::handleComputeJulianDay(bestField, status);
  472|      0|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (472:17): [True: 0, False: 0]
  ------------------
  473|      0|                return 0;
  474|      0|            }
  475|       |#if defined (U_DEBUG_CAL)
  476|       |            fprintf(stderr, "%s:%d:  fIsGregorian %s, fInvertGregorian %s - ", 
  477|       |                __FILE__, __LINE__,fIsGregorian?"T":"F", fInvertGregorian?"T":"F");
  478|       |            fprintf(stderr, " jd NOW %d\n", 
  479|       |                jd);
  480|       |#endif
  481|      2|        } else {
  482|       |#if defined (U_DEBUG_CAL)
  483|       |            fprintf(stderr, "%s:%d: jd [==] %d - %sfIsGregorian %sfInvertGregorian, %d\n", 
  484|       |                __FILE__, __LINE__, jd, fIsGregorian?"T":"F", fInvertGregorian?"T":"F", bestField);
  485|       |#endif
  486|      2|        }
  487|       |
  488|      2|        if(fIsGregorian && (internalGet(UCAL_EXTENDED_YEAR) == fGregorianCutoverYear)) {
  ------------------
  |  Branch (488:12): [True: 2, False: 0]
  |  Branch (488:28): [True: 0, False: 2]
  ------------------
  489|      0|            int32_t gregShift = Grego::gregorianShift(internalGet(UCAL_EXTENDED_YEAR));
  490|      0|            if (bestField == UCAL_DAY_OF_YEAR) {
  ------------------
  |  Branch (490:17): [True: 0, False: 0]
  ------------------
  491|       |#if defined (U_DEBUG_CAL)
  492|       |                fprintf(stderr, "%s:%d: [DOY%d] gregorian shift of JD %d += %d\n", 
  493|       |                    __FILE__, __LINE__, fFields[bestField],jd, gregShift);
  494|       |#endif
  495|      0|                jd -= gregShift;
  496|      0|            } else if ( bestField == UCAL_WEEK_OF_MONTH ) {
  ------------------
  |  Branch (496:25): [True: 0, False: 0]
  ------------------
  497|      0|                int32_t weekShift = 14;
  498|       |#if defined (U_DEBUG_CAL)
  499|       |                fprintf(stderr, "%s:%d: [WOY/WOM] gregorian week shift of %d += %d\n", 
  500|       |                    __FILE__, __LINE__, jd, weekShift);
  501|       |#endif
  502|      0|                jd += weekShift; // shift by weeks for week based fields.
  503|      0|            }
  504|      0|        }
  505|       |
  506|      2|        return jd;
  507|      2|}
_ZNK6icu_7817GregorianCalendar23handleComputeMonthStartEiiaR10UErrorCode:
  512|      2|{
  513|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (513:9): [True: 0, False: 2]
  ------------------
  514|      0|        return 0;
  515|      0|    }
  516|      2|    GregorianCalendar* nonConstThis = const_cast<GregorianCalendar*>(this); // cast away const
  517|       |
  518|       |    // If the month is out of range, adjust it into range, and
  519|       |    // modify the extended year value accordingly.
  520|      2|    if (month < 0 || month > 11) {
  ------------------
  |  Branch (520:9): [True: 0, False: 2]
  |  Branch (520:22): [True: 0, False: 2]
  ------------------
  521|      0|        if (uprv_add32_overflow(ClockMath::floorDivide(month, 12, &month),
  ------------------
  |  | 1394|      0|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  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 (521:13): [True: 0, False: 0]
  ------------------
  522|      0|                                eyear, &eyear)) {
  523|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  524|      0|            return 0;
  525|      0|        }
  526|      0|    }
  527|       |
  528|      2|    UBool isLeap = eyear%4 == 0;
  529|      2|    int64_t y = static_cast<int64_t>(eyear) - 1;
  530|      2|    int64_t julianDay = 365LL * y +
  531|      2|        ClockMath::floorDivideInt64(y, 4LL) + kJan1_1JulianDay - 3LL;
  ------------------
  |  |  125|      2|#define kJan1_1JulianDay  1721426 // January 1, year 1 (Gregorian)
  ------------------
  532|       |
  533|      2|    nonConstThis->fIsGregorian = (eyear >= fGregorianCutoverYear);
  534|       |#if defined (U_DEBUG_CAL)
  535|       |    fprintf(stderr, "%s:%d: (hcms%d/%d) fIsGregorian %s, fInvertGregorian %s\n", 
  536|       |        __FILE__, __LINE__, eyear,month, fIsGregorian?"T":"F", fInvertGregorian?"T":"F");
  537|       |#endif
  538|      2|    if (fInvertGregorian) {
  ------------------
  |  Branch (538:9): [True: 0, False: 2]
  ------------------
  539|      0|        nonConstThis->fIsGregorian = !fIsGregorian;
  540|      0|    }
  541|      2|    if (fIsGregorian) {
  ------------------
  |  Branch (541:9): [True: 2, False: 0]
  ------------------
  542|      2|        isLeap = isLeap && ((eyear%100 != 0) || (eyear%400 == 0));
  ------------------
  |  Branch (542:18): [True: 0, False: 2]
  |  Branch (542:29): [True: 0, False: 0]
  |  Branch (542:49): [True: 0, False: 0]
  ------------------
  543|       |        // Add 2 because Gregorian calendar starts 2 days after
  544|       |        // Julian calendar
  545|      2|        int32_t gregShift = Grego::gregorianShift(eyear);
  546|       |#if defined (U_DEBUG_CAL)
  547|       |        fprintf(stderr, "%s:%d: (hcms%d/%d) gregorian shift of %d += %d\n", 
  548|       |            __FILE__, __LINE__, eyear, month, julianDay, gregShift);
  549|       |#endif
  550|      2|        julianDay += gregShift;
  551|      2|    }
  552|       |
  553|       |    // At this point julianDay indicates the day BEFORE the first
  554|       |    // day of January 1, <eyear> of either the Julian or Gregorian
  555|       |    // calendar.
  556|       |
  557|      2|    if (month != 0) {
  ------------------
  |  Branch (557:9): [True: 2, False: 0]
  ------------------
  558|      2|        julianDay += isLeap?kLeapNumDays[month]:kNumDays[month];
  ------------------
  |  Branch (558:22): [True: 0, False: 2]
  ------------------
  559|      2|    }
  560|       |
  561|      2|    return julianDay;
  562|      2|}
_ZNK6icu_7817GregorianCalendar20handleGetMonthLengthEiiR10UErrorCode:
  565|      1|{
  566|       |    // If the month is out of range, adjust it into range, and
  567|       |    // modify the extended year value accordingly.
  568|      1|    if (month < 0 || month > 11) {
  ------------------
  |  Branch (568:9): [True: 0, False: 1]
  |  Branch (568:22): [True: 0, False: 1]
  ------------------
  569|      0|        extendedYear += ClockMath::floorDivide(month, 12, &month);
  570|      0|    }
  571|       |
  572|      1|    return isLeapYear(extendedYear) ? kLeapMonthLength[month] : kMonthLength[month];
  ------------------
  |  Branch (572:12): [True: 0, False: 1]
  ------------------
  573|      1|}
_ZNK6icu_7817GregorianCalendar19handleGetYearLengthEiR10UErrorCode:
  575|      4|int32_t GregorianCalendar::handleGetYearLength(int32_t eyear, UErrorCode& status) const {
  576|      4|    if (U_FAILURE(status)) return 0;
  ------------------
  |  Branch (576:9): [True: 0, False: 4]
  ------------------
  577|      4|    return isLeapYear(eyear) ? 366 : 365;
  ------------------
  |  Branch (577:12): [True: 0, False: 4]
  ------------------
  578|      4|}
_ZNK6icu_7817GregorianCalendar16getActualMinimumE19UCalendarDateFieldsR10UErrorCode:
 1048|      1|{
 1049|      1|    return getMinimum(field);
 1050|      1|}
_ZNK6icu_7817GregorianCalendar14handleGetLimitE19UCalendarDateFieldsNS_8Calendar10ELimitTypeE:
 1062|      2|int32_t GregorianCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const {
 1063|      2|    return kGregorianCalendarLimits[field][limitType];
 1064|      2|}
_ZNK6icu_7817GregorianCalendar16getActualMaximumE19UCalendarDateFieldsR10UErrorCode:
 1074|      1|{
 1075|       |    /* It is a known limitation that the code here (and in getActualMinimum)
 1076|       |    * won't behave properly at the extreme limits of GregorianCalendar's
 1077|       |    * representable range (except for the code that handles the YEAR
 1078|       |    * field).  That's because the ends of the representable range are at
 1079|       |    * odd spots in the year.  For calendars with the default Gregorian
 1080|       |    * cutover, these limits are Sun Dec 02 16:47:04 GMT 292269055 BC to Sun
 1081|       |    * Aug 17 07:12:55 GMT 292278994 AD, somewhat different for non-GMT
 1082|       |    * zones.  As a result, if the calendar is set to Aug 1 292278994 AD,
 1083|       |    * the actual maximum of DAY_OF_MONTH is 17, not 30.  If the date is Mar
 1084|       |    * 31 in that year, the actual maximum month might be Jul, whereas is
 1085|       |    * the date is Mar 15, the actual maximum might be Aug -- depending on
 1086|       |    * the precise semantics that are desired.  Similar considerations
 1087|       |    * affect all fields.  Nonetheless, this effect is sufficiently arcane
 1088|       |    * that we permit it, rather than complicating the code to handle such
 1089|       |    * intricacies. - liu 8/20/98
 1090|       |
 1091|       |    * UPDATE: No longer true, since we have pulled in the limit values on
 1092|       |    * the year. - Liu 11/6/00 */
 1093|       |
 1094|      1|    switch (field) {
 1095|       |
 1096|      0|    case UCAL_YEAR:
  ------------------
  |  Branch (1096:5): [True: 0, False: 1]
  ------------------
 1097|       |        /* The year computation is no different, in principle, from the
 1098|       |        * others, however, the range of possible maxima is large.  In
 1099|       |        * addition, the way we know we've exceeded the range is different.
 1100|       |        * For these reasons, we use the special case code below to handle
 1101|       |        * this field.
 1102|       |        *
 1103|       |        * The actual maxima for YEAR depend on the type of calendar:
 1104|       |        *
 1105|       |        *     Gregorian = May 17, 292275056 BC - Aug 17, 292278994 AD
 1106|       |        *     Julian    = Dec  2, 292269055 BC - Jan  3, 292272993 AD
 1107|       |        *     Hybrid    = Dec  2, 292269055 BC - Aug 17, 292278994 AD
 1108|       |        *
 1109|       |        * We know we've exceeded the maximum when either the month, date,
 1110|       |        * time, or era changes in response to setting the year.  We don't
 1111|       |        * check for month, date, and time here because the year and era are
 1112|       |        * sufficient to detect an invalid year setting.  NOTE: If code is
 1113|       |        * added to check the month and date in the future for some reason,
 1114|       |        * Feb 29 must be allowed to shift to Mar 1 when setting the year.
 1115|       |        */
 1116|      0|        {
 1117|      0|            if(U_FAILURE(status)) return 0;
  ------------------
  |  Branch (1117:16): [True: 0, False: 0]
  ------------------
 1118|      0|            Calendar *cal = clone();
 1119|      0|            if(!cal) {
  ------------------
  |  Branch (1119:16): [True: 0, False: 0]
  ------------------
 1120|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 1121|      0|                return 0;
 1122|      0|            }
 1123|       |
 1124|      0|            cal->setLenient(true);
 1125|       |
 1126|      0|            int32_t era = cal->get(UCAL_ERA, status);
 1127|      0|            UDate d = cal->getTime(status);
 1128|       |
 1129|       |            /* Perform a binary search, with the invariant that lowGood is a
 1130|       |            * valid year, and highBad is an out of range year.
 1131|       |            */
 1132|      0|            int32_t lowGood = kGregorianCalendarLimits[UCAL_YEAR][1];
 1133|      0|            int32_t highBad = kGregorianCalendarLimits[UCAL_YEAR][2]+1;
 1134|      0|            while ((lowGood + 1) < highBad) {
  ------------------
  |  Branch (1134:20): [True: 0, False: 0]
  ------------------
 1135|      0|                int32_t y = (lowGood + highBad) / 2;
 1136|      0|                cal->set(UCAL_YEAR, y);
 1137|      0|                if (cal->get(UCAL_YEAR, status) == y && cal->get(UCAL_ERA, status) == era) {
  ------------------
  |  Branch (1137:21): [True: 0, False: 0]
  |  Branch (1137:57): [True: 0, False: 0]
  ------------------
 1138|      0|                    lowGood = y;
 1139|      0|                } else {
 1140|      0|                    highBad = y;
 1141|      0|                    cal->setTime(d, status); // Restore original fields
 1142|      0|                }
 1143|      0|            }
 1144|       |
 1145|      0|            delete cal;
 1146|      0|            return lowGood;
 1147|      0|        }
 1148|       |
 1149|      1|    default:
  ------------------
  |  Branch (1149:5): [True: 1, False: 0]
  ------------------
 1150|      1|        return Calendar::getActualMaximum(field,status);
 1151|      1|    }
 1152|      1|}
_ZN6icu_7817GregorianCalendar21handleGetExtendedYearER10UErrorCode:
 1155|      2|int32_t GregorianCalendar::handleGetExtendedYear(UErrorCode& status) {
 1156|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1156:9): [True: 0, False: 2]
  ------------------
 1157|      0|        return 0;
 1158|      0|    }
 1159|       |    // the year to return
 1160|      2|    int32_t year = kEpochYear;
  ------------------
  |  |  129|      2|#define kEpochYear              1970
  ------------------
 1161|       |
 1162|       |    // year field to use
 1163|       |    // There are three separate fields which could be used to
 1164|       |    // derive the proper year.  Use the one most recently set.
 1165|      2|    UCalendarDateFields yearField = newerField(
 1166|      2|        newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR), UCAL_YEAR_WOY);
 1167|       |
 1168|       |    // based on the "best" year field, get the year
 1169|      2|    switch(yearField) {
 1170|      0|    case UCAL_EXTENDED_YEAR:
  ------------------
  |  Branch (1170:5): [True: 0, False: 2]
  ------------------
 1171|      0|        year = internalGet(UCAL_EXTENDED_YEAR, kEpochYear);
  ------------------
  |  |  129|      0|#define kEpochYear              1970
  ------------------
 1172|      0|        break;
 1173|       |
 1174|      2|    case UCAL_YEAR:
  ------------------
  |  Branch (1174:5): [True: 2, False: 0]
  ------------------
 1175|      2|        {
 1176|       |            // The year defaults to the epoch start, the era to AD
 1177|      2|            int32_t era = internalGet(UCAL_ERA, AD);
 1178|      2|            if (era == BC) {
  ------------------
  |  Branch (1178:17): [True: 0, False: 2]
  ------------------
 1179|      0|                year = 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year
 1180|      2|            } else if (era == AD) {
  ------------------
  |  Branch (1180:24): [True: 2, False: 0]
  ------------------
 1181|      2|                year = internalGet(UCAL_YEAR, kEpochYear);
  ------------------
  |  |  129|      2|#define kEpochYear              1970
  ------------------
 1182|      2|            } else {
 1183|      0|                status = U_ILLEGAL_ARGUMENT_ERROR;
 1184|      0|                return 0;
 1185|      0|            }
 1186|      2|        }
 1187|      2|        break;
 1188|       |
 1189|      2|    case UCAL_YEAR_WOY:
  ------------------
  |  Branch (1189:5): [True: 0, False: 2]
  ------------------
 1190|      0|        year = handleGetExtendedYearFromWeekFields(
 1191|      0|            internalGet(UCAL_YEAR_WOY), internalGet(UCAL_WEEK_OF_YEAR), status);
 1192|      0|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1192:13): [True: 0, False: 0]
  ------------------
 1193|      0|            return 0;
 1194|      0|        }
 1195|       |#if defined (U_DEBUG_CAL)
 1196|       |        //    if(internalGet(UCAL_YEAR_WOY) != year) {
 1197|       |        fprintf(stderr, "%s:%d: hGEYFWF[%d,%d] ->  %d\n", 
 1198|       |            __FILE__, __LINE__,internalGet(UCAL_YEAR_WOY),internalGet(UCAL_WEEK_OF_YEAR),year);
 1199|       |        //}
 1200|       |#endif
 1201|      0|        break;
 1202|       |
 1203|      0|    default:
  ------------------
  |  Branch (1203:5): [True: 0, False: 2]
  ------------------
 1204|      0|        year = kEpochYear;
  ------------------
  |  |  129|      0|#define kEpochYear              1970
  ------------------
 1205|      2|    }
 1206|      2|    return year;
 1207|      2|}
_ZNK6icu_7817GregorianCalendar7getTypeEv:
 1235|  21.3k|GregorianCalendar::getType() const {
 1236|       |    //static const char kGregorianType = "gregorian";
 1237|       |
 1238|  21.3k|    return "gregorian";
 1239|  21.3k|}

_ZN6icu_789ClockMath11floorDivideEii:
   25|     16|int32_t ClockMath::floorDivide(int32_t numerator, int32_t denominator) {
   26|     16|    return (numerator >= 0) ?
  ------------------
  |  Branch (26:12): [True: 16, False: 0]
  ------------------
   27|     16|        numerator / denominator : ((numerator + 1) / denominator) - 1;
   28|     16|}
_ZN6icu_789ClockMath16floorDivideInt64Ell:
   30|      6|int64_t ClockMath::floorDivideInt64(int64_t numerator, int64_t denominator) {
   31|      6|    return (numerator >= 0) ?
  ------------------
  |  Branch (31:12): [True: 6, False: 0]
  ------------------
   32|      6|        numerator / denominator : ((numerator + 1) / denominator) - 1;
   33|      6|}
_ZN6icu_789ClockMath11floorDivideEiiPi:
   36|     16|                          int32_t* remainder) {
   37|     16|    int64_t quotient = floorDivide(numerator, denominator);
   38|     16|    if (remainder != nullptr) {
  ------------------
  |  Branch (38:9): [True: 16, False: 0]
  ------------------
   39|     16|      *remainder = numerator - (quotient * denominator);
   40|     16|    }
   41|     16|    return quotient;
   42|     16|}
_ZN6icu_789ClockMath11floorDivideEdiPi:
   45|      4|                          int32_t* remainder) {
   46|       |    // For an integer n and representable ⌊x/n⌋, ⌊RN(x/n)⌋=⌊x/n⌋, where RN is
   47|       |    // rounding to nearest.
   48|      4|    double quotient = uprv_floor(numerator / denominator);
  ------------------
  |  | 1499|      4|#define uprv_floor U_ICU_ENTRY_POINT_RENAME(uprv_floor)
  |  |  ------------------
  |  |  |  |  123|      4|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      4|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      4|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   49|      4|    if (remainder != nullptr) {
  ------------------
  |  Branch (49:9): [True: 4, False: 0]
  ------------------
   50|       |      // For doubles x and n, where n is an integer and ⌊x+n⌋ < 2³¹, the
   51|       |      // expression `(int32_t) (x + n)` evaluated with rounding to nearest
   52|       |      // differs from ⌊x+n⌋ if 0 < ⌈x⌉−x ≪ x+n, as `x + n` is rounded up to
   53|       |      // n+⌈x⌉ = ⌊x+n⌋ + 1.  Rewriting it as ⌊x⌋+n makes the addition exact.
   54|      4|      *remainder = static_cast<int32_t>(uprv_floor(numerator) - (quotient * denominator));
  ------------------
  |  | 1499|      4|#define uprv_floor U_ICU_ENTRY_POINT_RENAME(uprv_floor)
  |  |  ------------------
  |  |  |  |  123|      4|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      4|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      4|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   55|      4|    }
   56|      4|    return quotient;
   57|      4|}
_ZN6icu_785Grego11dayToFieldsEiRiRaS2_S2_RsR10UErrorCode:
  121|      4|                        int8_t& dom, int8_t& dow, int16_t& doy, UErrorCode& status) {
  122|      4|    year = dayToYear(day, doy, status); // one-based doy
  123|      4|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (123:9): [True: 0, False: 4]
  ------------------
  124|       |
  125|       |    // Convert from 1970 CE epoch to 1 CE epoch (Gregorian calendar)
  126|      4|    if (uprv_add32_overflow(day, JULIAN_1970_CE - JULIAN_1_CE, &day)) {
  ------------------
  |  | 1394|      4|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|      4|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      4|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      4|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (126:9): [True: 0, False: 4]
  ------------------
  127|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  128|      0|        return;
  129|      0|    }
  130|       |
  131|       |    // Gregorian day zero is a Monday.
  132|      4|    dow = (day + 1) % 7;
  133|      4|    dow += (dow < 0) ? (UCAL_SUNDAY + 7) : UCAL_SUNDAY;
  ------------------
  |  Branch (133:12): [True: 0, False: 4]
  ------------------
  134|       |
  135|       |    // Common Julian/Gregorian calculation
  136|      4|    int32_t correction = 0;
  137|      4|    bool isLeap = isLeapYear(year);
  138|      4|    int32_t march1 = isLeap ? 60 : 59; // zero-based DOY for March 1
  ------------------
  |  Branch (138:22): [True: 0, False: 4]
  ------------------
  139|      4|    if (doy > march1) {
  ------------------
  |  Branch (139:9): [True: 4, False: 0]
  ------------------
  140|      4|        correction = isLeap ? 1 : 2;
  ------------------
  |  Branch (140:22): [True: 0, False: 4]
  ------------------
  141|      4|    }
  142|      4|    month = (12 * (doy - 1 + correction) + 6) / 367; // zero-based month
  143|      4|    dom = doy - DAYS_BEFORE[month + (isLeap ? 12 : 0)]; // one-based DOM
  ------------------
  |  Branch (143:38): [True: 0, False: 4]
  ------------------
  144|      4|}
_ZN6icu_785Grego9dayToYearEiRsR10UErrorCode:
  151|      4|int32_t Grego::dayToYear(int32_t day, int16_t& doy, UErrorCode& status) {
  152|      4|    if (U_FAILURE(status)) return 0;
  ------------------
  |  Branch (152:9): [True: 0, False: 4]
  ------------------
  153|       |    // Convert from 1970 CE epoch to 1 CE epoch (Gregorian calendar)
  154|      4|    if (uprv_add32_overflow(day, JULIAN_1970_CE - JULIAN_1_CE, &day)) {
  ------------------
  |  | 1394|      4|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|      4|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      4|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      4|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (154:9): [True: 0, False: 4]
  ------------------
  155|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  156|      0|        return 0;
  157|      0|    }
  158|       |
  159|       |    // Convert from the day number to the multiple radix
  160|       |    // representation.  We use 400-year, 100-year, and 4-year cycles.
  161|       |    // For example, the 4-year cycle has 4 years + 1 leap day; giving
  162|       |    // 1461 == 365*4 + 1 days.
  163|      4|    int32_t doy32;
  164|      4|    int32_t n400 = ClockMath::floorDivide(day, 146097, &doy32); // 400-year cycle length
  165|      4|    int32_t n100 = ClockMath::floorDivide(doy32, 36524, &doy32); // 100-year cycle length
  166|      4|    int32_t n4   = ClockMath::floorDivide(doy32, 1461, &doy32); // 4-year cycle length
  167|      4|    int32_t n1   = ClockMath::floorDivide(doy32, 365, &doy32);
  168|      4|    int32_t year = 400*n400 + 100*n100 + 4*n4 + n1;
  169|      4|    if (n100 == 4 || n1 == 4) {
  ------------------
  |  Branch (169:9): [True: 0, False: 4]
  |  Branch (169:22): [True: 0, False: 4]
  ------------------
  170|      0|        doy = 365; // Dec 31 at end of 4- or 400-year cycle
  171|      4|    } else {
  172|      4|        doy = doy32;
  173|      4|        ++year;
  174|      4|    }
  175|      4|    doy++; // one-based doy
  176|      4|    return year;
  177|      4|}

_ZN6icu_785Grego10isLeapYearEi:
  331|      4|inline UBool Grego::isLeapYear(int32_t year) {
  332|       |    // year&0x3 == year%4
  333|      4|    return ((year&0x3) == 0) && ((year%100 != 0) || (year%400 == 0));
  ------------------
  |  Branch (333:12): [True: 0, False: 4]
  |  Branch (333:34): [True: 0, False: 0]
  |  Branch (333:53): [True: 0, False: 0]
  ------------------
  334|      4|}
_ZN6icu_785Grego17julianDayToMillisEi:
  347|      2|{
  348|      2|  return (static_cast<double>(julian) - kEpochStartAsJulianDay) * kOneDay;
  ------------------
  |  |  127|      2|#define kEpochStartAsJulianDay  2440588 // January 1, 1970 (Gregorian)
  ------------------
                return (static_cast<double>(julian) - kEpochStartAsJulianDay) * kOneDay;
  ------------------
  |  |  117|      2|#define kOneDay    (1.0 * U_MILLIS_PER_DAY)       //  86,400,000
  |  |  ------------------
  |  |  |  |  227|      2|#define U_MILLIS_PER_DAY       (86400000)
  |  |  ------------------
  ------------------
  349|      2|}
_ZN6icu_785Grego14gregorianShiftEi:
  355|      2|inline int32_t Grego::gregorianShift(int32_t eyear) {
  356|      2|  int64_t y = static_cast<int64_t>(eyear) - 1;
  357|      2|  int64_t gregShift = ClockMath::floorDivideInt64(y, 400LL) - ClockMath::floorDivideInt64(y, 100LL) + 2;
  358|      2|  return static_cast<int32_t>(gregShift);
  359|      2|}
_ZNK6icu_7817GregorianCalendar19defaultCenturyStartEv:
  389|  56.1k|  UDate T::defaultCenturyStart() const { \
  390|  56.1k|      /* lazy-evaluate systemDefaultCenturyStart */ \
  391|  56.1k|      umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); \
  392|  56.1k|      return gSystemDefaultCenturyStart; \
  393|  56.1k|  }   \
_ZNK6icu_7817GregorianCalendar23defaultCenturyStartYearEv:
  394|  56.1k|  int32_t T::defaultCenturyStartYear() const { \
  395|  56.1k|      /* lazy-evaluate systemDefaultCenturyStart */ \
  396|  56.1k|      umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); \
  397|  56.1k|      return gSystemDefaultCenturyStartYear; \
  398|  56.1k|  } \
_ZNK6icu_7817GregorianCalendar18haveDefaultCenturyEv:
  399|  56.1k|  UBool T::haveDefaultCentury() const { return true; }
gregocal.cpp:_ZN6icu_7812_GLOBAL__N_130initializeSystemDefaultCenturyEv:
  372|      1|  initializeSystemDefaultCentury() { \
  373|      1|      UErrorCode status = U_ZERO_ERROR; \
  374|      1|      T calendar(U, status); \
  375|      1|      /* initialize systemDefaultCentury and systemDefaultCenturyYear based */ \
  376|      1|      /* on the current time.  They'll be set to 80 years before */ \
  377|      1|      /* the current time. */ \
  378|      1|      if (U_FAILURE(status)) { \
  ------------------
  |  Branch (378:11): [True: 0, False: 1]
  ------------------
  379|      0|          return; \
  380|      0|      } \
  381|      1|      calendar.setTime(Calendar::getNow(), status); \
  382|      1|      calendar.add(UCAL_YEAR, -80, status); \
  383|      1|      gSystemDefaultCenturyStart = calendar.getTime(status); \
  384|      1|      gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); \
  385|      1|      /* We have no recourse upon failure unless we want to propagate the */ \
  386|      1|      /* failure out. */ \
  387|      1|  } \

_ZN6icu_7811MeasureUnitC2Ev:
 2566|  1.51M|MeasureUnit::MeasureUnit() : MeasureUnit(kBaseTypeIdx, kBaseSubTypeIdx) {
 2567|  1.51M|}
_ZN6icu_7811MeasureUnitC2Eii:
 2570|  1.51M|        : fImpl(nullptr), fSubTypeId(subTypeId), fTypeId(typeId) {
 2571|  1.51M|}
_ZN6icu_7811MeasureUnitC2ERKS0_:
 2574|   400k|        : fImpl(nullptr) {
 2575|   400k|    *this = other;
 2576|   400k|}
_ZN6icu_7811MeasureUnitC2EOS0_:
 2579|   309k|        : fImpl(other.fImpl),
 2580|   309k|        fSubTypeId(other.fSubTypeId),
 2581|   309k|        fTypeId(other.fTypeId) {
 2582|   309k|    other.fImpl = nullptr;
 2583|   309k|}
_ZN6icu_7811MeasureUnitaSERKS0_:
 2592|   611k|MeasureUnit &MeasureUnit::operator=(const MeasureUnit &other) {
 2593|   611k|    if (this == &other) {
  ------------------
  |  Branch (2593:9): [True: 0, False: 611k]
  ------------------
 2594|      0|        return *this;
 2595|      0|    }
 2596|   611k|    delete fImpl;
 2597|   611k|    if (other.fImpl) {
  ------------------
  |  Branch (2597:9): [True: 0, False: 611k]
  ------------------
 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|   611k|    } else {
 2606|   611k|        fImpl = nullptr;
 2607|   611k|    }
 2608|   611k|    fTypeId = other.fTypeId;
 2609|   611k|    fSubTypeId = other.fSubTypeId;
 2610|   611k|    return *this;
 2611|   611k|}
_ZN6icu_7811MeasureUnitaSEOS0_:
 2613|   928k|MeasureUnit &MeasureUnit::operator=(MeasureUnit &&other) noexcept {
 2614|   928k|    if (this == &other) {
  ------------------
  |  Branch (2614:9): [True: 0, False: 928k]
  ------------------
 2615|      0|        return *this;
 2616|      0|    }
 2617|   928k|    delete fImpl;
 2618|   928k|    fImpl = other.fImpl;
 2619|   928k|    other.fImpl = nullptr;
 2620|   928k|    fTypeId = other.fTypeId;
 2621|   928k|    fSubTypeId = other.fSubTypeId;
 2622|   928k|    return *this;
 2623|   928k|}
_ZN6icu_7811MeasureUnitD2Ev:
 2629|  2.22M|MeasureUnit::~MeasureUnit() {
 2630|  2.22M|    if (fImpl != nullptr) {
  ------------------
  |  Branch (2630:9): [True: 0, False: 2.22M]
  ------------------
 2631|      0|        delete fImpl;
 2632|      0|        fImpl = nullptr;
 2633|      0|    }
 2634|  2.22M|}
_ZN6icu_7811MeasureUnit12initCurrencyENS_11StringPieceE:
 2768|   386k|void MeasureUnit::initCurrency(StringPiece isoCurrency) {
 2769|   386k|    int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "currency");
  ------------------
  |  |   99|   386k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 2770|   386k|    U_ASSERT(result != -1);
  ------------------
  |  |   35|   386k|#   define U_ASSERT(exp) (void)0
  ------------------
 2771|   386k|    fTypeId = result;
 2772|   386k|    result = binarySearch(
 2773|   386k|            gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], isoCurrency);
 2774|   386k|    if (result == -1) {
  ------------------
  |  Branch (2774:9): [True: 0, False: 386k]
  ------------------
 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|   386k|    fSubTypeId = result - gOffsets[fTypeId];
 2786|   386k|}
measunit.cpp:_ZN6icu_78L12binarySearchEPKPKciiNS_11StringPieceE:
 2550|   773k|        const char * const * array, int32_t start, int32_t end, StringPiece key) {
 2551|  3.09M|    while (start < end) {
  ------------------
  |  Branch (2551:12): [True: 3.09M, False: 0]
  ------------------
 2552|  3.09M|        int32_t mid = (start + end) / 2;
 2553|  3.09M|        int32_t cmp = StringPiece(array[mid]).compare(key);
 2554|  3.09M|        if (cmp < 0) {
  ------------------
  |  Branch (2554:13): [True: 1.54M, False: 1.54M]
  ------------------
 2555|  1.54M|            start = mid + 1;
 2556|  1.54M|            continue;
 2557|  1.54M|        }
 2558|  1.54M|        if (cmp == 0) {
  ------------------
  |  Branch (2558:13): [True: 773k, False: 773k]
  ------------------
 2559|   773k|            return mid;
 2560|   773k|        }
 2561|   773k|        end = mid;
 2562|   773k|    }
 2563|      0|    return -1;
 2564|   773k|}

_ZN6icu_788message26createINS0_12StaticErrorsEEEPT_OS3_R10UErrorCode:
  125|  7.59k|    inline T* create(T&& node, UErrorCode& status) {
  126|  7.59k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (126:13): [True: 0, False: 7.59k]
  ------------------
  127|      0|            return nullptr;
  128|      0|        }
  129|  7.59k|        T* result = new T(std::move(node));
  130|  7.59k|        if (result == nullptr) {
  ------------------
  |  Branch (130:13): [True: 0, False: 7.59k]
  ------------------
  131|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  132|      0|        }
  133|  7.59k|        return result;
  134|  7.59k|    }
_ZN6icu_788message220createUVectorNoAdoptER10UErrorCode:
   82|   158k|    inline UVector* createUVectorNoAdopt(UErrorCode& status) {
   83|   158k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (83:13): [True: 0, False: 158k]
  ------------------
   84|      0|            return nullptr;
   85|      0|        }
   86|   158k|        LocalPointer<UVector> result(new UVector(status));
   87|   158k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (87:13): [True: 0, False: 158k]
  ------------------
   88|      0|            return nullptr;
   89|      0|        }
   90|   158k|        return result.orphan();
   91|   158k|    }
_ZN6icu_788message213createUVectorER10UErrorCode:
   93|   157k|    inline UVector* createUVector(UErrorCode& status) {
   94|   157k|        UVector* result = createUVectorNoAdopt(status);
   95|   157k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (95:13): [True: 0, False: 157k]
  ------------------
   96|      0|            return nullptr;
   97|      0|        }
   98|   157k|        result->setDeleter(uprv_deleteUObject);
  ------------------
  |  | 1489|   157k|#define uprv_deleteUObject U_ICU_ENTRY_POINT_RENAME(uprv_deleteUObject)
  |  |  ------------------
  |  |  |  |  123|   157k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   157k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   157k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   99|   157k|        return result;
  100|   157k|    }
_ZN6icu_788message219createStringUVectorER10UErrorCode:
  106|   125k|    inline UVector* createStringUVector(UErrorCode& status) {
  107|   125k|        UVector* v = createUVector(status);
  108|   125k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (108:13): [True: 0, False: 125k]
  ------------------
  109|      0|            return nullptr;
  110|      0|        }
  111|   125k|        v->setComparer(stringsEqual);
  112|   125k|        return v;
  113|   125k|    }
_ZN6icu_788message225createStringVectorNoAdoptER10UErrorCode:
  115|  1.50k|    inline UVector* createStringVectorNoAdopt(UErrorCode& status) {
  116|  1.50k|        UVector* v = createUVectorNoAdopt(status);
  117|  1.50k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (117:13): [True: 0, False: 1.50k]
  ------------------
  118|      0|            return nullptr;
  119|      0|        }
  120|  1.50k|        v->setComparer(stringsEqual);
  121|  1.50k|        return v;
  122|  1.50k|    }
_ZN6icu_788message26createINS_13UnicodeStringEEEPT_OS3_R10UErrorCode:
  125|  66.3k|    inline T* create(T&& node, UErrorCode& status) {
  126|  66.3k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (126:13): [True: 0, False: 66.3k]
  ------------------
  127|      0|            return nullptr;
  128|      0|        }
  129|  66.3k|        T* result = new T(std::move(node));
  130|  66.3k|        if (result == nullptr) {
  ------------------
  |  Branch (130:13): [True: 0, False: 66.3k]
  ------------------
  131|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  132|      0|        }
  133|  66.3k|        return result;
  134|  66.3k|    }
_ZN6icu_788message26createINS0_10data_model3KeyEEEPT_OS4_R10UErrorCode:
  125|  1.06M|    inline T* create(T&& node, UErrorCode& status) {
  126|  1.06M|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (126:13): [True: 0, False: 1.06M]
  ------------------
  127|      0|            return nullptr;
  128|      0|        }
  129|  1.06M|        T* result = new T(std::move(node));
  130|  1.06M|        if (result == nullptr) {
  ------------------
  |  Branch (130:13): [True: 0, False: 1.06M]
  ------------------
  131|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  132|      0|        }
  133|  1.06M|        return result;
  134|  1.06M|    }
messageformat2_data_model.cpp:_ZN6icu_788message2L17copyVectorToArrayINS0_10data_model3KeyEEEPT_RKNS_7UVectorER10UErrorCode:
   47|    273|    static T* copyVectorToArray(const UVector& source, UErrorCode& status) {
   48|    273|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (48:13): [True: 0, False: 273]
  ------------------
   49|      0|            return nullptr;
   50|      0|        }
   51|    273|        int32_t len = source.size();
   52|    273|        T* dest = new T[len];
   53|    273|        if (dest == nullptr) {
  ------------------
  |  Branch (53:13): [True: 0, False: 273]
  ------------------
   54|      0|            status = U_MEMORY_ALLOCATION_ERROR;
   55|    273|        } else {
   56|   867k|            for (int32_t i = 0; i < len; i++) {
  ------------------
  |  Branch (56:33): [True: 867k, False: 273]
  ------------------
   57|   867k|                dest[i] = *(static_cast<T*>(source.elementAt(i)));
   58|   867k|            }
   59|    273|        }
   60|    273|        return dest;
   61|    273|    }
messageformat2_data_model.cpp:_ZN6icu_788message2L9copyArrayINS0_10data_model3KeyEEEPT_PKS4_iR10UErrorCode:
   29|    538|    static T* copyArray(const T* source, int32_t len, UErrorCode& status) {
   30|    538|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (30:13): [True: 0, False: 538]
  ------------------
   31|      0|            return nullptr;
   32|      0|        }
   33|    538|        U_ASSERT(source != nullptr);
  ------------------
  |  |   35|    538|#   define U_ASSERT(exp) (void)0
  ------------------
   34|    538|        U_ASSERT(len >= 0);
  ------------------
  |  |   35|    538|#   define U_ASSERT(exp) (void)0
  ------------------
   35|    538|        T* dest = new T[len];
   36|    538|        if (dest == nullptr) {
  ------------------
  |  Branch (36:13): [True: 0, False: 538]
  ------------------
   37|      0|            status = U_MEMORY_ALLOCATION_ERROR;
   38|    538|        } else {
   39|  1.73M|            for (int32_t i = 0; i < len; i++) {
  ------------------
  |  Branch (39:33): [True: 1.73M, False: 538]
  ------------------
   40|  1.73M|                dest[i] = source[i];
   41|  1.73M|            }
   42|    538|        }
   43|    538|        return dest;
   44|    538|    }
messageformat2_data_model.cpp:_ZN6icu_788message2L17copyVectorToArrayINS0_10data_model6OptionEEEPT_RKNS_7UVectorER10UErrorCode:
   47|   124k|    static T* copyVectorToArray(const UVector& source, UErrorCode& status) {
   48|   124k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (48:13): [True: 0, False: 124k]
  ------------------
   49|      0|            return nullptr;
   50|      0|        }
   51|   124k|        int32_t len = source.size();
   52|   124k|        T* dest = new T[len];
   53|   124k|        if (dest == nullptr) {
  ------------------
  |  Branch (53:13): [True: 0, False: 124k]
  ------------------
   54|      0|            status = U_MEMORY_ALLOCATION_ERROR;
   55|   124k|        } else {
   56|   153k|            for (int32_t i = 0; i < len; i++) {
  ------------------
  |  Branch (56:33): [True: 28.6k, False: 124k]
  ------------------
   57|  28.6k|                dest[i] = *(static_cast<T*>(source.elementAt(i)));
   58|  28.6k|            }
   59|   124k|        }
   60|   124k|        return dest;
   61|   124k|    }
messageformat2_data_model.cpp:_ZN6icu_788message2L9copyArrayINS0_10data_model6OptionEEEPT_PKS4_iR10UErrorCode:
   29|   196k|    static T* copyArray(const T* source, int32_t len, UErrorCode& status) {
   30|   196k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (30:13): [True: 0, False: 196k]
  ------------------
   31|      0|            return nullptr;
   32|      0|        }
   33|   196k|        U_ASSERT(source != nullptr);
  ------------------
  |  |   35|   196k|#   define U_ASSERT(exp) (void)0
  ------------------
   34|   196k|        U_ASSERT(len >= 0);
  ------------------
  |  |   35|   196k|#   define U_ASSERT(exp) (void)0
  ------------------
   35|   196k|        T* dest = new T[len];
   36|   196k|        if (dest == nullptr) {
  ------------------
  |  Branch (36:13): [True: 0, False: 196k]
  ------------------
   37|      0|            status = U_MEMORY_ALLOCATION_ERROR;
   38|   196k|        } else {
   39|   447k|            for (int32_t i = 0; i < len; i++) {
  ------------------
  |  Branch (39:33): [True: 250k, False: 196k]
  ------------------
   40|   250k|                dest[i] = source[i];
   41|   250k|            }
   42|   196k|        }
   43|   196k|        return dest;
   44|   196k|    }
_ZN6icu_788message26createINS0_10data_model6OptionEEEPT_OS4_R10UErrorCode:
  125|  29.6k|    inline T* create(T&& node, UErrorCode& status) {
  126|  29.6k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (126:13): [True: 0, False: 29.6k]
  ------------------
  127|      0|            return nullptr;
  128|      0|        }
  129|  29.6k|        T* result = new T(std::move(node));
  130|  29.6k|        if (result == nullptr) {
  ------------------
  |  Branch (130:13): [True: 0, False: 29.6k]
  ------------------
  131|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  132|      0|        }
  133|  29.6k|        return result;
  134|  29.6k|    }
messageformat2_data_model.cpp:_ZN6icu_788message2L17copyVectorToArrayINS0_10data_model11PatternPartEEEPT_RKNS_7UVectorER10UErrorCode:
   47|  6.75k|    static T* copyVectorToArray(const UVector& source, UErrorCode& status) {
   48|  6.75k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (48:13): [True: 0, False: 6.75k]
  ------------------
   49|      0|            return nullptr;
   50|      0|        }
   51|  6.75k|        int32_t len = source.size();
   52|  6.75k|        T* dest = new T[len];
   53|  6.75k|        if (dest == nullptr) {
  ------------------
  |  Branch (53:13): [True: 0, False: 6.75k]
  ------------------
   54|      0|            status = U_MEMORY_ALLOCATION_ERROR;
   55|  6.75k|        } else {
   56|  12.2M|            for (int32_t i = 0; i < len; i++) {
  ------------------
  |  Branch (56:33): [True: 12.2M, False: 6.75k]
  ------------------
   57|  12.2M|                dest[i] = *(static_cast<T*>(source.elementAt(i)));
   58|  12.2M|            }
   59|  6.75k|        }
   60|  6.75k|        return dest;
   61|  6.75k|    }
messageformat2_data_model.cpp:_ZN6icu_788message2L9copyArrayINS0_10data_model11PatternPartEEEPT_PKS4_iR10UErrorCode:
   29|  7.88k|    static T* copyArray(const T* source, int32_t len, UErrorCode& status) {
   30|  7.88k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (30:13): [True: 0, False: 7.88k]
  ------------------
   31|      0|            return nullptr;
   32|      0|        }
   33|  7.88k|        U_ASSERT(source != nullptr);
  ------------------
  |  |   35|  7.88k|#   define U_ASSERT(exp) (void)0
  ------------------
   34|  7.88k|        U_ASSERT(len >= 0);
  ------------------
  |  |   35|  7.88k|#   define U_ASSERT(exp) (void)0
  ------------------
   35|  7.88k|        T* dest = new T[len];
   36|  7.88k|        if (dest == nullptr) {
  ------------------
  |  Branch (36:13): [True: 0, False: 7.88k]
  ------------------
   37|      0|            status = U_MEMORY_ALLOCATION_ERROR;
   38|  7.88k|        } else {
   39|  20.9M|            for (int32_t i = 0; i < len; i++) {
  ------------------
  |  Branch (39:33): [True: 20.9M, False: 7.88k]
  ------------------
   40|  20.9M|                dest[i] = source[i];
   41|  20.9M|            }
   42|  7.88k|        }
   43|  7.88k|        return dest;
   44|  7.88k|    }
_ZN6icu_788message26createINS0_10data_model11PatternPartEEEPT_OS4_R10UErrorCode:
  125|  12.2M|    inline T* create(T&& node, UErrorCode& status) {
  126|  12.2M|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (126:13): [True: 0, False: 12.2M]
  ------------------
  127|      0|            return nullptr;
  128|      0|        }
  129|  12.2M|        T* result = new T(std::move(node));
  130|  12.2M|        if (result == nullptr) {
  ------------------
  |  Branch (130:13): [True: 0, False: 12.2M]
  ------------------
  131|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  132|      0|        }
  133|  12.2M|        return result;
  134|  12.2M|    }
_ZN6icu_788message26createINS0_10data_model7VariantEEEPT_OS4_R10UErrorCode:
  125|    273|    inline T* create(T&& node, UErrorCode& status) {
  126|    273|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (126:13): [True: 8, False: 265]
  ------------------
  127|      8|            return nullptr;
  128|      8|        }
  129|    265|        T* result = new T(std::move(node));
  130|    265|        if (result == nullptr) {
  ------------------
  |  Branch (130:13): [True: 0, False: 265]
  ------------------
  131|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  132|      0|        }
  133|    265|        return result;
  134|    273|    }
_ZN6icu_788message26createINS0_5ErrorINS0_15StaticErrorTypeEEEEEPT_OS5_R10UErrorCode:
  125|  9.69k|    inline T* create(T&& node, UErrorCode& status) {
  126|  9.69k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (126:13): [True: 0, False: 9.69k]
  ------------------
  127|      0|            return nullptr;
  128|      0|        }
  129|  9.69k|        T* result = new T(std::move(node));
  130|  9.69k|        if (result == nullptr) {
  ------------------
  |  Branch (130:13): [True: 0, False: 9.69k]
  ------------------
  131|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  132|      0|        }
  133|  9.69k|        return result;
  134|  9.69k|    }

_ZN6icu_788message215TypeEnvironmentC2ER10UErrorCode:
   43|    503|TypeEnvironment::TypeEnvironment(UErrorCode& status) {
   44|    503|    CHECK_ERROR(status);
  ------------------
  |  |   73|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
   45|       |
   46|    503|    UVector* temp;
   47|    503|    temp = createStringVectorNoAdopt(status);
   48|    503|    CHECK_ERROR(status);
  ------------------
  |  |   73|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
   49|    503|    annotated.adoptInstead(temp);
   50|    503|    temp = createStringVectorNoAdopt(status);
   51|    503|    CHECK_ERROR(status);
  ------------------
  |  |   73|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
   52|    503|    unannotated.adoptInstead(temp);
   53|    503|    temp = createStringVectorNoAdopt(status);
   54|    503|    CHECK_ERROR(status);
  ------------------
  |  |   73|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
   55|    503|    freeVars.adoptInstead(temp);
   56|    503|}
_ZN6icu_788message215TypeEnvironmentD2Ev:
  108|    503|TypeEnvironment::~TypeEnvironment() {}
_ZN6icu_788message27Checker17checkDeclarationsERNS0_15TypeEnvironmentER10UErrorCode:
  257|    503|void Checker::checkDeclarations(TypeEnvironment& t, UErrorCode& status) {
  258|    503|    CHECK_ERROR(status);
  ------------------
  |  |   73|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
  259|       |
  260|       |    // For each declaration, extend the type environment with its type
  261|       |    // Only a very simple type system is necessary: variables
  262|       |    // have the type "annotated", "unannotated", or "free".
  263|       |    // For "missing selector annotation" checking, free variables
  264|       |    // (message arguments) are treated as unannotated.
  265|       |    // Free variables are also used for checking duplicate declarations.
  266|    503|    const Binding* env = dataModel.getLocalVariablesInternal();
  267|    503|    for (int32_t i = 0; i < dataModel.bindingsLen; i++) {
  ------------------
  |  Branch (267:25): [True: 0, False: 503]
  ------------------
  268|      0|        const Binding& b = env[i];
  269|      0|        const VariableName& lhs = b.getVariable();
  270|      0|        const Expression& rhs = b.getValue();
  271|       |
  272|       |        // First, add free variables from the RHS of b
  273|       |        // This must be done first so we can catch:
  274|       |        // .local $foo = {$foo}
  275|       |        // (where the RHS is the first use of $foo)
  276|      0|        if (b.isLocal()) {
  ------------------
  |  Branch (276:13): [True: 0, False: 0]
  ------------------
  277|      0|            addFreeVars(t, rhs, status);
  278|       |
  279|       |            // Next, check if the LHS equals any free variables
  280|       |            // whose implicit declarations are in scope
  281|      0|            if (t.known(lhs) && t.get(lhs) == TypeEnvironment::Type::FreeVariable) {
  ------------------
  |  Branch (281:17): [True: 0, False: 0]
  |  Branch (281:33): [True: 0, False: 0]
  ------------------
  282|      0|                errors.addError(StaticErrorType::DuplicateDeclarationError, status);
  283|      0|            }
  284|      0|        } else {
  285|       |            // Input declaration; if b has no annotation, there's nothing to check
  286|      0|            if (!b.isLocal() && b.hasAnnotation()) {
  ------------------
  |  Branch (286:17): [True: 0, False: 0]
  |  Branch (286:33): [True: 0, False: 0]
  ------------------
  287|      0|                const OptionMap& opts = b.getOptionsInternal();
  288|       |                // For .input declarations, we just need to add any variables
  289|       |                // referenced in the options
  290|      0|                addFreeVars(t, opts, status);
  291|      0|             }
  292|       |            // Next, check if the LHS equals any free variables
  293|       |            // whose implicit declarations are in scope
  294|      0|            if (t.known(lhs) && t.get(lhs) == TypeEnvironment::Type::FreeVariable) {
  ------------------
  |  Branch (294:17): [True: 0, False: 0]
  |  Branch (294:33): [True: 0, False: 0]
  ------------------
  295|      0|                errors.addError(StaticErrorType::DuplicateDeclarationError, status);
  296|      0|            }
  297|      0|        }
  298|       |        // Next, extend the type environment with a binding from lhs to its type
  299|      0|        t.extend(lhs, typeOf(t, rhs), status);
  300|      0|    }
  301|    503|}
_ZN6icu_788message27Checker5checkER10UErrorCode:
  303|    503|void Checker::check(UErrorCode& status) {
  304|    503|    CHECK_ERROR(status);
  ------------------
  |  |   73|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
  305|       |
  306|    503|    TypeEnvironment typeEnv(status);
  307|    503|    checkDeclarations(typeEnv, status);
  308|       |    // Pattern message
  309|    503|    if (dataModel.hasPattern()) {
  ------------------
  |  Branch (309:9): [True: 503, False: 0]
  ------------------
  310|    503|        return;
  311|    503|    } else {
  312|       |      // Selectors message
  313|      0|      checkSelectors(typeEnv, status);
  314|      0|      checkVariants(status);
  315|      0|    }
  316|    503|}

_ZN6icu_788message27CheckerC2ERKNS0_11MFDataModelERNS0_12StaticErrorsERKNS0_16MessageFormatterE:
   69|    503|            : dataModel(d), errors(e), context(mf) {}

_ZN6icu_788message210data_model12SelectorKeys7BuilderC2ER10UErrorCode:
   54|    545|SelectorKeys::Builder::Builder(UErrorCode& status) {
   55|    545|    keys = createUVector(status);
   56|    545|}
_ZN6icu_788message210data_model12SelectorKeys7Builder3addEONS1_3KeyER10UErrorCode:
   58|  1.06M|SelectorKeys::Builder& SelectorKeys::Builder::add(Key&& key, UErrorCode& status) noexcept {
   59|  1.06M|    U_ASSERT(keys != nullptr);
  ------------------
  |  |   35|  1.06M|#   define U_ASSERT(exp) (void)0
  ------------------
   60|  1.06M|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (60:9): [True: 1.06M, False: 0]
  ------------------
   61|  1.06M|        Key* k = create<Key>(std::move(key), status);
   62|  1.06M|        keys->adoptElement(k, status);
   63|  1.06M|    }
   64|  1.06M|    return *this;
   65|  1.06M|}
_ZNK6icu_788message210data_model12SelectorKeys7Builder5buildER10UErrorCode:
   67|    273|SelectorKeys SelectorKeys::Builder::build(UErrorCode& status) const {
   68|    273|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (68:9): [True: 0, False: 273]
  ------------------
   69|      0|        return {};
   70|      0|    }
   71|    273|    U_ASSERT(keys != nullptr);
  ------------------
  |  |   35|    273|#   define U_ASSERT(exp) (void)0
  ------------------
   72|    273|    return SelectorKeys(*keys, status);
   73|    273|}
_ZN6icu_788message210data_model12SelectorKeys7BuilderD2Ev:
   75|    545|SelectorKeys::Builder::~Builder() {
   76|    545|    if (keys != nullptr) {
  ------------------
  |  Branch (76:9): [True: 545, False: 0]
  ------------------
   77|    545|        delete keys;
   78|    545|    }
   79|    545|}
_ZN6icu_788message210data_model12SelectorKeysC2ERKNS_7UVectorER10UErrorCode:
   81|    273|SelectorKeys::SelectorKeys(const UVector& ks, UErrorCode& status) : len(ks.size()) {
   82|    273|    Key* result = copyVectorToArray<Key>(ks, status);
   83|    273|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (83:9): [True: 0, False: 273]
  ------------------
   84|      0|        return;
   85|      0|    }
   86|    273|    keys.adoptInstead(result);
   87|    273|}
_ZN6icu_788message210data_model12SelectorKeysC2ERKS2_:
   94|    810|SelectorKeys::SelectorKeys(const SelectorKeys& other) : len(other.len) {
   95|    810|    UErrorCode localErrorCode = U_ZERO_ERROR;
   96|    810|    if (len != 0) {
  ------------------
  |  Branch (96:9): [True: 538, False: 272]
  ------------------
   97|    538|        keys.adoptInstead(copyArray(other.keys.getAlias(), len, localErrorCode));
   98|    538|    }
   99|    810|    if (U_FAILURE(localErrorCode)) {
  ------------------
  |  Branch (99:9): [True: 0, False: 810]
  ------------------
  100|      0|        len = 0;
  101|      0|    }
  102|    810|}
_ZN6icu_788message210data_model12SelectorKeysD2Ev:
  104|  1.62k|SelectorKeys::~SelectorKeys() {
  105|  1.62k|    len = 0;
  106|  1.62k|}
_ZN6icu_788message210data_model7LiteralaSES2_:
  129|  1.09M|Literal& Literal::operator=(Literal other) noexcept {
  130|  1.09M|    swap(*this, other);
  131|       |
  132|  1.09M|    return *this;
  133|  1.09M|}
_ZN6icu_788message210data_model7LiteralD2Ev:
  135|  11.2M|Literal::~Literal() {
  136|  11.2M|    thisIsQuoted = false;
  137|  11.2M|}
_ZN6icu_788message210data_model7OperandC2ERKS2_:
  141|   477k|Operand::Operand(const Operand& other) : contents(other.contents) {}
_ZN6icu_788message210data_model7OperandaSES2_:
  143|  51.7k|Operand& Operand::operator=(Operand other) noexcept {
  144|  51.7k|    swap(*this, other);
  145|       |
  146|  51.7k|    return *this;
  147|  51.7k|}
_ZNK6icu_788message210data_model7Operand10isVariableEv:
  149|  29.8k|UBool Operand::isVariable() const {
  150|  29.8k|    return (contents.has_value() && std::holds_alternative<VariableName>(*contents));
  ------------------
  |  Branch (150:13): [True: 5.66k, False: 24.1k]
  |  Branch (150:37): [True: 516, False: 5.14k]
  ------------------
  151|  29.8k|}
_ZNK6icu_788message210data_model7Operand6isNullEv:
  155|  15.6k|UBool Operand::isNull() const { return !contents.has_value(); }
_ZNK6icu_788message210data_model7Operand10asVariableEv:
  162|    516|const VariableName& Operand::asVariable() const {
  163|    516|    U_ASSERT(isVariable());
  ------------------
  |  |   35|    516|#   define U_ASSERT(exp) (void)0
  ------------------
  164|    516|    return *(std::get_if<VariableName>(&(*contents)));
  165|    516|}
_ZN6icu_788message210data_model7OperandD2Ev:
  167|   967k|Operand::~Operand() {}
_ZN6icu_788message210data_model3KeyaSES2_:
  171|  3.66M|Key& Key::operator=(Key other) noexcept {
  172|  3.66M|    swap(*this, other);
  173|  3.66M|    return *this;
  174|  3.66M|}
_ZN6icu_788message210data_model3KeyD2Ev:
  202|  8.38M|Key::~Key() {}
_ZN6icu_788message210data_model9OptionMapC2ERKNS_7UVectorER10UErrorCode:
  206|   124k|OptionMap::OptionMap(const UVector& opts, UErrorCode& status) : len(opts.size()) {
  207|   124k|    Option* result = copyVectorToArray<Option>(opts, status);
  208|   124k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (208:9): [True: 0, False: 124k]
  ------------------
  209|      0|        bogus = true;
  210|      0|        return;
  211|      0|    }
  212|   124k|    options.adoptInstead(result);
  213|   124k|    bogus = false;
  214|   124k|}
_ZN6icu_788message210data_model9OptionMapC2ERKS2_:
  216|   733k|OptionMap::OptionMap(const OptionMap& other) : len(other.len) {
  217|   733k|    U_ASSERT(!other.bogus);
  ------------------
  |  |   35|   733k|#   define U_ASSERT(exp) (void)0
  ------------------
  218|   733k|    if (len == 0) {
  ------------------
  |  Branch (218:9): [True: 536k, False: 196k]
  ------------------
  219|   536k|        bogus = false;
  220|   536k|        return;
  221|   536k|    }
  222|   196k|    UErrorCode localErrorCode = U_ZERO_ERROR;
  223|   196k|    Option* result = copyArray(other.options.getAlias(), len, localErrorCode);
  224|   196k|    if (U_FAILURE(localErrorCode)) {
  ------------------
  |  Branch (224:9): [True: 0, False: 196k]
  ------------------
  225|      0|        bogus = true;
  226|      0|        return;
  227|      0|    }
  228|   196k|    bogus = false;
  229|   196k|    options.adoptInstead(result);
  230|   196k|}
_ZN6icu_788message210data_model9OptionMapaSES2_:
  232|  46.1k|OptionMap& OptionMap::operator=(OptionMap other) {
  233|  46.1k|    swap(*this, other);
  234|  46.1k|    return *this;
  235|  46.1k|}
_ZN6icu_788message210data_model9OptionMapD2Ev:
  254|  1.00M|OptionMap::~OptionMap() {}
_ZN6icu_788message210data_model9OptionMap7Builder5buildER10UErrorCode:
  256|   124k|OptionMap OptionMap::Builder::build(UErrorCode& status) {
  257|   124k|    return OptionMap(*options, status);
  258|   124k|}
_ZN6icu_788message210data_model9OptionMap7BuilderC2ER10UErrorCode:
  260|   125k|OptionMap::Builder::Builder(UErrorCode& status) {
  261|   125k|    options = createStringUVector(status);
  262|   125k|}
_ZN6icu_788message210data_model9OptionMap7Builder10attributesER10UErrorCode:
  275|  68.5k|/* static */ OptionMap::Builder OptionMap::Builder::attributes(UErrorCode& status) {
  276|  68.5k|    Builder b(status);
  277|       |    // The same code is re-used for representing attributes and options.
  278|       |    // Duplicate attributes are allowed, while duplicate options are disallowed.
  279|  68.5k|    b.checkDuplicates = false;
  280|  68.5k|    return b;
  281|  68.5k|}
_ZN6icu_788message210data_model9OptionMap7Builder3addEONS1_6OptionER10UErrorCode:
  294|  31.9k|OptionMap::Builder& OptionMap::Builder::add(Option&& opt, UErrorCode& status) {
  295|  31.9k|    THIS_ON_ERROR(status);
  ------------------
  |  |   85|  31.9k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (85:9): [True: 0, False: 31.9k]
  |  |  ------------------
  |  |   86|      0|        return *this; \
  |  |   87|      0|    }
  ------------------
  296|       |
  297|       |    // If the option name is already in the map, emit a data model error
  298|  31.9k|    if (checkDuplicates && hasOptionNamed(*options, opt.getName())) {
  ------------------
  |  Branch (298:9): [True: 7.52k, False: 24.4k]
  |  Branch (298:28): [True: 2.25k, False: 5.27k]
  ------------------
  299|  2.25k|        status = U_MF_DUPLICATE_OPTION_NAME_ERROR;
  300|  29.6k|    } else {
  301|  29.6k|        Option* newOption = create<Option>(std::move(opt), status);
  302|  29.6k|        options->adoptElement(newOption, status);
  303|  29.6k|    }
  304|  31.9k|    return *this;
  305|  31.9k|}
_ZN6icu_788message210data_model9OptionMap7BuilderD2Ev:
  307|   125k|OptionMap::Builder::~Builder() {
  308|   125k|    if (options != nullptr) {
  ------------------
  |  Branch (308:9): [True: 125k, False: 0]
  ------------------
  309|   125k|        delete options;
  310|   125k|    }
  311|   125k|}
_ZN6icu_788message210data_model6OptionC2ERKS2_:
  317|   308k|Option::Option(const Option& other): name(other.name), rand(other.rand) {}
_ZN6icu_788message210data_model6OptionaSES2_:
  319|   279k|Option& Option::operator=(Option other) noexcept {
  320|   279k|    swap(*this, other);
  321|   279k|    return *this;
  322|   279k|}
_ZN6icu_788message210data_model6OptionD2Ev:
  324|   619k|Option::~Option() {}
_ZN6icu_788message210data_model8Operator7BuilderC2ER10UErrorCode:
  326|  33.6k|Operator::Builder::Builder(UErrorCode& status) : options(OptionMap::Builder(status)) {}
_ZN6icu_788message210data_model8Operator7Builder15setFunctionNameEONS_13UnicodeStringE:
  328|  33.6k|Operator::Builder& Operator::Builder::setFunctionName(FunctionName&& func) {
  329|  33.6k|    functionName = std::move(func);
  330|  33.6k|    return *this;
  331|  33.6k|}
_ZN6icu_788message210data_model8Operator7Builder9addOptionERKNS_13UnicodeStringEONS1_7OperandER10UErrorCode:
  337|  1.95k|Operator::Builder& Operator::Builder::addOption(const UnicodeString &key, Operand&& value, UErrorCode& errorCode) noexcept {
  338|  1.95k|    THIS_ON_ERROR(errorCode);
  ------------------
  |  |   85|  1.95k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (85:9): [True: 0, False: 1.95k]
  |  |  ------------------
  |  |   86|      0|        return *this; \
  |  |   87|      0|    }
  ------------------
  339|       |
  340|  1.95k|    options.add(Option(key, std::move(value)), errorCode);
  341|  1.95k|    return *this;
  342|  1.95k|}
_ZN6icu_788message210data_model8Operator7Builder5buildER10UErrorCode:
  344|  33.6k|Operator Operator::Builder::build(UErrorCode& errorCode) {
  345|  33.6k|    return Operator(functionName, options.build(errorCode));
  346|  33.6k|}
_ZN6icu_788message210data_model8OperatorC2ERKS2_:
  349|   104k|    : name(other.name), options(other.options) {}
_ZN6icu_788message210data_model8OperatoraSES2_:
  351|  33.6k|Operator& Operator::operator=(Operator other) noexcept {
  352|  33.6k|    swap(*this, other);
  353|  33.6k|    return *this;
  354|  33.6k|}
_ZN6icu_788message210data_model8OperatorC2ERKNS_13UnicodeStringERKNS1_9OptionMapE:
  358|  33.6k|Operator::Operator(const FunctionName& f, const OptionMap& opts) : name(f), options(opts) {}
_ZN6icu_788message210data_model8Operator7BuilderD2Ev:
  360|  33.6k|Operator::Builder::~Builder() {}
_ZN6icu_788message210data_model8OperatorD2Ev:
  362|   183k|Operator::~Operator() {}
_ZN6icu_788message210data_model6Markup7BuilderC2ER10UErrorCode:
  367|  23.3k|    : options(OptionMap::Builder(status)), attributes(OptionMap::Builder::attributes(status)) {}
_ZN6icu_788message210data_model6MarkupC2ENS1_11UMarkupTypeENS_13UnicodeStringEONS1_9OptionMapES6_:
  370|  23.0k|    : type(ty), name(n), options(std::move(o)), attributes(std::move(a)) {}
_ZN6icu_788message210data_model6Markup7Builder9addOptionERKNS_13UnicodeStringEONS1_7OperandER10UErrorCode:
  374|  5.57k|                                            UErrorCode& errorCode) {
  375|  5.57k|    options.add(Option(key, std::move(value)), errorCode);
  376|  5.57k|    return *this;
  377|  5.57k|}
_ZN6icu_788message210data_model6Markup7Builder12addAttributeERKNS_13UnicodeStringEONS1_7OperandER10UErrorCode:
  381|  16.3k|                                               UErrorCode& errorCode) {
  382|  16.3k|    attributes.add(Option(key, std::move(value)), errorCode);
  383|  16.3k|    return *this;
  384|  16.3k|}
_ZN6icu_788message210data_model6Markup7Builder5buildER10UErrorCode:
  386|  23.3k|Markup Markup::Builder::build(UErrorCode& errorCode) {
  387|  23.3k|    Markup result;
  388|       |
  389|  23.3k|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (389:9): [True: 0, False: 23.3k]
  ------------------
  390|      0|        return result;
  391|      0|    }
  392|       |
  393|  23.3k|    if (type == UMARKUP_COUNT || name.length() == 0) {
  ------------------
  |  Branch (393:9): [True: 0, False: 23.3k]
  |  Branch (393:34): [True: 314, False: 23.0k]
  ------------------
  394|       |        // One of `setOpen()`, `setClose()`, or `setStandalone()`
  395|       |        // must be called before calling build()
  396|       |        // setName() must be called before calling build()
  397|    314|        errorCode = U_INVALID_STATE_ERROR;
  398|  23.0k|    } else {
  399|  23.0k|        result = Markup(type,
  400|  23.0k|                        name,
  401|  23.0k|                        options.build(errorCode),
  402|  23.0k|                        attributes.build(errorCode));
  403|  23.0k|    }
  404|  23.3k|    return result;
  405|  23.3k|}
_ZN6icu_788message210data_model6Markup7BuilderD2Ev:
  407|  23.3k|Markup::Builder::~Builder() {}
_ZN6icu_788message210data_model6MarkupD2Ev:
  409|   234k|Markup::~Markup() {}
_ZN6icu_788message210data_model10Expression7BuilderC2ER10UErrorCode:
  414|  45.1k|    : attributes(OptionMap::Builder::attributes(status)) {}
_ZNK6icu_788message210data_model10Expression10getOperandEv:
  438|  30.3k|const Operand& Expression::getOperand() const { return rand; }
_ZN6icu_788message210data_model10Expression7Builder10setOperandEONS1_7OperandE:
  440|  15.6k|Expression::Builder& Expression::Builder::setOperand(Operand&& rAnd) {
  441|  15.6k|    hasOperand = true;
  442|  15.6k|    rand = std::move(rAnd);
  443|  15.6k|    return *this;
  444|  15.6k|}
_ZN6icu_788message210data_model10Expression7Builder11setOperatorEONS1_8OperatorE:
  446|  33.6k|Expression::Builder& Expression::Builder::setOperator(Operator&& rAtor) {
  447|  33.6k|    hasOperator = true;
  448|  33.6k|    rator = std::move(rAtor);
  449|  33.6k|    return *this;
  450|  33.6k|}
_ZN6icu_788message210data_model10Expression7Builder12addAttributeERKNS_13UnicodeStringEONS1_7OperandER10UErrorCode:
  454|  8.03k|                                                       UErrorCode& status) {
  455|  8.03k|    attributes.add(Option(k, std::move(v)), status);
  456|  8.03k|    return *this;
  457|  8.03k|}
_ZN6icu_788message210data_model10Expression7Builder5buildER10UErrorCode:
  459|  45.1k|Expression Expression::Builder::build(UErrorCode& errorCode) {
  460|  45.1k|    Expression result;
  461|       |
  462|  45.1k|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (462:9): [True: 0, False: 45.1k]
  ------------------
  463|      0|        return result;
  464|      0|    }
  465|       |
  466|  45.1k|    if ((!hasOperand || rand.isNull()) && !hasOperator) {
  ------------------
  |  Branch (466:10): [True: 29.4k, False: 15.6k]
  |  Branch (466:25): [True: 0, False: 15.6k]
  |  Branch (466:43): [True: 0, False: 29.4k]
  ------------------
  467|      0|        errorCode = U_INVALID_STATE_ERROR;
  468|      0|        return result;
  469|      0|    }
  470|       |
  471|  45.1k|    OptionMap attributeMap = attributes.build(errorCode);
  472|  45.1k|    if (hasOperand && hasOperator) {
  ------------------
  |  Branch (472:9): [True: 15.6k, False: 29.4k]
  |  Branch (472:23): [True: 4.15k, False: 11.5k]
  ------------------
  473|  4.15k|        result = Expression(rator, rand, std::move(attributeMap));
  474|  40.9k|    } else if (hasOperand && !hasOperator) {
  ------------------
  |  Branch (474:16): [True: 11.5k, False: 29.4k]
  |  Branch (474:30): [True: 11.5k, False: 0]
  ------------------
  475|  11.5k|        result = Expression(rand, std::move(attributeMap));
  476|  29.4k|    } else {
  477|       |        // rator is valid, rand is not valid
  478|  29.4k|        result = Expression(rator, std::move(attributeMap));
  479|  29.4k|    }
  480|  45.1k|    return result;
  481|  45.1k|}
_ZN6icu_788message210data_model10ExpressionC2Ev:
  483|  51.8k|Expression::Expression() : rator(std::nullopt) {}
_ZN6icu_788message210data_model10ExpressionC2ERKS2_:
  485|  81.5k|Expression::Expression(const Expression& other) : rator(other.rator), rand(other.rand), attributes(other.attributes) {}
_ZN6icu_788message210data_model10ExpressionaSES2_:
  487|  45.1k|Expression& Expression::operator=(Expression other) noexcept {
  488|  45.1k|    swap(*this, other);
  489|  45.1k|    return *this;
  490|  45.1k|}
_ZN6icu_788message210data_model10Expression7BuilderD2Ev:
  492|  45.1k|Expression::Builder::~Builder() {}
_ZN6icu_788message210data_model10ExpressionD2Ev:
  494|   178k|Expression::~Expression() {}
_ZN6icu_788message210data_model11PatternPartC2ERKS2_:
  501|  45.3M|PatternPart::PatternPart(const PatternPart& other) : piece(other.piece) {}
_ZN6icu_788message210data_model11PatternPartaSES2_:
  519|  33.1M|PatternPart& PatternPart::operator=(PatternPart other) noexcept {
  520|  33.1M|    swap(*this, other);
  521|  33.1M|    return *this;
  522|  33.1M|}
_ZN6icu_788message210data_model11PatternPartD2Ev:
  524|  90.7M|PatternPart::~PatternPart() {}
_ZN6icu_788message210data_model7PatternC2ERKNS_7UVectorER10UErrorCode:
  528|  6.75k|Pattern::Pattern(const UVector& ps, UErrorCode& status) : len(ps.size()) {
  529|  6.75k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (529:9): [True: 0, False: 6.75k]
  ------------------
  530|      0|        return;
  531|      0|    }
  532|  6.75k|    PatternPart* result = copyVectorToArray<PatternPart>(ps, status);
  533|  6.75k|    CHECK_ERROR(status);
  ------------------
  |  |   73|  6.75k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 6.75k]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
  534|  6.75k|    parts.adoptInstead(result);
  535|  6.75k|}
_ZN6icu_788message210data_model7PatternC2ERKS2_:
  538|  31.6k|Pattern::Pattern(const Pattern& other) : len(other.len) {
  539|  31.6k|    U_ASSERT(!other.bogus);
  ------------------
  |  |   35|  31.6k|#   define U_ASSERT(exp) (void)0
  ------------------
  540|  31.6k|    UErrorCode localErrorCode = U_ZERO_ERROR;
  541|  31.6k|    if (len == 0) {
  ------------------
  |  Branch (541:9): [True: 23.7k, False: 7.88k]
  ------------------
  542|  23.7k|        parts.adoptInstead(nullptr);
  543|  23.7k|    } else {
  544|  7.88k|        parts.adoptInstead(copyArray(other.parts.getAlias(), len, localErrorCode));
  545|  7.88k|    }
  546|  31.6k|    if (U_FAILURE(localErrorCode)) {
  ------------------
  |  Branch (546:9): [True: 0, False: 31.6k]
  ------------------
  547|      0|        bogus = true;
  548|      0|    }
  549|  31.6k|}
_ZN6icu_788message210data_model7Pattern7BuilderC2ER10UErrorCode:
  561|  7.07k|Pattern::Builder::Builder(UErrorCode& status) {
  562|  7.07k|    parts = createUVector(status);
  563|  7.07k|}
_ZNK6icu_788message210data_model7Pattern7Builder5buildER10UErrorCode:
  565|  7.07k|Pattern Pattern::Builder::build(UErrorCode& status) const noexcept {
  566|  7.07k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (566:9): [True: 314, False: 6.75k]
  ------------------
  567|    314|        return {};
  568|    314|    }
  569|  6.75k|    U_ASSERT(parts != nullptr);
  ------------------
  |  |   35|  6.75k|#   define U_ASSERT(exp) (void)0
  ------------------
  570|  6.75k|    return Pattern(*parts, status);
  571|  7.07k|}
_ZN6icu_788message210data_model7Pattern7Builder3addEONS1_10ExpressionER10UErrorCode:
  573|  9.77k|Pattern::Builder& Pattern::Builder::add(Expression&& part, UErrorCode& status) noexcept {
  574|  9.77k|    U_ASSERT(parts != nullptr);
  ------------------
  |  |   35|  9.77k|#   define U_ASSERT(exp) (void)0
  ------------------
  575|  9.77k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (575:9): [True: 9.77k, False: 0]
  ------------------
  576|  9.77k|        PatternPart* l = create<PatternPart>(PatternPart(std::move(part)), status);
  577|  9.77k|        parts->adoptElement(l, status);
  578|  9.77k|    }
  579|  9.77k|    return *this;
  580|  9.77k|}
_ZN6icu_788message210data_model7Pattern7Builder3addEONS1_6MarkupER10UErrorCode:
  582|  23.3k|Pattern::Builder& Pattern::Builder::add(Markup&& part, UErrorCode& status) noexcept {
  583|  23.3k|    U_ASSERT(parts != nullptr);
  ------------------
  |  |   35|  23.3k|#   define U_ASSERT(exp) (void)0
  ------------------
  584|  23.3k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (584:9): [True: 23.0k, False: 314]
  ------------------
  585|  23.0k|        PatternPart* l = create<PatternPart>(PatternPart(std::move(part)), status);
  586|  23.0k|        parts->adoptElement(l, status);
  587|  23.0k|    }
  588|  23.3k|    return *this;
  589|  23.3k|}
_ZN6icu_788message210data_model7Pattern7Builder3addEONS_13UnicodeStringER10UErrorCode:
  591|  12.1M|Pattern::Builder& Pattern::Builder::add(UnicodeString&& part, UErrorCode& status) noexcept {
  592|  12.1M|    U_ASSERT(parts != nullptr);
  ------------------
  |  |   35|  12.1M|#   define U_ASSERT(exp) (void)0
  ------------------
  593|  12.1M|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (593:9): [True: 12.1M, False: 0]
  ------------------
  594|  12.1M|        PatternPart* l = create<PatternPart>(PatternPart(std::move(part)), status);
  595|  12.1M|        parts->adoptElement(l, status);
  596|  12.1M|    }
  597|  12.1M|    return *this;
  598|  12.1M|}
_ZN6icu_788message210data_model7PatternaSES2_:
  600|  7.30k|Pattern& Pattern::operator=(Pattern other) noexcept {
  601|  7.30k|    swap(*this, other);
  602|       |
  603|  7.30k|    return *this;
  604|  7.30k|}
_ZN6icu_788message210data_model7Pattern7BuilderD2Ev:
  606|  7.07k|Pattern::Builder::~Builder() {
  607|  7.07k|    if (parts != nullptr) {
  ------------------
  |  Branch (607:9): [True: 7.07k, False: 0]
  ------------------
  608|  7.07k|        delete parts;
  609|  7.07k|    }
  610|  7.07k|}
_ZN6icu_788message210data_model7PatternD2Ev:
  612|  92.8k|Pattern::~Pattern() {}
_ZN6icu_788message210data_model7VariantC2ERKS2_:
  680|    265|Variant::Variant(const Variant& other) : k(other.k), p(other.p) {}
_ZN6icu_788message210data_model7VariantD2Ev:
  682|    538|Variant::~Variant() {}
_ZNK6icu_788message211MFDataModel25getLocalVariablesInternalEv:
  723|    503|const Binding* MFDataModel::getLocalVariablesInternal() const {
  724|    503|    U_ASSERT(!bogus);
  ------------------
  |  |   35|    503|#   define U_ASSERT(exp) (void)0
  ------------------
  725|    503|    U_ASSERT(bindingsLen == 0 || bindings.isValid());
  ------------------
  |  |   35|    503|#   define U_ASSERT(exp) (void)0
  ------------------
  726|    503|    return bindings.getAlias();
  727|    503|}
_ZN6icu_788message211MFDataModel7BuilderC2ER10UErrorCode:
  741|  7.59k|MFDataModel::Builder::Builder(UErrorCode& status) {
  742|  7.59k|    bindings = createUVector(status);
  743|  7.59k|}
_ZN6icu_788message211MFDataModel7Builder21buildSelectorsMessageER10UErrorCode:
  746|  66.5k|void MFDataModel::Builder::buildSelectorsMessage(UErrorCode& status) {
  747|  66.5k|    CHECK_ERROR(status);
  ------------------
  |  |   73|  66.5k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 8, False: 66.5k]
  |  |  ------------------
  |  |   74|      8|        return;                                                                                         \
  |  |   75|      8|    }
  ------------------
  748|       |
  749|  66.5k|    if (hasPattern) {
  ------------------
  |  Branch (749:9): [True: 534, False: 66.0k]
  ------------------
  750|    534|        selectors = createUVector(status);
  751|    534|        variants = createUVector(status);
  752|    534|        hasPattern = false;
  753|    534|    }
  754|  66.5k|    hasPattern = false;
  755|  66.5k|    hasSelectors = true;
  756|  66.5k|}
_ZN6icu_788message211MFDataModel7Builder11addSelectorEONS_13UnicodeStringER10UErrorCode:
  792|  66.3k|                                                        UErrorCode& status) {
  793|  66.3k|    THIS_ON_ERROR(status);
  ------------------
  |  |   85|  66.3k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (85:9): [True: 0, False: 66.3k]
  |  |  ------------------
  |  |   86|      0|        return *this; \
  |  |   87|      0|    }
  ------------------
  794|       |
  795|  66.3k|    buildSelectorsMessage(status);
  796|  66.3k|    U_ASSERT(selectors != nullptr);
  ------------------
  |  |   35|  66.3k|#   define U_ASSERT(exp) (void)0
  ------------------
  797|  66.3k|    selectors->adoptElement(create<VariableName>(std::move(selector), status), status);
  798|       |
  799|  66.3k|    return *this;
  800|  66.3k|}
_ZN6icu_788message211MFDataModel7Builder10addVariantEONS0_10data_model12SelectorKeysEONS3_7PatternER10UErrorCode:
  805|    273|MFDataModel::Builder& MFDataModel::Builder::addVariant(SelectorKeys&& keys, Pattern&& pattern, UErrorCode& errorCode) noexcept {
  806|    273|    buildSelectorsMessage(errorCode);
  807|    273|    Variant* v = create<Variant>(Variant(std::move(keys), std::move(pattern)), errorCode);
  808|    273|    if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (808:9): [True: 265, False: 8]
  ------------------
  809|    265|        variants->adoptElement(v, errorCode);
  810|    265|    }
  811|    273|    return *this;
  812|    273|}
_ZN6icu_788message211MFDataModel7Builder10setPatternEONS0_10data_model7PatternE:
  814|  6.79k|MFDataModel::Builder& MFDataModel::Builder::setPattern(Pattern&& pat) {
  815|  6.79k|    pattern = std::move(pat);
  816|  6.79k|    hasPattern = true;
  817|  6.79k|    hasSelectors = false;
  818|       |    // Invalidate variants
  819|  6.79k|    if (variants != nullptr) {
  ------------------
  |  Branch (819:9): [True: 0, False: 6.79k]
  ------------------
  820|      0|        variants->removeAllElements();
  821|      0|    }
  822|  6.79k|    return *this;
  823|  6.79k|}
_ZN6icu_788message211MFDataModelC2ERKS1_:
  825|    503|MFDataModel::MFDataModel(const MFDataModel& other) : body(Pattern()) {
  826|    503|    U_ASSERT(!other.bogus);
  ------------------
  |  |   35|    503|#   define U_ASSERT(exp) (void)0
  ------------------
  827|       |
  828|    503|    UErrorCode localErrorCode = U_ZERO_ERROR;
  829|       |
  830|    503|    if (other.hasPattern()) {
  ------------------
  |  Branch (830:9): [True: 503, False: 0]
  ------------------
  831|    503|        body = *std::get_if<Pattern>(&other.body);
  832|    503|    } else {
  833|      0|        const VariableName* otherSelectors = other.getSelectorsInternal();
  834|      0|        const Variant* otherVariants = other.getVariantsInternal();
  835|      0|        int32_t numSelectors = other.numSelectors();
  836|      0|        int32_t numVariants = other.numVariants();
  837|      0|        LocalArray<VariableName> copiedSelectors(copyArray(otherSelectors, numSelectors, localErrorCode), localErrorCode);
  838|      0|        LocalArray<Variant> copiedVariants(copyArray(otherVariants, numVariants, localErrorCode), localErrorCode);
  839|      0|        if (U_FAILURE(localErrorCode)) {
  ------------------
  |  Branch (839:13): [True: 0, False: 0]
  ------------------
  840|      0|            bogus = true;
  841|      0|            return;
  842|      0|        }
  843|      0|        body = Matcher(copiedSelectors.orphan(), numSelectors, copiedVariants.orphan(), numVariants);
  844|      0|    }
  845|       |
  846|    503|    bindingsLen = other.bindingsLen;
  847|    503|    if (bindingsLen > 0) {
  ------------------
  |  Branch (847:9): [True: 0, False: 503]
  ------------------
  848|      0|        bindings.adoptInstead(copyArray(other.bindings.getAlias(), bindingsLen, localErrorCode));
  849|      0|    }
  850|    503|    if (U_FAILURE(localErrorCode)) {
  ------------------
  |  Branch (850:9): [True: 0, False: 503]
  ------------------
  851|      0|        bogus = true;
  852|      0|    }
  853|    503|}
_ZN6icu_788message211MFDataModelC2ERKNS1_7BuilderER10UErrorCode:
  855|    503|MFDataModel::MFDataModel(const MFDataModel::Builder& builder, UErrorCode& errorCode) noexcept : body(Pattern()) {
  856|    503|    CHECK_ERROR(errorCode);
  ------------------
  |  |   73|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
  857|       |
  858|    503|    if (builder.hasPattern) {
  ------------------
  |  Branch (858:9): [True: 503, False: 0]
  ------------------
  859|    503|        body.emplace<Pattern>(builder.pattern);
  860|    503|    } else {
  861|      0|        U_ASSERT(builder.variants != nullptr);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  862|      0|        U_ASSERT(builder.selectors != nullptr);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  863|      0|        int32_t numVariants = builder.variants->size();
  864|      0|        int32_t numSelectors = builder.selectors->size();
  865|      0|        LocalArray<Variant> variants(copyVectorToArray<Variant>(*builder.variants, errorCode), errorCode);
  866|      0|        LocalArray<VariableName> selectors(copyVectorToArray<VariableName>(*builder.selectors,
  867|      0|                                                                           errorCode),
  868|      0|                                           errorCode);
  869|      0|        if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (869:13): [True: 0, False: 0]
  ------------------
  870|      0|            bogus = true;
  871|      0|            return;
  872|      0|        }
  873|      0|        body.emplace<Matcher>(Matcher(selectors.orphan(), numSelectors, variants.orphan(), numVariants));
  874|      0|    }
  875|       |
  876|    503|    U_ASSERT(builder.bindings != nullptr);
  ------------------
  |  |   35|    503|#   define U_ASSERT(exp) (void)0
  ------------------
  877|    503|    bindingsLen = builder.bindings->size();
  878|    503|    if (bindingsLen > 0) {
  ------------------
  |  Branch (878:9): [True: 0, False: 503]
  ------------------
  879|      0|        bindings.adoptInstead(copyVectorToArray<Binding>(*builder.bindings, errorCode));
  880|      0|    }
  881|    503|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (881:9): [True: 0, False: 503]
  ------------------
  882|      0|        bogus = true;
  883|      0|    }
  884|    503|}
_ZN6icu_788message211MFDataModelC2Ev:
  886|  22.2k|MFDataModel::MFDataModel() : body(Pattern()) {}
_ZN6icu_788message211MFDataModelaSES1_:
  888|  8.09k|MFDataModel& MFDataModel::operator=(MFDataModel other) noexcept {
  889|  8.09k|    U_ASSERT(!other.bogus);
  ------------------
  |  |   35|  8.09k|#   define U_ASSERT(exp) (void)0
  ------------------
  890|  8.09k|    swap(*this, other);
  891|  8.09k|    return *this;
  892|  8.09k|}
_ZNK6icu_788message211MFDataModel7Builder5buildER10UErrorCode:
  894|  7.59k|MFDataModel MFDataModel::Builder::build(UErrorCode& errorCode) const noexcept {
  895|  7.59k|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (895:9): [True: 7.09k, False: 503]
  ------------------
  896|  7.09k|        return {};
  897|  7.09k|    }
  898|    503|    if (!hasPattern && !hasSelectors) {
  ------------------
  |  Branch (898:9): [True: 0, False: 503]
  |  Branch (898:24): [True: 0, False: 0]
  ------------------
  899|      0|        errorCode = U_INVALID_STATE_ERROR;
  900|      0|    }
  901|    503|    return MFDataModel(*this, errorCode);
  902|  7.59k|}
_ZN6icu_788message211MFDataModelD2Ev:
  904|  23.2k|MFDataModel::~MFDataModel() {}
_ZN6icu_788message211MFDataModel7BuilderD2Ev:
  905|  7.59k|MFDataModel::Builder::~Builder() {
  906|  7.59k|    if (selectors != nullptr) {
  ------------------
  |  Branch (906:9): [True: 534, False: 7.06k]
  ------------------
  907|    534|        delete selectors;
  908|    534|    }
  909|  7.59k|    if (variants != nullptr) {
  ------------------
  |  Branch (909:9): [True: 534, False: 7.06k]
  ------------------
  910|    534|        delete variants;
  911|    534|    }
  912|  7.59k|    if (bindings != nullptr) {
  ------------------
  |  Branch (912:9): [True: 7.59k, False: 0]
  ------------------
  913|  7.59k|        delete bindings;
  914|  7.59k|    }
  915|  7.59k|}
messageformat2_data_model.cpp:_ZN6icu_788message2L14hasOptionNamedERKNS_7UVectorERKNS_13UnicodeStringE:
  283|  7.52k|static UBool hasOptionNamed(const UVector& v, const UnicodeString& s) {
  284|  11.8k|    for (int32_t i = 0; i < v.size(); i++) {
  ------------------
  |  Branch (284:25): [True: 6.57k, False: 5.27k]
  ------------------
  285|  6.57k|        const Option* opt = static_cast<Option*>(v[i]);
  286|  6.57k|        U_ASSERT(opt != nullptr);
  ------------------
  |  |   35|  6.57k|#   define U_ASSERT(exp) (void)0
  ------------------
  287|  6.57k|        if (opt->getName() == s) {
  ------------------
  |  Branch (287:13): [True: 2.25k, False: 4.31k]
  ------------------
  288|  2.25k|            return true;
  289|  2.25k|        }
  290|  6.57k|    }
  291|  5.27k|    return false;
  292|  7.52k|}

_ZN6icu_788message212StaticErrors22setDuplicateOptionNameER10UErrorCode:
   44|  2.25k|    void StaticErrors::setDuplicateOptionName(UErrorCode& status) {
   45|  2.25k|        addError(StaticError(StaticErrorType::DuplicateOptionName), status);
   46|  2.25k|    }
_ZN6icu_788message212StaticErrorsC2ER10UErrorCode:
   68|  15.1k|    StaticErrors::StaticErrors(UErrorCode& status) {
   69|  15.1k|        syntaxAndDataModelErrors.adoptInstead(createUVector(status));
   70|  15.1k|    }
_ZN6icu_788message212StaticErrorsC2EOS1_:
   72|  7.59k|    StaticErrors::StaticErrors(StaticErrors&& other) noexcept {
   73|  7.59k|        U_ASSERT(other.syntaxAndDataModelErrors.isValid());
  ------------------
  |  |   35|  7.59k|#   define U_ASSERT(exp) (void)0
  ------------------
   74|  7.59k|        syntaxAndDataModelErrors.adoptInstead(other.syntaxAndDataModelErrors.orphan());
   75|  7.59k|        dataModelError = other.dataModelError;
   76|  7.59k|        missingSelectorAnnotationError = other.missingSelectorAnnotationError;
   77|  7.59k|        syntaxError = other.syntaxError;
   78|  7.59k|    }
_ZN6icu_788message212StaticErrorsC2ERKS1_R10UErrorCode:
   80|    503|    StaticErrors::StaticErrors(const StaticErrors& other, UErrorCode& errorCode) {
   81|    503|        CHECK_ERROR(errorCode);
  ------------------
  |  |   73|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
   82|       |
   83|    503|        U_ASSERT(other.syntaxAndDataModelErrors.isValid());
  ------------------
  |  |   35|    503|#   define U_ASSERT(exp) (void)0
  ------------------
   84|    503|        syntaxAndDataModelErrors.adoptInstead(createUVector(errorCode));
   85|    503|        CHECK_ERROR(errorCode);
  ------------------
  |  |   73|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
   86|    950|        for (int32_t i = 0; i < other.syntaxAndDataModelErrors->size(); i++) {
  ------------------
  |  Branch (86:29): [True: 447, False: 503]
  ------------------
   87|    447|            StaticError* e = static_cast<StaticError*>(other.syntaxAndDataModelErrors->elementAt(i));
   88|    447|            U_ASSERT(e != nullptr);
  ------------------
  |  |   35|    447|#   define U_ASSERT(exp) (void)0
  ------------------
   89|    447|            StaticError* copy = new StaticError(*e);
   90|    447|            if (copy == nullptr) {
  ------------------
  |  Branch (90:17): [True: 0, False: 447]
  ------------------
   91|      0|                errorCode = U_MEMORY_ALLOCATION_ERROR;
   92|      0|                return;
   93|      0|            }
   94|    447|            syntaxAndDataModelErrors->adoptElement(copy, errorCode);
   95|    447|        }
   96|    503|        dataModelError = other.dataModelError;
   97|    503|        missingSelectorAnnotationError = other.missingSelectorAnnotationError;
   98|    503|        syntaxError = other.syntaxError;
   99|    503|    }
_ZN6icu_788message212StaticErrors14addSyntaxErrorER10UErrorCode:
  164|  7.43k|    void StaticErrors::addSyntaxError(UErrorCode& status) {
  165|  7.43k|        addError(StaticError(StaticErrorType::SyntaxError), status);
  166|  7.43k|    }
_ZN6icu_788message212StaticErrors8addErrorEONS0_5ErrorINS0_15StaticErrorTypeEEER10UErrorCode:
  168|  9.69k|    void StaticErrors::addError(StaticError&& e, UErrorCode& status) {
  169|  9.69k|        CHECK_ERROR(status);
  ------------------
  |  |   73|  9.69k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 5, False: 9.69k]
  |  |  ------------------
  |  |   74|      5|        return;                                                                                         \
  |  |   75|      5|    }
  ------------------
  170|       |
  171|  9.69k|        StaticErrorType type = e.type;
  172|       |
  173|  9.69k|        void* errorP = static_cast<void*>(create<StaticError>(std::move(e), status));
  174|  9.69k|        U_ASSERT(syntaxAndDataModelErrors.isValid());
  ------------------
  |  |   35|  9.69k|#   define U_ASSERT(exp) (void)0
  ------------------
  175|       |
  176|  9.69k|        switch (type) {
  ------------------
  |  Branch (176:17): [True: 0, False: 9.69k]
  ------------------
  177|  7.43k|        case StaticErrorType::SyntaxError: {
  ------------------
  |  Branch (177:9): [True: 7.43k, False: 2.25k]
  ------------------
  178|  7.43k|            syntaxError = true;
  179|  7.43k|            break;
  180|      0|        }
  181|      0|        case StaticErrorType::DuplicateDeclarationError: {
  ------------------
  |  Branch (181:9): [True: 0, False: 9.69k]
  ------------------
  182|      0|            dataModelError = true;
  183|      0|            break;
  184|      0|        }
  185|  2.25k|        case StaticErrorType::DuplicateOptionName: {
  ------------------
  |  Branch (185:9): [True: 2.25k, False: 7.43k]
  ------------------
  186|  2.25k|            dataModelError = true;
  187|  2.25k|            break;
  188|      0|        }
  189|      0|        case StaticErrorType::VariantKeyMismatchError: {
  ------------------
  |  Branch (189:9): [True: 0, False: 9.69k]
  ------------------
  190|      0|            dataModelError = true;
  191|      0|            break;
  192|      0|        }
  193|      0|        case StaticErrorType::DuplicateVariant: {
  ------------------
  |  Branch (193:9): [True: 0, False: 9.69k]
  ------------------
  194|      0|            dataModelError = true;
  195|      0|            break;
  196|      0|        }
  197|      0|        case StaticErrorType::NonexhaustivePattern: {
  ------------------
  |  Branch (197:9): [True: 0, False: 9.69k]
  ------------------
  198|      0|            dataModelError = true;
  199|      0|            break;
  200|      0|        }
  201|      0|        case StaticErrorType::MissingSelectorAnnotation: {
  ------------------
  |  Branch (201:9): [True: 0, False: 9.69k]
  ------------------
  202|      0|            missingSelectorAnnotationError = true;
  203|      0|            dataModelError = true;
  204|      0|            break;
  205|      0|        }
  206|  9.69k|        }
  207|  9.69k|        syntaxAndDataModelErrors->adoptElement(errorP, status);
  208|  9.69k|    }
_ZNK6icu_788message212StaticErrors11checkErrorsER10UErrorCode:
  256|  7.08k|    void StaticErrors::checkErrors(UErrorCode& status) const {
  257|  7.08k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (257:13): [True: 310, False: 6.77k]
  ------------------
  258|    310|            return;
  259|    310|        }
  260|  6.77k|        if (syntaxAndDataModelErrors->size() > 0) {
  ------------------
  |  Branch (260:13): [True: 6.77k, False: 0]
  ------------------
  261|  6.77k|            switch (first().type) {
  ------------------
  |  Branch (261:21): [True: 0, False: 6.77k]
  ------------------
  262|      0|            case StaticErrorType::DuplicateDeclarationError: {
  ------------------
  |  Branch (262:13): [True: 0, False: 6.77k]
  ------------------
  263|      0|                status = U_MF_DUPLICATE_DECLARATION_ERROR;
  264|      0|                break;
  265|      0|            }
  266|      6|            case StaticErrorType::DuplicateOptionName: {
  ------------------
  |  Branch (266:13): [True: 6, False: 6.77k]
  ------------------
  267|      6|                status = U_MF_DUPLICATE_OPTION_NAME_ERROR;
  268|      6|                break;
  269|      0|            }
  270|      0|            case StaticErrorType::VariantKeyMismatchError: {
  ------------------
  |  Branch (270:13): [True: 0, False: 6.77k]
  ------------------
  271|      0|                status = U_MF_VARIANT_KEY_MISMATCH_ERROR;
  272|      0|                break;
  273|      0|            }
  274|      0|            case StaticErrorType::DuplicateVariant: {
  ------------------
  |  Branch (274:13): [True: 0, False: 6.77k]
  ------------------
  275|      0|                status = U_MF_DUPLICATE_VARIANT_ERROR;
  276|      0|                break;
  277|      0|            }
  278|      0|            case StaticErrorType::NonexhaustivePattern: {
  ------------------
  |  Branch (278:13): [True: 0, False: 6.77k]
  ------------------
  279|      0|                status = U_MF_NONEXHAUSTIVE_PATTERN_ERROR;
  280|      0|                break;
  281|      0|            }
  282|      0|            case StaticErrorType::MissingSelectorAnnotation: {
  ------------------
  |  Branch (282:13): [True: 0, False: 6.77k]
  ------------------
  283|      0|                status = U_MF_MISSING_SELECTOR_ANNOTATION_ERROR;
  284|      0|                break;
  285|      0|            }
  286|  6.77k|            case StaticErrorType::SyntaxError: {
  ------------------
  |  Branch (286:13): [True: 6.77k, False: 6]
  ------------------
  287|  6.77k|                status = U_MF_SYNTAX_ERROR;
  288|  6.77k|                break;
  289|      0|            }
  290|  6.77k|            }
  291|  6.77k|        }
  292|  6.77k|    }
_ZNK6icu_788message212StaticErrors5firstEv:
  294|  6.77k|    const StaticError& StaticErrors::first() const {
  295|  6.77k|        U_ASSERT(syntaxAndDataModelErrors.isValid() && syntaxAndDataModelErrors->size() > 0);
  ------------------
  |  |   35|  6.77k|#   define U_ASSERT(exp) (void)0
  ------------------
  296|  6.77k|        return *static_cast<StaticError*>(syntaxAndDataModelErrors->elementAt(0));
  297|  6.77k|    }
_ZN6icu_788message212StaticErrorsD2Ev:
  299|  23.2k|    StaticErrors::~StaticErrors() {}
_ZN6icu_788message25ErrorINS0_15StaticErrorTypeEED2Ev:
  306|  19.8k|    Error<StaticErrorType>::~Error() {}

_ZNK6icu_788message212StaticErrors14hasSyntaxErrorEv:
  111|  14.3M|        bool hasSyntaxError() const { return syntaxError; }
_ZN6icu_788message25ErrorINS0_15StaticErrorTypeEEC2ES2_:
   45|  9.69k|        Error(ErrorType ty) : type(ty) {}

_ZN6icu_788message216MessageFormatter7Builder10clearStateEv:
   32|  7.59k|    void MessageFormatter::Builder::clearState() {
   33|  7.59k|        normalizedInput.remove();
   34|  7.59k|        delete errors;
   35|  7.59k|        errors = nullptr;
   36|  7.59k|    }
_ZN6icu_788message216MessageFormatter7Builder10setPatternERKNS_13UnicodeStringER11UParseErrorR10UErrorCode:
   40|  7.59k|                                                                     UErrorCode& errorCode) {
   41|  7.59k|        clearState();
   42|       |        // Create errors
   43|  7.59k|        errors = create<StaticErrors>(StaticErrors(errorCode), errorCode);
   44|  7.59k|        THIS_ON_ERROR(errorCode);
  ------------------
  |  |   85|  7.59k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (85:9): [True: 0, False: 7.59k]
  |  |  ------------------
  |  |   86|      0|        return *this; \
  |  |   87|      0|    }
  ------------------
   45|       |
   46|       |        // Parse the pattern
   47|  7.59k|        MFDataModel::Builder tree(errorCode);
   48|  7.59k|        Parser(pat, tree, *errors, normalizedInput, errorCode)
   49|  7.59k|            .parse(parseError, errorCode);
   50|       |
   51|       |        // Fail on syntax errors
   52|  7.59k|        if (errors->hasSyntaxError()) {
  ------------------
  |  Branch (52:13): [True: 7.08k, False: 507]
  ------------------
   53|  7.08k|            errors->checkErrors(errorCode);
   54|       |            // Check that the checkErrors() method set the error code
   55|  7.08k|            U_ASSERT(U_FAILURE(errorCode));
  ------------------
  |  |   35|  7.08k|#   define U_ASSERT(exp) (void)0
  ------------------
   56|  7.08k|        }
   57|       |
   58|       |        // Build the data model based on what was parsed
   59|  7.59k|        dataModel = tree.build(errorCode);
   60|  7.59k|        hasDataModel = true;
   61|  7.59k|        hasPattern = true;
   62|  7.59k|        pattern = pat;
   63|       |
   64|  7.59k|        return *this;
   65|  7.59k|    }
_ZNK6icu_788message216MessageFormatter7Builder5buildER10UErrorCode:
  100|  7.59k|    MessageFormatter MessageFormatter::Builder::build(UErrorCode& errorCode) const {
  101|  7.59k|        return MessageFormatter(*this, errorCode);
  102|  7.59k|    }
_ZN6icu_788message216MessageFormatter7BuilderC2ER10UErrorCode:
  104|  7.59k|    MessageFormatter::Builder::Builder(UErrorCode& errorCode) : locale(Locale::getDefault()), customMFFunctionRegistry(nullptr) {
  105|       |        // Initialize errors
  106|  7.59k|        errors = new StaticErrors(errorCode);
  107|  7.59k|        CHECK_ERROR(errorCode);
  ------------------
  |  |   73|  7.59k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 7.59k]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
  108|  7.59k|        if (errors == nullptr) {
  ------------------
  |  Branch (108:13): [True: 0, False: 7.59k]
  ------------------
  109|      0|            errorCode = U_MEMORY_ALLOCATION_ERROR;
  110|      0|        }
  111|  7.59k|    }
_ZN6icu_788message216MessageFormatter7BuilderD2Ev:
  113|  7.59k|    MessageFormatter::Builder::~Builder() {
  114|  7.59k|        if (errors != nullptr) {
  ------------------
  |  Branch (114:13): [True: 7.59k, False: 0]
  ------------------
  115|  7.59k|            delete errors;
  116|  7.59k|            errors = nullptr;
  117|  7.59k|        }
  118|  7.59k|    }
_ZN6icu_788message216MessageFormatterC2ERKNS1_7BuilderER10UErrorCode:
  122|  7.59k|    MessageFormatter::MessageFormatter(const MessageFormatter::Builder& builder, UErrorCode &success) : locale(builder.locale), customMFFunctionRegistry(builder.customMFFunctionRegistry) {
  123|  7.59k|        CHECK_ERROR(success);
  ------------------
  |  |   73|  7.59k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 7.09k, False: 503]
  |  |  ------------------
  |  |   74|  7.09k|        return;                                                                                         \
  |  |   75|  7.09k|    }
  ------------------
  124|       |
  125|       |        // Set up the standard function registry
  126|    503|        MFFunctionRegistry::Builder standardFunctionsBuilder(success);
  127|       |
  128|    503|        FormatterFactory* dateTime = StandardFunctions::DateTimeFactory::dateTime(success);
  129|    503|        FormatterFactory* date = StandardFunctions::DateTimeFactory::date(success);
  130|    503|        FormatterFactory* time = StandardFunctions::DateTimeFactory::time(success);
  131|    503|        FormatterFactory* number = new StandardFunctions::NumberFactory();
  132|    503|        FormatterFactory* integer = new StandardFunctions::IntegerFactory();
  133|    503|        standardFunctionsBuilder.adoptFormatter(FunctionName(functions::DATETIME), dateTime, success)
  134|    503|            .adoptFormatter(FunctionName(functions::DATE), date, success)
  135|    503|            .adoptFormatter(FunctionName(functions::TIME), time, success)
  136|    503|            .adoptFormatter(FunctionName(functions::NUMBER), number, success)
  137|    503|            .adoptFormatter(FunctionName(functions::INTEGER), integer, success)
  138|    503|            .adoptFormatter(FunctionName(functions::TEST_FUNCTION), new StandardFunctions::TestFormatFactory(), success)
  139|    503|            .adoptFormatter(FunctionName(functions::TEST_FORMAT), new StandardFunctions::TestFormatFactory(), success)
  140|    503|            .adoptSelector(FunctionName(functions::NUMBER), new StandardFunctions::PluralFactory(UPLURAL_TYPE_CARDINAL), success)
  141|    503|            .adoptSelector(FunctionName(functions::INTEGER), new StandardFunctions::PluralFactory(StandardFunctions::PluralFactory::integer()), success)
  142|    503|            .adoptSelector(FunctionName(functions::STRING), new StandardFunctions::TextFactory(), success)
  143|    503|            .adoptSelector(FunctionName(functions::TEST_FUNCTION), new StandardFunctions::TestSelectFactory(), success)
  144|    503|            .adoptSelector(FunctionName(functions::TEST_SELECT), new StandardFunctions::TestSelectFactory(), success);
  145|    503|        CHECK_ERROR(success);
  ------------------
  |  |   73|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
  146|    503|        standardMFFunctionRegistry = standardFunctionsBuilder.build();
  147|    503|        CHECK_ERROR(success);
  ------------------
  |  |   73|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
  148|    503|        standardMFFunctionRegistry.checkStandard();
  149|       |
  150|    503|        normalizedInput = builder.normalizedInput;
  151|    503|        signalErrors = builder.signalErrors;
  152|       |
  153|       |        // Build data model
  154|       |        // First, check that there is a data model
  155|       |        // (which might have been set by setDataModel(), or to
  156|       |        // the data model parsed from the pattern by setPattern())
  157|       |
  158|    503|        if (!builder.hasDataModel) {
  ------------------
  |  Branch (158:13): [True: 0, False: 503]
  ------------------
  159|      0|            success = U_INVALID_STATE_ERROR;
  160|      0|            return;
  161|      0|        }
  162|       |
  163|    503|        dataModel = builder.dataModel;
  164|    503|        if (builder.errors != nullptr) {
  ------------------
  |  Branch (164:13): [True: 503, False: 0]
  ------------------
  165|    503|            errors = new StaticErrors(*builder.errors, success);
  166|    503|        } else {
  167|       |            // Initialize errors
  168|      0|            LocalPointer<StaticErrors> errorsNew(new StaticErrors(success));
  169|      0|            CHECK_ERROR(success);
  ------------------
  |  |   73|      0|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 0]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
  170|      0|            errors = errorsNew.orphan();
  171|      0|        }
  172|       |
  173|       |        // Note: we currently evaluate variables lazily,
  174|       |        // without memoization. This call is still necessary
  175|       |        // to check out-of-scope uses of local variables in
  176|       |        // right-hand sides (unresolved variable errors can
  177|       |        // only be checked when arguments are known)
  178|       |
  179|       |        // Check for resolution errors
  180|    503|        Checker(dataModel, *errors, *this).check(success);
  181|    503|    }
_ZN6icu_788message216MessageFormatter7cleanupEv:
  183|  7.59k|    void MessageFormatter::cleanup() noexcept {
  184|  7.59k|        if (errors != nullptr) {
  ------------------
  |  Branch (184:13): [True: 503, False: 7.09k]
  ------------------
  185|    503|            delete errors;
  186|    503|            errors = nullptr;
  187|    503|        }
  188|  7.59k|    }
_ZN6icu_788message216MessageFormatterD2Ev:
  220|  7.59k|    MessageFormatter::~MessageFormatter() {
  221|  7.59k|        cleanup();
  222|  7.59k|    }

_ZN6icu_788message216FormatterFactoryD2Ev:
   51|  3.52k|FormatterFactory::~FormatterFactory() {}
_ZN6icu_788message215SelectorFactoryD2Ev:
   52|  2.51k|SelectorFactory::~SelectorFactory() {}
_ZN6icu_788message218MFFunctionRegistry7Builder5buildEv:
   54|    503|MFFunctionRegistry MFFunctionRegistry::Builder::build() {
   55|    503|    U_ASSERT(formatters != nullptr && selectors != nullptr && formattersByType != nullptr);
  ------------------
  |  |   35|    503|#   define U_ASSERT(exp) (void)0
  ------------------
   56|    503|    MFFunctionRegistry result = MFFunctionRegistry(formatters, selectors, formattersByType);
   57|    503|    formatters = nullptr;
   58|    503|    selectors = nullptr;
   59|    503|    formattersByType = nullptr;
   60|    503|    return result;
   61|    503|}
_ZN6icu_788message218MFFunctionRegistry7Builder13adoptSelectorERKNS_13UnicodeStringEPNS0_15SelectorFactoryER10UErrorCode:
   63|  2.51k|MFFunctionRegistry::Builder& MFFunctionRegistry::Builder::adoptSelector(const FunctionName& selectorName, SelectorFactory* selectorFactory, UErrorCode& errorCode) {
   64|  2.51k|    if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (64:9): [True: 2.51k, False: 0]
  ------------------
   65|  2.51k|        U_ASSERT(selectors != nullptr);
  ------------------
  |  |   35|  2.51k|#   define U_ASSERT(exp) (void)0
  ------------------
   66|  2.51k|        selectors->put(selectorName, selectorFactory, errorCode);
   67|  2.51k|    }
   68|  2.51k|    return *this;
   69|  2.51k|}
_ZN6icu_788message218MFFunctionRegistry7Builder14adoptFormatterERKNS_13UnicodeStringEPNS0_16FormatterFactoryER10UErrorCode:
   71|  3.52k|MFFunctionRegistry::Builder& MFFunctionRegistry::Builder::adoptFormatter(const FunctionName& formatterName, FormatterFactory* formatterFactory, UErrorCode& errorCode) {
   72|  3.52k|    if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (72:9): [True: 3.52k, False: 0]
  ------------------
   73|  3.52k|        U_ASSERT(formatters != nullptr);
  ------------------
  |  |   35|  3.52k|#   define U_ASSERT(exp) (void)0
  ------------------
   74|  3.52k|        formatters->put(formatterName, formatterFactory, errorCode);
   75|  3.52k|    }
   76|  3.52k|    return *this;
   77|  3.52k|}
_ZN6icu_788message218MFFunctionRegistry7BuilderC2ER10UErrorCode:
   88|    503|MFFunctionRegistry::Builder::Builder(UErrorCode& errorCode) {
   89|    503|    CHECK_ERROR(errorCode);
  ------------------
  |  |   73|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
   90|       |
   91|    503|    formatters = new Hashtable();
   92|    503|    selectors = new Hashtable();
   93|    503|    formattersByType = new Hashtable();
   94|    503|    if (!(formatters != nullptr && selectors != nullptr && formattersByType != nullptr)) {
  ------------------
  |  Branch (94:11): [True: 503, False: 0]
  |  Branch (94:36): [True: 503, False: 0]
  |  Branch (94:60): [True: 503, False: 0]
  ------------------
   95|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
   96|    503|    } else {
   97|    503|        formatters->setValueDeleter(uprv_deleteUObject);
  ------------------
  |  | 1489|    503|#define uprv_deleteUObject U_ICU_ENTRY_POINT_RENAME(uprv_deleteUObject)
  |  |  ------------------
  |  |  |  |  123|    503|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    503|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    503|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|    503|        selectors->setValueDeleter(uprv_deleteUObject);
  ------------------
  |  | 1489|    503|#define uprv_deleteUObject U_ICU_ENTRY_POINT_RENAME(uprv_deleteUObject)
  |  |  ------------------
  |  |  |  |  123|    503|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    503|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    503|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   99|    503|        formattersByType->setValueDeleter(uprv_deleteUObject);
  ------------------
  |  | 1489|    503|#define uprv_deleteUObject U_ICU_ENTRY_POINT_RENAME(uprv_deleteUObject)
  |  |  ------------------
  |  |  |  |  123|    503|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    503|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    503|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  100|    503|    }
  101|    503|}
_ZN6icu_788message218MFFunctionRegistry7BuilderD2Ev:
  103|    503|MFFunctionRegistry::Builder::~Builder() {
  104|    503|    if (formatters != nullptr) {
  ------------------
  |  Branch (104:9): [True: 0, False: 503]
  ------------------
  105|      0|        delete formatters;
  106|      0|    }
  107|    503|    if (selectors != nullptr) {
  ------------------
  |  Branch (107:9): [True: 0, False: 503]
  ------------------
  108|      0|        delete selectors;
  109|      0|    }
  110|    503|    if (formattersByType != nullptr) {
  ------------------
  |  Branch (110:9): [True: 0, False: 503]
  ------------------
  111|      0|        delete formattersByType;
  112|      0|    }
  113|    503|}
_ZNK6icu_788message218MFFunctionRegistry14checkFormatterEPKc:
  147|  3.52k|void MFFunctionRegistry::checkFormatter(const char* s) const {
  148|       |#if U_DEBUG
  149|       |    U_ASSERT(hasFormatter(FunctionName(UnicodeString(s))));
  150|       |#else
  151|  3.52k|   (void) s;
  152|  3.52k|#endif
  153|  3.52k|}
_ZNK6icu_788message218MFFunctionRegistry13checkSelectorEPKc:
  155|  2.51k|void MFFunctionRegistry::checkSelector(const char* s) const {
  156|       |#if U_DEBUG
  157|       |    U_ASSERT(hasSelector(FunctionName(UnicodeString(s))));
  158|       |#else
  159|  2.51k|    (void) s;
  160|  2.51k|#endif
  161|  2.51k|}
_ZNK6icu_788message218MFFunctionRegistry13checkStandardEv:
  164|    503|void MFFunctionRegistry::checkStandard() const {
  165|    503|    checkFormatter("datetime");
  166|    503|    checkFormatter("date");
  167|    503|    checkFormatter("time");
  168|    503|    checkFormatter("number");
  169|    503|    checkFormatter("integer");
  170|    503|    checkFormatter("test:function");
  171|    503|    checkFormatter("test:format");
  172|    503|    checkSelector("number");
  173|    503|    checkSelector("integer");
  174|    503|    checkSelector("string");
  175|    503|    checkSelector("test:function");
  176|    503|    checkSelector("test:select");
  177|    503|}
_ZN6icu_788message218MFFunctionRegistryC2EPNS_9HashtableES3_S3_:
  254|    503|MFFunctionRegistry::MFFunctionRegistry(FormatterMap* f, SelectorMap* s, Hashtable* byType) : formatters(f), selectors(s), formattersByType(byType) {
  255|    503|    U_ASSERT(f != nullptr && s != nullptr && byType != nullptr);
  ------------------
  |  |   35|    503|#   define U_ASSERT(exp) (void)0
  ------------------
  256|    503|}
_ZN6icu_788message218MFFunctionRegistryaSEOS1_:
  258|    503|MFFunctionRegistry& MFFunctionRegistry::operator=(MFFunctionRegistry&& other) noexcept {
  259|    503|    cleanup();
  260|       |
  261|    503|    formatters = other.formatters;
  262|    503|    selectors = other.selectors;
  263|    503|    formattersByType = other.formattersByType;
  264|    503|    other.formatters = nullptr;
  265|    503|    other.selectors = nullptr;
  266|    503|    other.formattersByType = nullptr;
  267|       |
  268|    503|    return *this;
  269|    503|}
_ZN6icu_788message218MFFunctionRegistry7cleanupEv:
  271|  8.60k|void MFFunctionRegistry::cleanup() noexcept {
  272|  8.60k|    if (formatters != nullptr) {
  ------------------
  |  Branch (272:9): [True: 503, False: 8.09k]
  ------------------
  273|    503|        delete formatters;
  274|    503|    }
  275|  8.60k|    if (selectors != nullptr) {
  ------------------
  |  Branch (275:9): [True: 503, False: 8.09k]
  ------------------
  276|    503|        delete selectors;
  277|    503|    }
  278|  8.60k|    if (formattersByType != nullptr) {
  ------------------
  |  Branch (278:9): [True: 503, False: 8.09k]
  ------------------
  279|    503|        delete formattersByType;
  280|    503|    }
  281|  8.60k|}
_ZN6icu_788message218MFFunctionRegistryD2Ev:
  284|  8.09k|MFFunctionRegistry::~MFFunctionRegistry() {
  285|  8.09k|    cleanup();
  286|  8.09k|}
_ZN6icu_788message217StandardFunctions15DateTimeFactory8dateTimeER10UErrorCode:
 1102|    503|/* static */ StandardFunctions::DateTimeFactory* StandardFunctions::DateTimeFactory::dateTime(UErrorCode& errorCode) {
 1103|    503|    NULL_ON_ERROR(errorCode);
  ------------------
  |  |   79|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (79:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   80|      0|        return nullptr;                                                                                         \
  |  |   81|      0|    }
  ------------------
 1104|       |
 1105|    503|    DateTimeFactory* result = new StandardFunctions::DateTimeFactory(DateTimeType::DateTime);
 1106|    503|    if (result == nullptr) {
  ------------------
  |  Branch (1106:9): [True: 0, False: 503]
  ------------------
 1107|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
 1108|      0|    }
 1109|    503|    return result;
 1110|    503|}
_ZN6icu_788message217StandardFunctions15DateTimeFactory4dateER10UErrorCode:
 1112|    503|/* static */ StandardFunctions::DateTimeFactory* StandardFunctions::DateTimeFactory::date(UErrorCode& errorCode) {
 1113|    503|    NULL_ON_ERROR(errorCode);
  ------------------
  |  |   79|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (79:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   80|      0|        return nullptr;                                                                                         \
  |  |   81|      0|    }
  ------------------
 1114|       |
 1115|    503|    DateTimeFactory* result = new DateTimeFactory(DateTimeType::Date);
 1116|    503|    if (result == nullptr) {
  ------------------
  |  Branch (1116:9): [True: 0, False: 503]
  ------------------
 1117|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
 1118|      0|    }
 1119|    503|    return result;
 1120|    503|}
_ZN6icu_788message217StandardFunctions15DateTimeFactory4timeER10UErrorCode:
 1122|    503|/* static */ StandardFunctions::DateTimeFactory* StandardFunctions::DateTimeFactory::time(UErrorCode& errorCode) {
 1123|    503|    NULL_ON_ERROR(errorCode);
  ------------------
  |  |   79|    503|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (79:9): [True: 0, False: 503]
  |  |  ------------------
  |  |   80|      0|        return nullptr;                                                                                         \
  |  |   81|      0|    }
  ------------------
 1124|       |
 1125|    503|    DateTimeFactory* result = new DateTimeFactory(DateTimeType::Time);
 1126|    503|    if (result == nullptr) {
  ------------------
  |  Branch (1126:9): [True: 0, False: 503]
  ------------------
 1127|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
 1128|      0|    }
 1129|    503|    return result;
 1130|    503|}

_ZN6icu_788message217StandardFunctions17TestFormatFactoryC2Ev:
  280|  1.00k|            TestFormatFactory() {}
_ZN6icu_788message217StandardFunctions13PluralFactoryC2Eb:
  214|  1.00k|            PluralFactory(bool isInt) : isInteger(isInt) {}
_ZN6icu_788message217StandardFunctions13PluralFactory7integerEv:
  215|    503|            static PluralFactory integer() { return PluralFactory(true);}
_ZN6icu_788message217StandardFunctions17TestSelectFactoryC2Ev:
  309|  1.00k|            TestSelectFactory() {}
_ZN6icu_788message217StandardFunctions15DateTimeFactoryC2ENS2_12DateTimeTypeE:
  116|  1.50k|            DateTimeFactory(DateTimeType t) : type(t) {}

_ZN6icu_788message26Parser16maybeAdvanceLineEv:
   46|  12.5M|void Parser::maybeAdvanceLine() {
   47|  12.5M|    if (peek() == LF) {
  ------------------
  |  |   36|  12.5M|#define LF ((UChar32)0x000A)
  ------------------
  |  Branch (47:9): [True: 90.6k, False: 12.4M]
  ------------------
   48|  90.6k|        parseError.line++;
   49|       |        // add 1 to index to get the number of characters seen so far
   50|       |        // (including the newline)
   51|  90.6k|        parseError.lengthBeforeCurrentLine = index + 1;
   52|  90.6k|    }
   53|  12.5M|}
_ZN6icu_788message26Parser19translateParseErrorERKNS1_17MessageParseErrorER11UParseError:
   82|  7.28k|/* static */ void Parser::translateParseError(const MessageParseError &messageParseError, UParseError &parseError) {
   83|  7.28k|    parseError.line = messageParseError.line;
   84|  7.28k|    parseError.offset = messageParseError.offset;
   85|  7.28k|    copyContext(messageParseError.preContext, parseError.preContext);
   86|  7.28k|    copyContext(messageParseError.postContext, parseError.postContext);
   87|  7.28k|}
_ZN6icu_788message26Parser13setParseErrorERNS1_17MessageParseErrorEj:
   89|  7.09k|/* static */ void Parser::setParseError(MessageParseError &parseError, uint32_t index) {
   90|       |    // Translate absolute to relative offset
   91|  7.09k|    parseError.offset = index                               // Start with total number of characters seen
   92|  7.09k|                      - parseError.lengthBeforeCurrentLine; // Subtract all characters before the current line
   93|       |    // TODO: Fill this in with actual pre and post-context
   94|  7.09k|    parseError.preContext[0] = 0;
   95|  7.09k|    parseError.postContext[0] = 0;
   96|  7.09k|}
_ZN6icu_788message216initContentCharsER10UErrorCode:
  112|      1|UnicodeSet* initContentChars(UErrorCode& status) {
  113|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (113:9): [True: 0, False: 1]
  ------------------
  114|      0|        return nullptr;
  115|      0|    }
  116|       |
  117|      1|    UnicodeSet* result = new UnicodeSet(0x0001, 0x0008); // Omit NULL, HTAB and LF
  118|      1|    if (result == nullptr) {
  ------------------
  |  Branch (118:9): [True: 0, False: 1]
  ------------------
  119|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  120|      0|        return nullptr;
  121|      0|    }
  122|      1|    result->add(0x000B, 0x000C); // Omit CR
  123|      1|    result->add(0x000E, 0x001F); // Omit SP
  124|      1|    result->add(0x0021, 0x002D); // Omit '.'
  125|      1|    result->add(0x002F, 0x003F); // Omit '@'
  126|      1|    result->add(0x0041, 0x005B); // Omit '\'
  127|      1|    result->add(0x005D, 0x007A); // Omit { | }
  128|      1|    result->add(0x007E, 0x2FFF); // Omit IDEOGRAPHIC_SPACE
  129|      1|    result->add(0x3001, 0x10FFFF); // Allowing surrogates is intentional
  130|      1|    result->freeze();
  131|      1|    return result;
  132|      1|}
_ZN6icu_788message214initWhitespaceER10UErrorCode:
  134|      1|UnicodeSet* initWhitespace(UErrorCode& status) {
  135|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (135:9): [True: 0, False: 1]
  ------------------
  136|      0|        return nullptr;
  137|      0|    }
  138|       |
  139|      1|    UnicodeSet* result = new UnicodeSet();
  140|      1|    if (result == nullptr) {
  ------------------
  |  Branch (140:9): [True: 0, False: 1]
  ------------------
  141|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  142|      0|        return nullptr;
  143|      0|    }
  144|      1|    result->add(SPACE);
  145|      1|    result->add(HTAB);
  ------------------
  |  |   34|      1|#define HTAB ((UChar32)0x0009)
  ------------------
  146|      1|    result->add(CR);
  ------------------
  |  |   35|      1|#define CR ((UChar32)0x000D)
  ------------------
  147|      1|    result->add(LF);
  ------------------
  |  |   36|      1|#define LF ((UChar32)0x000A)
  ------------------
  148|      1|    result->add(IDEOGRAPHIC_SPACE);
  ------------------
  |  |   37|      1|#define IDEOGRAPHIC_SPACE ((UChar32)0x3000)
  ------------------
  149|      1|    result->freeze();
  150|      1|    return result;
  151|      1|}
_ZN6icu_788message216initBidiControlsER10UErrorCode:
  153|      1|UnicodeSet* initBidiControls(UErrorCode& status) {
  154|      1|    UnicodeSet* result = new UnicodeSet(UnicodeString("[\\u061C]"), status);
  155|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (155:9): [True: 0, False: 1]
  ------------------
  156|      0|        return nullptr;
  157|      0|    }
  158|      1|    result->add(0x200E, 0x200F);
  159|      1|    result->add(0x2066, 0x2069);
  160|      1|    result->freeze();
  161|      1|    return result;
  162|      1|}
_ZN6icu_788message29initAlphaER10UErrorCode:
  164|      1|UnicodeSet* initAlpha(UErrorCode& status) {
  165|      1|    UnicodeSet* result = new UnicodeSet(UnicodeString("[:letter:]"), status);
  166|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (166:9): [True: 0, False: 1]
  ------------------
  167|      0|        return nullptr;
  168|      0|    }
  169|      1|    result->freeze();
  170|      1|    return result;
  171|      1|}
_ZN6icu_788message210initDigitsER10UErrorCode:
  173|      1|UnicodeSet* initDigits(UErrorCode& status) {
  174|      1|    UnicodeSet* result = new UnicodeSet(UnicodeString("[:number:]"), status);
  175|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (175:9): [True: 0, False: 1]
  ------------------
  176|      0|        return nullptr;
  177|      0|    }
  178|      1|    result->freeze();
  179|      1|    return result;
  180|      1|}
_ZN6icu_788message218initNameStartCharsER10UErrorCode:
  182|      1|UnicodeSet* initNameStartChars(UErrorCode& status) {
  183|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (183:9): [True: 0, False: 1]
  ------------------
  184|      0|        return nullptr;
  185|      0|    }
  186|       |
  187|      1|    UnicodeSet* isAlpha = unisets::gUnicodeSets[unisets::ALPHA] = initAlpha(status);
  188|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (188:9): [True: 0, False: 1]
  ------------------
  189|      0|        return nullptr;
  190|      0|    }
  191|      1|    UnicodeSet* result = new UnicodeSet();
  192|      1|    if (result == nullptr) {
  ------------------
  |  Branch (192:9): [True: 0, False: 1]
  ------------------
  193|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  194|      0|        return nullptr;
  195|      1|    };
  196|       |
  197|      1|    result->addAll(*isAlpha);
  198|      1|    result->add(0x002B);
  199|      1|    result->add(0x005F);
  200|      1|    result->add(0x00A1, 0x061B);
  201|      1|    result->add(0x061D, 0x167F);
  202|      1|    result->add(0x1681, 0x1FFF);
  203|      1|    result->add(0x200B, 0x200D);
  204|      1|    result->add(0x2010, 0x2027);
  205|      1|    result->add(0x2030, 0x205E);
  206|      1|    result->add(0x2060, 0x2065);
  207|      1|    result->add(0x206A, 0x2FFF);
  208|      1|    result->add(0x3001, 0xD7FF);
  209|      1|    result->add(0xE000, 0xFDCF);
  210|      1|    result->add(0xFDF0, 0xFFFD);
  211|      1|    result->add(0x10000, 0x1FFFD);
  212|      1|    result->add(0x20000, 0x2FFFD);
  213|      1|    result->add(0x30000, 0x3FFFD);
  214|      1|    result->add(0x40000, 0x4FFFD);
  215|      1|    result->add(0x50000, 0x5FFFD);
  216|      1|    result->add(0x60000, 0x6FFFD);
  217|      1|    result->add(0x70000, 0x7FFFD);
  218|      1|    result->add(0x80000, 0x8FFFD);
  219|      1|    result->add(0x90000, 0x9FFFD);
  220|      1|    result->add(0xA0000, 0xAFFFD);
  221|      1|    result->add(0xB0000, 0xBFFFD);
  222|      1|    result->add(0xC0000, 0xCFFFD);
  223|      1|    result->add(0xD0000, 0xDFFFD);
  224|      1|    result->add(0xE0000, 0xEFFFD);
  225|      1|    result->add(0xF0000, 0xFFFFD);
  226|      1|    result->add(0x100000, 0x10FFFD);
  227|      1|    result->freeze();
  228|      1|    return result;
  229|      1|}
_ZN6icu_788message213initNameCharsER10UErrorCode:
  231|      1|UnicodeSet* initNameChars(UErrorCode& status) {
  232|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (232:9): [True: 0, False: 1]
  ------------------
  233|      0|        return nullptr;
  234|      0|    }
  235|       |
  236|      1|    UnicodeSet* nameStart = unisets::gUnicodeSets[unisets::NAME_START] = initNameStartChars(status);
  237|      1|    UnicodeSet* digit = unisets::gUnicodeSets[unisets::DIGIT] = initDigits(status);
  238|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (238:9): [True: 0, False: 1]
  ------------------
  239|      0|        return nullptr;
  240|      0|    }
  241|      1|    UnicodeSet* result = new UnicodeSet();
  242|      1|    if (result == nullptr) {
  ------------------
  |  Branch (242:9): [True: 0, False: 1]
  ------------------
  243|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  244|      0|        return nullptr;
  245|      1|    };
  246|      1|    result->addAll(*nameStart);
  247|      1|    result->addAll(*digit);
  248|      1|    result->add(HYPHEN);
  ------------------
  |  |   44|      1|#define HYPHEN ((UChar32)0x002D)
  ------------------
  249|      1|    result->add(PERIOD);
  ------------------
  |  |   45|      1|#define PERIOD ((UChar32)0x002E)
  ------------------
  250|      1|    result->freeze();
  251|      1|    return result;
  252|      1|}
_ZN6icu_788message213initTextCharsER10UErrorCode:
  254|      1|UnicodeSet* initTextChars(UErrorCode& status) {
  255|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (255:9): [True: 0, False: 1]
  ------------------
  256|      0|        return nullptr;
  257|      0|    }
  258|       |
  259|      1|    UnicodeSet* content = unisets::gUnicodeSets[unisets::CONTENT] = initContentChars(status);
  260|      1|    UnicodeSet* whitespace = unisets::gUnicodeSets[unisets::WHITESPACE] = initWhitespace(status);
  261|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (261:9): [True: 0, False: 1]
  ------------------
  262|      0|        return nullptr;
  263|      0|    }
  264|      1|    UnicodeSet* result = new UnicodeSet();
  265|      1|    if (result == nullptr) {
  ------------------
  |  Branch (265:9): [True: 0, False: 1]
  ------------------
  266|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  267|      0|        return nullptr;
  268|      1|    };
  269|      1|    result->addAll(*content);
  270|      1|    result->addAll(*whitespace);
  271|      1|    result->add(PERIOD);
  ------------------
  |  |   45|      1|#define PERIOD ((UChar32)0x002E)
  ------------------
  272|      1|    result->add(AT);
  ------------------
  |  |   53|      1|#define AT ((UChar32)0x0040)
  ------------------
  273|      1|    result->add(PIPE);
  ------------------
  |  |   39|      1|#define PIPE ((UChar32)0x007C)
  ------------------
  274|      1|    result->freeze();
  275|      1|    return result;
  276|      1|}
_ZN6icu_788message215initQuotedCharsER10UErrorCode:
  278|      1|UnicodeSet* initQuotedChars(UErrorCode& status) {
  279|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (279:9): [True: 0, False: 1]
  ------------------
  280|      0|        return nullptr;
  281|      0|    }
  282|       |
  283|      1|    unisets::gUnicodeSets[unisets::TEXT] = initTextChars(status);
  284|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (284:9): [True: 0, False: 1]
  ------------------
  285|      0|        return nullptr;
  286|      0|    }
  287|      1|    UnicodeSet* result = new UnicodeSet();
  288|      1|    if (result == nullptr) {
  ------------------
  |  Branch (288:9): [True: 0, False: 1]
  ------------------
  289|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  290|      0|        return nullptr;
  291|      1|    };
  292|       |    // content and whitespace were initialized by `initTextChars()`
  293|      1|    UnicodeSet* content = unisets::getImpl(unisets::CONTENT);
  294|      1|    if (content == nullptr) {
  ------------------
  |  Branch (294:9): [True: 0, False: 1]
  ------------------
  295|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  296|      0|        return nullptr;
  297|      0|    }
  298|      1|    result->addAll(*content);
  299|      1|    UnicodeSet* whitespace = unisets::getImpl(unisets::WHITESPACE);
  300|      1|    if (whitespace == nullptr) {
  ------------------
  |  Branch (300:9): [True: 0, False: 1]
  ------------------
  301|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  302|      0|        return nullptr;
  303|      0|    }
  304|      1|    result->addAll(*whitespace);
  305|      1|    result->add(PERIOD);
  ------------------
  |  |   45|      1|#define PERIOD ((UChar32)0x002E)
  ------------------
  306|      1|    result->add(AT);
  ------------------
  |  |   53|      1|#define AT ((UChar32)0x0040)
  ------------------
  307|      1|    result->add(LEFT_CURLY_BRACE);
  ------------------
  |  |   32|      1|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
  308|      1|    result->add(RIGHT_CURLY_BRACE);
  ------------------
  |  |   33|      1|#define RIGHT_CURLY_BRACE ((UChar32)0x007D)
  ------------------
  309|      1|    result->freeze();
  310|      1|    return result;
  311|      1|}
_ZN6icu_788message218initEscapableCharsER10UErrorCode:
  313|      1|UnicodeSet* initEscapableChars(UErrorCode& status) {
  314|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (314:9): [True: 0, False: 1]
  ------------------
  315|      0|        return nullptr;
  316|      0|    }
  317|       |
  318|      1|    UnicodeSet* result = new UnicodeSet();
  319|      1|    if (result == nullptr) {
  ------------------
  |  Branch (319:9): [True: 0, False: 1]
  ------------------
  320|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  321|      0|        return nullptr;
  322|      0|    }
  323|      1|    result->add(PIPE);
  ------------------
  |  |   39|      1|#define PIPE ((UChar32)0x007C)
  ------------------
  324|      1|    result->add(BACKSLASH);
  325|      1|    result->add(LEFT_CURLY_BRACE);
  ------------------
  |  |   32|      1|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
  326|      1|    result->add(RIGHT_CURLY_BRACE);
  ------------------
  |  |   33|      1|#define RIGHT_CURLY_BRACE ((UChar32)0x007D)
  ------------------
  327|      1|    result->freeze();
  328|      1|    return result;
  329|      1|}
_ZN6icu_788message27unisets19initMF2ParseUniSetsER10UErrorCode:
  342|      1|void U_CALLCONV initMF2ParseUniSets(UErrorCode& status) {
  343|      1|    ucln_i18n_registerCleanup(UCLN_I18N_MF2_UNISETS, cleanupMF2ParseUniSets);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  344|       |    /*
  345|       |      Each of the init functions initializes the UnicodeSets
  346|       |      that it depends on.
  347|       |
  348|       |      initBidiControls (no dependencies)
  349|       |
  350|       |      initEscapableChars (no dependencies)
  351|       |
  352|       |      initNameChars depends on
  353|       |         initDigits
  354|       |         initNameStartChars depends on
  355|       |           initAlpha
  356|       |
  357|       |      initQuotedChars depends on
  358|       |         initTextChars depends on
  359|       |            initContentChars
  360|       |            initWhitespace
  361|       |     */
  362|      1|    gUnicodeSets[unisets::BIDI] = initBidiControls(status);
  363|      1|    gUnicodeSets[unisets::NAME_CHAR] = initNameChars(status);
  364|      1|    gUnicodeSets[unisets::QUOTED] = initQuotedChars(status);
  365|      1|    gUnicodeSets[unisets::ESCAPABLE] = initEscapableChars(status);
  366|       |
  367|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (367:9): [True: 0, False: 1]
  ------------------
  368|      0|        cleanupMF2ParseUniSets();
  369|      0|    }
  370|      1|}
_ZN6icu_788message27unisets3getENS1_3KeyER10UErrorCode:
  372|  75.9k|const UnicodeSet* get(Key key, UErrorCode& status) {
  373|  75.9k|    umtx_initOnce(gMF2ParseUniSetsInitOnce, &initMF2ParseUniSets, status);
  374|  75.9k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (374:9): [True: 0, False: 75.9k]
  ------------------
  375|      0|        return nullptr;
  376|      0|    }
  377|  75.9k|    UnicodeSet* result = getImpl(key);
  378|  75.9k|    if (result == nullptr) {
  ------------------
  |  Branch (378:9): [True: 0, False: 75.9k]
  ------------------
  379|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  380|      0|    }
  381|  75.9k|    return result;
  382|  75.9k|}
_ZNK6icu_788message26Parser13isBidiControlEi:
  408|  4.03M|bool Parser::isBidiControl(UChar32 c) const {
  409|  4.03M|    return bidiControlChars->contains(c);
  410|  4.03M|}
_ZNK6icu_788message26Parser12isWhitespaceEi:
  413|  4.13M|bool Parser::isWhitespace(UChar32 c) const {
  414|  4.13M|    return whitespaceChars->contains(c);
  415|  4.13M|}
_ZNK6icu_788message26Parser10isTextCharEi:
  417|  12.1M|bool Parser::isTextChar(UChar32 c) const {
  418|  12.1M|    return textChars->contains(c);
  419|  12.1M|}
_ZNK6icu_788message26Parser7isDigitEi:
  425|     96|bool Parser::isDigit(UChar32 c) const {
  426|     96|    return digitChars->contains(c);
  427|     96|}
_ZNK6icu_788message26Parser11isNameStartEi:
  429|   236k|bool Parser::isNameStart(UChar32 c) const {
  430|   236k|    return nameStartChars->contains(c);
  431|   236k|}
_ZNK6icu_788message26Parser10isNameCharEi:
  433|  18.4M|bool Parser::isNameChar(UChar32 c) const {
  434|  18.4M|    return nameChars->contains(c);
  435|  18.4M|}
_ZNK6icu_788message26Parser15isUnquotedStartEi:
  437|  14.7k|bool Parser::isUnquotedStart(UChar32 c) const {
  438|  14.7k|    return isNameChar(c);
  439|  14.7k|}
_ZNK6icu_788message26Parser12isQuotedCharEi:
  441|   305k|bool Parser::isQuotedChar(UChar32 c) const {
  442|   305k|    return quotedChars->contains(c);
  443|   305k|}
_ZNK6icu_788message26Parser15isEscapableCharEi:
  445|  12.4M|bool Parser::isEscapableChar(UChar32 c) const {
  446|  12.4M|    return escapableChars->contains(c);
  447|  12.4M|}
_ZNK6icu_788message26Parser14isLiteralStartEi:
  467|    154|bool Parser::isLiteralStart(UChar32 c) const {
  468|    154|    return (c == PIPE || isNameStart(c) || c == HYPHEN || isDigit(c));
  ------------------
  |  |   39|    308|#define PIPE ((UChar32)0x007C)
  ------------------
                  return (c == PIPE || isNameStart(c) || c == HYPHEN || isDigit(c));
  ------------------
  |  |   44|    251|#define HYPHEN ((UChar32)0x002D)
  ------------------
  |  Branch (468:13): [True: 4, False: 150]
  |  Branch (468:26): [True: 53, False: 97]
  |  Branch (468:44): [True: 1, False: 96]
  |  Branch (468:59): [True: 4, False: 92]
  ------------------
  469|    154|}
_ZNK6icu_788message26Parser10isKeyStartEi:
  472|    161|bool Parser::isKeyStart(UChar32 c) const {
  473|    161|    return (c == ASTERISK || isLiteralStart(c));
  ------------------
  |  Branch (473:13): [True: 7, False: 154]
  |  Branch (473:30): [True: 62, False: 92]
  ------------------
  474|    161|}
_ZN6icu_788message26Parser15parseRequiredWSER10UErrorCode:
  611|  1.19M|void Parser::parseRequiredWS(UErrorCode& errorCode) {
  612|  1.19M|    bool sawWhitespace = false;
  613|       |
  614|       |    // The loop exits either when we consume all the input,
  615|       |    // or when we see a non-whitespace character.
  616|  1.28M|    while (true) {
  ------------------
  |  Branch (616:12): [Folded - Ignored]
  ------------------
  617|       |        // Check if all input has been consumed
  618|  1.28M|        if (!inBounds()) {
  ------------------
  |  Branch (618:13): [True: 256, False: 1.28M]
  ------------------
  619|       |            // If whitespace isn't required -- or if we saw it already --
  620|       |            // then the caller is responsible for checking this case and
  621|       |            // setting an error if necessary.
  622|    256|            if (sawWhitespace) {
  ------------------
  |  Branch (622:17): [True: 88, False: 168]
  ------------------
  623|       |                // Not an error.
  624|     88|                return;
  625|     88|            }
  626|       |            // Otherwise, whitespace is required; the end of the input has
  627|       |            // been reached without whitespace. This is an error.
  628|    168|            ERROR(errorCode);
  ------------------
  |  |   33|    168|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 0, False: 168]
  |  |  ------------------
  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      0|    }
  ------------------
  629|    168|            return;
  630|    256|        }
  631|       |
  632|       |        // Input remains; process the next character if it's whitespace,
  633|       |        // exit the loop otherwise
  634|  1.28M|        if (isWhitespace(peek())) {
  ------------------
  |  Branch (634:13): [True: 91.7k, False: 1.19M]
  ------------------
  635|  91.7k|            sawWhitespace = true;
  636|       |            // Increment line number in parse error if we consume a newline
  637|  91.7k|            maybeAdvanceLine();
  638|  91.7k|            next();
  639|  1.19M|        } else {
  640|  1.19M|            break;
  641|  1.19M|        }
  642|  1.28M|    }
  643|       |
  644|  1.19M|    if (!sawWhitespace) {
  ------------------
  |  Branch (644:9): [True: 1.10M, False: 88.1k]
  ------------------
  645|  1.10M|        ERROR(errorCode);
  ------------------
  |  |   33|  1.10M|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 1, False: 1.10M]
  |  |  ------------------
  |  |   34|      1|        setParseError(parseError, index);                                                               \
  |  |   35|      1|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      1|    }
  ------------------
  646|  1.10M|    }
  647|  1.19M|}
_ZN6icu_788message26Parser17parseOptionalBidiEv:
  649|  1.33M|void Parser::parseOptionalBidi() {
  650|  1.33M|    while (true) {
  ------------------
  |  Branch (650:12): [Folded - Ignored]
  ------------------
  651|  1.33M|        if (!inBounds()) {
  ------------------
  |  Branch (651:13): [True: 635, False: 1.33M]
  ------------------
  652|    635|            return;
  653|    635|        }
  654|  1.33M|        if (isBidiControl(peek())) {
  ------------------
  |  Branch (654:13): [True: 2.83k, False: 1.33M]
  ------------------
  655|  2.83k|            next();
  656|  1.33M|        } else {
  657|  1.33M|            break;
  658|  1.33M|        }
  659|  1.33M|    }
  660|  1.33M|}
_ZN6icu_788message26Parser23parseRequiredWhitespaceER10UErrorCode:
  666|  1.19M|void Parser::parseRequiredWhitespace(UErrorCode& errorCode) {
  667|  1.19M|    parseOptionalBidi();
  668|  1.19M|    parseRequiredWS(errorCode);
  669|  1.19M|    parseOptionalWhitespace();
  670|  1.19M|    normalizedInput += SPACE;
  671|  1.19M|}
_ZN6icu_788message26Parser23parseOptionalWhitespaceEv:
  676|  1.48M|void Parser::parseOptionalWhitespace() {
  677|  1.50M|    while (true) {
  ------------------
  |  Branch (677:12): [Folded - Ignored]
  ------------------
  678|  1.50M|        if (!inBounds()) {
  ------------------
  |  Branch (678:13): [True: 2.86k, False: 1.50M]
  ------------------
  679|  2.86k|            return;
  680|  2.86k|        }
  681|  1.50M|        auto cp = peek();
  682|  1.50M|        if (isWhitespace(cp) || isBidiControl(cp)) {
  ------------------
  |  Branch (682:13): [True: 14.2k, False: 1.48M]
  |  Branch (682:33): [True: 1.04k, False: 1.48M]
  ------------------
  683|  15.2k|            maybeAdvanceLine();
  684|  15.2k|            next();
  685|  1.48M|        } else {
  686|  1.48M|            break;
  687|  1.48M|        }
  688|  1.50M|    }
  689|  1.48M|}
_ZN6icu_788message26Parser10parseTokenEiR10UErrorCode:
  693|   335k|void Parser::parseToken(UChar32 c, UErrorCode& errorCode) {
  694|   335k|    CHECK_BOUNDS(errorCode);
  ------------------
  |  |   60|   335k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 571, False: 335k]
  |  |  ------------------
  |  |   61|    571|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|    571|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 8, False: 563]
  |  |  |  |  ------------------
  |  |  |  |   34|      8|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      8|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      8|    }
  |  |  ------------------
  |  |   62|    571|        return;                                                                            \
  |  |   63|    571|    }
  ------------------
  695|       |
  696|   335k|    if (peek() == c) {
  ------------------
  |  Branch (696:9): [True: 235k, False: 99.1k]
  ------------------
  697|   235k|        next();
  698|   235k|        normalizedInput += c;
  699|   235k|        return;
  700|   235k|    }
  701|       |    // Next character didn't match -- error out
  702|  99.1k|    ERROR(errorCode);
  ------------------
  |  |   33|  99.1k|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 3.78k, False: 95.4k]
  |  |  ------------------
  |  |   34|  3.78k|        setParseError(parseError, index);                                                               \
  |  |   35|  3.78k|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|  3.78k|    }
  ------------------
  703|  99.1k|}
_ZN6icu_788message26Parser10parseTokenERKNSt3__117basic_string_viewIDsNS2_11char_traitsIDsEEEER10UErrorCode:
  710|  36.1k|void Parser::parseToken(const std::u16string_view& token, UErrorCode& errorCode) {
  711|  36.1k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  36.1k|#   define U_ASSERT(exp) (void)0
  ------------------
  712|       |
  713|  36.1k|    int32_t tokenPos = 0;
  714|   107k|    while (tokenPos < static_cast<int32_t>(token.length())) {
  ------------------
  |  Branch (714:12): [True: 107k, False: 6]
  ------------------
  715|   107k|        if (peek() != token[tokenPos]) {
  ------------------
  |  Branch (715:13): [True: 36.1k, False: 71.6k]
  ------------------
  716|  36.1k|            ERROR(errorCode);
  ------------------
  |  |   33|  36.1k|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 1.14k, False: 35.0k]
  |  |  ------------------
  |  |   34|  1.14k|        setParseError(parseError, index);                                                               \
  |  |   35|  1.14k|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|  1.14k|    }
  ------------------
  717|  36.1k|            return;
  718|  36.1k|        }
  719|  71.6k|        normalizedInput += token[tokenPos];
  720|  71.6k|        next();
  721|  71.6k|        tokenPos++;
  722|  71.6k|    }
  723|  36.1k|}
_ZN6icu_788message26Parser24parseTokenWithWhitespaceEiR10UErrorCode:
  748|  27.3k|void Parser::parseTokenWithWhitespace(UChar32 c, UErrorCode& errorCode) {
  749|       |    // No need for error check or bounds check before parseOptionalWhitespace()
  750|  27.3k|    parseOptionalWhitespace();
  751|       |    // Establish precondition
  752|  27.3k|    CHECK_BOUNDS(errorCode);
  ------------------
  |  |   60|  27.3k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 256, False: 27.1k]
  |  |  ------------------
  |  |   61|    256|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|    256|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 1, False: 255]
  |  |  |  |  ------------------
  |  |  |  |   34|      1|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      1|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      1|    }
  |  |  ------------------
  |  |   62|    256|        return;                                                                            \
  |  |   63|    256|    }
  ------------------
  753|  27.1k|    parseToken(c, errorCode);
  754|  27.1k|    parseOptionalWhitespace();
  755|       |    // Guarantee postcondition
  756|  27.1k|    CHECK_BOUNDS(errorCode);
  ------------------
  |  |   60|  27.1k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 22, False: 27.1k]
  |  |  ------------------
  |  |   61|     22|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|     22|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 2, False: 20]
  |  |  |  |  ------------------
  |  |  |  |   34|      2|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      2|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      2|    }
  |  |  ------------------
  |  |   62|     22|        return;                                                                            \
  |  |   63|     22|    }
  ------------------
  757|  27.1k|}
_ZN6icu_788message26Parser14parseNameCharsERNS_13UnicodeStringER10UErrorCode:
  763|   433k|UnicodeString Parser::parseNameChars(UnicodeString& str, UErrorCode& errorCode) {
  764|   433k|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (764:9): [True: 0, False: 433k]
  ------------------
  765|      0|        return {};
  766|      0|    }
  767|       |
  768|  17.4M|    while (isNameChar(peek())) {
  ------------------
  |  Branch (768:12): [True: 16.9M, False: 432k]
  ------------------
  769|  16.9M|        UChar32 c = peek();
  770|  16.9M|        str += c;
  771|  16.9M|        normalizedInput += c;
  772|  16.9M|        next();
  773|  16.9M|        if (!inBounds()) {
  ------------------
  |  Branch (773:13): [True: 873, False: 16.9M]
  ------------------
  774|    873|            ERROR(errorCode);
  ------------------
  |  |   33|    873|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 392, False: 481]
  |  |  ------------------
  |  |   34|    392|        setParseError(parseError, index);                                                               \
  |  |   35|    392|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|    392|    }
  ------------------
  775|    873|            break;
  776|    873|        }
  777|  16.9M|    }
  778|       |
  779|   433k|    return str;
  780|   433k|}
_ZN6icu_788message26Parser9parseNameER10UErrorCode:
  791|   209k|UnicodeString Parser::parseName(UErrorCode& errorCode) {
  792|   209k|    UnicodeString name;
  793|       |
  794|   209k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|   209k|#   define U_ASSERT(exp) (void)0
  ------------------
  795|       |
  796|   209k|    if (!(isNameStart(peek()) || isBidiControl(peek()))) {
  ------------------
  |  Branch (796:11): [True: 68.6k, False: 140k]
  |  Branch (796:34): [True: 276, False: 140k]
  ------------------
  797|   140k|        ERROR(errorCode);
  ------------------
  |  |   33|   140k|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 672, False: 139k]
  |  |  ------------------
  |  |   34|    672|        setParseError(parseError, index);                                                               \
  |  |   35|    672|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|    672|    }
  ------------------
  798|   140k|        return name;
  799|   140k|    }
  800|       |
  801|       |    // name       = [bidi] name-start *name-char [bidi]
  802|       |
  803|       |    // [bidi]
  804|  68.9k|    parseOptionalBidi();
  805|       |
  806|       |    // name-start *name-char
  807|  68.9k|    parseNameChars(name, errorCode);
  808|       |
  809|       |    // [bidi]
  810|  68.9k|    parseOptionalBidi();
  811|       |
  812|  68.9k|    return name;
  813|   209k|}
_ZN6icu_788message26Parser17parseVariableNameER10UErrorCode:
  821|  74.3k|VariableName Parser::parseVariableName(UErrorCode& errorCode) {
  822|  74.3k|    VariableName result;
  823|       |
  824|  74.3k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  74.3k|#   define U_ASSERT(exp) (void)0
  ------------------
  825|       |
  826|  74.3k|    parseToken(DOLLAR, errorCode);
  ------------------
  |  |   41|  74.3k|#define DOLLAR ((UChar32)0x0024)
  ------------------
  827|  74.3k|    if (!inBounds()) {
  ------------------
  |  Branch (827:9): [True: 70, False: 74.3k]
  ------------------
  828|     70|        ERROR(errorCode);
  ------------------
  |  |   33|     70|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 2, False: 68]
  |  |  ------------------
  |  |   34|      2|        setParseError(parseError, index);                                                               \
  |  |   35|      2|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      2|    }
  ------------------
  829|     70|        return result;
  830|     70|    }
  831|  74.3k|    return VariableName(parseName(errorCode));
  832|  74.3k|}
_ZN6icu_788message26Parser15parseIdentifierER10UErrorCode:
  837|  88.9k|UnicodeString Parser::parseIdentifier(UErrorCode& errorCode) {
  838|  88.9k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  88.9k|#   define U_ASSERT(exp) (void)0
  ------------------
  839|       |
  840|  88.9k|    UnicodeString result;
  841|       |    // The following is a hack to get around ambiguity in the grammar:
  842|       |    // identifier -> namespace ":" name
  843|       |    // vs.
  844|       |    // identifier -> name
  845|       |    // can't be distinguished without arbitrary lookahead.
  846|       |    // Instead, we treat the production as:
  847|       |    // identifier -> namespace *(":"name)
  848|       |    // and then check for multiple colons.
  849|       |
  850|       |    // Parse namespace
  851|  88.9k|    result += parseName(errorCode);
  852|  88.9k|    int32_t firstColon = -1;
  853|   134k|    while (inBounds() && peek() == COLON) {
  ------------------
  |  |   42|   134k|#define COLON ((UChar32)0x003A)
  ------------------
  |  Branch (853:12): [True: 134k, False: 535]
  |  Branch (853:26): [True: 46.0k, False: 88.3k]
  ------------------
  854|       |        // Parse ':' separator
  855|  46.0k|        if (firstColon == -1) {
  ------------------
  |  Branch (855:13): [True: 26.2k, False: 19.8k]
  ------------------
  856|  26.2k|            firstColon = index;
  857|  26.2k|        }
  858|  46.0k|        parseToken(COLON, errorCode);
  ------------------
  |  |   42|  46.0k|#define COLON ((UChar32)0x003A)
  ------------------
  859|  46.0k|        result += COLON;
  ------------------
  |  |   42|  46.0k|#define COLON ((UChar32)0x003A)
  ------------------
  860|       |        // Check for message ending with something like "foo:"
  861|  46.0k|        if (!inBounds()) {
  ------------------
  |  Branch (861:13): [True: 51, False: 46.0k]
  ------------------
  862|     51|            ERROR(errorCode);
  ------------------
  |  |   33|     51|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 7, False: 44]
  |  |  ------------------
  |  |   34|      7|        setParseError(parseError, index);                                                               \
  |  |   35|      7|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      7|    }
  ------------------
  863|  46.0k|        } else {
  864|       |            // Parse name part
  865|  46.0k|            result += parseName(errorCode);
  866|  46.0k|        }
  867|  46.0k|    }
  868|       |
  869|       |    // If there's at least one ':', scan from the first ':'
  870|       |    // to the end of the name to check for multiple ':'s
  871|  88.9k|    if (firstColon != -1) {
  ------------------
  |  Branch (871:9): [True: 26.2k, False: 62.6k]
  ------------------
  872|  4.99M|        for (int32_t i = firstColon + 1; i < result.length(); i++) {
  ------------------
  |  Branch (872:42): [True: 4.96M, False: 26.1k]
  ------------------
  873|  4.96M|            if (result[i] == COLON) {
  ------------------
  |  |   42|  4.96M|#define COLON ((UChar32)0x003A)
  ------------------
  |  Branch (873:17): [True: 112, False: 4.96M]
  ------------------
  874|    112|                ERROR_AT(errorCode, i);
  ------------------
  |  |   39|    112|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (39:9): [True: 8, False: 104]
  |  |  ------------------
  |  |   40|      8|        setParseError(parseError, i);                                                                   \
  |  |   41|      8|        errors.addSyntaxError(errorCode);                                                               \
  |  |   42|      8|    }
  ------------------
  875|    112|                return {};
  876|    112|            }
  877|  4.96M|        }
  878|  26.2k|    }
  879|       |
  880|  88.7k|    return result;
  881|  88.9k|}
_ZN6icu_788message26Parser13parseFunctionER10UErrorCode:
  889|  33.6k|FunctionName Parser::parseFunction(UErrorCode& errorCode) {
  890|  33.6k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  33.6k|#   define U_ASSERT(exp) (void)0
  ------------------
  891|  33.6k|    if (!isFunctionStart(peek())) {
  ------------------
  |  Branch (891:9): [True: 0, False: 33.6k]
  ------------------
  892|      0|        ERROR(errorCode);
  ------------------
  |  |   33|      0|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 0, False: 0]
  |  |  ------------------
  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      0|    }
  ------------------
  893|      0|        return FunctionName();
  894|      0|    }
  895|       |
  896|  33.6k|    normalizedInput += peek();
  897|  33.6k|    next(); // Consume the function start character
  898|  33.6k|    if (!inBounds()) {
  ------------------
  |  Branch (898:9): [True: 27, False: 33.5k]
  ------------------
  899|     27|        ERROR(errorCode);
  ------------------
  |  |   33|     27|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 4, False: 23]
  |  |  ------------------
  |  |   34|      4|        setParseError(parseError, index);                                                               \
  |  |   35|      4|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      4|    }
  ------------------
  900|     27|        return FunctionName();
  901|     27|    }
  902|  33.5k|    return parseIdentifier(errorCode);
  903|  33.6k|}
_ZN6icu_788message26Parser19parseEscapeSequenceER10UErrorCode:
  914|  62.1k|UnicodeString Parser::parseEscapeSequence(UErrorCode& errorCode) {
  915|  62.1k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  62.1k|#   define U_ASSERT(exp) (void)0
  ------------------
  916|  62.1k|    U_ASSERT(peek() == BACKSLASH);
  ------------------
  |  |   35|  62.1k|#   define U_ASSERT(exp) (void)0
  ------------------
  917|  62.1k|    normalizedInput += BACKSLASH;
  918|  62.1k|    next(); // Skip the initial backslash
  919|  62.1k|    UnicodeString str;
  920|  62.1k|    if (inBounds()) {
  ------------------
  |  Branch (920:9): [True: 62.1k, False: 23]
  ------------------
  921|       |        // Expect a '{', '|' or '}'
  922|  62.1k|        switch (peek()) {
  923|  4.53k|        case LEFT_CURLY_BRACE:
  ------------------
  |  |   32|  4.53k|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
  |  Branch (923:9): [True: 4.53k, False: 57.6k]
  ------------------
  924|  4.73k|        case RIGHT_CURLY_BRACE:
  ------------------
  |  |   33|  4.73k|#define RIGHT_CURLY_BRACE ((UChar32)0x007D)
  ------------------
  |  Branch (924:9): [True: 200, False: 61.9k]
  ------------------
  925|  49.7k|        case PIPE:
  ------------------
  |  |   39|  49.7k|#define PIPE ((UChar32)0x007C)
  ------------------
  |  Branch (925:9): [True: 45.0k, False: 17.1k]
  ------------------
  926|  51.9k|        case BACKSLASH: {
  ------------------
  |  Branch (926:9): [True: 2.15k, False: 60.0k]
  ------------------
  927|       |            /* Append to the output string */
  928|  51.9k|            str += peek();
  929|       |            /* Update normalizedInput */
  930|  51.9k|            normalizedInput += peek();
  931|       |            /* Consume the character */
  932|  51.9k|            next();
  933|  51.9k|            return str;
  934|  49.7k|        }
  935|  10.2k|        default: {
  ------------------
  |  Branch (935:9): [True: 10.2k, False: 51.9k]
  ------------------
  936|       |            // No other characters are allowed here
  937|  10.2k|            break;
  938|  49.7k|        }
  939|  62.1k|        }
  940|  62.1k|    }
  941|       |   // If control reaches here, there was an error
  942|  10.2k|   ERROR(errorCode);
  ------------------
  |  |   33|  10.2k|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 43, False: 10.2k]
  |  |  ------------------
  |  |   34|     43|        setParseError(parseError, index);                                                               \
  |  |   35|     43|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|     43|    }
  ------------------
  943|  10.2k|   return str;
  944|  62.1k|}
_ZN6icu_788message26Parser18parseQuotedLiteralER10UErrorCode:
  950|  24.8k|Literal Parser::parseQuotedLiteral(UErrorCode& errorCode) {
  951|  24.8k|    bool error = false;
  952|       |
  953|  24.8k|    UnicodeString contents;
  954|  24.8k|    if (U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (954:9): [True: 24.8k, False: 0]
  ------------------
  955|       |        // Parse the opening '|'
  956|  24.8k|        parseToken(PIPE, errorCode);
  ------------------
  |  |   39|  24.8k|#define PIPE ((UChar32)0x007C)
  ------------------
  957|  24.8k|        if (!inBounds()) {
  ------------------
  |  Branch (957:13): [True: 14, False: 24.8k]
  ------------------
  958|     14|            ERROR(errorCode);
  ------------------
  |  |   33|     14|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 1, False: 13]
  |  |  ------------------
  |  |   34|      1|        setParseError(parseError, index);                                                               \
  |  |   35|      1|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      1|    }
  ------------------
  959|     14|            error = true;
  960|  24.8k|        } else {
  961|       |            // Parse the contents
  962|  24.8k|            bool done = false;
  963|   391k|            while (!done) {
  ------------------
  |  Branch (963:20): [True: 366k, False: 24.7k]
  ------------------
  964|   366k|                if (peek() == BACKSLASH) {
  ------------------
  |  Branch (964:21): [True: 60.6k, False: 305k]
  ------------------
  965|  60.6k|                    contents += parseEscapeSequence(errorCode);
  966|   305k|                } else if (isQuotedChar(peek())) {
  ------------------
  |  Branch (966:28): [True: 280k, False: 24.7k]
  ------------------
  967|   280k|                    contents += peek();
  968|       |                    // Handle cases like:
  969|       |                    // |}{| -- we want to escape everywhere that
  970|       |                    // can be escaped, to make round-trip checking
  971|       |                    // easier -- so this case normalizes to
  972|       |                    // |\}\{|
  973|   280k|                    if (isEscapableChar(peek())) {
  ------------------
  |  Branch (973:25): [True: 3.04k, False: 277k]
  ------------------
  974|  3.04k|                        normalizedInput += BACKSLASH;
  975|  3.04k|                    }
  976|   280k|                    normalizedInput += peek();
  977|   280k|                    next(); // Consume this character
  978|   280k|                    maybeAdvanceLine();
  979|   280k|                } else {
  980|       |                    // Assume the sequence of literal characters ends here
  981|  24.7k|                    done = true;
  982|  24.7k|                }
  983|   366k|                if (!inBounds()) {
  ------------------
  |  Branch (983:21): [True: 69, False: 366k]
  ------------------
  984|     69|                    ERROR(errorCode);
  ------------------
  |  |   33|     69|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 40, False: 29]
  |  |  ------------------
  |  |   34|     40|        setParseError(parseError, index);                                                               \
  |  |   35|     40|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|     40|    }
  ------------------
  985|     69|                    error = true;
  986|     69|                    break;
  987|     69|                }
  988|   366k|            }
  989|  24.8k|        }
  990|  24.8k|    }
  991|       |
  992|  24.8k|    if (error) {
  ------------------
  |  Branch (992:9): [True: 83, False: 24.7k]
  ------------------
  993|     83|        return {};
  994|     83|    }
  995|       |
  996|       |    // Parse the closing '|'
  997|  24.7k|    parseToken(PIPE, errorCode);
  ------------------
  |  |   39|  24.7k|#define PIPE ((UChar32)0x007C)
  ------------------
  998|       |
  999|  24.7k|    return Literal(true, contents);
 1000|  24.8k|}
_ZN6icu_788message26Parser20parseUnquotedLiteralER10UErrorCode:
 1026|  1.06M|Literal Parser::parseUnquotedLiteral(UErrorCode& errorCode) {
 1027|  1.06M|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (1027:9): [True: 0, False: 1.06M]
  ------------------
 1028|      0|        return {};
 1029|      0|    }
 1030|       |    // unquoted-literal = 1*name-char
 1031|       |
 1032|  1.06M|    if (!(isNameChar(peek()))) {
  ------------------
  |  Branch (1032:9): [True: 702k, False: 364k]
  ------------------
 1033|   702k|        ERROR(errorCode);
  ------------------
  |  |   33|   702k|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 2, False: 702k]
  |  |  ------------------
  |  |   34|      2|        setParseError(parseError, index);                                                               \
  |  |   35|      2|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      2|    }
  ------------------
 1034|   702k|        return {};
 1035|   702k|    }
 1036|       |
 1037|   364k|    UnicodeString contents;
 1038|   364k|    parseNameChars(contents, errorCode);
 1039|   364k|    return Literal(false, contents);
 1040|  1.06M|}
_ZN6icu_788message26Parser12parseLiteralER10UErrorCode:
 1045|  1.09M|Literal Parser::parseLiteral(UErrorCode& errorCode) {
 1046|  1.09M|    Literal result;
 1047|  1.09M|    if (!inBounds()) {
  ------------------
  |  Branch (1047:9): [True: 269, False: 1.09M]
  ------------------
 1048|    269|        ERROR(errorCode);
  ------------------
  |  |   33|    269|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 0, False: 269]
  |  |  ------------------
  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      0|    }
  ------------------
 1049|  1.09M|    } else {
 1050|  1.09M|        if (peek() == PIPE) {
  ------------------
  |  |   39|  1.09M|#define PIPE ((UChar32)0x007C)
  ------------------
  |  Branch (1050:13): [True: 24.8k, False: 1.06M]
  ------------------
 1051|  24.8k|            result = parseQuotedLiteral(errorCode);
 1052|  1.06M|        } else {
 1053|  1.06M|            result = parseUnquotedLiteral(errorCode);
 1054|  1.06M|        }
 1055|       |        // Guarantee postcondition
 1056|  1.09M|        if (!inBounds()) {
  ------------------
  |  Branch (1056:13): [True: 541, False: 1.09M]
  ------------------
 1057|    541|            ERROR(errorCode);
  ------------------
  |  |   33|    541|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 4, False: 537]
  |  |  ------------------
  |  |   34|      4|        setParseError(parseError, index);                                                               \
  |  |   35|      4|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      4|    }
  ------------------
 1058|    541|        }
 1059|  1.09M|    }
 1060|       |
 1061|  1.09M|    return result;
 1062|  1.09M|}
_ZN6icu_788message26Parser15parseAnnotationER10UErrorCode:
 1299|  33.6k|Operator Parser::parseAnnotation(UErrorCode& status) {
 1300|  33.6k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  33.6k|#   define U_ASSERT(exp) (void)0
  ------------------
 1301|  33.6k|    Operator::Builder ratorBuilder(status);
 1302|  33.6k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1302:9): [True: 0, False: 33.6k]
  ------------------
 1303|      0|        return {};
 1304|      0|    }
 1305|  33.6k|    if (isFunctionStart(peek())) {
  ------------------
  |  Branch (1305:9): [True: 33.6k, False: 0]
  ------------------
 1306|       |        // Consume the function name
 1307|  33.6k|        FunctionName func = parseFunction(status);
 1308|  33.6k|        ratorBuilder.setFunctionName(std::move(func));
 1309|       |
 1310|  33.6k|        OptionAdder<Operator::Builder> addOptions(ratorBuilder);
 1311|       |        // Consume the options (which may be empty)
 1312|  33.6k|        parseOptions(addOptions, status);
 1313|  33.6k|    } else {
 1314|      0|        ERROR(status);
  ------------------
  |  |   33|      0|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 0, False: 0]
  |  |  ------------------
  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      0|    }
  ------------------
 1315|      0|    }
 1316|  33.6k|    return ratorBuilder.build(status);
 1317|  33.6k|}
_ZN6icu_788message26Parser36parseLiteralOrVariableWithAnnotationEbRNS0_10data_model10Expression7BuilderER10UErrorCode:
 1326|  14.2k|                                                  UErrorCode& status) {
 1327|  14.2k|    CHECK_ERROR(status);
  ------------------
  |  |   73|  14.2k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 14.2k]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
 1328|       |
 1329|  14.2k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  14.2k|#   define U_ASSERT(exp) (void)0
  ------------------
 1330|       |
 1331|  14.2k|    Operand rand;
 1332|  14.2k|    if (isVariable) {
  ------------------
  |  Branch (1332:9): [True: 560, False: 13.6k]
  ------------------
 1333|    560|        rand = Operand(parseVariableName(status));
 1334|  13.6k|    } else {
 1335|  13.6k|        rand = Operand(parseLiteral(status));
 1336|  13.6k|    }
 1337|       |
 1338|  14.2k|    builder.setOperand(std::move(rand));
 1339|       |
 1340|       |/*
 1341|       |Parsing a literal or variable with an optional annotation requires arbitrary lookahead.
 1342|       |To see why, consider this rule from the grammar:
 1343|       |
 1344|       |expression = "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}"
 1345|       |
 1346|       |And this example:
 1347|       |
 1348|       |{|foo|   }
 1349|       |
 1350|       |Derivation:
 1351|       |expression -> "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}"
 1352|       |           -> "{" [s] ((literal / variable) [s annotation]) [s] "}"
 1353|       |           -> "{" [s] (literal [s annotation]) [s] "}"
 1354|       |
 1355|       |When reading the ' ' after the second '|', it's ambiguous whether that's the required
 1356|       |space before an annotation, or the optional space before the '}'.
 1357|       |
 1358|       |To make this ambiguity easier to handle, this code is based on the same grammar
 1359|       |refactoring for the `expression` nonterminal that `parseOptions()` relies on. See
 1360|       |the comment in `parseOptions()` for details.
 1361|       |*/
 1362|       |
 1363|  14.2k|    if (isWhitespace(peek())) {
  ------------------
  |  Branch (1363:9): [True: 6.99k, False: 7.23k]
  ------------------
 1364|  6.99k|      int32_t firstWhitespace = index;
 1365|       |
 1366|       |      // If the next character is whitespace, either [s annotation] or [s] applies
 1367|       |      // (the character is either the required space before an annotation, or optional
 1368|       |      // trailing space after the literal or variable). It's still ambiguous which
 1369|       |      // one does apply.
 1370|  6.99k|      parseOptionalWhitespace();
 1371|       |      // Restore precondition
 1372|  6.99k|      CHECK_BOUNDS(status);
  ------------------
  |  |   60|  6.99k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 10, False: 6.98k]
  |  |  ------------------
  |  |   61|     10|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|     10|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 7, False: 3]
  |  |  |  |  ------------------
  |  |  |  |   34|      7|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      7|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      7|    }
  |  |  ------------------
  |  |   62|     10|        return;                                                                            \
  |  |   63|     10|    }
  ------------------
 1373|       |
 1374|       |      // This next check resolves the ambiguity between [s annotation] and [s]
 1375|  6.98k|      bool isSAnnotation = isAnnotationStart(peek());
 1376|       |
 1377|  6.98k|      if (isSAnnotation) {
  ------------------
  |  Branch (1377:11): [True: 4.15k, False: 2.83k]
  ------------------
 1378|  4.15k|        normalizedInput += SPACE;
 1379|  4.15k|      }
 1380|       |
 1381|  6.98k|      if (isSAnnotation) {
  ------------------
  |  Branch (1381:11): [True: 4.15k, False: 2.83k]
  ------------------
 1382|       |        // The previously consumed whitespace precedes an annotation
 1383|  4.15k|        builder.setOperator(parseAnnotation(status));
 1384|  4.15k|      } else {
 1385|       |          // Either there's a right curly brace (will be consumed by the caller),
 1386|       |          // or there's an error and the trailing whitespace should be
 1387|       |          // handled by the caller. However, this is not an error
 1388|       |          // here because we're just parsing `literal [s annotation]`.
 1389|  2.83k|          index = firstWhitespace;
 1390|  2.83k|      }
 1391|  7.23k|    } else {
 1392|       |      // Either there was never whitespace, or
 1393|       |      // the previously consumed whitespace is the optional trailing whitespace;
 1394|       |      // either the next character is '}' or the error will be handled by parseExpression.
 1395|       |      // Do nothing, since the operand was already set
 1396|  7.23k|    }
 1397|       |
 1398|       |    // At the end of this code, the next character should either be '}',
 1399|       |    // whitespace followed by a '}',
 1400|       |    // or end-of-input
 1401|  14.2k|}
_ZN6icu_788message26Parser15parseExpressionER10UErrorCode:
 1430|  45.1k|Expression Parser::parseExpression(UErrorCode& status) {
 1431|  45.1k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1431:9): [True: 0, False: 45.1k]
  ------------------
 1432|      0|        return {};
 1433|      0|    }
 1434|       |
 1435|       |    // Early return if out of input -- no more work is possible
 1436|  45.1k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  45.1k|#   define U_ASSERT(exp) (void)0
  ------------------
 1437|       |
 1438|       |    // Parse opening brace
 1439|  45.1k|    parseToken(LEFT_CURLY_BRACE, status);
  ------------------
  |  |   32|  45.1k|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
 1440|       |    // Optional whitespace after opening brace
 1441|  45.1k|    parseOptionalWhitespace();
 1442|       |
 1443|  45.1k|    Expression::Builder exprBuilder(status);
 1444|       |    // Restore precondition
 1445|  45.1k|    if (!inBounds()) {
  ------------------
  |  Branch (1445:9): [True: 60, False: 45.0k]
  ------------------
 1446|     60|        exprFallback(exprBuilder);
 1447|  45.0k|    } else {
 1448|       |        // literal '|', variable '$' or annotation
 1449|  45.0k|        switch (peek()) {
 1450|    276|        case PIPE: {
  ------------------
  |  |   39|    276|#define PIPE ((UChar32)0x007C)
  ------------------
  |  Branch (1450:9): [True: 276, False: 44.8k]
  ------------------
 1451|       |            // Quoted literal
 1452|    276|            parseLiteralOrVariableWithAnnotation(false, exprBuilder, status);
 1453|    276|            break;
 1454|      0|        }
 1455|    560|        case DOLLAR: {
  ------------------
  |  |   41|    560|#define DOLLAR ((UChar32)0x0024)
  ------------------
  |  Branch (1455:9): [True: 560, False: 44.5k]
  ------------------
 1456|       |            // Variable
 1457|    560|            parseLiteralOrVariableWithAnnotation(true, exprBuilder, status);
 1458|    560|            break;
 1459|      0|        }
 1460|  44.2k|        default: {
  ------------------
  |  Branch (1460:9): [True: 44.2k, False: 836]
  ------------------
 1461|  44.2k|            if (isAnnotationStart(peek())) {
  ------------------
  |  Branch (1461:17): [True: 29.4k, False: 14.7k]
  ------------------
 1462|  29.4k|                Operator rator = parseAnnotation(status);
 1463|  29.4k|                exprBuilder.setOperator(std::move(rator));
 1464|  29.4k|            } else if (isUnquotedStart(peek())) {
  ------------------
  |  Branch (1464:24): [True: 13.3k, False: 1.38k]
  ------------------
 1465|       |                // Unquoted literal
 1466|  13.3k|                parseLiteralOrVariableWithAnnotation(false, exprBuilder, status);
 1467|  13.3k|            } else {
 1468|       |                // Not a literal, variable or annotation -- error out
 1469|  1.38k|                ERROR(status);
  ------------------
  |  |   33|  1.38k|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 534, False: 852]
  |  |  ------------------
  |  |   34|    534|        setParseError(parseError, index);                                                               \
  |  |   35|    534|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|    534|    }
  ------------------
 1470|  1.38k|                exprFallback(exprBuilder);
 1471|  1.38k|                break;
 1472|  1.38k|            }
 1473|  42.8k|            break;
 1474|  44.2k|        }
 1475|  45.0k|        }
 1476|  45.0k|    }
 1477|       |
 1478|       |    // Parse attributes
 1479|  45.1k|    AttributeAdder<Expression::Builder> attrAdder(exprBuilder);
 1480|  45.1k|    parseAttributes(attrAdder, status);
 1481|       |
 1482|       |    // Parse optional space
 1483|       |    // (the last [s] in e.g. "{" [s] literal [s annotation] *(s attribute) [s] "}")
 1484|  45.1k|    parseOptionalWhitespace();
 1485|       |
 1486|       |    // Either an operand or operator (or both) must have been set already,
 1487|       |    // so there can't be an error
 1488|  45.1k|    UErrorCode localStatus = U_ZERO_ERROR;
 1489|  45.1k|    Expression result = exprBuilder.build(localStatus);
 1490|  45.1k|    U_ASSERT(U_SUCCESS(localStatus));
  ------------------
  |  |   35|  45.1k|#   define U_ASSERT(exp) (void)0
  ------------------
 1491|       |
 1492|       |    // Check for end-of-input and missing '}'
 1493|  45.1k|    if (!inBounds()) {
  ------------------
  |  Branch (1493:9): [True: 848, False: 44.2k]
  ------------------
 1494|    848|        ERROR(status);
  ------------------
  |  |   33|    848|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 2, False: 846]
  |  |  ------------------
  |  |   34|      2|        setParseError(parseError, index);                                                               \
  |  |   35|      2|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      2|    }
  ------------------
 1495|  44.2k|    } else {
 1496|       |        // Otherwise, it's safe to check for the '}'
 1497|  44.2k|        parseToken(RIGHT_CURLY_BRACE, status);
  ------------------
  |  |   33|  44.2k|#define RIGHT_CURLY_BRACE ((UChar32)0x007D)
  ------------------
 1498|  44.2k|    }
 1499|  45.1k|    return result;
 1500|  45.1k|}
_ZN6icu_788message26Parser21parseLocalDeclarationER10UErrorCode:
 1506|  5.57k|void Parser::parseLocalDeclaration(UErrorCode& status) {
 1507|       |    // End-of-input here would be an error; even empty
 1508|       |    // declarations must be followed by a body
 1509|  5.57k|    CHECK_BOUNDS(status);
  ------------------
  |  |   60|  5.57k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 5.57k]
  |  |  ------------------
  |  |   61|      0|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|      0|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      0|    }
  |  |  ------------------
  |  |   62|      0|        return;                                                                            \
  |  |   63|      0|    }
  ------------------
 1510|       |
 1511|  5.57k|    parseToken(ID_LOCAL, status);
 1512|  5.57k|    parseRequiredWhitespace(status);
 1513|       |
 1514|       |    // Restore precondition
 1515|  5.57k|    CHECK_BOUNDS(status);
  ------------------
  |  |   60|  5.57k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 10, False: 5.56k]
  |  |  ------------------
  |  |   61|     10|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|     10|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 0, False: 10]
  |  |  |  |  ------------------
  |  |  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      0|    }
  |  |  ------------------
  |  |   62|     10|        return;                                                                            \
  |  |   63|     10|    }
  ------------------
 1516|  5.56k|    VariableName lhs = parseVariableName(status);
 1517|  5.56k|    parseTokenWithWhitespace(EQUALS, status);
  ------------------
  |  |   40|  5.56k|#define EQUALS ((UChar32)0x003D)
  ------------------
 1518|       |    // Restore precondition before calling parseExpression()
 1519|  5.56k|    CHECK_BOUNDS(status);
  ------------------
  |  |   60|  5.56k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 9, False: 5.56k]
  |  |  ------------------
  |  |   61|      9|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|      9|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 0, False: 9]
  |  |  |  |  ------------------
  |  |  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      0|    }
  |  |  ------------------
  |  |   62|      9|        return;                                                                            \
  |  |   63|      9|    }
  ------------------
 1520|       |
 1521|  5.56k|    Expression rhs = parseExpression(status);
 1522|       |
 1523|       |    // Add binding from lhs to rhs, unless there was an error
 1524|       |    // (This ensures that if there was a correct lhs but a
 1525|       |    // parse error in rhs, the fallback for uses of the
 1526|       |    // lhs will be its own name rather than the rhs)
 1527|       |    /* This affects the behavior of this test case, which the spec
 1528|       |       is ambiguous about:
 1529|       |
 1530|       |       .local $bar {|foo|} {{{$bar}}}
 1531|       |
 1532|       |       Should `$bar` still be bound to a value although
 1533|       |       its declaration is syntactically incorrect (missing the '=')?
 1534|       |       This code says no, but it needs to change if
 1535|       |       https://github.com/unicode-org/message-format-wg/issues/703
 1536|       |       is resolved differently.
 1537|       |    */
 1538|  5.56k|    CHECK_ERROR(status);
  ------------------
  |  |   73|  5.56k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 5.56k]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
 1539|  5.56k|    if (!errors.hasSyntaxError()) {
  ------------------
  |  Branch (1539:9): [True: 0, False: 5.56k]
  ------------------
 1540|      0|        dataModel.addBinding(Binding(std::move(lhs), std::move(rhs)), status);
 1541|       |        // Check if status is U_DUPLICATE_DECLARATION_ERROR
 1542|       |        // and add that as an internal error if so
 1543|      0|        if (status == U_MF_DUPLICATE_DECLARATION_ERROR) {
  ------------------
  |  Branch (1543:13): [True: 0, False: 0]
  ------------------
 1544|      0|            status = U_ZERO_ERROR;
 1545|      0|            errors.addError(StaticErrorType::DuplicateDeclarationError, status);
 1546|      0|        }
 1547|      0|    }
 1548|  5.56k|}
_ZN6icu_788message26Parser21parseInputDeclarationER10UErrorCode:
 1554|  29.8k|void Parser::parseInputDeclaration(UErrorCode& status) {
 1555|       |    // End-of-input here would be an error; even empty
 1556|       |    // declarations must be followed by a body
 1557|  29.8k|    CHECK_BOUNDS(status);
  ------------------
  |  |   60|  29.8k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 29.8k]
  |  |  ------------------
  |  |   61|      0|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|      0|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      0|    }
  |  |  ------------------
  |  |   62|      0|        return;                                                                            \
  |  |   63|      0|    }
  ------------------
 1558|       |
 1559|  29.8k|    parseToken(ID_INPUT, status);
 1560|  29.8k|    parseOptionalWhitespace();
 1561|       |
 1562|       |    // Restore precondition before calling parseExpression()
 1563|  29.8k|    CHECK_BOUNDS(status);
  ------------------
  |  |   60|  29.8k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 10, False: 29.8k]
  |  |  ------------------
  |  |   61|     10|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|     10|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 0, False: 10]
  |  |  |  |  ------------------
  |  |  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      0|    }
  |  |  ------------------
  |  |   62|     10|        return;                                                                            \
  |  |   63|     10|    }
  ------------------
 1564|       |
 1565|       |    // Save the index for error diagnostics
 1566|  29.8k|    int32_t exprIndex = index;
 1567|  29.8k|    Expression rhs = parseExpression(status);
 1568|       |
 1569|       |    // Here we have to check that the rhs is a variable-expression
 1570|  29.8k|    if (!rhs.getOperand().isVariable()) {
  ------------------
  |  Branch (1570:9): [True: 29.2k, False: 516]
  ------------------
 1571|       |        // This case is a syntax error; report it at the beginning
 1572|       |        // of the expression
 1573|  29.2k|        ERROR_AT(status, exprIndex);
  ------------------
  |  |   39|  29.2k|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (39:9): [True: 0, False: 29.2k]
  |  |  ------------------
  |  |   40|      0|        setParseError(parseError, i);                                                                   \
  |  |   41|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   42|      0|    }
  ------------------
 1574|  29.2k|        return;
 1575|  29.2k|    }
 1576|       |
 1577|    516|    VariableName lhs = rhs.getOperand().asVariable();
 1578|       |
 1579|       |    // Add binding from lhs to rhs
 1580|       |    // This just adds a new local variable that shadows the message
 1581|       |    // argument referred to, which is harmless.
 1582|       |    // When evaluating the RHS, the new local is not in scope
 1583|       |    // and the message argument will be correctly referred to.
 1584|    516|    CHECK_ERROR(status);
  ------------------
  |  |   73|    516|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 516]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
 1585|    516|    if (!errors.hasSyntaxError()) {
  ------------------
  |  Branch (1585:9): [True: 0, False: 516]
  ------------------
 1586|      0|        dataModel.addBinding(Binding::input(std::move(lhs), std::move(rhs), status), status);
 1587|       |        // Check if status is U_MF_DUPLICATE_DECLARATION_ERROR
 1588|       |        // and add that as an internal error if so
 1589|      0|        if (status == U_MF_DUPLICATE_DECLARATION_ERROR) {
  ------------------
  |  Branch (1589:13): [True: 0, False: 0]
  ------------------
 1590|      0|            status = U_ZERO_ERROR;
 1591|      0|            errors.addError(StaticErrorType::DuplicateDeclarationError, status);
 1592|      0|        }
 1593|      0|    }
 1594|    516|}
_ZN6icu_788message26Parser17parseDeclarationsER10UErrorCode:
 1602|  1.15k|void Parser::parseDeclarations(UErrorCode& status) {
 1603|       |    // End-of-input here would be an error; even empty
 1604|       |    // declarations must be followed by a body
 1605|  1.15k|    CHECK_BOUNDS(status);
  ------------------
  |  |   60|  1.15k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 1.15k]
  |  |  ------------------
  |  |   61|      0|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|      0|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      0|    }
  |  |  ------------------
  |  |   62|      0|        return;                                                                            \
  |  |   63|      0|    }
  ------------------
 1606|       |
 1607|  36.3k|    while (peek() == PERIOD) {
  ------------------
  |  |   45|  36.3k|#define PERIOD ((UChar32)0x002E)
  ------------------
  |  Branch (1607:12): [True: 36.1k, False: 205]
  ------------------
 1608|  36.1k|        CHECK_BOUNDS_1(status);
  ------------------
  |  |   65|  36.1k|    if (!inBounds(1)) {                                                                    \
  |  |  ------------------
  |  |  |  Branch (65:9): [True: 19, False: 36.1k]
  |  |  ------------------
  |  |   66|     19|        ERROR_AT(errorCode, index + 1);                                                    \
  |  |  ------------------
  |  |  |  |   39|     19|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (39:9): [True: 2, False: 17]
  |  |  |  |  ------------------
  |  |  |  |   40|      2|        setParseError(parseError, i);                                                                   \
  |  |  |  |   41|      2|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   42|      2|    }
  |  |  ------------------
  |  |   67|     19|        return;                                                                            \
  |  |   68|     19|    }
  ------------------
 1609|  36.1k|        if (peek(1) == ID_LOCAL[1]) {
  ------------------
  |  Branch (1609:13): [True: 5.57k, False: 30.5k]
  ------------------
 1610|  5.57k|            parseLocalDeclaration(status);
 1611|  30.5k|        } else if (peek(1) == ID_INPUT[1]) {
  ------------------
  |  Branch (1611:20): [True: 29.8k, False: 778]
  ------------------
 1612|  29.8k|            parseInputDeclaration(status);
 1613|  29.8k|        } else {
 1614|       |            // Done parsing declarations
 1615|    778|            break;
 1616|    778|        }
 1617|       |
 1618|       |        // Avoid looping infinitely
 1619|  35.3k|        CHECK_ERROR(status);
  ------------------
  |  |   73|  35.3k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 35.3k]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
 1620|       |
 1621|  35.3k|        parseOptionalWhitespace();
 1622|       |        // Restore precondition
 1623|  35.3k|        CHECK_BOUNDS(status);
  ------------------
  |  |   60|  35.3k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 155, False: 35.2k]
  |  |  ------------------
  |  |   61|    155|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|    155|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 0, False: 155]
  |  |  |  |  ------------------
  |  |  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      0|    }
  |  |  ------------------
  |  |   62|    155|        return;                                                                            \
  |  |   63|    155|    }
  ------------------
 1624|  35.2k|    }
 1625|  1.15k|}
_ZN6icu_788message26Parser13parseTextCharER10UErrorCode:
 1633|  12.1M|UnicodeString Parser::parseTextChar(UErrorCode& status) {
 1634|  12.1M|    UnicodeString str;
 1635|  12.1M|    if (!inBounds() || !(isTextChar(peek()))) {
  ------------------
  |  Branch (1635:9): [True: 0, False: 12.1M]
  |  Branch (1635:24): [True: 241, False: 12.1M]
  ------------------
 1636|       |        // Error -- text-char is expected here
 1637|    241|        ERROR(status);
  ------------------
  |  |   33|    241|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 212, False: 29]
  |  |  ------------------
  |  |   34|    212|        setParseError(parseError, index);                                                               \
  |  |   35|    212|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|    212|    }
  ------------------
 1638|  12.1M|    } else {
 1639|       |        // See comment in parseQuotedLiteral()
 1640|  12.1M|        if (isEscapableChar(peek())) {
  ------------------
  |  Branch (1640:13): [True: 74.5k, False: 12.1M]
  ------------------
 1641|  74.5k|            normalizedInput += BACKSLASH;
 1642|  74.5k|        }
 1643|  12.1M|        normalizedInput += peek();
 1644|  12.1M|        str += peek();
 1645|  12.1M|        next();
 1646|  12.1M|        maybeAdvanceLine();
 1647|  12.1M|    }
 1648|  12.1M|    return str;
 1649|  12.1M|}
_ZN6icu_788message26Parser8parseKeyER10UErrorCode:
 1655|  1.06M|Key Parser::parseKey(UErrorCode& status) {
 1656|  1.06M|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  1.06M|#   define U_ASSERT(exp) (void)0
  ------------------
 1657|       |
 1658|  1.06M|    Key k; // wildcard by default
 1659|       |    // Literal | '*'
 1660|  1.06M|    switch (peek()) {
 1661|  4.10k|    case ASTERISK: {
  ------------------
  |  Branch (1661:5): [True: 4.10k, False: 1.05M]
  ------------------
 1662|  4.10k|        next();
 1663|  4.10k|        normalizedInput += ASTERISK;
 1664|       |        // Guarantee postcondition
 1665|  4.10k|        if (!inBounds()) {
  ------------------
  |  Branch (1665:13): [True: 7, False: 4.09k]
  ------------------
 1666|      7|            ERROR(status);
  ------------------
  |  |   33|      7|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 0, False: 7]
  |  |  ------------------
  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      0|    }
  ------------------
 1667|      7|            return k;
 1668|      7|        }
 1669|  4.09k|        break;
 1670|  4.10k|    }
 1671|  1.05M|    default: {
  ------------------
  |  Branch (1671:5): [True: 1.05M, False: 4.10k]
  ------------------
 1672|       |        // Literal
 1673|  1.05M|        k = Key(parseLiteral(status));
 1674|  1.05M|        break;
 1675|  4.10k|    }
 1676|  1.06M|    }
 1677|  1.06M|    return k;
 1678|  1.06M|}
_ZN6icu_788message26Parser17parseNonEmptyKeysER10UErrorCode:
 1685|    545|SelectorKeys Parser::parseNonEmptyKeys(UErrorCode& status) {
 1686|    545|    SelectorKeys result;
 1687|       |
 1688|    545|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1688:9): [True: 0, False: 545]
  ------------------
 1689|      0|        return result;
 1690|      0|    }
 1691|       |
 1692|    545|    U_ASSERT(inBounds());
  ------------------
  |  |   35|    545|#   define U_ASSERT(exp) (void)0
  ------------------
 1693|       |
 1694|       |/*
 1695|       |Arbitrary lookahead is required to parse key lists. To see why, consider
 1696|       |this rule from the grammar:
 1697|       |
 1698|       |variant = key *(s key) [s] quoted-pattern
 1699|       |
 1700|       |And this example:
 1701|       |when k1 k2   {a}
 1702|       |
 1703|       |Derivation:
 1704|       |   variant -> key *(s key) [s] quoted-pattern
 1705|       |           -> key s key *(s key) quoted-pattern
 1706|       |
 1707|       |After matching ' ' to `s` and 'k2' to `key`, it would require arbitrary lookahead
 1708|       |to know whether to expect the start of a pattern or the start of another key.
 1709|       |In other words: is the second whitespace sequence the required space in *(s key),
 1710|       |or the optional space in [s] quoted-pattern?
 1711|       |
 1712|       |This is addressed using "backtracking" (similarly to `parseOptions()`).
 1713|       |*/
 1714|       |
 1715|    545|    SelectorKeys::Builder keysBuilder(status);
 1716|    545|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1716:9): [True: 0, False: 545]
  ------------------
 1717|      0|        return result;
 1718|      0|    }
 1719|       |
 1720|       |    // Since the first key is required, it's simplest to parse it separately.
 1721|    545|    keysBuilder.add(parseKey(status), status);
 1722|       |
 1723|       |    // Restore precondition
 1724|    545|    if (!inBounds()) {
  ------------------
  |  Branch (1724:9): [True: 44, False: 501]
  ------------------
 1725|     44|        ERROR(status);
  ------------------
  |  |   33|     44|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 0, False: 44]
  |  |  ------------------
  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      0|    }
  ------------------
 1726|     44|        return result;
 1727|     44|    }
 1728|       |
 1729|       |    // We've seen at least one whitespace-key pair, so now we can parse
 1730|       |    // *(s key) [s]
 1731|  1.06M|    while (peek() != LEFT_CURLY_BRACE || isWhitespace(peek()) || isBidiControl(peek())) {
  ------------------
  |  |   32|  2.12M|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
  |  Branch (1731:12): [True: 1.06M, False: 169]
  |  Branch (1731:42): [True: 0, False: 169]
  |  Branch (1731:66): [True: 0, False: 169]
  ------------------
 1732|  1.06M|        bool wasWhitespace = isWhitespace(peek()) || isBidiControl(peek());
  ------------------
  |  Branch (1732:30): [True: 25.0k, False: 1.03M]
  |  Branch (1732:54): [True: 676, False: 1.03M]
  ------------------
 1733|  1.06M|        parseRequiredWhitespace(status);
 1734|  1.06M|        if (!wasWhitespace) {
  ------------------
  |  Branch (1734:13): [True: 1.03M, False: 25.6k]
  ------------------
 1735|       |            // Avoid infinite loop when parsing something like:
 1736|       |            // when * @{!...
 1737|  1.03M|            next();
 1738|  1.03M|        }
 1739|       |
 1740|       |        // Restore precondition
 1741|  1.06M|        if (!inBounds()) {
  ------------------
  |  Branch (1741:13): [True: 228, False: 1.06M]
  ------------------
 1742|    228|            ERROR(status);
  ------------------
  |  |   33|    228|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 0, False: 228]
  |  |  ------------------
  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      0|    }
  ------------------
 1743|    228|            return result;
 1744|    228|        }
 1745|       |
 1746|       |        // At this point, it's ambiguous whether we are inside (s key) or [s].
 1747|       |        // This check resolves that ambiguity.
 1748|  1.06M|        if (peek() == LEFT_CURLY_BRACE) {
  ------------------
  |  |   32|  1.06M|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
  |  Branch (1748:13): [True: 104, False: 1.06M]
  ------------------
 1749|       |            // A pattern follows, so what we just parsed was the optional
 1750|       |            // trailing whitespace. All the keys have been parsed.
 1751|       |
 1752|       |            // Unpush the whitespace from `normalizedInput`
 1753|    104|            normalizedInput.truncate(normalizedInput.length() - 1);
 1754|    104|            break;
 1755|    104|        }
 1756|  1.06M|        keysBuilder.add(parseKey(status), status);
 1757|  1.06M|    }
 1758|       |
 1759|    273|    return keysBuilder.build(status);
 1760|    501|}
_ZN6icu_788message26Parser18parseQuotedPatternER10UErrorCode:
 1762|    287|Pattern Parser::parseQuotedPattern(UErrorCode& status) {
 1763|    287|    U_ASSERT(inBounds());
  ------------------
  |  |   35|    287|#   define U_ASSERT(exp) (void)0
  ------------------
 1764|       |
 1765|    287|    parseToken(LEFT_CURLY_BRACE, status);
  ------------------
  |  |   32|    287|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
 1766|    287|    parseToken(LEFT_CURLY_BRACE, status);
  ------------------
  |  |   32|    287|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
 1767|    287|    Pattern p = parseSimpleMessage(status);
 1768|    287|    parseToken(RIGHT_CURLY_BRACE, status);
  ------------------
  |  |   33|    287|#define RIGHT_CURLY_BRACE ((UChar32)0x007D)
  ------------------
 1769|    287|    parseToken(RIGHT_CURLY_BRACE, status);
  ------------------
  |  |   33|    287|#define RIGHT_CURLY_BRACE ((UChar32)0x007D)
  ------------------
 1770|    287|    return p;
 1771|    287|}
_ZN6icu_788message26Parser11parseMarkupER10UErrorCode:
 1777|  23.3k|Markup Parser::parseMarkup(UErrorCode& status) {
 1778|  23.3k|    U_ASSERT(inBounds(1));
  ------------------
  |  |   35|  23.3k|#   define U_ASSERT(exp) (void)0
  ------------------
 1779|       |
 1780|  23.3k|    U_ASSERT(peek() == LEFT_CURLY_BRACE);
  ------------------
  |  |   35|  23.3k|#   define U_ASSERT(exp) (void)0
  ------------------
 1781|       |
 1782|  23.3k|    Markup::Builder builder(status);
 1783|  23.3k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1783:9): [True: 0, False: 23.3k]
  ------------------
 1784|      0|        return {};
 1785|      0|    }
 1786|       |
 1787|       |    // Consume the '{'
 1788|  23.3k|    next();
 1789|  23.3k|    normalizedInput += LEFT_CURLY_BRACE;
  ------------------
  |  |   32|  23.3k|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
 1790|  23.3k|    parseOptionalWhitespace();
 1791|  23.3k|    bool closing = false;
 1792|  23.3k|    switch (peek()) {
 1793|  21.1k|    case NUMBER_SIGN: {
  ------------------
  |  Branch (1793:5): [True: 21.1k, False: 2.25k]
  ------------------
 1794|       |        // Open or standalone; consume the '#'
 1795|  21.1k|        normalizedInput += peek();
 1796|  21.1k|        next();
 1797|  21.1k|        break;
 1798|      0|    }
 1799|  2.25k|    case SLASH: {
  ------------------
  |  Branch (1799:5): [True: 2.25k, False: 21.1k]
  ------------------
 1800|       |        // Closing
 1801|  2.25k|        normalizedInput += peek();
 1802|  2.25k|        closing = true;
 1803|  2.25k|        next();
 1804|  2.25k|        break;
 1805|      0|    }
 1806|      0|    default: {
  ------------------
  |  Branch (1806:5): [True: 0, False: 23.3k]
  ------------------
 1807|      0|        ERROR(status);
  ------------------
  |  |   33|      0|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 0, False: 0]
  |  |  ------------------
  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      0|    }
  ------------------
 1808|      0|        return {};
 1809|      0|    }
 1810|  23.3k|    }
 1811|       |
 1812|       |    // Parse the markup identifier
 1813|  23.3k|    builder.setName(parseIdentifier(status));
 1814|       |
 1815|       |    // Parse the options, which must begin with a ' '
 1816|       |    // if present
 1817|  23.3k|    if (inBounds() && (isWhitespace(peek()) || isBidiControl(peek()))) {
  ------------------
  |  Branch (1817:9): [True: 23.2k, False: 131]
  |  Branch (1817:24): [True: 15.3k, False: 7.90k]
  |  Branch (1817:48): [True: 0, False: 7.90k]
  ------------------
 1818|  15.3k|        OptionAdder<Markup::Builder> optionAdder(builder);
 1819|  15.3k|        parseOptions(optionAdder, status);
 1820|  15.3k|    }
 1821|       |
 1822|       |    // Parse the attributes, which also must begin
 1823|       |    // with a ' '
 1824|  23.3k|    if (inBounds() && (isWhitespace(peek()) || isBidiControl(peek()))) {
  ------------------
  |  Branch (1824:9): [True: 23.0k, False: 290]
  |  Branch (1824:24): [True: 14.6k, False: 8.46k]
  |  Branch (1824:48): [True: 38, False: 8.43k]
  ------------------
 1825|  14.6k|        AttributeAdder<Markup::Builder> attrAdder(builder);
 1826|  14.6k|        parseAttributes(attrAdder, status);
 1827|  14.6k|    }
 1828|       |
 1829|  23.3k|    parseOptionalWhitespace();
 1830|       |
 1831|  23.3k|    bool standalone = false;
 1832|       |    // Check if this is a standalone or not
 1833|  23.3k|    if (!closing) {
  ------------------
  |  Branch (1833:9): [True: 21.1k, False: 2.25k]
  ------------------
 1834|  21.1k|        if (inBounds() && peek() == SLASH) {
  ------------------
  |  Branch (1834:13): [True: 21.0k, False: 70]
  |  Branch (1834:27): [True: 277, False: 20.7k]
  ------------------
 1835|    277|            standalone = true;
 1836|    277|            normalizedInput += SLASH;
 1837|    277|            next();
 1838|    277|        }
 1839|  21.1k|    }
 1840|       |
 1841|  23.3k|    parseToken(RIGHT_CURLY_BRACE, status);
  ------------------
  |  |   33|  23.3k|#define RIGHT_CURLY_BRACE ((UChar32)0x007D)
  ------------------
 1842|       |
 1843|  23.3k|    if (standalone) {
  ------------------
  |  Branch (1843:9): [True: 277, False: 23.1k]
  ------------------
 1844|    277|        builder.setStandalone();
 1845|  23.1k|    } else if (closing) {
  ------------------
  |  Branch (1845:16): [True: 2.25k, False: 20.8k]
  ------------------
 1846|  2.25k|        builder.setClose();
 1847|  20.8k|    } else {
 1848|  20.8k|        builder.setOpen();
 1849|  20.8k|    }
 1850|       |
 1851|  23.3k|    return builder.build(status);
 1852|  23.3k|}
_ZN6icu_788message26Parser16parsePlaceholderER10UErrorCode:
 1858|  33.1k|std::variant<Expression, Markup> Parser::parsePlaceholder(UErrorCode& status) {
 1859|  33.1k|    U_ASSERT(peek() == LEFT_CURLY_BRACE);
  ------------------
  |  |   35|  33.1k|#   define U_ASSERT(exp) (void)0
  ------------------
 1860|       |
 1861|  33.1k|    if (!inBounds()) {
  ------------------
  |  Branch (1861:9): [True: 0, False: 33.1k]
  ------------------
 1862|      0|        ERROR(status);
  ------------------
  |  |   33|      0|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 0, False: 0]
  |  |  ------------------
  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      0|    }
  ------------------
 1863|      0|        return exprFallback(status);
 1864|      0|    }
 1865|       |
 1866|       |    // Need to look ahead arbitrarily since whitespace
 1867|       |    // can appear before the '{' and '#'
 1868|       |    // in markup
 1869|  33.1k|    int32_t tempIndex = 1;
 1870|  33.1k|    bool isMarkup = false;
 1871|  33.9k|    while (inBounds(1)) {
  ------------------
  |  Branch (1871:12): [True: 33.9k, False: 25]
  ------------------
 1872|  33.9k|        UChar32 c = peek(tempIndex);
 1873|  33.9k|        if (c == NUMBER_SIGN || c == SLASH) {
  ------------------
  |  Branch (1873:13): [True: 21.1k, False: 12.8k]
  |  Branch (1873:33): [True: 2.25k, False: 10.5k]
  ------------------
 1874|  23.3k|            isMarkup = true;
 1875|  23.3k|            break;
 1876|  23.3k|        }
 1877|  10.5k|        if (!(isWhitespace(c) || isBidiControl(c))) {
  ------------------
  |  Branch (1877:15): [True: 341, False: 10.2k]
  |  Branch (1877:34): [True: 475, False: 9.74k]
  ------------------
 1878|  9.74k|            break;
 1879|  9.74k|        }
 1880|    816|        tempIndex++;
 1881|    816|    }
 1882|       |
 1883|  33.1k|    if (isMarkup) {
  ------------------
  |  Branch (1883:9): [True: 23.3k, False: 9.77k]
  ------------------
 1884|  23.3k|        return parseMarkup(status);
 1885|  23.3k|    }
 1886|  9.77k|    return parseExpression(status);
 1887|  33.1k|}
_ZN6icu_788message26Parser18parseSimpleMessageER10UErrorCode:
 1894|  6.72k|Pattern Parser::parseSimpleMessage(UErrorCode& status) {
 1895|  6.72k|    Pattern::Builder result(status);
 1896|       |
 1897|  6.72k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1897:9): [True: 6.72k, False: 0]
  ------------------
 1898|  6.72k|        Expression expression;
 1899|  12.2M|        while (inBounds()) {
  ------------------
  |  Branch (1899:16): [True: 12.2M, False: 562]
  ------------------
 1900|  12.2M|            switch (peek()) {
 1901|  33.1k|            case LEFT_CURLY_BRACE: {
  ------------------
  |  |   32|  33.1k|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
  |  Branch (1901:13): [True: 33.1k, False: 12.1M]
  ------------------
 1902|       |                // Must be placeholder
 1903|  33.1k|                std::variant<Expression, Markup> piece = parsePlaceholder(status);
 1904|  33.1k|                if (std::holds_alternative<Expression>(piece)) {
  ------------------
  |  Branch (1904:21): [True: 9.77k, False: 23.3k]
  ------------------
 1905|  9.77k|                    Expression expr = *std::get_if<Expression>(&piece);
 1906|  9.77k|                    result.add(std::move(expr), status);
 1907|  23.3k|                } else {
 1908|  23.3k|                    Markup markup = *std::get_if<Markup>(&piece);
 1909|  23.3k|                    result.add(std::move(markup), status);
 1910|  23.3k|                }
 1911|  33.1k|                break;
 1912|      0|            }
 1913|  1.50k|            case BACKSLASH: {
  ------------------
  |  Branch (1913:13): [True: 1.50k, False: 12.2M]
  ------------------
 1914|       |                // Must be escaped-char
 1915|  1.50k|                result.add(parseEscapeSequence(status), status);
 1916|  1.50k|                break;
 1917|      0|            }
 1918|     11|            case RIGHT_CURLY_BRACE: {
  ------------------
  |  |   33|     11|#define RIGHT_CURLY_BRACE ((UChar32)0x007D)
  ------------------
  |  Branch (1918:13): [True: 11, False: 12.2M]
  ------------------
 1919|       |                // Distinguish unescaped '}' from end of quoted pattern
 1920|     11|                break;
 1921|      0|            }
 1922|  12.1M|            default: {
  ------------------
  |  Branch (1922:13): [True: 12.1M, False: 34.6k]
  ------------------
 1923|       |                // Must be text-char
 1924|  12.1M|                result.add(parseTextChar(status), status);
 1925|  12.1M|                break;
 1926|      0|            }
 1927|  12.2M|            }
 1928|  12.2M|            if (peek() == RIGHT_CURLY_BRACE) {
  ------------------
  |  |   33|  12.2M|#define RIGHT_CURLY_BRACE ((UChar32)0x007D)
  ------------------
  |  Branch (1928:17): [True: 159, False: 12.2M]
  ------------------
 1929|       |                // End of quoted pattern
 1930|    159|                break;
 1931|    159|            }
 1932|       |            // Don't loop infinitely
 1933|  12.2M|            if (errors.hasSyntaxError() || U_FAILURE(status)) {
  ------------------
  |  Branch (1933:17): [True: 6.00k, False: 12.2M]
  |  Branch (1933:44): [True: 3, False: 12.2M]
  ------------------
 1934|  6.00k|                break;
 1935|  6.00k|            }
 1936|  12.2M|        }
 1937|  6.72k|    }
 1938|  6.72k|    return result.build(status);
 1939|  6.72k|}
_ZN6icu_788message26Parser12parseVariantER10UErrorCode:
 1941|    547|void Parser::parseVariant(UErrorCode& status) {
 1942|    547|    CHECK_ERROR(status);
  ------------------
  |  |   73|    547|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 2, False: 545]
  |  |  ------------------
  |  |   74|      2|        return;                                                                                         \
  |  |   75|      2|    }
  ------------------
 1943|       |
 1944|       |    // At least one key is required
 1945|    545|    SelectorKeys keyList(parseNonEmptyKeys(status));
 1946|       |
 1947|       |    // parseNonEmptyKeys() consumes any trailing whitespace,
 1948|       |    // so the pattern can be consumed next.
 1949|       |
 1950|       |    // Restore precondition before calling parsePattern()
 1951|       |    // (which must return a non-null value)
 1952|    545|    CHECK_BOUNDS(status);
  ------------------
  |  |   60|    545|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 272, False: 273]
  |  |  ------------------
  |  |   61|    272|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|    272|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 0, False: 272]
  |  |  |  |  ------------------
  |  |  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      0|    }
  |  |  ------------------
  |  |   62|    272|        return;                                                                            \
  |  |   63|    272|    }
  ------------------
 1953|    273|    Pattern rhs = parseQuotedPattern(status);
 1954|       |
 1955|    273|    dataModel.addVariant(std::move(keyList), std::move(rhs), status);
 1956|    273|}
_ZN6icu_788message26Parser14parseSelectorsER10UErrorCode:
 1965|    797|void Parser::parseSelectors(UErrorCode& status) {
 1966|    797|    CHECK_ERROR(status);
  ------------------
  |  |   73|    797|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 797]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
 1967|       |
 1968|    797|    U_ASSERT(inBounds());
  ------------------
  |  |   35|    797|#   define U_ASSERT(exp) (void)0
  ------------------
 1969|       |
 1970|    797|    parseToken(ID_MATCH, status);
 1971|       |
 1972|    797|    bool empty = true;
 1973|       |    // Parse selectors
 1974|       |    // "Backtracking" is required here. It's not clear if whitespace is
 1975|       |    // (`[s]` selector) or (`[s]` variant)
 1976|  67.1k|    while (isWhitespace(peek()) || peek() == DOLLAR) {
  ------------------
  |  |   41|  66.6k|#define DOLLAR ((UChar32)0x0024)
  ------------------
  |  Branch (1976:12): [True: 470, False: 66.6k]
  |  Branch (1976:36): [True: 65.9k, False: 702]
  ------------------
 1977|  66.4k|        int32_t whitespaceStart = index;
 1978|  66.4k|        parseRequiredWhitespace(status);
 1979|       |        // Restore precondition
 1980|  66.4k|        CHECK_BOUNDS(status);
  ------------------
  |  |   60|  66.4k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 16, False: 66.3k]
  |  |  ------------------
  |  |   61|     16|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|     16|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 1, False: 15]
  |  |  |  |  ------------------
  |  |  |  |   34|      1|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      1|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      1|    }
  |  |  ------------------
  |  |   62|     16|        return;                                                                            \
  |  |   63|     16|    }
  ------------------
 1981|  66.3k|        if (peek() != DOLLAR) {
  ------------------
  |  |   41|  66.3k|#define DOLLAR ((UChar32)0x0024)
  ------------------
  |  Branch (1981:13): [True: 79, False: 66.3k]
  ------------------
 1982|       |            // This is not necessarily an error, but rather,
 1983|       |            // means the whitespace we parsed was the optional
 1984|       |            // whitespace preceding the first variant, not the
 1985|       |            // required whitespace preceding a subsequent variable.
 1986|       |            // In that case, "push back" the whitespace.
 1987|     79|            normalizedInput.truncate(normalizedInput.length() - 1);
 1988|     79|            index = whitespaceStart;
 1989|     79|            break;
 1990|     79|        }
 1991|  66.3k|        VariableName var = parseVariableName(status);
 1992|  66.3k|        empty = false;
 1993|       |
 1994|  66.3k|        dataModel.addSelector(std::move(var), status);
 1995|  66.3k|        CHECK_ERROR(status);
  ------------------
  |  |   73|  66.3k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 66.3k]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
 1996|  66.3k|    }
 1997|       |
 1998|       |    // At least one selector is required
 1999|    781|    if (empty) {
  ------------------
  |  Branch (1999:9): [True: 254, False: 527]
  ------------------
 2000|    254|        ERROR(status);
  ------------------
  |  |   33|    254|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 4, False: 250]
  |  |  ------------------
  |  |   34|      4|        setParseError(parseError, index);                                                               \
  |  |   35|      4|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      4|    }
  ------------------
 2001|    254|        return;
 2002|    254|    }
 2003|       |
 2004|    527|    #define CHECK_END_OF_INPUT                     \
 2005|    527|        if (!inBounds()) {                         \
 2006|    527|            break;                                 \
 2007|    527|        }                                          \
 2008|    527|
 2009|       |    // Parse variants
 2010|       |    // matcher = match-statement s variant *(o variant)
 2011|       |
 2012|       |    // Parse first variant
 2013|    527|    parseRequiredWhitespace(status);
 2014|    527|    if (!inBounds()) {
  ------------------
  |  Branch (2014:9): [True: 58, False: 469]
  ------------------
 2015|     58|        ERROR(status);
  ------------------
  |  |   33|     58|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 0, False: 58]
  |  |  ------------------
  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      0|    }
  ------------------
 2016|     58|        return;
 2017|     58|    }
 2018|    469|    parseVariant(status);
 2019|    469|    if (!inBounds()) {
  ------------------
  |  Branch (2019:9): [True: 296, False: 173]
  ------------------
 2020|       |        // Not an error; there might be only one variant
 2021|    296|        return;
 2022|    296|    }
 2023|       |
 2024|    173|    while (isWhitespace(peek()) || isBidiControl(peek()) || isKeyStart(peek())) {
  ------------------
  |  Branch (2024:12): [True: 10, False: 163]
  |  Branch (2024:36): [True: 2, False: 161]
  |  Branch (2024:61): [True: 69, False: 92]
  ------------------
 2025|     81|        parseOptionalWhitespace();
 2026|       |        // Restore the precondition.
 2027|       |        // Trailing whitespace is allowed.
 2028|     81|        if (!inBounds()) {
  ------------------
  |  Branch (2028:13): [True: 3, False: 78]
  ------------------
 2029|      3|            return;
 2030|      3|        }
 2031|       |
 2032|     78|        parseVariant(status);
 2033|       |
 2034|       |        // Restore the precondition, *without* erroring out if we've
 2035|       |        // reached the end of input. That's because it's valid for the
 2036|       |        // message to end with a variant that has no trailing whitespace.
 2037|       |        // Why do we need to check this condition twice inside the loop?
 2038|       |        // Because if we don't check it here, the `isWhitespace()` call in
 2039|       |        // the loop head will read off the end of the input string.
 2040|     78|        CHECK_END_OF_INPUT
  ------------------
  |  | 2005|     78|        if (!inBounds()) {                         \
  |  |  ------------------
  |  |  |  Branch (2005:13): [True: 50, False: 28]
  |  |  ------------------
  |  | 2006|     50|            break;                                 \
  |  | 2007|     50|        }                                          \
  ------------------
 2041|       |
 2042|     28|        if (errors.hasSyntaxError() || U_FAILURE(status)) {
  ------------------
  |  Branch (2042:13): [True: 28, False: 0]
  |  Branch (2042:40): [True: 0, False: 0]
  ------------------
 2043|     28|            break;
 2044|     28|        }
 2045|     28|    }
 2046|    173|}
_ZN6icu_788message26Parser12errorPatternER10UErrorCode:
 2054|    346|void Parser::errorPattern(UErrorCode& status) {
 2055|    346|    errors.addSyntaxError(status);
 2056|       |    // Set to empty pattern
 2057|    346|    Pattern::Builder result = Pattern::Builder(status);
 2058|    346|    CHECK_ERROR(status);
  ------------------
  |  |   73|    346|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 346]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
 2059|       |
 2060|       |    // If still in bounds, then add the remaining input as a single text part
 2061|       |    // to the pattern
 2062|       |    /*
 2063|       |      TODO: this behavior isn't documented in the spec, but it comes from
 2064|       |      https://github.com/messageformat/messageformat/blob/e0087bff312d759b67a9129eac135d318a1f0ce7/packages/mf2-messageformat/src/__fixtures/test-messages.json#L236
 2065|       |      and a pending pull request https://github.com/unicode-org/message-format-wg/pull/462 will clarify
 2066|       |      whether this is the intent behind the spec
 2067|       |     */
 2068|    346|    UnicodeString partStr(LEFT_CURLY_BRACE);
  ------------------
  |  |   32|    346|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
 2069|  7.35M|    while (inBounds()) {
  ------------------
  |  Branch (2069:12): [True: 7.35M, False: 346]
  ------------------
 2070|  7.35M|        partStr += peek();
 2071|  7.35M|        next();
 2072|  7.35M|    }
 2073|       |    // Add curly braces around the entire output (same comment as above)
 2074|    346|    partStr += RIGHT_CURLY_BRACE;
  ------------------
  |  |   33|    346|#define RIGHT_CURLY_BRACE ((UChar32)0x007D)
  ------------------
 2075|    346|    result.add(std::move(partStr), status);
 2076|    346|    dataModel.setPattern(result.build(status));
 2077|    346|}
_ZN6icu_788message26Parser9parseBodyER10UErrorCode:
 2079|  1.15k|void Parser::parseBody(UErrorCode& status) {
 2080|  1.15k|    CHECK_ERROR(status);
  ------------------
  |  |   73|  1.15k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 1.15k]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
 2081|       |
 2082|       |    // Out-of-input is a syntax warning
 2083|  1.15k|    if (!inBounds()) {
  ------------------
  |  Branch (2083:9): [True: 155, False: 1.00k]
  ------------------
 2084|    155|        errorPattern(status);
 2085|    155|        return;
 2086|    155|    }
 2087|       |
 2088|       |    // Body must be either a pattern or selectors
 2089|  1.00k|    switch (peek()) {
 2090|     14|    case LEFT_CURLY_BRACE: {
  ------------------
  |  |   32|     14|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
  |  Branch (2090:5): [True: 14, False: 988]
  ------------------
 2091|       |        // Pattern
 2092|     14|        dataModel.setPattern(parseQuotedPattern(status));
 2093|     14|        break;
 2094|      0|    }
 2095|    797|    case ID_MATCH[0]: {
  ------------------
  |  Branch (2095:5): [True: 797, False: 205]
  ------------------
 2096|       |        // Selectors
 2097|    797|        parseSelectors(status);
 2098|    797|        return;
 2099|      0|    }
 2100|    191|    default: {
  ------------------
  |  Branch (2100:5): [True: 191, False: 811]
  ------------------
 2101|    191|        ERROR(status);
  ------------------
  |  |   33|    191|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 0, False: 191]
  |  |  ------------------
  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      0|    }
  ------------------
 2102|    191|        errorPattern(status);
 2103|    191|        return;
 2104|      0|    }
 2105|  1.00k|    }
 2106|  1.00k|}
_ZN6icu_788message26Parser5parseER11UParseErrorR10UErrorCode:
 2111|  7.59k|void Parser::parse(UParseError &parseErrorResult, UErrorCode& status) {
 2112|  7.59k|    CHECK_ERROR(status);
  ------------------
  |  |   73|  7.59k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 0, False: 7.59k]
  |  |  ------------------
  |  |   74|      0|        return;                                                                                         \
  |  |   75|      0|    }
  ------------------
 2113|       |
 2114|  7.59k|    bool complex = false;
 2115|       |    // First, "look ahead" to determine if this is a simple or complex
 2116|       |    // message. To do that, check the first non-whitespace character.
 2117|  9.10k|    while (inBounds(index) && (isWhitespace(peek()) || isBidiControl(peek()))) {
  ------------------
  |  Branch (2117:12): [True: 9.06k, False: 42]
  |  Branch (2117:32): [True: 1.15k, False: 7.91k]
  |  Branch (2117:56): [True: 360, False: 7.55k]
  ------------------
 2118|  1.51k|        next();
 2119|  1.51k|    }
 2120|       |
 2121|       |    // Message can be empty, so we need to only look ahead
 2122|       |    // if we know it's non-empty
 2123|  7.59k|    if (inBounds()) {
  ------------------
  |  Branch (2123:9): [True: 7.58k, False: 8]
  ------------------
 2124|  7.58k|        if (peek() == PERIOD
  ------------------
  |  |   45|  15.1k|#define PERIOD ((UChar32)0x002E)
  ------------------
  |  Branch (2124:13): [True: 1.15k, False: 6.43k]
  ------------------
 2125|  7.58k|            || (inBounds(1)
  ------------------
  |  Branch (2125:17): [True: 6.30k, False: 130]
  ------------------
 2126|  6.43k|                && peek() == LEFT_CURLY_BRACE
  ------------------
  |  |   32|  12.7k|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
  |  Branch (2126:20): [True: 5.17k, False: 1.13k]
  ------------------
 2127|  6.43k|                && peek(1) == LEFT_CURLY_BRACE)) {
  ------------------
  |  |   32|  5.17k|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
  |  Branch (2127:20): [True: 6, False: 5.16k]
  ------------------
 2128|  1.15k|            complex = true;
 2129|  1.15k|        }
 2130|  7.58k|    }
 2131|       |    // Reset index
 2132|  7.59k|    index = 0;
 2133|       |
 2134|       |    // Message can be empty, so we need to only look ahead
 2135|       |    // if we know it's non-empty
 2136|  7.59k|    if (complex) {
  ------------------
  |  Branch (2136:9): [True: 1.15k, False: 6.43k]
  ------------------
 2137|  1.15k|        parseOptionalWhitespace();
 2138|  1.15k|        parseDeclarations(status);
 2139|  1.15k|        parseBody(status);
 2140|  1.15k|        parseOptionalWhitespace();
 2141|  6.43k|    } else {
 2142|       |        // Simple message
 2143|       |        // For normalization, quote the pattern
 2144|  6.43k|        normalizedInput += LEFT_CURLY_BRACE;
  ------------------
  |  |   32|  6.43k|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
 2145|  6.43k|        normalizedInput += LEFT_CURLY_BRACE;
  ------------------
  |  |   32|  6.43k|#define LEFT_CURLY_BRACE ((UChar32)0x007B)
  ------------------
 2146|  6.43k|        dataModel.setPattern(parseSimpleMessage(status));
 2147|  6.43k|        normalizedInput += RIGHT_CURLY_BRACE;
  ------------------
  |  |   33|  6.43k|#define RIGHT_CURLY_BRACE ((UChar32)0x007D)
  ------------------
 2148|  6.43k|        normalizedInput += RIGHT_CURLY_BRACE;
  ------------------
  |  |   33|  6.43k|#define RIGHT_CURLY_BRACE ((UChar32)0x007D)
  ------------------
 2149|  6.43k|    }
 2150|       |
 2151|  7.59k|    CHECK_ERROR(status);
  ------------------
  |  |   73|  7.59k|    if (U_FAILURE(errorCode)) {                                                                         \
  |  |  ------------------
  |  |  |  Branch (73:9): [True: 314, False: 7.28k]
  |  |  ------------------
  |  |   74|    314|        return;                                                                                         \
  |  |   75|    314|    }
  ------------------
 2152|       |
 2153|       |    // There are no errors; finally, check that the entire input was consumed
 2154|  7.28k|    if (!allConsumed()) {
  ------------------
  |  Branch (2154:9): [True: 5.11k, False: 2.17k]
  ------------------
 2155|  5.11k|        ERROR(status);
  ------------------
  |  |   33|  5.11k|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 147, False: 4.96k]
  |  |  ------------------
  |  |   34|    147|        setParseError(parseError, index);                                                               \
  |  |   35|    147|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|    147|    }
  ------------------
 2156|  5.11k|    }
 2157|       |
 2158|       |    // Finally, copy the relevant fields of the internal `MessageParseError`
 2159|       |    // into the `UParseError` argument
 2160|  7.28k|    translateParseError(parseError, parseErrorResult);
 2161|  7.28k|}
_ZN6icu_788message26ParserD2Ev:
 2163|  7.59k|Parser::~Parser() {}
messageformat2_parser.cpp:_ZN6icu_788message2L11copyContextEPKDsPDs:
   73|  14.5k|static void copyContext(const UChar in[U_PARSE_CONTEXT_LEN], UChar out[U_PARSE_CONTEXT_LEN]) {
   74|  14.5k|    for (int32_t i = 0; i < U_PARSE_CONTEXT_LEN; i++) {
  ------------------
  |  Branch (74:25): [True: 14.5k, False: 0]
  ------------------
   75|  14.5k|        out[i] = in[i];
   76|  14.5k|        if (in[i] == '\0') {
  ------------------
  |  Branch (76:13): [True: 14.5k, False: 0]
  ------------------
   77|  14.5k|            break;
   78|  14.5k|        }
   79|  14.5k|    }
   80|  14.5k|}
_ZN6icu_788message27unisets7getImplENS1_3KeyE:
  105|  75.9k|inline UnicodeSet* getImpl(Key key) {
  106|  75.9k|    return gUnicodeSets[key];
  107|  75.9k|}
messageformat2_parser.cpp:_ZN6icu_788message2L15isFunctionStartEi:
  450|   118k|static bool isFunctionStart(UChar32 c) {
  451|   118k|    switch (c) {
  452|   100k|    case COLON: {
  ------------------
  |  |   42|   100k|#define COLON ((UChar32)0x003A)
  ------------------
  |  Branch (452:5): [True: 100k, False: 17.6k]
  ------------------
  453|   100k|        return true;
  454|      0|    }
  455|  17.6k|    default: {
  ------------------
  |  Branch (455:5): [True: 17.6k, False: 100k]
  ------------------
  456|  17.6k|        return false;
  457|      0|    }
  458|   118k|    }
  459|   118k|}
messageformat2_parser.cpp:_ZN6icu_788message2L17isAnnotationStartEi:
  462|  51.2k|static bool isAnnotationStart(UChar32 c) {
  463|  51.2k|    return isFunctionStart(c);
  464|  51.2k|}
messageformat2_parser.cpp:_ZN6icu_788message2L12exprFallbackERNS0_10data_model10Expression7BuilderE:
 1407|  1.44k|static void exprFallback(Expression::Builder& exprBuilder) {
 1408|       |    // Construct a literal consisting just of  The U+FFFD REPLACEMENT CHARACTER
 1409|       |    // per https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#fallback-resolution
 1410|  1.44k|    exprBuilder.setOperand(Operand(Literal(false, UnicodeString(REPLACEMENT))));
  ------------------
  |  |   63|  1.44k|#define REPLACEMENT ((UChar32) 0xFFFD)
  ------------------
 1411|  1.44k|}
_ZN6icu_788message26Parser12parseOptionsINS0_10data_model8Operator7BuilderEEEvRNS0_11OptionAdderIT_EER10UErrorCode:
 1158|  33.6k|void Parser::parseOptions(OptionAdder<T>& addOption, UErrorCode& errorCode) {
 1159|       |    // Early exit if out of bounds -- no more work is possible
 1160|  33.6k|    CHECK_BOUNDS(errorCode);
  ------------------
  |  |   60|  33.6k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 119, False: 33.4k]
  |  |  ------------------
  |  |   61|    119|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|    119|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 4, False: 115]
  |  |  |  |  ------------------
  |  |  |  |   34|      4|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      4|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      4|    }
  |  |  ------------------
  |  |   62|    119|        return;                                                                            \
  |  |   63|    119|    }
  ------------------
 1161|       |
 1162|       |/*
 1163|       |Arbitrary lookahead is required to parse option lists. To see why, consider
 1164|       |these rules from the grammar:
 1165|       |
 1166|       |expression = "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}"
 1167|       |annotation = (function *(s option)) / reserved
 1168|       |
 1169|       |And this example:
 1170|       |{:foo  }
 1171|       |
 1172|       |Derivation:
 1173|       |expression -> "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}"
 1174|       |           -> "{" [s] annotation [s] "}"
 1175|       |           -> "{" [s] ((function *(s option)) / reserved) [s] "}"
 1176|       |           -> "{" [s] function *(s option) [s] "}"
 1177|       |
 1178|       |In this example, knowing whether to expect a '}' or the start of another option
 1179|       |after the whitespace would require arbitrary lookahead -- in other words, which
 1180|       |rule should we apply?
 1181|       |    *(s option) -> s option *(s option)
 1182|       |  or
 1183|       |    *(s option) ->
 1184|       |
 1185|       |The same would apply to the example {:foo k=v } (note the trailing space after "v").
 1186|       |
 1187|       |This is addressed using a form of backtracking and (to make the backtracking easier
 1188|       |to apply) a slight refactoring to the grammar.
 1189|       |
 1190|       |This code is written as if the grammar is:
 1191|       |  expression = "{" [s] (((literal / variable) ([s] / [s annotation])) / annotation) "}"
 1192|       |  annotation = (function *(s option) [s]) / (reserved [s])
 1193|       |
 1194|       |Parsing the `*(s option) [s]` sequence can be done within `parseOptions()`, meaning
 1195|       |that `parseExpression()` can safely require a '}' after `parseOptions()` finishes.
 1196|       |
 1197|       |Note that when "backtracking" really just means early exit, since only whitespace
 1198|       |is involved and there's no state to save.
 1199|       |
 1200|       |There is a separate but similar ambiguity as to whether the space precedes
 1201|       |an option or an attribute.
 1202|       |*/
 1203|       |
 1204|  35.4k|    while(true) {
  ------------------
  |  Branch (1204:11): [Folded - Ignored]
  ------------------
 1205|       |        // If the next character is not whitespace, that means we've already
 1206|       |        // parsed the entire options list (which may have been empty) and there's
 1207|       |        // no trailing whitespace. In that case, exit.
 1208|  35.4k|        if (!isWhitespace(peek())) {
  ------------------
  |  Branch (1208:13): [True: 29.0k, False: 6.44k]
  ------------------
 1209|  29.0k|            break;
 1210|  29.0k|        }
 1211|  6.44k|        int32_t firstWhitespace = index;
 1212|       |
 1213|       |        // In any case other than an empty options list, there must be at least
 1214|       |        // one whitespace character.
 1215|  6.44k|        parseRequiredWhitespace(errorCode);
 1216|       |        // Restore precondition
 1217|  6.44k|        CHECK_BOUNDS(errorCode);
  ------------------
  |  |   60|  6.44k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 17, False: 6.42k]
  |  |  ------------------
  |  |   61|     17|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|     17|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 1, False: 16]
  |  |  |  |  ------------------
  |  |  |  |   34|      1|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      1|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      1|    }
  |  |  ------------------
  |  |   62|     17|        return;                                                                            \
  |  |   63|     17|    }
  ------------------
 1218|       |
 1219|       |        // If a name character follows, then at least one more option remains
 1220|       |        // in the list.
 1221|       |        // Otherwise, we've consumed all the options and any trailing whitespace,
 1222|       |        // and can exit.
 1223|       |        // Note that exiting is sort of like backtracking: "(s option)" doesn't apply,
 1224|       |        // so we back out to [s].
 1225|  6.42k|        if (!isNameStart(peek())) {
  ------------------
  |  Branch (1225:13): [True: 4.47k, False: 1.95k]
  ------------------
 1226|       |            // We've consumed all the options (meaning that either we consumed non-empty
 1227|       |            // whitespace, or consumed at least one option.)
 1228|       |            // Done.
 1229|       |            // Remove the required whitespace from normalizedInput
 1230|  4.47k|            normalizedInput.truncate(normalizedInput.length() - 1);
 1231|       |            // "Backtrack" so as to leave the optional whitespace there
 1232|       |            // when parsing attributes
 1233|  4.47k|            index = firstWhitespace;
 1234|  4.47k|            break;
 1235|  4.47k|        }
 1236|  1.95k|        parseOption(addOption, errorCode);
 1237|  1.95k|    }
 1238|  33.4k|}
_ZN6icu_788message26Parser11parseOptionINS0_10data_model8Operator7BuilderEEEvRNS0_11OptionAdderIT_EER10UErrorCode:
 1111|  1.95k|void Parser::parseOption(OptionAdder<T>& addOption, UErrorCode& errorCode) {
 1112|  1.95k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  1.95k|#   define U_ASSERT(exp) (void)0
  ------------------
 1113|       |
 1114|       |    // Parse LHS
 1115|  1.95k|    UnicodeString lhs = parseIdentifier(errorCode);
 1116|       |
 1117|       |    // Parse '='
 1118|  1.95k|    parseTokenWithWhitespace(EQUALS, errorCode);
  ------------------
  |  |   40|  1.95k|#define EQUALS ((UChar32)0x003D)
  ------------------
 1119|       |
 1120|  1.95k|    UnicodeString rhsStr;
 1121|  1.95k|    Operand rand;
 1122|       |    // Parse RHS, which is either a literal or variable
 1123|  1.95k|    switch (peek()) {
 1124|    923|    case DOLLAR: {
  ------------------
  |  |   41|    923|#define DOLLAR ((UChar32)0x0024)
  ------------------
  |  Branch (1124:5): [True: 923, False: 1.03k]
  ------------------
 1125|    923|        rand = Operand(parseVariableName(errorCode));
 1126|    923|        break;
 1127|      0|    }
 1128|  1.03k|    default: {
  ------------------
  |  Branch (1128:5): [True: 1.03k, False: 923]
  ------------------
 1129|       |        // Must be a literal
 1130|  1.03k|        rand = Operand(parseLiteral(errorCode));
 1131|  1.03k|        break;
 1132|      0|    }
 1133|  1.95k|    }
 1134|  1.95k|    U_ASSERT(!rand.isNull());
  ------------------
  |  |   35|  1.95k|#   define U_ASSERT(exp) (void)0
  ------------------
 1135|       |
 1136|       |    // Finally, add the key=value mapping
 1137|       |    // Use a local error code, check for duplicate option error and
 1138|       |    // record it as with other errors
 1139|  1.95k|    UErrorCode status = U_ZERO_ERROR;
 1140|  1.95k|    addOption.addOption(lhs, std::move(rand), status);
 1141|  1.95k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1141:9): [True: 795, False: 1.16k]
  ------------------
 1142|    795|      U_ASSERT(status == U_MF_DUPLICATE_OPTION_NAME_ERROR);
  ------------------
  |  |   35|    795|#   define U_ASSERT(exp) (void)0
  ------------------
 1143|    795|      errors.setDuplicateOptionName(errorCode);
 1144|    795|    }
 1145|  1.95k|}
_ZN6icu_788message26Parser15parseAttributesINS0_10data_model10Expression7BuilderEEEvRNS0_14AttributeAdderIT_EER10UErrorCode:
 1245|  45.1k|void Parser::parseAttributes(AttributeAdder<T>& attrAdder, UErrorCode& errorCode) {
 1246|       |
 1247|       |    // Early exit if out of bounds -- no more work is possible
 1248|  45.1k|    if (!inBounds()) {
  ------------------
  |  Branch (1248:9): [True: 778, False: 44.3k]
  ------------------
 1249|    778|        ERROR(errorCode);
  ------------------
  |  |   33|    778|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 58, False: 720]
  |  |  ------------------
  |  |   34|     58|        setParseError(parseError, index);                                                               \
  |  |   35|     58|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|     58|    }
  ------------------
 1250|    778|        return;
 1251|    778|    }
 1252|       |
 1253|       |/*
 1254|       |Arbitrary lookahead is required to parse attribute lists, similarly to option lists.
 1255|       |(See comment in parseOptions()).
 1256|       |*/
 1257|       |
 1258|  52.3k|    while(true) {
  ------------------
  |  Branch (1258:11): [Folded - Ignored]
  ------------------
 1259|       |        // If the next character is not whitespace, that means we've already
 1260|       |        // parsed the entire attributes list (which may have been empty) and there's
 1261|       |        // no trailing whitespace. In that case, exit.
 1262|  52.3k|        if (!isWhitespace(peek())) {
  ------------------
  |  Branch (1262:13): [True: 39.5k, False: 12.8k]
  ------------------
 1263|  39.5k|            break;
 1264|  39.5k|        }
 1265|       |
 1266|       |        // In any case other than an empty attributes list, there must be at least
 1267|       |        // one whitespace character.
 1268|  12.8k|        parseRequiredWhitespace(errorCode);
 1269|       |        // Restore precondition
 1270|  12.8k|        if (!inBounds()) {
  ------------------
  |  Branch (1270:13): [True: 17, False: 12.8k]
  ------------------
 1271|     17|            ERROR(errorCode);
  ------------------
  |  |   33|     17|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 1, False: 16]
  |  |  ------------------
  |  |   34|      1|        setParseError(parseError, index);                                                               \
  |  |   35|      1|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      1|    }
  ------------------
 1272|     17|            break;
 1273|     17|        }
 1274|       |
 1275|       |        // If an '@' follows, then at least one more attribute remains
 1276|       |        // in the list.
 1277|       |        // Otherwise, we've consumed all the attributes and any trailing whitespace,
 1278|       |        // and can exit.
 1279|       |        // Note that exiting is sort of like backtracking: "(s attributes)" doesn't apply,
 1280|       |        // so we back out to [s].
 1281|  12.8k|        if (peek() != AT) {
  ------------------
  |  |   53|  12.8k|#define AT ((UChar32)0x0040)
  ------------------
  |  Branch (1281:13): [True: 4.78k, False: 8.03k]
  ------------------
 1282|       |            // We've consumed all the attributes (meaning that either we consumed non-empty
 1283|       |            // whitespace, or consumed at least one attribute.)
 1284|       |            // Done.
 1285|       |            // Remove the whitespace from normalizedInput
 1286|  4.78k|            normalizedInput.truncate(normalizedInput.length() - 1);
 1287|  4.78k|            break;
 1288|  4.78k|        }
 1289|  8.03k|        parseAttribute(attrAdder, errorCode);
 1290|  8.03k|    }
 1291|  44.3k|}
_ZN6icu_788message26Parser14parseAttributeINS0_10data_model10Expression7BuilderEEEvRNS0_14AttributeAdderIT_EER10UErrorCode:
 1070|  8.03k|void Parser::parseAttribute(AttributeAdder<T>& attrAdder, UErrorCode& errorCode) {
 1071|  8.03k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  8.03k|#   define U_ASSERT(exp) (void)0
  ------------------
 1072|       |
 1073|  8.03k|    U_ASSERT(peek() == AT);
  ------------------
  |  |   35|  8.03k|#   define U_ASSERT(exp) (void)0
  ------------------
 1074|       |    // Consume the '@'
 1075|  8.03k|    parseToken(AT, errorCode);
  ------------------
  |  |   53|  8.03k|#define AT ((UChar32)0x0040)
  ------------------
 1076|       |
 1077|       |    // Parse LHS
 1078|  8.03k|    UnicodeString lhs = parseIdentifier(errorCode);
 1079|       |
 1080|       |    // Prepare to "backtrack" to resolve ambiguity
 1081|       |    // about whether whitespace precedes another
 1082|       |    // attribute, or the '=' sign
 1083|  8.03k|    int32_t savedIndex = index;
 1084|  8.03k|    parseOptionalWhitespace();
 1085|       |
 1086|  8.03k|    Operand rand;
 1087|  8.03k|    if (peek() == EQUALS) {
  ------------------
  |  |   40|  8.03k|#define EQUALS ((UChar32)0x003D)
  ------------------
  |  Branch (1087:9): [True: 2.20k, False: 5.82k]
  ------------------
 1088|       |        // Parse '='
 1089|  2.20k|        parseTokenWithWhitespace(EQUALS, errorCode);
  ------------------
  |  |   40|  2.20k|#define EQUALS ((UChar32)0x003D)
  ------------------
 1090|       |
 1091|  2.20k|        UnicodeString rhsStr;
 1092|       |        // Parse RHS, which must be a literal
 1093|       |        // attribute = "@" identifier [o "=" o literal]
 1094|  2.20k|        rand = Operand(parseLiteral(errorCode));
 1095|  5.82k|    } else {
 1096|       |        // attribute -> "@" identifier [[s] "=" [s]]
 1097|       |        // Use null operand, which `rand` is already set to
 1098|       |        // "Backtrack" by restoring the whitespace (if there was any)
 1099|  5.82k|        index = savedIndex;
 1100|  5.82k|    }
 1101|       |
 1102|  8.03k|    attrAdder.addAttribute(lhs, std::move(Operand(rand)), errorCode);
 1103|  8.03k|}
_ZN6icu_788message26Parser12parseOptionsINS0_10data_model6Markup7BuilderEEEvRNS0_11OptionAdderIT_EER10UErrorCode:
 1158|  15.3k|void Parser::parseOptions(OptionAdder<T>& addOption, UErrorCode& errorCode) {
 1159|       |    // Early exit if out of bounds -- no more work is possible
 1160|  15.3k|    CHECK_BOUNDS(errorCode);
  ------------------
  |  |   60|  15.3k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 15.3k]
  |  |  ------------------
  |  |   61|      0|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|      0|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      0|    }
  |  |  ------------------
  |  |   62|      0|        return;                                                                            \
  |  |   63|      0|    }
  ------------------
 1161|       |
 1162|       |/*
 1163|       |Arbitrary lookahead is required to parse option lists. To see why, consider
 1164|       |these rules from the grammar:
 1165|       |
 1166|       |expression = "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}"
 1167|       |annotation = (function *(s option)) / reserved
 1168|       |
 1169|       |And this example:
 1170|       |{:foo  }
 1171|       |
 1172|       |Derivation:
 1173|       |expression -> "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}"
 1174|       |           -> "{" [s] annotation [s] "}"
 1175|       |           -> "{" [s] ((function *(s option)) / reserved) [s] "}"
 1176|       |           -> "{" [s] function *(s option) [s] "}"
 1177|       |
 1178|       |In this example, knowing whether to expect a '}' or the start of another option
 1179|       |after the whitespace would require arbitrary lookahead -- in other words, which
 1180|       |rule should we apply?
 1181|       |    *(s option) -> s option *(s option)
 1182|       |  or
 1183|       |    *(s option) ->
 1184|       |
 1185|       |The same would apply to the example {:foo k=v } (note the trailing space after "v").
 1186|       |
 1187|       |This is addressed using a form of backtracking and (to make the backtracking easier
 1188|       |to apply) a slight refactoring to the grammar.
 1189|       |
 1190|       |This code is written as if the grammar is:
 1191|       |  expression = "{" [s] (((literal / variable) ([s] / [s annotation])) / annotation) "}"
 1192|       |  annotation = (function *(s option) [s]) / (reserved [s])
 1193|       |
 1194|       |Parsing the `*(s option) [s]` sequence can be done within `parseOptions()`, meaning
 1195|       |that `parseExpression()` can safely require a '}' after `parseOptions()` finishes.
 1196|       |
 1197|       |Note that when "backtracking" really just means early exit, since only whitespace
 1198|       |is involved and there's no state to save.
 1199|       |
 1200|       |There is a separate but similar ambiguity as to whether the space precedes
 1201|       |an option or an attribute.
 1202|       |*/
 1203|       |
 1204|  20.9k|    while(true) {
  ------------------
  |  Branch (1204:11): [Folded - Ignored]
  ------------------
 1205|       |        // If the next character is not whitespace, that means we've already
 1206|       |        // parsed the entire options list (which may have been empty) and there's
 1207|       |        // no trailing whitespace. In that case, exit.
 1208|  20.9k|        if (!isWhitespace(peek())) {
  ------------------
  |  Branch (1208:13): [True: 703, False: 20.2k]
  ------------------
 1209|    703|            break;
 1210|    703|        }
 1211|  20.2k|        int32_t firstWhitespace = index;
 1212|       |
 1213|       |        // In any case other than an empty options list, there must be at least
 1214|       |        // one whitespace character.
 1215|  20.2k|        parseRequiredWhitespace(errorCode);
 1216|       |        // Restore precondition
 1217|  20.2k|        CHECK_BOUNDS(errorCode);
  ------------------
  |  |   60|  20.2k|    if (!inBounds()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 16, False: 20.1k]
  |  |  ------------------
  |  |   61|     16|        ERROR(errorCode);                                                                  \
  |  |  ------------------
  |  |  |  |   33|     16|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (33:9): [True: 5, False: 11]
  |  |  |  |  ------------------
  |  |  |  |   34|      5|        setParseError(parseError, index);                                                               \
  |  |  |  |   35|      5|        errors.addSyntaxError(errorCode);                                                               \
  |  |  |  |   36|      5|    }
  |  |  ------------------
  |  |   62|     16|        return;                                                                            \
  |  |   63|     16|    }
  ------------------
 1218|       |
 1219|       |        // If a name character follows, then at least one more option remains
 1220|       |        // in the list.
 1221|       |        // Otherwise, we've consumed all the options and any trailing whitespace,
 1222|       |        // and can exit.
 1223|       |        // Note that exiting is sort of like backtracking: "(s option)" doesn't apply,
 1224|       |        // so we back out to [s].
 1225|  20.1k|        if (!isNameStart(peek())) {
  ------------------
  |  Branch (1225:13): [True: 14.6k, False: 5.57k]
  ------------------
 1226|       |            // We've consumed all the options (meaning that either we consumed non-empty
 1227|       |            // whitespace, or consumed at least one option.)
 1228|       |            // Done.
 1229|       |            // Remove the required whitespace from normalizedInput
 1230|  14.6k|            normalizedInput.truncate(normalizedInput.length() - 1);
 1231|       |            // "Backtrack" so as to leave the optional whitespace there
 1232|       |            // when parsing attributes
 1233|  14.6k|            index = firstWhitespace;
 1234|  14.6k|            break;
 1235|  14.6k|        }
 1236|  5.57k|        parseOption(addOption, errorCode);
 1237|  5.57k|    }
 1238|  15.3k|}
_ZN6icu_788message26Parser11parseOptionINS0_10data_model6Markup7BuilderEEEvRNS0_11OptionAdderIT_EER10UErrorCode:
 1111|  5.57k|void Parser::parseOption(OptionAdder<T>& addOption, UErrorCode& errorCode) {
 1112|  5.57k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  5.57k|#   define U_ASSERT(exp) (void)0
  ------------------
 1113|       |
 1114|       |    // Parse LHS
 1115|  5.57k|    UnicodeString lhs = parseIdentifier(errorCode);
 1116|       |
 1117|       |    // Parse '='
 1118|  5.57k|    parseTokenWithWhitespace(EQUALS, errorCode);
  ------------------
  |  |   40|  5.57k|#define EQUALS ((UChar32)0x003D)
  ------------------
 1119|       |
 1120|  5.57k|    UnicodeString rhsStr;
 1121|  5.57k|    Operand rand;
 1122|       |    // Parse RHS, which is either a literal or variable
 1123|  5.57k|    switch (peek()) {
 1124|  1.04k|    case DOLLAR: {
  ------------------
  |  |   41|  1.04k|#define DOLLAR ((UChar32)0x0024)
  ------------------
  |  Branch (1124:5): [True: 1.04k, False: 4.53k]
  ------------------
 1125|  1.04k|        rand = Operand(parseVariableName(errorCode));
 1126|  1.04k|        break;
 1127|      0|    }
 1128|  4.53k|    default: {
  ------------------
  |  Branch (1128:5): [True: 4.53k, False: 1.04k]
  ------------------
 1129|       |        // Must be a literal
 1130|  4.53k|        rand = Operand(parseLiteral(errorCode));
 1131|  4.53k|        break;
 1132|      0|    }
 1133|  5.57k|    }
 1134|  5.57k|    U_ASSERT(!rand.isNull());
  ------------------
  |  |   35|  5.57k|#   define U_ASSERT(exp) (void)0
  ------------------
 1135|       |
 1136|       |    // Finally, add the key=value mapping
 1137|       |    // Use a local error code, check for duplicate option error and
 1138|       |    // record it as with other errors
 1139|  5.57k|    UErrorCode status = U_ZERO_ERROR;
 1140|  5.57k|    addOption.addOption(lhs, std::move(rand), status);
 1141|  5.57k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1141:9): [True: 1.46k, False: 4.11k]
  ------------------
 1142|  1.46k|      U_ASSERT(status == U_MF_DUPLICATE_OPTION_NAME_ERROR);
  ------------------
  |  |   35|  1.46k|#   define U_ASSERT(exp) (void)0
  ------------------
 1143|  1.46k|      errors.setDuplicateOptionName(errorCode);
 1144|  1.46k|    }
 1145|  5.57k|}
_ZN6icu_788message26Parser15parseAttributesINS0_10data_model6Markup7BuilderEEEvRNS0_14AttributeAdderIT_EER10UErrorCode:
 1245|  14.6k|void Parser::parseAttributes(AttributeAdder<T>& attrAdder, UErrorCode& errorCode) {
 1246|       |
 1247|       |    // Early exit if out of bounds -- no more work is possible
 1248|  14.6k|    if (!inBounds()) {
  ------------------
  |  Branch (1248:9): [True: 0, False: 14.6k]
  ------------------
 1249|      0|        ERROR(errorCode);
  ------------------
  |  |   33|      0|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 0, False: 0]
  |  |  ------------------
  |  |   34|      0|        setParseError(parseError, index);                                                               \
  |  |   35|      0|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      0|    }
  ------------------
 1250|      0|        return;
 1251|      0|    }
 1252|       |
 1253|       |/*
 1254|       |Arbitrary lookahead is required to parse attribute lists, similarly to option lists.
 1255|       |(See comment in parseOptions()).
 1256|       |*/
 1257|       |
 1258|  31.0k|    while(true) {
  ------------------
  |  Branch (1258:11): [Folded - Ignored]
  ------------------
 1259|       |        // If the next character is not whitespace, that means we've already
 1260|       |        // parsed the entire attributes list (which may have been empty) and there's
 1261|       |        // no trailing whitespace. In that case, exit.
 1262|  31.0k|        if (!isWhitespace(peek())) {
  ------------------
  |  Branch (1262:13): [True: 7.80k, False: 23.2k]
  ------------------
 1263|  7.80k|            break;
 1264|  7.80k|        }
 1265|       |
 1266|       |        // In any case other than an empty attributes list, there must be at least
 1267|       |        // one whitespace character.
 1268|  23.2k|        parseRequiredWhitespace(errorCode);
 1269|       |        // Restore precondition
 1270|  23.2k|        if (!inBounds()) {
  ------------------
  |  Branch (1270:13): [True: 14, False: 23.2k]
  ------------------
 1271|     14|            ERROR(errorCode);
  ------------------
  |  |   33|     14|    if (!errors.hasSyntaxError()) {                                                                     \
  |  |  ------------------
  |  |  |  Branch (33:9): [True: 1, False: 13]
  |  |  ------------------
  |  |   34|      1|        setParseError(parseError, index);                                                               \
  |  |   35|      1|        errors.addSyntaxError(errorCode);                                                               \
  |  |   36|      1|    }
  ------------------
 1272|     14|            break;
 1273|     14|        }
 1274|       |
 1275|       |        // If an '@' follows, then at least one more attribute remains
 1276|       |        // in the list.
 1277|       |        // Otherwise, we've consumed all the attributes and any trailing whitespace,
 1278|       |        // and can exit.
 1279|       |        // Note that exiting is sort of like backtracking: "(s attributes)" doesn't apply,
 1280|       |        // so we back out to [s].
 1281|  23.2k|        if (peek() != AT) {
  ------------------
  |  |   53|  23.2k|#define AT ((UChar32)0x0040)
  ------------------
  |  Branch (1281:13): [True: 6.84k, False: 16.3k]
  ------------------
 1282|       |            // We've consumed all the attributes (meaning that either we consumed non-empty
 1283|       |            // whitespace, or consumed at least one attribute.)
 1284|       |            // Done.
 1285|       |            // Remove the whitespace from normalizedInput
 1286|  6.84k|            normalizedInput.truncate(normalizedInput.length() - 1);
 1287|  6.84k|            break;
 1288|  6.84k|        }
 1289|  16.3k|        parseAttribute(attrAdder, errorCode);
 1290|  16.3k|    }
 1291|  14.6k|}
_ZN6icu_788message26Parser14parseAttributeINS0_10data_model6Markup7BuilderEEEvRNS0_14AttributeAdderIT_EER10UErrorCode:
 1070|  16.3k|void Parser::parseAttribute(AttributeAdder<T>& attrAdder, UErrorCode& errorCode) {
 1071|  16.3k|    U_ASSERT(inBounds());
  ------------------
  |  |   35|  16.3k|#   define U_ASSERT(exp) (void)0
  ------------------
 1072|       |
 1073|  16.3k|    U_ASSERT(peek() == AT);
  ------------------
  |  |   35|  16.3k|#   define U_ASSERT(exp) (void)0
  ------------------
 1074|       |    // Consume the '@'
 1075|  16.3k|    parseToken(AT, errorCode);
  ------------------
  |  |   53|  16.3k|#define AT ((UChar32)0x0040)
  ------------------
 1076|       |
 1077|       |    // Parse LHS
 1078|  16.3k|    UnicodeString lhs = parseIdentifier(errorCode);
 1079|       |
 1080|       |    // Prepare to "backtrack" to resolve ambiguity
 1081|       |    // about whether whitespace precedes another
 1082|       |    // attribute, or the '=' sign
 1083|  16.3k|    int32_t savedIndex = index;
 1084|  16.3k|    parseOptionalWhitespace();
 1085|       |
 1086|  16.3k|    Operand rand;
 1087|  16.3k|    if (peek() == EQUALS) {
  ------------------
  |  |   40|  16.3k|#define EQUALS ((UChar32)0x003D)
  ------------------
  |  Branch (1087:9): [True: 12.0k, False: 4.30k]
  ------------------
 1088|       |        // Parse '='
 1089|  12.0k|        parseTokenWithWhitespace(EQUALS, errorCode);
  ------------------
  |  |   40|  12.0k|#define EQUALS ((UChar32)0x003D)
  ------------------
 1090|       |
 1091|  12.0k|        UnicodeString rhsStr;
 1092|       |        // Parse RHS, which must be a literal
 1093|       |        // attribute = "@" identifier [o "=" o literal]
 1094|  12.0k|        rand = Operand(parseLiteral(errorCode));
 1095|  12.0k|    } else {
 1096|       |        // attribute -> "@" identifier [[s] "=" [s]]
 1097|       |        // Use null operand, which `rand` is already set to
 1098|       |        // "Backtrack" by restoring the whitespace (if there was any)
 1099|  4.30k|        index = savedIndex;
 1100|  4.30k|    }
 1101|       |
 1102|  16.3k|    attrAdder.addAttribute(lhs, std::move(Operand(rand)), errorCode);
 1103|  16.3k|}

_ZN6icu_788message26ParserC2ERKNS_13UnicodeStringERNS0_11MFDataModel7BuilderERNS0_12StaticErrorsERS2_R10UErrorCode:
  113|  7.59k|            : contentChars(unisets::get(unisets::CONTENT, status)),
  114|  7.59k|              whitespaceChars(unisets::get(unisets::WHITESPACE, status)),
  115|  7.59k|              bidiControlChars(unisets::get(unisets::BIDI, status)),
  116|  7.59k|              alphaChars(unisets::get(unisets::ALPHA, status)),
  117|  7.59k|              digitChars(unisets::get(unisets::DIGIT, status)),
  118|  7.59k|              nameStartChars(unisets::get(unisets::NAME_START, status)),
  119|  7.59k|              nameChars(unisets::get(unisets::NAME_CHAR, status)),
  120|  7.59k|              textChars(unisets::get(unisets::TEXT, status)),
  121|  7.59k|              quotedChars(unisets::get(unisets::QUOTED, status)),
  122|  7.59k|              escapableChars(unisets::get(unisets::ESCAPABLE, status)),
  123|  7.59k|            source(input), index(0), errors(e), normalizedInput(normalizedInputRef), dataModel(dataModelBuilder) {
  124|  7.59k|            (void) status;
  125|  7.59k|	  parseError.line = 0;
  126|  7.59k|	  parseError.offset = 0;
  127|  7.59k|	  parseError.lengthBeforeCurrentLine = 0;
  128|  7.59k|	  parseError.preContext[0] = '\0';
  129|  7.59k|	  parseError.postContext[0] = '\0';
  130|  7.59k|	}
_ZNK6icu_788message26Parser4peekEv:
  197|   142M|        UChar32 peek() const { return source.char32At(index) ; }
_ZNK6icu_788message26Parser4peekEj:
  198|   105k|        UChar32 peek(uint32_t i) const {
  199|   105k|            return source.char32At(source.moveIndex32(index, i));
  200|   105k|        }
_ZN6icu_788message26Parser4nextEv:
  201|  38.4M|        void next() { index = source.moveIndex32(index, 1); }
_ZNK6icu_788message26Parser8inBoundsEv:
  203|  57.8M|        bool inBounds() const { return (int32_t) index < source.length(); }
_ZNK6icu_788message26Parser8inBoundsEj:
  204|  85.7k|        bool inBounds(uint32_t i) const { return source.moveIndex32(index, i) < source.length(); }
_ZNK6icu_788message26Parser11allConsumedEv:
  205|  7.28k|        bool allConsumed() const { return (int32_t) index == source.length(); }
_ZN6icu_788message211OptionAdderINS0_10data_model8Operator7BuilderEEC2ERS4_:
   39|  33.6k|            OptionAdder(T& b) : builder(b) {}
_ZN6icu_788message211OptionAdderINS0_10data_model8Operator7BuilderEE9addOptionERKNS_13UnicodeStringEONS2_7OperandER10UErrorCode:
   40|  1.95k|            void addOption(const UnicodeString& k, Operand&& r, UErrorCode& s) {
   41|  1.95k|                builder.addOption(k, std::move(r), s);
   42|  1.95k|            }
_ZN6icu_788message214AttributeAdderINS0_10data_model10Expression7BuilderEEC2ERS4_:
   54|  45.1k|            AttributeAdder(T& b) : builder(b) {}
_ZN6icu_788message214AttributeAdderINS0_10data_model10Expression7BuilderEE12addAttributeERKNS_13UnicodeStringEONS2_7OperandER10UErrorCode:
   55|  8.03k|            void addAttribute(const UnicodeString& k, Operand&& r, UErrorCode& s) {
   56|  8.03k|                builder.addAttribute(k, std::move(r), s);
   57|  8.03k|            }
_ZN6icu_788message211OptionAdderINS0_10data_model6Markup7BuilderEEC2ERS4_:
   39|  15.3k|            OptionAdder(T& b) : builder(b) {}
_ZN6icu_788message211OptionAdderINS0_10data_model6Markup7BuilderEE9addOptionERKNS_13UnicodeStringEONS2_7OperandER10UErrorCode:
   40|  5.57k|            void addOption(const UnicodeString& k, Operand&& r, UErrorCode& s) {
   41|  5.57k|                builder.addOption(k, std::move(r), s);
   42|  5.57k|            }
_ZN6icu_788message214AttributeAdderINS0_10data_model6Markup7BuilderEEC2ERS4_:
   54|  14.6k|            AttributeAdder(T& b) : builder(b) {}
_ZN6icu_788message214AttributeAdderINS0_10data_model6Markup7BuilderEE12addAttributeERKNS_13UnicodeStringEONS2_7OperandER10UErrorCode:
   55|  16.3k|            void addAttribute(const UnicodeString& k, Operand&& r, UErrorCode& s) {
   56|  16.3k|                builder.addAttribute(k, std::move(r), s);
   57|  16.3k|            }

_ZN6icu_7813MessageFormatC2ERKNS_13UnicodeStringER10UErrorCode:
  235|  7.59k|: fLocale(Locale::getDefault()),  // Uses the default locale
  236|  7.59k|  msgPattern(success),
  237|  7.59k|  formatAliases(nullptr),
  238|  7.59k|  formatAliasesCapacity(0),
  239|  7.59k|  argTypes(nullptr),
  240|  7.59k|  argTypeCount(0),
  241|  7.59k|  argTypeCapacity(0),
  242|  7.59k|  hasArgTypeConflicts(false),
  243|  7.59k|  defaultNumberFormat(nullptr),
  244|  7.59k|  defaultDateFormat(nullptr),
  245|  7.59k|  cachedFormatters(nullptr),
  246|  7.59k|  customFormatArgStarts(nullptr),
  247|  7.59k|  pluralProvider(*this, UPLURAL_TYPE_CARDINAL),
  248|  7.59k|  ordinalProvider(*this, UPLURAL_TYPE_ORDINAL)
  249|  7.59k|{
  250|  7.59k|    setLocaleIDs(fLocale.getName(), fLocale.getName());
  251|  7.59k|    applyPattern(pattern, success);
  252|  7.59k|}
_ZN6icu_7813MessageFormatD2Ev:
  326|  7.59k|{
  327|  7.59k|    uhash_close(cachedFormatters);
  ------------------
  |  |  991|  7.59k|#define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close)
  |  |  ------------------
  |  |  |  |  123|  7.59k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.59k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.59k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  328|  7.59k|    uhash_close(customFormatArgStarts);
  ------------------
  |  |  991|  7.59k|#define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close)
  |  |  ------------------
  |  |  |  |  123|  7.59k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.59k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.59k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  329|       |
  330|  7.59k|    uprv_free(argTypes);
  ------------------
  |  | 1503|  7.59k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  7.59k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.59k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.59k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  331|  7.59k|    uprv_free(formatAliases);
  ------------------
  |  | 1503|  7.59k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  7.59k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.59k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.59k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|  7.59k|    delete defaultNumberFormat;
  333|  7.59k|    delete defaultDateFormat;
  334|  7.59k|}
_ZN6icu_7813MessageFormat16allocateArgTypesEiR10UErrorCode:
  346|  4.25k|UBool MessageFormat::allocateArgTypes(int32_t capacity, UErrorCode& status) {
  347|  4.25k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (347:9): [True: 0, False: 4.25k]
  ------------------
  348|      0|        return false;
  349|      0|    }
  350|  4.25k|    if (argTypeCapacity >= capacity) {
  ------------------
  |  Branch (350:9): [True: 4.13k, False: 123]
  ------------------
  351|  4.13k|        return true;
  352|  4.13k|    }
  353|    123|    if (capacity < DEFAULT_INITIAL_CAPACITY) {
  ------------------
  |  Branch (353:9): [True: 66, False: 57]
  ------------------
  354|     66|        capacity = DEFAULT_INITIAL_CAPACITY;
  355|     66|    } else if (capacity < 2*argTypeCapacity) {
  ------------------
  |  Branch (355:16): [True: 0, False: 57]
  ------------------
  356|      0|        capacity = 2*argTypeCapacity;
  357|      0|    }
  358|    123|    Formattable::Type* a = static_cast<Formattable::Type*>(
  359|    123|            uprv_realloc(argTypes, sizeof(*argTypes) * capacity));
  ------------------
  |  | 1536|    123|#define uprv_realloc U_ICU_ENTRY_POINT_RENAME(uprv_realloc)
  |  |  ------------------
  |  |  |  |  123|    123|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    123|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    123|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  360|    123|    if (a == nullptr) {
  ------------------
  |  Branch (360:9): [True: 0, False: 123]
  ------------------
  361|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  362|      0|        return false;
  363|      0|    }
  364|    123|    argTypes = a;
  365|    123|    argTypeCapacity = capacity;
  366|    123|    return true;
  367|    123|}
_ZN6icu_7813MessageFormat12applyPatternERKNS_13UnicodeStringER10UErrorCode:
  475|  7.59k|{
  476|  7.59k|    UParseError parseError;
  477|  7.59k|    applyPattern(newPattern,parseError,status);
  478|  7.59k|}
_ZN6icu_7813MessageFormat12applyPatternERKNS_13UnicodeStringER11UParseErrorR10UErrorCode:
  488|  7.59k|{
  489|  7.59k|    if(U_FAILURE(ec)) {
  ------------------
  |  Branch (489:8): [True: 0, False: 7.59k]
  ------------------
  490|      0|        return;
  491|      0|    }
  492|  7.59k|    msgPattern.parse(pattern, &parseError, ec);
  493|  7.59k|    cacheExplicitFormats(ec);
  494|       |
  495|  7.59k|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (495:9): [True: 3.64k, False: 3.95k]
  ------------------
  496|  3.64k|        resetPattern();
  497|  3.64k|    }
  498|  7.59k|}
_ZN6icu_7813MessageFormat12resetPatternEv:
  500|  3.64k|void MessageFormat::resetPattern() {
  501|  3.64k|    msgPattern.clear();
  502|  3.64k|    uhash_close(cachedFormatters);
  ------------------
  |  |  991|  3.64k|#define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close)
  |  |  ------------------
  |  |  |  |  123|  3.64k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.64k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.64k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  503|  3.64k|    cachedFormatters = nullptr;
  504|  3.64k|    uhash_close(customFormatArgStarts);
  ------------------
  |  |  991|  3.64k|#define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close)
  |  |  ------------------
  |  |  |  |  123|  3.64k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.64k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.64k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  505|  3.64k|    customFormatArgStarts = nullptr;
  506|  3.64k|    argTypeCount = 0;
  507|  3.64k|    hasArgTypeConflicts = false;
  508|  3.64k|}
_ZN6icu_7813MessageFormat17setArgStartFormatEiPNS_6FormatER10UErrorCode:
  553|  77.6k|                                      UErrorCode& status) {
  554|  77.6k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (554:9): [True: 305, False: 77.3k]
  ------------------
  555|    305|        delete formatter;
  556|    305|        return;
  557|    305|    }
  558|  77.3k|    if (cachedFormatters == nullptr) {
  ------------------
  |  Branch (558:9): [True: 2.77k, False: 74.5k]
  ------------------
  559|  2.77k|        cachedFormatters=uhash_open(uhash_hashLong, uhash_compareLong,
  ------------------
  |  | 1030|  2.77k|#define uhash_open U_ICU_ENTRY_POINT_RENAME(uhash_open)
  |  |  ------------------
  |  |  |  |  123|  2.77k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.77k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.77k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      cachedFormatters=uhash_open(uhash_hashLong, uhash_compareLong,
  ------------------
  |  | 1014|  2.77k|#define uhash_hashLong U_ICU_ENTRY_POINT_RENAME(uhash_hashLong)
  |  |  ------------------
  |  |  |  |  123|  2.77k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.77k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.77k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      cachedFormatters=uhash_open(uhash_hashLong, uhash_compareLong,
  ------------------
  |  |  996|  2.77k|#define uhash_compareLong U_ICU_ENTRY_POINT_RENAME(uhash_compareLong)
  |  |  ------------------
  |  |  |  |  123|  2.77k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.77k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.77k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  560|  2.77k|                                    equalFormatsForHash, &status);
  561|  2.77k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (561:13): [True: 0, False: 2.77k]
  ------------------
  562|      0|            delete formatter;
  563|      0|            return;
  564|      0|        }
  565|  2.77k|        uhash_setValueDeleter(cachedFormatters, uprv_deleteUObject);
  ------------------
  |  | 1044|  2.77k|#define uhash_setValueDeleter U_ICU_ENTRY_POINT_RENAME(uhash_setValueDeleter)
  |  |  ------------------
  |  |  |  |  123|  2.77k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.77k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.77k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      uhash_setValueDeleter(cachedFormatters, uprv_deleteUObject);
  ------------------
  |  | 1489|  2.77k|#define uprv_deleteUObject U_ICU_ENTRY_POINT_RENAME(uprv_deleteUObject)
  |  |  ------------------
  |  |  |  |  123|  2.77k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.77k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.77k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  566|  2.77k|    }
  567|  77.3k|    if (formatter == nullptr) {
  ------------------
  |  Branch (567:9): [True: 0, False: 77.3k]
  ------------------
  568|      0|        formatter = new DummyFormat();
  569|      0|    }
  570|  77.3k|    uhash_iput(cachedFormatters, argStart, formatter, &status);
  ------------------
  |  | 1024|  77.3k|#define uhash_iput U_ICU_ENTRY_POINT_RENAME(uhash_iput)
  |  |  ------------------
  |  |  |  |  123|  77.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  77.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  77.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  571|  77.3k|}
_ZN6icu_7813MessageFormat20cacheExplicitFormatsER10UErrorCode:
 1587|  7.59k|void MessageFormat::cacheExplicitFormats(UErrorCode& status) {
 1588|  7.59k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1588:9): [True: 3.33k, False: 4.25k]
  ------------------
 1589|  3.33k|        return;
 1590|  3.33k|    }
 1591|       |
 1592|  4.25k|    if (cachedFormatters != nullptr) {
  ------------------
  |  Branch (1592:9): [True: 0, False: 4.25k]
  ------------------
 1593|      0|        uhash_removeAll(cachedFormatters);
  ------------------
  |  | 1036|      0|#define uhash_removeAll U_ICU_ENTRY_POINT_RENAME(uhash_removeAll)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1594|      0|    }
 1595|  4.25k|    if (customFormatArgStarts != nullptr) {
  ------------------
  |  Branch (1595:9): [True: 0, False: 4.25k]
  ------------------
 1596|      0|        uhash_removeAll(customFormatArgStarts);
  ------------------
  |  | 1036|      0|#define uhash_removeAll U_ICU_ENTRY_POINT_RENAME(uhash_removeAll)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1597|      0|    }
 1598|       |
 1599|       |    // The last two "parts" can at most be ARG_LIMIT and MSG_LIMIT
 1600|       |    // which we need not examine.
 1601|  4.25k|    int32_t limit = msgPattern.countParts() - 2;
 1602|  4.25k|    argTypeCount = 0;
 1603|       |    // We also need not look at the first two "parts"
 1604|       |    // (at most MSG_START and ARG_START) in this loop.
 1605|       |    // We determine the argTypeCount first so that we can allocateArgTypes
 1606|       |    // so that the next loop can set argTypes[argNumber].
 1607|       |    // (This is for the C API which needs the argTypes to read its va_arg list.)
 1608|   936k|    for (int32_t i = 2; i < limit && U_SUCCESS(status); ++i) {
  ------------------
  |  Branch (1608:25): [True: 931k, False: 4.25k]
  |  Branch (1608:38): [True: 931k, False: 0]
  ------------------
 1609|   931k|        const MessagePattern::Part& part = msgPattern.getPart(i);
 1610|   931k|        if (part.getType() == UMSGPAT_PART_TYPE_ARG_NUMBER) {
  ------------------
  |  Branch (1610:13): [True: 72.5k, False: 859k]
  ------------------
 1611|  72.5k|            const int argNumber = part.getValue();
 1612|  72.5k|            if (argNumber >= argTypeCount) {
  ------------------
  |  Branch (1612:17): [True: 175, False: 72.4k]
  ------------------
 1613|    175|                argTypeCount = argNumber + 1;
 1614|    175|            }
 1615|  72.5k|        }
 1616|   931k|    }
 1617|  4.25k|    if (!allocateArgTypes(argTypeCount, status)) {
  ------------------
  |  Branch (1617:9): [True: 0, False: 4.25k]
  ------------------
 1618|      0|        return;
 1619|      0|    }
 1620|       |    // Set all argTypes to kObject, as a "none" value, for lack of any better value.
 1621|       |    // We never use kObject for real arguments.
 1622|       |    // We use it as "no argument yet" for the check for hasArgTypeConflicts.
 1623|   350k|    for (int32_t i = 0; i < argTypeCount; ++i) {
  ------------------
  |  Branch (1623:25): [True: 345k, False: 4.25k]
  ------------------
 1624|   345k|        argTypes[i] = Formattable::kObject;
 1625|   345k|    }
 1626|  4.25k|    hasArgTypeConflicts = false;
 1627|       |
 1628|       |    // This loop starts at part index 1 because we do need to examine
 1629|       |    // ARG_START parts. (But we can ignore the MSG_START.)
 1630|   502k|    for (int32_t i = 1; i < limit && U_SUCCESS(status); ++i) {
  ------------------
  |  Branch (1630:25): [True: 498k, False: 4.12k]
  |  Branch (1630:38): [True: 498k, False: 133]
  ------------------
 1631|   498k|        const MessagePattern::Part* part = &msgPattern.getPart(i);
 1632|   498k|        if (part->getType() != UMSGPAT_PART_TYPE_ARG_START) {
  ------------------
  |  Branch (1632:13): [True: 341k, False: 156k]
  ------------------
 1633|   341k|            continue;
 1634|   341k|        }
 1635|   156k|        UMessagePatternArgType argType = part->getArgType();
 1636|       |
 1637|   156k|        int32_t argNumber = -1;
 1638|   156k|        part = &msgPattern.getPart(i + 1);
 1639|   156k|        if (part->getType() == UMSGPAT_PART_TYPE_ARG_NUMBER) {
  ------------------
  |  Branch (1639:13): [True: 72.4k, False: 83.7k]
  ------------------
 1640|  72.4k|            argNumber = part->getValue();
 1641|  72.4k|        }
 1642|   156k|        Formattable::Type formattableType;
 1643|       |
 1644|   156k|        switch (argType) {
 1645|  78.1k|        case UMSGPAT_ARG_TYPE_NONE:
  ------------------
  |  Branch (1645:9): [True: 78.1k, False: 78.1k]
  ------------------
 1646|  78.1k|            formattableType = Formattable::kString;
 1647|  78.1k|            break;
 1648|  77.6k|        case UMSGPAT_ARG_TYPE_SIMPLE: {
  ------------------
  |  Branch (1648:9): [True: 77.6k, False: 78.5k]
  ------------------
 1649|  77.6k|            int32_t index = i;
 1650|  77.6k|            i += 2;
 1651|  77.6k|            UnicodeString explicitType = msgPattern.getSubstring(msgPattern.getPart(i++));
 1652|  77.6k|            UnicodeString style;
 1653|  77.6k|            if ((part = &msgPattern.getPart(i))->getType() == UMSGPAT_PART_TYPE_ARG_STYLE) {
  ------------------
  |  Branch (1653:17): [True: 51.4k, False: 26.1k]
  ------------------
 1654|  51.4k|                style = msgPattern.getSubstring(*part);
 1655|  51.4k|                ++i;
 1656|  51.4k|            }
 1657|  77.6k|            UParseError parseError;
 1658|  77.6k|            Format* formatter = createAppropriateFormat(explicitType, style, formattableType, parseError, status);
 1659|  77.6k|            setArgStartFormat(index, formatter, status);
 1660|  77.6k|            break;
 1661|      0|        }
 1662|    441|        case UMSGPAT_ARG_TYPE_CHOICE:
  ------------------
  |  Branch (1662:9): [True: 441, False: 155k]
  ------------------
 1663|    441|        case UMSGPAT_ARG_TYPE_PLURAL:
  ------------------
  |  Branch (1663:9): [True: 0, False: 156k]
  ------------------
 1664|    441|        case UMSGPAT_ARG_TYPE_SELECTORDINAL:
  ------------------
  |  Branch (1664:9): [True: 0, False: 156k]
  ------------------
 1665|    441|            formattableType = Formattable::kDouble;
 1666|    441|            break;
 1667|      0|        case UMSGPAT_ARG_TYPE_SELECT:
  ------------------
  |  Branch (1667:9): [True: 0, False: 156k]
  ------------------
 1668|      0|            formattableType = Formattable::kString;
 1669|      0|            break;
 1670|      0|        default:
  ------------------
  |  Branch (1670:9): [True: 0, False: 156k]
  ------------------
 1671|      0|            status = U_INTERNAL_PROGRAM_ERROR;  // Should be unreachable.
 1672|      0|            formattableType = Formattable::kString;
 1673|      0|            break;
 1674|   156k|        }
 1675|   156k|        if (argNumber != -1) {
  ------------------
  |  Branch (1675:13): [True: 72.4k, False: 83.7k]
  ------------------
 1676|  72.4k|            if (argTypes[argNumber] != Formattable::kObject && argTypes[argNumber] != formattableType) {
  ------------------
  |  Branch (1676:17): [True: 72.2k, False: 249]
  |  Branch (1676:64): [True: 196, False: 72.0k]
  ------------------
 1677|    196|                hasArgTypeConflicts = true;
 1678|    196|            }
 1679|  72.4k|            argTypes[argNumber] = formattableType;
 1680|  72.4k|        }
 1681|   156k|    }
 1682|  4.25k|}
_ZN6icu_7813MessageFormat23createAppropriateFormatERNS_13UnicodeStringES2_RNS_11Formattable4TypeER11UParseErrorR10UErrorCode:
 1686|  77.6k|                                               UErrorCode& ec) {
 1687|  77.6k|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (1687:9): [True: 0, False: 77.6k]
  ------------------
 1688|      0|        return nullptr;
 1689|      0|    }
 1690|  77.6k|    Format* fmt = nullptr;
 1691|  77.6k|    int32_t typeID, styleID;
 1692|  77.6k|    DateFormat::EStyle date_style;
 1693|  77.6k|    int32_t firstNonSpace;
 1694|       |
 1695|  77.6k|    switch (typeID = findKeyword(type, TYPE_IDS)) {
 1696|      0|    case 0: // number
  ------------------
  |  Branch (1696:5): [True: 0, False: 77.6k]
  ------------------
 1697|      0|        formattableType = Formattable::kDouble;
 1698|      0|        switch (findKeyword(style, NUMBER_STYLE_IDS)) {
 1699|      0|        case 0: // default
  ------------------
  |  Branch (1699:9): [True: 0, False: 0]
  ------------------
 1700|      0|            fmt = NumberFormat::createInstance(fLocale, ec);
 1701|      0|            break;
 1702|      0|        case 1: // currency
  ------------------
  |  Branch (1702:9): [True: 0, False: 0]
  ------------------
 1703|      0|            fmt = NumberFormat::createCurrencyInstance(fLocale, ec);
 1704|      0|            break;
 1705|      0|        case 2: // percent
  ------------------
  |  Branch (1705:9): [True: 0, False: 0]
  ------------------
 1706|      0|            fmt = NumberFormat::createPercentInstance(fLocale, ec);
 1707|      0|            break;
 1708|      0|        case 3: // integer
  ------------------
  |  Branch (1708:9): [True: 0, False: 0]
  ------------------
 1709|      0|            formattableType = Formattable::kLong;
 1710|      0|            fmt = createIntegerFormat(fLocale, ec);
 1711|      0|            break;
 1712|      0|        default: // pattern or skeleton
  ------------------
  |  Branch (1712:9): [True: 0, False: 0]
  ------------------
 1713|      0|            firstNonSpace = PatternProps::skipWhiteSpace(style, 0);
 1714|      0|            if (style.compare(firstNonSpace, 2, u"::", 0, 2) == 0) {
  ------------------
  |  Branch (1714:17): [True: 0, False: 0]
  ------------------
 1715|       |                // Skeleton
 1716|      0|                UnicodeString skeleton = style.tempSubString(firstNonSpace + 2);
 1717|      0|                fmt = number::NumberFormatter::forSkeleton(skeleton, ec).locale(fLocale).toFormat(ec);
 1718|      0|            } else {
 1719|       |                // Pattern
 1720|      0|                fmt = NumberFormat::createInstance(fLocale, ec);
 1721|      0|                if (fmt) {
  ------------------
  |  Branch (1721:21): [True: 0, False: 0]
  ------------------
 1722|      0|                    auto* decfmt = dynamic_cast<DecimalFormat*>(fmt);
 1723|      0|                    if (decfmt != nullptr) {
  ------------------
  |  Branch (1723:25): [True: 0, False: 0]
  ------------------
 1724|      0|                        decfmt->applyPattern(style, parseError, ec);
 1725|      0|                    }
 1726|      0|                }
 1727|      0|            }
 1728|      0|            break;
 1729|      0|        }
 1730|      0|        break;
 1731|       |
 1732|  56.1k|    case 1: // date
  ------------------
  |  Branch (1732:5): [True: 56.1k, False: 21.5k]
  ------------------
 1733|  56.1k|    case 2: // time
  ------------------
  |  Branch (1733:5): [True: 0, False: 77.6k]
  ------------------
 1734|  56.1k|        formattableType = Formattable::kDate;
 1735|  56.1k|        firstNonSpace = PatternProps::skipWhiteSpace(style, 0);
 1736|  56.1k|        if (style.compare(firstNonSpace, 2, u"::", 0, 2) == 0) {
  ------------------
  |  Branch (1736:13): [True: 36.9k, False: 19.2k]
  ------------------
 1737|       |            // Skeleton
 1738|  36.9k|            UnicodeString skeleton = style.tempSubString(firstNonSpace + 2);
 1739|  36.9k|            fmt = DateFormat::createInstanceForSkeleton(skeleton, fLocale, ec);
 1740|  36.9k|        } else {
 1741|       |            // Pattern
 1742|  19.2k|            styleID = findKeyword(style, DATE_STYLE_IDS);
 1743|  19.2k|            date_style = (styleID >= 0) ? DATE_STYLES[styleID] : DateFormat::kDefault;
  ------------------
  |  Branch (1743:26): [True: 7.24k, False: 12.0k]
  ------------------
 1744|       |
 1745|  19.2k|            if (typeID == 1) {
  ------------------
  |  Branch (1745:17): [True: 19.2k, False: 0]
  ------------------
 1746|  19.2k|                fmt = DateFormat::createDateInstance(date_style, fLocale);
 1747|  19.2k|            } else {
 1748|      0|                fmt = DateFormat::createTimeInstance(date_style, fLocale);
 1749|      0|            }
 1750|       |
 1751|  19.2k|            if (styleID < 0 && fmt != nullptr) {
  ------------------
  |  Branch (1751:17): [True: 12.0k, False: 7.24k]
  |  Branch (1751:32): [True: 12.0k, False: 0]
  ------------------
 1752|  12.0k|                SimpleDateFormat* sdtfmt = dynamic_cast<SimpleDateFormat*>(fmt);
 1753|  12.0k|                if (sdtfmt != nullptr) {
  ------------------
  |  Branch (1753:21): [True: 12.0k, False: 0]
  ------------------
 1754|  12.0k|                    sdtfmt->applyPattern(style);
 1755|  12.0k|                }
 1756|  12.0k|            }
 1757|  19.2k|        }
 1758|  56.1k|        break;
 1759|       |
 1760|      0|    case 3: // spellout
  ------------------
  |  Branch (1760:5): [True: 0, False: 77.6k]
  ------------------
 1761|      0|        formattableType = Formattable::kDouble;
 1762|      0|        fmt = makeRBNF(URBNF_SPELLOUT, fLocale, style, ec);
 1763|      0|        break;
 1764|  21.2k|    case 4: // ordinal
  ------------------
  |  Branch (1764:5): [True: 21.2k, False: 56.4k]
  ------------------
 1765|  21.2k|        formattableType = Formattable::kDouble;
 1766|  21.2k|        fmt = makeRBNF(URBNF_ORDINAL, fLocale, style, ec);
 1767|  21.2k|        break;
 1768|      0|    case 5: // duration
  ------------------
  |  Branch (1768:5): [True: 0, False: 77.6k]
  ------------------
 1769|      0|        formattableType = Formattable::kDouble;
 1770|      0|        fmt = makeRBNF(URBNF_DURATION, fLocale, style, ec);
 1771|      0|        break;
 1772|    305|    default:
  ------------------
  |  Branch (1772:5): [True: 305, False: 77.3k]
  ------------------
 1773|    305|        formattableType = Formattable::kString;
 1774|    305|        ec = U_ILLEGAL_ARGUMENT_ERROR;
 1775|    305|        break;
 1776|  77.6k|    }
 1777|       |
 1778|  77.6k|    return fmt;
 1779|  77.6k|}
_ZN6icu_7813MessageFormat11findKeywordERKNS_13UnicodeStringEPKPKDs:
 1786|  96.9k|{
 1787|  96.9k|    if (s.isEmpty()) {
  ------------------
  |  Branch (1787:9): [True: 6.85k, False: 90.0k]
  ------------------
 1788|  6.85k|        return 0; // default
 1789|  6.85k|    }
 1790|       |
 1791|  90.0k|    int32_t length = s.length();
 1792|  90.0k|    const char16_t *ps = PatternProps::trimWhiteSpace(s.getBuffer(), length);
 1793|  90.0k|    UnicodeString buffer(false, ps, length);
 1794|       |    // Trims the space characters and turns all characters
 1795|       |    // in s to lower case.
 1796|  90.0k|    buffer.toLower("");
 1797|   292k|    for (int32_t i = 0; list[i]; ++i) {
  ------------------
  |  Branch (1797:25): [True: 280k, False: 12.3k]
  ------------------
 1798|   280k|        if (!buffer.compare(list[i], u_strlen(list[i]))) {
  ------------------
  |  |  393|   280k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|   280k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   280k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   280k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1798:13): [True: 77.7k, False: 202k]
  ------------------
 1799|  77.7k|            return i;
 1800|  77.7k|        }
 1801|   280k|    }
 1802|  12.3k|    return -1;
 1803|  90.0k|}
_ZN6icu_7813MessageFormat22PluralSelectorProviderC2ERKS0_11UPluralType:
 1945|  15.1k|        : msgFormat(mf), rules(nullptr), type(t) {
 1946|  15.1k|}
_ZN6icu_7813MessageFormat22PluralSelectorProviderD2Ev:
 1948|  15.1k|MessageFormat::PluralSelectorProvider::~PluralSelectorProvider() {
 1949|  15.1k|    delete rules;
 1950|  15.1k|}
msgfmt.cpp:_ZN6icu_78L8makeRBNFENS_15URBNFRuleSetTagERKNS_6LocaleERKNS_13UnicodeStringER10UErrorCode:
 1576|  21.2k|static Format* makeRBNF(URBNFRuleSetTag tag, const Locale& locale, const UnicodeString& defaultRuleSet, UErrorCode& ec) {
 1577|  21.2k|    RuleBasedNumberFormat* fmt = new RuleBasedNumberFormat(tag, locale, ec);
 1578|  21.2k|    if (fmt == nullptr) {
  ------------------
  |  Branch (1578:9): [True: 0, False: 21.2k]
  ------------------
 1579|      0|        ec = U_MEMORY_ALLOCATION_ERROR;
 1580|  21.2k|    } else if (U_SUCCESS(ec) && defaultRuleSet.length() > 0) {
  ------------------
  |  Branch (1580:16): [True: 21.2k, False: 0]
  |  Branch (1580:33): [True: 2.02k, False: 19.1k]
  ------------------
 1581|  2.02k|        UErrorCode localStatus = U_ZERO_ERROR; // ignore unrecognized default rule set
 1582|  2.02k|        fmt->setDefaultRuleSet(defaultRuleSet, localStatus);
 1583|  2.02k|    }
 1584|  21.2k|    return fmt;
 1585|  21.2k|}

_ZN6icu_7810NFRuleListC2Ej:
   42|  42.4k|        : fStuff(capacity ? static_cast<NFRule**>(uprv_malloc(capacity * sizeof(NFRule*))) : nullptr)
  ------------------
  |  | 1524|  21.2k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (42:18): [True: 21.2k, False: 21.2k]
  ------------------
   43|  42.4k|        , fCount(0)
   44|  42.4k|        , fCapacity(capacity) {}
_ZN6icu_7810NFRuleListD2Ev:
   45|  42.4k|    ~NFRuleList() {
   46|  42.4k|        if (fStuff) {
  ------------------
  |  Branch (46:13): [True: 42.4k, False: 0]
  ------------------
   47|  63.6k|            for(uint32_t i = 0; i < fCount; ++i) {
  ------------------
  |  Branch (47:33): [True: 21.2k, False: 42.4k]
  ------------------
   48|  21.2k|                delete fStuff[i];
   49|  21.2k|            }
   50|  42.4k|            uprv_free(fStuff);
  ------------------
  |  | 1503|  42.4k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  42.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  42.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  42.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   51|  42.4k|        }
   52|  42.4k|    }
_ZNK6icu_7810NFRuleListixEj:
   53|  21.2k|    NFRule* operator[](uint32_t index) const { return fStuff != nullptr ? fStuff[index] : nullptr; }
  ------------------
  |  Branch (53:55): [True: 21.2k, False: 0]
  ------------------
_ZN6icu_7810NFRuleList3addEPNS_6NFRuleE:
   65|  21.2k|    void add(NFRule* thing) {
   66|  21.2k|        if (fCount == fCapacity) {
  ------------------
  |  Branch (66:13): [True: 21.2k, False: 0]
  ------------------
   67|  21.2k|            fCapacity += 10;
   68|  21.2k|            fStuff = static_cast<NFRule**>(uprv_realloc(fStuff, fCapacity * sizeof(NFRule*))); // assume success
  ------------------
  |  | 1536|  21.2k|#define uprv_realloc U_ICU_ENTRY_POINT_RENAME(uprv_realloc)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   69|  21.2k|        }
   70|  21.2k|        if (fStuff != nullptr) {
  ------------------
  |  Branch (70:13): [True: 21.2k, False: 0]
  ------------------
   71|  21.2k|        	fStuff[fCount++] = thing;
   72|  21.2k|        } else {
   73|      0|        	fCapacity = 0;
   74|      0|        	fCount = 0;
   75|      0|        }
   76|  21.2k|    }
_ZNK6icu_7810NFRuleList4sizeEv:
   77|  21.2k|    uint32_t size() const { return fCount; }
_ZNK6icu_7810NFRuleList4lastEv:
   78|  42.4k|    NFRule* last() const { return (fCount > 0 && fStuff != nullptr) ? fStuff[fCount-1] : nullptr; }
  ------------------
  |  Branch (78:36): [True: 0, False: 42.4k]
  |  Branch (78:50): [True: 0, False: 0]
  ------------------
_ZN6icu_7810NFRuleList9deleteAllEv:
   87|  21.2k|    void deleteAll() {
   88|  21.2k|        NFRule** tmp = nullptr;
   89|  21.2k|        int32_t size = fCount;
   90|  21.2k|        if (size > 0) {
  ------------------
  |  Branch (90:13): [True: 0, False: 21.2k]
  ------------------
   91|      0|            tmp = release();
   92|      0|            for (int32_t i = 0; i < size; i++) {
  ------------------
  |  Branch (92:33): [True: 0, False: 0]
  ------------------
   93|      0|                delete tmp[i];
   94|      0|            }
   95|      0|            if (tmp) {
  ------------------
  |  Branch (95:17): [True: 0, False: 0]
  ------------------
   96|      0|                uprv_free(tmp);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   97|      0|            }
   98|      0|        }
   99|  21.2k|    }

_ZN6icu_789NFRuleSetC2EPNS_21RuleBasedNumberFormatEPNS_13UnicodeStringEiR10UErrorCode:
  137|  21.2k|  : name()
  138|  21.2k|  , rules(0)
  139|  21.2k|  , owner(_owner)
  140|  21.2k|  , fractionRules()
  141|  21.2k|  , fIsFractionRuleSet(false)
  142|  21.2k|  , fIsPublic(false)
  143|  21.2k|  , fIsParseable(true)
  144|  21.2k|{
  145|   148k|    for (int32_t i = 0; i < NON_NUMERICAL_RULE_LENGTH; ++i) {
  ------------------
  |  Branch (145:25): [True: 127k, False: 21.2k]
  ------------------
  146|   127k|        nonNumericalRules[i] = nullptr;
  147|   127k|    }
  148|       |
  149|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (149:9): [True: 0, False: 21.2k]
  ------------------
  150|      0|        return;
  151|      0|    }
  152|       |
  153|  21.2k|    UnicodeString& description = descriptions[index]; // !!! make sure index is valid
  154|       |
  155|  21.2k|    if (description.isEmpty()) {
  ------------------
  |  Branch (155:9): [True: 0, False: 21.2k]
  ------------------
  156|       |        // throw new IllegalArgumentException("Empty rule set description");
  157|      0|        status = U_PARSE_ERROR;
  158|      0|        return;
  159|      0|    }
  160|       |
  161|       |    // if the description begins with a rule set name (the rule set
  162|       |    // name can be omitted in formatter descriptions that consist
  163|       |    // of only one rule set), copy it out into our "name" member
  164|       |    // and delete it from the description
  165|  21.2k|    if (description.charAt(0) == gPercent) {
  ------------------
  |  Branch (165:9): [True: 21.2k, False: 0]
  ------------------
  166|  21.2k|        int32_t pos = description.indexOf(gColon);
  167|  21.2k|        if (pos == -1) {
  ------------------
  |  Branch (167:13): [True: 0, False: 21.2k]
  ------------------
  168|       |            // throw new IllegalArgumentException("Rule set name doesn't end in colon");
  169|      0|            status = U_PARSE_ERROR;
  170|  21.2k|        } else {
  171|  21.2k|            name.setTo(description, 0, pos);
  172|  21.2k|            while (pos < description.length() && PatternProps::isWhiteSpace(description.charAt(++pos))) {
  ------------------
  |  Branch (172:20): [True: 21.2k, False: 0]
  |  Branch (172:50): [True: 0, False: 21.2k]
  ------------------
  173|      0|            }
  174|  21.2k|            description.remove(0, pos);
  175|  21.2k|        }
  176|  21.2k|    } else {
  177|      0|        name.setTo(UNICODE_STRING_SIMPLE("%default"));
  ------------------
  |  |  135|      0|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|      0|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  178|      0|    }
  179|       |
  180|  21.2k|    if (description.isEmpty()) {
  ------------------
  |  Branch (180:9): [True: 0, False: 21.2k]
  ------------------
  181|       |        // throw new IllegalArgumentException("Empty rule set description");
  182|      0|        status = U_PARSE_ERROR;
  183|      0|    }
  184|       |
  185|  21.2k|    fIsPublic = name.indexOf(gPercentPercent, 2, 0) != 0;
  186|       |
  187|  21.2k|    if (name.endsWith(gNoparse, 8)) {
  ------------------
  |  Branch (187:9): [True: 0, False: 21.2k]
  ------------------
  188|      0|        fIsParseable = false;
  189|      0|        name.truncate(name.length() - 8); // remove the @noparse from the name
  190|      0|    }
  191|       |
  192|       |    // all of the other members of NFRuleSet are initialized
  193|       |    // by parseRules()
  194|  21.2k|}
_ZN6icu_789NFRuleSet10parseRulesERNS_13UnicodeStringER10UErrorCode:
  198|  21.2k|{
  199|       |    // start by creating a Vector whose elements are Strings containing
  200|       |    // the descriptions of the rules (one rule per element).  The rules
  201|       |    // are separated by semicolons (there's no escape facility: ALL
  202|       |    // semicolons are rule delimiters)
  203|       |
  204|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (204:9): [True: 0, False: 21.2k]
  ------------------
  205|      0|        return;
  206|      0|    }
  207|       |
  208|       |    // ensure we are starting with an empty rule list
  209|  21.2k|    rules.deleteAll();
  210|       |
  211|       |    // dlf - the original code kept a separate description array for no reason,
  212|       |    // so I got rid of it.  The loop was too complex so I simplified it.
  213|       |
  214|  21.2k|    UnicodeString currentDescription;
  215|  21.2k|    int32_t oldP = 0;
  216|  63.6k|    while (oldP < description.length()) {
  ------------------
  |  Branch (216:12): [True: 42.4k, False: 21.2k]
  ------------------
  217|  42.4k|        int32_t p = description.indexOf(gSemicolon, oldP);
  218|  42.4k|        if (p == -1) {
  ------------------
  |  Branch (218:13): [True: 0, False: 42.4k]
  ------------------
  219|      0|            p = description.length();
  220|      0|        }
  221|  42.4k|        currentDescription.setTo(description, oldP, p - oldP);
  222|  42.4k|        NFRule::makeRules(currentDescription, this, rules.last(), owner, rules, status);
  223|  42.4k|        oldP = p + 1;
  224|  42.4k|    }
  225|       |
  226|       |    // for rules that didn't specify a base value, their base values
  227|       |    // were initialized to 0.  Make another pass through the list and
  228|       |    // set all those rules' base values.  We also remove any special
  229|       |    // rules from the list and put them into their own member variables
  230|  21.2k|    int64_t defaultBaseValue = 0;
  231|       |
  232|       |    // (this isn't a for loop because we might be deleting items from
  233|       |    // the vector-- we want to make sure we only increment i when
  234|       |    // we _didn't_ delete anything from the vector)
  235|  21.2k|    int32_t rulesSize = rules.size();
  236|  42.4k|    for (int32_t i = 0; i < rulesSize; i++) {
  ------------------
  |  Branch (236:25): [True: 21.2k, False: 21.2k]
  ------------------
  237|  21.2k|        NFRule* rule = rules[i];
  238|  21.2k|        int64_t baseValue = rule->getBaseValue();
  239|       |
  240|  21.2k|        if (baseValue == 0) {
  ------------------
  |  Branch (240:13): [True: 21.2k, False: 0]
  ------------------
  241|       |            // if the rule's base value is 0, fill in a default
  242|       |            // base value (this will be 1 plus the preceding
  243|       |            // rule's base value for regular rule sets, and the
  244|       |            // same as the preceding rule's base value in fraction
  245|       |            // rule sets)
  246|  21.2k|            rule->setBaseValue(defaultBaseValue, status);
  247|  21.2k|        }
  248|      0|        else {
  249|       |            // if it's a regular rule that already knows its base value,
  250|       |            // check to make sure the rules are in order, and update
  251|       |            // the default base value for the next rule
  252|      0|            if (baseValue < defaultBaseValue) {
  ------------------
  |  Branch (252:17): [True: 0, False: 0]
  ------------------
  253|       |                // throw new IllegalArgumentException("Rules are not in order");
  254|      0|                status = U_PARSE_ERROR;
  255|      0|                return;
  256|      0|            }
  257|      0|            defaultBaseValue = baseValue;
  258|      0|        }
  259|  21.2k|        if (!fIsFractionRuleSet) {
  ------------------
  |  Branch (259:13): [True: 21.2k, False: 0]
  ------------------
  260|  21.2k|            ++defaultBaseValue;
  261|  21.2k|        }
  262|  21.2k|    }
  263|  21.2k|}
_ZN6icu_789NFRuleSet19setNonNumericalRuleEPNS_6NFRuleE:
  269|  21.2k|void NFRuleSet::setNonNumericalRule(NFRule *rule) {
  270|  21.2k|    switch (rule->getBaseValue()) {
  271|  21.2k|        case NFRule::kNegativeNumberRule:
  ------------------
  |  Branch (271:9): [True: 21.2k, False: 0]
  ------------------
  272|  21.2k|            delete nonNumericalRules[NEGATIVE_RULE_INDEX];
  273|  21.2k|            nonNumericalRules[NEGATIVE_RULE_INDEX] = rule;
  274|  21.2k|            return;
  275|      0|        case NFRule::kImproperFractionRule:
  ------------------
  |  Branch (275:9): [True: 0, False: 21.2k]
  ------------------
  276|      0|            setBestFractionRule(IMPROPER_FRACTION_RULE_INDEX, rule, true);
  277|      0|            return;
  278|      0|        case NFRule::kProperFractionRule:
  ------------------
  |  Branch (278:9): [True: 0, False: 21.2k]
  ------------------
  279|      0|            setBestFractionRule(PROPER_FRACTION_RULE_INDEX, rule, true);
  280|      0|            return;
  281|      0|        case NFRule::kDefaultRule:
  ------------------
  |  Branch (281:9): [True: 0, False: 21.2k]
  ------------------
  282|      0|            setBestFractionRule(DEFAULT_RULE_INDEX, rule, true);
  283|      0|            return;
  284|      0|        case NFRule::kInfinityRule:
  ------------------
  |  Branch (284:9): [True: 0, False: 21.2k]
  ------------------
  285|      0|            delete nonNumericalRules[INFINITY_RULE_INDEX];
  286|      0|            nonNumericalRules[INFINITY_RULE_INDEX] = rule;
  287|      0|            return;
  288|      0|        case NFRule::kNaNRule:
  ------------------
  |  Branch (288:9): [True: 0, False: 21.2k]
  ------------------
  289|      0|            delete nonNumericalRules[NAN_RULE_INDEX];
  290|      0|            nonNumericalRules[NAN_RULE_INDEX] = rule;
  291|      0|            return;
  292|      0|        case NFRule::kNoBase:
  ------------------
  |  Branch (292:9): [True: 0, False: 21.2k]
  ------------------
  293|      0|        case NFRule::kOtherRule:
  ------------------
  |  Branch (293:9): [True: 0, False: 21.2k]
  ------------------
  294|      0|        default:
  ------------------
  |  Branch (294:9): [True: 0, False: 21.2k]
  ------------------
  295|       |            // If we do not remember the rule inside the object.
  296|       |            // delete it here to prevent memory leak.
  297|      0|            delete rule;
  298|      0|            return;
  299|  21.2k|    }
  300|  21.2k|}
_ZN6icu_789NFRuleSetD2Ev:
  330|  21.2k|{
  331|   148k|    for (int i = 0; i < NON_NUMERICAL_RULE_LENGTH; i++) {
  ------------------
  |  Branch (331:21): [True: 127k, False: 21.2k]
  ------------------
  332|   127k|        if (i != IMPROPER_FRACTION_RULE_INDEX
  ------------------
  |  Branch (332:13): [True: 106k, False: 21.2k]
  ------------------
  333|   127k|            && i != PROPER_FRACTION_RULE_INDEX
  ------------------
  |  Branch (333:16): [True: 84.8k, False: 21.2k]
  ------------------
  334|   127k|            && i != DEFAULT_RULE_INDEX)
  ------------------
  |  Branch (334:16): [True: 63.6k, False: 21.2k]
  ------------------
  335|  63.6k|        {
  336|  63.6k|            delete nonNumericalRules[i];
  337|  63.6k|        }
  338|       |        // else it will be deleted via NFRuleList fractionRules
  339|   127k|    }
  340|  21.2k|}

_ZNK6icu_789NFRuleSet7isNamedERKNS_13UnicodeStringE:
   53|  43.5k|    UBool isNamed(const UnicodeString& _name) const { return this->name == _name; }
_ZNK6icu_789NFRuleSet8getOwnerEv:
   64|  21.2k|    const RuleBasedNumberFormat *getOwner() const { return owner; }

_ZN6icu_786NFRuleC2EPKNS_21RuleBasedNumberFormatERKNS_13UnicodeStringER10UErrorCode:
   38|  84.8k|  : baseValue(static_cast<int32_t>(0))
   39|  84.8k|  , radix(10)
   40|  84.8k|  , exponent(0)
   41|  84.8k|  , decimalPoint(0)
   42|  84.8k|  , fRuleText(_ruleText)
   43|  84.8k|  , sub1(nullptr)
   44|  84.8k|  , sub2(nullptr)
   45|  84.8k|  , formatter(_rbnf)
   46|  84.8k|  , rulePatternFormat(nullptr)
   47|  84.8k|{
   48|  84.8k|    if (!fRuleText.isEmpty()) {
  ------------------
  |  Branch (48:9): [True: 84.8k, False: 0]
  ------------------
   49|  84.8k|        parseRuleDescriptor(fRuleText, status);
   50|  84.8k|    }
   51|  84.8k|}
_ZN6icu_786NFRuleD2Ev:
   54|  84.8k|{
   55|  84.8k|    if (sub1 != sub2) {
  ------------------
  |  Branch (55:9): [True: 42.4k, False: 42.4k]
  ------------------
   56|  42.4k|        delete sub2;
   57|  42.4k|        sub2 = nullptr;
   58|  42.4k|    }
   59|  84.8k|    delete sub1;
   60|  84.8k|    sub1 = nullptr;
   61|  84.8k|    delete rulePatternFormat;
   62|  84.8k|    rulePatternFormat = nullptr;
   63|  84.8k|}
_ZN6icu_786NFRule9makeRulesERNS_13UnicodeStringEPNS_9NFRuleSetEPKS0_PKNS_21RuleBasedNumberFormatERNS_10NFRuleListER10UErrorCode:
  115|  42.4k|{
  116|  42.4k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (116:9): [True: 0, False: 42.4k]
  ------------------
  117|      0|        return;
  118|      0|    }
  119|       |    // we know we're making at least one rule, so go ahead and
  120|       |    // new it up and initialize its basevalue and divisor
  121|       |    // (this also strips the rule descriptor, if any, off the
  122|       |    // description string)
  123|  42.4k|    LocalPointer<NFRule> rule1(new NFRule(rbnf, description, status));
  124|  42.4k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (124:9): [True: 0, False: 42.4k]
  ------------------
  125|      0|        return;
  126|      0|    }
  127|       |    /* test for nullptr */
  128|  42.4k|    if (rule1.isNull()) {
  ------------------
  |  Branch (128:9): [True: 0, False: 42.4k]
  ------------------
  129|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  130|      0|        return;
  131|      0|    }
  132|  42.4k|    description = rule1->fRuleText;
  133|       |
  134|       |    // check the description to see whether there's text enclosed
  135|       |    // in brackets
  136|  42.4k|    int32_t brack1 = description.indexOf(gLeftBracket);
  137|  42.4k|    int32_t brack2 = brack1 < 0 ? -1 : description.indexOf(gRightBracket);
  ------------------
  |  Branch (137:22): [True: 42.4k, False: 0]
  ------------------
  138|       |
  139|       |    // if the description doesn't contain a matched pair of brackets,
  140|       |    // or if it's of a type that doesn't recognize bracketed text,
  141|       |    // then leave the description alone, initialize the rule's
  142|       |    // rule text and substitutions, and return that rule
  143|  42.4k|    if (brack2 < 0 || brack1 > brack2
  ------------------
  |  Branch (143:9): [True: 42.4k, False: 0]
  |  Branch (143:23): [True: 0, False: 0]
  ------------------
  144|  42.4k|        || rule1->getType() == kProperFractionRule
  ------------------
  |  Branch (144:12): [True: 0, False: 0]
  ------------------
  145|  42.4k|        || rule1->getType() == kNegativeNumberRule
  ------------------
  |  Branch (145:12): [True: 0, False: 0]
  ------------------
  146|  42.4k|        || rule1->getType() == kInfinityRule
  ------------------
  |  Branch (146:12): [True: 0, False: 0]
  ------------------
  147|  42.4k|        || rule1->getType() == kNaNRule)
  ------------------
  |  Branch (147:12): [True: 0, False: 0]
  ------------------
  148|  42.4k|    {
  149|  42.4k|        rule1->extractSubstitutions(owner, description, predecessor, status);
  150|  42.4k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (150:13): [True: 0, False: 42.4k]
  ------------------
  151|      0|            return;
  152|      0|        }
  153|  42.4k|    }
  154|      0|    else {
  155|       |        // if the description does contain a matched pair of brackets,
  156|       |        // then it's really shorthand for two rules (with one exception)
  157|      0|        LocalPointer<NFRule> rule2;
  158|      0|        UnicodeString sbuf;
  159|      0|        int32_t orElseOp = description.indexOf(gVerticalLine);
  160|       |
  161|       |        // we'll actually only split the rule into two rules if its
  162|       |        // base value is an even multiple of its divisor (or it's one
  163|       |        // of the special rules)
  164|      0|        if ((rule1->baseValue > 0
  ------------------
  |  Branch (164:14): [True: 0, False: 0]
  ------------------
  165|      0|            && (rule1->radix != 0) // ICU-23109 Ensure next line won't "% 0"
  ------------------
  |  Branch (165:16): [True: 0, False: 0]
  ------------------
  166|      0|            && (rule1->baseValue % util64_pow(rule1->radix, rule1->exponent)) == 0)
  ------------------
  |  Branch (166:16): [True: 0, False: 0]
  ------------------
  167|      0|            || rule1->getType() == kImproperFractionRule
  ------------------
  |  Branch (167:16): [True: 0, False: 0]
  ------------------
  168|      0|            || rule1->getType() == kDefaultRule) {
  ------------------
  |  Branch (168:16): [True: 0, False: 0]
  ------------------
  169|       |
  170|       |            // if it passes that test, new up the second rule.  If the
  171|       |            // rule set both rules will belong to is a fraction rule
  172|       |            // set, they both have the same base value; otherwise,
  173|       |            // increment the original rule's base value ("rule1" actually
  174|       |            // goes SECOND in the rule set's rule list)
  175|      0|            rule2.adoptInstead(new NFRule(rbnf, UnicodeString(), status));
  176|      0|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (176:17): [True: 0, False: 0]
  ------------------
  177|      0|                return;
  178|      0|            }
  179|       |            /* test for nullptr */
  180|      0|            if (rule2.isNull()) {
  ------------------
  |  Branch (180:17): [True: 0, False: 0]
  ------------------
  181|      0|                status = U_MEMORY_ALLOCATION_ERROR;
  182|      0|                return;
  183|      0|            }
  184|      0|            if (rule1->baseValue >= 0) {
  ------------------
  |  Branch (184:17): [True: 0, False: 0]
  ------------------
  185|      0|                rule2->baseValue = rule1->baseValue;
  186|      0|                if (!owner->isFractionRuleSet()) {
  ------------------
  |  Branch (186:21): [True: 0, False: 0]
  ------------------
  187|      0|                    ++rule1->baseValue;
  188|      0|                }
  189|      0|            }
  190|       |
  191|       |            // if the description began with "x.x" and contains bracketed
  192|       |            // text, it describes both the improper fraction rule and
  193|       |            // the proper fraction rule
  194|      0|            else if (rule1->getType() == kImproperFractionRule) {
  ------------------
  |  Branch (194:22): [True: 0, False: 0]
  ------------------
  195|      0|                rule2->setType(kProperFractionRule);
  196|      0|            }
  197|       |
  198|       |            // if the description began with "x.0" and contains bracketed
  199|       |            // text, it describes both the default rule and the
  200|       |            // improper fraction rule
  201|      0|            else if (rule1->getType() == kDefaultRule) {
  ------------------
  |  Branch (201:22): [True: 0, False: 0]
  ------------------
  202|      0|                rule2->baseValue = rule1->baseValue;
  203|      0|                rule1->setType(kImproperFractionRule);
  204|      0|            }
  205|       |
  206|       |            // both rules have the same radix and exponent (i.e., the
  207|       |            // same divisor)
  208|      0|            rule2->radix = rule1->radix;
  209|      0|            rule2->exponent = rule1->exponent;
  210|       |
  211|       |            // By default, rule2's rule text omits the stuff in brackets,
  212|       |            // unless it contains a | between the brackets.
  213|       |            // Initialize its rule text and substitutions accordingly.
  214|      0|            sbuf.append(description, 0, brack1);
  215|      0|            if (orElseOp >= 0) {
  ------------------
  |  Branch (215:17): [True: 0, False: 0]
  ------------------
  216|      0|                sbuf.append(description, orElseOp + 1, brack2 - orElseOp - 1);
  217|      0|            }
  218|      0|            if (brack2 + 1 < description.length()) {
  ------------------
  |  Branch (218:17): [True: 0, False: 0]
  ------------------
  219|      0|                sbuf.append(description, brack2 + 1, description.length() - brack2 - 1);
  220|      0|            }
  221|      0|            rule2->extractSubstitutions(owner, sbuf, predecessor, status);
  222|      0|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (222:17): [True: 0, False: 0]
  ------------------
  223|      0|                return;
  224|      0|            }
  225|      0|        }
  226|       |
  227|       |        // rule1's text includes the text in the brackets but omits
  228|       |        // the brackets themselves: initialize _its_ rule text and
  229|       |        // substitutions accordingly
  230|      0|        sbuf.setTo(description, 0, brack1);
  231|      0|        if (orElseOp >= 0) {
  ------------------
  |  Branch (231:13): [True: 0, False: 0]
  ------------------
  232|      0|            sbuf.append(description, brack1 + 1, orElseOp - brack1 - 1);
  233|      0|        }
  234|      0|        else {
  235|      0|            sbuf.append(description, brack1 + 1, brack2 - brack1 - 1);
  236|      0|        }
  237|      0|        if (brack2 + 1 < description.length()) {
  ------------------
  |  Branch (237:13): [True: 0, False: 0]
  ------------------
  238|      0|            sbuf.append(description, brack2 + 1, description.length() - brack2 - 1);
  239|      0|        }
  240|      0|        rule1->extractSubstitutions(owner, sbuf, predecessor, status);
  241|      0|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (241:13): [True: 0, False: 0]
  ------------------
  242|      0|            return;
  243|      0|        }
  244|       |
  245|       |        // if we only have one rule, return it; if we have two, return
  246|       |        // a two-element array containing them (notice that rule2 goes
  247|       |        // BEFORE rule1 in the list: in all cases, rule2 OMITS the
  248|       |        // material in the brackets and rule1 INCLUDES the material
  249|       |        // in the brackets)
  250|      0|        if (!rule2.isNull()) {
  ------------------
  |  Branch (250:13): [True: 0, False: 0]
  ------------------
  251|      0|            if (rule2->baseValue >= kNoBase) {
  ------------------
  |  Branch (251:17): [True: 0, False: 0]
  ------------------
  252|      0|                rules.add(rule2.orphan());
  253|      0|            }
  254|      0|            else {
  255|      0|                owner->setNonNumericalRule(rule2.orphan());
  256|      0|            }
  257|      0|        }
  258|      0|    }
  259|  42.4k|    if (rule1->baseValue >= kNoBase) {
  ------------------
  |  Branch (259:9): [True: 21.2k, False: 21.2k]
  ------------------
  260|  21.2k|        rules.add(rule1.orphan());
  261|  21.2k|    }
  262|  21.2k|    else {
  263|  21.2k|        owner->setNonNumericalRule(rule1.orphan());
  264|  21.2k|    }
  265|  42.4k|}
_ZN6icu_786NFRule19parseRuleDescriptorERNS_13UnicodeStringER10UErrorCode:
  281|  84.8k|{
  282|       |    // the description consists of a rule descriptor and a rule body,
  283|       |    // separated by a colon.  The rule descriptor is optional.  If
  284|       |    // it's omitted, just set the base value to 0.
  285|  84.8k|    int32_t p = description.indexOf(gColon);
  286|  84.8k|    if (p != -1) {
  ------------------
  |  Branch (286:9): [True: 84.8k, False: 0]
  ------------------
  287|       |        // copy the descriptor out into its own string and strip it,
  288|       |        // along with any trailing whitespace, out of the original
  289|       |        // description
  290|  84.8k|        UnicodeString descriptor;
  291|  84.8k|        descriptor.setTo(description, 0, p);
  292|       |
  293|  84.8k|        ++p;
  294|   169k|        while (p < description.length() && PatternProps::isWhiteSpace(description.charAt(p))) {
  ------------------
  |  Branch (294:16): [True: 169k, False: 0]
  |  Branch (294:44): [True: 84.8k, False: 84.8k]
  ------------------
  295|  84.8k|            ++p;
  296|  84.8k|        }
  297|  84.8k|        description.removeBetween(0, p);
  298|       |
  299|       |        // check first to see if the rule descriptor matches the token
  300|       |        // for one of the special rules.  If it does, set the base
  301|       |        // value to the correct identifier value
  302|  84.8k|        int descriptorLength = descriptor.length();
  303|  84.8k|        char16_t firstChar = descriptor.charAt(0);
  304|  84.8k|        char16_t lastChar = descriptor.charAt(descriptorLength - 1);
  305|  84.8k|        if (firstChar >= gZero && firstChar <= gNine && lastChar != gX) {
  ------------------
  |  Branch (305:13): [True: 63.6k, False: 21.2k]
  |  Branch (305:35): [True: 21.2k, False: 42.4k]
  |  Branch (305:57): [True: 21.2k, False: 0]
  ------------------
  306|       |            // if the rule descriptor begins with a digit, it's a descriptor
  307|       |            // for a normal rule
  308|       |            // since we don't have Long.parseLong, and this isn't much work anyway,
  309|       |            // just build up the value as we encounter the digits.
  310|  21.2k|            int64_t val = 0;
  311|  21.2k|            p = 0;
  312|  21.2k|            char16_t c = gSpace;
  313|       |
  314|       |            // begin parsing the descriptor: copy digits
  315|       |            // into "tempValue", skip periods, commas, and spaces,
  316|       |            // stop on a slash or > sign (or at the end of the string),
  317|       |            // and throw an exception on any other character
  318|  42.4k|            while (p < descriptorLength) {
  ------------------
  |  Branch (318:20): [True: 21.2k, False: 21.2k]
  ------------------
  319|  21.2k|                c = descriptor.charAt(p);
  320|  21.2k|                if (c >= gZero && c <= gNine) {
  ------------------
  |  Branch (320:21): [True: 21.2k, False: 0]
  |  Branch (320:35): [True: 21.2k, False: 0]
  ------------------
  321|  21.2k|                    int64_t digit = static_cast<int64_t>(c - gZero);
  322|  21.2k|                    if ((val > 0 && val > (INT64_MAX - digit) / 10) ||
  ------------------
  |  Branch (322:26): [True: 0, False: 21.2k]
  |  Branch (322:37): [True: 0, False: 0]
  ------------------
  323|  21.2k|                        (val < 0 && val < (INT64_MIN - digit) / 10)) {
  ------------------
  |  Branch (323:26): [True: 0, False: 21.2k]
  |  Branch (323:37): [True: 0, False: 0]
  ------------------
  324|       |                        // out of int64_t range
  325|      0|                        status = U_PARSE_ERROR;
  326|      0|                        return;
  327|      0|                    }
  328|  21.2k|                    val = val * 10 + digit;
  329|  21.2k|                }
  330|      0|                else if (c == gSlash || c == gGreaterThan) {
  ------------------
  |  Branch (330:26): [True: 0, False: 0]
  |  Branch (330:41): [True: 0, False: 0]
  ------------------
  331|      0|                    break;
  332|      0|                }
  333|      0|                else if (PatternProps::isWhiteSpace(c) || c == gComma || c == gDot) {
  ------------------
  |  Branch (333:26): [True: 0, False: 0]
  |  Branch (333:59): [True: 0, False: 0]
  |  Branch (333:74): [True: 0, False: 0]
  ------------------
  334|      0|                }
  335|      0|                else {
  336|       |                    // throw new IllegalArgumentException("Illegal character in rule descriptor");
  337|      0|                    status = U_PARSE_ERROR;
  338|      0|                    return;
  339|      0|                }
  340|  21.2k|                ++p;
  341|  21.2k|            }
  342|       |
  343|       |            // we have the base value, so set it
  344|  21.2k|            setBaseValue(val, status);
  345|       |
  346|       |            // if we stopped the previous loop on a slash, we're
  347|       |            // now parsing the rule's radix.  Again, accumulate digits
  348|       |            // in tempValue, skip punctuation, stop on a > mark, and
  349|       |            // throw an exception on anything else
  350|  21.2k|            if (c == gSlash) {
  ------------------
  |  Branch (350:17): [True: 0, False: 21.2k]
  ------------------
  351|      0|                val = 0;
  352|      0|                ++p;
  353|      0|                while (p < descriptorLength) {
  ------------------
  |  Branch (353:24): [True: 0, False: 0]
  ------------------
  354|      0|                    c = descriptor.charAt(p);
  355|      0|                    if (c >= gZero && c <= gNine) {
  ------------------
  |  Branch (355:25): [True: 0, False: 0]
  |  Branch (355:39): [True: 0, False: 0]
  ------------------
  356|      0|                        int64_t digit = static_cast<int64_t>(c - gZero);
  357|      0|                        if ((val > 0 && val > (INT64_MAX - digit) / 10) ||
  ------------------
  |  Branch (357:30): [True: 0, False: 0]
  |  Branch (357:41): [True: 0, False: 0]
  ------------------
  358|      0|                            (val < 0 && val < (INT64_MIN - digit) / 10)) {
  ------------------
  |  Branch (358:30): [True: 0, False: 0]
  |  Branch (358:41): [True: 0, False: 0]
  ------------------
  359|       |                            // out of int64_t range
  360|      0|                            status = U_PARSE_ERROR;
  361|      0|                            return;
  362|      0|                        }
  363|      0|                        val = val * 10 + digit;
  364|      0|                    }
  365|      0|                    else if (c == gGreaterThan) {
  ------------------
  |  Branch (365:30): [True: 0, False: 0]
  ------------------
  366|      0|                        break;
  367|      0|                    }
  368|      0|                    else if (PatternProps::isWhiteSpace(c) || c == gComma || c == gDot) {
  ------------------
  |  Branch (368:30): [True: 0, False: 0]
  |  Branch (368:63): [True: 0, False: 0]
  |  Branch (368:78): [True: 0, False: 0]
  ------------------
  369|      0|                    }
  370|      0|                    else {
  371|       |                        // throw new IllegalArgumentException("Illegal character is rule descriptor");
  372|      0|                        status = U_PARSE_ERROR;
  373|      0|                        return;
  374|      0|                    }
  375|      0|                    ++p;
  376|      0|                }
  377|       |
  378|       |                // tempValue now contain's the rule's radix.  Set it
  379|       |                // accordingly, and recalculate the rule's exponent
  380|      0|                radix = static_cast<int32_t>(val);
  381|      0|                if (radix == 0) {
  ------------------
  |  Branch (381:21): [True: 0, False: 0]
  ------------------
  382|       |                    // throw new IllegalArgumentException("Rule can't have radix of 0");
  383|      0|                    status = U_PARSE_ERROR;
  384|      0|                }
  385|       |
  386|      0|                exponent = expectedExponent();
  387|      0|            }
  388|       |
  389|       |            // if we stopped the previous loop on a > sign, then continue
  390|       |            // for as long as we still see > signs.  For each one,
  391|       |            // decrement the exponent (unless the exponent is already 0).
  392|       |            // If we see another character before reaching the end of
  393|       |            // the descriptor, that's also a syntax error.
  394|  21.2k|            if (c == gGreaterThan) {
  ------------------
  |  Branch (394:17): [True: 0, False: 21.2k]
  ------------------
  395|      0|                while (p < descriptor.length()) {
  ------------------
  |  Branch (395:24): [True: 0, False: 0]
  ------------------
  396|      0|                    c = descriptor.charAt(p);
  397|      0|                    if (c == gGreaterThan && exponent > 0) {
  ------------------
  |  Branch (397:25): [True: 0, False: 0]
  |  Branch (397:46): [True: 0, False: 0]
  ------------------
  398|      0|                        --exponent;
  399|      0|                    } else {
  400|       |                        // throw new IllegalArgumentException("Illegal character in rule descriptor");
  401|      0|                        status = U_PARSE_ERROR;
  402|      0|                        return;
  403|      0|                    }
  404|      0|                    ++p;
  405|      0|                }
  406|      0|            }
  407|  21.2k|        }
  408|  63.6k|        else if (0 == descriptor.compare(gMinusX, 2)) {
  ------------------
  |  Branch (408:18): [True: 21.2k, False: 42.4k]
  ------------------
  409|  21.2k|            setType(kNegativeNumberRule);
  410|  21.2k|        }
  411|  42.4k|        else if (descriptorLength == 3) {
  ------------------
  |  Branch (411:18): [True: 42.4k, False: 0]
  ------------------
  412|  42.4k|            if (firstChar == gZero && lastChar == gX) {
  ------------------
  |  Branch (412:17): [True: 0, False: 42.4k]
  |  Branch (412:39): [True: 0, False: 0]
  ------------------
  413|      0|                setBaseValue(kProperFractionRule, status);
  414|      0|                decimalPoint = descriptor.charAt(1);
  415|      0|            }
  416|  42.4k|            else if (firstChar == gX && lastChar == gX) {
  ------------------
  |  Branch (416:22): [True: 0, False: 42.4k]
  |  Branch (416:41): [True: 0, False: 0]
  ------------------
  417|      0|                setBaseValue(kImproperFractionRule, status);
  418|      0|                decimalPoint = descriptor.charAt(1);
  419|      0|            }
  420|  42.4k|            else if (firstChar == gX && lastChar == gZero) {
  ------------------
  |  Branch (420:22): [True: 0, False: 42.4k]
  |  Branch (420:41): [True: 0, False: 0]
  ------------------
  421|      0|                setBaseValue(kDefaultRule, status);
  422|      0|                decimalPoint = descriptor.charAt(1);
  423|      0|            }
  424|  42.4k|            else if (descriptor.compare(gNaN, 3) == 0) {
  ------------------
  |  Branch (424:22): [True: 21.2k, False: 21.2k]
  ------------------
  425|  21.2k|                setBaseValue(kNaNRule, status);
  426|  21.2k|            }
  427|  21.2k|            else if (descriptor.compare(gInf, 3) == 0) {
  ------------------
  |  Branch (427:22): [True: 21.2k, False: 0]
  ------------------
  428|  21.2k|                setBaseValue(kInfinityRule, status);
  429|  21.2k|            }
  430|  42.4k|        }
  431|  84.8k|    }
  432|       |    // else use the default base value for now.
  433|       |
  434|       |    // finally, if the rule body begins with an apostrophe, strip it off
  435|       |    // (this is generally used to put whitespace at the beginning of
  436|       |    // a rule's rule text)
  437|  84.8k|    if (!description.isEmpty() && description.charAt(0) == gTick) {
  ------------------
  |  Branch (437:9): [True: 84.8k, False: 0]
  |  Branch (437:35): [True: 0, False: 84.8k]
  ------------------
  438|      0|        description.removeBetween(0, 1);
  439|      0|    }
  440|       |
  441|       |    // return the description with all the stuff we've just waded through
  442|       |    // stripped off the front.  It now contains just the rule body.
  443|       |    // return description;
  444|  84.8k|}
_ZN6icu_786NFRule20extractSubstitutionsEPKNS_9NFRuleSetERKNS_13UnicodeStringEPKS0_R10UErrorCode:
  459|  42.4k|{
  460|  42.4k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (460:9): [True: 0, False: 42.4k]
  ------------------
  461|      0|        return;
  462|      0|    }
  463|  42.4k|    fRuleText = ruleText;
  464|  42.4k|    sub1 = extractSubstitution(ruleSet, predecessor, status);
  465|  42.4k|    if (sub1 == nullptr) {
  ------------------
  |  Branch (465:9): [True: 0, False: 42.4k]
  ------------------
  466|       |        // Small optimization. There is no need to create a redundant NullSubstitution.
  467|      0|        sub2 = nullptr;
  468|      0|    }
  469|  42.4k|    else {
  470|  42.4k|        sub2 = extractSubstitution(ruleSet, predecessor, status);
  471|  42.4k|    }
  472|  42.4k|    int32_t pluralRuleStart = fRuleText.indexOf(gDollarOpenParenthesis, -1, 0);
  473|  42.4k|    int32_t pluralRuleEnd = (pluralRuleStart >= 0 ? fRuleText.indexOf(gClosedParenthesisDollar, -1, pluralRuleStart) : -1);
  ------------------
  |  Branch (473:30): [True: 21.2k, False: 21.2k]
  ------------------
  474|  42.4k|    if (pluralRuleEnd >= 0) {
  ------------------
  |  Branch (474:9): [True: 21.2k, False: 21.2k]
  ------------------
  475|  21.2k|        int32_t endType = fRuleText.indexOf(gComma, pluralRuleStart);
  476|  21.2k|        if (endType < 0) {
  ------------------
  |  Branch (476:13): [True: 0, False: 21.2k]
  ------------------
  477|      0|            status = U_PARSE_ERROR;
  478|      0|            return;
  479|      0|        }
  480|  21.2k|        UnicodeString type(fRuleText.tempSubString(pluralRuleStart + 2, endType - pluralRuleStart - 2));
  481|  21.2k|        UPluralType pluralType;
  482|  21.2k|        if (type.startsWith(UNICODE_STRING_SIMPLE("cardinal"))) {
  ------------------
  |  |  135|  21.2k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  21.2k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  |  Branch (482:13): [True: 0, False: 21.2k]
  ------------------
  483|      0|            pluralType = UPLURAL_TYPE_CARDINAL;
  484|      0|        }
  485|  21.2k|        else if (type.startsWith(UNICODE_STRING_SIMPLE("ordinal"))) {
  ------------------
  |  |  135|  21.2k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  21.2k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  |  Branch (485:18): [True: 21.2k, False: 0]
  ------------------
  486|  21.2k|            pluralType = UPLURAL_TYPE_ORDINAL;
  487|  21.2k|        }
  488|      0|        else {
  489|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  490|      0|            return;
  491|      0|        }
  492|  21.2k|        rulePatternFormat = formatter->createPluralFormat(pluralType,
  493|  21.2k|                fRuleText.tempSubString(endType + 1, pluralRuleEnd - endType - 1), status);
  494|  21.2k|    }
  495|  42.4k|}
_ZN6icu_786NFRule19extractSubstitutionEPKNS_9NFRuleSetEPKS0_R10UErrorCode:
  513|  84.8k|{
  514|  84.8k|    NFSubstitution* result = nullptr;
  515|       |
  516|       |    // search the rule's rule text for the first two characters of
  517|       |    // a substitution token
  518|  84.8k|    int32_t subStart = indexOfAnyRulePrefix();
  519|  84.8k|    int32_t subEnd = subStart;
  520|       |
  521|       |    // if we didn't find one, create a null substitution positioned
  522|       |    // at the end of the rule text
  523|  84.8k|    if (subStart == -1) {
  ------------------
  |  Branch (523:9): [True: 42.4k, False: 42.4k]
  ------------------
  524|  42.4k|        return nullptr;
  525|  42.4k|    }
  526|       |
  527|       |    // special-case the ">>>" token, since searching for the > at the
  528|       |    // end will actually find the > in the middle
  529|  42.4k|    if (fRuleText.indexOf(gGreaterGreaterGreater, 3, 0) == subStart) {
  ------------------
  |  Branch (529:9): [True: 0, False: 42.4k]
  ------------------
  530|      0|        subEnd = subStart + 2;
  531|       |
  532|       |        // otherwise the substitution token ends with the same character
  533|       |        // it began with
  534|  42.4k|    } else {
  535|  42.4k|        char16_t c = fRuleText.charAt(subStart);
  536|  42.4k|        subEnd = fRuleText.indexOf(c, subStart + 1);
  537|       |        // special case for '<%foo<<'
  538|  42.4k|        if (c == gLessThan && subEnd != -1 && subEnd < fRuleText.length() - 1 && fRuleText.charAt(subEnd+1) == c) {
  ------------------
  |  Branch (538:13): [True: 0, False: 42.4k]
  |  Branch (538:31): [True: 0, False: 0]
  |  Branch (538:47): [True: 0, False: 0]
  |  Branch (538:82): [True: 0, False: 0]
  ------------------
  539|       |            // ordinals use "=#,##0==%abbrev=" as their rule.  Notice that the '==' in the middle
  540|       |            // occurs because of the juxtaposition of two different rules.  The check for '<' is a hack
  541|       |            // to get around this.  Having the duplicate at the front would cause problems with
  542|       |            // rules like "<<%" to format, say, percents...
  543|      0|            ++subEnd;
  544|      0|        }
  545|  42.4k|   }
  546|       |
  547|       |    // if we don't find the end of the token (i.e., if we're on a single,
  548|       |    // unmatched token character), create a null substitution positioned
  549|       |    // at the end of the rule
  550|  42.4k|    if (subEnd == -1) {
  ------------------
  |  Branch (550:9): [True: 0, False: 42.4k]
  ------------------
  551|      0|        return nullptr;
  552|      0|    }
  553|       |
  554|       |    // if we get here, we have a real substitution token (or at least
  555|       |    // some text bounded by substitution token characters).  Use
  556|       |    // makeSubstitution() to create the right kind of substitution
  557|  42.4k|    UnicodeString subToken;
  558|  42.4k|    subToken.setTo(fRuleText, subStart, subEnd + 1 - subStart);
  559|  42.4k|    result = NFSubstitution::makeSubstitution(subStart, this, predecessor, ruleSet,
  560|  42.4k|        this->formatter, subToken, status);
  561|       |
  562|       |    // remove the substitution from the rule text
  563|  42.4k|    fRuleText.removeBetween(subStart, subEnd+1);
  564|       |
  565|  42.4k|    return result;
  566|  42.4k|}
_ZN6icu_786NFRule12setBaseValueElR10UErrorCode:
  577|  84.8k|{
  578|       |    // set the base value
  579|  84.8k|    baseValue = newBaseValue;
  580|  84.8k|    radix = 10;
  581|       |
  582|       |    // if this isn't a special rule, recalculate the radix and exponent
  583|       |    // (the radix always defaults to 10; if it's supposed to be something
  584|       |    // else, it's cleaned up by the caller and the exponent is
  585|       |    // recalculated again-- the only function that does this is
  586|       |    // NFRule.parseRuleDescriptor() )
  587|  84.8k|    if (baseValue >= 1) {
  ------------------
  |  Branch (587:9): [True: 0, False: 84.8k]
  ------------------
  588|      0|        exponent = expectedExponent();
  589|       |
  590|       |        // this function gets called on a fully-constructed rule whose
  591|       |        // description didn't specify a base value.  This means it
  592|       |        // has substitutions, and some substitutions hold on to copies
  593|       |        // of the rule's divisor.  Fix their copies of the divisor.
  594|      0|        if (sub1 != nullptr) {
  ------------------
  |  Branch (594:13): [True: 0, False: 0]
  ------------------
  595|      0|            sub1->setDivisor(radix, exponent, status);
  596|      0|        }
  597|      0|        if (sub2 != nullptr) {
  ------------------
  |  Branch (597:13): [True: 0, False: 0]
  ------------------
  598|      0|            sub2->setDivisor(radix, exponent, status);
  599|      0|        }
  600|       |
  601|       |        // if this is a special rule, its radix and exponent are basically
  602|       |        // ignored.  Set them to "safe" default values
  603|  84.8k|    } else {
  604|  84.8k|        exponent = 0;
  605|  84.8k|    }
  606|  84.8k|}
_ZNK6icu_786NFRule20indexOfAnyRulePrefixEv:
  644|  84.8k|{
  645|  84.8k|    int result = -1;
  646|  1.01M|    for (int i = 0; RULE_PREFIXES[i]; i++) {
  ------------------
  |  Branch (646:21): [True: 933k, False: 84.8k]
  ------------------
  647|   933k|        int32_t pos = fRuleText.indexOf(*RULE_PREFIXES[i]);
  648|   933k|        if (pos != -1 && (result == -1 || pos < result)) {
  ------------------
  |  Branch (648:13): [True: 148k, False: 784k]
  |  Branch (648:27): [True: 42.4k, False: 106k]
  |  Branch (648:43): [True: 0, False: 106k]
  ------------------
  649|  42.4k|            result = pos;
  650|  42.4k|        }
  651|   933k|    }
  652|  84.8k|    return result;
  653|  84.8k|}

_ZN6icu_786NFRule7setTypeENS0_9ERuleTypeE:
   61|  21.2k|    void setType(ERuleType ruleType) { baseValue = static_cast<int32_t>(ruleType); }
_ZNK6icu_786NFRule12getBaseValueEv:
   63|  63.6k|    int64_t getBaseValue() const { return baseValue; }

_ZN6icu_7821SameValueSubstitutionD2Ev:
   72|  21.2k|SameValueSubstitution::~SameValueSubstitution() {}
_ZN6icu_7825AbsoluteValueSubstitutionD2Ev:
  280|  21.2k|AbsoluteValueSubstitution::~AbsoluteValueSubstitution() {}
_ZN6icu_7814NFSubstitution16makeSubstitutionEiPKNS_6NFRuleES3_PKNS_9NFRuleSetEPKNS_21RuleBasedNumberFormatERKNS_13UnicodeStringER10UErrorCode:
  343|  42.4k|{
  344|       |    // if the description is empty, return a NullSubstitution
  345|  42.4k|    if (description.length() == 0) {
  ------------------
  |  Branch (345:9): [True: 0, False: 42.4k]
  ------------------
  346|      0|        return nullptr;
  347|      0|    }
  348|       |
  349|  42.4k|    switch (description.charAt(0)) {
  350|       |        // if the description begins with '<'...
  351|      0|    case gLessThan:
  ------------------
  |  Branch (351:5): [True: 0, False: 42.4k]
  ------------------
  352|       |        // throw an exception if the rule is a negative number
  353|       |        // rule
  354|      0|        if (rule->getBaseValue() == NFRule::kNegativeNumberRule) {
  ------------------
  |  Branch (354:13): [True: 0, False: 0]
  ------------------
  355|       |            // throw new IllegalArgumentException("<< not allowed in negative-number rule");
  356|      0|            status = U_PARSE_ERROR;
  357|      0|            return nullptr;
  358|      0|        }
  359|       |
  360|       |        // if the rule is a fraction rule, return an
  361|       |        // IntegralPartSubstitution
  362|      0|        else if (rule->getBaseValue() == NFRule::kImproperFractionRule
  ------------------
  |  Branch (362:18): [True: 0, False: 0]
  ------------------
  363|      0|            || rule->getBaseValue() == NFRule::kProperFractionRule
  ------------------
  |  Branch (363:16): [True: 0, False: 0]
  ------------------
  364|      0|            || rule->getBaseValue() == NFRule::kDefaultRule) {
  ------------------
  |  Branch (364:16): [True: 0, False: 0]
  ------------------
  365|      0|            return new IntegralPartSubstitution(pos, ruleSet, description, status);
  366|      0|        }
  367|       |
  368|       |        // if the rule set containing the rule is a fraction
  369|       |        // rule set, return a NumeratorSubstitution
  370|      0|        else if (ruleSet->isFractionRuleSet()) {
  ------------------
  |  Branch (370:18): [True: 0, False: 0]
  ------------------
  371|      0|            return new NumeratorSubstitution(pos, static_cast<double>(rule->getBaseValue()),
  372|      0|                formatter->getDefaultRuleSet(), description, status);
  373|      0|        }
  374|       |
  375|       |        // otherwise, return a MultiplierSubstitution
  376|      0|        else {
  377|      0|            return new MultiplierSubstitution(pos, rule, ruleSet,
  378|      0|                description, status);
  379|      0|        }
  380|       |
  381|       |        // if the description begins with '>'...
  382|  21.2k|    case gGreaterThan:
  ------------------
  |  Branch (382:5): [True: 21.2k, False: 21.2k]
  ------------------
  383|       |        // if the rule is a negative-number rule, return
  384|       |        // an AbsoluteValueSubstitution
  385|  21.2k|        if (rule->getBaseValue() == NFRule::kNegativeNumberRule) {
  ------------------
  |  Branch (385:13): [True: 21.2k, False: 0]
  ------------------
  386|  21.2k|            return new AbsoluteValueSubstitution(pos, ruleSet, description, status);
  387|  21.2k|        }
  388|       |
  389|       |        // if the rule is a fraction rule, return a
  390|       |        // FractionalPartSubstitution
  391|      0|        else if (rule->getBaseValue() == NFRule::kImproperFractionRule
  ------------------
  |  Branch (391:18): [True: 0, False: 0]
  ------------------
  392|      0|            || rule->getBaseValue() == NFRule::kProperFractionRule
  ------------------
  |  Branch (392:16): [True: 0, False: 0]
  ------------------
  393|      0|            || rule->getBaseValue() == NFRule::kDefaultRule) {
  ------------------
  |  Branch (393:16): [True: 0, False: 0]
  ------------------
  394|      0|            return new FractionalPartSubstitution(pos, ruleSet, description, status);
  395|      0|        }
  396|       |
  397|       |        // if the rule set owning the rule is a fraction rule set,
  398|       |        // throw an exception
  399|      0|        else if (ruleSet->isFractionRuleSet()) {
  ------------------
  |  Branch (399:18): [True: 0, False: 0]
  ------------------
  400|       |            // throw new IllegalArgumentException(">> not allowed in fraction rule set");
  401|      0|            status = U_PARSE_ERROR;
  402|      0|            return nullptr;
  403|      0|        }
  404|       |
  405|       |        // otherwise, return a ModulusSubstitution
  406|      0|        else {
  407|      0|            return new ModulusSubstitution(pos, rule, predecessor,
  408|      0|                ruleSet, description, status);
  409|      0|        }
  410|       |
  411|       |        // if the description begins with '=', always return a
  412|       |        // SameValueSubstitution
  413|  21.2k|    case gEquals:
  ------------------
  |  Branch (413:5): [True: 21.2k, False: 21.2k]
  ------------------
  414|  21.2k|        return new SameValueSubstitution(pos, ruleSet, description, status);
  415|       |
  416|       |        // and if it's anything else, throw an exception
  417|      0|    default:
  ------------------
  |  Branch (417:5): [True: 0, False: 42.4k]
  ------------------
  418|       |        // throw new IllegalArgumentException("Illegal substitution character");
  419|      0|        status = U_PARSE_ERROR;
  420|  42.4k|    }
  421|      0|    return nullptr;
  422|  42.4k|}
_ZN6icu_7814NFSubstitutionC2EiPKNS_9NFRuleSetERKNS_13UnicodeStringER10UErrorCode:
  428|  42.4k|                               : pos(_pos), ruleSet(nullptr), numberFormat(nullptr)
  429|  42.4k|{
  430|       |    // the description should begin and end with the same character.
  431|       |    // If it doesn't that's a syntax error.  Otherwise,
  432|       |    // makeSubstitution() was the only thing that needed to know
  433|       |    // about these characters, so strip them off
  434|  42.4k|    UnicodeString workingDescription(description);
  435|  42.4k|    if (description.length() >= 2
  ------------------
  |  Branch (435:9): [True: 42.4k, False: 0]
  ------------------
  436|  42.4k|        && description.charAt(0) == description.charAt(description.length() - 1))
  ------------------
  |  Branch (436:12): [True: 42.4k, False: 0]
  ------------------
  437|  42.4k|    {
  438|  42.4k|        workingDescription.remove(description.length() - 1, 1);
  439|  42.4k|        workingDescription.remove(0, 1);
  440|  42.4k|    }
  441|      0|    else if (description.length() != 0) {
  ------------------
  |  Branch (441:14): [True: 0, False: 0]
  ------------------
  442|       |        // throw new IllegalArgumentException("Illegal substitution syntax");
  443|      0|        status = U_PARSE_ERROR;
  444|      0|        return;
  445|      0|    }
  446|       |
  447|  42.4k|    if (workingDescription.length() == 0) {
  ------------------
  |  Branch (447:9): [True: 21.2k, False: 21.2k]
  ------------------
  448|       |        // if the description was just two paired token characters
  449|       |        // (i.e., "<<" or ">>"), it uses the rule set it belongs to to
  450|       |        // format its result
  451|  21.2k|        this->ruleSet = _ruleSet;
  452|  21.2k|    }
  453|  21.2k|    else if (workingDescription.charAt(0) == gPercent) {
  ------------------
  |  Branch (453:14): [True: 0, False: 21.2k]
  ------------------
  454|       |        // if the description contains a rule set name, that's the rule
  455|       |        // set we use to format the result: get a reference to the
  456|       |        // names rule set
  457|      0|        this->ruleSet = _ruleSet->getOwner()->findRuleSet(workingDescription, status);
  458|      0|    }
  459|  21.2k|    else if (workingDescription.charAt(0) == gPound || workingDescription.charAt(0) ==gZero) {
  ------------------
  |  Branch (459:14): [True: 21.2k, False: 0]
  |  Branch (459:56): [True: 0, False: 0]
  ------------------
  460|       |        // if the description begins with 0 or #, treat it as a
  461|       |        // DecimalFormat pattern, and initialize a DecimalFormat with
  462|       |        // that pattern (then set it to use the DecimalFormatSymbols
  463|       |        // belonging to our formatter)
  464|  21.2k|        const DecimalFormatSymbols* sym = _ruleSet->getOwner()->getDecimalFormatSymbols();
  465|  21.2k|        if (!sym) {
  ------------------
  |  Branch (465:13): [True: 0, False: 21.2k]
  ------------------
  466|      0|            status = U_MISSING_RESOURCE_ERROR;
  467|      0|            return;
  468|      0|        }
  469|  21.2k|        DecimalFormat *tempNumberFormat = new DecimalFormat(workingDescription, *sym, status);
  470|       |        /* test for nullptr */
  471|  21.2k|        if (!tempNumberFormat) {
  ------------------
  |  Branch (471:13): [True: 0, False: 21.2k]
  ------------------
  472|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  473|      0|            return;
  474|      0|        }
  475|  21.2k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (475:13): [True: 0, False: 21.2k]
  ------------------
  476|      0|            delete tempNumberFormat;
  477|      0|            return;
  478|      0|        }
  479|  21.2k|        this->numberFormat = tempNumberFormat;
  480|  21.2k|    }
  481|      0|    else if (workingDescription.charAt(0) == gGreaterThan) {
  ------------------
  |  Branch (481:14): [True: 0, False: 0]
  ------------------
  482|       |        // if the description is ">>>", this substitution bypasses the
  483|       |        // usual rule-search process and always uses the rule that precedes
  484|       |        // it in its own rule set's rule list (this is used for place-value
  485|       |        // notations: formats where you want to see a particular part of
  486|       |        // a number even when it's 0)
  487|       |
  488|       |        // this causes problems when >>> is used in a frationalPartSubstitution
  489|       |        // this->ruleSet = nullptr;
  490|      0|        this->ruleSet = _ruleSet;
  491|      0|        this->numberFormat = nullptr;
  492|      0|    }
  493|      0|    else {
  494|       |        // and of the description is none of these things, it's a syntax error
  495|       |
  496|       |        // throw new IllegalArgumentException("Illegal substitution syntax");
  497|      0|        status = U_PARSE_ERROR;
  498|      0|    }
  499|  42.4k|}
_ZN6icu_7814NFSubstitutionD2Ev:
  502|  42.4k|{
  503|  42.4k|    delete numberFormat;
  504|  42.4k|    numberFormat = nullptr;
  505|  42.4k|}
_ZN6icu_7821SameValueSubstitutionC2EiPKNS_9NFRuleSetERKNS_13UnicodeStringER10UErrorCode:
  811|  21.2k|: NFSubstitution(_pos, _ruleSet, description, status)
  812|  21.2k|{
  813|  21.2k|    if (0 == description.compare(gEqualsEquals, 2)) {
  ------------------
  |  Branch (813:9): [True: 0, False: 21.2k]
  ------------------
  814|       |        // throw new IllegalArgumentException("== is not a legal token");
  815|      0|        status = U_PARSE_ERROR;
  816|      0|    }
  817|  21.2k|}
_ZN6icu_7825AbsoluteValueSubstitutionC2EiPKNS_9NFRuleSetERKNS_13UnicodeStringER10UErrorCode:
  266|  21.2k|        : NFSubstitution(_pos, _ruleSet, description, status) {}

_ZN6icu_786number4impl14SymbolProviderD2Ev:
   17|  56.1k|SymbolProvider::~SymbolProvider() = default;
_ZN6icu_786number4impl10AffixUtils6escapeERKNS_13UnicodeStringE:
   85|   618k|UnicodeString AffixUtils::escape(const UnicodeString &input) {
   86|   618k|    AffixPatternState state = STATE_BASE;
   87|   618k|    int32_t offset = 0;
   88|   618k|    UnicodeString output;
   89|   618k|    for (; offset < input.length();) {
  ------------------
  |  Branch (89:12): [True: 0, False: 618k]
  ------------------
   90|      0|        UChar32 cp = input.char32At(offset);
   91|       |
   92|      0|        switch (cp) {
   93|      0|            case u'\'':
  ------------------
  |  Branch (93:13): [True: 0, False: 0]
  ------------------
   94|      0|                output.append(u"''", -1);
   95|      0|                break;
   96|       |
   97|      0|            case u'-':
  ------------------
  |  Branch (97:13): [True: 0, False: 0]
  ------------------
   98|      0|            case u'+':
  ------------------
  |  Branch (98:13): [True: 0, False: 0]
  ------------------
   99|      0|            case u'%':
  ------------------
  |  Branch (99:13): [True: 0, False: 0]
  ------------------
  100|      0|            case u'‰':
  ------------------
  |  Branch (100:13): [True: 0, False: 0]
  ------------------
  101|      0|            case u'¤':
  ------------------
  |  Branch (101:13): [True: 0, False: 0]
  ------------------
  102|      0|                if (state == STATE_BASE) {
  ------------------
  |  Branch (102:21): [True: 0, False: 0]
  ------------------
  103|      0|                    output.append(u'\'');
  104|      0|                    output.append(cp);
  105|      0|                    state = STATE_INSIDE_QUOTE;
  106|      0|                } else {
  107|      0|                    output.append(cp);
  108|      0|                }
  109|      0|                break;
  110|       |
  111|      0|            default:
  ------------------
  |  Branch (111:13): [True: 0, False: 0]
  ------------------
  112|      0|                if (state == STATE_INSIDE_QUOTE) {
  ------------------
  |  Branch (112:21): [True: 0, False: 0]
  ------------------
  113|      0|                    output.append(u'\'');
  114|      0|                    output.append(cp);
  115|      0|                    state = STATE_BASE;
  116|      0|                } else {
  117|      0|                    output.append(cp);
  118|      0|                }
  119|      0|                break;
  120|      0|        }
  121|      0|        offset += U16_LENGTH(cp);
  ------------------
  |  |  141|      0|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  122|      0|    }
  123|       |
  124|   618k|    if (state == STATE_INSIDE_QUOTE) {
  ------------------
  |  Branch (124:9): [True: 0, False: 618k]
  ------------------
  125|      0|        output.append(u'\'');
  126|      0|    }
  127|       |
  128|   618k|    return output;
  129|   618k|}
_ZN6icu_786number4impl10AffixUtils15getFieldForTypeENS1_16AffixPatternTypeE:
  131|   112k|Field AffixUtils::getFieldForType(AffixPatternType type) {
  132|   112k|    switch (type) {
  133|  56.1k|        case TYPE_MINUS_SIGN:
  ------------------
  |  Branch (133:9): [True: 56.1k, False: 56.1k]
  ------------------
  134|  56.1k|            return {UFIELD_CATEGORY_NUMBER, UNUM_SIGN_FIELD};
  135|  56.1k|        case TYPE_PLUS_SIGN:
  ------------------
  |  Branch (135:9): [True: 56.1k, False: 56.1k]
  ------------------
  136|  56.1k|            return {UFIELD_CATEGORY_NUMBER, UNUM_SIGN_FIELD};
  137|      0|        case TYPE_APPROXIMATELY_SIGN:
  ------------------
  |  Branch (137:9): [True: 0, False: 112k]
  ------------------
  138|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_APPROXIMATELY_SIGN_FIELD};
  139|      0|        case TYPE_PERCENT:
  ------------------
  |  Branch (139:9): [True: 0, False: 112k]
  ------------------
  140|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_PERCENT_FIELD};
  141|      0|        case TYPE_PERMILLE:
  ------------------
  |  Branch (141:9): [True: 0, False: 112k]
  ------------------
  142|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_PERMILL_FIELD};
  143|      0|        case TYPE_CURRENCY_SINGLE:
  ------------------
  |  Branch (143:9): [True: 0, False: 112k]
  ------------------
  144|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  145|      0|        case TYPE_CURRENCY_DOUBLE:
  ------------------
  |  Branch (145:9): [True: 0, False: 112k]
  ------------------
  146|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  147|      0|        case TYPE_CURRENCY_TRIPLE:
  ------------------
  |  Branch (147:9): [True: 0, False: 112k]
  ------------------
  148|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  149|      0|        case TYPE_CURRENCY_QUAD:
  ------------------
  |  Branch (149:9): [True: 0, False: 112k]
  ------------------
  150|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  151|      0|        case TYPE_CURRENCY_QUINT:
  ------------------
  |  Branch (151:9): [True: 0, False: 112k]
  ------------------
  152|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  153|      0|        case TYPE_CURRENCY_OVERFLOW:
  ------------------
  |  Branch (153:9): [True: 0, False: 112k]
  ------------------
  154|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  155|      0|        default:
  ------------------
  |  Branch (155:9): [True: 0, False: 112k]
  ------------------
  156|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  157|   112k|    }
  158|   112k|}
_ZN6icu_786number4impl10AffixUtils8unescapeERKNS_13UnicodeStringERNS_22FormattedStringBuilderEiRKNS1_14SymbolProviderENS6_5FieldER10UErrorCode:
  162|   449k|                     const SymbolProvider &provider, Field field, UErrorCode &status) {
  163|   449k|    int32_t length = 0;
  164|   449k|    AffixTag tag;
  165|   561k|    while (hasNext(tag, affixPattern)) {
  ------------------
  |  Branch (165:12): [True: 112k, False: 449k]
  ------------------
  166|   112k|        tag = nextToken(tag, affixPattern, status);
  167|   112k|        if (U_FAILURE(status)) { return length; }
  ------------------
  |  Branch (167:13): [True: 0, False: 112k]
  ------------------
  168|   112k|        if (tag.type == TYPE_CURRENCY_OVERFLOW) {
  ------------------
  |  Branch (168:13): [True: 0, False: 112k]
  ------------------
  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|   112k|        } else if (tag.type < 0) {
  ------------------
  |  Branch (175:20): [True: 112k, False: 0]
  ------------------
  176|   112k|            length += output.insert(
  177|   112k|                    position + length, provider.getSymbol(tag.type), getFieldForType(tag.type), status);
  178|   112k|        } else {
  179|      0|            length += output.insertCodePoint(position + length, tag.codePoint, field, status);
  180|      0|        }
  181|   112k|    }
  182|   449k|    return length;
  183|   449k|}
_ZN6icu_786number4impl10AffixUtils18hasCurrencySymbolsERKNS_13UnicodeStringER10UErrorCode:
  219|   618k|bool AffixUtils::hasCurrencySymbols(const UnicodeString &affixPattern, UErrorCode &status) {
  220|   618k|    if (affixPattern.length() == 0) {
  ------------------
  |  Branch (220:9): [True: 618k, False: 0]
  ------------------
  221|   618k|        return false;
  222|   618k|    }
  223|      0|    AffixTag tag;
  224|      0|    while (hasNext(tag, affixPattern)) {
  ------------------
  |  Branch (224:12): [True: 0, False: 0]
  ------------------
  225|      0|        tag = nextToken(tag, affixPattern, status);
  226|      0|        if (U_FAILURE(status)) { return false; }
  ------------------
  |  Branch (226:13): [True: 0, False: 0]
  ------------------
  227|      0|        if (tag.type < 0 && getFieldForType(tag.type) == Field(UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD)) {
  ------------------
  |  Branch (227:13): [True: 0, False: 0]
  |  Branch (227:13): [True: 0, False: 0]
  |  Branch (227:29): [True: 0, False: 0]
  ------------------
  228|      0|            return true;
  229|      0|        }
  230|      0|    }
  231|      0|    return false;
  232|      0|}
_ZN6icu_786number4impl10AffixUtils9nextTokenENS1_8AffixTagERKNS_13UnicodeStringER10UErrorCode:
  281|   112k|AffixTag AffixUtils::nextToken(AffixTag tag, const UnicodeString &patternString, UErrorCode &status) {
  282|   112k|    int32_t offset = tag.offset;
  283|   112k|    int32_t state = tag.state;
  284|   112k|    for (; offset < patternString.length();) {
  ------------------
  |  Branch (284:12): [True: 112k, False: 0]
  ------------------
  285|   112k|        UChar32 cp = patternString.char32At(offset);
  286|   112k|        int32_t count = U16_LENGTH(cp);
  ------------------
  |  |  141|   112k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 112k, False: 0]
  |  |  ------------------
  ------------------
  287|       |
  288|   112k|        switch (state) {
  289|   112k|            case STATE_BASE:
  ------------------
  |  Branch (289:13): [True: 112k, False: 0]
  ------------------
  290|   112k|                switch (cp) {
  291|      0|                    case u'\'':
  ------------------
  |  Branch (291:21): [True: 0, False: 112k]
  ------------------
  292|      0|                        state = STATE_FIRST_QUOTE;
  293|      0|                        offset += count;
  294|       |                        // continue to the next code point
  295|      0|                        break;
  296|  56.1k|                    case u'-':
  ------------------
  |  Branch (296:21): [True: 56.1k, False: 56.1k]
  ------------------
  297|  56.1k|                        return makeTag(offset + count, TYPE_MINUS_SIGN, STATE_BASE, 0);
  298|  56.1k|                    case u'+':
  ------------------
  |  Branch (298:21): [True: 56.1k, False: 56.1k]
  ------------------
  299|  56.1k|                        return makeTag(offset + count, TYPE_PLUS_SIGN, STATE_BASE, 0);
  300|      0|                    case u'~':
  ------------------
  |  Branch (300:21): [True: 0, False: 112k]
  ------------------
  301|      0|                        return makeTag(offset + count, TYPE_APPROXIMATELY_SIGN, STATE_BASE, 0);
  302|      0|                    case u'%':
  ------------------
  |  Branch (302:21): [True: 0, False: 112k]
  ------------------
  303|      0|                        return makeTag(offset + count, TYPE_PERCENT, STATE_BASE, 0);
  304|      0|                    case u'‰':
  ------------------
  |  Branch (304:21): [True: 0, False: 112k]
  ------------------
  305|      0|                        return makeTag(offset + count, TYPE_PERMILLE, STATE_BASE, 0);
  306|      0|                    case u'¤':
  ------------------
  |  Branch (306:21): [True: 0, False: 112k]
  ------------------
  307|      0|                        state = STATE_FIRST_CURR;
  308|      0|                        offset += count;
  309|       |                        // continue to the next code point
  310|      0|                        break;
  311|      0|                    default:
  ------------------
  |  Branch (311:21): [True: 0, False: 112k]
  ------------------
  312|      0|                        return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
  313|   112k|                }
  314|      0|                break;
  315|      0|            case STATE_FIRST_QUOTE:
  ------------------
  |  Branch (315:13): [True: 0, False: 112k]
  ------------------
  316|      0|                if (cp == u'\'') {
  ------------------
  |  Branch (316:21): [True: 0, False: 0]
  ------------------
  317|      0|                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
  318|      0|                } else {
  319|      0|                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
  320|      0|                }
  321|      0|            case STATE_INSIDE_QUOTE:
  ------------------
  |  Branch (321:13): [True: 0, False: 112k]
  ------------------
  322|      0|                if (cp == u'\'') {
  ------------------
  |  Branch (322:21): [True: 0, False: 0]
  ------------------
  323|      0|                    state = STATE_AFTER_QUOTE;
  324|      0|                    offset += count;
  325|       |                    // continue to the next code point
  326|      0|                    break;
  327|      0|                } else {
  328|      0|                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
  329|      0|                }
  330|      0|            case STATE_AFTER_QUOTE:
  ------------------
  |  Branch (330:13): [True: 0, False: 112k]
  ------------------
  331|      0|                if (cp == u'\'') {
  ------------------
  |  Branch (331:21): [True: 0, False: 0]
  ------------------
  332|      0|                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
  333|      0|                } else {
  334|      0|                    state = STATE_BASE;
  335|       |                    // re-evaluate this code point
  336|      0|                    break;
  337|      0|                }
  338|      0|            case STATE_FIRST_CURR:
  ------------------
  |  Branch (338:13): [True: 0, False: 112k]
  ------------------
  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: 112k]
  ------------------
  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: 112k]
  ------------------
  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: 112k]
  ------------------
  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: 112k]
  ------------------
  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: 112k]
  ------------------
  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: 112k]
  ------------------
  392|      0|                UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  393|   112k|        }
  394|   112k|    }
  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|   561k|bool AffixUtils::hasNext(const AffixTag &tag, const UnicodeString &string) {
  426|       |    // First check for the {-1} and default initializer syntax.
  427|   561k|    if (tag.offset < 0) {
  ------------------
  |  Branch (427:9): [True: 0, False: 561k]
  ------------------
  428|      0|        return false;
  429|   561k|    } else if (tag.offset == 0) {
  ------------------
  |  Branch (429:16): [True: 449k, False: 112k]
  ------------------
  430|   449k|        return string.length() > 0;
  431|   449k|    }
  432|       |    // The rest of the fields are safe to use now.
  433|       |    // Special case: the last character in string is an end quote.
  434|   112k|    if (tag.state == STATE_INSIDE_QUOTE && tag.offset == string.length() - 1 &&
  ------------------
  |  Branch (434:9): [True: 0, False: 112k]
  |  Branch (434:44): [True: 0, False: 0]
  ------------------
  435|   112k|        string.charAt(tag.offset) == u'\'') {
  ------------------
  |  Branch (435:9): [True: 0, False: 0]
  ------------------
  436|      0|        return false;
  437|   112k|    } else if (tag.state != STATE_BASE) {
  ------------------
  |  Branch (437:16): [True: 0, False: 112k]
  ------------------
  438|      0|        return true;
  439|   112k|    } else {
  440|   112k|        return tag.offset < string.length();
  441|   112k|    }
  442|   112k|}

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

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

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

_ZN6icu_7813IFixedDecimalD2Ev:
   73|   154k|icu::IFixedDecimal::~IFixedDecimal() = default;
_ZN6icu_786number4impl15DecimalQuantityC2Ev:
   75|   154k|DecimalQuantity::DecimalQuantity() {
   76|   154k|    setBcdToZero();
   77|   154k|    flags = 0;
   78|   154k|}
_ZN6icu_786number4impl15DecimalQuantityD2Ev:
   80|   154k|DecimalQuantity::~DecimalQuantity() {
   81|   154k|    if (usingBytes) {
  ------------------
  |  Branch (81:9): [True: 0, False: 154k]
  ------------------
   82|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   83|      0|        fBCD.bcdBytes.ptr = nullptr;
   84|      0|        usingBytes = false;
   85|      0|    }
   86|   154k|}
_ZNK6icu_786number4impl15DecimalQuantity9isZeroishEv:
  379|  98.5k|bool DecimalQuantity::isZeroish() const {
  380|  98.5k|    return precision == 0;
  381|  98.5k|}
_ZN6icu_786number4impl15DecimalQuantity12setBcdToZeroEv:
 1179|   154k|void DecimalQuantity::setBcdToZero() {
 1180|   154k|    if (usingBytes) {
  ------------------
  |  Branch (1180:9): [True: 0, False: 154k]
  ------------------
 1181|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1182|      0|        fBCD.bcdBytes.ptr = nullptr;
 1183|      0|        usingBytes = false;
 1184|      0|    }
 1185|   154k|    fBCD.bcdLong = 0L;
 1186|   154k|    scale = 0;
 1187|   154k|    precision = 0;
 1188|   154k|    isApproximate = false;
 1189|   154k|    origDouble = 0;
 1190|   154k|    origDelta = 0;
 1191|   154k|    exponent = 0;
 1192|   154k|}

_ZN6icu_786number4impl23DecimalFormatPropertiesC2Ev:
   31|   119k|DecimalFormatProperties::DecimalFormatProperties() {
   32|   119k|    clear();
   33|   119k|}
_ZN6icu_786number4impl23DecimalFormatProperties5clearEv:
   35|   119k|void DecimalFormatProperties::clear() {
   36|   119k|    compactStyle.nullify();
   37|   119k|    currency.nullify();
   38|   119k|    currencyPluralInfo.fPtr.adoptInstead(nullptr);
   39|   119k|    currencyUsage.nullify();
   40|   119k|    decimalPatternMatchRequired = false;
   41|   119k|    decimalSeparatorAlwaysShown = false;
   42|   119k|    exponentSignAlwaysShown = false;
   43|   119k|    currencyAsDecimal = false;
   44|   119k|    formatFailIfMoreThanMaxDigits = false;
   45|   119k|    formatWidth = -1;
   46|   119k|    groupingSize = -1;
   47|   119k|    groupingUsed = true;
   48|   119k|    magnitudeMultiplier = 0;
   49|   119k|    maximumFractionDigits = -1;
   50|   119k|    maximumIntegerDigits = -1;
   51|   119k|    maximumSignificantDigits = -1;
   52|   119k|    minimumExponentDigits = -1;
   53|   119k|    minimumFractionDigits = -1;
   54|   119k|    minimumGroupingDigits = -1;
   55|   119k|    minimumIntegerDigits = -1;
   56|   119k|    minimumSignificantDigits = -1;
   57|   119k|    multiplier = 1;
   58|   119k|    multiplierScale = 0;
   59|   119k|    negativePrefix.setToBogus();
   60|   119k|    negativePrefixPattern.setToBogus();
   61|   119k|    negativeSuffix.setToBogus();
   62|   119k|    negativeSuffixPattern.setToBogus();
   63|   119k|    padPosition.nullify();
   64|   119k|    padString.setToBogus();
   65|   119k|    parseCaseSensitive = false;
   66|   119k|    parseIntegerOnly = false;
   67|   119k|    parseMode.nullify();
   68|   119k|    parseNoExponent = false;
   69|   119k|    parseToBigDecimal = false;
   70|   119k|    parseAllInput = UNUM_MAYBE;
   71|   119k|    positivePrefix.setToBogus();
   72|   119k|    positivePrefixPattern.setToBogus();
   73|   119k|    positiveSuffix.setToBogus();
   74|   119k|    positiveSuffixPattern.setToBogus();
   75|   119k|    roundingIncrement = 0.0;
   76|   119k|    roundingMode.nullify();
   77|   119k|    secondaryGroupingSize = -1;
   78|   119k|    signAlwaysShown = false;
   79|   119k|}
_ZNK6icu_786number4impl23DecimalFormatProperties7_equalsERKS2_b:
   82|   154k|DecimalFormatProperties::_equals(const DecimalFormatProperties& other, bool ignoreForFastFormat) const {
   83|   154k|    bool eq = true;
   84|       |
   85|       |    // Properties that must be equal both normally and for fast-path formatting
   86|   154k|    eq = eq && compactStyle == other.compactStyle;
  ------------------
  |  Branch (86:10): [True: 154k, False: 0]
  |  Branch (86:16): [True: 154k, False: 0]
  ------------------
   87|   154k|    eq = eq && currency == other.currency;
  ------------------
  |  Branch (87:10): [True: 154k, False: 0]
  |  Branch (87:16): [True: 154k, False: 0]
  ------------------
   88|   154k|    eq = eq && currencyPluralInfo.fPtr.getAlias() == other.currencyPluralInfo.fPtr.getAlias();
  ------------------
  |  Branch (88:10): [True: 154k, False: 0]
  |  Branch (88:16): [True: 154k, False: 0]
  ------------------
   89|   154k|    eq = eq && currencyUsage == other.currencyUsage;
  ------------------
  |  Branch (89:10): [True: 154k, False: 0]
  |  Branch (89:16): [True: 154k, False: 0]
  ------------------
   90|   154k|    eq = eq && decimalSeparatorAlwaysShown == other.decimalSeparatorAlwaysShown;
  ------------------
  |  Branch (90:10): [True: 154k, False: 0]
  |  Branch (90:16): [True: 154k, False: 0]
  ------------------
   91|   154k|    eq = eq && exponentSignAlwaysShown == other.exponentSignAlwaysShown;
  ------------------
  |  Branch (91:10): [True: 154k, False: 0]
  |  Branch (91:16): [True: 154k, False: 0]
  ------------------
   92|   154k|    eq = eq && currencyAsDecimal == other.currencyAsDecimal;
  ------------------
  |  Branch (92:10): [True: 154k, False: 0]
  |  Branch (92:16): [True: 154k, False: 0]
  ------------------
   93|   154k|    eq = eq && formatFailIfMoreThanMaxDigits == other.formatFailIfMoreThanMaxDigits;
  ------------------
  |  Branch (93:10): [True: 154k, False: 0]
  |  Branch (93:16): [True: 154k, False: 0]
  ------------------
   94|   154k|    eq = eq && formatWidth == other.formatWidth;
  ------------------
  |  Branch (94:10): [True: 154k, False: 0]
  |  Branch (94:16): [True: 154k, False: 0]
  ------------------
   95|   154k|    eq = eq && magnitudeMultiplier == other.magnitudeMultiplier;
  ------------------
  |  Branch (95:10): [True: 154k, False: 0]
  |  Branch (95:16): [True: 154k, False: 0]
  ------------------
   96|   154k|    eq = eq && maximumSignificantDigits == other.maximumSignificantDigits;
  ------------------
  |  Branch (96:10): [True: 154k, False: 0]
  |  Branch (96:16): [True: 154k, False: 0]
  ------------------
   97|   154k|    eq = eq && minimumExponentDigits == other.minimumExponentDigits;
  ------------------
  |  Branch (97:10): [True: 154k, False: 0]
  |  Branch (97:16): [True: 154k, False: 0]
  ------------------
   98|   154k|    eq = eq && minimumGroupingDigits == other.minimumGroupingDigits;
  ------------------
  |  Branch (98:10): [True: 154k, False: 0]
  |  Branch (98:16): [True: 154k, False: 0]
  ------------------
   99|   154k|    eq = eq && minimumSignificantDigits == other.minimumSignificantDigits;
  ------------------
  |  Branch (99:10): [True: 154k, False: 0]
  |  Branch (99:16): [True: 154k, False: 0]
  ------------------
  100|   154k|    eq = eq && multiplier == other.multiplier;
  ------------------
  |  Branch (100:10): [True: 154k, False: 0]
  |  Branch (100:16): [True: 154k, False: 0]
  ------------------
  101|   154k|    eq = eq && multiplierScale == other.multiplierScale;
  ------------------
  |  Branch (101:10): [True: 154k, False: 0]
  |  Branch (101:16): [True: 154k, False: 0]
  ------------------
  102|   154k|    eq = eq && negativePrefix == other.negativePrefix;
  ------------------
  |  Branch (102:10): [True: 154k, False: 0]
  |  Branch (102:16): [True: 154k, False: 0]
  ------------------
  103|   154k|    eq = eq && negativeSuffix == other.negativeSuffix;
  ------------------
  |  Branch (103:10): [True: 154k, False: 0]
  |  Branch (103:16): [True: 154k, False: 0]
  ------------------
  104|   154k|    eq = eq && padPosition == other.padPosition;
  ------------------
  |  Branch (104:10): [True: 154k, False: 0]
  |  Branch (104:16): [True: 154k, False: 0]
  ------------------
  105|   154k|    eq = eq && padString == other.padString;
  ------------------
  |  Branch (105:10): [True: 154k, False: 0]
  |  Branch (105:16): [True: 154k, False: 0]
  ------------------
  106|   154k|    eq = eq && positivePrefix == other.positivePrefix;
  ------------------
  |  Branch (106:10): [True: 154k, False: 0]
  |  Branch (106:16): [True: 154k, False: 0]
  ------------------
  107|   154k|    eq = eq && positiveSuffix == other.positiveSuffix;
  ------------------
  |  Branch (107:10): [True: 154k, False: 0]
  |  Branch (107:16): [True: 154k, False: 0]
  ------------------
  108|   154k|    eq = eq && roundingIncrement == other.roundingIncrement;
  ------------------
  |  Branch (108:10): [True: 154k, False: 0]
  |  Branch (108:16): [True: 154k, False: 0]
  ------------------
  109|   154k|    eq = eq && roundingMode == other.roundingMode;
  ------------------
  |  Branch (109:10): [True: 154k, False: 0]
  |  Branch (109:16): [True: 154k, False: 0]
  ------------------
  110|   154k|    eq = eq && secondaryGroupingSize == other.secondaryGroupingSize;
  ------------------
  |  Branch (110:10): [True: 154k, False: 0]
  |  Branch (110:16): [True: 154k, False: 0]
  ------------------
  111|   154k|    eq = eq && signAlwaysShown == other.signAlwaysShown;
  ------------------
  |  Branch (111:10): [True: 154k, False: 0]
  |  Branch (111:16): [True: 154k, False: 0]
  ------------------
  112|       |
  113|   154k|    if (ignoreForFastFormat) {
  ------------------
  |  Branch (113:9): [True: 154k, False: 0]
  ------------------
  114|   154k|        return eq;
  115|   154k|    }
  116|       |
  117|       |    // Properties ignored by fast-path formatting
  118|       |    // Formatting (special handling required):
  119|      0|    eq = eq && groupingSize == other.groupingSize;
  ------------------
  |  Branch (119:10): [True: 0, False: 0]
  |  Branch (119:16): [True: 0, False: 0]
  ------------------
  120|      0|    eq = eq && groupingUsed == other.groupingUsed;
  ------------------
  |  Branch (120:10): [True: 0, False: 0]
  |  Branch (120:16): [True: 0, False: 0]
  ------------------
  121|      0|    eq = eq && minimumFractionDigits == other.minimumFractionDigits;
  ------------------
  |  Branch (121:10): [True: 0, False: 0]
  |  Branch (121:16): [True: 0, False: 0]
  ------------------
  122|      0|    eq = eq && maximumFractionDigits == other.maximumFractionDigits;
  ------------------
  |  Branch (122:10): [True: 0, False: 0]
  |  Branch (122:16): [True: 0, False: 0]
  ------------------
  123|      0|    eq = eq && maximumIntegerDigits == other.maximumIntegerDigits;
  ------------------
  |  Branch (123:10): [True: 0, False: 0]
  |  Branch (123:16): [True: 0, False: 0]
  ------------------
  124|      0|    eq = eq && minimumIntegerDigits == other.minimumIntegerDigits;
  ------------------
  |  Branch (124:10): [True: 0, False: 0]
  |  Branch (124:16): [True: 0, False: 0]
  ------------------
  125|      0|    eq = eq && negativePrefixPattern == other.negativePrefixPattern;
  ------------------
  |  Branch (125:10): [True: 0, False: 0]
  |  Branch (125:16): [True: 0, False: 0]
  ------------------
  126|      0|    eq = eq && negativeSuffixPattern == other.negativeSuffixPattern;
  ------------------
  |  Branch (126:10): [True: 0, False: 0]
  |  Branch (126:16): [True: 0, False: 0]
  ------------------
  127|      0|    eq = eq && positivePrefixPattern == other.positivePrefixPattern;
  ------------------
  |  Branch (127:10): [True: 0, False: 0]
  |  Branch (127:16): [True: 0, False: 0]
  ------------------
  128|      0|    eq = eq && positiveSuffixPattern == other.positiveSuffixPattern;
  ------------------
  |  Branch (128:10): [True: 0, False: 0]
  |  Branch (128:16): [True: 0, False: 0]
  ------------------
  129|       |
  130|       |    // Parsing (always safe to ignore):
  131|      0|    eq = eq && decimalPatternMatchRequired == other.decimalPatternMatchRequired;
  ------------------
  |  Branch (131:10): [True: 0, False: 0]
  |  Branch (131:16): [True: 0, False: 0]
  ------------------
  132|      0|    eq = eq && parseCaseSensitive == other.parseCaseSensitive;
  ------------------
  |  Branch (132:10): [True: 0, False: 0]
  |  Branch (132:16): [True: 0, False: 0]
  ------------------
  133|      0|    eq = eq && parseIntegerOnly == other.parseIntegerOnly;
  ------------------
  |  Branch (133:10): [True: 0, False: 0]
  |  Branch (133:16): [True: 0, False: 0]
  ------------------
  134|      0|    eq = eq && parseMode == other.parseMode;
  ------------------
  |  Branch (134:10): [True: 0, False: 0]
  |  Branch (134:16): [True: 0, False: 0]
  ------------------
  135|      0|    eq = eq && parseNoExponent == other.parseNoExponent;
  ------------------
  |  Branch (135:10): [True: 0, False: 0]
  |  Branch (135:16): [True: 0, False: 0]
  ------------------
  136|      0|    eq = eq && parseToBigDecimal == other.parseToBigDecimal;
  ------------------
  |  Branch (136:10): [True: 0, False: 0]
  |  Branch (136:16): [True: 0, False: 0]
  ------------------
  137|      0|    eq = eq && parseAllInput == other.parseAllInput;
  ------------------
  |  Branch (137:10): [True: 0, False: 0]
  |  Branch (137:16): [True: 0, False: 0]
  ------------------
  138|       |
  139|      0|    return eq;
  140|   154k|}
_ZNK6icu_786number4impl23DecimalFormatProperties29equalsDefaultExceptFastFormatEv:
  142|   154k|bool DecimalFormatProperties::equalsDefaultExceptFastFormat() const {
  143|   154k|    UErrorCode localStatus = U_ZERO_ERROR;
  144|   154k|    umtx_initOnce(gDefaultPropertiesInitOnce, &initDefaultProperties, localStatus);
  145|   154k|    return _equals(*reinterpret_cast<DecimalFormatProperties*>(kRawDefaultProperties), true);
  146|   154k|}
number_decimfmtprops.cpp:_ZN12_GLOBAL__N_121initDefaultPropertiesER10UErrorCode:
   23|      1|void U_CALLCONV initDefaultProperties(UErrorCode&) {
   24|       |    // can't fail, uses placement new into statically allocated space.
   25|      1|    new(kRawDefaultProperties) DecimalFormatProperties(); // set to the default instance
   26|      1|}

_ZN6icu_786number4impl25CurrencyPluralInfoWrapperC2ERKS2_:
   39|  77.3k|    CurrencyPluralInfoWrapper(const CurrencyPluralInfoWrapper& other) {
   40|  77.3k|        if (!other.fPtr.isNull()) {
  ------------------
  |  Branch (40:13): [True: 0, False: 77.3k]
  ------------------
   41|      0|            fPtr.adoptInstead(new CurrencyPluralInfo(*other.fPtr));
   42|      0|        }
   43|  77.3k|    }
_ZN6icu_786number4impl25CurrencyPluralInfoWrapperC2Ev:
   37|   119k|    CurrencyPluralInfoWrapper() = default;

_ZNO6icu_786number23NumberFormatterSettingsINS0_26UnlocalizedNumberFormatterEE6macrosEONS0_4impl10MacroPropsE:
  383|   154k|Derived NumberFormatterSettings<Derived>::macros(impl::MacroProps&& macros)&& {
  384|   154k|    Derived move(std::move(*this));
  385|   154k|    move.fMacros = std::move(macros);
  386|   154k|    return move;
  387|   154k|}
_ZN6icu_786number15NumberFormatter4withEv:
  409|   154k|UnlocalizedNumberFormatter NumberFormatter::with() {
  410|   154k|    UnlocalizedNumberFormatter result;
  411|   154k|    return result;
  412|   154k|}
_ZN6icu_786number26UnlocalizedNumberFormatterC2EONS0_23NumberFormatterSettingsIS1_EE:
  446|   154k|        : NFS<UNF>(std::move(src)) {
  447|       |    // No additional fields to assign
  448|   154k|}
_ZN6icu_786number24LocalizedNumberFormatteraSEOS1_:
  488|   154k|LocalizedNumberFormatter& LocalizedNumberFormatter::operator=(LNF&& src) noexcept {
  489|   154k|    NFS<LNF>::operator=(static_cast<NFS<LNF>&&>(src));
  490|   154k|    lnfMoveHelper(std::move(src));
  491|   154k|    return *this;
  492|   154k|}
_ZN6icu_786number24LocalizedNumberFormatter13resetCompiledEv:
  494|   154k|void LocalizedNumberFormatter::resetCompiled() {
  495|   154k|    auto* callCount = reinterpret_cast<u_atomic_int32_t*>(fUnsafeCallCount);
  496|   154k|    umtx_storeRelease(*callCount, 0);
  497|   154k|    fCompiled = nullptr;
  498|   154k|}
_ZN6icu_786number24LocalizedNumberFormatter13lnfMoveHelperEOS1_:
  500|   154k|void LocalizedNumberFormatter::lnfMoveHelper(LNF&& src) {
  501|       |    // Copy over the compiled formatter and set call count to INT32_MIN as in computeCompiled().
  502|       |    // Don't copy the call count directly because doing so requires a loadAcquire/storeRelease.
  503|       |    // The bits themselves appear to be platform-dependent, so copying them might not be safe.
  504|   154k|    delete fCompiled;
  505|   154k|    if (src.fCompiled != nullptr) {
  ------------------
  |  Branch (505:9): [True: 0, False: 154k]
  ------------------
  506|      0|        auto* callCount = reinterpret_cast<u_atomic_int32_t*>(fUnsafeCallCount);
  507|      0|        umtx_storeRelease(*callCount, INT32_MIN);
  508|      0|        fCompiled = src.fCompiled;
  509|       |        // Reset the source object to leave it in a safe state.
  510|      0|        src.resetCompiled();
  511|   154k|    } else {
  512|   154k|        resetCompiled();
  513|   154k|    }
  514|       |
  515|       |    // Unconditionally move the warehouse
  516|   154k|    delete fWarehouse;
  517|   154k|    fWarehouse = src.fWarehouse;
  518|   154k|    src.fWarehouse = nullptr;
  519|   154k|}
_ZN6icu_786number24LocalizedNumberFormatterD2Ev:
  551|   253k|LocalizedNumberFormatter::~LocalizedNumberFormatter() {
  552|   253k|    delete fCompiled;
  553|   253k|    delete fWarehouse;
  554|   253k|}
_ZN6icu_786number24LocalizedNumberFormatterC2EONS0_4impl10MacroPropsERKNS_6LocaleE:
  561|   154k|LocalizedNumberFormatter::LocalizedNumberFormatter(MacroProps&& macros, const Locale& locale) {
  562|   154k|    fMacros = std::move(macros);
  563|   154k|    fMacros.locale = locale;
  564|   154k|}
_ZNO6icu_786number26UnlocalizedNumberFormatter6localeERKNS_6LocaleE:
  570|   154k|LocalizedNumberFormatter UnlocalizedNumberFormatter::locale(const Locale& locale)&& {
  571|   154k|    return LocalizedNumberFormatter(std::move(fMacros), locale);
  572|   154k|}
_ZNK6icu_786number24LocalizedNumberFormatter23getDecimalFormatSymbolsEv:
  749|   344k|const DecimalFormatSymbols* LocalizedNumberFormatter::getDecimalFormatSymbols() const {
  750|   344k|    return fMacros.symbols.getDecimalFormatSymbols();
  751|   344k|}

_ZN6icu_786number4impl7Grouper11forStrategyE23UNumberGroupingStrategy:
   37|   189k|Grouper Grouper::forStrategy(UNumberGroupingStrategy grouping) {
   38|   189k|    switch (grouping) {
   39|   189k|    case UNUM_GROUPING_OFF:
  ------------------
  |  Branch (39:5): [True: 189k, False: 0]
  ------------------
   40|   189k|        return {-1, -1, -2, grouping};
   41|      0|    case UNUM_GROUPING_AUTO:
  ------------------
  |  Branch (41:5): [True: 0, False: 189k]
  ------------------
   42|      0|        return {-2, -2, -2, grouping};
   43|      0|    case UNUM_GROUPING_MIN2:
  ------------------
  |  Branch (43:5): [True: 0, False: 189k]
  ------------------
   44|      0|        return {-2, -2, -3, grouping};
   45|      0|    case UNUM_GROUPING_ON_ALIGNED:
  ------------------
  |  Branch (45:5): [True: 0, False: 189k]
  ------------------
   46|      0|        return {-4, -4, 1, grouping};
   47|      0|    case UNUM_GROUPING_THOUSANDS:
  ------------------
  |  Branch (47:5): [True: 0, False: 189k]
  ------------------
   48|      0|        return {3, 3, 1, grouping};
   49|      0|    default:
  ------------------
  |  Branch (49:5): [True: 0, False: 189k]
  ------------------
   50|      0|        UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
   51|   189k|    }
   52|   189k|}
_ZN6icu_786number4impl7Grouper13forPropertiesERKNS1_23DecimalFormatPropertiesE:
   54|   154k|Grouper Grouper::forProperties(const DecimalFormatProperties& properties) {
   55|   154k|    if (!properties.groupingUsed) {
  ------------------
  |  Branch (55:9): [True: 133k, False: 21.2k]
  ------------------
   56|   133k|        return forStrategy(UNUM_GROUPING_OFF);
   57|   133k|    }
   58|  21.2k|    auto grouping1 = static_cast<int16_t>(properties.groupingSize);
   59|  21.2k|    auto grouping2 = static_cast<int16_t>(properties.secondaryGroupingSize);
   60|  21.2k|    auto minGrouping = static_cast<int16_t>(properties.minimumGroupingDigits);
   61|  21.2k|    grouping1 = grouping1 > 0 ? grouping1 : grouping2 > 0 ? grouping2 : grouping1;
  ------------------
  |  Branch (61:17): [True: 21.2k, False: 0]
  |  Branch (61:45): [True: 0, False: 0]
  ------------------
   62|  21.2k|    grouping2 = grouping2 > 0 ? grouping2 : grouping1;
  ------------------
  |  Branch (62:17): [True: 0, False: 21.2k]
  ------------------
   63|  21.2k|    return {grouping1, grouping2, minGrouping, UNUM_GROUPING_COUNT};
   64|   154k|}
_ZN6icu_786number4impl7Grouper13setLocaleDataERKNS1_17ParsedPatternInfoERKNS_6LocaleE:
   66|  56.1k|void Grouper::setLocaleData(const impl::ParsedPatternInfo &patternInfo, const Locale& locale) {
   67|  56.1k|    if (fMinGrouping == -2) {
  ------------------
  |  Branch (67:9): [True: 56.1k, False: 0]
  ------------------
   68|  56.1k|        fMinGrouping = getMinGroupingForLocale(locale);
   69|  56.1k|    } else if (fMinGrouping == -3) {
  ------------------
  |  Branch (69:16): [True: 0, False: 0]
  ------------------
   70|      0|        fMinGrouping = static_cast<int16_t>(uprv_max(2, getMinGroupingForLocale(locale)));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   71|      0|    } else {
   72|       |        // leave fMinGrouping alone
   73|      0|    }
   74|  56.1k|    if (fGrouping1 != -2 && fGrouping2 != -4) {
  ------------------
  |  Branch (74:9): [True: 56.1k, False: 0]
  |  Branch (74:29): [True: 56.1k, False: 0]
  ------------------
   75|  56.1k|        return;
   76|  56.1k|    }
   77|      0|    auto grouping1 = static_cast<int16_t> (patternInfo.positive.groupingSizes & 0xffff);
   78|      0|    auto grouping2 = static_cast<int16_t> ((patternInfo.positive.groupingSizes >> 16) & 0xffff);
   79|      0|    auto grouping3 = static_cast<int16_t> ((patternInfo.positive.groupingSizes >> 32) & 0xffff);
   80|      0|    if (grouping2 == -1) {
  ------------------
  |  Branch (80:9): [True: 0, False: 0]
  ------------------
   81|      0|        grouping1 = fGrouping1 == -4 ? static_cast<short>(3) : static_cast<short>(-1);
  ------------------
  |  Branch (81:21): [True: 0, False: 0]
  ------------------
   82|      0|    }
   83|      0|    if (grouping3 == -1) {
  ------------------
  |  Branch (83:9): [True: 0, False: 0]
  ------------------
   84|      0|        grouping2 = grouping1;
   85|      0|    }
   86|      0|    fGrouping1 = grouping1;
   87|      0|    fGrouping2 = grouping2;
   88|      0|}
number_grouping.cpp:_ZN12_GLOBAL__N_123getMinGroupingForLocaleERKN6icu_786LocaleE:
   18|  56.1k|int16_t getMinGroupingForLocale(const Locale& locale) {
   19|       |    // TODO: Cache this?
   20|  56.1k|    UErrorCode localStatus = U_ZERO_ERROR;
   21|  56.1k|    LocalUResourceBundlePointer bundle(ures_open(nullptr, locale.getName(), &localStatus));
  ------------------
  |  | 1691|  56.1k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  56.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  56.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  56.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   22|  56.1k|    int32_t resultLen = 0;
   23|  56.1k|    const char16_t* result = ures_getStringByKeyWithFallback(
  ------------------
  |  | 1678|  56.1k|#define ures_getStringByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getStringByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  56.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  56.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  56.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   24|  56.1k|        bundle.getAlias(),
   25|  56.1k|        "NumberElements/minimumGroupingDigits",
   26|  56.1k|        &resultLen,
   27|  56.1k|        &localStatus);
   28|       |    // TODO: Is it safe to assume resultLen == 1? Would locales set minGrouping >= 10?
   29|  56.1k|    if (U_FAILURE(localStatus) || resultLen != 1) {
  ------------------
  |  Branch (29:9): [True: 0, False: 56.1k]
  |  Branch (29:35): [True: 0, False: 56.1k]
  ------------------
   30|      0|        return 1;
   31|      0|    }
   32|  56.1k|    return result[0] - u'0';
   33|  56.1k|}

_ZN6icu_786number12IntegerWidthC2Essb:
   16|   154k|IntegerWidth::IntegerWidth(digits_t minInt, digits_t maxInt, bool formatFailIfMoreThanMaxDigits) {
   17|   154k|    fUnion.minMaxInt.fMinInt = minInt;
   18|   154k|    fUnion.minMaxInt.fMaxInt = maxInt;
   19|   154k|    fUnion.minMaxInt.fFormatFailIfMoreThanMaxDigits = formatFailIfMoreThanMaxDigits;
   20|   154k|}

_ZN6icu_786number4impl20NumberPropertyMapper6createERKNS1_23DecimalFormatPropertiesERKNS_20DecimalFormatSymbolsERNS1_22DecimalFormatWarehouseERS3_R10UErrorCode:
   33|   154k|                                                        UErrorCode& status) {
   34|   154k|    return NumberFormatter::with().macros(
   35|   154k|            oldToNew(
   36|   154k|                    properties, symbols, warehouse, &exportedProperties, status));
   37|   154k|}
_ZN6icu_786number4impl20NumberPropertyMapper8oldToNewERKNS1_23DecimalFormatPropertiesERKNS_20DecimalFormatSymbolsERNS1_22DecimalFormatWarehouseEPS3_R10UErrorCode:
   43|   154k|                                          UErrorCode& status) {
   44|   154k|    MacroProps macros;
   45|   154k|    Locale locale = symbols.getLocale();
   46|       |
   47|       |    /////////////
   48|       |    // SYMBOLS //
   49|       |    /////////////
   50|       |
   51|   154k|    macros.symbols.setTo(symbols);
   52|       |
   53|       |    //////////////////
   54|       |    // PLURAL RULES //
   55|       |    //////////////////
   56|       |
   57|   154k|    if (!properties.currencyPluralInfo.fPtr.isNull()) {
  ------------------
  |  Branch (57:9): [True: 0, False: 154k]
  ------------------
   58|      0|        macros.rules = properties.currencyPluralInfo.fPtr->getPluralRules();
   59|      0|    }
   60|       |
   61|       |    /////////////
   62|       |    // AFFIXES //
   63|       |    /////////////
   64|       |
   65|   154k|    warehouse.affixProvider.setTo(properties, status);
   66|   154k|    macros.affixProvider = &warehouse.affixProvider.get();
   67|       |
   68|       |    ///////////
   69|       |    // UNITS //
   70|       |    ///////////
   71|       |
   72|   154k|    bool useCurrency = (
   73|   154k|            !properties.currency.isNull() ||
  ------------------
  |  Branch (73:13): [True: 0, False: 154k]
  ------------------
   74|   154k|            !properties.currencyPluralInfo.fPtr.isNull() ||
  ------------------
  |  Branch (74:13): [True: 0, False: 154k]
  ------------------
   75|   154k|            !properties.currencyUsage.isNull() ||
  ------------------
  |  Branch (75:13): [True: 0, False: 154k]
  ------------------
   76|   154k|            warehouse.affixProvider.get().hasCurrencySign());
  ------------------
  |  Branch (76:13): [True: 0, False: 154k]
  ------------------
   77|   154k|    CurrencyUnit currency;
   78|   154k|    UCurrencyUsage currencyUsage;
   79|   154k|    if (useCurrency) {
  ------------------
  |  Branch (79:9): [True: 0, False: 154k]
  ------------------
   80|      0|        currency = resolveCurrency(properties, locale, status);
   81|      0|        currencyUsage = properties.currencyUsage.getOrDefault(UCURR_USAGE_STANDARD);
   82|       |        // NOTE: Slicing is OK.
   83|      0|        macros.unit = currency; // NOLINT
   84|      0|    }
   85|       |
   86|       |    ///////////////////////
   87|       |    // ROUNDING STRATEGY //
   88|       |    ///////////////////////
   89|       |
   90|   154k|    int32_t maxInt = properties.maximumIntegerDigits;
   91|   154k|    int32_t minInt = properties.minimumIntegerDigits;
   92|   154k|    int32_t maxFrac = properties.maximumFractionDigits;
   93|   154k|    int32_t minFrac = properties.minimumFractionDigits;
   94|   154k|    int32_t minSig = properties.minimumSignificantDigits;
   95|   154k|    int32_t maxSig = properties.maximumSignificantDigits;
   96|   154k|    double roundingIncrement = properties.roundingIncrement;
   97|       |    // Not assigning directly to macros.roundingMode here: we change
   98|       |    // roundingMode if and when we also change macros.precision.
   99|   154k|    RoundingMode roundingMode = properties.roundingMode.getOrDefault(UNUM_ROUND_HALFEVEN);
  100|   154k|    bool explicitMinMaxFrac = minFrac != -1 || maxFrac != -1;
  ------------------
  |  Branch (100:31): [True: 154k, False: 0]
  |  Branch (100:48): [True: 0, False: 0]
  ------------------
  101|   154k|    bool explicitMinMaxSig = minSig != -1 || maxSig != -1;
  ------------------
  |  Branch (101:30): [True: 0, False: 154k]
  |  Branch (101:46): [True: 0, False: 154k]
  ------------------
  102|       |    // Resolve min/max frac for currencies, required for the validation logic and for when minFrac or
  103|       |    // maxFrac was
  104|       |    // set (but not both) on a currency instance.
  105|       |    // NOTE: Increments are handled in "Precision.constructCurrency()".
  106|   154k|    if (useCurrency && (minFrac == -1 || maxFrac == -1)) {
  ------------------
  |  Branch (106:9): [True: 0, False: 154k]
  |  Branch (106:25): [True: 0, False: 0]
  |  Branch (106:42): [True: 0, False: 0]
  ------------------
  107|      0|        int32_t digits = ucurr_getDefaultFractionDigitsForUsage(
  ------------------
  |  |  835|      0|#define ucurr_getDefaultFractionDigitsForUsage U_ICU_ENTRY_POINT_RENAME(ucurr_getDefaultFractionDigitsForUsage)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  108|      0|                currency.getISOCurrency(), currencyUsage, &status);
  109|      0|        if (minFrac == -1 && maxFrac == -1) {
  ------------------
  |  Branch (109:13): [True: 0, False: 0]
  |  Branch (109:30): [True: 0, False: 0]
  ------------------
  110|      0|            minFrac = digits;
  111|      0|            maxFrac = digits;
  112|      0|        } else if (minFrac == -1) {
  ------------------
  |  Branch (112:20): [True: 0, False: 0]
  ------------------
  113|      0|            minFrac = std::min(maxFrac, digits);
  114|      0|        } else /* if (maxFrac == -1) */ {
  115|      0|            maxFrac = std::max(minFrac, digits);
  116|      0|        }
  117|      0|    }
  118|       |    // Validate min/max int/frac.
  119|       |    // For backwards compatibility, minimum overrides maximum if the two conflict.
  120|   154k|    if (minInt == 0 && maxFrac != 0) {
  ------------------
  |  Branch (120:9): [True: 0, False: 154k]
  |  Branch (120:24): [True: 0, False: 0]
  ------------------
  121|      0|        minFrac = (minFrac < 0 || (minFrac == 0 && maxInt == 0)) ? 1 : minFrac;
  ------------------
  |  Branch (121:20): [True: 0, False: 0]
  |  Branch (121:36): [True: 0, False: 0]
  |  Branch (121:52): [True: 0, False: 0]
  ------------------
  122|      0|        maxFrac = maxFrac < 0 ? -1 : maxFrac < minFrac ? minFrac : maxFrac;
  ------------------
  |  Branch (122:19): [True: 0, False: 0]
  |  Branch (122:38): [True: 0, False: 0]
  ------------------
  123|      0|        minInt = 0;
  124|      0|        maxInt = maxInt < 0 ? -1 : maxInt > kMaxIntFracSig ? -1 : maxInt;
  ------------------
  |  Branch (124:18): [True: 0, False: 0]
  |  Branch (124:36): [True: 0, False: 0]
  ------------------
  125|   154k|    } else {
  126|       |        // Force a digit before the decimal point.
  127|   154k|        minFrac = minFrac < 0 ? 0 : minFrac;
  ------------------
  |  Branch (127:19): [True: 0, False: 154k]
  ------------------
  128|   154k|        maxFrac = maxFrac < 0 ? -1 : maxFrac < minFrac ? minFrac : maxFrac;
  ------------------
  |  Branch (128:19): [True: 0, False: 154k]
  |  Branch (128:38): [True: 0, False: 154k]
  ------------------
  129|   154k|        minInt = minInt <= 0 ? 1 : minInt > kMaxIntFracSig ? 1 : minInt;
  ------------------
  |  Branch (129:18): [True: 0, False: 154k]
  |  Branch (129:36): [True: 0, False: 154k]
  ------------------
  130|   154k|        maxInt = maxInt < 0 ? -1 : maxInt < minInt ? minInt : maxInt > kMaxIntFracSig ? -1 : maxInt;
  ------------------
  |  Branch (130:18): [True: 154k, False: 0]
  |  Branch (130:36): [True: 0, False: 0]
  |  Branch (130:63): [True: 0, False: 0]
  ------------------
  131|   154k|    }
  132|   154k|    Precision precision;
  133|   154k|    if (!properties.currencyUsage.isNull()) {
  ------------------
  |  Branch (133:9): [True: 0, False: 154k]
  ------------------
  134|      0|        U_ASSERT(useCurrency);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  135|      0|        precision = Precision::constructCurrency(currencyUsage).withCurrency(currency);
  136|   154k|    } else if (roundingIncrement != 0.0) {
  ------------------
  |  Branch (136:16): [True: 0, False: 154k]
  ------------------
  137|      0|        if (PatternStringUtils::ignoreRoundingIncrement(roundingIncrement, maxFrac)) {
  ------------------
  |  Branch (137:13): [True: 0, False: 0]
  ------------------
  138|      0|            precision = Precision::constructFraction(minFrac, maxFrac);
  139|      0|        } else {
  140|       |            // Convert the double increment to an integer increment
  141|      0|            precision = Precision::increment(roundingIncrement).withMinFraction(minFrac);
  142|      0|        }
  143|   154k|    } else if (explicitMinMaxSig) {
  ------------------
  |  Branch (143:16): [True: 0, False: 154k]
  ------------------
  144|      0|        minSig = minSig < 1 ? 1 : minSig > kMaxIntFracSig ? kMaxIntFracSig : minSig;
  ------------------
  |  Branch (144:18): [True: 0, False: 0]
  |  Branch (144:35): [True: 0, False: 0]
  ------------------
  145|      0|        maxSig = maxSig < 0 ? kMaxIntFracSig : maxSig < minSig ? minSig : maxSig > kMaxIntFracSig
  ------------------
  |  Branch (145:18): [True: 0, False: 0]
  |  Branch (145:48): [True: 0, False: 0]
  |  Branch (145:75): [True: 0, False: 0]
  ------------------
  146|      0|                                                                          ? kMaxIntFracSig : maxSig;
  147|      0|        precision = Precision::constructSignificant(minSig, maxSig);
  148|   154k|    } else if (explicitMinMaxFrac) {
  ------------------
  |  Branch (148:16): [True: 154k, False: 0]
  ------------------
  149|   154k|        precision = Precision::constructFraction(minFrac, maxFrac);
  150|   154k|    } else if (useCurrency) {
  ------------------
  |  Branch (150:16): [True: 0, False: 0]
  ------------------
  151|      0|        precision = Precision::constructCurrency(currencyUsage);
  152|      0|    }
  153|   154k|    if (!precision.isBogus()) {
  ------------------
  |  Branch (153:9): [True: 154k, False: 0]
  ------------------
  154|   154k|        macros.roundingMode = roundingMode;
  155|   154k|        macros.precision = precision;
  156|   154k|    }
  157|       |
  158|       |    ///////////////////
  159|       |    // INTEGER WIDTH //
  160|       |    ///////////////////
  161|       |
  162|   154k|    macros.integerWidth = IntegerWidth(
  163|   154k|            static_cast<digits_t>(minInt),
  164|   154k|            static_cast<digits_t>(maxInt),
  165|   154k|            properties.formatFailIfMoreThanMaxDigits);
  166|       |
  167|       |    ///////////////////////
  168|       |    // GROUPING STRATEGY //
  169|       |    ///////////////////////
  170|       |
  171|   154k|    macros.grouper = Grouper::forProperties(properties);
  172|       |
  173|       |    /////////////
  174|       |    // PADDING //
  175|       |    /////////////
  176|       |
  177|   154k|    if (properties.formatWidth > 0) {
  ------------------
  |  Branch (177:9): [True: 0, False: 154k]
  ------------------
  178|      0|        macros.padder = Padder::forProperties(properties);
  179|      0|    }
  180|       |
  181|       |    ///////////////////////////////
  182|       |    // DECIMAL MARK ALWAYS SHOWN //
  183|       |    ///////////////////////////////
  184|       |
  185|   154k|    macros.decimal = properties.decimalSeparatorAlwaysShown ? UNUM_DECIMAL_SEPARATOR_ALWAYS
  ------------------
  |  Branch (185:22): [True: 0, False: 154k]
  ------------------
  186|   154k|                                                            : UNUM_DECIMAL_SEPARATOR_AUTO;
  187|       |
  188|       |    ///////////////////////
  189|       |    // SIGN ALWAYS SHOWN //
  190|       |    ///////////////////////
  191|       |
  192|   154k|    macros.sign = properties.signAlwaysShown ? UNUM_SIGN_ALWAYS : UNUM_SIGN_AUTO;
  ------------------
  |  Branch (192:19): [True: 0, False: 154k]
  ------------------
  193|       |
  194|       |    /////////////////////////
  195|       |    // SCIENTIFIC NOTATION //
  196|       |    /////////////////////////
  197|       |
  198|   154k|    if (properties.minimumExponentDigits != -1) {
  ------------------
  |  Branch (198:9): [True: 0, False: 154k]
  ------------------
  199|       |        // Scientific notation is required.
  200|       |        // This whole section feels like a hack, but it is needed for regression tests.
  201|       |        // The mapping from property bag to scientific notation is nontrivial due to LDML rules.
  202|      0|        if (maxInt > 8) {
  ------------------
  |  Branch (202:13): [True: 0, False: 0]
  ------------------
  203|       |            // But #13110: The maximum of 8 digits has unknown origins and is not in the spec.
  204|       |            // If maxInt is greater than 8, it is set to minInt, even if minInt is greater than 8.
  205|      0|            maxInt = minInt;
  206|      0|            macros.integerWidth = IntegerWidth::zeroFillTo(minInt).truncateAt(maxInt);
  207|      0|        } else if (maxInt > minInt && minInt > 1) {
  ------------------
  |  Branch (207:20): [True: 0, False: 0]
  |  Branch (207:39): [True: 0, False: 0]
  ------------------
  208|       |            // Bug #13289: if maxInt > minInt > 1, then minInt should be 1.
  209|      0|            minInt = 1;
  210|      0|            macros.integerWidth = IntegerWidth::zeroFillTo(minInt).truncateAt(maxInt);
  211|      0|        }
  212|      0|        int engineering = maxInt < 0 ? -1 : maxInt;
  ------------------
  |  Branch (212:27): [True: 0, False: 0]
  ------------------
  213|      0|        macros.notation = ScientificNotation(
  214|       |                // Engineering interval:
  215|      0|                static_cast<int8_t>(engineering),
  216|       |                // Enforce minimum integer digits (for patterns like "000.00E0"):
  217|      0|                (engineering == minInt),
  218|       |                // Minimum exponent digits:
  219|      0|                static_cast<digits_t>(properties.minimumExponentDigits),
  220|       |                // Exponent sign always shown:
  221|      0|                properties.exponentSignAlwaysShown ? UNUM_SIGN_ALWAYS : UNUM_SIGN_AUTO);
  ------------------
  |  Branch (221:17): [True: 0, False: 0]
  ------------------
  222|       |        // Scientific notation also involves overriding the rounding mode.
  223|       |        // TODO: Overriding here is a bit of a hack. Should this logic go earlier?
  224|      0|        if (macros.precision.fType == Precision::PrecisionType::RND_FRACTION) {
  ------------------
  |  Branch (224:13): [True: 0, False: 0]
  ------------------
  225|       |            // For the purposes of rounding, get the original min/max int/frac, since the local
  226|       |            // variables have been manipulated for display purposes.
  227|      0|            int maxInt_ = properties.maximumIntegerDigits;
  228|      0|            int minInt_ = properties.minimumIntegerDigits;
  229|      0|            int minFrac_ = properties.minimumFractionDigits;
  230|      0|            int maxFrac_ = properties.maximumFractionDigits;
  231|      0|            if (minInt_ == 0 && maxFrac_ == 0) {
  ------------------
  |  Branch (231:17): [True: 0, False: 0]
  |  Branch (231:33): [True: 0, False: 0]
  ------------------
  232|       |                // Patterns like "#E0" and "##E0", which mean no rounding!
  233|      0|                macros.precision = Precision::unlimited();
  234|      0|            } else if (minInt_ == 0 && minFrac_ == 0) {
  ------------------
  |  Branch (234:24): [True: 0, False: 0]
  |  Branch (234:40): [True: 0, False: 0]
  ------------------
  235|       |                // Patterns like "#.##E0" (no zeros in the mantissa), which mean round to maxFrac+1
  236|      0|                macros.precision = Precision::constructSignificant(1, maxFrac_ + 1);
  237|      0|            } else {
  238|      0|                int maxSig_ = minInt_ + maxFrac_;
  239|       |                // Bug #20058: if maxInt_ > minInt_ > 1, then minInt_ should be 1.
  240|      0|                if (maxInt_ > minInt_ && minInt_ > 1) {
  ------------------
  |  Branch (240:21): [True: 0, False: 0]
  |  Branch (240:42): [True: 0, False: 0]
  ------------------
  241|      0|                    minInt_ = 1;
  242|      0|                }
  243|      0|                int minSig_ = minInt_ + minFrac_;
  244|       |                // To avoid regression, maxSig is not reset when minInt_ set to 1.
  245|       |                // TODO: Reset maxSig_ = 1 + minFrac_ to follow the spec.
  246|      0|                macros.precision = Precision::constructSignificant(minSig_, maxSig_);
  247|      0|            }
  248|      0|            macros.roundingMode = roundingMode;
  249|      0|        }
  250|      0|    }
  251|       |
  252|       |    //////////////////////
  253|       |    // COMPACT NOTATION //
  254|       |    //////////////////////
  255|       |
  256|   154k|    if (!properties.compactStyle.isNull()) {
  ------------------
  |  Branch (256:9): [True: 0, False: 154k]
  ------------------
  257|      0|        if (properties.compactStyle.getNoError() == UNumberCompactStyle::UNUM_LONG) {
  ------------------
  |  Branch (257:13): [True: 0, False: 0]
  ------------------
  258|      0|            macros.notation = Notation::compactLong();
  259|      0|        } else {
  260|      0|            macros.notation = Notation::compactShort();
  261|      0|        }
  262|      0|    }
  263|       |
  264|       |    /////////////////
  265|       |    // MULTIPLIERS //
  266|       |    /////////////////
  267|       |
  268|   154k|    macros.scale = scaleFromProperties(properties);
  269|       |
  270|       |    //////////////////////
  271|       |    // PROPERTY EXPORTS //
  272|       |    //////////////////////
  273|       |
  274|   154k|    if (exportedProperties != nullptr) {
  ------------------
  |  Branch (274:9): [True: 154k, False: 0]
  ------------------
  275|       |
  276|   154k|        exportedProperties->currency = currency;
  277|   154k|        exportedProperties->roundingMode = roundingMode;
  278|   154k|        exportedProperties->minimumIntegerDigits = minInt;
  279|   154k|        exportedProperties->maximumIntegerDigits = maxInt == -1 ? INT32_MAX : maxInt;
  ------------------
  |  Branch (279:52): [True: 154k, False: 0]
  ------------------
  280|       |
  281|   154k|        Precision rounding_;
  282|   154k|        if (useCurrency && precision.fType == Precision::PrecisionType::RND_CURRENCY) {
  ------------------
  |  Branch (282:13): [True: 0, False: 154k]
  |  Branch (282:28): [True: 0, False: 0]
  ------------------
  283|      0|            rounding_ = precision.withCurrency(currency, status);
  284|   154k|        } else {
  285|   154k|            rounding_ = precision;
  286|   154k|        }
  287|   154k|        int minFrac_ = minFrac;
  288|   154k|        int maxFrac_ = maxFrac;
  289|   154k|        int minSig_ = minSig;
  290|   154k|        int maxSig_ = maxSig;
  291|   154k|        double increment_ = 0.0;
  292|   154k|        if (rounding_.fType == Precision::PrecisionType::RND_FRACTION) {
  ------------------
  |  Branch (292:13): [True: 154k, False: 0]
  ------------------
  293|   154k|            minFrac_ = rounding_.fUnion.fracSig.fMinFrac;
  294|   154k|            maxFrac_ = rounding_.fUnion.fracSig.fMaxFrac;
  295|   154k|        } else if (rounding_.fType == Precision::PrecisionType::RND_INCREMENT
  ------------------
  |  Branch (295:20): [True: 0, False: 0]
  ------------------
  296|      0|                || rounding_.fType == Precision::PrecisionType::RND_INCREMENT_ONE
  ------------------
  |  Branch (296:20): [True: 0, False: 0]
  ------------------
  297|      0|                || rounding_.fType == Precision::PrecisionType::RND_INCREMENT_FIVE) {
  ------------------
  |  Branch (297:20): [True: 0, False: 0]
  ------------------
  298|      0|            minFrac_ = rounding_.fUnion.increment.fMinFrac;
  299|       |            // If incrementRounding is used, maxFrac is set equal to minFrac
  300|      0|            maxFrac_ = rounding_.fUnion.increment.fMinFrac;
  301|       |            // Convert the integer increment to a double
  302|      0|            DecimalQuantity dq;
  303|      0|            dq.setToLong(rounding_.fUnion.increment.fIncrement);
  304|      0|            dq.adjustMagnitude(rounding_.fUnion.increment.fIncrementMagnitude);
  305|      0|            increment_ = dq.toDouble();
  306|      0|        } else if (rounding_.fType == Precision::PrecisionType::RND_SIGNIFICANT) {
  ------------------
  |  Branch (306:20): [True: 0, False: 0]
  ------------------
  307|      0|            minSig_ = rounding_.fUnion.fracSig.fMinSig;
  308|      0|            maxSig_ = rounding_.fUnion.fracSig.fMaxSig;
  309|      0|        }
  310|       |
  311|   154k|        exportedProperties->minimumFractionDigits = minFrac_;
  312|   154k|        exportedProperties->maximumFractionDigits = maxFrac_;
  313|   154k|        exportedProperties->minimumSignificantDigits = minSig_;
  314|   154k|        exportedProperties->maximumSignificantDigits = maxSig_;
  315|   154k|        exportedProperties->roundingIncrement = increment_;
  316|   154k|    }
  317|       |
  318|   154k|    return macros;
  319|   154k|}
_ZN6icu_786number4impl30PropertiesAffixPatternProvider5setToERKNS1_23DecimalFormatPropertiesER10UErrorCode:
  322|   154k|void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& properties, UErrorCode& status) {
  323|   154k|    fBogus = false;
  324|       |
  325|       |    // There are two ways to set affixes in DecimalFormat: via the pattern string (applyPattern), and via the
  326|       |    // explicit setters (setPositivePrefix and friends).  The way to resolve the settings is as follows:
  327|       |    //
  328|       |    // 1) If the explicit setting is present for the field, use it.
  329|       |    // 2) Otherwise, follows UTS 35 rules based on the pattern string.
  330|       |    //
  331|       |    // Importantly, the explicit setters affect only the one field they override.  If you set the positive
  332|       |    // prefix, that should not affect the negative prefix.
  333|       |
  334|       |    // Convenience: Extract the properties into local variables.
  335|       |    // Variables are named with three chars: [p/n][p/s][o/p]
  336|       |    // [p/n] => p for positive, n for negative
  337|       |    // [p/s] => p for prefix, s for suffix
  338|       |    // [o/p] => o for escaped custom override string, p for pattern string
  339|   154k|    UnicodeString ppo = AffixUtils::escape(properties.positivePrefix);
  340|   154k|    UnicodeString pso = AffixUtils::escape(properties.positiveSuffix);
  341|   154k|    UnicodeString npo = AffixUtils::escape(properties.negativePrefix);
  342|   154k|    UnicodeString nso = AffixUtils::escape(properties.negativeSuffix);
  343|   154k|    const UnicodeString& ppp = properties.positivePrefixPattern;
  344|   154k|    const UnicodeString& psp = properties.positiveSuffixPattern;
  345|   154k|    const UnicodeString& npp = properties.negativePrefixPattern;
  346|   154k|    const UnicodeString& nsp = properties.negativeSuffixPattern;
  347|       |
  348|   154k|    if (!properties.positivePrefix.isBogus()) {
  ------------------
  |  Branch (348:9): [True: 0, False: 154k]
  ------------------
  349|      0|        posPrefix = ppo;
  350|   154k|    } else if (!ppp.isBogus()) {
  ------------------
  |  Branch (350:16): [True: 154k, False: 0]
  ------------------
  351|   154k|        posPrefix = ppp;
  352|   154k|    } else {
  353|       |        // UTS 35: Default positive prefix is empty string.
  354|      0|        posPrefix = u"";
  355|      0|    }
  356|       |
  357|   154k|    if (!properties.positiveSuffix.isBogus()) {
  ------------------
  |  Branch (357:9): [True: 0, False: 154k]
  ------------------
  358|      0|        posSuffix = pso;
  359|   154k|    } else if (!psp.isBogus()) {
  ------------------
  |  Branch (359:16): [True: 154k, False: 0]
  ------------------
  360|   154k|        posSuffix = psp;
  361|   154k|    } else {
  362|       |        // UTS 35: Default positive suffix is empty string.
  363|      0|        posSuffix = u"";
  364|      0|    }
  365|       |
  366|   154k|    if (!properties.negativePrefix.isBogus()) {
  ------------------
  |  Branch (366:9): [True: 0, False: 154k]
  ------------------
  367|      0|        negPrefix = npo;
  368|   154k|    } else if (!npp.isBogus()) {
  ------------------
  |  Branch (368:16): [True: 0, False: 154k]
  ------------------
  369|      0|        negPrefix = npp;
  370|   154k|    } else {
  371|       |        // UTS 35: Default negative prefix is "-" with positive prefix.
  372|       |        // Important: We prepend the "-" to the pattern, not the override!
  373|   154k|        negPrefix = ppp.isBogus() ? u"-" : u"-" + ppp;
  ------------------
  |  Branch (373:21): [True: 0, False: 154k]
  ------------------
  374|   154k|    }
  375|       |
  376|   154k|    if (!properties.negativeSuffix.isBogus()) {
  ------------------
  |  Branch (376:9): [True: 0, False: 154k]
  ------------------
  377|      0|        negSuffix = nso;
  378|   154k|    } else if (!nsp.isBogus()) {
  ------------------
  |  Branch (378:16): [True: 0, False: 154k]
  ------------------
  379|      0|        negSuffix = nsp;
  380|   154k|    } else {
  381|       |        // UTS 35: Default negative prefix is the positive prefix.
  382|   154k|        negSuffix = psp.isBogus() ? u"" : psp;
  ------------------
  |  Branch (382:21): [True: 0, False: 154k]
  ------------------
  383|   154k|    }
  384|       |
  385|       |    // For declaring if this is a currency pattern, we need to look at the
  386|       |    // original pattern, not at any user-specified overrides.
  387|   154k|    isCurrencyPattern = (
  388|   154k|        AffixUtils::hasCurrencySymbols(ppp, status) ||
  ------------------
  |  Branch (388:9): [True: 0, False: 154k]
  ------------------
  389|   154k|        AffixUtils::hasCurrencySymbols(psp, status) ||
  ------------------
  |  Branch (389:9): [True: 0, False: 154k]
  ------------------
  390|   154k|        AffixUtils::hasCurrencySymbols(npp, status) ||
  ------------------
  |  Branch (390:9): [True: 0, False: 154k]
  ------------------
  391|   154k|        AffixUtils::hasCurrencySymbols(nsp, status) ||
  ------------------
  |  Branch (391:9): [True: 0, False: 154k]
  ------------------
  392|   154k|        properties.currencyAsDecimal);
  ------------------
  |  Branch (392:9): [True: 0, False: 154k]
  ------------------
  393|       |
  394|   154k|    fCurrencyAsDecimal = properties.currencyAsDecimal;
  395|   154k|}
_ZNK6icu_786number4impl30PropertiesAffixPatternProvider15hasCurrencySignEv:
  444|   154k|bool PropertiesAffixPatternProvider::hasCurrencySign() const {
  445|   154k|    return isCurrencyPattern;
  446|   154k|}

_ZN6icu_786number4impl24AutoAffixPatternProviderC2Ev:
  126|  98.5k|    inline AutoAffixPatternProvider() = default;
_ZN6icu_786number4impl30PropertiesAffixPatternProviderC2Ev:
   67|   887k|    PropertiesAffixPatternProvider() = default; // puts instance in valid but undefined state
_ZN6icu_786number4impl31CurrencyPluralInfoAffixProviderC2Ev:
  116|  98.5k|    CurrencyPluralInfoAffixProvider() = default;
_ZNK6icu_786number4impl24AutoAffixPatternProvider3getEv:
  152|   309k|    inline const AffixPatternProvider& get() const {
  153|   309k|      if (!currencyPluralInfoAPP.isBogus()) {
  ------------------
  |  Branch (153:11): [True: 0, False: 309k]
  ------------------
  154|      0|        return currencyPluralInfoAPP;
  155|   309k|      } else {
  156|   309k|        return propertiesAPP;
  157|   309k|      }
  158|   309k|    }
_ZNK6icu_786number4impl31CurrencyPluralInfoAffixProvider7isBogusEv:
   80|   309k|    bool isBogus() const {
   81|   309k|        return fBogus;
   82|   309k|    }
_ZN6icu_786number4impl31CurrencyPluralInfoAffixProvider10setToBogusEv:
   84|   154k|    void setToBogus() {
   85|   154k|        fBogus = true;
   86|   154k|    }
_ZN6icu_786number4impl24AutoAffixPatternProvider5setToERKNS1_23DecimalFormatPropertiesER10UErrorCode:
  132|   154k|    inline void setTo(const DecimalFormatProperties& properties, UErrorCode& status) {
  133|   154k|        if (properties.currencyPluralInfo.fPtr.isNull()) {
  ------------------
  |  Branch (133:13): [True: 154k, False: 0]
  ------------------
  134|   154k|            propertiesAPP.setTo(properties, status);
  135|   154k|            currencyPluralInfoAPP.setToBogus();
  136|   154k|        } else {
  137|      0|            propertiesAPP.setToBogus();
  138|      0|            currencyPluralInfoAPP.setTo(*properties.currencyPluralInfo.fPtr, properties, status);
  139|      0|        }
  140|   154k|    }
_ZN6icu_786number4impl19DecimalFormatFieldsC2Ev:
  181|  21.2k|    DecimalFormatFields() {}
_ZN6icu_786number4impl19DecimalFormatFieldsC2ERKNS1_23DecimalFormatPropertiesE:
  184|  77.3k|        : properties(propsToCopy) {}

_ZN6icu_786number4impl8ModifierD2Ev:
   54|   280k|Modifier::~Modifier() = default;
_ZN6icu_786number4impl8Modifier10ParametersC2Ev:
   57|   224k|        : obj(nullptr) {}
_ZN6icu_786number4impl27AdoptingSignumModifierStoreD2Ev:
  100|  56.1k|AdoptingSignumModifierStore::~AdoptingSignumModifierStore()  {
  101|   224k|    for (const Modifier *mod : mods) {
  ------------------
  |  Branch (101:30): [True: 224k, False: 56.1k]
  ------------------
  102|   224k|        delete mod;
  103|   224k|    }
  104|  56.1k|}

_ZN6icu_786number4impl26ConstantMultiFieldModifierC2ERKNS_22FormattedStringBuilderES5_bb:
  155|   224k|      : fPrefix(prefix),
  156|   224k|        fSuffix(suffix),
  157|   224k|        fOverwrite(overwrite),
  158|   224k|        fStrong(strong) {}
_ZN6icu_786number4impl27AdoptingSignumModifierStore13adoptModifierENS1_6SignumEPKNS1_8ModifierE:
  293|   224k|    void adoptModifier(Signum signum, const Modifier* mod) {
  294|   224k|        U_ASSERT(mods[signum] == nullptr);
  ------------------
  |  |   35|   224k|#   define U_ASSERT(exp) (void)0
  ------------------
  295|   224k|        mods[signum] = mod;
  296|   224k|    }
_ZN6icu_786number4impl27AdoptingSignumModifierStoreC2Ev:
  280|  56.1k|    AdoptingSignumModifierStore() = default;

_ZN6icu_786number5ScaleC2EiPNS0_4impl6DecNumE:
   26|   154k|        : fMagnitude(magnitude), fArbitrary(arbitraryToAdopt), fError(U_ZERO_ERROR) {
   27|   154k|    if (fArbitrary != nullptr) {
  ------------------
  |  Branch (27:9): [True: 0, False: 154k]
  ------------------
   28|       |        // Attempt to convert the DecNum to a magnitude multiplier.
   29|      0|        fArbitrary->normalize();
   30|      0|        if (fArbitrary->getRawDecNumber()->digits == 1 && fArbitrary->getRawDecNumber()->lsu[0] == 1 &&
  ------------------
  |  Branch (30:13): [True: 0, False: 0]
  |  Branch (30:59): [True: 0, False: 0]
  ------------------
   31|      0|            !fArbitrary->isNegative()) {
  ------------------
  |  Branch (31:13): [True: 0, False: 0]
  ------------------
   32|       |            // Success!
   33|      0|            fMagnitude += fArbitrary->getRawDecNumber()->exponent;
   34|      0|            delete fArbitrary;
   35|      0|            fArbitrary = nullptr;
   36|      0|        }
   37|      0|    }
   38|   154k|}
_ZN6icu_786number5ScaleC2EOS1_:
   62|   154k|        : fMagnitude(src.fMagnitude), fArbitrary(src.fArbitrary), fError(src.fError) {
   63|       |    // Take ownership away from src if necessary
   64|   154k|    src.fArbitrary = nullptr;
   65|   154k|}
_ZN6icu_786number5ScaleaSEOS1_:
   67|   618k|Scale& Scale::operator=(Scale&& src) noexcept {
   68|   618k|    fMagnitude = src.fMagnitude;
   69|   618k|    delete fArbitrary;
   70|   618k|    fArbitrary = src.fArbitrary;
   71|   618k|    fError = src.fError;
   72|       |    // Take ownership away from src if necessary
   73|   618k|    src.fArbitrary = nullptr;
   74|   618k|    return *this;
   75|   618k|}
_ZN6icu_786number5ScaleD2Ev:
   77|   872k|Scale::~Scale() {
   78|   872k|    delete fArbitrary;
   79|   872k|}
_ZN6icu_786number5Scale4noneEv:
   82|   154k|Scale Scale::none() {
   83|   154k|    return {0, nullptr};
   84|   154k|}

number_mapper.cpp:_ZN6icu_786number4implL19scaleFromPropertiesERKNS1_23DecimalFormatPropertiesE:
   36|   154k|static inline Scale scaleFromProperties(const DecimalFormatProperties& properties) {
   37|   154k|    int32_t magnitudeMultiplier = properties.magnitudeMultiplier + properties.multiplierScale;
   38|   154k|    int32_t arbitraryMultiplier = properties.multiplier;
   39|   154k|    if (magnitudeMultiplier != 0 && arbitraryMultiplier != 1) {
  ------------------
  |  Branch (39:9): [True: 0, False: 154k]
  |  Branch (39:37): [True: 0, False: 0]
  ------------------
   40|      0|        return Scale::byDoubleAndPowerOfTen(arbitraryMultiplier, magnitudeMultiplier);
   41|   154k|    } else if (magnitudeMultiplier != 0) {
  ------------------
  |  Branch (41:16): [True: 0, False: 154k]
  ------------------
   42|      0|        return Scale::powerOfTen(magnitudeMultiplier);
   43|   154k|    } else if (arbitraryMultiplier != 1) {
  ------------------
  |  Branch (43:16): [True: 0, False: 154k]
  ------------------
   44|      0|        return Scale::byDouble(arbitraryMultiplier);
   45|   154k|    } else {
   46|   154k|        return Scale::none();
   47|   154k|    }
   48|   154k|}

_ZN6icu_786number4impl20AffixPatternProviderD2Ev:
   20|  1.06M|AffixPatternProvider::~AffixPatternProvider() = default;
_ZN6icu_786number4impl22MutablePatternModifierC2Eb:
   24|  56.1k|        : fStrong(isStrong) {}
_ZN6icu_786number4impl22MutablePatternModifier14setPatternInfoEPKNS1_20AffixPatternProviderENS_22FormattedStringBuilder5FieldE:
   26|  56.1k|void MutablePatternModifier::setPatternInfo(const AffixPatternProvider* patternInfo, Field field) {
   27|  56.1k|    fPatternInfo = patternInfo;
   28|  56.1k|    fField = field;
   29|  56.1k|}
_ZN6icu_786number4impl22MutablePatternModifier20setPatternAttributesE18UNumberSignDisplaybb:
   34|  56.1k|        bool approximately) {
   35|  56.1k|    fSignDisplay = signDisplay;
   36|  56.1k|    fPerMilleReplacesPercent = perMille;
   37|  56.1k|    fApproximately = approximately;
   38|  56.1k|}
_ZN6icu_786number4impl22MutablePatternModifier10setSymbolsEPKNS_20DecimalFormatSymbolsERKNS_12CurrencyUnitE16UNumberUnitWidthPKNS_11PluralRulesER10UErrorCode:
   44|  56.1k|                                        UErrorCode& status) {
   45|  56.1k|    U_ASSERT((rules != nullptr) == needsPlurals());
  ------------------
  |  |   35|  56.1k|#   define U_ASSERT(exp) (void)0
  ------------------
   46|  56.1k|    fSymbols = symbols;
   47|  56.1k|    fCurrencySymbols = {currency, symbols->getLocale(), *symbols, status};
   48|  56.1k|    fUnitWidth = unitWidth;
   49|  56.1k|    fRules = rules;
   50|  56.1k|}
_ZN6icu_786number4impl22MutablePatternModifier19setNumberPropertiesENS1_6SignumENS_14StandardPlural4FormE:
   52|   224k|void MutablePatternModifier::setNumberProperties(Signum signum, StandardPlural::Form plural) {
   53|   224k|    fSignum = signum;
   54|   224k|    fPlural = plural;
   55|   224k|}
_ZN6icu_786number4impl22MutablePatternModifier24createImmutableForPluralENS_14StandardPlural4FormER10UErrorCode:
   63|  56.1k|AdoptingSignumModifierStore MutablePatternModifier::createImmutableForPlural(StandardPlural::Form plural, UErrorCode& status) {
   64|  56.1k|    AdoptingSignumModifierStore pm;
   65|       |
   66|  56.1k|    setNumberProperties(SIGNUM_POS, plural);
   67|  56.1k|    pm.adoptModifier(SIGNUM_POS, createConstantModifier(status));
   68|  56.1k|    setNumberProperties(SIGNUM_NEG_ZERO, plural);
   69|  56.1k|    pm.adoptModifier(SIGNUM_NEG_ZERO, createConstantModifier(status));
   70|  56.1k|    setNumberProperties(SIGNUM_POS_ZERO, plural);
   71|  56.1k|    pm.adoptModifier(SIGNUM_POS_ZERO, createConstantModifier(status));
   72|  56.1k|    setNumberProperties(SIGNUM_NEG, plural);
   73|  56.1k|    pm.adoptModifier(SIGNUM_NEG, createConstantModifier(status));
   74|       |
   75|  56.1k|    return pm;
   76|  56.1k|}
_ZN6icu_786number4impl22MutablePatternModifier22createConstantModifierER10UErrorCode:
  115|   224k|ConstantMultiFieldModifier* MutablePatternModifier::createConstantModifier(UErrorCode& status) {
  116|   224k|    FormattedStringBuilder a;
  117|   224k|    FormattedStringBuilder b;
  118|   224k|    insertPrefix(a, 0, status);
  119|   224k|    insertSuffix(b, 0, status);
  120|   224k|    if (fPatternInfo->hasCurrencySign()) {
  ------------------
  |  Branch (120:9): [True: 0, False: 224k]
  ------------------
  121|      0|        return new CurrencySpacingEnabledModifier(
  122|      0|                a, b, !fPatternInfo->hasBody(), fStrong, *fSymbols, status);
  123|   224k|    } else {
  124|   224k|        return new ConstantMultiFieldModifier(a, b, !fPatternInfo->hasBody(), fStrong);
  125|   224k|    }
  126|   224k|}
_ZN6icu_786number4impl22MutablePatternModifier12insertPrefixERNS_22FormattedStringBuilderEiR10UErrorCode:
  267|   224k|int32_t MutablePatternModifier::insertPrefix(FormattedStringBuilder& sb, int position, UErrorCode& status) {
  268|   224k|    prepareAffix(true);
  269|   224k|    int32_t length = AffixUtils::unescape(currentAffix, sb, position, *this, fField, status);
  270|   224k|    return length;
  271|   224k|}
_ZN6icu_786number4impl22MutablePatternModifier12insertSuffixERNS_22FormattedStringBuilderEiR10UErrorCode:
  273|   224k|int32_t MutablePatternModifier::insertSuffix(FormattedStringBuilder& sb, int position, UErrorCode& status) {
  274|   224k|    prepareAffix(false);
  275|   224k|    int32_t length = AffixUtils::unescape(currentAffix, sb, position, *this, fField, status);
  276|   224k|    return length;
  277|   224k|}
_ZN6icu_786number4impl22MutablePatternModifier12prepareAffixEb:
  280|   449k|void MutablePatternModifier::prepareAffix(bool isPrefix) {
  281|   449k|    PatternStringUtils::patternInfoToStringBuilder(
  282|   449k|            *fPatternInfo,
  283|   449k|            isPrefix,
  284|   449k|            PatternStringUtils::resolveSignDisplay(fSignDisplay, fSignum),
  285|   449k|            fApproximately,
  286|   449k|            fPlural,
  287|   449k|            fPerMilleReplacesPercent,
  288|   449k|            false, // dropCurrencySymbols
  289|   449k|            currentAffix);
  290|   449k|}
_ZNK6icu_786number4impl22MutablePatternModifier9getSymbolENS1_16AffixPatternTypeE:
  292|   112k|UnicodeString MutablePatternModifier::getSymbol(AffixPatternType type) const {
  293|   112k|    UErrorCode localStatus = U_ZERO_ERROR;
  294|   112k|    switch (type) {
  295|  56.1k|        case AffixPatternType::TYPE_MINUS_SIGN:
  ------------------
  |  Branch (295:9): [True: 56.1k, False: 56.1k]
  ------------------
  296|  56.1k|            return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kMinusSignSymbol);
  297|  56.1k|        case AffixPatternType::TYPE_PLUS_SIGN:
  ------------------
  |  Branch (297:9): [True: 56.1k, False: 56.1k]
  ------------------
  298|  56.1k|            return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPlusSignSymbol);
  299|      0|        case AffixPatternType::TYPE_APPROXIMATELY_SIGN:
  ------------------
  |  Branch (299:9): [True: 0, False: 112k]
  ------------------
  300|      0|            return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kApproximatelySignSymbol);
  301|      0|        case AffixPatternType::TYPE_PERCENT:
  ------------------
  |  Branch (301:9): [True: 0, False: 112k]
  ------------------
  302|      0|            return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPercentSymbol);
  303|      0|        case AffixPatternType::TYPE_PERMILLE:
  ------------------
  |  Branch (303:9): [True: 0, False: 112k]
  ------------------
  304|      0|            return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPerMillSymbol);
  305|      0|        case AffixPatternType::TYPE_CURRENCY_SINGLE:
  ------------------
  |  Branch (305:9): [True: 0, False: 112k]
  ------------------
  306|      0|            return getCurrencySymbolForUnitWidth(localStatus);
  307|      0|        case AffixPatternType::TYPE_CURRENCY_DOUBLE:
  ------------------
  |  Branch (307:9): [True: 0, False: 112k]
  ------------------
  308|      0|            return fCurrencySymbols.getIntlCurrencySymbol(localStatus);
  309|      0|        case AffixPatternType::TYPE_CURRENCY_TRIPLE:
  ------------------
  |  Branch (309:9): [True: 0, False: 112k]
  ------------------
  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: 112k]
  ------------------
  316|      0|            return UnicodeString(u"\uFFFD");
  317|      0|        case AffixPatternType::TYPE_CURRENCY_QUINT:
  ------------------
  |  Branch (317:9): [True: 0, False: 112k]
  ------------------
  318|      0|            return UnicodeString(u"\uFFFD");
  319|      0|        default:
  ------------------
  |  Branch (319:9): [True: 0, False: 112k]
  ------------------
  320|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  321|   112k|    }
  322|   112k|}

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

_ZN6icu_786number4impl13PatternParser18parseToPatternInfoERKNS_13UnicodeStringERNS1_17ParsedPatternInfoER10UErrorCode:
   26|  77.3k|                                       UErrorCode& status) {
   27|  77.3k|    patternInfo.consumePattern(patternString, status);
   28|  77.3k|}
_ZN6icu_786number4impl13PatternParser25parseToExistingPropertiesERKNS_13UnicodeStringERNS1_23DecimalFormatPropertiesENS1_14IgnoreRoundingER10UErrorCode:
   45|  21.2k|                                         IgnoreRounding ignoreRounding, UErrorCode& status) {
   46|  21.2k|    parseToExistingPropertiesImpl(pattern, properties, ignoreRounding, status);
   47|  21.2k|}
_ZNK6icu_786number4impl17ParsedPatternInfo6lengthEi:
   58|   449k|int32_t ParsedPatternInfo::length(int32_t flags) const {
   59|   449k|    return getLengthFromEndpoints(getEndpoints(flags));
   60|   449k|}
_ZN6icu_786number4impl17ParsedPatternInfo22getLengthFromEndpointsERKNS1_9EndpointsE:
   62|   449k|int32_t ParsedPatternInfo::getLengthFromEndpoints(const Endpoints& endpoints) {
   63|   449k|    return endpoints.end - endpoints.start;
   64|   449k|}
_ZNK6icu_786number4impl17ParsedPatternInfo9getStringEi:
   66|  42.4k|UnicodeString ParsedPatternInfo::getString(int32_t flags) const {
   67|  42.4k|    const Endpoints& endpoints = getEndpoints(flags);
   68|  42.4k|    if (endpoints.start == endpoints.end) {
  ------------------
  |  Branch (68:9): [True: 42.4k, False: 0]
  ------------------
   69|  42.4k|        return {};
   70|  42.4k|    }
   71|       |    // Create a new UnicodeString
   72|      0|    return UnicodeString(pattern, endpoints.start, endpoints.end - endpoints.start);
   73|  42.4k|}
_ZNK6icu_786number4impl17ParsedPatternInfo12getEndpointsEi:
   75|   491k|const Endpoints& ParsedPatternInfo::getEndpoints(int32_t flags) const {
   76|   491k|    bool prefix = (flags & AFFIX_PREFIX) != 0;
   77|   491k|    bool isNegative = (flags & AFFIX_NEGATIVE_SUBPATTERN) != 0;
   78|   491k|    bool padding = (flags & AFFIX_PADDING) != 0;
   79|   491k|    if (isNegative && padding) {
  ------------------
  |  Branch (79:9): [True: 0, False: 491k]
  |  Branch (79:23): [True: 0, False: 0]
  ------------------
   80|      0|        return negative.paddingEndpoints;
   81|   491k|    } else if (padding) {
  ------------------
  |  Branch (81:16): [True: 0, False: 491k]
  ------------------
   82|      0|        return positive.paddingEndpoints;
   83|   491k|    } else if (prefix && isNegative) {
  ------------------
  |  Branch (83:16): [True: 245k, False: 245k]
  |  Branch (83:26): [True: 0, False: 245k]
  ------------------
   84|      0|        return negative.prefixEndpoints;
   85|   491k|    } else if (prefix) {
  ------------------
  |  Branch (85:16): [True: 245k, False: 245k]
  ------------------
   86|   245k|        return positive.prefixEndpoints;
   87|   245k|    } else if (isNegative) {
  ------------------
  |  Branch (87:16): [True: 0, False: 245k]
  ------------------
   88|      0|        return negative.suffixEndpoints;
   89|   245k|    } else {
   90|   245k|        return positive.suffixEndpoints;
   91|   245k|    }
   92|   491k|}
_ZNK6icu_786number4impl17ParsedPatternInfo19positiveHasPlusSignEv:
   94|   112k|bool ParsedPatternInfo::positiveHasPlusSign() const {
   95|   112k|    return positive.hasPlusSign;
   96|   112k|}
_ZNK6icu_786number4impl17ParsedPatternInfo21hasNegativeSubpatternEv:
   98|   449k|bool ParsedPatternInfo::hasNegativeSubpattern() const {
   99|   449k|    return fHasNegativeSubpattern;
  100|   449k|}
_ZNK6icu_786number4impl17ParsedPatternInfo15hasCurrencySignEv:
  106|   224k|bool ParsedPatternInfo::hasCurrencySign() const {
  107|   224k|    return positive.hasCurrencySign || (fHasNegativeSubpattern && negative.hasCurrencySign);
  ------------------
  |  Branch (107:12): [True: 0, False: 224k]
  |  Branch (107:41): [True: 0, False: 224k]
  |  Branch (107:67): [True: 0, False: 0]
  ------------------
  108|   224k|}
_ZNK6icu_786number4impl17ParsedPatternInfo7hasBodyEv:
  114|   224k|bool ParsedPatternInfo::hasBody() const {
  115|   224k|    return positive.integerTotal > 0;
  116|   224k|}
_ZN6icu_786number4impl17ParsedPatternInfo11ParserState4peekEv:
  126|  2.06M|UChar32 ParsedPatternInfo::ParserState::peek() {
  127|  2.06M|    if (offset == pattern.length()) {
  ------------------
  |  Branch (127:9): [True: 584k, False: 1.47M]
  ------------------
  128|   584k|        return -1;
  129|  1.47M|    } else {
  130|  1.47M|        return pattern.char32At(offset);
  131|  1.47M|    }
  132|  2.06M|}
_ZN6icu_786number4impl17ParsedPatternInfo11ParserState4nextEv:
  146|   555k|UChar32 ParsedPatternInfo::ParserState::next() {
  147|   555k|    int32_t codePoint = peek();
  148|   555k|    offset += U16_LENGTH(codePoint);
  ------------------
  |  |  141|   555k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 555k, False: 0]
  |  |  ------------------
  ------------------
  149|   555k|    return codePoint;
  150|   555k|}
_ZN6icu_786number4impl17ParsedPatternInfo14consumePatternERKNS_13UnicodeStringER10UErrorCode:
  152|  77.3k|void ParsedPatternInfo::consumePattern(const UnicodeString& patternString, UErrorCode& status) {
  153|  77.3k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (153:9): [True: 0, False: 77.3k]
  ------------------
  154|  77.3k|    this->pattern = patternString;
  155|       |
  156|       |    // This class is not intended for writing twice!
  157|       |    // Use move assignment to overwrite instead.
  158|  77.3k|    U_ASSERT(state.offset == 0);
  ------------------
  |  |   35|  77.3k|#   define U_ASSERT(exp) (void)0
  ------------------
  159|       |
  160|       |    // pattern := subpattern (';' subpattern)?
  161|  77.3k|    currentSubpattern = &positive;
  162|  77.3k|    consumeSubpattern(status);
  163|  77.3k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (163:9): [True: 0, False: 77.3k]
  ------------------
  164|  77.3k|    if (state.peek() == u';') {
  ------------------
  |  Branch (164:9): [True: 0, False: 77.3k]
  ------------------
  165|      0|        state.next(); // consume the ';'
  166|       |        // Don't consume the negative subpattern if it is empty (trailing ';')
  167|      0|        if (state.peek() != -1) {
  ------------------
  |  Branch (167:13): [True: 0, False: 0]
  ------------------
  168|      0|            fHasNegativeSubpattern = true;
  169|      0|            currentSubpattern = &negative;
  170|      0|            consumeSubpattern(status);
  171|      0|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (171:17): [True: 0, False: 0]
  ------------------
  172|      0|        }
  173|      0|    }
  174|  77.3k|    if (state.peek() != -1) {
  ------------------
  |  Branch (174:9): [True: 0, False: 77.3k]
  ------------------
  175|      0|        state.toParseException(u"Found unquoted special character");
  176|      0|        status = U_UNQUOTED_SPECIAL;
  177|      0|    }
  178|  77.3k|}
_ZN6icu_786number4impl17ParsedPatternInfo17consumeSubpatternER10UErrorCode:
  180|  77.3k|void ParsedPatternInfo::consumeSubpattern(UErrorCode& status) {
  181|       |    // subpattern := literals? number exponent? literals?
  182|  77.3k|    consumePadding(PadPosition::UNUM_PAD_BEFORE_PREFIX, status);
  183|  77.3k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (183:9): [True: 0, False: 77.3k]
  ------------------
  184|  77.3k|    consumeAffix(currentSubpattern->prefixEndpoints, status);
  185|  77.3k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (185:9): [True: 0, False: 77.3k]
  ------------------
  186|  77.3k|    consumePadding(PadPosition::UNUM_PAD_AFTER_PREFIX, status);
  187|  77.3k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (187:9): [True: 0, False: 77.3k]
  ------------------
  188|  77.3k|    consumeFormat(status);
  189|  77.3k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (189:9): [True: 0, False: 77.3k]
  ------------------
  190|  77.3k|    consumeExponent(status);
  191|  77.3k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (191:9): [True: 0, False: 77.3k]
  ------------------
  192|  77.3k|    consumePadding(PadPosition::UNUM_PAD_BEFORE_SUFFIX, status);
  193|  77.3k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (193:9): [True: 0, False: 77.3k]
  ------------------
  194|  77.3k|    consumeAffix(currentSubpattern->suffixEndpoints, status);
  195|  77.3k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (195:9): [True: 0, False: 77.3k]
  ------------------
  196|  77.3k|    consumePadding(PadPosition::UNUM_PAD_AFTER_SUFFIX, status);
  197|  77.3k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (197:9): [True: 0, False: 77.3k]
  ------------------
  198|  77.3k|}
_ZN6icu_786number4impl17ParsedPatternInfo14consumePaddingE24UNumberFormatPadPositionR10UErrorCode:
  200|   309k|void ParsedPatternInfo::consumePadding(PadPosition paddingLocation, UErrorCode& status) {
  201|   309k|    if (state.peek() != u'*') {
  ------------------
  |  Branch (201:9): [True: 309k, False: 0]
  ------------------
  202|   309k|        return;
  203|   309k|    }
  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|   154k|void ParsedPatternInfo::consumeAffix(Endpoints& endpoints, UErrorCode& status) {
  218|       |    // literals := { literal }
  219|   154k|    endpoints.start = state.offset;
  220|   154k|    while (true) {
  ------------------
  |  Branch (220:12): [Folded - Ignored]
  ------------------
  221|   154k|        switch (state.peek()) {
  222|  21.2k|            case u'#':
  ------------------
  |  Branch (222:13): [True: 21.2k, False: 133k]
  ------------------
  223|  21.2k|            case u'@':
  ------------------
  |  Branch (223:13): [True: 0, False: 154k]
  ------------------
  224|  21.2k|            case u';':
  ------------------
  |  Branch (224:13): [True: 0, False: 154k]
  ------------------
  225|  21.2k|            case u'*':
  ------------------
  |  Branch (225:13): [True: 0, False: 154k]
  ------------------
  226|  21.2k|            case u'.':
  ------------------
  |  Branch (226:13): [True: 0, False: 154k]
  ------------------
  227|  21.2k|            case u',':
  ------------------
  |  Branch (227:13): [True: 0, False: 154k]
  ------------------
  228|  77.3k|            case u'0':
  ------------------
  |  Branch (228:13): [True: 56.1k, False: 98.5k]
  ------------------
  229|  77.3k|            case u'1':
  ------------------
  |  Branch (229:13): [True: 0, False: 154k]
  ------------------
  230|  77.3k|            case u'2':
  ------------------
  |  Branch (230:13): [True: 0, False: 154k]
  ------------------
  231|  77.3k|            case u'3':
  ------------------
  |  Branch (231:13): [True: 0, False: 154k]
  ------------------
  232|  77.3k|            case u'4':
  ------------------
  |  Branch (232:13): [True: 0, False: 154k]
  ------------------
  233|  77.3k|            case u'5':
  ------------------
  |  Branch (233:13): [True: 0, False: 154k]
  ------------------
  234|  77.3k|            case u'6':
  ------------------
  |  Branch (234:13): [True: 0, False: 154k]
  ------------------
  235|  77.3k|            case u'7':
  ------------------
  |  Branch (235:13): [True: 0, False: 154k]
  ------------------
  236|  77.3k|            case u'8':
  ------------------
  |  Branch (236:13): [True: 0, False: 154k]
  ------------------
  237|  77.3k|            case u'9':
  ------------------
  |  Branch (237:13): [True: 0, False: 154k]
  ------------------
  238|   154k|            case -1:
  ------------------
  |  Branch (238:13): [True: 77.3k, False: 77.3k]
  ------------------
  239|       |                // Characters that cannot appear unquoted in a literal
  240|       |                // break outer;
  241|   154k|                goto after_outer;
  242|       |
  243|      0|            case u'%':
  ------------------
  |  Branch (243:13): [True: 0, False: 154k]
  ------------------
  244|      0|                currentSubpattern->hasPercentSign = true;
  245|      0|                break;
  246|       |
  247|      0|            case u'‰':
  ------------------
  |  Branch (247:13): [True: 0, False: 154k]
  ------------------
  248|      0|                currentSubpattern->hasPerMilleSign = true;
  249|      0|                break;
  250|       |
  251|      0|            case u'¤':
  ------------------
  |  Branch (251:13): [True: 0, False: 154k]
  ------------------
  252|      0|                currentSubpattern->hasCurrencySign = true;
  253|      0|                break;
  254|       |
  255|      0|            case u'-':
  ------------------
  |  Branch (255:13): [True: 0, False: 154k]
  ------------------
  256|      0|                currentSubpattern->hasMinusSign = true;
  257|      0|                break;
  258|       |
  259|      0|            case u'+':
  ------------------
  |  Branch (259:13): [True: 0, False: 154k]
  ------------------
  260|      0|                currentSubpattern->hasPlusSign = true;
  261|      0|                break;
  262|       |
  263|      0|            default:
  ------------------
  |  Branch (263:13): [True: 0, False: 154k]
  ------------------
  264|      0|                break;
  265|   154k|        }
  266|      0|        consumeLiteral(status);
  267|      0|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (267:13): [True: 0, False: 0]
  ------------------
  268|      0|    }
  269|   154k|    after_outer:
  270|   154k|    endpoints.end = state.offset;
  271|   154k|}
_ZN6icu_786number4impl17ParsedPatternInfo13consumeFormatER10UErrorCode:
  296|  77.3k|void ParsedPatternInfo::consumeFormat(UErrorCode& status) {
  297|  77.3k|    consumeIntegerFormat(status);
  298|  77.3k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (298:9): [True: 0, False: 77.3k]
  ------------------
  299|  77.3k|    if (state.peek() == u'.') {
  ------------------
  |  Branch (299:9): [True: 56.1k, False: 21.2k]
  ------------------
  300|  56.1k|        state.next(); // consume the decimal point
  301|  56.1k|        currentSubpattern->hasDecimal = true;
  302|  56.1k|        currentSubpattern->widthExceptAffixes += 1;
  303|  56.1k|        consumeFractionFormat(status);
  304|  56.1k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (304:13): [True: 0, False: 56.1k]
  ------------------
  305|  56.1k|    } else if (state.peek() == u'¤') {
  ------------------
  |  Branch (305:16): [True: 0, False: 21.2k]
  ------------------
  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|  77.3k|}
_ZN6icu_786number4impl17ParsedPatternInfo20consumeIntegerFormatER10UErrorCode:
  337|  77.3k|void ParsedPatternInfo::consumeIntegerFormat(UErrorCode& status) {
  338|       |    // Convenience reference:
  339|  77.3k|    ParsedSubpatternInfo& result = *currentSubpattern;
  340|       |
  341|   239k|    while (true) {
  ------------------
  |  Branch (341:12): [Folded - Ignored]
  ------------------
  342|   239k|        switch (state.peek()) {
  343|  21.2k|            case u',':
  ------------------
  |  Branch (343:13): [True: 21.2k, False: 218k]
  ------------------
  344|  21.2k|                result.widthExceptAffixes += 1;
  345|  21.2k|                result.groupingSizes <<= 16;
  346|  21.2k|                break;
  347|       |
  348|  63.6k|            case u'#':
  ------------------
  |  Branch (348:13): [True: 63.6k, False: 175k]
  ------------------
  349|  63.6k|                if (result.integerNumerals > 0) {
  ------------------
  |  Branch (349:21): [True: 0, False: 63.6k]
  ------------------
  350|      0|                    state.toParseException(u"# cannot follow 0 before decimal point");
  351|      0|                    status = U_UNEXPECTED_TOKEN;
  352|      0|                    return;
  353|      0|                }
  354|  63.6k|                result.widthExceptAffixes += 1;
  355|  63.6k|                result.groupingSizes += 1;
  356|  63.6k|                if (result.integerAtSigns > 0) {
  ------------------
  |  Branch (356:21): [True: 0, False: 63.6k]
  ------------------
  357|      0|                    result.integerTrailingHashSigns += 1;
  358|  63.6k|                } else {
  359|  63.6k|                    result.integerLeadingHashSigns += 1;
  360|  63.6k|                }
  361|  63.6k|                result.integerTotal += 1;
  362|  63.6k|                break;
  363|       |
  364|      0|            case u'@':
  ------------------
  |  Branch (364:13): [True: 0, False: 239k]
  ------------------
  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|  77.3k|            case u'0':
  ------------------
  |  Branch (381:13): [True: 77.3k, False: 162k]
  ------------------
  382|  77.3k|            case u'1':
  ------------------
  |  Branch (382:13): [True: 0, False: 239k]
  ------------------
  383|  77.3k|            case u'2':
  ------------------
  |  Branch (383:13): [True: 0, False: 239k]
  ------------------
  384|  77.3k|            case u'3':
  ------------------
  |  Branch (384:13): [True: 0, False: 239k]
  ------------------
  385|  77.3k|            case u'4':
  ------------------
  |  Branch (385:13): [True: 0, False: 239k]
  ------------------
  386|  77.3k|            case u'5':
  ------------------
  |  Branch (386:13): [True: 0, False: 239k]
  ------------------
  387|  77.3k|            case u'6':
  ------------------
  |  Branch (387:13): [True: 0, False: 239k]
  ------------------
  388|  77.3k|            case u'7':
  ------------------
  |  Branch (388:13): [True: 0, False: 239k]
  ------------------
  389|  77.3k|            case u'8':
  ------------------
  |  Branch (389:13): [True: 0, False: 239k]
  ------------------
  390|  77.3k|            case u'9':
  ------------------
  |  Branch (390:13): [True: 0, False: 239k]
  ------------------
  391|  77.3k|                if (result.integerAtSigns > 0) {
  ------------------
  |  Branch (391:21): [True: 0, False: 77.3k]
  ------------------
  392|      0|                    state.toParseException(u"Cannot mix @ and 0");
  393|      0|                    status = U_UNEXPECTED_TOKEN;
  394|      0|                    return;
  395|      0|                }
  396|  77.3k|                result.widthExceptAffixes += 1;
  397|  77.3k|                result.groupingSizes += 1;
  398|  77.3k|                result.integerNumerals += 1;
  399|  77.3k|                result.integerTotal += 1;
  400|  77.3k|                if (!result.rounding.isZeroish() || state.peek() != u'0') {
  ------------------
  |  Branch (400:21): [True: 0, False: 77.3k]
  |  Branch (400:53): [True: 0, False: 77.3k]
  ------------------
  401|      0|                    result.rounding.appendDigit(static_cast<int8_t>(state.peek() - u'0'), 0, true);
  402|      0|                }
  403|  77.3k|                break;
  404|       |
  405|  77.3k|            default:
  ------------------
  |  Branch (405:13): [True: 77.3k, False: 162k]
  ------------------
  406|  77.3k|                goto after_outer;
  407|   239k|        }
  408|   162k|        state.next(); // consume the symbol
  409|   162k|    }
  410|       |
  411|  77.3k|    after_outer:
  412|       |    // Disallow patterns with a trailing ',' or with two ',' next to each other
  413|  77.3k|    auto grouping1 = static_cast<int16_t> (result.groupingSizes & 0xffff);
  414|  77.3k|    auto grouping2 = static_cast<int16_t> ((result.groupingSizes >> 16) & 0xffff);
  415|  77.3k|    auto grouping3 = static_cast<int16_t> ((result.groupingSizes >> 32) & 0xffff);
  416|  77.3k|    if (grouping1 == 0 && grouping2 != -1) {
  ------------------
  |  Branch (416:9): [True: 0, False: 77.3k]
  |  Branch (416:27): [True: 0, False: 0]
  ------------------
  417|      0|        state.toParseException(u"Trailing grouping separator is invalid");
  418|      0|        status = U_UNEXPECTED_TOKEN;
  419|      0|        return;
  420|      0|    }
  421|  77.3k|    if (grouping2 == 0 && grouping3 != -1) {
  ------------------
  |  Branch (421:9): [True: 0, False: 77.3k]
  |  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|  77.3k|}
_ZN6icu_786number4impl17ParsedPatternInfo21consumeFractionFormatER10UErrorCode:
  428|  56.1k|void ParsedPatternInfo::consumeFractionFormat(UErrorCode& status) {
  429|       |    // Convenience reference:
  430|  56.1k|    ParsedSubpatternInfo& result = *currentSubpattern;
  431|       |
  432|  56.1k|    int32_t zeroCounter = 0;
  433|   393k|    while (true) {
  ------------------
  |  Branch (433:12): [Folded - Ignored]
  ------------------
  434|   393k|        switch (state.peek()) {
  435|   336k|            case u'#':
  ------------------
  |  Branch (435:13): [True: 336k, False: 56.1k]
  ------------------
  436|   336k|                result.widthExceptAffixes += 1;
  437|   336k|                result.fractionHashSigns += 1;
  438|   336k|                result.fractionTotal += 1;
  439|   336k|                zeroCounter++;
  440|   336k|                break;
  441|       |
  442|      0|            case u'0':
  ------------------
  |  Branch (442:13): [True: 0, False: 393k]
  ------------------
  443|      0|            case u'1':
  ------------------
  |  Branch (443:13): [True: 0, False: 393k]
  ------------------
  444|      0|            case u'2':
  ------------------
  |  Branch (444:13): [True: 0, False: 393k]
  ------------------
  445|      0|            case u'3':
  ------------------
  |  Branch (445:13): [True: 0, False: 393k]
  ------------------
  446|      0|            case u'4':
  ------------------
  |  Branch (446:13): [True: 0, False: 393k]
  ------------------
  447|      0|            case u'5':
  ------------------
  |  Branch (447:13): [True: 0, False: 393k]
  ------------------
  448|      0|            case u'6':
  ------------------
  |  Branch (448:13): [True: 0, False: 393k]
  ------------------
  449|      0|            case u'7':
  ------------------
  |  Branch (449:13): [True: 0, False: 393k]
  ------------------
  450|      0|            case u'8':
  ------------------
  |  Branch (450:13): [True: 0, False: 393k]
  ------------------
  451|      0|            case u'9':
  ------------------
  |  Branch (451:13): [True: 0, False: 393k]
  ------------------
  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|  56.1k|            default:
  ------------------
  |  Branch (469:13): [True: 56.1k, False: 336k]
  ------------------
  470|  56.1k|                return;
  471|   393k|        }
  472|   336k|        state.next(); // consume the symbol
  473|   336k|    }
  474|  56.1k|}
_ZN6icu_786number4impl17ParsedPatternInfo15consumeExponentER10UErrorCode:
  476|  77.3k|void ParsedPatternInfo::consumeExponent(UErrorCode& status) {
  477|       |    // Convenience reference:
  478|  77.3k|    ParsedSubpatternInfo& result = *currentSubpattern;
  479|       |
  480|  77.3k|    if (state.peek() != u'E') {
  ------------------
  |  Branch (480:9): [True: 77.3k, False: 0]
  ------------------
  481|  77.3k|        return;
  482|  77.3k|    }
  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_786number4impl13PatternParser29parseToExistingPropertiesImplERKNS_13UnicodeStringERNS1_23DecimalFormatPropertiesENS1_14IgnoreRoundingER10UErrorCode:
  508|  21.2k|                                                  IgnoreRounding ignoreRounding, UErrorCode& status) {
  509|  21.2k|    if (pattern.length() == 0) {
  ------------------
  |  Branch (509:9): [True: 0, False: 21.2k]
  ------------------
  510|       |        // Backwards compatibility requires that we reset to the default values.
  511|       |        // TODO: Only overwrite the properties that "saveToProperties" normally touches?
  512|      0|        properties.clear();
  513|      0|        return;
  514|      0|    }
  515|       |
  516|  21.2k|    ParsedPatternInfo patternInfo;
  517|  21.2k|    parseToPatternInfo(pattern, patternInfo, status);
  518|  21.2k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (518:9): [True: 0, False: 21.2k]
  ------------------
  519|  21.2k|    patternInfoToProperties(properties, patternInfo, ignoreRounding, status);
  520|  21.2k|}
_ZN6icu_786number4impl13PatternParser23patternInfoToPropertiesERNS1_23DecimalFormatPropertiesERNS1_17ParsedPatternInfoENS1_14IgnoreRoundingER10UErrorCode:
  524|  21.2k|                                       IgnoreRounding _ignoreRounding, UErrorCode& status) {
  525|       |    // Translate from PatternParseResult to Properties.
  526|       |    // Note that most data from "negative" is ignored per the specification of DecimalFormat.
  527|       |
  528|  21.2k|    const ParsedSubpatternInfo& positive = patternInfo.positive;
  529|       |
  530|  21.2k|    bool ignoreRounding;
  531|  21.2k|    if (_ignoreRounding == IGNORE_ROUNDING_NEVER) {
  ------------------
  |  Branch (531:9): [True: 0, False: 21.2k]
  ------------------
  532|      0|        ignoreRounding = false;
  533|  21.2k|    } else if (_ignoreRounding == IGNORE_ROUNDING_IF_CURRENCY) {
  ------------------
  |  Branch (533:16): [True: 21.2k, False: 0]
  ------------------
  534|  21.2k|        ignoreRounding = positive.hasCurrencySign;
  535|  21.2k|    } else {
  536|      0|        U_ASSERT(_ignoreRounding == IGNORE_ROUNDING_ALWAYS);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  537|      0|        ignoreRounding = true;
  538|      0|    }
  539|       |
  540|       |    // Grouping settings
  541|  21.2k|    auto grouping1 = static_cast<int16_t> (positive.groupingSizes & 0xffff);
  542|  21.2k|    auto grouping2 = static_cast<int16_t> ((positive.groupingSizes >> 16) & 0xffff);
  543|  21.2k|    auto grouping3 = static_cast<int16_t> ((positive.groupingSizes >> 32) & 0xffff);
  544|  21.2k|    if (grouping2 != -1) {
  ------------------
  |  Branch (544:9): [True: 21.2k, False: 2]
  ------------------
  545|  21.2k|        properties.groupingSize = grouping1;
  546|  21.2k|        properties.groupingUsed = true;
  547|  21.2k|    } else {
  548|      2|        properties.groupingSize = -1;
  549|      2|        properties.groupingUsed = false;
  550|      2|    }
  551|  21.2k|    if (grouping3 != -1) {
  ------------------
  |  Branch (551:9): [True: 0, False: 21.2k]
  ------------------
  552|      0|        properties.secondaryGroupingSize = grouping2;
  553|  21.2k|    } else {
  554|  21.2k|        properties.secondaryGroupingSize = -1;
  555|  21.2k|    }
  556|       |
  557|       |    // For backwards compatibility, require that the pattern emit at least one min digit.
  558|  21.2k|    int minInt, minFrac;
  559|  21.2k|    if (positive.integerTotal == 0 && positive.fractionTotal > 0) {
  ------------------
  |  Branch (559:9): [True: 0, False: 21.2k]
  |  Branch (559:39): [True: 0, False: 0]
  ------------------
  560|       |        // patterns like ".##"
  561|      0|        minInt = 0;
  562|      0|        minFrac = uprv_max(1, positive.fractionNumerals);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  563|  21.2k|    } else if (positive.integerNumerals == 0 && positive.fractionNumerals == 0) {
  ------------------
  |  Branch (563:16): [True: 0, False: 21.2k]
  |  Branch (563:49): [True: 0, False: 0]
  ------------------
  564|       |        // patterns like "#.##"
  565|      0|        minInt = 1;
  566|      0|        minFrac = 0;
  567|  21.2k|    } else {
  568|  21.2k|        minInt = positive.integerNumerals;
  569|  21.2k|        minFrac = positive.fractionNumerals;
  570|  21.2k|    }
  571|       |
  572|       |    // Rounding settings
  573|       |    // Don't set basic rounding when there is a currency sign; defer to CurrencyUsage
  574|  21.2k|    if (positive.integerAtSigns > 0) {
  ------------------
  |  Branch (574:9): [True: 0, False: 21.2k]
  ------------------
  575|      0|        properties.minimumFractionDigits = -1;
  576|      0|        properties.maximumFractionDigits = -1;
  577|      0|        properties.roundingIncrement = 0.0;
  578|      0|        properties.minimumSignificantDigits = positive.integerAtSigns;
  579|      0|        properties.maximumSignificantDigits = positive.integerAtSigns + positive.integerTrailingHashSigns;
  580|  21.2k|    } else if (!positive.rounding.isZeroish()) {
  ------------------
  |  Branch (580:16): [True: 0, False: 21.2k]
  ------------------
  581|      0|        if (!ignoreRounding) {
  ------------------
  |  Branch (581:13): [True: 0, False: 0]
  ------------------
  582|      0|            properties.minimumFractionDigits = minFrac;
  583|      0|            properties.maximumFractionDigits = positive.fractionTotal;
  584|      0|            properties.roundingIncrement = positive.rounding.toDouble();
  585|      0|        } else {
  586|      0|            properties.minimumFractionDigits = -1;
  587|      0|            properties.maximumFractionDigits = -1;
  588|      0|            properties.roundingIncrement = 0.0;
  589|      0|        }
  590|      0|        properties.minimumSignificantDigits = -1;
  591|      0|        properties.maximumSignificantDigits = -1;
  592|  21.2k|    } else {
  593|  21.2k|        if (!ignoreRounding) {
  ------------------
  |  Branch (593:13): [True: 21.2k, False: 0]
  ------------------
  594|  21.2k|            properties.minimumFractionDigits = minFrac;
  595|  21.2k|            properties.maximumFractionDigits = positive.fractionTotal;
  596|  21.2k|            properties.roundingIncrement = 0.0;
  597|  21.2k|        } else {
  598|      0|            properties.minimumFractionDigits = -1;
  599|      0|            properties.maximumFractionDigits = -1;
  600|      0|            properties.roundingIncrement = 0.0;
  601|      0|        }
  602|  21.2k|        properties.minimumSignificantDigits = -1;
  603|  21.2k|        properties.maximumSignificantDigits = -1;
  604|  21.2k|    }
  605|       |
  606|       |    // If the pattern ends with a '.' then force the decimal point.
  607|  21.2k|    if (positive.hasDecimal && positive.fractionTotal == 0) {
  ------------------
  |  Branch (607:9): [True: 2, False: 21.2k]
  |  Branch (607:32): [True: 0, False: 2]
  ------------------
  608|      0|        properties.decimalSeparatorAlwaysShown = true;
  609|  21.2k|    } else {
  610|  21.2k|        properties.decimalSeparatorAlwaysShown = false;
  611|  21.2k|    }
  612|       |
  613|       |    // Persist the currency as decimal separator
  614|  21.2k|    properties.currencyAsDecimal = positive.hasCurrencyDecimal;
  615|       |
  616|       |    // Scientific notation settings
  617|  21.2k|    if (positive.exponentZeros > 0) {
  ------------------
  |  Branch (617:9): [True: 0, False: 21.2k]
  ------------------
  618|      0|        properties.exponentSignAlwaysShown = positive.exponentHasPlusSign;
  619|      0|        properties.minimumExponentDigits = positive.exponentZeros;
  620|      0|        if (positive.integerAtSigns == 0) {
  ------------------
  |  Branch (620:13): [True: 0, False: 0]
  ------------------
  621|       |            // patterns without '@' can define max integer digits, used for engineering notation
  622|      0|            properties.minimumIntegerDigits = positive.integerNumerals;
  623|      0|            properties.maximumIntegerDigits = positive.integerTotal;
  624|      0|        } else {
  625|       |            // patterns with '@' cannot define max integer digits
  626|      0|            properties.minimumIntegerDigits = 1;
  627|      0|            properties.maximumIntegerDigits = -1;
  628|      0|        }
  629|  21.2k|    } else {
  630|  21.2k|        properties.exponentSignAlwaysShown = false;
  631|  21.2k|        properties.minimumExponentDigits = -1;
  632|  21.2k|        properties.minimumIntegerDigits = minInt;
  633|  21.2k|        properties.maximumIntegerDigits = -1;
  634|  21.2k|    }
  635|       |
  636|       |    // Compute the affix patterns (required for both padding and affixes)
  637|  21.2k|    UnicodeString posPrefix = patternInfo.getString(AffixPatternProvider::AFFIX_PREFIX);
  638|  21.2k|    UnicodeString posSuffix = patternInfo.getString(0);
  639|       |
  640|       |    // Padding settings
  641|  21.2k|    if (positive.hasPadding) {
  ------------------
  |  Branch (641:9): [True: 0, False: 21.2k]
  ------------------
  642|       |        // The width of the positive prefix and suffix templates are included in the padding
  643|      0|        int paddingWidth = positive.widthExceptAffixes +
  644|      0|                           AffixUtils::estimateLength(posPrefix, status) +
  645|      0|                           AffixUtils::estimateLength(posSuffix, status);
  646|      0|        properties.formatWidth = paddingWidth;
  647|      0|        UnicodeString rawPaddingString = patternInfo.getString(AffixPatternProvider::AFFIX_PADDING);
  648|      0|        if (rawPaddingString.length() == 1) {
  ------------------
  |  Branch (648:13): [True: 0, False: 0]
  ------------------
  649|      0|            properties.padString = rawPaddingString;
  650|      0|        } else if (rawPaddingString.length() == 2) {
  ------------------
  |  Branch (650:20): [True: 0, False: 0]
  ------------------
  651|      0|            if (rawPaddingString.charAt(0) == u'\'') {
  ------------------
  |  Branch (651:17): [True: 0, False: 0]
  ------------------
  652|      0|                properties.padString.setTo(u"'", -1);
  653|      0|            } else {
  654|      0|                properties.padString = rawPaddingString;
  655|      0|            }
  656|      0|        } else {
  657|      0|            properties.padString = UnicodeString(rawPaddingString, 1, rawPaddingString.length() - 2);
  658|      0|        }
  659|      0|        properties.padPosition = positive.paddingLocation;
  660|  21.2k|    } else {
  661|  21.2k|        properties.formatWidth = -1;
  662|  21.2k|        properties.padString.setToBogus();
  663|  21.2k|        properties.padPosition.nullify();
  664|  21.2k|    }
  665|       |
  666|       |    // Set the affixes
  667|       |    // Always call the setter, even if the prefixes are empty, especially in the case of the
  668|       |    // negative prefix pattern, to prevent default values from overriding the pattern.
  669|  21.2k|    properties.positivePrefixPattern = posPrefix;
  670|  21.2k|    properties.positiveSuffixPattern = posSuffix;
  671|  21.2k|    if (patternInfo.fHasNegativeSubpattern) {
  ------------------
  |  Branch (671:9): [True: 0, False: 21.2k]
  ------------------
  672|      0|        properties.negativePrefixPattern = patternInfo.getString(
  673|      0|                AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN | AffixPatternProvider::AFFIX_PREFIX);
  674|      0|        properties.negativeSuffixPattern = patternInfo.getString(
  675|      0|                AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN);
  676|  21.2k|    } else {
  677|  21.2k|        properties.negativePrefixPattern.setToBogus();
  678|  21.2k|        properties.negativeSuffixPattern.setToBogus();
  679|  21.2k|    }
  680|       |
  681|       |    // Set the magnitude multiplier
  682|  21.2k|    if (positive.hasPercentSign) {
  ------------------
  |  Branch (682:9): [True: 0, False: 21.2k]
  ------------------
  683|      0|        properties.magnitudeMultiplier = 2;
  684|  21.2k|    } else if (positive.hasPerMilleSign) {
  ------------------
  |  Branch (684:16): [True: 0, False: 21.2k]
  ------------------
  685|      0|        properties.magnitudeMultiplier = 3;
  686|  21.2k|    } else {
  687|  21.2k|        properties.magnitudeMultiplier = 0;
  688|  21.2k|    }
  689|  21.2k|}
_ZN6icu_786number4impl18PatternStringUtils26patternInfoToStringBuilderERKNS1_20AffixPatternProviderEbNS1_15PatternSignTypeEbNS_14StandardPlural4FormEbbRNS_13UnicodeStringE:
 1061|   449k|                                                    UnicodeString& output) {
 1062|       |
 1063|       |    // Should the output render '+' where '-' would normally appear in the pattern?
 1064|   449k|    bool plusReplacesMinusSign = (patternSignType == PATTERN_SIGN_TYPE_POS_SIGN)
  ------------------
  |  Branch (1064:34): [True: 112k, False: 336k]
  ------------------
 1065|   449k|        && !patternInfo.positiveHasPlusSign();
  ------------------
  |  Branch (1065:12): [True: 112k, False: 0]
  ------------------
 1066|       |
 1067|       |    // Should we use the affix from the negative subpattern?
 1068|       |    // (If not, we will use the positive subpattern.)
 1069|   449k|    bool useNegativeAffixPattern = patternInfo.hasNegativeSubpattern()
  ------------------
  |  Branch (1069:36): [True: 0, False: 449k]
  ------------------
 1070|   449k|        && (patternSignType == PATTERN_SIGN_TYPE_NEG
  ------------------
  |  Branch (1070:13): [True: 0, False: 0]
  ------------------
 1071|      0|            || (patternInfo.negativeHasMinusSign() && (plusReplacesMinusSign || approximately)));
  ------------------
  |  Branch (1071:17): [True: 0, False: 0]
  |  Branch (1071:56): [True: 0, False: 0]
  |  Branch (1071:81): [True: 0, False: 0]
  ------------------
 1072|       |
 1073|       |    // Resolve the flags for the affix pattern.
 1074|   449k|    int flags = 0;
 1075|   449k|    if (useNegativeAffixPattern) {
  ------------------
  |  Branch (1075:9): [True: 0, False: 449k]
  ------------------
 1076|      0|        flags |= AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN;
 1077|      0|    }
 1078|   449k|    if (isPrefix) {
  ------------------
  |  Branch (1078:9): [True: 224k, False: 224k]
  ------------------
 1079|   224k|        flags |= AffixPatternProvider::AFFIX_PREFIX;
 1080|   224k|    }
 1081|   449k|    if (plural != StandardPlural::Form::COUNT) {
  ------------------
  |  Branch (1081:9): [True: 0, False: 449k]
  ------------------
 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|   449k|    bool prependSign;
 1088|   449k|    if (!isPrefix || useNegativeAffixPattern) {
  ------------------
  |  Branch (1088:9): [True: 224k, False: 224k]
  |  Branch (1088:22): [True: 0, False: 224k]
  ------------------
 1089|   224k|        prependSign = false;
 1090|   224k|    } else if (patternSignType == PATTERN_SIGN_TYPE_NEG) {
  ------------------
  |  Branch (1090:16): [True: 56.1k, False: 168k]
  ------------------
 1091|  56.1k|        prependSign = true;
 1092|   168k|    } else {
 1093|   168k|        prependSign = plusReplacesMinusSign || approximately;
  ------------------
  |  Branch (1093:23): [True: 56.1k, False: 112k]
  |  Branch (1093:48): [True: 0, False: 112k]
  ------------------
 1094|   168k|    }
 1095|       |
 1096|       |    // What symbols should take the place of the sign placeholder?
 1097|   449k|    const char16_t* signSymbols = u"-";
 1098|   449k|    if (approximately) {
  ------------------
  |  Branch (1098:9): [True: 0, False: 449k]
  ------------------
 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|   449k|    } else if (plusReplacesMinusSign) {
  ------------------
  |  Branch (1106:16): [True: 112k, False: 336k]
  ------------------
 1107|   112k|        signSymbols = u"+";
 1108|   112k|    }
 1109|       |
 1110|       |    // Compute the number of tokens in the affix pattern (signSymbols is considered one token).
 1111|   449k|    int length = patternInfo.length(flags) + (prependSign ? 1 : 0);
  ------------------
  |  Branch (1111:47): [True: 112k, False: 336k]
  ------------------
 1112|       |
 1113|       |    // Finally, set the result into the StringBuilder.
 1114|   449k|    output.remove();
 1115|   561k|    for (int index = 0; index < length; index++) {
  ------------------
  |  Branch (1115:25): [True: 112k, False: 449k]
  ------------------
 1116|   112k|        char16_t candidate;
 1117|   112k|        if (prependSign && index == 0) {
  ------------------
  |  Branch (1117:13): [True: 112k, False: 0]
  |  Branch (1117:28): [True: 112k, False: 0]
  ------------------
 1118|   112k|            candidate = u'-';
 1119|   112k|        } else if (prependSign) {
  ------------------
  |  Branch (1119:20): [True: 0, False: 0]
  ------------------
 1120|      0|            candidate = patternInfo.charAt(flags, index - 1);
 1121|      0|        } else {
 1122|      0|            candidate = patternInfo.charAt(flags, index);
 1123|      0|        }
 1124|   112k|        if (candidate == u'-') {
  ------------------
  |  Branch (1124:13): [True: 112k, False: 0]
  ------------------
 1125|   112k|            if (u_strlen(signSymbols) == 1) {
  ------------------
  |  |  393|   112k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1125:17): [True: 112k, False: 0]
  ------------------
 1126|   112k|                candidate = signSymbols[0];
 1127|   112k|            } else {
 1128|      0|                output.append(signSymbols[0]);
 1129|      0|                candidate = signSymbols[1];
 1130|      0|            }
 1131|   112k|        }
 1132|   112k|        if (perMilleReplacesPercent && candidate == u'%') {
  ------------------
  |  Branch (1132:13): [True: 0, False: 112k]
  |  Branch (1132:40): [True: 0, False: 0]
  ------------------
 1133|      0|            candidate = u'‰';
 1134|      0|        }
 1135|   112k|        if (dropCurrencySymbols && candidate == u'\u00A4') {
  ------------------
  |  Branch (1135:13): [True: 0, False: 112k]
  |  Branch (1135:36): [True: 0, False: 0]
  ------------------
 1136|      0|            continue;
 1137|      0|        }
 1138|   112k|        output.append(candidate);
 1139|   112k|    }
 1140|   449k|}
_ZN6icu_786number4impl18PatternStringUtils18resolveSignDisplayE18UNumberSignDisplayNS1_6SignumE:
 1142|   449k|PatternSignType PatternStringUtils::resolveSignDisplay(UNumberSignDisplay signDisplay, Signum signum) {
 1143|   449k|    switch (signDisplay) {
 1144|      0|        case UNUM_SIGN_AUTO:
  ------------------
  |  Branch (1144:9): [True: 0, False: 449k]
  ------------------
 1145|      0|        case UNUM_SIGN_ACCOUNTING:
  ------------------
  |  Branch (1145:9): [True: 0, False: 449k]
  ------------------
 1146|      0|            switch (signum) {
 1147|      0|                case SIGNUM_NEG:
  ------------------
  |  Branch (1147:17): [True: 0, False: 0]
  ------------------
 1148|      0|                case SIGNUM_NEG_ZERO:
  ------------------
  |  Branch (1148:17): [True: 0, False: 0]
  ------------------
 1149|      0|                    return PATTERN_SIGN_TYPE_NEG;
 1150|      0|                case SIGNUM_POS_ZERO:
  ------------------
  |  Branch (1150:17): [True: 0, False: 0]
  ------------------
 1151|      0|                case SIGNUM_POS:
  ------------------
  |  Branch (1151:17): [True: 0, False: 0]
  ------------------
 1152|      0|                    return PATTERN_SIGN_TYPE_POS;
 1153|      0|                default:
  ------------------
  |  Branch (1153:17): [True: 0, False: 0]
  ------------------
 1154|      0|                    break;
 1155|      0|            }
 1156|      0|            break;
 1157|       |
 1158|      0|        case UNUM_SIGN_ALWAYS:
  ------------------
  |  Branch (1158:9): [True: 0, False: 449k]
  ------------------
 1159|      0|        case UNUM_SIGN_ACCOUNTING_ALWAYS:
  ------------------
  |  Branch (1159:9): [True: 0, False: 449k]
  ------------------
 1160|      0|            switch (signum) {
 1161|      0|                case SIGNUM_NEG:
  ------------------
  |  Branch (1161:17): [True: 0, False: 0]
  ------------------
 1162|      0|                case SIGNUM_NEG_ZERO:
  ------------------
  |  Branch (1162:17): [True: 0, False: 0]
  ------------------
 1163|      0|                    return PATTERN_SIGN_TYPE_NEG;
 1164|      0|                case SIGNUM_POS_ZERO:
  ------------------
  |  Branch (1164:17): [True: 0, False: 0]
  ------------------
 1165|      0|                case SIGNUM_POS:
  ------------------
  |  Branch (1165:17): [True: 0, False: 0]
  ------------------
 1166|      0|                    return PATTERN_SIGN_TYPE_POS_SIGN;
 1167|      0|                default:
  ------------------
  |  Branch (1167:17): [True: 0, False: 0]
  ------------------
 1168|      0|                    break;
 1169|      0|            }
 1170|      0|            break;
 1171|       |
 1172|   449k|        case UNUM_SIGN_EXCEPT_ZERO:
  ------------------
  |  Branch (1172:9): [True: 449k, False: 0]
  ------------------
 1173|   449k|        case UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO:
  ------------------
  |  Branch (1173:9): [True: 0, False: 449k]
  ------------------
 1174|   449k|            switch (signum) {
 1175|   112k|                case SIGNUM_NEG:
  ------------------
  |  Branch (1175:17): [True: 112k, False: 336k]
  ------------------
 1176|   112k|                    return PATTERN_SIGN_TYPE_NEG;
 1177|   112k|                case SIGNUM_NEG_ZERO:
  ------------------
  |  Branch (1177:17): [True: 112k, False: 336k]
  ------------------
 1178|   224k|                case SIGNUM_POS_ZERO:
  ------------------
  |  Branch (1178:17): [True: 112k, False: 336k]
  ------------------
 1179|   224k|                    return PATTERN_SIGN_TYPE_POS;
 1180|   112k|                case SIGNUM_POS:
  ------------------
  |  Branch (1180:17): [True: 112k, False: 336k]
  ------------------
 1181|   112k|                    return PATTERN_SIGN_TYPE_POS_SIGN;
 1182|      0|                default:
  ------------------
  |  Branch (1182:17): [True: 0, False: 449k]
  ------------------
 1183|      0|                    break;
 1184|   449k|            }
 1185|      0|            break;
 1186|       |
 1187|      0|        case UNUM_SIGN_NEGATIVE:
  ------------------
  |  Branch (1187:9): [True: 0, False: 449k]
  ------------------
 1188|      0|        case UNUM_SIGN_ACCOUNTING_NEGATIVE:
  ------------------
  |  Branch (1188:9): [True: 0, False: 449k]
  ------------------
 1189|      0|            switch (signum) {
 1190|      0|                case SIGNUM_NEG:
  ------------------
  |  Branch (1190:17): [True: 0, False: 0]
  ------------------
 1191|      0|                    return PATTERN_SIGN_TYPE_NEG;
 1192|      0|                case SIGNUM_NEG_ZERO:
  ------------------
  |  Branch (1192:17): [True: 0, False: 0]
  ------------------
 1193|      0|                case SIGNUM_POS_ZERO:
  ------------------
  |  Branch (1193:17): [True: 0, False: 0]
  ------------------
 1194|      0|                case SIGNUM_POS:
  ------------------
  |  Branch (1194:17): [True: 0, False: 0]
  ------------------
 1195|      0|                    return PATTERN_SIGN_TYPE_POS;
 1196|      0|                default:
  ------------------
  |  Branch (1196:17): [True: 0, False: 0]
  ------------------
 1197|      0|                    break;
 1198|      0|            }
 1199|      0|            break;
 1200|       |
 1201|      0|        case UNUM_SIGN_NEVER:
  ------------------
  |  Branch (1201:9): [True: 0, False: 449k]
  ------------------
 1202|      0|            return PATTERN_SIGN_TYPE_POS;
 1203|       |
 1204|      0|        default:
  ------------------
  |  Branch (1204:9): [True: 0, False: 449k]
  ------------------
 1205|      0|            break;
 1206|   449k|    }
 1207|       |
 1208|   449k|    UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
 1209|      0|    return PATTERN_SIGN_TYPE_POS;
 1210|   449k|}

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

_ZN6icu_786number9Precision17constructFractionEii:
  280|   154k|FractionPrecision Precision::constructFraction(int32_t minFrac, int32_t maxFrac) {
  281|   154k|    FractionSignificantSettings settings{};
  282|   154k|    settings.fMinFrac = static_cast<digits_t>(minFrac);
  283|   154k|    settings.fMaxFrac = static_cast<digits_t>(maxFrac);
  284|   154k|    settings.fMinSig = -1;
  285|   154k|    settings.fMaxSig = -1;
  286|   154k|    PrecisionUnion union_{};
  287|   154k|    union_.fracSig = settings;
  288|   154k|    return {RND_FRACTION, union_};
  289|   154k|}

_ZN6icu_786number21SimpleNumberFormatter7cleanupEv:
  123|  56.1k|void SimpleNumberFormatter::cleanup() {
  124|  56.1k|    delete fOwnedSymbols;
  125|  56.1k|    delete fMicros;
  126|  56.1k|    delete fPatternModifier;
  127|  56.1k|    fOwnedSymbols = nullptr;
  128|  56.1k|    fMicros = nullptr;
  129|  56.1k|    fPatternModifier = nullptr;
  130|  56.1k|}
_ZN6icu_786number21SimpleNumberFormatter38forLocaleAndSymbolsAndGroupingStrategyERKNS_6LocaleERKNS_20DecimalFormatSymbolsE23UNumberGroupingStrategyR10UErrorCode:
  158|  56.1k|        UErrorCode &status) {
  159|  56.1k|    SimpleNumberFormatter retval;
  160|  56.1k|    retval.initialize(locale, symbols, groupingStrategy, status);
  161|  56.1k|    return retval;
  162|  56.1k|}
_ZN6icu_786number21SimpleNumberFormatter10initializeERKNS_6LocaleERKNS_20DecimalFormatSymbolsE23UNumberGroupingStrategyR10UErrorCode:
  169|  56.1k|        UErrorCode &status) {
  170|  56.1k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (170:9): [True: 0, False: 56.1k]
  ------------------
  171|      0|        return;
  172|      0|    }
  173|       |
  174|  56.1k|    fMicros = new SimpleMicroProps();
  175|  56.1k|    if (fMicros == nullptr) {
  ------------------
  |  Branch (175:9): [True: 0, False: 56.1k]
  ------------------
  176|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  177|      0|        return;
  178|      0|    }
  179|  56.1k|    fMicros->symbols = &symbols;
  180|       |
  181|  56.1k|    const auto* pattern = utils::getPatternForStyle(
  182|  56.1k|        locale,
  183|  56.1k|        symbols.getNumberingSystemName(),
  184|  56.1k|        CLDR_PATTERN_STYLE_DECIMAL,
  185|  56.1k|        status);
  186|  56.1k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (186:9): [True: 0, False: 56.1k]
  ------------------
  187|      0|        return;
  188|      0|    }
  189|       |
  190|  56.1k|    ParsedPatternInfo patternInfo;
  191|  56.1k|    PatternParser::parseToPatternInfo(UnicodeString(pattern), patternInfo, status);
  192|  56.1k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (192:9): [True: 0, False: 56.1k]
  ------------------
  193|      0|        return;
  194|      0|    }
  195|       |
  196|  56.1k|    auto grouper = Grouper::forStrategy(groupingStrategy);
  197|  56.1k|    grouper.setLocaleData(patternInfo, locale);
  198|  56.1k|    fMicros->grouping = grouper;
  199|       |
  200|  56.1k|    MutablePatternModifier patternModifier(false);
  201|  56.1k|    patternModifier.setPatternInfo(&patternInfo, kUndefinedField);
  202|  56.1k|    patternModifier.setPatternAttributes(UNUM_SIGN_EXCEPT_ZERO, false, false);
  203|  56.1k|    patternModifier.setSymbols(fMicros->symbols, {}, UNUM_UNIT_WIDTH_SHORT, nullptr, status);
  204|       |
  205|  56.1k|    fPatternModifier = new AdoptingSignumModifierStore(patternModifier.createImmutableForPlural(StandardPlural::COUNT, status));
  206|       |
  207|  56.1k|    fGroupingStrategy = groupingStrategy;
  208|  56.1k|}

_ZN6icu_786number4impl14SymbolsWrapperC2EOS2_:
   19|   154k|SymbolsWrapper::SymbolsWrapper(SymbolsWrapper &&src) noexcept {
   20|   154k|    doMoveFrom(std::move(src));
   21|   154k|}
_ZN6icu_786number4impl14SymbolsWrapperaSEOS2_:
   32|   464k|SymbolsWrapper &SymbolsWrapper::operator=(SymbolsWrapper &&src) noexcept {
   33|   464k|    if (this == &src) {
  ------------------
  |  Branch (33:9): [True: 0, False: 464k]
  ------------------
   34|      0|        return *this;
   35|      0|    }
   36|   464k|    doCleanup();
   37|   464k|    doMoveFrom(std::move(src));
   38|   464k|    return *this;
   39|   464k|}
_ZN6icu_786number4impl14SymbolsWrapperD2Ev:
   41|   717k|SymbolsWrapper::~SymbolsWrapper() {
   42|   717k|    doCleanup();
   43|   717k|}
_ZN6icu_786number4impl14SymbolsWrapper5setToERKNS_20DecimalFormatSymbolsE:
   45|   154k|void SymbolsWrapper::setTo(const DecimalFormatSymbols &dfs) {
   46|   154k|    doCleanup();
   47|   154k|    fType = SYMPTR_DFS;
   48|   154k|    fPtr.dfs = new DecimalFormatSymbols(dfs);
   49|   154k|}
_ZN6icu_786number4impl14SymbolsWrapper10doMoveFromEOS2_:
   82|   618k|void SymbolsWrapper::doMoveFrom(SymbolsWrapper &&src) {
   83|   618k|    fType = src.fType;
   84|   618k|    switch (fType) {
  ------------------
  |  Branch (84:13): [True: 0, False: 618k]
  ------------------
   85|   154k|    case SYMPTR_NONE:
  ------------------
  |  Branch (85:5): [True: 154k, False: 464k]
  ------------------
   86|       |        // No action necessary
   87|   154k|        break;
   88|   464k|    case SYMPTR_DFS:
  ------------------
  |  Branch (88:5): [True: 464k, False: 154k]
  ------------------
   89|   464k|        fPtr.dfs = src.fPtr.dfs;
   90|   464k|        src.fPtr.dfs = nullptr;
   91|   464k|        break;
   92|      0|    case SYMPTR_NS:
  ------------------
  |  Branch (92:5): [True: 0, False: 618k]
  ------------------
   93|      0|        fPtr.ns = src.fPtr.ns;
   94|      0|        src.fPtr.ns = nullptr;
   95|      0|        break;
   96|   618k|    }
   97|   618k|}
_ZN6icu_786number4impl14SymbolsWrapper9doCleanupEv:
   99|  1.33M|void SymbolsWrapper::doCleanup() {
  100|  1.33M|    switch (fType) {
  ------------------
  |  Branch (100:13): [True: 0, False: 1.33M]
  ------------------
  101|   717k|    case SYMPTR_NONE:
  ------------------
  |  Branch (101:5): [True: 717k, False: 618k]
  ------------------
  102|       |        // No action necessary
  103|   717k|        break;
  104|   618k|    case SYMPTR_DFS:
  ------------------
  |  Branch (104:5): [True: 618k, False: 717k]
  ------------------
  105|   618k|        delete fPtr.dfs;
  106|   618k|        break;
  107|      0|    case SYMPTR_NS:
  ------------------
  |  Branch (107:5): [True: 0, False: 1.33M]
  ------------------
  108|      0|        delete fPtr.ns;
  109|      0|        break;
  110|  1.33M|    }
  111|  1.33M|}
_ZNK6icu_786number4impl14SymbolsWrapper23getDecimalFormatSymbolsEv:
  121|   344k|const DecimalFormatSymbols *SymbolsWrapper::getDecimalFormatSymbols() const {
  122|   344k|    U_ASSERT(fType == SYMPTR_DFS);
  ------------------
  |  |   35|   344k|#   define U_ASSERT(exp) (void)0
  ------------------
  123|   344k|    return fPtr.dfs;
  124|   344k|}

_ZN6icu_786number4impl19MicroPropsGeneratorD2Ev:
  277|  56.1k|    virtual ~MicroPropsGenerator() = default;
_ZN6icu_786number4impl13NullableValueINS_12CurrencyUnitEEC2ERKS4_:
  316|  77.3k|    NullableValue(const NullableValue<T>& other) = default;
_ZNK6icu_786number4impl13NullableValueINS_12CurrencyUnitEE6isNullEv:
  347|   154k|    bool isNull() const {
  348|   154k|        return fNull;
  349|   154k|    }
_ZNK6icu_786number4impl13NullableValueI14UCurrencyUsageE6isNullEv:
  347|   309k|    bool isNull() const {
  348|   309k|        return fNull;
  349|   309k|    }
_ZNK6icu_786number4impl13NullableValueI25UNumberFormatRoundingModeE12getOrDefaultES3_:
  362|   154k|    T getOrDefault(T defaultValue) const {
  363|   154k|        return fNull ? defaultValue : fValue;
  ------------------
  |  Branch (363:16): [True: 154k, False: 0]
  ------------------
  364|   154k|    }
_ZNK6icu_786number4impl13NullableValueI19UNumberCompactStyleE6isNullEv:
  347|   154k|    bool isNull() const {
  348|   154k|        return fNull;
  349|   154k|    }
_ZN6icu_786number4impl13NullableValueINS_12CurrencyUnitEEaSERKS3_:
  331|   154k|    NullableValue<T>& operator=(const T& other) {
  332|   154k|        fValue = other;
  333|   154k|        fNull = false;
  334|   154k|        return *this;
  335|   154k|    }
_ZN6icu_786number4impl13NullableValueI25UNumberFormatRoundingModeEaSERKS3_:
  331|   154k|    NullableValue<T>& operator=(const T& other) {
  332|   154k|        fValue = other;
  333|   154k|        fNull = false;
  334|   154k|        return *this;
  335|   154k|    }
_ZN6icu_786number4impl13NullableValueI24UNumberFormatPadPositionE7nullifyEv:
  342|   141k|    void nullify() {
  343|       |        // TODO: It might be nice to call the destructor here.
  344|   141k|        fNull = true;
  345|   141k|    }
_ZNK6icu_786number4impl13NullableValueINS_12CurrencyUnitEE3getER10UErrorCode:
  351|   154k|    T get(UErrorCode& status) const {
  352|   154k|        if (fNull) {
  ------------------
  |  Branch (352:13): [True: 0, False: 154k]
  ------------------
  353|      0|            status = U_UNDEFINED_VARIABLE;
  354|      0|        }
  355|   154k|        return fValue;
  356|   154k|    }
_ZN6icu_786number4impl13NullableValueI19UNumberCompactStyleEC2Ev:
  314|   119k|            : fNull(true) {}
_ZN6icu_786number4impl13NullableValueINS_12CurrencyUnitEEC2Ev:
  314|   119k|            : fNull(true) {}
_ZN6icu_786number4impl13NullableValueI14UCurrencyUsageEC2Ev:
  314|   119k|            : fNull(true) {}
_ZN6icu_786number4impl13NullableValueI24UNumberFormatPadPositionEC2Ev:
  314|   119k|            : fNull(true) {}
_ZN6icu_786number4impl13NullableValueINS1_9ParseModeEEC2Ev:
  314|   119k|            : fNull(true) {}
_ZN6icu_786number4impl13NullableValueI25UNumberFormatRoundingModeEC2Ev:
  314|   119k|            : fNull(true) {}
_ZN6icu_786number4impl13NullableValueI19UNumberCompactStyleE7nullifyEv:
  342|   119k|    void nullify() {
  343|       |        // TODO: It might be nice to call the destructor here.
  344|   119k|        fNull = true;
  345|   119k|    }
_ZN6icu_786number4impl13NullableValueINS_12CurrencyUnitEE7nullifyEv:
  342|   119k|    void nullify() {
  343|       |        // TODO: It might be nice to call the destructor here.
  344|   119k|        fNull = true;
  345|   119k|    }
_ZN6icu_786number4impl13NullableValueI14UCurrencyUsageE7nullifyEv:
  342|   119k|    void nullify() {
  343|       |        // TODO: It might be nice to call the destructor here.
  344|   119k|        fNull = true;
  345|   119k|    }
_ZN6icu_786number4impl13NullableValueINS1_9ParseModeEE7nullifyEv:
  342|   119k|    void nullify() {
  343|       |        // TODO: It might be nice to call the destructor here.
  344|   119k|        fNull = true;
  345|   119k|    }
_ZN6icu_786number4impl13NullableValueI25UNumberFormatRoundingModeE7nullifyEv:
  342|   119k|    void nullify() {
  343|       |        // TODO: It might be nice to call the destructor here.
  344|   119k|        fNull = true;
  345|   119k|    }
_ZNK6icu_786number4impl13NullableValueI19UNumberCompactStyleEeqERKS4_:
  337|   154k|    bool operator==(const NullableValue& other) const {
  338|       |        // "fValue == other.fValue" returns UBool, not bool (causes compiler warnings)
  339|   154k|        return fNull ? other.fNull : (other.fNull ? false : static_cast<bool>(fValue == other.fValue));
  ------------------
  |  Branch (339:16): [True: 154k, False: 0]
  |  Branch (339:39): [True: 0, False: 0]
  ------------------
  340|   154k|    }
_ZNK6icu_786number4impl13NullableValueINS_12CurrencyUnitEEeqERKS4_:
  337|   154k|    bool operator==(const NullableValue& other) const {
  338|       |        // "fValue == other.fValue" returns UBool, not bool (causes compiler warnings)
  339|   154k|        return fNull ? other.fNull : (other.fNull ? false : static_cast<bool>(fValue == other.fValue));
  ------------------
  |  Branch (339:16): [True: 154k, False: 0]
  |  Branch (339:39): [True: 0, False: 0]
  ------------------
  340|   154k|    }
_ZNK6icu_786number4impl13NullableValueI14UCurrencyUsageEeqERKS4_:
  337|   154k|    bool operator==(const NullableValue& other) const {
  338|       |        // "fValue == other.fValue" returns UBool, not bool (causes compiler warnings)
  339|   154k|        return fNull ? other.fNull : (other.fNull ? false : static_cast<bool>(fValue == other.fValue));
  ------------------
  |  Branch (339:16): [True: 154k, False: 0]
  |  Branch (339:39): [True: 0, False: 0]
  ------------------
  340|   154k|    }
_ZNK6icu_786number4impl13NullableValueI24UNumberFormatPadPositionEeqERKS4_:
  337|   154k|    bool operator==(const NullableValue& other) const {
  338|       |        // "fValue == other.fValue" returns UBool, not bool (causes compiler warnings)
  339|   154k|        return fNull ? other.fNull : (other.fNull ? false : static_cast<bool>(fValue == other.fValue));
  ------------------
  |  Branch (339:16): [True: 154k, False: 0]
  |  Branch (339:39): [True: 0, False: 0]
  ------------------
  340|   154k|    }
_ZNK6icu_786number4impl13NullableValueI25UNumberFormatRoundingModeEeqERKS4_:
  337|   154k|    bool operator==(const NullableValue& other) const {
  338|       |        // "fValue == other.fValue" returns UBool, not bool (causes compiler warnings)
  339|   154k|        return fNull ? other.fNull : (other.fNull ? false : static_cast<bool>(fValue == other.fValue));
  ------------------
  |  Branch (339:16): [True: 154k, False: 0]
  |  Branch (339:39): [True: 0, False: 0]
  ------------------
  340|   154k|    }

_ZN6icu_786number4impl10StringPropC2EOS2_:
   63|   309k|StringProp::StringProp(StringProp &&src) noexcept : fValue(src.fValue),
   64|   309k|                                                      fLength(src.fLength),
   65|   309k|                                                      fError(src.fError) {
   66|       |    // Take ownership away from src if necessary
   67|   309k|    src.fValue = nullptr;
   68|   309k|}
_ZN6icu_786number4impl10StringPropaSEOS2_:
   71|   928k|StringProp &StringProp::operator=(StringProp &&src) noexcept {
   72|   928k|    if (this == &src) {
  ------------------
  |  Branch (72:9): [True: 0, False: 928k]
  ------------------
   73|      0|        return *this;
   74|      0|    }
   75|   928k|    if (fValue != nullptr) {
  ------------------
  |  Branch (75:9): [True: 0, False: 928k]
  ------------------
   76|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   77|      0|    }
   78|   928k|    fValue = src.fValue;
   79|   928k|    fLength = src.fLength;
   80|   928k|    fError = src.fError;
   81|       |    // Take ownership away from src if necessary
   82|   928k|    src.fValue = nullptr;
   83|   928k|    return *this;
   84|   928k|}
_ZN6icu_786number4impl10StringPropD2Ev:
   86|  1.43M|StringProp::~StringProp() {
   87|  1.43M|    if (fValue != nullptr) {
  ------------------
  |  Branch (87:9): [True: 0, False: 1.43M]
  ------------------
   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|  1.43M|}

_ZN6icu_786number4impl5utils18getPatternForStyleERKNS_6LocaleEPKcNS1_16CldrPatternStyleER10UErrorCode:
   53|  56.1k|                                          UErrorCode& status) {
   54|  56.1k|    const char* patternKey;
   55|  56.1k|    switch (style) {
   56|  56.1k|        case CLDR_PATTERN_STYLE_DECIMAL:
  ------------------
  |  Branch (56:9): [True: 56.1k, False: 0]
  ------------------
   57|  56.1k|            patternKey = "decimalFormat";
   58|  56.1k|            break;
   59|      0|        case CLDR_PATTERN_STYLE_CURRENCY:
  ------------------
  |  Branch (59:9): [True: 0, False: 56.1k]
  ------------------
   60|      0|            patternKey = "currencyFormat";
   61|      0|            break;
   62|      0|        case CLDR_PATTERN_STYLE_ACCOUNTING:
  ------------------
  |  Branch (62:9): [True: 0, False: 56.1k]
  ------------------
   63|      0|            patternKey = "accountingFormat";
   64|      0|            break;
   65|      0|        case CLDR_PATTERN_STYLE_PERCENT:
  ------------------
  |  Branch (65:9): [True: 0, False: 56.1k]
  ------------------
   66|      0|            patternKey = "percentFormat";
   67|      0|            break;
   68|      0|        case CLDR_PATTERN_STYLE_SCIENTIFIC:
  ------------------
  |  Branch (68:9): [True: 0, False: 56.1k]
  ------------------
   69|      0|            patternKey = "scientificFormat";
   70|      0|            break;
   71|      0|        default:
  ------------------
  |  Branch (71:9): [True: 0, False: 56.1k]
  ------------------
   72|      0|            patternKey = "decimalFormat"; // silence compiler error
   73|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
   74|  56.1k|    }
   75|  56.1k|    LocalUResourceBundlePointer res(ures_open(nullptr, locale.getName(), &status));
  ------------------
  |  | 1691|  56.1k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  56.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  56.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  56.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   76|  56.1k|    if (U_FAILURE(status)) { return u""; }
  ------------------
  |  Branch (76:9): [True: 0, False: 56.1k]
  ------------------
   77|       |
   78|       |    // Attempt to get the pattern with the native numbering system.
   79|  56.1k|    UErrorCode localStatus = U_ZERO_ERROR;
   80|  56.1k|    const char16_t* pattern;
   81|  56.1k|    pattern = doGetPattern(res.getAlias(), nsName, patternKey, status, localStatus);
   82|  56.1k|    if (U_FAILURE(status)) { return u""; }
  ------------------
  |  Branch (82:9): [True: 0, False: 56.1k]
  ------------------
   83|       |
   84|       |    // Fall back to latn if native numbering system does not have the right pattern
   85|  56.1k|    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: 56.1k]
  |  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|  56.1k|    return pattern;
   92|  56.1k|}
number_utils.cpp:_ZN12_GLOBAL__N_112doGetPatternEP15UResourceBundlePKcS3_R10UErrorCodeS5_:
   36|  56.1k|             UErrorCode& localStatus) {
   37|       |    // Construct the path into the resource bundle
   38|  56.1k|    CharString key;
   39|  56.1k|    key.append("NumberElements/", publicStatus);
   40|  56.1k|    key.append(nsName, publicStatus);
   41|  56.1k|    key.append("/patterns/", publicStatus);
   42|  56.1k|    key.append(patternKey, publicStatus);
   43|  56.1k|    if (U_FAILURE(publicStatus)) {
  ------------------
  |  Branch (43:9): [True: 0, False: 56.1k]
  ------------------
   44|      0|        return u"";
   45|      0|    }
   46|  56.1k|    return ures_getStringByKeyWithFallback(res, key.data(), nullptr, &localStatus);
  ------------------
  |  | 1678|  56.1k|#define ures_getStringByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getStringByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  56.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  56.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  56.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   47|  56.1k|}

_ZN6icu_7812NumberFormatC2Ev:
  232|  42.4k|:   fGroupingUsed(true),
  233|  42.4k|    fMaxIntegerDigits(gDefaultMaxIntegerDigits),
  234|  42.4k|    fMinIntegerDigits(1),
  235|  42.4k|    fMaxFractionDigits(3), // invariant, >= minFractionDigits
  236|  42.4k|    fMinFractionDigits(0),
  237|  42.4k|    fParseIntegerOnly(false),
  238|  42.4k|    fLenient(false),
  239|  42.4k|    fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
  240|  42.4k|{
  241|  42.4k|    fCurrency[0] = 0;
  242|  42.4k|}
_ZN6icu_7812NumberFormatD2Ev:
  247|   119k|{
  248|   119k|}
_ZN6icu_7818SharedNumberFormatD2Ev:
  250|      1|SharedNumberFormat::~SharedNumberFormat() {
  251|      1|    delete ptr;
  252|      1|}
_ZN6icu_7812NumberFormatC2ERKS0_:
  258|  77.3k|:   Format(source)
  259|  77.3k|{
  260|  77.3k|    *this = source;
  261|  77.3k|}
_ZN6icu_7812NumberFormataSERKS0_:
  268|  77.3k|{
  269|  77.3k|    if (this != &rhs)
  ------------------
  |  Branch (269:9): [True: 77.3k, False: 0]
  ------------------
  270|  77.3k|    {
  271|  77.3k|        Format::operator=(rhs);
  272|  77.3k|        fGroupingUsed = rhs.fGroupingUsed;
  273|  77.3k|        fMaxIntegerDigits = rhs.fMaxIntegerDigits;
  274|  77.3k|        fMinIntegerDigits = rhs.fMinIntegerDigits;
  275|  77.3k|        fMaxFractionDigits = rhs.fMaxFractionDigits;
  276|  77.3k|        fMinFractionDigits = rhs.fMinFractionDigits;
  277|  77.3k|        fParseIntegerOnly = rhs.fParseIntegerOnly;
  278|  77.3k|        u_strncpy(fCurrency, rhs.fCurrency, 3);
  ------------------
  |  |  398|  77.3k|#define u_strncpy U_ICU_ENTRY_POINT_RENAME(u_strncpy)
  |  |  ------------------
  |  |  |  |  123|  77.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  77.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  77.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  279|  77.3k|        fCurrency[3] = 0;
  280|  77.3k|        fLenient = rhs.fLenient;
  281|  77.3k|        fCapitalizationContext = rhs.fCapitalizationContext;
  282|  77.3k|    }
  283|  77.3k|    return *this;
  284|  77.3k|}
_ZN6icu_7812NumberFormat19setParseIntegerOnlyEa:
  756|  56.1k|{
  757|  56.1k|    fParseIntegerOnly = value;
  758|  56.1k|}
_ZN6icu_7812NumberFormat14createInstanceERKNS_6LocaleER10UErrorCode:
  783|  77.3k|{
  784|  77.3k|    return createInstance(inLocale, UNUM_DECIMAL, status);
  785|  77.3k|}
_ZN6icu_7812NumberFormat22internalCreateInstanceERKNS_6LocaleE18UNumberFormatStyleR10UErrorCode:
 1038|      2|NumberFormat::internalCreateInstance(const Locale& loc, UNumberFormatStyle kind, UErrorCode& status) {
 1039|      2|    if (kind == UNUM_CURRENCY) {
  ------------------
  |  Branch (1039:9): [True: 0, False: 2]
  ------------------
 1040|      0|        char cfKeyValue[kKeyValueLenMax] = {0};
 1041|      0|        UErrorCode kvStatus = U_ZERO_ERROR;
 1042|      0|        int32_t kLen = loc.getKeywordValue("cf", cfKeyValue, kKeyValueLenMax, kvStatus);
 1043|      0|        if (U_SUCCESS(kvStatus) && kLen > 0 && uprv_strcmp(cfKeyValue,"account")==0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1043:13): [True: 0, False: 0]
  |  Branch (1043:36): [True: 0, False: 0]
  |  Branch (1043:48): [True: 0, False: 0]
  ------------------
 1044|      0|            kind = UNUM_CURRENCY_ACCOUNTING;
 1045|      0|        }
 1046|      0|    }
 1047|      2|#if !UCONFIG_NO_SERVICE
 1048|      2|    if (haveService()) {
  ------------------
  |  Branch (1048:9): [True: 0, False: 2]
  ------------------
 1049|      0|        return (NumberFormat*)gService->get(loc, kind, status);
 1050|      0|    }
 1051|      2|#endif
 1052|      2|    return makeInstance(loc, kind, status);
 1053|      2|}
_ZN6icu_7812NumberFormat14createInstanceERKNS_6LocaleE18UNumberFormatStyleR10UErrorCode:
 1056|  77.3k|NumberFormat::createInstance(const Locale& loc, UNumberFormatStyle kind, UErrorCode& status) {
 1057|  77.3k|    if (kind != UNUM_DECIMAL) {
  ------------------
  |  Branch (1057:9): [True: 0, False: 77.3k]
  ------------------
 1058|      0|        return internalCreateInstance(loc, kind, status);
 1059|      0|    }
 1060|  77.3k|    const SharedNumberFormat *shared = createSharedInstance(loc, kind, status);
 1061|  77.3k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1061:9): [True: 0, False: 77.3k]
  ------------------
 1062|      0|        return nullptr;
 1063|      0|    }
 1064|  77.3k|    NumberFormat *result = (*shared)->clone();
 1065|  77.3k|    shared->removeRef();
 1066|  77.3k|    if (result == nullptr) {
  ------------------
  |  Branch (1066:9): [True: 0, False: 77.3k]
  ------------------
 1067|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1068|      0|    }
 1069|  77.3k|    return result;
 1070|  77.3k|}
_ZN6icu_7812NumberFormat15setGroupingUsedEa:
 1089|   154k|{
 1090|   154k|    fGroupingUsed = newValue;
 1091|   154k|}
_ZN6icu_7812NumberFormat23setMaximumIntegerDigitsEi:
 1108|   154k|{
 1109|   154k|    fMaxIntegerDigits = uprv_max(0, uprv_min(newValue, gDefaultMaxIntegerDigits));
  ------------------
  |  | 1526|   154k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|   154k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   154k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   154k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  fMaxIntegerDigits = uprv_max(0, uprv_min(newValue, gDefaultMaxIntegerDigits));
  ------------------
  |  | 1529|   154k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|   154k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   154k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   154k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1110|   154k|    if(fMinIntegerDigits > fMaxIntegerDigits)
  ------------------
  |  Branch (1110:8): [True: 0, False: 154k]
  ------------------
 1111|      0|        fMinIntegerDigits = fMaxIntegerDigits;
 1112|   154k|}
_ZN6icu_7812NumberFormat23setMinimumIntegerDigitsEi:
 1130|   154k|{
 1131|   154k|    fMinIntegerDigits = uprv_max(0, uprv_min(newValue, gDefaultMinIntegerDigits));
  ------------------
  |  | 1526|   154k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|   154k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   154k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   154k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  fMinIntegerDigits = uprv_max(0, uprv_min(newValue, gDefaultMinIntegerDigits));
  ------------------
  |  | 1529|   154k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|   154k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   154k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   154k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1132|   154k|    if(fMinIntegerDigits > fMaxIntegerDigits)
  ------------------
  |  Branch (1132:8): [True: 0, False: 154k]
  ------------------
 1133|      0|        fMaxIntegerDigits = fMinIntegerDigits;
 1134|   154k|}
_ZN6icu_7812NumberFormat24setMaximumFractionDigitsEi:
 1152|   154k|{
 1153|   154k|    fMaxFractionDigits = uprv_max(0, uprv_min(newValue, gDefaultMaxIntegerDigits));
  ------------------
  |  | 1526|   154k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|   154k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   154k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   154k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  fMaxFractionDigits = uprv_max(0, uprv_min(newValue, gDefaultMaxIntegerDigits));
  ------------------
  |  | 1529|   154k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|   154k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   154k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   154k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1154|   154k|    if(fMaxFractionDigits < fMinFractionDigits)
  ------------------
  |  Branch (1154:8): [True: 0, False: 154k]
  ------------------
 1155|      0|        fMinFractionDigits = fMaxFractionDigits;
 1156|   154k|}
_ZN6icu_7812NumberFormat24setMinimumFractionDigitsEi:
 1174|   154k|{
 1175|   154k|    fMinFractionDigits = uprv_max(0, uprv_min(newValue, gDefaultMinIntegerDigits));
  ------------------
  |  | 1526|   154k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|   154k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   154k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   154k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  fMinFractionDigits = uprv_max(0, uprv_min(newValue, gDefaultMinIntegerDigits));
  ------------------
  |  | 1529|   154k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|   154k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   154k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   154k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1176|   154k|    if (fMaxFractionDigits < fMinFractionDigits)
  ------------------
  |  Branch (1176:9): [True: 0, False: 154k]
  ------------------
 1177|      0|        fMaxFractionDigits = fMinFractionDigits;
 1178|   154k|}
_ZN6icu_7812NumberFormat11setCurrencyEPKDsR10UErrorCode:
 1182|   154k|void NumberFormat::setCurrency(const char16_t* theCurrency, UErrorCode& ec) {
 1183|   154k|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (1183:9): [True: 0, False: 154k]
  ------------------
 1184|      0|        return;
 1185|      0|    }
 1186|   154k|    if (theCurrency) {
  ------------------
  |  Branch (1186:9): [True: 154k, False: 0]
  ------------------
 1187|   154k|        u_strncpy(fCurrency, theCurrency, 3);
  ------------------
  |  |  398|   154k|#define u_strncpy U_ICU_ENTRY_POINT_RENAME(u_strncpy)
  |  |  ------------------
  |  |  |  |  123|   154k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   154k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   154k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1188|   154k|        fCurrency[3] = 0;
 1189|   154k|    } else {
 1190|      0|        fCurrency[0] = 0;
 1191|      0|    }
 1192|   154k|}
_ZNK6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEE12createObjectEPKvR10UErrorCode:
 1261|      2|        const void * /*unused*/, UErrorCode &status) const {
 1262|      2|    const char *localeId = fLoc.getName();
 1263|      2|    NumberFormat *nf = NumberFormat::internalCreateInstance(
 1264|      2|            localeId, UNUM_DECIMAL, status);
 1265|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1265:9): [True: 0, False: 2]
  ------------------
 1266|      0|        return nullptr;
 1267|      0|    }
 1268|      2|    SharedNumberFormat *result = new SharedNumberFormat(nf);
 1269|      2|    if (result == nullptr) {
  ------------------
  |  Branch (1269:9): [True: 0, False: 2]
  ------------------
 1270|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1271|      0|        delete nf;
 1272|      0|        return nullptr;
 1273|      0|    }
 1274|      2|    result->addRef();
 1275|      2|    return result;
 1276|      2|}
_ZN6icu_7812NumberFormat20createSharedInstanceERKNS_6LocaleE18UNumberFormatStyleR10UErrorCode:
 1279|  77.3k|NumberFormat::createSharedInstance(const Locale& loc, UNumberFormatStyle kind, UErrorCode& status) {
 1280|  77.3k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1280:9): [True: 0, False: 77.3k]
  ------------------
 1281|      0|        return nullptr;
 1282|      0|    }
 1283|  77.3k|    if (kind != UNUM_DECIMAL) {
  ------------------
  |  Branch (1283:9): [True: 0, False: 77.3k]
  ------------------
 1284|      0|        status = U_UNSUPPORTED_ERROR;
 1285|      0|        return nullptr;
 1286|      0|    }
 1287|  77.3k|    const SharedNumberFormat *result = nullptr;
 1288|  77.3k|    UnifiedCache::getByLocale(loc, result, status);
 1289|  77.3k|    return result;
 1290|  77.3k|}
_ZN6icu_7812NumberFormat16isStyleSupportedE18UNumberFormatStyle:
 1293|      2|NumberFormat::isStyleSupported(UNumberFormatStyle style) {
 1294|      2|    return gLastResortNumberPatterns[style] != nullptr;
 1295|      2|}
_ZN6icu_7812NumberFormat12makeInstanceERKNS_6LocaleE18UNumberFormatStyleR10UErrorCode:
 1300|      2|                           UErrorCode& status) {
 1301|      2|  return makeInstance(desiredLocale, style, false, status);
 1302|      2|}
_ZN6icu_7812NumberFormat12makeInstanceERKNS_6LocaleE18UNumberFormatStyleaR10UErrorCode:
 1308|      2|                           UErrorCode& status) {
 1309|      2|    if (U_FAILURE(status)) return nullptr;
  ------------------
  |  Branch (1309:9): [True: 0, False: 2]
  ------------------
 1310|       |
 1311|      2|    if (style < 0 || style >= UNUM_FORMAT_STYLE_COUNT) {
  ------------------
  |  Branch (1311:9): [True: 0, False: 2]
  |  Branch (1311:22): [True: 0, False: 2]
  ------------------
 1312|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 1313|      0|        return nullptr;
 1314|      0|    }
 1315|       |    
 1316|       |    // For the purposes of general number formatting, UNUM_NUMBERING_SYSTEM should behave the same
 1317|       |    // was as UNUM_DECIMAL.  In both cases, you get either a DecimalFormat or a RuleBasedNumberFormat
 1318|       |    // depending on the locale's numbering system (either the default one for the locale or a specific
 1319|       |    // one specified by using the "@numbers=" or "-u-nu-" parameter in the locale ID.
 1320|      2|    if (style == UNUM_NUMBERING_SYSTEM) {
  ------------------
  |  Branch (1320:9): [True: 0, False: 2]
  ------------------
 1321|      0|        style = UNUM_DECIMAL;
 1322|      0|    }
 1323|       |
 1324|       |    // Some styles are not supported. This is a result of merging
 1325|       |    // the @draft ICU 4.2 NumberFormat::EStyles into the long-existing UNumberFormatStyle.
 1326|       |    // Ticket #8503 is for reviewing/fixing/merging the two relevant implementations:
 1327|       |    // this one and unum_open().
 1328|       |    // The UNUM_PATTERN_ styles are not supported here
 1329|       |    // because this method does not take a pattern string.
 1330|      2|    if (!isStyleSupported(style)) {
  ------------------
  |  Branch (1330:9): [True: 0, False: 2]
  ------------------
 1331|      0|        status = U_UNSUPPORTED_ERROR;
 1332|      0|        return nullptr;
 1333|      0|    }
 1334|       |
 1335|       |#if U_PLATFORM_USES_ONLY_WIN32_API
 1336|       |    if (!mustBeDecimalFormat) {
 1337|       |        char buffer[8];
 1338|       |        int32_t count = desiredLocale.getKeywordValue("compat", buffer, sizeof(buffer), status);
 1339|       |
 1340|       |        // if the locale has "@compat=host", create a host-specific NumberFormat
 1341|       |        if (U_SUCCESS(status) && count > 0 && uprv_strcmp(buffer, "host") == 0) {
 1342|       |            UBool curr = true;
 1343|       |
 1344|       |            switch (style) {
 1345|       |            case UNUM_DECIMAL:
 1346|       |                curr = false;
 1347|       |                // fall-through
 1348|       |                U_FALLTHROUGH;
 1349|       |
 1350|       |            case UNUM_CURRENCY:
 1351|       |            case UNUM_CURRENCY_ISO: // do not support plural formatting here
 1352|       |            case UNUM_CURRENCY_PLURAL:
 1353|       |            case UNUM_CURRENCY_ACCOUNTING:
 1354|       |            case UNUM_CASH_CURRENCY:
 1355|       |            case UNUM_CURRENCY_STANDARD:
 1356|       |            {
 1357|       |                LocalPointer<Win32NumberFormat> f(new Win32NumberFormat(desiredLocale, curr, status), status);
 1358|       |                if (U_SUCCESS(status)) {
 1359|       |                    return f.orphan();
 1360|       |                }
 1361|       |            }
 1362|       |            break;
 1363|       |            default:
 1364|       |                break;
 1365|       |            }
 1366|       |        }
 1367|       |    }
 1368|       |#endif
 1369|       |    // Use numbering system cache hashtable
 1370|      2|    umtx_initOnce(gNSCacheInitOnce, &nscacheInit);
 1371|       |
 1372|       |    // Get cached numbering system
 1373|      2|    LocalPointer<NumberingSystem> ownedNs;
 1374|      2|    NumberingSystem *ns = nullptr;
 1375|      2|    if (NumberingSystem_cache != nullptr) {
  ------------------
  |  Branch (1375:9): [True: 2, False: 0]
  ------------------
 1376|       |        // TODO: Bad hash key usage, see ticket #8504.
 1377|      2|        int32_t hashKey = desiredLocale.hashCode();
 1378|       |
 1379|      2|        static UMutex nscacheMutex;
 1380|      2|        Mutex lock(&nscacheMutex);
 1381|      2|        ns = static_cast<NumberingSystem*>(uhash_iget(NumberingSystem_cache, hashKey));
  ------------------
  |  | 1019|      2|#define uhash_iget U_ICU_ENTRY_POINT_RENAME(uhash_iget)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1382|      2|        if (ns == nullptr) {
  ------------------
  |  Branch (1382:13): [True: 1, False: 1]
  ------------------
 1383|      1|            ns = NumberingSystem::createInstance(desiredLocale,status);
 1384|      1|            uhash_iput(NumberingSystem_cache, hashKey, (void*)ns, &status);
  ------------------
  |  | 1024|      1|#define uhash_iput U_ICU_ENTRY_POINT_RENAME(uhash_iput)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1385|      1|        }
 1386|      2|    } else {
 1387|      0|        ownedNs.adoptInstead(NumberingSystem::createInstance(desiredLocale,status));
 1388|      0|        ns = ownedNs.getAlias();
 1389|      0|    }
 1390|       |
 1391|       |    // check results of getting a numbering system
 1392|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1392:9): [True: 0, False: 2]
  ------------------
 1393|      0|        return nullptr;
 1394|      0|    }
 1395|       |
 1396|      2|    if (mustBeDecimalFormat && ns->isAlgorithmic()) {
  ------------------
  |  Branch (1396:9): [True: 0, False: 2]
  |  Branch (1396:32): [True: 0, False: 0]
  ------------------
 1397|      0|        status = U_UNSUPPORTED_ERROR;
 1398|      0|        return nullptr;
 1399|      0|    }
 1400|       |
 1401|      2|    LocalPointer<DecimalFormatSymbols> symbolsToAdopt;
 1402|      2|    UnicodeString pattern;
 1403|      2|    LocalUResourceBundlePointer ownedResource(ures_open(nullptr, desiredLocale.getName(), &status));
  ------------------
  |  | 1691|      2|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1404|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1404:9): [True: 0, False: 2]
  ------------------
 1405|      0|        return nullptr;
 1406|      0|    }
 1407|      2|    else {
 1408|       |        // Loads the decimal symbols of the desired locale.
 1409|      2|        symbolsToAdopt.adoptInsteadAndCheckErrorCode(new DecimalFormatSymbols(desiredLocale, status), status);
 1410|      2|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1410:13): [True: 0, False: 2]
  ------------------
 1411|      0|            return nullptr;
 1412|      0|        }
 1413|       |
 1414|       |        // Load the pattern from data using the common library function
 1415|      2|        const char16_t* patternPtr = number::impl::utils::getPatternForStyle(
 1416|      2|                desiredLocale,
 1417|      2|                ns->getName(),
 1418|      2|                gFormatCldrStyles[style],
 1419|      2|                status);
 1420|      2|        pattern = UnicodeString(true, patternPtr, -1);
 1421|      2|    }
 1422|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1422:9): [True: 0, False: 2]
  ------------------
 1423|      0|        return nullptr;
 1424|      0|    }
 1425|      2|    if(style==UNUM_CURRENCY || style == UNUM_CURRENCY_ISO || style == UNUM_CURRENCY_ACCOUNTING 
  ------------------
  |  Branch (1425:8): [True: 0, False: 2]
  |  Branch (1425:32): [True: 0, False: 2]
  |  Branch (1425:62): [True: 0, False: 2]
  ------------------
 1426|      2|        || style == UNUM_CASH_CURRENCY || style == UNUM_CURRENCY_STANDARD){
  ------------------
  |  Branch (1426:12): [True: 0, False: 2]
  |  Branch (1426:43): [True: 0, False: 2]
  ------------------
 1427|      0|        const char16_t* currPattern = symbolsToAdopt->getCurrencyPattern();
 1428|      0|        if(currPattern!=nullptr){
  ------------------
  |  Branch (1428:12): [True: 0, False: 0]
  ------------------
 1429|      0|            pattern.setTo(currPattern, u_strlen(currPattern));
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1430|      0|        }
 1431|      0|    }
 1432|       |
 1433|      2|    LocalPointer<NumberFormat> f;
 1434|      2|    if (ns->isAlgorithmic()) {
  ------------------
  |  Branch (1434:9): [True: 0, False: 2]
  ------------------
 1435|      0|        UnicodeString nsDesc;
 1436|      0|        UnicodeString nsRuleSetGroup;
 1437|      0|        UnicodeString nsRuleSetName;
 1438|      0|        Locale nsLoc;
 1439|      0|        URBNFRuleSetTag desiredRulesType = URBNF_NUMBERING_SYSTEM;
 1440|       |
 1441|      0|        nsDesc.setTo(ns->getDescription());
 1442|      0|        int32_t firstSlash = nsDesc.indexOf(gSlash);
 1443|      0|        int32_t lastSlash = nsDesc.lastIndexOf(gSlash);
 1444|      0|        if ( lastSlash > firstSlash ) {
  ------------------
  |  Branch (1444:14): [True: 0, False: 0]
  ------------------
 1445|      0|            CharString nsLocID;
 1446|       |
 1447|      0|            nsLocID.appendInvariantChars(nsDesc.tempSubString(0, firstSlash), status);
 1448|      0|            nsRuleSetGroup.setTo(nsDesc,firstSlash+1,lastSlash-firstSlash-1);
 1449|      0|            nsRuleSetName.setTo(nsDesc,lastSlash+1);
 1450|       |
 1451|      0|            nsLoc = Locale::createFromName(nsLocID.data());
 1452|       |
 1453|      0|            UnicodeString SpelloutRules = UNICODE_STRING_SIMPLE("SpelloutRules");
  ------------------
  |  |  135|      0|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|      0|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
 1454|      0|            if ( nsRuleSetGroup.compare(SpelloutRules) == 0 ) {
  ------------------
  |  Branch (1454:18): [True: 0, False: 0]
  ------------------
 1455|      0|                desiredRulesType = URBNF_SPELLOUT;
 1456|      0|            }
 1457|      0|        } else {
 1458|      0|            nsLoc = desiredLocale;
 1459|      0|            nsRuleSetName.setTo(nsDesc);
 1460|      0|        }
 1461|       |
 1462|      0|        RuleBasedNumberFormat *r = new RuleBasedNumberFormat(desiredRulesType,nsLoc,status);
 1463|      0|        if (r == nullptr) {
  ------------------
  |  Branch (1463:13): [True: 0, False: 0]
  ------------------
 1464|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1465|      0|            return nullptr;
 1466|      0|        }
 1467|      0|        r->setDefaultRuleSet(nsRuleSetName,status);
 1468|      0|        f.adoptInstead(r);
 1469|      2|    } else {
 1470|       |        // replace single currency sign in the pattern with double currency sign
 1471|       |        // if the style is UNUM_CURRENCY_ISO
 1472|      2|        if (style == UNUM_CURRENCY_ISO) {
  ------------------
  |  Branch (1472:13): [True: 0, False: 2]
  ------------------
 1473|      0|            pattern.findAndReplace(UnicodeString(true, gSingleCurrencySign, 1),
 1474|      0|                                   UnicodeString(true, gDoubleCurrencySign, 2));
 1475|      0|        }
 1476|       |
 1477|       |        // "new DecimalFormat()" does not adopt the symbols argument if its memory allocation fails.
 1478|       |        // So we can't use adoptInsteadAndCheckErrorCode as we need to know if the 'new' failed.
 1479|      2|        DecimalFormatSymbols *syms = symbolsToAdopt.getAlias();
 1480|      2|        LocalPointer<DecimalFormat> df(new DecimalFormat(pattern, syms, style, status));
 1481|       |
 1482|      2|        if (df.isValid()) {
  ------------------
  |  Branch (1482:13): [True: 2, False: 0]
  ------------------
 1483|       |            // if the DecimalFormat object was successfully new'ed, then it will own symbolsToAdopt, even if the status is a failure.
 1484|      2|            symbolsToAdopt.orphan();
 1485|      2|        }
 1486|      0|        else {
 1487|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1488|      0|        }
 1489|       |
 1490|      2|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1490:13): [True: 0, False: 2]
  ------------------
 1491|      0|            return nullptr;
 1492|      0|        }
 1493|       |
 1494|       |        // if it is cash currency style, setCurrencyUsage with usage
 1495|      2|        if (style == UNUM_CASH_CURRENCY){
  ------------------
  |  Branch (1495:13): [True: 0, False: 2]
  ------------------
 1496|      0|            df->setCurrencyUsage(UCURR_USAGE_CASH, &status);
 1497|      0|        }
 1498|       |
 1499|      2|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1499:13): [True: 0, False: 2]
  ------------------
 1500|      0|            return nullptr;
 1501|      0|        }
 1502|       |
 1503|      2|        f.adoptInstead(df.orphan());
 1504|      2|    }
 1505|       |
 1506|      2|    f->setLocaleIDs(ures_getLocaleByType(ownedResource.getAlias(), ULOC_VALID_LOCALE, &status),
  ------------------
  |  | 1669|      2|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1507|      2|                    ures_getLocaleByType(ownedResource.getAlias(), ULOC_ACTUAL_LOCALE, &status));
  ------------------
  |  | 1669|      2|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1508|      2|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1508:9): [True: 0, False: 2]
  ------------------
 1509|      0|        return nullptr;
 1510|      0|    }
 1511|      2|    return f.orphan();
 1512|      2|}
numfmt.cpp:_ZN6icu_78L11haveServiceEv:
  982|      2|static UBool haveService() {
  983|      2|    return !gServiceInitOnce.isReset() && (getNumberFormatService() != nullptr);
  ------------------
  |  Branch (983:12): [True: 0, False: 2]
  |  Branch (983:43): [True: 0, False: 0]
  ------------------
  984|      2|}
numfmt.cpp:_ZN6icu_78L11nscacheInitEv:
 1243|      1|static void U_CALLCONV nscacheInit() {
 1244|      1|    U_ASSERT(NumberingSystem_cache == nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
 1245|      1|    ucln_i18n_registerCleanup(UCLN_I18N_NUMFMT, numfmt_cleanup);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1246|      1|    UErrorCode status = U_ZERO_ERROR;
 1247|      1|    NumberingSystem_cache = uhash_open(uhash_hashLong,
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  NumberingSystem_cache = uhash_open(uhash_hashLong,
  ------------------
  |  | 1014|      1|#define uhash_hashLong U_ICU_ENTRY_POINT_RENAME(uhash_hashLong)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1248|      1|                                       uhash_compareLong,
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1249|      1|                                       nullptr,
 1250|      1|                                       &status);
 1251|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1251:9): [True: 0, False: 1]
  ------------------
 1252|       |        // Number Format code will run with no cache if creation fails.
 1253|      0|        NumberingSystem_cache = nullptr;
 1254|      0|        return;
 1255|      0|    }
 1256|      1|    uhash_setValueDeleter(NumberingSystem_cache, deleteNumberingSystem);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1257|      1|}

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

_ZN6icu_7813OlsonTimeZoneC2EPK15UResourceBundleS3_RKNS_13UnicodeStringER10UErrorCode:
  124|      1|  BasicTimeZone(tzid), finalZone(nullptr)
  125|      1|{
  126|      1|    clearTransitionRules();
  127|      1|    U_DEBUG_TZ_MSG(("OlsonTimeZone(%s)\n", ures_getKey((UResourceBundle*)res)));
  128|      1|    if ((top == nullptr || res == nullptr) && U_SUCCESS(ec)) {
  ------------------
  |  Branch (128:10): [True: 0, False: 1]
  |  Branch (128:28): [True: 0, False: 1]
  |  Branch (128:47): [True: 0, False: 0]
  ------------------
  129|      0|        ec = U_ILLEGAL_ARGUMENT_ERROR;
  130|      0|    }
  131|      1|    if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (131:9): [True: 1, False: 0]
  ------------------
  132|       |        // TODO -- clean up -- Doesn't work if res points to an alias
  133|       |        //        // TODO remove nonconst casts below when ures_* API is fixed
  134|       |        //        setID(ures_getKey((UResourceBundle*) res)); // cast away const
  135|       |
  136|      1|        int32_t len;
  137|      1|        StackUResourceBundle r;
  138|       |
  139|       |        // Pre-32bit second transitions
  140|      1|        ures_getByKey(res, kTRANSPRE32, r.getAlias(), &ec);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      ures_getByKey(res, kTRANSPRE32, r.getAlias(), &ec);
  ------------------
  |  |   71|      1|#define kTRANSPRE32     "transPre32"
  ------------------
  141|      1|        transitionTimesPre32 = ures_getIntVector(r.getAlias(), &len, &ec);
  ------------------
  |  | 1665|      1|#define ures_getIntVector U_ICU_ENTRY_POINT_RENAME(ures_getIntVector)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  142|      1|        transitionCountPre32 = static_cast<int16_t>(len >> 1);
  143|      1|        if (ec == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (143:13): [True: 1, False: 0]
  ------------------
  144|       |            // No pre-32bit transitions
  145|      1|            transitionTimesPre32 = nullptr;
  146|      1|            transitionCountPre32 = 0;
  147|      1|            ec = U_ZERO_ERROR;
  148|      1|        } else if (U_SUCCESS(ec) && (len < 0 || len > 0x7FFF || (len & 1) != 0) /* len must be even */) {
  ------------------
  |  Branch (148:20): [True: 0, False: 0]
  |  Branch (148:38): [True: 0, False: 0]
  |  Branch (148:49): [True: 0, False: 0]
  |  Branch (148:65): [True: 0, False: 0]
  ------------------
  149|      0|            ec = U_INVALID_FORMAT_ERROR;
  150|      0|        }
  151|       |
  152|       |        // 32bit second transitions
  153|      1|        ures_getByKey(res, kTRANS, r.getAlias(), &ec);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      ures_getByKey(res, kTRANS, r.getAlias(), &ec);
  ------------------
  |  |   70|      1|#define kTRANS          "trans"
  ------------------
  154|      1|        transitionTimes32 = ures_getIntVector(r.getAlias(), &len, &ec);
  ------------------
  |  | 1665|      1|#define ures_getIntVector U_ICU_ENTRY_POINT_RENAME(ures_getIntVector)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  155|      1|        transitionCount32 = static_cast<int16_t>(len);
  156|      1|        if (ec == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (156:13): [True: 1, False: 0]
  ------------------
  157|       |            // No 32bit transitions
  158|      1|            transitionTimes32 = nullptr;
  159|      1|            transitionCount32 = 0;
  160|      1|            ec = U_ZERO_ERROR;
  161|      1|        } else if (U_SUCCESS(ec) && (len < 0 || len > 0x7FFF)) {
  ------------------
  |  Branch (161:20): [True: 0, False: 0]
  |  Branch (161:38): [True: 0, False: 0]
  |  Branch (161:49): [True: 0, False: 0]
  ------------------
  162|      0|            ec = U_INVALID_FORMAT_ERROR;
  163|      0|        }
  164|       |
  165|       |        // Post-32bit second transitions
  166|      1|        ures_getByKey(res, kTRANSPOST32, r.getAlias(), &ec);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      ures_getByKey(res, kTRANSPOST32, r.getAlias(), &ec);
  ------------------
  |  |   72|      1|#define kTRANSPOST32    "transPost32"
  ------------------
  167|      1|        transitionTimesPost32 = ures_getIntVector(r.getAlias(), &len, &ec);
  ------------------
  |  | 1665|      1|#define ures_getIntVector U_ICU_ENTRY_POINT_RENAME(ures_getIntVector)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|      1|        transitionCountPost32 = static_cast<int16_t>(len >> 1);
  169|      1|        if (ec == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (169:13): [True: 1, False: 0]
  ------------------
  170|       |            // No pre-32bit transitions
  171|      1|            transitionTimesPost32 = nullptr;
  172|      1|            transitionCountPost32 = 0;
  173|      1|            ec = U_ZERO_ERROR;
  174|      1|        } else if (U_SUCCESS(ec) && (len < 0 || len > 0x7FFF || (len & 1) != 0) /* len must be even */) {
  ------------------
  |  Branch (174:20): [True: 0, False: 0]
  |  Branch (174:38): [True: 0, False: 0]
  |  Branch (174:49): [True: 0, False: 0]
  |  Branch (174:65): [True: 0, False: 0]
  ------------------
  175|      0|            ec = U_INVALID_FORMAT_ERROR;
  176|      0|        }
  177|       |
  178|       |        // Type offsets list must be of even size, with size >= 2
  179|      1|        ures_getByKey(res, kTYPEOFFSETS, r.getAlias(), &ec);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      ures_getByKey(res, kTYPEOFFSETS, r.getAlias(), &ec);
  ------------------
  |  |   73|      1|#define kTYPEOFFSETS    "typeOffsets"
  ------------------
  180|      1|        typeOffsets = ures_getIntVector(r.getAlias(), &len, &ec);
  ------------------
  |  | 1665|      1|#define ures_getIntVector U_ICU_ENTRY_POINT_RENAME(ures_getIntVector)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  181|      1|        if (U_SUCCESS(ec) && (len < 2 || len > 0x7FFE || (len & 1) != 0)) {
  ------------------
  |  Branch (181:13): [True: 1, False: 0]
  |  Branch (181:31): [True: 0, False: 1]
  |  Branch (181:42): [True: 0, False: 1]
  |  Branch (181:58): [True: 0, False: 1]
  ------------------
  182|      0|            ec = U_INVALID_FORMAT_ERROR;
  183|      0|        }
  184|      1|        typeCount = static_cast<int16_t>(len) >> 1;
  185|       |
  186|       |        // Type map data must be of the same size as the transition count
  187|      1|        typeMapData =  nullptr;
  188|      1|        if (transitionCount() > 0) {
  ------------------
  |  Branch (188:13): [True: 0, False: 1]
  ------------------
  189|      0|            ures_getByKey(res, kTYPEMAP, r.getAlias(), &ec);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                          ures_getByKey(res, kTYPEMAP, r.getAlias(), &ec);
  ------------------
  |  |   74|      0|#define kTYPEMAP        "typeMap"
  ------------------
  190|      0|            typeMapData = ures_getBinary(r.getAlias(), &len, &ec);
  ------------------
  |  | 1659|      0|#define ures_getBinary U_ICU_ENTRY_POINT_RENAME(ures_getBinary)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  191|      0|            if (ec == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (191:17): [True: 0, False: 0]
  ------------------
  192|       |                // no type mapping data
  193|      0|                ec = U_INVALID_FORMAT_ERROR;
  194|      0|            } else if (U_SUCCESS(ec) && len != transitionCount()) {
  ------------------
  |  Branch (194:24): [True: 0, False: 0]
  |  Branch (194:41): [True: 0, False: 0]
  ------------------
  195|      0|                ec = U_INVALID_FORMAT_ERROR;
  196|      0|            }
  197|      0|        }
  198|       |
  199|       |        // Process final rule and data, if any
  200|      1|        if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (200:13): [True: 1, False: 0]
  ------------------
  201|      1|            const char16_t *ruleIdUStr = ures_getStringByKey(res, kFINALRULE, &len, &ec);
  ------------------
  |  | 1677|      1|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                          const char16_t *ruleIdUStr = ures_getStringByKey(res, kFINALRULE, &len, &ec);
  ------------------
  |  |   76|      1|#define kFINALRULE      "finalRule"
  ------------------
  202|      1|            ures_getByKey(res, kFINALRAW, r.getAlias(), &ec);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                          ures_getByKey(res, kFINALRAW, r.getAlias(), &ec);
  ------------------
  |  |   77|      1|#define kFINALRAW       "finalRaw"
  ------------------
  203|      1|            int32_t ruleRaw = ures_getInt(r.getAlias(), &ec);
  ------------------
  |  | 1664|      1|#define ures_getInt U_ICU_ENTRY_POINT_RENAME(ures_getInt)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  204|      1|            ures_getByKey(res, kFINALYEAR, r.getAlias(), &ec);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                          ures_getByKey(res, kFINALYEAR, r.getAlias(), &ec);
  ------------------
  |  |   78|      1|#define kFINALYEAR      "finalYear"
  ------------------
  205|      1|            int32_t ruleYear = ures_getInt(r.getAlias(), &ec);
  ------------------
  |  | 1664|      1|#define ures_getInt U_ICU_ENTRY_POINT_RENAME(ures_getInt)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  206|      1|            if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (206:17): [True: 0, False: 1]
  ------------------
  207|      0|                UnicodeString ruleID(true, ruleIdUStr, len);
  208|      0|                UResourceBundle *rule = TimeZone::loadRule(top, ruleID, nullptr, ec);
  209|      0|                const int32_t *ruleData = ures_getIntVector(rule, &len, &ec); 
  ------------------
  |  | 1665|      0|#define ures_getIntVector U_ICU_ENTRY_POINT_RENAME(ures_getIntVector)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  210|      0|                if (U_SUCCESS(ec) && len == 11) {
  ------------------
  |  Branch (210:21): [True: 0, False: 0]
  |  Branch (210:38): [True: 0, False: 0]
  ------------------
  211|      0|                    UnicodeString emptyStr;
  212|      0|                    finalZone = new SimpleTimeZone(
  213|      0|                        ruleRaw * U_MILLIS_PER_SECOND,
  ------------------
  |  |  221|      0|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  214|      0|                        emptyStr,
  215|      0|                        static_cast<int8_t>(ruleData[0]), static_cast<int8_t>(ruleData[1]), static_cast<int8_t>(ruleData[2]),
  216|      0|                        ruleData[3] * U_MILLIS_PER_SECOND,
  ------------------
  |  |  221|      0|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  217|      0|                        static_cast<SimpleTimeZone::TimeMode>(ruleData[4]),
  218|      0|                        static_cast<int8_t>(ruleData[5]), static_cast<int8_t>(ruleData[6]), static_cast<int8_t>(ruleData[7]),
  219|      0|                        ruleData[8] * U_MILLIS_PER_SECOND,
  ------------------
  |  |  221|      0|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  220|      0|                        static_cast<SimpleTimeZone::TimeMode>(ruleData[9]),
  221|      0|                        ruleData[10] * U_MILLIS_PER_SECOND, ec);
  ------------------
  |  |  221|      0|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  222|      0|                    if (finalZone == nullptr) {
  ------------------
  |  Branch (222:25): [True: 0, False: 0]
  ------------------
  223|      0|                        ec = U_MEMORY_ALLOCATION_ERROR;
  224|      0|                    } else {
  225|      0|                        finalStartYear = ruleYear;
  226|       |
  227|       |                        // Note: Setting finalStartYear to the finalZone is problematic.  When a date is around
  228|       |                        // year boundary, SimpleTimeZone may return false result when DST is observed at the 
  229|       |                        // beginning of year.  We could apply safe margin (day or two), but when one of recurrent
  230|       |                        // rules falls around year boundary, it could return false result.  Without setting the
  231|       |                        // start year, finalZone works fine around the year boundary of the start year.
  232|       |
  233|       |                        // finalZone->setStartYear(finalStartYear);
  234|       |
  235|       |
  236|       |                        // Compute the millis for Jan 1, 0:00 GMT of the finalYear
  237|       |
  238|       |                        // Note: finalStartMillis is used for detecting either if
  239|       |                        // historic transition data or finalZone to be used.  In an
  240|       |                        // extreme edge case - for example, two transitions fall into
  241|       |                        // small windows of time around the year boundary, this may
  242|       |                        // result incorrect offset computation.  But I think it will
  243|       |                        // never happen practically.  Yoshito - Feb 20, 2010
  244|      0|                        finalStartMillis = Grego::fieldsToDay(finalStartYear, 0, 1) * U_MILLIS_PER_DAY;
  ------------------
  |  |  227|      0|#define U_MILLIS_PER_DAY       (86400000)
  ------------------
  245|      0|                    }
  246|      0|                } else {
  247|      0|                    ec = U_INVALID_FORMAT_ERROR;
  248|      0|                }
  249|      0|                ures_close(rule);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|      1|            } else if (ec == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (250:24): [True: 1, False: 0]
  ------------------
  251|       |                // No final zone
  252|      1|                ec = U_ZERO_ERROR;
  253|      1|            }
  254|      1|        }
  255|       |
  256|       |        // initialize canonical ID
  257|      1|        canonicalID = ZoneMeta::getCanonicalCLDRID(tzid, ec);
  258|      1|    }
  259|       |
  260|      1|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (260:9): [True: 0, False: 1]
  ------------------
  261|      0|        constructEmpty();
  262|      0|    }
  263|      1|}
_ZN6icu_7813OlsonTimeZoneC2ERKS0_:
  269|   112k|    BasicTimeZone(other), finalZone(nullptr) {
  270|   112k|    *this = other;
  271|   112k|}
_ZN6icu_7813OlsonTimeZoneaSERKS0_:
  276|   112k|OlsonTimeZone& OlsonTimeZone::operator=(const OlsonTimeZone& other) {
  277|   112k|    if (this == &other) { return *this; }  // self-assignment: no-op
  ------------------
  |  Branch (277:9): [True: 0, False: 112k]
  ------------------
  278|   112k|    canonicalID = other.canonicalID;
  279|       |
  280|   112k|    transitionTimesPre32 = other.transitionTimesPre32;
  281|   112k|    transitionTimes32 = other.transitionTimes32;
  282|   112k|    transitionTimesPost32 = other.transitionTimesPost32;
  283|       |
  284|   112k|    transitionCountPre32 = other.transitionCountPre32;
  285|   112k|    transitionCount32 = other.transitionCount32;
  286|   112k|    transitionCountPost32 = other.transitionCountPost32;
  287|       |
  288|   112k|    typeCount = other.typeCount;
  289|   112k|    typeOffsets = other.typeOffsets;
  290|   112k|    typeMapData = other.typeMapData;
  291|       |
  292|   112k|    delete finalZone;
  293|   112k|    finalZone = other.finalZone != nullptr ? other.finalZone->clone() : nullptr;
  ------------------
  |  Branch (293:17): [True: 0, False: 112k]
  ------------------
  294|       |
  295|   112k|    finalStartYear = other.finalStartYear;
  296|   112k|    finalStartMillis = other.finalStartMillis;
  297|       |
  298|   112k|    clearTransitionRules();
  299|       |
  300|   112k|    return *this;
  301|   112k|}
_ZN6icu_7813OlsonTimeZoneD2Ev:
  306|   112k|OlsonTimeZone::~OlsonTimeZone() {
  307|   112k|    deleteTransitionRules();
  308|   112k|    delete finalZone;
  309|   112k|}
_ZNK6icu_7813OlsonTimeZone5cloneEv:
  324|   112k|OlsonTimeZone* OlsonTimeZone::clone() const {
  325|   112k|    return new OlsonTimeZone(*this);
  326|   112k|}
_ZNK6icu_7813OlsonTimeZone9getOffsetEdaRiS1_R10UErrorCode:
  392|      5|                              int32_t& dstoff, UErrorCode& ec) const {
  393|      5|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (393:9): [True: 0, False: 5]
  ------------------
  394|      0|        return;
  395|      0|    }
  396|      5|    if (finalZone != nullptr && date >= finalStartMillis) {
  ------------------
  |  Branch (396:9): [True: 0, False: 5]
  |  Branch (396:33): [True: 0, False: 0]
  ------------------
  397|      0|        finalZone->getOffset(date, local, rawoff, dstoff, ec);
  398|      5|    } else {
  399|      5|        getHistoricalOffset(date, local, kFormer, kLatter, rawoff, dstoff);
  400|      5|    }
  401|      5|}
_ZNK6icu_7813OlsonTimeZone18getOffsetFromLocalEd20UTimeZoneLocalOptionS1_RiS2_R10UErrorCode:
  405|      2|                                       int32_t& rawoff, int32_t& dstoff, UErrorCode& ec) const {
  406|      2|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (406:9): [True: 0, False: 2]
  ------------------
  407|      0|        return;
  408|      0|    }
  409|      2|    if (finalZone != nullptr && date >= finalStartMillis) {
  ------------------
  |  Branch (409:9): [True: 0, False: 2]
  |  Branch (409:33): [True: 0, False: 0]
  ------------------
  410|      0|        finalZone->getOffsetFromLocal(date, nonExistingTimeOpt, duplicatedTimeOpt, rawoff, dstoff, ec);
  411|      2|    } else {
  412|      2|        getHistoricalOffset(date, true, nonExistingTimeOpt, duplicatedTimeOpt, rawoff, dstoff);
  413|      2|    }
  414|      2|}
_ZNK6icu_7813OlsonTimeZone12getRawOffsetEv:
  430|      1|int32_t OlsonTimeZone::getRawOffset() const {
  431|      1|    UErrorCode ec = U_ZERO_ERROR;
  432|      1|    int32_t raw, dst;
  433|      1|    getOffset(uprv_getUTCtime(), false, raw, dst, ec);
  ------------------
  |  | 1512|      1|#define uprv_getUTCtime U_ICU_ENTRY_POINT_RENAME(uprv_getUTCtime)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  434|      1|    return raw;
  435|      1|}
_ZNK6icu_7813OlsonTimeZone19getHistoricalOffsetEdaiiRiS1_:
  476|      7|                                   int32_t& rawoff, int32_t& dstoff) const {
  477|      7|    U_DEBUG_TZ_MSG(("getHistoricalOffset(%.1f, %s, %d, %d, raw, dst)\n",
  478|      7|        date, local?"T":"F", NonExistingTimeOpt, DuplicatedTimeOpt));
  479|       |#if defined U_DEBUG_TZ
  480|       |        printTime(date*1000.0);
  481|       |#endif
  482|      7|    int16_t transCount = transitionCount();
  483|       |
  484|      7|    if (transCount > 0) {
  ------------------
  |  Branch (484:9): [True: 0, False: 7]
  ------------------
  485|      0|        double sec = uprv_floor(date / U_MILLIS_PER_SECOND);
  ------------------
  |  | 1499|      0|#define uprv_floor U_ICU_ENTRY_POINT_RENAME(uprv_floor)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      double sec = uprv_floor(date / U_MILLIS_PER_SECOND);
  ------------------
  |  |  221|      0|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  486|      0|        if (!local && sec < transitionTimeInSeconds(0)) {
  ------------------
  |  Branch (486:13): [True: 0, False: 0]
  |  Branch (486:23): [True: 0, False: 0]
  ------------------
  487|       |            // Before the first transition time
  488|      0|            rawoff = initialRawOffset() * U_MILLIS_PER_SECOND;
  ------------------
  |  |  221|      0|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  489|      0|            dstoff = initialDstOffset() * U_MILLIS_PER_SECOND;
  ------------------
  |  |  221|      0|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  490|      0|        } else {
  491|       |            // Linear search from the end is the fastest approach, since
  492|       |            // most lookups will happen at/near the end.
  493|      0|            int16_t transIdx;
  494|      0|            for (transIdx = transCount - 1; transIdx >= 0; transIdx--) {
  ------------------
  |  Branch (494:45): [True: 0, False: 0]
  ------------------
  495|      0|                int64_t transition = transitionTimeInSeconds(transIdx);
  496|       |
  497|      0|                if (local && (sec >= (transition - MAX_OFFSET_SECONDS))) {
  ------------------
  |  |  471|      0|#define MAX_OFFSET_SECONDS 86400
  ------------------
  |  Branch (497:21): [True: 0, False: 0]
  |  Branch (497:30): [True: 0, False: 0]
  ------------------
  498|      0|                    int32_t offsetBefore = zoneOffsetAt(transIdx - 1);
  499|      0|                    UBool dstBefore = dstOffsetAt(transIdx - 1) != 0;
  500|       |
  501|      0|                    int32_t offsetAfter = zoneOffsetAt(transIdx);
  502|      0|                    UBool dstAfter = dstOffsetAt(transIdx) != 0;
  503|       |
  504|      0|                    UBool dstToStd = dstBefore && !dstAfter;
  ------------------
  |  Branch (504:38): [True: 0, False: 0]
  |  Branch (504:51): [True: 0, False: 0]
  ------------------
  505|      0|                    UBool stdToDst = !dstBefore && dstAfter;
  ------------------
  |  Branch (505:38): [True: 0, False: 0]
  |  Branch (505:52): [True: 0, False: 0]
  ------------------
  506|       |                    
  507|      0|                    if (offsetAfter - offsetBefore >= 0) {
  ------------------
  |  Branch (507:25): [True: 0, False: 0]
  ------------------
  508|       |                        // Positive transition, which makes a non-existing local time range
  509|      0|                        if (((NonExistingTimeOpt & kStdDstMask) == kStandard && dstToStd)
  ------------------
  |  Branch (509:30): [True: 0, False: 0]
  |  Branch (509:81): [True: 0, False: 0]
  ------------------
  510|      0|                                || ((NonExistingTimeOpt & kStdDstMask) == kDaylight && stdToDst)) {
  ------------------
  |  Branch (510:37): [True: 0, False: 0]
  |  Branch (510:88): [True: 0, False: 0]
  ------------------
  511|      0|                            transition += offsetBefore;
  512|      0|                        } else if (((NonExistingTimeOpt & kStdDstMask) == kStandard && stdToDst)
  ------------------
  |  Branch (512:37): [True: 0, False: 0]
  |  Branch (512:88): [True: 0, False: 0]
  ------------------
  513|      0|                                || ((NonExistingTimeOpt & kStdDstMask) == kDaylight && dstToStd)) {
  ------------------
  |  Branch (513:37): [True: 0, False: 0]
  |  Branch (513:88): [True: 0, False: 0]
  ------------------
  514|      0|                            transition += offsetAfter;
  515|      0|                        } else if ((NonExistingTimeOpt & kFormerLatterMask) == kLatter) {
  ------------------
  |  Branch (515:36): [True: 0, False: 0]
  ------------------
  516|      0|                            transition += offsetBefore;
  517|      0|                        } else {
  518|       |                            // Interprets the time with rule before the transition,
  519|       |                            // default for non-existing time range
  520|      0|                            transition += offsetAfter;
  521|      0|                        }
  522|      0|                    } else {
  523|       |                        // Negative transition, which makes a duplicated local time range
  524|      0|                        if (((DuplicatedTimeOpt & kStdDstMask) == kStandard && dstToStd)
  ------------------
  |  Branch (524:30): [True: 0, False: 0]
  |  Branch (524:80): [True: 0, False: 0]
  ------------------
  525|      0|                                || ((DuplicatedTimeOpt & kStdDstMask) == kDaylight && stdToDst)) {
  ------------------
  |  Branch (525:37): [True: 0, False: 0]
  |  Branch (525:87): [True: 0, False: 0]
  ------------------
  526|      0|                            transition += offsetAfter;
  527|      0|                        } else if (((DuplicatedTimeOpt & kStdDstMask) == kStandard && stdToDst)
  ------------------
  |  Branch (527:37): [True: 0, False: 0]
  |  Branch (527:87): [True: 0, False: 0]
  ------------------
  528|      0|                                || ((DuplicatedTimeOpt & kStdDstMask) == kDaylight && dstToStd)) {
  ------------------
  |  Branch (528:37): [True: 0, False: 0]
  |  Branch (528:87): [True: 0, False: 0]
  ------------------
  529|      0|                            transition += offsetBefore;
  530|      0|                        } else if ((DuplicatedTimeOpt & kFormerLatterMask) == kFormer) {
  ------------------
  |  Branch (530:36): [True: 0, False: 0]
  ------------------
  531|      0|                            transition += offsetBefore;
  532|      0|                        } else {
  533|       |                            // Interprets the time with rule after the transition,
  534|       |                            // default for duplicated local time range
  535|      0|                            transition += offsetAfter;
  536|      0|                        }
  537|      0|                    }
  538|      0|                }
  539|      0|                if (sec >= transition) {
  ------------------
  |  Branch (539:21): [True: 0, False: 0]
  ------------------
  540|      0|                    break;
  541|      0|                }
  542|      0|            }
  543|       |            // transIdx could be -1 when local=true
  544|      0|            rawoff = rawOffsetAt(transIdx) * U_MILLIS_PER_SECOND;
  ------------------
  |  |  221|      0|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  545|      0|            dstoff = dstOffsetAt(transIdx) * U_MILLIS_PER_SECOND;
  ------------------
  |  |  221|      0|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  546|      0|        }
  547|      7|    } else {
  548|       |        // No transitions, single pair of offsets only
  549|      7|        rawoff = initialRawOffset() * U_MILLIS_PER_SECOND;
  ------------------
  |  |  221|      7|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  550|      7|        dstoff = initialDstOffset() * U_MILLIS_PER_SECOND;
  ------------------
  |  |  221|      7|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  551|      7|    }
  552|      7|    U_DEBUG_TZ_MSG(("getHistoricalOffset(%.1f, %s, %d, %d, raw, dst) - raw=%d, dst=%d\n",
  553|      7|        date, local?"T":"F", NonExistingTimeOpt, DuplicatedTimeOpt, rawoff, dstoff));
  554|      7|}
_ZN6icu_7813OlsonTimeZone20clearTransitionRulesEv:
  656|   224k|OlsonTimeZone::clearTransitionRules() {
  657|   224k|    initialRule = nullptr;
  658|   224k|    firstTZTransition = nullptr;
  659|   224k|    firstFinalTZTransition = nullptr;
  660|   224k|    historicRules = nullptr;
  661|   224k|    historicRuleCount = 0;
  662|   224k|    finalZoneWithStartYear = nullptr;
  663|   224k|    firstTZTransitionIdx = 0;
  664|   224k|    transitionRulesInitOnce.reset();
  665|   224k|}
_ZN6icu_7813OlsonTimeZone21deleteTransitionRulesEv:
  668|   112k|OlsonTimeZone::deleteTransitionRules() {
  669|   112k|    delete initialRule;
  670|   112k|    delete firstTZTransition;
  671|   112k|    delete firstFinalTZTransition;
  672|   112k|    delete finalZoneWithStartYear;
  673|   112k|    if (historicRules != nullptr) {
  ------------------
  |  Branch (673:9): [True: 0, False: 112k]
  ------------------
  674|      0|        for (int i = 0; i < historicRuleCount; i++) {
  ------------------
  |  Branch (674:25): [True: 0, False: 0]
  ------------------
  675|      0|            if (historicRules[i] != nullptr) {
  ------------------
  |  Branch (675:17): [True: 0, False: 0]
  ------------------
  676|      0|                delete historicRules[i];
  677|      0|            }
  678|      0|        }
  679|      0|        uprv_free(historicRules);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  680|      0|    }
  681|   112k|    clearTransitionRules();
  682|   112k|}

_ZNK6icu_7813OlsonTimeZone15transitionCountEv:
  407|      8|OlsonTimeZone::transitionCount() const {
  408|      8|    return transitionCountPre32 + transitionCount32 + transitionCountPost32;
  409|      8|}
_ZNK6icu_7813OlsonTimeZone16initialRawOffsetEv:
  435|      7|OlsonTimeZone::initialRawOffset() const {
  436|      7|    return typeOffsets[0];
  437|      7|}
_ZNK6icu_7813OlsonTimeZone16initialDstOffsetEv:
  440|      7|OlsonTimeZone::initialDstOffset() const {
  441|      7|    return typeOffsets[1];
  442|      7|}

_ZN6icu_7820StandardPluralRanges9forLocaleERKNS_6LocaleER10UErrorCode:
   84|  21.2k|StandardPluralRanges::forLocale(const Locale& locale, UErrorCode& status) {
   85|  21.2k|    StandardPluralRanges result;
   86|  21.2k|    getPluralRangesData(locale, result, status);
   87|  21.2k|    return result;
   88|  21.2k|}
_ZNO6icu_7820StandardPluralRanges9toPointerER10UErrorCode:
  107|  21.2k|StandardPluralRanges::toPointer(UErrorCode& status) && noexcept {
  108|  21.2k|    return LocalPointer<StandardPluralRanges>(new StandardPluralRanges(std::move(*this)), status);
  109|  21.2k|}
_ZN6icu_7820StandardPluralRanges14addPluralRangeENS_14StandardPlural4FormES2_S2_:
  114|  63.6k|        StandardPlural::Form result) {
  115|  63.6k|    U_ASSERT(fTriplesLen < fTriples.getCapacity());
  ------------------
  |  |   35|  63.6k|#   define U_ASSERT(exp) (void)0
  ------------------
  116|  63.6k|    fTriples[fTriplesLen] = {first, second, result};
  117|  63.6k|    fTriplesLen++;
  118|  63.6k|}
_ZN6icu_7820StandardPluralRanges11setCapacityEiR10UErrorCode:
  120|  21.2k|void StandardPluralRanges::setCapacity(int32_t length, UErrorCode& status) {
  121|  21.2k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (121:9): [True: 0, False: 21.2k]
  ------------------
  122|  21.2k|    if (length > fTriples.getCapacity()) {
  ------------------
  |  Branch (122:9): [True: 0, False: 21.2k]
  ------------------
  123|      0|        if (fTriples.resize(length, 0) == nullptr) {
  ------------------
  |  Branch (123:13): [True: 0, False: 0]
  ------------------
  124|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  125|      0|        }
  126|      0|    }
  127|  21.2k|}
pluralranges.cpp:_ZN6icu_7812_GLOBAL__N_119getPluralRangesDataERKNS_6LocaleERNS_20StandardPluralRangesER10UErrorCode:
   58|  21.2k|void getPluralRangesData(const Locale& locale, StandardPluralRanges& output, UErrorCode& status) {
   59|  21.2k|    LocalUResourceBundlePointer rb(ures_openDirect(nullptr, "pluralRanges", &status));
  ------------------
  |  | 1693|  21.2k|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   60|  21.2k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (60:9): [True: 0, False: 21.2k]
  ------------------
   61|       |
   62|  21.2k|    CharString dataPath;
   63|  21.2k|    dataPath.append("locales/", -1, status);
   64|  21.2k|    dataPath.append(locale.getLanguage(), -1, status);
   65|  21.2k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (65:9): [True: 0, False: 21.2k]
  ------------------
   66|  21.2k|    int32_t setLen;
   67|       |    // Not all languages are covered: fail gracefully
   68|  21.2k|    UErrorCode internalStatus = U_ZERO_ERROR;
   69|  21.2k|    const char16_t* set = ures_getStringByKeyWithFallback(rb.getAlias(), dataPath.data(), &setLen, &internalStatus);
  ------------------
  |  | 1678|  21.2k|#define ures_getStringByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getStringByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   70|  21.2k|    if (U_FAILURE(internalStatus)) { return; }
  ------------------
  |  Branch (70:9): [True: 0, False: 21.2k]
  ------------------
   71|       |
   72|  21.2k|    dataPath.clear();
   73|  21.2k|    dataPath.append("rules/", -1, status);
   74|  21.2k|    dataPath.appendInvariantChars(set, setLen, status);
   75|  21.2k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (75:9): [True: 0, False: 21.2k]
  ------------------
   76|  21.2k|    PluralRangesDataSink sink(output);
   77|  21.2k|    ures_getAllItemsWithFallback(rb.getAlias(), dataPath.data(), sink, status);
  ------------------
  |  | 1658|  21.2k|#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   78|  21.2k|}
pluralranges.cpp:_ZN6icu_7812_GLOBAL__N_120PluralRangesDataSinkC2ERNS_20StandardPluralRangesE:
   27|  21.2k|    PluralRangesDataSink(StandardPluralRanges& output) : fOutput(output) {}
pluralranges.cpp:_ZN6icu_7812_GLOBAL__N_120PluralRangesDataSink3putEPKcRNS_13ResourceValueEaR10UErrorCode:
   29|  21.2k|    void put(const char* /*key*/, ResourceValue& value, UBool /*noFallback*/, UErrorCode& status) override {
   30|  21.2k|        ResourceArray entriesArray = value.getArray(status);
   31|  21.2k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (31:13): [True: 0, False: 21.2k]
  ------------------
   32|  21.2k|        fOutput.setCapacity(entriesArray.getSize(), status);
   33|  21.2k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (33:13): [True: 0, False: 21.2k]
  ------------------
   34|  84.8k|        for (int i = 0; entriesArray.getValue(i, value); i++) {
  ------------------
  |  Branch (34:25): [True: 63.6k, False: 21.2k]
  ------------------
   35|  63.6k|            ResourceArray pluralFormsArray = value.getArray(status);
   36|  63.6k|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (36:17): [True: 0, False: 63.6k]
  ------------------
   37|  63.6k|            if (pluralFormsArray.getSize() != 3) {
  ------------------
  |  Branch (37:17): [True: 0, False: 63.6k]
  ------------------
   38|      0|                status = U_RESOURCE_TYPE_MISMATCH;
   39|      0|                return;
   40|      0|            }
   41|  63.6k|            pluralFormsArray.getValue(0, value);
   42|  63.6k|            StandardPlural::Form first = StandardPlural::fromString(value.getUnicodeString(status), status);
   43|  63.6k|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (43:17): [True: 0, False: 63.6k]
  ------------------
   44|  63.6k|            pluralFormsArray.getValue(1, value);
   45|  63.6k|            StandardPlural::Form second = StandardPlural::fromString(value.getUnicodeString(status), status);
   46|  63.6k|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (46:17): [True: 0, False: 63.6k]
  ------------------
   47|  63.6k|            pluralFormsArray.getValue(2, value);
   48|  63.6k|            StandardPlural::Form result = StandardPlural::fromString(value.getUnicodeString(status), status);
   49|  63.6k|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (49:17): [True: 0, False: 63.6k]
  ------------------
   50|  63.6k|            fOutput.addPluralRange(first, second, result);
   51|  63.6k|        }
   52|  21.2k|    }

_ZN6icu_7812PluralFormatC2ERKNS_6LocaleE11UPluralTypeRKNS_13UnicodeStringER10UErrorCode:
  132|  21.2k|        : locale(loc),
  133|  21.2k|          msgPattern(status),
  134|  21.2k|          numberFormat(nullptr),
  135|  21.2k|          offset(0) {
  136|  21.2k|    init(nullptr, type, status);
  137|  21.2k|    applyPattern(pat, status);
  138|  21.2k|}
_ZN6icu_7812PluralFormatD2Ev:
  167|  21.2k|PluralFormat::~PluralFormat() {
  168|  21.2k|    delete numberFormat;
  169|  21.2k|}
_ZN6icu_7812PluralFormat4initEPKNS_11PluralRulesE11UPluralTypeR10UErrorCode:
  172|  21.2k|PluralFormat::init(const PluralRules* rules, UPluralType type, UErrorCode& status) {
  173|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (173:9): [True: 0, False: 21.2k]
  ------------------
  174|      0|        return;
  175|      0|    }
  176|       |
  177|  21.2k|    if (rules==nullptr) {
  ------------------
  |  Branch (177:9): [True: 21.2k, False: 0]
  ------------------
  178|  21.2k|        pluralRulesWrapper.pluralRules = PluralRules::forLocale(locale, type, status);
  179|  21.2k|    } else {
  180|      0|        pluralRulesWrapper.pluralRules = rules->clone();
  181|      0|        if (pluralRulesWrapper.pluralRules == nullptr) {
  ------------------
  |  Branch (181:13): [True: 0, False: 0]
  ------------------
  182|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  183|      0|            return;
  184|      0|        }
  185|      0|    }
  186|       |
  187|  21.2k|    numberFormat= NumberFormat::createInstance(locale, status);
  188|  21.2k|}
_ZN6icu_7812PluralFormat12applyPatternERKNS_13UnicodeStringER10UErrorCode:
  191|  21.2k|PluralFormat::applyPattern(const UnicodeString& newPattern, UErrorCode& status) {
  192|  21.2k|    msgPattern.parsePluralStyle(newPattern, nullptr, status);
  193|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (193:9): [True: 0, False: 21.2k]
  ------------------
  194|      0|        msgPattern.clear();
  195|      0|        offset = 0;
  196|      0|        return;
  197|      0|    }
  198|  21.2k|    offset = msgPattern.getPluralOffset(0);
  199|  21.2k|}
_ZN6icu_7812PluralFormat14PluralSelectorD2Ev:
  578|  36.3k|PluralFormat::PluralSelector::~PluralSelector() {}
_ZN6icu_7812PluralFormat21PluralSelectorAdapterD2Ev:
  580|  21.2k|PluralFormat::PluralSelectorAdapter::~PluralSelectorAdapter() {
  581|  21.2k|    delete pluralRules;
  582|  21.2k|}

_ZN6icu_7811PluralRulesC2ER10UErrorCode:
   79|  21.2k|:   UObject(),
   80|  21.2k|    mRules(nullptr),
   81|  21.2k|    mStandardPluralRanges(nullptr),
   82|  21.2k|    mInternalStatus(U_ZERO_ERROR)
   83|  21.2k|{
   84|  21.2k|}
_ZN6icu_7811PluralRulesD2Ev:
   95|  21.2k|PluralRules::~PluralRules() {
   96|  21.2k|    delete mRules;
   97|  21.2k|    delete mStandardPluralRanges;
   98|  21.2k|}
_ZN6icu_7811PluralRules9forLocaleERKNS_6LocaleE11UPluralTypeR10UErrorCode:
  232|  21.2k|PluralRules::forLocale(const Locale& locale, UPluralType type, UErrorCode& status) {
  233|  21.2k|    if (type != UPLURAL_TYPE_CARDINAL) {
  ------------------
  |  Branch (233:9): [True: 21.2k, False: 0]
  ------------------
  234|  21.2k|        return internalForLocale(locale, type, status);
  235|  21.2k|    }
  236|      0|    const SharedPluralRules *shared = createSharedInstance(
  237|      0|            locale, type, status);
  238|      0|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (238:9): [True: 0, False: 0]
  ------------------
  239|      0|        return nullptr;
  240|      0|    }
  241|      0|    PluralRules *result = (*shared)->clone(status);
  242|      0|    shared->removeRef();
  243|      0|    return result;
  244|      0|}
_ZN6icu_7811PluralRules17internalForLocaleERKNS_6LocaleE11UPluralTypeR10UErrorCode:
  247|  21.2k|PluralRules::internalForLocale(const Locale& locale, UPluralType type, UErrorCode& status) {
  248|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (248:9): [True: 0, False: 21.2k]
  ------------------
  249|      0|        return nullptr;
  250|      0|    }
  251|  21.2k|    if (type >= UPLURAL_TYPE_COUNT) {
  ------------------
  |  Branch (251:9): [True: 0, False: 21.2k]
  ------------------
  252|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  253|      0|        return nullptr;
  254|      0|    }
  255|  21.2k|    LocalPointer<PluralRules> newObj(new PluralRules(status), status);
  256|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (256:9): [True: 0, False: 21.2k]
  ------------------
  257|      0|        return nullptr;
  258|      0|    }
  259|  21.2k|    UnicodeString locRule = newObj->getRuleFromResource(locale, type, status);
  260|       |    // TODO: which other errors, if any, should be returned?
  261|  21.2k|    if (locRule.length() == 0) {
  ------------------
  |  Branch (261:9): [True: 0, False: 21.2k]
  ------------------
  262|       |        // If an out-of-memory error occurred, then stop and report the failure.
  263|      0|        if (status == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (263:13): [True: 0, False: 0]
  ------------------
  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|      0|        locRule =  UnicodeString(PLURAL_DEFAULT_RULE);
  270|      0|        status = U_ZERO_ERROR;
  271|      0|    }
  272|  21.2k|    PluralRuleParser parser;
  273|  21.2k|    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|  21.2k|    newObj->mStandardPluralRanges = StandardPluralRanges::forLocale(locale, status)
  280|  21.2k|        .toPointer(status)
  281|  21.2k|        .orphan();
  282|       |
  283|  21.2k|    return newObj.orphan();
  284|  21.2k|}
_ZN6icu_7816PluralRuleParser5parseERKNS_13UnicodeStringEPNS_11PluralRulesER10UErrorCode:
  602|  21.2k|{
  603|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (603:9): [True: 0, False: 21.2k]
  ------------------
  604|      0|        return;
  605|      0|    }
  606|  21.2k|    U_ASSERT(ruleIndex == 0);    // Parsers are good for a single use only!
  ------------------
  |  |   35|  21.2k|#   define U_ASSERT(exp) (void)0
  ------------------
  607|  21.2k|    ruleSrc = &ruleData;
  608|       |
  609|  1.06M|    while (ruleIndex< ruleSrc->length()) {
  ------------------
  |  Branch (609:12): [True: 1.03M, False: 21.2k]
  ------------------
  610|  1.03M|        getNextToken(status);
  611|  1.03M|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (611:13): [True: 0, False: 1.03M]
  ------------------
  612|      0|            return;
  613|      0|        }
  614|  1.03M|        checkSyntax(status);
  615|  1.03M|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (615:13): [True: 0, False: 1.03M]
  ------------------
  616|      0|            return;
  617|      0|        }
  618|  1.03M|        switch (type) {
  619|  63.6k|        case tAnd:
  ------------------
  |  Branch (619:9): [True: 63.6k, False: 975k]
  ------------------
  620|  63.6k|            U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|  63.6k|#   define U_ASSERT(exp) (void)0
  ------------------
  621|  63.6k|            curAndConstraint = curAndConstraint->add(status);
  622|  63.6k|            break;
  623|      0|        case tOr:
  ------------------
  |  Branch (623:9): [True: 0, False: 1.03M]
  ------------------
  624|      0|            {
  625|      0|                U_ASSERT(currentChain != nullptr);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  626|      0|                OrConstraint *orNode=currentChain->ruleHeader;
  627|      0|                while (orNode->next != nullptr) {
  ------------------
  |  Branch (627:24): [True: 0, False: 0]
  ------------------
  628|      0|                    orNode = orNode->next;
  629|      0|                }
  630|      0|                orNode->next= new OrConstraint();
  631|      0|                if (orNode->next == nullptr) {
  ------------------
  |  Branch (631:21): [True: 0, False: 0]
  ------------------
  632|      0|                    status = U_MEMORY_ALLOCATION_ERROR;
  633|      0|                    break;
  634|      0|                }
  635|      0|                orNode=orNode->next;
  636|      0|                orNode->next=nullptr;
  637|      0|                curAndConstraint = orNode->add(status);
  638|      0|            }
  639|      0|            break;
  640|      0|        case tIs:
  ------------------
  |  Branch (640:9): [True: 0, False: 1.03M]
  ------------------
  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: 1.03M]
  ------------------
  646|      0|            U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  647|      0|            curAndConstraint->negated=true;
  648|      0|            break;
  649|       |
  650|  63.6k|        case tNotEqual:
  ------------------
  |  Branch (650:9): [True: 63.6k, False: 975k]
  ------------------
  651|  63.6k|            curAndConstraint->negated=true;
  652|  63.6k|            U_FALLTHROUGH;
  ------------------
  |  |  511|  63.6k|#       define U_FALLTHROUGH [[clang::fallthrough]]
  ------------------
  653|  63.6k|        case tIn:
  ------------------
  |  Branch (653:9): [True: 0, False: 1.03M]
  ------------------
  654|  63.6k|        case tWithin:
  ------------------
  |  Branch (654:9): [True: 0, False: 1.03M]
  ------------------
  655|   127k|        case tEqual:
  ------------------
  |  Branch (655:9): [True: 63.6k, False: 975k]
  ------------------
  656|   127k|            {
  657|   127k|                U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|   127k|#   define U_ASSERT(exp) (void)0
  ------------------
  658|   127k|                if (curAndConstraint->rangeList != nullptr) {
  ------------------
  |  Branch (658:21): [True: 0, False: 127k]
  ------------------
  659|       |                    // Already get a '='.
  660|      0|                    status = U_UNEXPECTED_TOKEN;
  661|      0|                    break;
  662|      0|                }
  663|   127k|                LocalPointer<UVector32> newRangeList(new UVector32(status), status);
  664|   127k|                if (U_FAILURE(status)) {
  ------------------
  |  Branch (664:21): [True: 0, False: 127k]
  ------------------
  665|      0|                    break;
  666|      0|                }
  667|   127k|                curAndConstraint->rangeList = newRangeList.orphan();
  668|   127k|                curAndConstraint->rangeList->addElement(-1, status);  // range Low
  669|   127k|                curAndConstraint->rangeList->addElement(-1, status);  // range Hi
  670|   127k|                rangeLowIdx = 0;
  671|   127k|                rangeHiIdx  = 1;
  672|   127k|                curAndConstraint->value=PLURAL_RANGE_HIGH;
  673|   127k|                curAndConstraint->integerOnly = (type != tWithin);
  674|   127k|            }
  675|      0|            break;
  676|   254k|        case tNumber:
  ------------------
  |  Branch (676:9): [True: 254k, False: 784k]
  ------------------
  677|   254k|            U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|   254k|#   define U_ASSERT(exp) (void)0
  ------------------
  678|   254k|            if ( (curAndConstraint->op==AndConstraint::MOD)&&
  ------------------
  |  Branch (678:18): [True: 254k, False: 0]
  ------------------
  679|   254k|                 (curAndConstraint->opNum == -1 ) ) {
  ------------------
  |  Branch (679:18): [True: 127k, False: 127k]
  ------------------
  680|   127k|                int32_t num = getNumberValue(token);
  681|   127k|                if (num == -1) {
  ------------------
  |  Branch (681:21): [True: 0, False: 127k]
  ------------------
  682|      0|                    status = U_UNEXPECTED_TOKEN;
  683|      0|                    break;
  684|      0|                }
  685|   127k|                curAndConstraint->opNum=num;
  686|   127k|            }
  687|   127k|            else {
  688|   127k|                if (curAndConstraint->rangeList == nullptr) {
  ------------------
  |  Branch (688:21): [True: 0, False: 127k]
  ------------------
  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|   127k|                } else {
  697|       |                    // this is for an 'in' or 'within' rule
  698|   127k|                    if (curAndConstraint->rangeList->elementAti(rangeLowIdx) == -1) {
  ------------------
  |  Branch (698:25): [True: 127k, False: 0]
  ------------------
  699|   127k|                        int32_t num = getNumberValue(token);
  700|   127k|                        if (num == -1) {
  ------------------
  |  Branch (700:29): [True: 0, False: 127k]
  ------------------
  701|      0|                            status = U_UNEXPECTED_TOKEN;
  702|      0|                            break;
  703|      0|                        }
  704|   127k|                        curAndConstraint->rangeList->setElementAt(num, rangeLowIdx);
  705|   127k|                        curAndConstraint->rangeList->setElementAt(num, rangeHiIdx);
  706|   127k|                    }
  707|      0|                    else {
  708|      0|                        int32_t num = getNumberValue(token);
  709|      0|                        if (num == -1) {
  ------------------
  |  Branch (709:29): [True: 0, False: 0]
  ------------------
  710|      0|                            status = U_UNEXPECTED_TOKEN;
  711|      0|                            break;
  712|      0|                        }
  713|      0|                        curAndConstraint->rangeList->setElementAt(num, rangeHiIdx);
  714|      0|                        if (curAndConstraint->rangeList->elementAti(rangeLowIdx) >
  ------------------
  |  Branch (714:29): [True: 0, False: 0]
  ------------------
  715|      0|                                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|      0|                    }
  723|   127k|                }
  724|   127k|            }
  725|   254k|            break;
  726|   254k|        case tComma:
  ------------------
  |  Branch (726:9): [True: 0, False: 1.03M]
  ------------------
  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|      0|            if (curAndConstraint == nullptr || curAndConstraint->rangeList == nullptr) {
  ------------------
  |  Branch (729:17): [True: 0, False: 0]
  |  Branch (729:48): [True: 0, False: 0]
  ------------------
  730|      0|                status = U_UNEXPECTED_TOKEN;
  731|      0|                break;
  732|      0|            }
  733|      0|            U_ASSERT(curAndConstraint->rangeList->size() >= 2);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  734|      0|            rangeLowIdx = curAndConstraint->rangeList->size();
  735|      0|            curAndConstraint->rangeList->addElement(-1, status);  // range Low
  736|      0|            rangeHiIdx = curAndConstraint->rangeList->size();
  737|      0|            curAndConstraint->rangeList->addElement(-1, status);  // range Hi
  738|      0|            break;
  739|   127k|        case tMod:
  ------------------
  |  Branch (739:9): [True: 127k, False: 911k]
  ------------------
  740|   127k|            U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|   127k|#   define U_ASSERT(exp) (void)0
  ------------------
  741|   127k|            curAndConstraint->op=AndConstraint::MOD;
  742|   127k|            break;
  743|   127k|        case tVariableN:
  ------------------
  |  Branch (743:9): [True: 127k, False: 911k]
  ------------------
  744|   127k|        case tVariableI:
  ------------------
  |  Branch (744:9): [True: 0, False: 1.03M]
  ------------------
  745|   127k|        case tVariableF:
  ------------------
  |  Branch (745:9): [True: 0, False: 1.03M]
  ------------------
  746|   127k|        case tVariableT:
  ------------------
  |  Branch (746:9): [True: 0, False: 1.03M]
  ------------------
  747|   127k|        case tVariableE:
  ------------------
  |  Branch (747:9): [True: 0, False: 1.03M]
  ------------------
  748|   127k|        case tVariableC:
  ------------------
  |  Branch (748:9): [True: 0, False: 1.03M]
  ------------------
  749|   127k|        case tVariableV:
  ------------------
  |  Branch (749:9): [True: 0, False: 1.03M]
  ------------------
  750|   127k|            U_ASSERT(curAndConstraint != nullptr);
  ------------------
  |  |   35|   127k|#   define U_ASSERT(exp) (void)0
  ------------------
  751|   127k|            curAndConstraint->digitsType = type;
  752|   127k|            break;
  753|  84.8k|        case tKeyword:
  ------------------
  |  Branch (753:9): [True: 84.8k, False: 954k]
  ------------------
  754|  84.8k|            {
  755|  84.8k|            RuleChain *newChain = new RuleChain;
  756|  84.8k|            if (newChain == nullptr) {
  ------------------
  |  Branch (756:17): [True: 0, False: 84.8k]
  ------------------
  757|      0|                status = U_MEMORY_ALLOCATION_ERROR;
  758|      0|                break;
  759|      0|            }
  760|  84.8k|            newChain->fKeyword = token;
  761|  84.8k|            if (prules->mRules == nullptr) {
  ------------------
  |  Branch (761:17): [True: 21.2k, False: 63.6k]
  ------------------
  762|  21.2k|                prules->mRules = newChain;
  763|  63.6k|            } 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|  63.6k|                RuleChain *insertAfter = prules->mRules;
  767|   106k|                while (insertAfter->fNext!=nullptr &&
  ------------------
  |  Branch (767:24): [True: 63.6k, False: 42.4k]
  |  Branch (767:24): [True: 42.4k, False: 63.6k]
  ------------------
  768|   106k|                       insertAfter->fNext->fKeyword.compare(PLURAL_KEYWORD_OTHER, 5) != 0 ){
  ------------------
  |  Branch (768:24): [True: 42.4k, False: 21.2k]
  ------------------
  769|  42.4k|                    insertAfter=insertAfter->fNext;
  770|  42.4k|                }
  771|  63.6k|                newChain->fNext = insertAfter->fNext;
  772|  63.6k|                insertAfter->fNext = newChain;
  773|  63.6k|            }
  774|  84.8k|            OrConstraint *orNode = new OrConstraint();
  775|  84.8k|            if (orNode == nullptr) {
  ------------------
  |  Branch (775:17): [True: 0, False: 84.8k]
  ------------------
  776|      0|                status = U_MEMORY_ALLOCATION_ERROR;
  777|      0|                break;
  778|      0|            }
  779|  84.8k|            newChain->ruleHeader = orNode;
  780|  84.8k|            curAndConstraint = orNode->add(status);
  781|  84.8k|            currentChain = newChain;
  782|  84.8k|            }
  783|      0|            break;
  784|       |
  785|  84.8k|        case tInteger:
  ------------------
  |  Branch (785:9): [True: 84.8k, False: 954k]
  ------------------
  786|  1.78M|            for (;;) {
  787|  1.78M|                getNextToken(status);
  788|  1.78M|                if (U_FAILURE(status) || type == tSemiColon || type == tEOF || type == tAt) {
  ------------------
  |  Branch (788:21): [True: 0, False: 1.78M]
  |  Branch (788:42): [True: 84.8k, False: 1.69M]
  |  Branch (788:64): [True: 0, False: 1.69M]
  |  Branch (788:80): [True: 0, False: 1.69M]
  ------------------
  789|  84.8k|                    break;
  790|  84.8k|                }
  791|  1.69M|                if (type == tEllipsis) {
  ------------------
  |  Branch (791:21): [True: 84.8k, False: 1.61M]
  ------------------
  792|  84.8k|                    currentChain->fIntegerSamplesUnbounded = true;
  793|  84.8k|                    continue;
  794|  84.8k|                }
  795|  1.61M|                currentChain->fIntegerSamples.append(token);
  796|  1.61M|            }
  797|  84.8k|            break;
  798|       |
  799|      0|        case tDecimal:
  ------------------
  |  Branch (799:9): [True: 0, False: 1.03M]
  ------------------
  800|      0|            for (;;) {
  801|      0|                getNextToken(status);
  802|      0|                if (U_FAILURE(status) || type == tSemiColon || type == tEOF || type == tAt) {
  ------------------
  |  Branch (802:21): [True: 0, False: 0]
  |  Branch (802:42): [True: 0, False: 0]
  |  Branch (802:64): [True: 0, False: 0]
  |  Branch (802:80): [True: 0, False: 0]
  ------------------
  803|      0|                    break;
  804|      0|                }
  805|      0|                if (type == tEllipsis) {
  ------------------
  |  Branch (805:21): [True: 0, False: 0]
  ------------------
  806|      0|                    currentChain->fDecimalSamplesUnbounded = true;
  807|      0|                    continue;
  808|      0|                }
  809|      0|                currentChain->fDecimalSamples.append(token);
  810|      0|            }
  811|      0|            break;
  812|       |
  813|   169k|        default:
  ------------------
  |  Branch (813:9): [True: 169k, False: 869k]
  ------------------
  814|   169k|            break;
  815|  1.03M|        }
  816|  1.03M|        prevType=type;
  817|  1.03M|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (817:13): [True: 0, False: 1.03M]
  ------------------
  818|      0|            break;
  819|      0|        }
  820|  1.03M|    }
  821|  21.2k|}
_ZN6icu_7811PluralRules19getRuleFromResourceERKNS_6LocaleE11UPluralTypeR10UErrorCode:
  824|  21.2k|PluralRules::getRuleFromResource(const Locale& locale, UPluralType type, UErrorCode& errCode) {
  825|  21.2k|    UnicodeString emptyStr;
  826|       |
  827|  21.2k|    if (U_FAILURE(errCode)) {
  ------------------
  |  Branch (827:9): [True: 0, False: 21.2k]
  ------------------
  828|      0|        return emptyStr;
  829|      0|    }
  830|  21.2k|    LocalUResourceBundlePointer rb(ures_openDirect(nullptr, "plurals", &errCode));
  ------------------
  |  | 1693|  21.2k|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  831|  21.2k|    if(U_FAILURE(errCode)) {
  ------------------
  |  Branch (831:8): [True: 0, False: 21.2k]
  ------------------
  832|      0|        return emptyStr;
  833|      0|    }
  834|  21.2k|    const char *typeKey;
  835|  21.2k|    switch (type) {
  836|      0|    case UPLURAL_TYPE_CARDINAL:
  ------------------
  |  Branch (836:5): [True: 0, False: 21.2k]
  ------------------
  837|      0|        typeKey = "locales";
  838|      0|        break;
  839|  21.2k|    case UPLURAL_TYPE_ORDINAL:
  ------------------
  |  Branch (839:5): [True: 21.2k, False: 0]
  ------------------
  840|  21.2k|        typeKey = "locales_ordinals";
  841|  21.2k|        break;
  842|      0|    default:
  ------------------
  |  Branch (842:5): [True: 0, False: 21.2k]
  ------------------
  843|       |        // Must not occur: The caller should have checked for valid types.
  844|      0|        errCode = U_ILLEGAL_ARGUMENT_ERROR;
  845|      0|        return emptyStr;
  846|  21.2k|    }
  847|  21.2k|    LocalUResourceBundlePointer locRes(ures_getByKey(rb.getAlias(), typeKey, nullptr, &errCode));
  ------------------
  |  | 1661|  21.2k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  848|  21.2k|    if(U_FAILURE(errCode)) {
  ------------------
  |  Branch (848:8): [True: 0, False: 21.2k]
  ------------------
  849|      0|        return emptyStr;
  850|      0|    }
  851|  21.2k|    int32_t resLen=0;
  852|  21.2k|    const char *curLocaleName=locale.getBaseName();
  853|  21.2k|    const char16_t* s = ures_getStringByKey(locRes.getAlias(), curLocaleName, &resLen, &errCode);
  ------------------
  |  | 1677|  21.2k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  854|       |
  855|  21.2k|    if (s == nullptr) {
  ------------------
  |  Branch (855:9): [True: 21.2k, False: 0]
  ------------------
  856|       |        // Check parent locales.
  857|  21.2k|        UErrorCode status = U_ZERO_ERROR;
  858|  21.2k|        const char *curLocaleName2=locale.getBaseName();
  859|  21.2k|        CharString parentLocaleName(curLocaleName2, status);
  860|       |
  861|  42.4k|        for (;;) {
  862|  42.4k|            {
  863|  42.4k|                CharString tmp = ulocimp_getParent(parentLocaleName.data(), status);
  ------------------
  |  | 1205|  42.4k|#define ulocimp_getParent U_ICU_ENTRY_POINT_RENAME(ulocimp_getParent)
  |  |  ------------------
  |  |  |  |  123|  42.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  42.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  42.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  864|  42.4k|                if (tmp.isEmpty()) break;
  ------------------
  |  Branch (864:21): [True: 0, False: 42.4k]
  ------------------
  865|  42.4k|                parentLocaleName = std::move(tmp);
  866|  42.4k|            }
  867|      0|            resLen=0;
  868|  42.4k|            s = ures_getStringByKey(locRes.getAlias(), parentLocaleName.data(), &resLen, &status);
  ------------------
  |  | 1677|  42.4k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|  42.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  42.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  42.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  869|  42.4k|            if (s != nullptr) {
  ------------------
  |  Branch (869:17): [True: 21.2k, False: 21.2k]
  ------------------
  870|  21.2k|                errCode = U_ZERO_ERROR;
  871|  21.2k|                break;
  872|  21.2k|            }
  873|  21.2k|            status = U_ZERO_ERROR;
  874|  21.2k|        }
  875|  21.2k|    }
  876|  21.2k|    if (s==nullptr) {
  ------------------
  |  Branch (876:9): [True: 0, False: 21.2k]
  ------------------
  877|      0|        return emptyStr;
  878|      0|    }
  879|       |
  880|  21.2k|    char setKey[256];
  881|  21.2k|    u_UCharsToChars(s, setKey, resLen + 1);
  ------------------
  |  |  211|  21.2k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  882|       |    // printf("\n PluralRule: %s\n", setKey);
  883|       |
  884|  21.2k|    LocalUResourceBundlePointer ruleRes(ures_getByKey(rb.getAlias(), "rules", nullptr, &errCode));
  ------------------
  |  | 1661|  21.2k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  885|  21.2k|    if(U_FAILURE(errCode)) {
  ------------------
  |  Branch (885:8): [True: 0, False: 21.2k]
  ------------------
  886|      0|        return emptyStr;
  887|      0|    }
  888|  21.2k|    LocalUResourceBundlePointer setRes(ures_getByKey(ruleRes.getAlias(), setKey, nullptr, &errCode));
  ------------------
  |  | 1661|  21.2k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  889|  21.2k|    if (U_FAILURE(errCode)) {
  ------------------
  |  Branch (889:9): [True: 0, False: 21.2k]
  ------------------
  890|      0|        return emptyStr;
  891|      0|    }
  892|       |
  893|  21.2k|    int32_t numberKeys = ures_getSize(setRes.getAlias());
  ------------------
  |  | 1674|  21.2k|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  894|  21.2k|    UnicodeString result;
  895|  21.2k|    const char *key=nullptr;
  896|   106k|    for(int32_t i=0; i<numberKeys; ++i) {   // Keys are zero, one, few, ...
  ------------------
  |  Branch (896:22): [True: 84.8k, False: 21.2k]
  ------------------
  897|  84.8k|        UnicodeString rules = ures_getNextUnicodeString(setRes.getAlias(), &key, &errCode);
  898|  84.8k|        UnicodeString uKey(key, -1, US_INV);
  ------------------
  |  |   98|  84.8k|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  899|  84.8k|        result.append(uKey);
  900|  84.8k|        result.append(COLON);
  901|  84.8k|        result.append(rules);
  902|  84.8k|        result.append(SEMI_COLON);
  903|  84.8k|    }
  904|  21.2k|    return result;
  905|  21.2k|}
_ZN6icu_7813AndConstraintD2Ev:
  944|   148k|AndConstraint::~AndConstraint() {
  945|   148k|    delete rangeList;
  946|   148k|    rangeList = nullptr;
  947|   148k|    delete next;
  948|   148k|    next = nullptr;
  949|   148k|}
_ZN6icu_7813AndConstraint3addER10UErrorCode:
  993|  63.6k|AndConstraint::add(UErrorCode& status) {
  994|  63.6k|    if (U_FAILURE(fInternalStatus)) {
  ------------------
  |  Branch (994:9): [True: 0, False: 63.6k]
  ------------------
  995|      0|        status = fInternalStatus;
  996|      0|        return nullptr;
  997|      0|    }
  998|  63.6k|    this->next = new AndConstraint();
  999|  63.6k|    if (this->next == nullptr) {
  ------------------
  |  Branch (999:9): [True: 0, False: 63.6k]
  ------------------
 1000|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1001|      0|    }
 1002|  63.6k|    return this->next;
 1003|  63.6k|}
_ZN6icu_7812OrConstraintD2Ev:
 1030|  84.8k|OrConstraint::~OrConstraint() {
 1031|  84.8k|    delete childNode;
 1032|  84.8k|    childNode = nullptr;
 1033|  84.8k|    delete next;
 1034|  84.8k|    next = nullptr;
 1035|  84.8k|}
_ZN6icu_7812OrConstraint3addER10UErrorCode:
 1038|  84.8k|OrConstraint::add(UErrorCode& status) {
 1039|  84.8k|    if (U_FAILURE(fInternalStatus)) {
  ------------------
  |  Branch (1039:9): [True: 0, False: 84.8k]
  ------------------
 1040|      0|        status = fInternalStatus;
 1041|      0|        return nullptr;
 1042|      0|    }
 1043|  84.8k|    OrConstraint *curOrConstraint=this;
 1044|  84.8k|    {
 1045|  84.8k|        while (curOrConstraint->next!=nullptr) {
  ------------------
  |  Branch (1045:16): [True: 0, False: 84.8k]
  ------------------
 1046|      0|            curOrConstraint = curOrConstraint->next;
 1047|      0|        }
 1048|  84.8k|        U_ASSERT(curOrConstraint->childNode == nullptr);
  ------------------
  |  |   35|  84.8k|#   define U_ASSERT(exp) (void)0
  ------------------
 1049|  84.8k|        curOrConstraint->childNode = new AndConstraint();
 1050|  84.8k|        if (curOrConstraint->childNode == nullptr) {
  ------------------
  |  Branch (1050:13): [True: 0, False: 84.8k]
  ------------------
 1051|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1052|      0|        }
 1053|  84.8k|    }
 1054|  84.8k|    return curOrConstraint->childNode;
 1055|  84.8k|}
_ZN6icu_789RuleChainD2Ev:
 1106|  84.8k|RuleChain::~RuleChain() {
 1107|  84.8k|    delete fNext;
 1108|  84.8k|    delete ruleHeader;
 1109|  84.8k|}
_ZN6icu_7816PluralRuleParserC2Ev:
 1272|  21.2k|        ruleIndex(0), token(), type(none), prevType(none),
 1273|  21.2k|        curAndConstraint(nullptr), currentChain(nullptr), rangeLowIdx(-1), rangeHiIdx(-1)
 1274|  21.2k|{
 1275|  21.2k|}
_ZN6icu_7816PluralRuleParserD2Ev:
 1277|  21.2k|PluralRuleParser::~PluralRuleParser() {
 1278|  21.2k|}
_ZN6icu_7816PluralRuleParser14getNumberValueERKNS_13UnicodeStringE:
 1282|   254k|PluralRuleParser::getNumberValue(const UnicodeString& token) {
 1283|   254k|    int32_t pos = 0;
 1284|   254k|    return ICU_Utility::parseNumber(token, pos, 10);
 1285|   254k|}
_ZN6icu_7816PluralRuleParser11checkSyntaxER10UErrorCode:
 1290|  1.03M|{
 1291|  1.03M|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1291:9): [True: 0, False: 1.03M]
  ------------------
 1292|      0|        return;
 1293|      0|    }
 1294|  1.03M|    if (!(prevType==none || prevType==tSemiColon)) {
  ------------------
  |  Branch (1294:11): [True: 21.2k, False: 1.01M]
  |  Branch (1294:29): [True: 63.6k, False: 954k]
  ------------------
 1295|   954k|        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|   954k|    }
 1299|       |
 1300|  1.03M|    switch(prevType) {
 1301|  21.2k|    case none:
  ------------------
  |  Branch (1301:5): [True: 21.2k, False: 1.01M]
  ------------------
 1302|  84.8k|    case tSemiColon:
  ------------------
  |  Branch (1302:5): [True: 63.6k, False: 975k]
  ------------------
 1303|  84.8k|        if (type!=tKeyword && type != tEOF) {
  ------------------
  |  Branch (1303:13): [True: 0, False: 84.8k]
  |  Branch (1303:31): [True: 0, False: 0]
  ------------------
 1304|      0|            status = U_UNEXPECTED_TOKEN;
 1305|      0|        }
 1306|  84.8k|        break;
 1307|   127k|    case tVariableN:
  ------------------
  |  Branch (1307:5): [True: 127k, False: 911k]
  ------------------
 1308|   127k|    case tVariableI:
  ------------------
  |  Branch (1308:5): [True: 0, False: 1.03M]
  ------------------
 1309|   127k|    case tVariableF:
  ------------------
  |  Branch (1309:5): [True: 0, False: 1.03M]
  ------------------
 1310|   127k|    case tVariableT:
  ------------------
  |  Branch (1310:5): [True: 0, False: 1.03M]
  ------------------
 1311|   127k|    case tVariableE:
  ------------------
  |  Branch (1311:5): [True: 0, False: 1.03M]
  ------------------
 1312|   127k|    case tVariableC:
  ------------------
  |  Branch (1312:5): [True: 0, False: 1.03M]
  ------------------
 1313|   127k|    case tVariableV:
  ------------------
  |  Branch (1313:5): [True: 0, False: 1.03M]
  ------------------
 1314|   127k|        if (type != tIs && type != tMod && type != tIn &&
  ------------------
  |  Branch (1314:13): [True: 127k, False: 0]
  |  Branch (1314:28): [True: 0, False: 127k]
  |  Branch (1314:44): [True: 0, False: 0]
  ------------------
 1315|   127k|            type != tNot && type != tWithin && type != tEqual && type != tNotEqual) {
  ------------------
  |  Branch (1315:13): [True: 0, False: 0]
  |  Branch (1315:29): [True: 0, False: 0]
  |  Branch (1315:48): [True: 0, False: 0]
  |  Branch (1315:66): [True: 0, False: 0]
  ------------------
 1316|      0|            status = U_UNEXPECTED_TOKEN;
 1317|      0|        }
 1318|   127k|        break;
 1319|  84.8k|    case tKeyword:
  ------------------
  |  Branch (1319:5): [True: 84.8k, False: 954k]
  ------------------
 1320|  84.8k|        if (type != tColon) {
  ------------------
  |  Branch (1320:13): [True: 0, False: 84.8k]
  ------------------
 1321|      0|            status = U_UNEXPECTED_TOKEN;
 1322|      0|        }
 1323|  84.8k|        break;
 1324|  84.8k|    case tColon:
  ------------------
  |  Branch (1324:5): [True: 84.8k, False: 954k]
  ------------------
 1325|  84.8k|        if (!(type == tVariableN ||
  ------------------
  |  Branch (1325:15): [True: 63.6k, False: 21.2k]
  ------------------
 1326|  84.8k|              type == tVariableI ||
  ------------------
  |  Branch (1326:15): [True: 0, False: 21.2k]
  ------------------
 1327|  84.8k|              type == tVariableF ||
  ------------------
  |  Branch (1327:15): [True: 0, False: 21.2k]
  ------------------
 1328|  84.8k|              type == tVariableT ||
  ------------------
  |  Branch (1328:15): [True: 0, False: 21.2k]
  ------------------
 1329|  84.8k|              type == tVariableE ||
  ------------------
  |  Branch (1329:15): [True: 0, False: 21.2k]
  ------------------
 1330|  84.8k|              type == tVariableC ||
  ------------------
  |  Branch (1330:15): [True: 0, False: 21.2k]
  ------------------
 1331|  84.8k|              type == tVariableV ||
  ------------------
  |  Branch (1331:15): [True: 0, False: 21.2k]
  ------------------
 1332|  84.8k|              type == tAt)) {
  ------------------
  |  Branch (1332:15): [True: 21.2k, False: 0]
  ------------------
 1333|      0|            status = U_UNEXPECTED_TOKEN;
 1334|      0|        }
 1335|  84.8k|        break;
 1336|      0|    case tIs:
  ------------------
  |  Branch (1336:5): [True: 0, False: 1.03M]
  ------------------
 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: 1.03M]
  ------------------
 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|   127k|    case tMod:
  ------------------
  |  Branch (1346:5): [True: 127k, False: 911k]
  ------------------
 1347|   127k|    case tDot2:
  ------------------
  |  Branch (1347:5): [True: 0, False: 1.03M]
  ------------------
 1348|   127k|    case tIn:
  ------------------
  |  Branch (1348:5): [True: 0, False: 1.03M]
  ------------------
 1349|   127k|    case tWithin:
  ------------------
  |  Branch (1349:5): [True: 0, False: 1.03M]
  ------------------
 1350|   190k|    case tEqual:
  ------------------
  |  Branch (1350:5): [True: 63.6k, False: 975k]
  ------------------
 1351|   254k|    case tNotEqual:
  ------------------
  |  Branch (1351:5): [True: 63.6k, False: 975k]
  ------------------
 1352|   254k|        if (type != tNumber) {
  ------------------
  |  Branch (1352:13): [True: 0, False: 254k]
  ------------------
 1353|      0|            status = U_UNEXPECTED_TOKEN;
 1354|      0|        }
 1355|   254k|        break;
 1356|  63.6k|    case tAnd:
  ------------------
  |  Branch (1356:5): [True: 63.6k, False: 975k]
  ------------------
 1357|  63.6k|    case tOr:
  ------------------
  |  Branch (1357:5): [True: 0, False: 1.03M]
  ------------------
 1358|  63.6k|        if ( type != tVariableN &&
  ------------------
  |  Branch (1358:14): [True: 0, False: 63.6k]
  ------------------
 1359|  63.6k|             type != tVariableI &&
  ------------------
  |  Branch (1359:14): [True: 0, False: 0]
  ------------------
 1360|  63.6k|             type != tVariableF &&
  ------------------
  |  Branch (1360:14): [True: 0, False: 0]
  ------------------
 1361|  63.6k|             type != tVariableT &&
  ------------------
  |  Branch (1361:14): [True: 0, False: 0]
  ------------------
 1362|  63.6k|             type != tVariableE &&
  ------------------
  |  Branch (1362:14): [True: 0, False: 0]
  ------------------
 1363|  63.6k|             type != tVariableC &&
  ------------------
  |  Branch (1363:14): [True: 0, False: 0]
  ------------------
 1364|  63.6k|             type != tVariableV) {
  ------------------
  |  Branch (1364:14): [True: 0, False: 0]
  ------------------
 1365|      0|            status = U_UNEXPECTED_TOKEN;
 1366|      0|        }
 1367|  63.6k|        break;
 1368|      0|    case tComma:
  ------------------
  |  Branch (1368:5): [True: 0, False: 1.03M]
  ------------------
 1369|      0|        if (type != tNumber) {
  ------------------
  |  Branch (1369:13): [True: 0, False: 0]
  ------------------
 1370|      0|            status = U_UNEXPECTED_TOKEN;
 1371|      0|        }
 1372|      0|        break;
 1373|   254k|    case tNumber:
  ------------------
  |  Branch (1373:5): [True: 254k, False: 784k]
  ------------------
 1374|   254k|        if (type != tDot2  && type != tSemiColon && type != tIs       && type != tNot    &&
  ------------------
  |  Branch (1374:13): [True: 254k, False: 0]
  |  Branch (1374:31): [True: 254k, False: 0]
  |  Branch (1374:53): [True: 254k, False: 0]
  |  Branch (1374:74): [True: 254k, False: 0]
  ------------------
 1375|   254k|            type != tIn    && type != tEqual     && type != tNotEqual && type != tWithin &&
  ------------------
  |  Branch (1375:13): [True: 254k, False: 0]
  |  Branch (1375:31): [True: 190k, False: 63.6k]
  |  Branch (1375:53): [True: 127k, False: 63.6k]
  |  Branch (1375:74): [True: 127k, False: 0]
  ------------------
 1376|   254k|            type != tAnd   && type != tOr        && type != tComma    && type != tAt     &&
  ------------------
  |  Branch (1376:13): [True: 63.6k, False: 63.6k]
  |  Branch (1376:31): [True: 63.6k, False: 0]
  |  Branch (1376:53): [True: 63.6k, False: 0]
  |  Branch (1376:74): [True: 0, False: 63.6k]
  ------------------
 1377|   254k|            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|   254k|        break;
 1384|  84.8k|    case tAt:
  ------------------
  |  Branch (1384:5): [True: 84.8k, False: 954k]
  ------------------
 1385|  84.8k|        if (type != tDecimal && type != tInteger) {
  ------------------
  |  Branch (1385:13): [True: 84.8k, False: 0]
  |  Branch (1385:33): [True: 0, False: 84.8k]
  ------------------
 1386|      0|            status = U_UNEXPECTED_TOKEN;
 1387|      0|        }
 1388|  84.8k|        break;
 1389|      0|    default:
  ------------------
  |  Branch (1389:5): [True: 0, False: 1.03M]
  ------------------
 1390|      0|        status = U_UNEXPECTED_TOKEN;
 1391|      0|        break;
 1392|  1.03M|    }
 1393|  1.03M|}
_ZN6icu_7816PluralRuleParser12getNextTokenER10UErrorCode:
 1402|  2.82M|{
 1403|  2.82M|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1403:9): [True: 0, False: 2.82M]
  ------------------
 1404|      0|        return;
 1405|      0|    }
 1406|       |
 1407|  2.82M|    char16_t ch;
 1408|  4.41M|    while (ruleIndex < ruleSrc->length()) {
  ------------------
  |  Branch (1408:12): [True: 4.41M, False: 0]
  ------------------
 1409|  4.41M|        ch = ruleSrc->charAt(ruleIndex);
 1410|  4.41M|        type = charType(ch);
 1411|  4.41M|        if (type != tSpace) {
  ------------------
  |  Branch (1411:13): [True: 2.82M, False: 1.59M]
  ------------------
 1412|  2.82M|            break;
 1413|  2.82M|        }
 1414|  1.59M|        ++(ruleIndex);
 1415|  1.59M|    }
 1416|  2.82M|    if (ruleIndex >= ruleSrc->length()) {
  ------------------
  |  Branch (1416:9): [True: 0, False: 2.82M]
  ------------------
 1417|      0|        type = tEOF;
 1418|      0|        return;
 1419|      0|    }
 1420|  2.82M|    int32_t curIndex= ruleIndex;
 1421|       |
 1422|  2.82M|    switch (type) {
 1423|  84.8k|      case tColon:
  ------------------
  |  Branch (1423:7): [True: 84.8k, False: 2.73M]
  ------------------
 1424|   169k|      case tSemiColon:
  ------------------
  |  Branch (1424:7): [True: 84.8k, False: 2.73M]
  ------------------
 1425|   954k|      case tComma:
  ------------------
  |  Branch (1425:7): [True: 784k, False: 2.03M]
  ------------------
 1426|  1.03M|      case tEllipsis:
  ------------------
  |  Branch (1426:7): [True: 84.8k, False: 2.73M]
  ------------------
 1427|  1.06M|      case tTilde:   // scanned '~'
  ------------------
  |  Branch (1427:7): [True: 21.2k, False: 2.79M]
  ------------------
 1428|  1.14M|      case tAt:      // scanned '@'
  ------------------
  |  Branch (1428:7): [True: 84.8k, False: 2.73M]
  ------------------
 1429|  1.20M|      case tEqual:   // scanned '='
  ------------------
  |  Branch (1429:7): [True: 63.6k, False: 2.75M]
  ------------------
 1430|  1.33M|      case tMod:     // scanned '%'
  ------------------
  |  Branch (1430:7): [True: 127k, False: 2.69M]
  ------------------
 1431|       |        // Single character tokens.
 1432|  1.33M|        ++curIndex;
 1433|  1.33M|        break;
 1434|       |
 1435|  63.6k|      case tNotEqual:  // scanned '!'
  ------------------
  |  Branch (1435:7): [True: 63.6k, False: 2.75M]
  ------------------
 1436|  63.6k|        if (ruleSrc->charAt(curIndex+1) == EQUALS) {
  ------------------
  |  Branch (1436:13): [True: 63.6k, False: 0]
  ------------------
 1437|  63.6k|            curIndex += 2;
 1438|  63.6k|        } else {
 1439|      0|            type = none;
 1440|      0|            curIndex += 1;
 1441|      0|        }
 1442|  63.6k|        break;
 1443|       |
 1444|   360k|      case tKeyword:
  ------------------
  |  Branch (1444:7): [True: 360k, False: 2.46M]
  ------------------
 1445|  1.56M|         while (type == tKeyword && ++curIndex < ruleSrc->length()) {
  ------------------
  |  Branch (1445:17): [True: 1.20M, False: 360k]
  |  Branch (1445:37): [True: 1.20M, False: 0]
  ------------------
 1446|  1.20M|             ch = ruleSrc->charAt(curIndex);
 1447|  1.20M|             type = charType(ch);
 1448|  1.20M|         }
 1449|   360k|         type = tKeyword;
 1450|   360k|         break;
 1451|       |
 1452|  1.06M|      case tNumber:
  ------------------
  |  Branch (1452:7): [True: 1.06M, False: 1.76M]
  ------------------
 1453|  3.58M|         while (type == tNumber && ++curIndex < ruleSrc->length()) {
  ------------------
  |  Branch (1453:17): [True: 2.52M, False: 1.06M]
  |  Branch (1453:36): [True: 2.52M, False: 0]
  ------------------
 1454|  2.52M|             ch = ruleSrc->charAt(curIndex);
 1455|  2.52M|             type = charType(ch);
 1456|  2.52M|         }
 1457|  1.06M|         type = tNumber;
 1458|  1.06M|         break;
 1459|       |
 1460|      0|       case tDot:
  ------------------
  |  Branch (1460:8): [True: 0, False: 2.82M]
  ------------------
 1461|       |         // We could be looking at either ".." in a range, or "..." at the end of a sample.
 1462|      0|         if (curIndex+1 >= ruleSrc->length() || ruleSrc->charAt(curIndex+1) != DOT) {
  ------------------
  |  Branch (1462:14): [True: 0, False: 0]
  |  Branch (1462:49): [True: 0, False: 0]
  ------------------
 1463|      0|             ++curIndex;
 1464|      0|             break; // Single dot
 1465|      0|         }
 1466|      0|         if (curIndex+2 >= ruleSrc->length() || ruleSrc->charAt(curIndex+2) != DOT) {
  ------------------
  |  Branch (1466:14): [True: 0, False: 0]
  |  Branch (1466:49): [True: 0, False: 0]
  ------------------
 1467|      0|             curIndex += 2;
 1468|      0|             type = tDot2;
 1469|      0|             break; // double dot
 1470|      0|         }
 1471|      0|         type = tEllipsis;
 1472|      0|         curIndex += 3;
 1473|      0|         break;     // triple dot
 1474|       |
 1475|      0|       default:
  ------------------
  |  Branch (1475:8): [True: 0, False: 2.82M]
  ------------------
 1476|      0|         status = U_UNEXPECTED_TOKEN;
 1477|      0|         ++curIndex;
 1478|      0|         break;
 1479|  2.82M|    }
 1480|       |
 1481|  2.82M|    U_ASSERT(ruleIndex <= ruleSrc->length());
  ------------------
  |  |   35|  2.82M|#   define U_ASSERT(exp) (void)0
  ------------------
 1482|  2.82M|    U_ASSERT(curIndex <= ruleSrc->length());
  ------------------
  |  |   35|  2.82M|#   define U_ASSERT(exp) (void)0
  ------------------
 1483|  2.82M|    token=UnicodeString(*ruleSrc, ruleIndex, curIndex-ruleIndex);
 1484|  2.82M|    ruleIndex = curIndex;
 1485|  2.82M|}
_ZN6icu_7816PluralRuleParser8charTypeEDs:
 1488|  8.14M|PluralRuleParser::charType(char16_t ch) {
 1489|  8.14M|    if ((ch>=U_ZERO) && (ch<=U_NINE)) {
  ------------------
  |  Branch (1489:9): [True: 4.26M, False: 3.88M]
  |  Branch (1489:25): [True: 2.52M, False: 1.73M]
  ------------------
 1490|  2.52M|        return tNumber;
 1491|  2.52M|    }
 1492|  5.62M|    if (ch>=LOW_A && ch<=LOW_Z) {
  ------------------
  |  Branch (1492:9): [True: 1.33M, False: 4.28M]
  |  Branch (1492:22): [True: 1.20M, False: 127k]
  ------------------
 1493|  1.20M|        return tKeyword;
 1494|  1.20M|    }
 1495|  4.41M|    switch (ch) {
 1496|   169k|    case COLON:
  ------------------
  |  Branch (1496:5): [True: 169k, False: 4.24M]
  ------------------
 1497|   169k|        return tColon;
 1498|  2.12M|    case SPACE:
  ------------------
  |  Branch (1498:5): [True: 2.12M, False: 2.29M]
  ------------------
 1499|  2.12M|        return tSpace;
 1500|  84.8k|    case SEMI_COLON:
  ------------------
  |  Branch (1500:5): [True: 84.8k, False: 4.32M]
  ------------------
 1501|  84.8k|        return tSemiColon;
 1502|      0|    case DOT:
  ------------------
  |  Branch (1502:5): [True: 0, False: 4.41M]
  ------------------
 1503|      0|        return tDot;
 1504|  1.56M|    case COMMA:
  ------------------
  |  Branch (1504:5): [True: 1.56M, False: 2.84M]
  ------------------
 1505|  1.56M|        return tComma;
 1506|  63.6k|    case EXCLAMATION:
  ------------------
  |  Branch (1506:5): [True: 63.6k, False: 4.34M]
  ------------------
 1507|  63.6k|        return tNotEqual;
 1508|  63.6k|    case EQUALS:
  ------------------
  |  Branch (1508:5): [True: 63.6k, False: 4.34M]
  ------------------
 1509|  63.6k|        return tEqual;
 1510|   127k|    case PERCENT_SIGN:
  ------------------
  |  Branch (1510:5): [True: 127k, False: 4.28M]
  ------------------
 1511|   127k|        return tMod;
 1512|  84.8k|    case AT:
  ------------------
  |  Branch (1512:5): [True: 84.8k, False: 4.32M]
  ------------------
 1513|  84.8k|        return tAt;
 1514|  84.8k|    case ELLIPSIS:
  ------------------
  |  Branch (1514:5): [True: 84.8k, False: 4.32M]
  ------------------
 1515|  84.8k|        return tEllipsis;
 1516|  42.4k|    case TILDE:
  ------------------
  |  Branch (1516:5): [True: 42.4k, False: 4.36M]
  ------------------
 1517|  42.4k|        return tTilde;
 1518|      0|    default :
  ------------------
  |  Branch (1518:5): [True: 0, False: 4.41M]
  ------------------
 1519|      0|        return none;
 1520|  4.41M|    }
 1521|  4.41M|}
_ZN6icu_7816PluralRuleParser10getKeyTypeERKNS_13UnicodeStringENS_9tokenTypeE:
 1528|   954k|{
 1529|   954k|    if (keyType != tKeyword) {
  ------------------
  |  Branch (1529:9): [True: 678k, False: 275k]
  ------------------
 1530|   678k|        return keyType;
 1531|   678k|    }
 1532|       |
 1533|   275k|    if (0 == token.compare(PK_VAR_N, 1)) {
  ------------------
  |  Branch (1533:9): [True: 127k, False: 148k]
  ------------------
 1534|   127k|        keyType = tVariableN;
 1535|   148k|    } else if (0 == token.compare(PK_VAR_I, 1)) {
  ------------------
  |  Branch (1535:16): [True: 0, False: 148k]
  ------------------
 1536|      0|        keyType = tVariableI;
 1537|   148k|    } else if (0 == token.compare(PK_VAR_F, 1)) {
  ------------------
  |  Branch (1537:16): [True: 0, False: 148k]
  ------------------
 1538|      0|        keyType = tVariableF;
 1539|   148k|    } else if (0 == token.compare(PK_VAR_T, 1)) {
  ------------------
  |  Branch (1539:16): [True: 0, False: 148k]
  ------------------
 1540|      0|        keyType = tVariableT;
 1541|   148k|    } else if (0 == token.compare(PK_VAR_E, 1)) {
  ------------------
  |  Branch (1541:16): [True: 0, False: 148k]
  ------------------
 1542|      0|        keyType = tVariableE;
 1543|   148k|    } else if (0 == token.compare(PK_VAR_C, 1)) {
  ------------------
  |  Branch (1543:16): [True: 0, False: 148k]
  ------------------
 1544|      0|        keyType = tVariableC;
 1545|   148k|    } else if (0 == token.compare(PK_VAR_V, 1)) {
  ------------------
  |  Branch (1545:16): [True: 0, False: 148k]
  ------------------
 1546|      0|        keyType = tVariableV;
 1547|   148k|    } else if (0 == token.compare(PK_IS, 2)) {
  ------------------
  |  Branch (1547:16): [True: 0, False: 148k]
  ------------------
 1548|      0|        keyType = tIs;
 1549|   148k|    } else if (0 == token.compare(PK_AND, 3)) {
  ------------------
  |  Branch (1549:16): [True: 63.6k, False: 84.8k]
  ------------------
 1550|  63.6k|        keyType = tAnd;
 1551|  84.8k|    } else if (0 == token.compare(PK_IN, 2)) {
  ------------------
  |  Branch (1551:16): [True: 0, False: 84.8k]
  ------------------
 1552|      0|        keyType = tIn;
 1553|  84.8k|    } else if (0 == token.compare(PK_WITHIN, 6)) {
  ------------------
  |  Branch (1553:16): [True: 0, False: 84.8k]
  ------------------
 1554|      0|        keyType = tWithin;
 1555|  84.8k|    } else if (0 == token.compare(PK_NOT, 3)) {
  ------------------
  |  Branch (1555:16): [True: 0, False: 84.8k]
  ------------------
 1556|      0|        keyType = tNot;
 1557|  84.8k|    } else if (0 == token.compare(PK_MOD, 3)) {
  ------------------
  |  Branch (1557:16): [True: 0, False: 84.8k]
  ------------------
 1558|      0|        keyType = tMod;
 1559|  84.8k|    } else if (0 == token.compare(PK_OR, 2)) {
  ------------------
  |  Branch (1559:16): [True: 0, False: 84.8k]
  ------------------
 1560|      0|        keyType = tOr;
 1561|  84.8k|    } else if (0 == token.compare(PK_DECIMAL, 7)) {
  ------------------
  |  Branch (1561:16): [True: 0, False: 84.8k]
  ------------------
 1562|      0|        keyType = tDecimal;
 1563|  84.8k|    } else if (0 == token.compare(PK_INTEGER, 7)) {
  ------------------
  |  Branch (1563:16): [True: 84.8k, False: 0]
  ------------------
 1564|  84.8k|        keyType = tInteger;
 1565|  84.8k|    }
 1566|   275k|    return keyType;
 1567|   954k|}

_ZN6icu_7812OrConstraintC2Ev:
  379|  84.8k|    OrConstraint() = default;
_ZN6icu_789RuleChainC2Ev:
  399|  84.8k|    RuleChain() = default;
_ZN6icu_7813AndConstraintC2Ev:
  364|   148k|    AndConstraint() = default;

_ZN6icu_7821RuleBasedNumberFormatC2ENS_15URBNFRuleSetTagERKNS_6LocaleER10UErrorCode:
  810|  21.2k|  : fRuleSets(nullptr)
  811|  21.2k|  , ruleSetDescriptions(nullptr)
  812|  21.2k|  , numRuleSets(0)
  813|  21.2k|  , defaultRuleSet(nullptr)
  814|  21.2k|  , locale(alocale)
  815|  21.2k|  , collator(nullptr)
  816|  21.2k|  , decimalFormatSymbols(nullptr)
  817|  21.2k|  , defaultInfinityRule(nullptr)
  818|  21.2k|  , defaultNaNRule(nullptr)
  819|  21.2k|  , fRoundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary)
  820|  21.2k|  , lenient(false)
  821|  21.2k|  , lenientParseRules(nullptr)
  822|  21.2k|  , localizations(nullptr)
  823|  21.2k|  , capitalizationInfoSet(false)
  824|  21.2k|  , capitalizationForUIListMenu(false)
  825|  21.2k|  , capitalizationForStandAlone(false)
  826|  21.2k|  , capitalizationBrkIter(nullptr)
  827|  21.2k|{
  828|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (828:9): [True: 0, False: 21.2k]
  ------------------
  829|      0|        return;
  830|      0|    }
  831|       |
  832|  21.2k|    const char* rules_tag = "RBNFRules";
  833|  21.2k|    const char* fmt_tag = "";
  834|  21.2k|    switch (tag) {
  835|      0|    case URBNF_SPELLOUT: fmt_tag = "SpelloutRules"; break;
  ------------------
  |  Branch (835:5): [True: 0, False: 21.2k]
  ------------------
  836|  21.2k|    case URBNF_ORDINAL: fmt_tag = "OrdinalRules"; break;
  ------------------
  |  Branch (836:5): [True: 21.2k, False: 0]
  ------------------
  837|      0|    case URBNF_DURATION: fmt_tag = "DurationRules"; break;
  ------------------
  |  Branch (837:5): [True: 0, False: 21.2k]
  ------------------
  838|      0|    case URBNF_NUMBERING_SYSTEM: fmt_tag = "NumberingSystemRules"; break;
  ------------------
  |  Branch (838:5): [True: 0, False: 21.2k]
  ------------------
  839|      0|    default: status = U_ILLEGAL_ARGUMENT_ERROR; return;
  ------------------
  |  Branch (839:5): [True: 0, False: 21.2k]
  ------------------
  840|  21.2k|    }
  841|       |
  842|       |    // TODO: read localization info from resource
  843|  21.2k|    LocalizationInfo* locinfo = nullptr;
  844|       |
  845|  21.2k|    UResourceBundle* nfrb = ures_open(U_ICUDATA_RBNF, locale.getName(), &status);
  ------------------
  |  | 1691|  21.2k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  UResourceBundle* nfrb = ures_open(U_ICUDATA_RBNF, locale.getName(), &status);
  ------------------
  |  |   46|  21.2k|#define U_ICUDATA_RBNF U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "rbnf"
  |  |  ------------------
  |  |  |  |  154|  21.2k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  846|  21.2k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (846:9): [True: 21.2k, False: 0]
  ------------------
  847|  21.2k|        setLocaleIDs(ures_getLocaleByType(nfrb, ULOC_VALID_LOCALE, &status),
  ------------------
  |  | 1669|  21.2k|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  848|  21.2k|                     ures_getLocaleByType(nfrb, ULOC_ACTUAL_LOCALE, &status));
  ------------------
  |  | 1669|  21.2k|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  849|       |
  850|  21.2k|        UResourceBundle* rbnfRules = ures_getByKeyWithFallback(nfrb, rules_tag, nullptr, &status);
  ------------------
  |  | 1662|  21.2k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  851|  21.2k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (851:13): [True: 0, False: 21.2k]
  ------------------
  852|      0|            ures_close(nfrb);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  853|      0|        }
  854|  21.2k|        UResourceBundle* ruleSets = ures_getByKeyWithFallback(rbnfRules, fmt_tag, nullptr, &status);
  ------------------
  |  | 1662|  21.2k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  855|  21.2k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (855:13): [True: 0, False: 21.2k]
  ------------------
  856|      0|            ures_close(rbnfRules);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  857|      0|            ures_close(nfrb);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  858|      0|            return;
  859|      0|        }
  860|       |
  861|  21.2k|        UnicodeString desc;
  862|  84.8k|        while (ures_hasNext(ruleSets)) {
  ------------------
  |  | 1689|  84.8k|#define ures_hasNext U_ICU_ENTRY_POINT_RENAME(ures_hasNext)
  |  |  ------------------
  |  |  |  |  123|  84.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  84.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  84.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (862:16): [True: 63.6k, False: 21.2k]
  ------------------
  863|  63.6k|           desc.append(ures_getNextUnicodeString(ruleSets,nullptr,&status));
  864|  63.6k|        }
  865|  21.2k|        UParseError perror;
  866|       |
  867|  21.2k|        init(desc, locinfo, perror, status);
  868|       |
  869|  21.2k|        ures_close(ruleSets);
  ------------------
  |  | 1652|  21.2k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  870|  21.2k|        ures_close(rbnfRules);
  ------------------
  |  | 1652|  21.2k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  871|  21.2k|    }
  872|  21.2k|    ures_close(nfrb);
  ------------------
  |  | 1652|  21.2k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  873|  21.2k|}
_ZN6icu_7821RuleBasedNumberFormatD2Ev:
  929|  21.2k|{
  930|  21.2k|    dispose();
  931|  21.2k|}
_ZNK6icu_7821RuleBasedNumberFormat11findRuleSetERKNS_13UnicodeStringER10UErrorCode:
 1106|  1.16k|{
 1107|  1.16k|    if (U_SUCCESS(status) && fRuleSets) {
  ------------------
  |  Branch (1107:9): [True: 1.16k, False: 0]
  |  Branch (1107:30): [True: 1.16k, False: 0]
  ------------------
 1108|  1.91k|        for (NFRuleSet** p = fRuleSets; *p; ++p) {
  ------------------
  |  Branch (1108:41): [True: 1.16k, False: 750]
  ------------------
 1109|  1.16k|            NFRuleSet* rs = *p;
 1110|  1.16k|            if (rs->isNamed(name)) {
  ------------------
  |  Branch (1110:17): [True: 413, False: 750]
  ------------------
 1111|    413|                return rs;
 1112|    413|            }
 1113|  1.16k|        }
 1114|    750|        status = U_ILLEGAL_ARGUMENT_ERROR;
 1115|    750|    }
 1116|    750|    return nullptr;
 1117|  1.16k|}
_ZN6icu_7821RuleBasedNumberFormat17setDefaultRuleSetERKNS_13UnicodeStringER10UErrorCode:
 1412|  2.02k|RuleBasedNumberFormat::setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status) {
 1413|  2.02k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1413:9): [True: 2.02k, False: 0]
  ------------------
 1414|  2.02k|        if (ruleSetName.isEmpty()) {
  ------------------
  |  Branch (1414:13): [True: 0, False: 2.02k]
  ------------------
 1415|      0|          if (localizations) {
  ------------------
  |  Branch (1415:15): [True: 0, False: 0]
  ------------------
 1416|      0|              UnicodeString name(true, localizations->getRuleSetName(0), -1);
 1417|      0|              defaultRuleSet = findRuleSet(name, status);
 1418|      0|          } else {
 1419|      0|            initDefaultRuleSet();
 1420|      0|          }
 1421|  2.02k|        } else if (ruleSetName.startsWith(UNICODE_STRING_SIMPLE("%%"))) {
  ------------------
  |  |  135|  2.02k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  2.02k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  |  Branch (1421:20): [True: 859, False: 1.16k]
  ------------------
 1422|    859|            status = U_ILLEGAL_ARGUMENT_ERROR;
 1423|  1.16k|        } else {
 1424|  1.16k|            NFRuleSet* result = findRuleSet(ruleSetName, status);
 1425|  1.16k|            if (result != nullptr) {
  ------------------
  |  Branch (1425:17): [True: 413, False: 750]
  ------------------
 1426|    413|                defaultRuleSet = result;
 1427|    413|            }
 1428|  1.16k|        }
 1429|  2.02k|    }
 1430|  2.02k|}
_ZN6icu_7821RuleBasedNumberFormat18initDefaultRuleSetEv:
 1445|  21.2k|{
 1446|  21.2k|    defaultRuleSet = nullptr;
 1447|  21.2k|    if (!fRuleSets) {
  ------------------
  |  Branch (1447:9): [True: 0, False: 21.2k]
  ------------------
 1448|      0|        return;
 1449|      0|    }
 1450|       |
 1451|  21.2k|    const UnicodeString spellout(UNICODE_STRING_SIMPLE("%spellout-numbering"));
  ------------------
  |  |  135|  21.2k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  21.2k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
 1452|  21.2k|    const UnicodeString ordinal(UNICODE_STRING_SIMPLE("%digits-ordinal"));
  ------------------
  |  |  135|  21.2k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  21.2k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
 1453|  21.2k|    const UnicodeString duration(UNICODE_STRING_SIMPLE("%duration"));
  ------------------
  |  |  135|  21.2k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  21.2k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
 1454|       |
 1455|  21.2k|    NFRuleSet**p = &fRuleSets[0];
 1456|  21.2k|    while (*p) {
  ------------------
  |  Branch (1456:12): [True: 21.2k, False: 0]
  ------------------
 1457|  21.2k|        if ((*p)->isNamed(spellout) || (*p)->isNamed(ordinal) || (*p)->isNamed(duration)) {
  ------------------
  |  Branch (1457:13): [True: 0, False: 21.2k]
  |  Branch (1457:40): [True: 21.2k, False: 0]
  |  Branch (1457:66): [True: 0, False: 0]
  ------------------
 1458|  21.2k|            defaultRuleSet = *p;
 1459|  21.2k|            return;
 1460|  21.2k|        } else {
 1461|      0|            ++p;
 1462|      0|        }
 1463|  21.2k|    }
 1464|       |
 1465|      0|    defaultRuleSet = *--p;
 1466|      0|    if (!defaultRuleSet->isPublic()) {
  ------------------
  |  Branch (1466:9): [True: 0, False: 0]
  ------------------
 1467|      0|        while (p != fRuleSets) {
  ------------------
  |  Branch (1467:16): [True: 0, False: 0]
  ------------------
 1468|      0|            if ((*--p)->isPublic()) {
  ------------------
  |  Branch (1468:17): [True: 0, False: 0]
  ------------------
 1469|      0|                defaultRuleSet = *p;
 1470|      0|                break;
 1471|      0|            }
 1472|      0|        }
 1473|      0|    }
 1474|      0|}
_ZN6icu_7821RuleBasedNumberFormat4initERKNS_13UnicodeStringEPNS_16LocalizationInfoER11UParseErrorR10UErrorCode:
 1480|  21.2k|{
 1481|       |    // TODO: implement UParseError
 1482|  21.2k|    uprv_memset(&pErr, 0, sizeof(UParseError));
  ------------------
  |  |  100|  21.2k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  21.2k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1483|       |    // Note: this can leave ruleSets == nullptr, so remaining code should check
 1484|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1484:9): [True: 0, False: 21.2k]
  ------------------
 1485|      0|        return;
 1486|      0|    }
 1487|       |
 1488|  21.2k|    initializeDecimalFormatSymbols(status);
 1489|  21.2k|    initializeDefaultInfinityRule(status);
 1490|  21.2k|    initializeDefaultNaNRule(status);
 1491|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1491:9): [True: 0, False: 21.2k]
  ------------------
 1492|      0|        return;
 1493|      0|    }
 1494|       |
 1495|  21.2k|    this->localizations = localizationInfos == nullptr ? nullptr : localizationInfos->ref();
  ------------------
  |  Branch (1495:27): [True: 21.2k, False: 0]
  ------------------
 1496|       |
 1497|  21.2k|    UnicodeString description(rules);
 1498|  21.2k|    if (!description.length()) {
  ------------------
  |  Branch (1498:9): [True: 0, False: 21.2k]
  ------------------
 1499|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1500|      0|        return;
 1501|      0|    }
 1502|       |
 1503|       |    // start by stripping the trailing whitespace from all the rules
 1504|       |    // (this is all the whitespace following each semicolon in the
 1505|       |    // description).  This allows us to look for rule-set boundaries
 1506|       |    // by searching for ";%" without having to worry about whitespace
 1507|       |    // between the ; and the %
 1508|  21.2k|    stripWhitespace(description);
 1509|       |
 1510|       |    // check to see if there's a set of lenient-parse rules.  If there
 1511|       |    // is, pull them out into our temporary holding place for them,
 1512|       |    // and delete them from the description before the real desciption-
 1513|       |    // parsing code sees them
 1514|  21.2k|    int32_t lp = description.indexOf(gLenientParse, -1, 0);
 1515|  21.2k|    if (lp != -1) {
  ------------------
  |  Branch (1515:9): [True: 0, False: 21.2k]
  ------------------
 1516|       |        // we've got to make sure we're not in the middle of a rule
 1517|       |        // (where "%%lenient-parse" would actually get treated as
 1518|       |        // rule text)
 1519|      0|        if (lp == 0 || description.charAt(lp - 1) == gSemiColon) {
  ------------------
  |  Branch (1519:13): [True: 0, False: 0]
  |  Branch (1519:24): [True: 0, False: 0]
  ------------------
 1520|       |            // locate the beginning and end of the actual collation
 1521|       |            // rules (there may be whitespace between the name and
 1522|       |            // the first token in the description)
 1523|      0|            int lpEnd = description.indexOf(gSemiPercent, 2, lp);
 1524|       |
 1525|      0|            if (lpEnd == -1) {
  ------------------
  |  Branch (1525:17): [True: 0, False: 0]
  ------------------
 1526|      0|                lpEnd = description.length() - 1;
 1527|      0|            }
 1528|      0|            int lpStart = lp + u_strlen(gLenientParse);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1529|      0|            while (PatternProps::isWhiteSpace(description.charAt(lpStart))) {
  ------------------
  |  Branch (1529:20): [True: 0, False: 0]
  ------------------
 1530|      0|                ++lpStart;
 1531|      0|            }
 1532|       |
 1533|       |            // copy out the lenient-parse rules and delete them
 1534|       |            // from the description
 1535|      0|            lenientParseRules = new UnicodeString();
 1536|       |            /* test for nullptr */
 1537|      0|            if (lenientParseRules == nullptr) {
  ------------------
  |  Branch (1537:17): [True: 0, False: 0]
  ------------------
 1538|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 1539|      0|                return;
 1540|      0|            }
 1541|      0|            lenientParseRules->setTo(description, lpStart, lpEnd - lpStart);
 1542|       |
 1543|      0|            description.remove(lp, lpEnd + 1 - lp);
 1544|      0|        }
 1545|      0|    }
 1546|       |
 1547|       |    // pre-flight parsing the description and count the number of
 1548|       |    // rule sets (";%" marks the end of one rule set and the beginning
 1549|       |    // of the next)
 1550|  21.2k|    numRuleSets = 0;
 1551|  21.2k|    for (int32_t p = description.indexOf(gSemiPercent, 2, 0); p != -1; p = description.indexOf(gSemiPercent, 2, p)) {
  ------------------
  |  Branch (1551:63): [True: 0, False: 21.2k]
  ------------------
 1552|      0|        ++numRuleSets;
 1553|      0|        ++p;
 1554|      0|    }
 1555|  21.2k|    ++numRuleSets;
 1556|       |
 1557|       |    // our rule list is an array of the appropriate size
 1558|  21.2k|    fRuleSets = static_cast<NFRuleSet**>(uprv_malloc((numRuleSets + 1) * sizeof(NFRuleSet*)));
  ------------------
  |  | 1524|  21.2k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1559|       |    /* test for nullptr */
 1560|  21.2k|    if (fRuleSets == nullptr) {
  ------------------
  |  Branch (1560:9): [True: 0, False: 21.2k]
  ------------------
 1561|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1562|      0|        return;
 1563|      0|    }
 1564|       |
 1565|  63.6k|    for (int i = 0; i <= numRuleSets; ++i) {
  ------------------
  |  Branch (1565:21): [True: 42.4k, False: 21.2k]
  ------------------
 1566|  42.4k|        fRuleSets[i] = nullptr;
 1567|  42.4k|    }
 1568|       |
 1569|       |    // divide up the descriptions into individual rule-set descriptions
 1570|       |    // and store them in a temporary array.  At each step, we also
 1571|       |    // create a rule set, but all this does is initialize its name
 1572|       |    // and remove it from its description.  We can't actually parse
 1573|       |    // the rest of the descriptions and finish initializing everything
 1574|       |    // because we have to know the names and locations of all the rule
 1575|       |    // sets before we can actually set everything up
 1576|  21.2k|    if (!numRuleSets) {
  ------------------
  |  Branch (1576:9): [True: 0, False: 21.2k]
  ------------------
 1577|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 1578|      0|        return;
 1579|      0|    }
 1580|       |
 1581|  21.2k|    ruleSetDescriptions = new UnicodeString[numRuleSets];
 1582|  21.2k|    if (ruleSetDescriptions == nullptr) {
  ------------------
  |  Branch (1582:9): [True: 0, False: 21.2k]
  ------------------
 1583|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1584|      0|        return;
 1585|      0|    }
 1586|       |
 1587|  21.2k|    {
 1588|  21.2k|        int curRuleSet = 0;
 1589|  21.2k|        int32_t start = 0;
 1590|  21.2k|        for (int32_t p = description.indexOf(gSemiPercent, 2, 0); p != -1; p = description.indexOf(gSemiPercent, 2, start)) {
  ------------------
  |  Branch (1590:67): [True: 0, False: 21.2k]
  ------------------
 1591|      0|            ruleSetDescriptions[curRuleSet].setTo(description, start, p + 1 - start);
 1592|      0|            fRuleSets[curRuleSet] = new NFRuleSet(this, ruleSetDescriptions, curRuleSet, status);
 1593|      0|            if (fRuleSets[curRuleSet] == nullptr) {
  ------------------
  |  Branch (1593:17): [True: 0, False: 0]
  ------------------
 1594|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 1595|      0|                return;
 1596|      0|            }
 1597|      0|            ++curRuleSet;
 1598|      0|            start = p + 1;
 1599|      0|        }
 1600|  21.2k|        ruleSetDescriptions[curRuleSet].setTo(description, start, description.length() - start);
 1601|  21.2k|        fRuleSets[curRuleSet] = new NFRuleSet(this, ruleSetDescriptions, curRuleSet, status);
 1602|  21.2k|        if (fRuleSets[curRuleSet] == nullptr) {
  ------------------
  |  Branch (1602:13): [True: 0, False: 21.2k]
  ------------------
 1603|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1604|      0|            return;
 1605|      0|        }
 1606|  21.2k|    }
 1607|       |
 1608|       |    // now we can take note of the formatter's default rule set, which
 1609|       |    // is the last public rule set in the description (it's the last
 1610|       |    // rather than the first so that a user can create a new formatter
 1611|       |    // from an existing formatter and change its default behavior just
 1612|       |    // by appending more rule sets to the end)
 1613|       |
 1614|       |    // {dlf} Initialization of a fraction rule set requires the default rule
 1615|       |    // set to be known.  For purposes of initialization, this is always the 
 1616|       |    // last public rule set, no matter what the localization data says.
 1617|  21.2k|    initDefaultRuleSet();
 1618|       |
 1619|       |    // Now that we know all the rule names, we can go back through
 1620|       |    // the temporary descriptions list and finish setting up the substructure
 1621|       |    // (and we throw away the temporary descriptions as we go)
 1622|  21.2k|    {
 1623|  42.4k|        for (int i = 0; i < numRuleSets; i++) {
  ------------------
  |  Branch (1623:25): [True: 21.2k, False: 21.2k]
  ------------------
 1624|  21.2k|            fRuleSets[i]->parseRules(ruleSetDescriptions[i], status);
 1625|  21.2k|        }
 1626|  21.2k|    }
 1627|       |
 1628|       |    // Now that the rules are initialized, the 'real' default rule
 1629|       |    // set can be adjusted by the localization data.
 1630|       |
 1631|       |    // The C code keeps the localization array as is, rather than building
 1632|       |    // a separate array of the public rule set names, so we have less work
 1633|       |    // to do here-- but we still need to check the names.
 1634|       |    
 1635|  21.2k|    if (localizationInfos) {
  ------------------
  |  Branch (1635:9): [True: 0, False: 21.2k]
  ------------------
 1636|       |        // confirm the names, if any aren't in the rules, that's an error
 1637|       |        // it is ok if the rules contain public rule sets that are not in this list
 1638|      0|        for (int32_t i = 0; i < localizationInfos->getNumberOfRuleSets(); ++i) {
  ------------------
  |  Branch (1638:29): [True: 0, False: 0]
  ------------------
 1639|      0|            UnicodeString name(true, localizationInfos->getRuleSetName(i), -1);
 1640|      0|            NFRuleSet* rs = findRuleSet(name, status);
 1641|      0|            if (rs == nullptr) {
  ------------------
  |  Branch (1641:17): [True: 0, False: 0]
  ------------------
 1642|      0|                break; // error
 1643|      0|            }
 1644|      0|            if (i == 0) {
  ------------------
  |  Branch (1644:17): [True: 0, False: 0]
  ------------------
 1645|      0|                defaultRuleSet = rs;
 1646|      0|            }
 1647|      0|        }
 1648|  21.2k|    } else {
 1649|  21.2k|        defaultRuleSet = getDefaultRuleSet();
 1650|  21.2k|    }
 1651|  21.2k|    originalDescription = rules;
 1652|  21.2k|}
_ZN6icu_7821RuleBasedNumberFormat15stripWhitespaceERNS_13UnicodeStringE:
 1704|  21.2k|{
 1705|       |    // iterate through the characters...
 1706|  21.2k|    UnicodeString result;
 1707|       |
 1708|  21.2k|    int start = 0;
 1709|  21.2k|    UChar ch;
 1710|  63.6k|    while (start < description.length()) {
  ------------------
  |  Branch (1710:12): [True: 42.4k, False: 21.2k]
  ------------------
 1711|       |        // Seek to the first non-whitespace character...
 1712|       |        // If the first non-whitespace character is semicolon, skip it and continue
 1713|  42.4k|        while (start < description.length()
  ------------------
  |  Branch (1713:16): [True: 42.4k, False: 0]
  ------------------
 1714|  42.4k|            && (PatternProps::isWhiteSpace(ch = description.charAt(start)) || ch == gSemiColon))
  ------------------
  |  Branch (1714:17): [True: 0, False: 42.4k]
  |  Branch (1714:79): [True: 0, False: 42.4k]
  ------------------
 1715|      0|        {
 1716|      0|            ++start;
 1717|      0|        }
 1718|       |
 1719|       |        // locate the next semicolon in the text and copy the text from
 1720|       |        // our current position up to that semicolon into the result
 1721|  42.4k|        int32_t p = description.indexOf(gSemiColon, start);
 1722|  42.4k|        if (p == -1) {
  ------------------
  |  Branch (1722:13): [True: 0, False: 42.4k]
  ------------------
 1723|       |            // or if we don't find a semicolon, just copy the rest of
 1724|       |            // the string into the result
 1725|      0|            result.append(description, start, description.length() - start);
 1726|      0|            break;
 1727|      0|        }
 1728|  42.4k|        else if (p < description.length()) {
  ------------------
  |  Branch (1728:18): [True: 42.4k, False: 0]
  ------------------
 1729|  42.4k|            result.append(description, start, p + 1 - start);
 1730|  42.4k|            start = p + 1;
 1731|  42.4k|        }
 1732|       |        // when we get here from the else, we've seeked off the end of the string, and
 1733|       |        // we terminate the loop (we continue until *start* is -1 rather
 1734|       |        // than until *p* is -1, because otherwise we'd miss the last
 1735|       |        // rule in the description)
 1736|  42.4k|    }
 1737|       |
 1738|  21.2k|    description.setTo(result);
 1739|  21.2k|}
_ZN6icu_7821RuleBasedNumberFormat7disposeEv:
 1744|  21.2k|{
 1745|  21.2k|    if (fRuleSets) {
  ------------------
  |  Branch (1745:9): [True: 21.2k, False: 0]
  ------------------
 1746|  42.4k|        for (NFRuleSet** p = fRuleSets; *p; ++p) {
  ------------------
  |  Branch (1746:41): [True: 21.2k, False: 21.2k]
  ------------------
 1747|  21.2k|            delete *p;
 1748|  21.2k|        }
 1749|  21.2k|        uprv_free(fRuleSets);
  ------------------
  |  | 1503|  21.2k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  21.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1750|  21.2k|        fRuleSets = nullptr;
 1751|  21.2k|    }
 1752|       |
 1753|  21.2k|    if (ruleSetDescriptions) {
  ------------------
  |  Branch (1753:9): [True: 21.2k, False: 0]
  ------------------
 1754|  21.2k|        delete [] ruleSetDescriptions;
 1755|  21.2k|        ruleSetDescriptions = nullptr;
 1756|  21.2k|    }
 1757|       |
 1758|  21.2k|#if !UCONFIG_NO_COLLATION
 1759|  21.2k|    delete collator;
 1760|  21.2k|#endif
 1761|  21.2k|    collator = nullptr;
 1762|       |
 1763|  21.2k|    delete decimalFormatSymbols;
 1764|  21.2k|    decimalFormatSymbols = nullptr;
 1765|       |
 1766|  21.2k|    delete defaultInfinityRule;
 1767|  21.2k|    defaultInfinityRule = nullptr;
 1768|       |
 1769|  21.2k|    delete defaultNaNRule;
 1770|  21.2k|    defaultNaNRule = nullptr;
 1771|       |
 1772|  21.2k|    delete lenientParseRules;
 1773|  21.2k|    lenientParseRules = nullptr;
 1774|       |
 1775|  21.2k|#if !UCONFIG_NO_BREAK_ITERATION
 1776|  21.2k|    delete capitalizationBrkIter;
 1777|  21.2k|    capitalizationBrkIter = nullptr;
 1778|  21.2k|#endif
 1779|       |
 1780|  21.2k|    if (localizations) {
  ------------------
  |  Branch (1780:9): [True: 0, False: 21.2k]
  ------------------
 1781|      0|        localizations = localizations->unref();
 1782|      0|    }
 1783|  21.2k|}
_ZN6icu_7821RuleBasedNumberFormat30initializeDecimalFormatSymbolsER10UErrorCode:
 1848|  21.2k|{
 1849|       |    // lazy-evaluate the DecimalFormatSymbols object.  This object
 1850|       |    // is shared by all DecimalFormat instances belonging to this
 1851|       |    // formatter
 1852|  21.2k|    if (decimalFormatSymbols == nullptr) {
  ------------------
  |  Branch (1852:9): [True: 21.2k, False: 0]
  ------------------
 1853|  21.2k|        LocalPointer<DecimalFormatSymbols> temp(new DecimalFormatSymbols(locale, status), status);
 1854|  21.2k|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1854:13): [True: 21.2k, False: 0]
  ------------------
 1855|  21.2k|            decimalFormatSymbols = temp.orphan();
 1856|  21.2k|        }
 1857|  21.2k|    }
 1858|  21.2k|    return decimalFormatSymbols;
 1859|  21.2k|}
_ZNK6icu_7821RuleBasedNumberFormat23getDecimalFormatSymbolsEv:
 1867|  63.6k|{
 1868|  63.6k|    return decimalFormatSymbols;
 1869|  63.6k|}
_ZN6icu_7821RuleBasedNumberFormat29initializeDefaultInfinityRuleER10UErrorCode:
 1873|  21.2k|{
 1874|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1874:9): [True: 0, False: 21.2k]
  ------------------
 1875|      0|        return nullptr;
 1876|      0|    }
 1877|  21.2k|    if (defaultInfinityRule == nullptr) {
  ------------------
  |  Branch (1877:9): [True: 21.2k, False: 0]
  ------------------
 1878|  21.2k|        UnicodeString rule(UNICODE_STRING_SIMPLE("Inf: "));
  ------------------
  |  |  135|  21.2k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  21.2k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
 1879|  21.2k|        rule.append(getDecimalFormatSymbols()->getSymbol(DecimalFormatSymbols::kInfinitySymbol));
 1880|  21.2k|        LocalPointer<NFRule> temp(new NFRule(this, rule, status), status);
 1881|  21.2k|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1881:13): [True: 21.2k, False: 0]
  ------------------
 1882|  21.2k|            defaultInfinityRule = temp.orphan();
 1883|  21.2k|        }
 1884|  21.2k|    }
 1885|  21.2k|    return defaultInfinityRule;
 1886|  21.2k|}
_ZN6icu_7821RuleBasedNumberFormat24initializeDefaultNaNRuleER10UErrorCode:
 1896|  21.2k|{
 1897|  21.2k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1897:9): [True: 0, False: 21.2k]
  ------------------
 1898|      0|        return nullptr;
 1899|      0|    }
 1900|  21.2k|    if (defaultNaNRule == nullptr) {
  ------------------
  |  Branch (1900:9): [True: 21.2k, False: 0]
  ------------------
 1901|  21.2k|        UnicodeString rule(UNICODE_STRING_SIMPLE("NaN: "));
  ------------------
  |  |  135|  21.2k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  21.2k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
 1902|  21.2k|        rule.append(getDecimalFormatSymbols()->getSymbol(DecimalFormatSymbols::kNaNSymbol));
 1903|  21.2k|        LocalPointer<NFRule> temp(new NFRule(this, rule, status), status);
 1904|  21.2k|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1904:13): [True: 21.2k, False: 0]
  ------------------
 1905|  21.2k|            defaultNaNRule = temp.orphan();
 1906|  21.2k|        }
 1907|  21.2k|    }
 1908|  21.2k|    return defaultNaNRule;
 1909|  21.2k|}
_ZNK6icu_7821RuleBasedNumberFormat18createPluralFormatE11UPluralTypeRKNS_13UnicodeStringER10UErrorCode:
 1959|  21.2k|{
 1960|  21.2k|    auto *pf = new PluralFormat(locale, pluralType, pattern, status);
 1961|  21.2k|    if (pf == nullptr) {
  ------------------
  |  Branch (1961:9): [True: 0, False: 21.2k]
  ------------------
 1962|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1963|      0|    }
 1964|  21.2k|    return pf;
 1965|  21.2k|}

_ZN6icu_7814SharedCalendarC2EPNS_8CalendarE:
   24|      2|    SharedCalendar(Calendar *calToAdopt) : ptr(calToAdopt) { }
_ZNK6icu_7814SharedCalendarptEv:
   27|  58.2k|    const Calendar *operator->() const { return ptr; }

_ZN6icu_7823SharedDateFormatSymbolsC2ERKNS_6LocaleEPKcR10UErrorCode:
   29|      2|            : dfs(loc, type, status) { }
_ZNK6icu_7823SharedDateFormatSymbols3getEv:
   31|  56.1k|    const DateFormatSymbols &get() const { return dfs; }

_ZNK6icu_7818SharedNumberFormatptEv:
   27|  77.3k|    const NumberFormat *operator->() const { return ptr; }
_ZN6icu_7818SharedNumberFormatC2EPNS_12NumberFormatE:
   24|      2|    SharedNumberFormat(NumberFormat *nfToAdopt) : ptr(nfToAdopt) { }

_ZN6icu_7816SimpleDateFormatD2Ev:
  334|  56.1k|{
  335|  56.1k|    delete fSymbols;
  336|  56.1k|    if (fSharedNumberFormatters) {
  ------------------
  |  Branch (336:9): [True: 0, False: 56.1k]
  ------------------
  337|      0|        freeSharedNumberFormatters(fSharedNumberFormatters);
  338|      0|    }
  339|  56.1k|    delete fTimeZoneFormat;
  340|  56.1k|    delete fSimpleNumberFormatter;
  341|       |
  342|  56.1k|#if !UCONFIG_NO_BREAK_ITERATION
  343|  56.1k|    delete fCapitalizationBrkIter;
  344|  56.1k|#endif
  345|  56.1k|}
_ZN6icu_7816SimpleDateFormatC2ERKNS_13UnicodeStringERKNS_6LocaleER10UErrorCode:
  398|  36.9k|:   fPattern(pattern),
  399|  36.9k|    fLocale(locale)
  400|  36.9k|{
  401|       |
  402|  36.9k|    fDateOverride.setToBogus();
  403|  36.9k|    fTimeOverride.setToBogus();
  404|  36.9k|    initializeBooleanAttributes();
  405|       |
  406|  36.9k|    initializeCalendar(nullptr,fLocale,status);
  407|  36.9k|    fSymbols = DateFormatSymbols::createForLocale(fLocale, status);
  408|  36.9k|    initialize(fLocale, status);
  409|  36.9k|    initializeDefaultCentury();
  410|  36.9k|}
_ZN6icu_7816SimpleDateFormatC2ENS_10DateFormat6EStyleES2_RKNS_6LocaleER10UErrorCode:
  480|  19.2k|:   fLocale(locale)
  481|  19.2k|{
  482|  19.2k|    initializeBooleanAttributes();
  483|  19.2k|    construct(timeStyle, dateStyle, fLocale, status);
  484|  19.2k|    if(U_SUCCESS(status)) {
  ------------------
  |  Branch (484:8): [True: 19.2k, False: 0]
  ------------------
  485|  19.2k|      initializeDefaultCentury();
  486|  19.2k|    }
  487|  19.2k|}
_ZN6icu_7816SimpleDateFormat9constructENS_10DateFormat6EStyleES2_RKNS_6LocaleER10UErrorCode:
  665|  19.2k|{
  666|       |    // called by several constructors to load pattern data from the resources
  667|  19.2k|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (667:9): [True: 0, False: 19.2k]
  ------------------
  668|       |
  669|       |    // We will need the calendar to know what type of symbols to load.
  670|  19.2k|    initializeCalendar(nullptr, locale, status);
  671|  19.2k|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (671:9): [True: 0, False: 19.2k]
  ------------------
  672|       |
  673|       |    // Load date time patterns directly from resources.
  674|  19.2k|    const char* cType = fCalendar ? fCalendar->getType() : nullptr;
  ------------------
  |  Branch (674:25): [True: 19.2k, False: 0]
  ------------------
  675|  19.2k|    LocalUResourceBundlePointer bundle(ures_open(nullptr, locale.getBaseName(), &status));
  ------------------
  |  | 1691|  19.2k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  19.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  19.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  19.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  676|  19.2k|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (676:9): [True: 0, False: 19.2k]
  ------------------
  677|       |
  678|  19.2k|    UBool cTypeIsGregorian = true;
  679|  19.2k|    LocalUResourceBundlePointer dateTimePatterns;
  680|  19.2k|    if (cType != nullptr && uprv_strcmp(cType, "gregorian") != 0) {
  ------------------
  |  |   38|  19.2k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  19.2k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (680:9): [True: 19.2k, False: 0]
  |  Branch (680:29): [True: 0, False: 19.2k]
  ------------------
  681|      0|        CharString resourcePath("calendar/", status);
  682|      0|        resourcePath.append(cType, status).append("/DateTimePatterns", status);
  683|      0|        dateTimePatterns.adoptInstead(
  684|      0|            ures_getByKeyWithFallback(bundle.getAlias(), resourcePath.data(),
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  685|      0|                                      (UResourceBundle*)nullptr, &status));
  686|      0|        cTypeIsGregorian = false;
  687|      0|    }
  688|       |
  689|       |    // Check for "gregorian" fallback.
  690|  19.2k|    if (cTypeIsGregorian || status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (690:9): [True: 19.2k, False: 0]
  |  Branch (690:29): [True: 0, False: 0]
  ------------------
  691|  19.2k|        status = U_ZERO_ERROR;
  692|  19.2k|        dateTimePatterns.adoptInstead(
  693|  19.2k|            ures_getByKeyWithFallback(bundle.getAlias(),
  ------------------
  |  | 1662|  19.2k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|  19.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  19.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  19.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  694|  19.2k|                                      "calendar/gregorian/DateTimePatterns",
  695|  19.2k|                                      (UResourceBundle*)nullptr, &status));
  696|  19.2k|    }
  697|  19.2k|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (697:9): [True: 0, False: 19.2k]
  ------------------
  698|       |
  699|  19.2k|    LocalUResourceBundlePointer currentBundle;
  700|       |
  701|  19.2k|    if (ures_getSize(dateTimePatterns.getAlias()) <= kDateTime)
  ------------------
  |  | 1674|  19.2k|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  123|  19.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  19.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  19.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (701:9): [True: 0, False: 19.2k]
  ------------------
  702|      0|    {
  703|      0|        status = U_INVALID_FORMAT_ERROR;
  704|      0|        return;
  705|      0|    }
  706|       |
  707|  19.2k|    setLocaleIDs(ures_getLocaleByType(dateTimePatterns.getAlias(), ULOC_VALID_LOCALE, &status),
  ------------------
  |  | 1669|  19.2k|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|  19.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  19.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  19.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  708|  19.2k|                 ures_getLocaleByType(dateTimePatterns.getAlias(), ULOC_ACTUAL_LOCALE, &status));
  ------------------
  |  | 1669|  19.2k|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|  19.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  19.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  19.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  709|       |
  710|       |    // create a symbols object from the locale
  711|  19.2k|    fSymbols = DateFormatSymbols::createForLocale(locale, status);
  712|  19.2k|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (712:9): [True: 0, False: 19.2k]
  ------------------
  713|       |    /* test for nullptr */
  714|  19.2k|    if (fSymbols == nullptr) {
  ------------------
  |  Branch (714:9): [True: 0, False: 19.2k]
  ------------------
  715|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  716|      0|        return;
  717|      0|    }
  718|       |
  719|  19.2k|    const char16_t *resStr,*ovrStr;
  720|  19.2k|    int32_t resStrLen,ovrStrLen = 0;
  721|  19.2k|    fDateOverride.setToBogus();
  722|  19.2k|    fTimeOverride.setToBogus();
  723|       |
  724|  19.2k|    UnicodeString timePattern;
  725|  19.2k|    if (timeStyle >= kFull && timeStyle <= kShort) {
  ------------------
  |  Branch (725:9): [True: 0, False: 19.2k]
  |  Branch (725:31): [True: 0, False: 0]
  ------------------
  726|      0|        bool hasRgOrHcSubtag = false;
  727|       |        // also use DTPG if the locale has the "rg" or "hc" ("hours") subtag-- even if the overriding region
  728|       |        // or hour cycle is the same as the one we get by default, we go through the DateTimePatternGenerator
  729|      0|        UErrorCode dummyErr1 = U_ZERO_ERROR, dummyErr2 = U_ZERO_ERROR;
  730|      0|        if (locale.getKeywordValue("rg", nullptr, 0, dummyErr1) > 0 || locale.getKeywordValue("hours", nullptr, 0, dummyErr2) > 0) {
  ------------------
  |  Branch (730:13): [True: 0, False: 0]
  |  Branch (730:72): [True: 0, False: 0]
  ------------------
  731|      0|            hasRgOrHcSubtag = true;
  732|      0|        }
  733|       |
  734|      0|        const char* baseLocID = locale.getBaseName();
  735|      0|        if (baseLocID != nullptr && uprv_strcmp(baseLocID,"und")!=0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (735:13): [True: 0, False: 0]
  |  Branch (735:37): [True: 0, False: 0]
  ------------------
  736|      0|            UErrorCode useStatus = U_ZERO_ERROR;
  737|      0|            Locale baseLoc(baseLocID);
  738|      0|            Locale validLoc(getLocale(ULOC_VALID_LOCALE, useStatus));
  739|      0|            if (hasRgOrHcSubtag || (U_SUCCESS(useStatus) && validLoc!=baseLoc)) {
  ------------------
  |  Branch (739:17): [True: 0, False: 0]
  |  Branch (739:37): [True: 0, False: 0]
  |  Branch (739:61): [True: 0, False: 0]
  ------------------
  740|      0|                bool useDTPG = hasRgOrHcSubtag;
  741|      0|                const char* baseReg = baseLoc.getCountry(); // empty string if no region
  742|      0|                if ((baseReg != nullptr && baseReg[0] != 0 &&
  ------------------
  |  Branch (742:22): [True: 0, False: 0]
  |  Branch (742:44): [True: 0, False: 0]
  ------------------
  743|      0|                     uprv_strncmp(baseReg,validLoc.getCountry(),ULOC_COUNTRY_CAPACITY)!=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 (743:22): [True: 0, False: 0]
  ------------------
  744|      0|                        || uprv_strncmp(baseLoc.getLanguage(),validLoc.getLanguage(),ULOC_LANG_CAPACITY)!=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 (744:28): [True: 0, False: 0]
  ------------------
  745|       |                    // use DTPG if
  746|       |                    // * baseLoc has a region and validLoc does not have the same one (or has none), OR
  747|       |                    // * validLoc has a different language code than baseLoc
  748|       |                    // * the original locale has the rg or hc subtag
  749|      0|                    useDTPG = true;
  750|      0|                }
  751|      0|                if (useDTPG) {
  ------------------
  |  Branch (751:21): [True: 0, False: 0]
  ------------------
  752|       |                    // The standard time formats may have the wrong time cycle, because:
  753|       |                    // the valid locale differs in important ways (region, language) from
  754|       |                    // the base locale.
  755|       |                    // We could *also* check whether they do actually have a mismatch with
  756|       |                    // the time cycle preferences for the region, but that is a lot more
  757|       |                    // work for little or no additional benefit, since just going ahead
  758|       |                    // and always synthesizing the time format as per the following should
  759|       |                    // create a locale-appropriate pattern with cycle that matches the
  760|       |                    // region preferences anyway.
  761|      0|                    LocalPointer<DateTimePatternGenerator> dtpg(DateTimePatternGenerator::createInstanceNoStdPat(locale, useStatus));
  762|      0|                    if (U_SUCCESS(useStatus)) {
  ------------------
  |  Branch (762:25): [True: 0, False: 0]
  ------------------
  763|      0|                        UnicodeString timeSkeleton(true, timeSkeletons[timeStyle], -1);
  764|      0|                        timePattern = dtpg->getBestPattern(timeSkeleton, useStatus);
  765|      0|                    }
  766|      0|                }
  767|      0|            }
  768|      0|        }
  769|      0|    }
  770|       |
  771|       |    // if the pattern should include both date and time information, use the date/time
  772|       |    // pattern string as a guide to tell use how to glue together the appropriate date
  773|       |    // and time pattern strings.
  774|  19.2k|    if ((timeStyle != kNone) && (dateStyle != kNone))
  ------------------
  |  Branch (774:9): [True: 0, False: 19.2k]
  |  Branch (774:33): [True: 0, False: 0]
  ------------------
  775|      0|    {
  776|      0|        UnicodeString tempus1(timePattern);
  777|      0|        if (tempus1.length() == 0) {
  ------------------
  |  Branch (777:13): [True: 0, False: 0]
  ------------------
  778|      0|            currentBundle.adoptInstead(
  779|      0|                    ures_getByIndex(dateTimePatterns.getAlias(), static_cast<int32_t>(timeStyle), 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  780|      0|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (780:17): [True: 0, False: 0]
  ------------------
  781|      0|               status = U_INVALID_FORMAT_ERROR;
  782|      0|               return;
  783|      0|            }
  784|      0|            switch (ures_getType(currentBundle.getAlias())) {
  ------------------
  |  | 1679|      0|#define ures_getType U_ICU_ENTRY_POINT_RENAME(ures_getType)
  |  |  ------------------
  |  |  |  |  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|                case URES_STRING: {
  ------------------
  |  Branch (785:17): [True: 0, False: 0]
  ------------------
  786|      0|                   resStr = ures_getString(currentBundle.getAlias(), &resStrLen, &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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  787|      0|                   break;
  788|      0|                }
  789|      0|                case URES_ARRAY: {
  ------------------
  |  Branch (789:17): [True: 0, False: 0]
  ------------------
  790|      0|                   resStr = ures_getStringByIndex(currentBundle.getAlias(), 0, &resStrLen, &status);
  ------------------
  |  | 1676|      0|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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|      0|                   ovrStr = ures_getStringByIndex(currentBundle.getAlias(), 1, &ovrStrLen, &status);
  ------------------
  |  | 1676|      0|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  792|      0|                   fTimeOverride.setTo(true, ovrStr, ovrStrLen);
  793|      0|                   break;
  794|      0|                }
  795|      0|                default: {
  ------------------
  |  Branch (795:17): [True: 0, False: 0]
  ------------------
  796|      0|                   status = U_INVALID_FORMAT_ERROR;
  797|      0|                   return;
  798|      0|                }
  799|      0|            }
  800|       |
  801|      0|            tempus1.setTo(true, resStr, resStrLen);
  802|      0|        }
  803|       |
  804|      0|        currentBundle.adoptInstead(
  805|      0|                ures_getByIndex(dateTimePatterns.getAlias(), static_cast<int32_t>(dateStyle), 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  806|      0|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (806:13): [True: 0, False: 0]
  ------------------
  807|      0|           status = U_INVALID_FORMAT_ERROR;
  808|      0|           return;
  809|      0|        }
  810|      0|        switch (ures_getType(currentBundle.getAlias())) {
  ------------------
  |  | 1679|      0|#define ures_getType U_ICU_ENTRY_POINT_RENAME(ures_getType)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  811|      0|            case URES_STRING: {
  ------------------
  |  Branch (811:13): [True: 0, False: 0]
  ------------------
  812|      0|               resStr = ures_getString(currentBundle.getAlias(), &resStrLen, &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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  813|      0|               break;
  814|      0|            }
  815|      0|            case URES_ARRAY: {
  ------------------
  |  Branch (815:13): [True: 0, False: 0]
  ------------------
  816|      0|               resStr = ures_getStringByIndex(currentBundle.getAlias(), 0, &resStrLen, &status);
  ------------------
  |  | 1676|      0|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  817|      0|               ovrStr = ures_getStringByIndex(currentBundle.getAlias(), 1, &ovrStrLen, &status);
  ------------------
  |  | 1676|      0|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  818|      0|               fDateOverride.setTo(true, ovrStr, ovrStrLen);
  819|      0|               break;
  820|      0|            }
  821|      0|            default: {
  ------------------
  |  Branch (821:13): [True: 0, False: 0]
  ------------------
  822|      0|               status = U_INVALID_FORMAT_ERROR;
  823|      0|               return;
  824|      0|            }
  825|      0|        }
  826|       |
  827|      0|        UnicodeString tempus2(true, resStr, resStrLen);
  828|       |
  829|       |        // Currently, for compatibility with pre-CLDR-42 data, we default to the "atTime"
  830|       |        // combining patterns. Depending on guidance in CLDR 42 spec and on DisplayOptions,
  831|       |        // we may change this.
  832|      0|        LocalUResourceBundlePointer dateAtTimePatterns;
  833|      0|        if (!cTypeIsGregorian) {
  ------------------
  |  Branch (833:13): [True: 0, False: 0]
  ------------------
  834|      0|            CharString resourcePath("calendar/", status);
  835|      0|            resourcePath.append(cType, status).append("/DateTimePatterns%atTime", status);
  836|      0|            dateAtTimePatterns.adoptInstead(
  837|      0|                ures_getByKeyWithFallback(bundle.getAlias(), resourcePath.data(),
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  838|      0|                                          nullptr, &status));
  839|      0|        }
  840|      0|        if (cTypeIsGregorian || status == U_MISSING_RESOURCE_ERROR) {
  ------------------
  |  Branch (840:13): [True: 0, False: 0]
  |  Branch (840:33): [True: 0, False: 0]
  ------------------
  841|      0|            status = U_ZERO_ERROR;
  842|      0|            dateAtTimePatterns.adoptInstead(
  843|      0|                ures_getByKeyWithFallback(bundle.getAlias(),
  ------------------
  |  | 1662|      0|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  844|      0|                                          "calendar/gregorian/DateTimePatterns%atTime",
  845|      0|                                          nullptr, &status));
  846|      0|        }
  847|      0|        if (U_SUCCESS(status) && ures_getSize(dateAtTimePatterns.getAlias()) >= 4) {
  ------------------
  |  | 1674|      0|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  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 (847:13): [True: 0, False: 0]
  |  Branch (847:34): [True: 0, False: 0]
  ------------------
  848|      0|            resStr = ures_getStringByIndex(dateAtTimePatterns.getAlias(), dateStyle - kDateOffset, &resStrLen, &status);
  ------------------
  |  | 1676|      0|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  849|      0|        } else {
  850|      0|            status = U_ZERO_ERROR;
  851|      0|            int32_t glueIndex = kDateTime;
  852|      0|            int32_t patternsSize = ures_getSize(dateTimePatterns.getAlias());
  ------------------
  |  | 1674|      0|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  853|      0|            if (patternsSize >= (kDateTimeOffset + kShort + 1)) {
  ------------------
  |  Branch (853:17): [True: 0, False: 0]
  ------------------
  854|       |                // Get proper date time format
  855|      0|                glueIndex = static_cast<int32_t>(kDateTimeOffset + (dateStyle - kDateOffset));
  856|      0|            }
  857|       |
  858|      0|            resStr = ures_getStringByIndex(dateTimePatterns.getAlias(), glueIndex, &resStrLen, &status);
  ------------------
  |  | 1676|      0|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  859|      0|        }
  860|      0|        SimpleFormatter(UnicodeString(true, resStr, resStrLen), 2, 2, status).
  861|      0|                format(tempus1, tempus2, fPattern, status);
  862|      0|    }
  863|       |    // if the pattern includes just time data or just date date, load the appropriate
  864|       |    // pattern string from the resources
  865|       |    // setTo() - see DateFormatSymbols::assignArray comments
  866|  19.2k|    else if (timeStyle != kNone) {
  ------------------
  |  Branch (866:14): [True: 0, False: 19.2k]
  ------------------
  867|      0|        fPattern.setTo(timePattern);
  868|      0|        if (fPattern.length() == 0) {
  ------------------
  |  Branch (868:13): [True: 0, False: 0]
  ------------------
  869|      0|            currentBundle.adoptInstead(
  870|      0|                    ures_getByIndex(dateTimePatterns.getAlias(), static_cast<int32_t>(timeStyle), 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  871|      0|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (871:17): [True: 0, False: 0]
  ------------------
  872|      0|               status = U_INVALID_FORMAT_ERROR;
  873|      0|               return;
  874|      0|            }
  875|      0|            switch (ures_getType(currentBundle.getAlias())) {
  ------------------
  |  | 1679|      0|#define ures_getType U_ICU_ENTRY_POINT_RENAME(ures_getType)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  876|      0|                case URES_STRING: {
  ------------------
  |  Branch (876:17): [True: 0, False: 0]
  ------------------
  877|      0|                   resStr = ures_getString(currentBundle.getAlias(), &resStrLen, &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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  878|      0|                   break;
  879|      0|                }
  880|      0|                case URES_ARRAY: {
  ------------------
  |  Branch (880:17): [True: 0, False: 0]
  ------------------
  881|      0|                   resStr = ures_getStringByIndex(currentBundle.getAlias(), 0, &resStrLen, &status);
  ------------------
  |  | 1676|      0|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  882|      0|                   ovrStr = ures_getStringByIndex(currentBundle.getAlias(), 1, &ovrStrLen, &status);
  ------------------
  |  | 1676|      0|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  883|      0|                   fDateOverride.setTo(true, ovrStr, ovrStrLen);
  884|      0|                   break;
  885|      0|                }
  886|      0|                default: {
  ------------------
  |  Branch (886:17): [True: 0, False: 0]
  ------------------
  887|      0|                   status = U_INVALID_FORMAT_ERROR;
  888|      0|                   return;
  889|      0|                }
  890|      0|            }
  891|      0|            fPattern.setTo(true, resStr, resStrLen);
  892|      0|        }
  893|      0|    }
  894|  19.2k|    else if (dateStyle != kNone) {
  ------------------
  |  Branch (894:14): [True: 19.2k, False: 0]
  ------------------
  895|  19.2k|        currentBundle.adoptInstead(
  896|  19.2k|                ures_getByIndex(dateTimePatterns.getAlias(), static_cast<int32_t>(dateStyle), nullptr, &status));
  ------------------
  |  | 1660|  19.2k|#define ures_getByIndex U_ICU_ENTRY_POINT_RENAME(ures_getByIndex)
  |  |  ------------------
  |  |  |  |  123|  19.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  19.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  19.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  897|  19.2k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (897:13): [True: 0, False: 19.2k]
  ------------------
  898|      0|           status = U_INVALID_FORMAT_ERROR;
  899|      0|           return;
  900|      0|        }
  901|  19.2k|        switch (ures_getType(currentBundle.getAlias())) {
  ------------------
  |  | 1679|  19.2k|#define ures_getType U_ICU_ENTRY_POINT_RENAME(ures_getType)
  |  |  ------------------
  |  |  |  |  123|  19.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  19.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  19.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  902|  19.2k|            case URES_STRING: {
  ------------------
  |  Branch (902:13): [True: 19.2k, False: 0]
  ------------------
  903|  19.2k|               resStr = ures_getString(currentBundle.getAlias(), &resStrLen, &status);
  ------------------
  |  | 1675|  19.2k|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|  19.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  19.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  19.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  904|  19.2k|               break;
  905|      0|            }
  906|      0|            case URES_ARRAY: {
  ------------------
  |  Branch (906:13): [True: 0, False: 19.2k]
  ------------------
  907|      0|               resStr = ures_getStringByIndex(currentBundle.getAlias(), 0, &resStrLen, &status);
  ------------------
  |  | 1676|      0|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  908|      0|               ovrStr = ures_getStringByIndex(currentBundle.getAlias(), 1, &ovrStrLen, &status);
  ------------------
  |  | 1676|      0|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  909|      0|               fDateOverride.setTo(true, ovrStr, ovrStrLen);
  910|      0|               break;
  911|      0|            }
  912|      0|            default: {
  ------------------
  |  Branch (912:13): [True: 0, False: 19.2k]
  ------------------
  913|      0|               status = U_INVALID_FORMAT_ERROR;
  914|      0|               return;
  915|      0|            }
  916|  19.2k|        }
  917|  19.2k|        fPattern.setTo(true, resStr, resStrLen);
  918|  19.2k|    }
  919|       |
  920|       |    // and if it includes _neither_, that's an error
  921|      0|    else
  922|      0|        status = U_INVALID_FORMAT_ERROR;
  923|       |
  924|       |    // finally, finish initializing by creating a Calendar and a NumberFormat
  925|  19.2k|    initialize(locale, status);
  926|  19.2k|}
_ZN6icu_7816SimpleDateFormat18initializeCalendarEPNS_8TimeZoneERKNS_6LocaleER10UErrorCode:
  932|  56.1k|{
  933|  56.1k|    if(!U_FAILURE(status)) {
  ------------------
  |  Branch (933:8): [True: 56.1k, False: 0]
  ------------------
  934|  56.1k|        fCalendar = Calendar::createInstance(
  935|  56.1k|            adoptZone ? adoptZone : TimeZone::forLocaleOrDefault(locale), locale, status);
  ------------------
  |  Branch (935:13): [True: 0, False: 56.1k]
  ------------------
  936|  56.1k|    }
  937|  56.1k|    return fCalendar;
  938|  56.1k|}
_ZN6icu_7816SimpleDateFormat10initializeERKNS_6LocaleER10UErrorCode:
  943|  56.1k|{
  944|  56.1k|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (944:9): [True: 0, False: 56.1k]
  ------------------
  945|       |
  946|  56.1k|    parsePattern(); // Need this before initNumberFormatters(), to set fHasHanYearChar
  947|       |
  948|       |    // Simple-minded hack to force Gannen year numbering for ja@calendar=japanese
  949|       |    // if format is non-numeric (includes 年) and fDateOverride is not already specified.
  950|       |    // Now this does get updated if applyPattern subsequently changes the pattern type.
  951|  56.1k|    if (fDateOverride.isBogus() && fHasHanYearChar &&
  ------------------
  |  Branch (951:9): [True: 56.1k, False: 0]
  |  Branch (951:36): [True: 0, False: 56.1k]
  ------------------
  952|  56.1k|            fCalendar != nullptr &&
  ------------------
  |  Branch (952:13): [True: 0, False: 0]
  ------------------
  953|  56.1k|            typeid(*fCalendar) == typeid(JapaneseCalendar) &&
  ------------------
  |  Branch (953:13): [True: 0, False: 0]
  ------------------
  954|  56.1k|            uprv_strcmp(fLocale.getLanguage(),"ja") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (954:13): [True: 0, False: 0]
  ------------------
  955|      0|        fDateOverride.setTo(u"y=jpanyear", -1);
  956|      0|    }
  957|       |
  958|       |    // We don't need to check that the row count is >= 1, since all 2d arrays have at
  959|       |    // least one row
  960|  56.1k|    fNumberFormat = NumberFormat::createInstance(locale, status);
  961|  56.1k|    if (fNumberFormat != nullptr && U_SUCCESS(status))
  ------------------
  |  Branch (961:9): [True: 56.1k, False: 0]
  |  Branch (961:37): [True: 56.1k, False: 0]
  ------------------
  962|  56.1k|    {
  963|  56.1k|        fixNumberFormatForDates(*fNumberFormat);
  964|       |        //fNumberFormat->setLenient(true); // Java uses a custom DateNumberFormat to format/parse
  965|       |
  966|  56.1k|        initNumberFormatters(locale, status);
  967|  56.1k|        initSimpleNumberFormatter(status);
  968|       |
  969|  56.1k|    }
  970|      0|    else if (U_SUCCESS(status))
  ------------------
  |  Branch (970:14): [True: 0, False: 0]
  ------------------
  971|      0|    {
  972|      0|        status = U_MISSING_RESOURCE_ERROR;
  973|      0|    }
  974|  56.1k|}
_ZN6icu_7816SimpleDateFormat24initializeDefaultCenturyEv:
  980|  56.1k|{
  981|  56.1k|  if(fCalendar) {
  ------------------
  |  Branch (981:6): [True: 56.1k, False: 0]
  ------------------
  982|  56.1k|    fHaveDefaultCentury = fCalendar->haveDefaultCentury();
  983|  56.1k|    if(fHaveDefaultCentury) {
  ------------------
  |  Branch (983:8): [True: 56.1k, False: 0]
  ------------------
  984|  56.1k|      fDefaultCenturyStart = fCalendar->defaultCenturyStart();
  985|  56.1k|      fDefaultCenturyStartYear = fCalendar->defaultCenturyStartYear();
  986|  56.1k|    } else {
  987|      0|      fDefaultCenturyStart = DBL_MIN;
  988|      0|      fDefaultCenturyStartYear = -1;
  989|      0|    }
  990|  56.1k|  }
  991|  56.1k|}
_ZN6icu_7816SimpleDateFormat27initializeBooleanAttributesEv:
  997|  56.1k|{
  998|  56.1k|    UErrorCode status = U_ZERO_ERROR;
  999|       |
 1000|  56.1k|    setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status);
 1001|  56.1k|    setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status);
 1002|  56.1k|    setBooleanAttribute(UDAT_PARSE_PARTIAL_LITERAL_MATCH, true, status);
 1003|  56.1k|    setBooleanAttribute(UDAT_PARSE_MULTIPLE_PATTERNS_FOR_MATCH, true, status);
 1004|  56.1k|}
_ZN6icu_7816SimpleDateFormat25initSimpleNumberFormatterER10UErrorCode:
 1312|  56.1k|SimpleDateFormat::initSimpleNumberFormatter(UErrorCode &status) {
 1313|  56.1k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1313:9): [True: 0, False: 56.1k]
  ------------------
 1314|      0|        return;
 1315|      0|    }
 1316|  56.1k|    const auto* df = dynamic_cast<const DecimalFormat*>(fNumberFormat);
 1317|  56.1k|    if (df == nullptr) {
  ------------------
  |  Branch (1317:9): [True: 0, False: 56.1k]
  ------------------
 1318|      0|        return;
 1319|      0|    }
 1320|  56.1k|    const DecimalFormatSymbols* syms = df->getDecimalFormatSymbols();
 1321|  56.1k|    if (syms == nullptr) {
  ------------------
  |  Branch (1321:9): [True: 0, False: 56.1k]
  ------------------
 1322|      0|        return;
 1323|      0|    }
 1324|  56.1k|    fSimpleNumberFormatter = new number::SimpleNumberFormatter(
 1325|  56.1k|        number::SimpleNumberFormatter::forLocaleAndSymbolsAndGroupingStrategy(
 1326|  56.1k|            fLocale, *syms, UNUM_GROUPING_OFF, status
 1327|  56.1k|        )
 1328|  56.1k|    );
 1329|  56.1k|    if (fSimpleNumberFormatter == nullptr) {
  ------------------
  |  Branch (1329:9): [True: 0, False: 56.1k]
  ------------------
 1330|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1331|      0|    }
 1332|  56.1k|}
_ZN6icu_7816SimpleDateFormat20initNumberFormattersERKNS_6LocaleER10UErrorCode:
 1335|  56.1k|SimpleDateFormat::initNumberFormatters(const Locale &locale,UErrorCode &status) {
 1336|  56.1k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1336:9): [True: 0, False: 56.1k]
  ------------------
 1337|      0|        return;
 1338|      0|    }
 1339|  56.1k|    if ( fDateOverride.isBogus() && fTimeOverride.isBogus() ) {
  ------------------
  |  Branch (1339:10): [True: 56.1k, False: 0]
  |  Branch (1339:37): [True: 56.1k, False: 0]
  ------------------
 1340|  56.1k|        return;
 1341|  56.1k|    }
 1342|      0|    umtx_lock(&LOCK);
  ------------------
  |  | 1250|      0|#define umtx_lock U_ICU_ENTRY_POINT_RENAME(umtx_lock)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1343|      0|    if (fSharedNumberFormatters == nullptr) {
  ------------------
  |  Branch (1343:9): [True: 0, False: 0]
  ------------------
 1344|      0|        fSharedNumberFormatters = allocSharedNumberFormatters();
 1345|      0|        if (fSharedNumberFormatters == nullptr) {
  ------------------
  |  Branch (1345:13): [True: 0, False: 0]
  ------------------
 1346|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1347|      0|        }
 1348|      0|    }
 1349|      0|    umtx_unlock(&LOCK);
  ------------------
  |  | 1251|      0|#define umtx_unlock U_ICU_ENTRY_POINT_RENAME(umtx_unlock)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1350|       |
 1351|      0|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1351:9): [True: 0, False: 0]
  ------------------
 1352|      0|        return;
 1353|      0|    }
 1354|       |
 1355|      0|    processOverrideString(locale,fDateOverride,kOvrStrDate,status);
 1356|      0|    processOverrideString(locale,fTimeOverride,kOvrStrTime,status);
 1357|      0|}
_ZN6icu_7816SimpleDateFormat12applyPatternERKNS_13UnicodeStringE:
 4037|  12.0k|{
 4038|  12.0k|    fPattern = pattern;
 4039|  12.0k|    parsePattern();
 4040|       |
 4041|       |    // Hack to update use of Gannen year numbering for ja@calendar=japanese -
 4042|       |    // use only if format is non-numeric (includes 年) and no other fDateOverride.
 4043|  12.0k|    if (fCalendar != nullptr && typeid(*fCalendar) == typeid(JapaneseCalendar) &&
  ------------------
  |  Branch (4043:9): [True: 12.0k, False: 0]
  |  Branch (4043:33): [True: 0, False: 12.0k]
  ------------------
 4044|  12.0k|            uprv_strcmp(fLocale.getLanguage(),"ja") == 0) {
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (4044:13): [True: 0, False: 0]
  ------------------
 4045|      0|        if (fDateOverride==UnicodeString(u"y=jpanyear") && !fHasHanYearChar) {
  ------------------
  |  Branch (4045:13): [True: 0, False: 0]
  |  Branch (4045:13): [True: 0, False: 0]
  |  Branch (4045:60): [True: 0, False: 0]
  ------------------
 4046|       |            // Gannen numbering is set but new pattern should not use it, unset;
 4047|       |            // use procedure from adoptNumberFormat to clear overrides
 4048|      0|            if (fSharedNumberFormatters) {
  ------------------
  |  Branch (4048:17): [True: 0, False: 0]
  ------------------
 4049|      0|                freeSharedNumberFormatters(fSharedNumberFormatters);
 4050|      0|                fSharedNumberFormatters = nullptr;
 4051|      0|            }
 4052|      0|            fDateOverride.setToBogus(); // record status
 4053|      0|        } else if (fDateOverride.isBogus() && fHasHanYearChar) {
  ------------------
  |  Branch (4053:20): [True: 0, False: 0]
  |  Branch (4053:47): [True: 0, False: 0]
  ------------------
 4054|       |            // No current override (=> no Gannen numbering) but new pattern needs it;
 4055|       |            // use procedures from initNUmberFormatters / adoptNumberFormat
 4056|      0|            umtx_lock(&LOCK);
  ------------------
  |  | 1250|      0|#define umtx_lock U_ICU_ENTRY_POINT_RENAME(umtx_lock)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4057|      0|            if (fSharedNumberFormatters == nullptr) {
  ------------------
  |  Branch (4057:17): [True: 0, False: 0]
  ------------------
 4058|      0|                fSharedNumberFormatters = allocSharedNumberFormatters();
 4059|      0|            }
 4060|      0|            umtx_unlock(&LOCK);
  ------------------
  |  | 1251|      0|#define umtx_unlock U_ICU_ENTRY_POINT_RENAME(umtx_unlock)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 4061|      0|            if (fSharedNumberFormatters != nullptr) {
  ------------------
  |  Branch (4061:17): [True: 0, False: 0]
  ------------------
 4062|      0|                Locale ovrLoc(fLocale.getLanguage(),fLocale.getCountry(),fLocale.getVariant(),"numbers=jpanyear");
 4063|      0|                UErrorCode status = U_ZERO_ERROR;
 4064|      0|                const SharedNumberFormat *snf = createSharedNumberFormat(ovrLoc, status);
 4065|      0|                if (U_SUCCESS(status)) {
  ------------------
  |  Branch (4065:21): [True: 0, False: 0]
  ------------------
 4066|       |                    // Now that we have an appropriate number formatter, fill in the
 4067|       |                    // appropriate slot in the number formatters table.
 4068|      0|                    UDateFormatField patternCharIndex = DateFormatSymbols::getPatternCharIndex(u'y');
 4069|      0|                    SharedObject::copyPtr(snf, fSharedNumberFormatters[patternCharIndex]);
 4070|      0|                    snf->deleteIfZeroRefCount();
 4071|      0|                    fDateOverride.setTo(u"y=jpanyear", -1); // record status
 4072|      0|                }
 4073|      0|            }
 4074|      0|        }
 4075|      0|    }
 4076|  12.0k|}
_ZN6icu_7816SimpleDateFormat12parsePatternEv:
 4400|  68.1k|void SimpleDateFormat::parsePattern() {
 4401|  68.1k|    fHasMinute = false;
 4402|  68.1k|    fHasSecond = false;
 4403|  68.1k|    fHasHanYearChar = false;
 4404|       |
 4405|  68.1k|    int len = fPattern.length();
 4406|  68.1k|    UBool inQuote = false;
 4407|  8.61M|    for (int32_t i = 0; i < len; ++i) {
  ------------------
  |  Branch (4407:25): [True: 8.54M, False: 68.1k]
  ------------------
 4408|  8.54M|        char16_t ch = fPattern[i];
 4409|  8.54M|        if (ch == QUOTE) {
  ------------------
  |  Branch (4409:13): [True: 47.4k, False: 8.49M]
  ------------------
 4410|  47.4k|            inQuote = !inQuote;
 4411|  47.4k|        }
 4412|  8.54M|        if (ch == 0x5E74) { // don't care whether this is inside quotes
  ------------------
  |  Branch (4412:13): [True: 194, False: 8.54M]
  ------------------
 4413|    194|            fHasHanYearChar = true;
 4414|    194|        }
 4415|  8.54M|        if (!inQuote) {
  ------------------
  |  Branch (4415:13): [True: 6.27M, False: 2.26M]
  ------------------
 4416|  6.27M|            if (ch == 0x6D) {  // 0x6D == 'm'
  ------------------
  |  Branch (4416:17): [True: 36.6k, False: 6.24M]
  ------------------
 4417|  36.6k|                fHasMinute = true;
 4418|  36.6k|            }
 4419|  6.27M|            if (ch == 0x73) {  // 0x73 == 's'
  ------------------
  |  Branch (4419:17): [True: 3.02k, False: 6.27M]
  ------------------
 4420|  3.02k|                fHasSecond = true;
 4421|  3.02k|            }
 4422|  6.27M|        }
 4423|  8.54M|    }
 4424|  68.1k|}
smpdtfmt.cpp:_ZN6icu_78L23fixNumberFormatForDatesERNS_12NumberFormatE:
  270|  56.1k|static void fixNumberFormatForDates(NumberFormat &nf) {
  271|  56.1k|    nf.setGroupingUsed(false);
  272|  56.1k|    DecimalFormat* decfmt = dynamic_cast<DecimalFormat*>(&nf);
  273|  56.1k|    if (decfmt != nullptr) {
  ------------------
  |  Branch (273:9): [True: 56.1k, False: 0]
  ------------------
  274|  56.1k|        decfmt->setDecimalSeparatorAlwaysShown(false);
  275|  56.1k|    }
  276|  56.1k|    nf.setParseIntegerOnly(true);
  277|  56.1k|    nf.setMinimumFractionDigits(0); // To prevent "Jan 1.00, 1997.00"
  278|  56.1k|}

_ZN6icu_7814StandardPlural25indexOrNegativeFromStringERKNS_13UnicodeStringE:
   96|   190k|int32_t StandardPlural::indexOrNegativeFromString(const UnicodeString &keyword) {
   97|   190k|    switch (keyword.length()) {
   98|      0|    case 1:
  ------------------
  |  Branch (98:5): [True: 0, False: 190k]
  ------------------
   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: 190k]
  ------------------
  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|  42.4k|    case 3:
  ------------------
  |  Branch (112:5): [True: 42.4k, False: 148k]
  ------------------
  113|  42.4k|        if (keyword.compare(gOne, 3) == 0) {
  ------------------
  |  Branch (113:13): [True: 42.4k, False: 0]
  ------------------
  114|  42.4k|            return ONE;
  115|  42.4k|        } else if (keyword.compare(gTwo, 3) == 0) {
  ------------------
  |  Branch (115:20): [True: 0, False: 0]
  ------------------
  116|      0|            return TWO;
  117|      0|        } else if (keyword.compare(gFew, 3) == 0) {
  ------------------
  |  Branch (117:20): [True: 0, False: 0]
  ------------------
  118|      0|            return FEW;
  119|      0|        }
  120|      0|        break;
  121|      0|    case 4:
  ------------------
  |  Branch (121:5): [True: 0, False: 190k]
  ------------------
  122|      0|        if (keyword.compare(gMany, 4) == 0) {
  ------------------
  |  Branch (122:13): [True: 0, False: 0]
  ------------------
  123|      0|            return MANY;
  124|      0|        } else if (keyword.compare(gZero, 4) == 0) {
  ------------------
  |  Branch (124:20): [True: 0, False: 0]
  ------------------
  125|      0|            return ZERO;
  126|      0|        }
  127|      0|        break;
  128|   148k|    case 5:
  ------------------
  |  Branch (128:5): [True: 148k, False: 42.4k]
  ------------------
  129|   148k|        if (keyword.compare(gOther, 5) == 0) {
  ------------------
  |  Branch (129:13): [True: 148k, False: 0]
  ------------------
  130|   148k|            return OTHER;
  131|   148k|        }
  132|      0|        break;
  133|      0|    default:
  ------------------
  |  Branch (133:5): [True: 0, False: 190k]
  ------------------
  134|      0|        break;
  135|   190k|    }
  136|      0|    return -1;
  137|   190k|}
_ZN6icu_7814StandardPlural15indexFromStringERKNS_13UnicodeStringER10UErrorCode:
  150|   190k|int32_t StandardPlural::indexFromString(const UnicodeString &keyword, UErrorCode &errorCode) {
  151|   190k|    if (U_FAILURE(errorCode)) { return OTHER; }
  ------------------
  |  Branch (151:9): [True: 0, False: 190k]
  ------------------
  152|   190k|    int32_t i = indexOrNegativeFromString(keyword);
  153|   190k|    if (i >= 0) {
  ------------------
  |  Branch (153:9): [True: 190k, False: 0]
  ------------------
  154|   190k|        return i;
  155|   190k|    } else {
  156|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  157|      0|        return OTHER;
  158|      0|    }
  159|   190k|}

_ZN6icu_7814StandardPlural10fromStringERKNS_13UnicodeStringER10UErrorCode:
   80|   190k|    static Form fromString(const UnicodeString &keyword, UErrorCode &errorCode) {
   81|   190k|        return static_cast<Form>(indexFromString(keyword, errorCode));
   82|   190k|    }

_ZN6icu_788TimeZoneC2ERKNS_13UnicodeStringE:
  352|      1|    :   UObject(), fID(id)
  353|      1|{
  354|      1|}
_ZN6icu_788TimeZoneD2Ev:
  359|   112k|{
  360|   112k|}
_ZN6icu_788TimeZoneC2ERKS0_:
  365|   112k|    :   UObject(source), fID(source.fID)
  366|   112k|{
  367|   112k|}
_ZN6icu_788TimeZone18detectHostTimeZoneEv:
  459|      1|{
  460|       |    // We access system timezone data through uprv_tzset(), uprv_tzname(), and others,
  461|       |    // which have platform specific implementations in putil.cpp
  462|      1|    int32_t rawOffset = 0;
  463|      1|    const char *hostID;
  464|      1|    UBool hostDetectionSucceeded = true;
  465|       |
  466|       |    // First, try to create a system timezone, based
  467|       |    // on the string ID in tzname[0].
  468|       |
  469|      1|    uprv_tzset(); // Initialize tz... system data
  ------------------
  |  | 1551|      1|#define uprv_tzset U_ICU_ENTRY_POINT_RENAME(uprv_tzset)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  470|       |
  471|      1|    uprv_tzname_clear_cache();
  ------------------
  |  | 1550|      1|#define uprv_tzname_clear_cache U_ICU_ENTRY_POINT_RENAME(uprv_tzname_clear_cache)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  472|       |
  473|       |    // Get the timezone ID from the host.  This function should do
  474|       |    // any required host-specific remapping; e.g., on Windows this
  475|       |    // function maps the Windows Time Zone name to an ICU timezone ID.
  476|      1|    hostID = uprv_tzname(0);
  ------------------
  |  | 1549|      1|#define uprv_tzname U_ICU_ENTRY_POINT_RENAME(uprv_tzname)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  477|       |
  478|       |    // Invert sign because UNIX semantics are backwards
  479|      1|    rawOffset = uprv_timezone() * -U_MILLIS_PER_SECOND;
  ------------------
  |  | 1546|      1|#define uprv_timezone U_ICU_ENTRY_POINT_RENAME(uprv_timezone)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  rawOffset = uprv_timezone() * -U_MILLIS_PER_SECOND;
  ------------------
  |  |  221|      1|#define U_MILLIS_PER_SECOND        (1000)
  ------------------
  480|       |
  481|      1|    TimeZone* hostZone = nullptr;
  482|       |
  483|      1|    UnicodeString hostStrID(hostID, -1, US_INV);
  ------------------
  |  |   98|      1|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  484|       |
  485|      1|    if (hostStrID.length() == 0) {
  ------------------
  |  Branch (485:9): [True: 0, False: 1]
  ------------------
  486|       |        // The host time zone detection (or remapping) above has failed and
  487|       |        // we have no name at all. Fallback to using the Unknown zone.
  488|      0|        hostStrID = UnicodeString(true, UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH);
  489|      0|        hostDetectionSucceeded = false;
  490|      0|    }
  491|       |
  492|      1|    hostZone = createSystemTimeZone(hostStrID);
  493|       |
  494|       |#if U_PLATFORM_USES_ONLY_WIN32_API
  495|       |    // hostID points to a heap-allocated location on Windows.
  496|       |    uprv_free(const_cast<char *>(hostID));
  497|       |#endif
  498|       |
  499|      1|    int32_t hostIDLen = hostStrID.length();
  500|      1|    if (hostZone != nullptr && rawOffset != hostZone->getRawOffset()
  ------------------
  |  Branch (500:9): [True: 1, False: 0]
  |  Branch (500:32): [True: 0, False: 1]
  ------------------
  501|      1|        && (3 <= hostIDLen && hostIDLen <= 4))
  ------------------
  |  Branch (501:13): [True: 0, False: 0]
  |  Branch (501:31): [True: 0, False: 0]
  ------------------
  502|      0|    {
  503|       |        // Uh oh. This probably wasn't a good id.
  504|       |        // It was probably an ambiguous abbreviation
  505|      0|        delete hostZone;
  506|      0|        hostZone = nullptr;
  507|      0|    }
  508|       |
  509|       |    // Construct a fixed standard zone with the host's ID
  510|       |    // and raw offset.
  511|      1|    if (hostZone == nullptr && hostDetectionSucceeded) {
  ------------------
  |  Branch (511:9): [True: 0, False: 1]
  |  Branch (511:32): [True: 0, False: 0]
  ------------------
  512|      0|        hostZone = new SimpleTimeZone(rawOffset, hostStrID);
  513|      0|    }
  514|       |
  515|       |    // If we _still_ don't have a time zone, use the Unknown zone.
  516|       |    //
  517|       |    // Note: This is extremely unlikely situation. If
  518|       |    // new SimpleTimeZone(...) above fails, the following
  519|       |    // code may also fail.
  520|      1|    if (hostZone == nullptr) {
  ------------------
  |  Branch (520:9): [True: 0, False: 1]
  ------------------
  521|       |        // Unknown zone uses static allocated memory, so it must always exist.
  522|       |        // However, clone() allocates memory and can fail.
  523|      0|        hostZone = TimeZone::getUnknown().clone();
  524|      0|    }
  525|       |
  526|      1|    return hostZone;
  527|      1|}
_ZN6icu_788TimeZone13createDefaultEv:
  573|  56.1k|{
  574|  56.1k|    umtx_initOnce(gDefaultZoneInitOnce, initDefault);
  575|  56.1k|    {
  576|  56.1k|        Mutex lock(&gDefaultZoneMutex);
  577|  56.1k|        return (DEFAULT_ZONE != nullptr) ? DEFAULT_ZONE->clone() : nullptr;
  ------------------
  |  Branch (577:16): [True: 56.1k, False: 0]
  ------------------
  578|  56.1k|    }
  579|  56.1k|}
_ZN6icu_788TimeZone18forLocaleOrDefaultERKNS_6LocaleE:
  585|  56.1k|{
  586|  56.1k|    char buffer[ULOC_KEYWORDS_CAPACITY] = "";
  587|  56.1k|    UErrorCode localStatus = U_ZERO_ERROR;
  588|  56.1k|    int32_t count = locale.getKeywordValue("timezone", buffer, sizeof(buffer), localStatus);
  589|  56.1k|    if (U_FAILURE(localStatus) || localStatus == U_STRING_NOT_TERMINATED_WARNING) {
  ------------------
  |  Branch (589:9): [True: 0, False: 56.1k]
  |  Branch (589:35): [True: 0, False: 56.1k]
  ------------------
  590|       |        // the "timezone" keyword exceeds ULOC_KEYWORDS_CAPACITY; ignore and use default.
  591|      0|        count = 0;
  592|      0|    }
  593|  56.1k|    if (count > 0) {
  ------------------
  |  Branch (593:9): [True: 0, False: 56.1k]
  ------------------
  594|      0|        return TimeZone::createTimeZone(UnicodeString(buffer, count, US_INV));
  ------------------
  |  |   98|      0|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  595|      0|    }
  596|  56.1k|    return TimeZone::createDefault();
  597|  56.1k|}
_ZN6icu_788TimeZone6findIDERKNS_13UnicodeStringE:
 1097|      2|TimeZone::findID(const UnicodeString& id) {
 1098|      2|    const char16_t *result = nullptr;
 1099|      2|    UErrorCode ec = U_ZERO_ERROR;
 1100|      2|    UResourceBundle *rb = ures_openDirect(nullptr, kZONEINFO, &ec);
  ------------------
  |  | 1693|      2|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  UResourceBundle *rb = ures_openDirect(nullptr, kZONEINFO, &ec);
  ------------------
  |  |   92|      2|#define kZONEINFO "zoneinfo64"
  ------------------
 1101|       |
 1102|       |    // resolve zone index by name
 1103|      2|    UResourceBundle *names = ures_getByKey(rb, kNAMES, nullptr, &ec);
  ------------------
  |  | 1661|      2|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  UResourceBundle *names = ures_getByKey(rb, kNAMES, nullptr, &ec);
  ------------------
  |  |   96|      2|#define kNAMES    "Names"
  ------------------
 1104|      2|    int32_t idx = findInStringArray(names, id, ec);
 1105|      2|    result = ures_getStringByIndex(names, idx, nullptr, &ec);
  ------------------
  |  | 1676|      2|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1106|      2|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (1106:9): [True: 0, False: 2]
  ------------------
 1107|      0|        result = nullptr;
 1108|      0|    }
 1109|      2|    ures_close(names);
  ------------------
  |  | 1652|      2|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1110|      2|    ures_close(rb);
  ------------------
  |  | 1652|      2|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1111|      2|    return result;
 1112|      2|}
timezone.cpp:_ZN6icu_7812_GLOBAL__N_120createSystemTimeZoneERKNS_13UnicodeStringE:
  422|      1|createSystemTimeZone(const UnicodeString& id) {
  423|      1|    UErrorCode ec = U_ZERO_ERROR;
  424|      1|    return createSystemTimeZone(id, ec);
  425|      1|}
timezone.cpp:_ZN6icu_7812_GLOBAL__N_120createSystemTimeZoneERKNS_13UnicodeStringER10UErrorCode:
  391|      1|createSystemTimeZone(const UnicodeString& id, UErrorCode& ec) {
  392|      1|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (392:9): [True: 0, False: 1]
  ------------------
  393|      0|        return nullptr;
  394|      0|    }
  395|      1|    TimeZone* z = nullptr;
  396|      1|    StackUResourceBundle res;
  397|      1|    U_DEBUG_TZ_MSG(("pre-err=%s\n", u_errorName(ec)));
  398|      1|    UResourceBundle *top = openOlsonResource(id, res.ref(), ec);
  399|      1|    U_DEBUG_TZ_MSG(("post-err=%s\n", u_errorName(ec)));
  400|      1|    if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (400:9): [True: 1, False: 0]
  ------------------
  401|      1|        z = new OlsonTimeZone(top, res.getAlias(), id, ec);
  402|      1|        if (z == nullptr) {
  ------------------
  |  Branch (402:13): [True: 0, False: 1]
  ------------------
  403|      0|            ec = U_MEMORY_ALLOCATION_ERROR;
  404|      0|            U_DEBUG_TZ_MSG(("cstz: olson time zone failed to initialize - err %s\n", u_errorName(ec)));
  405|      0|        }
  406|      1|    }
  407|      1|    ures_close(top);
  ------------------
  |  | 1652|      1|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  408|      1|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (408:9): [True: 0, False: 1]
  ------------------
  409|      0|        U_DEBUG_TZ_MSG(("cstz: failed to create, err %s\n", u_errorName(ec)));
  410|      0|        delete z;
  411|      0|        z = nullptr;
  412|      0|    }
  413|      1|    return z;
  414|      1|}
timezone.cpp:_ZN6icu_78L11initDefaultEv:
  539|      1|{
  540|      1|    ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  541|       |
  542|      1|    Mutex lock(&gDefaultZoneMutex);
  543|       |    // If setDefault() has already been called we can skip getting the
  544|       |    // default zone information from the system.
  545|      1|    if (DEFAULT_ZONE != nullptr) {
  ------------------
  |  Branch (545:9): [True: 0, False: 1]
  ------------------
  546|      0|        return;
  547|      0|    }
  548|       |    
  549|       |    // NOTE:  this code is safely single threaded, being only
  550|       |    // run via umtx_initOnce().
  551|       |    //
  552|       |    // Some of the locale/timezone OS functions may not be thread safe,
  553|       |    //
  554|       |    // The operating system might actually use ICU to implement timezones.
  555|       |    // So we may have ICU calling ICU here, like on AIX.
  556|       |    // There shouldn't be a problem with this; initOnce does not hold a mutex
  557|       |    // while the init function is being run.
  558|       |
  559|       |    // The code detecting the host time zone was separated from this
  560|       |    // and implemented as TimeZone::detectHostTimeZone()
  561|       |
  562|      1|    TimeZone *default_zone = TimeZone::detectHostTimeZone();
  563|       |
  564|      1|    U_ASSERT(DEFAULT_ZONE == nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  565|       |
  566|      1|    DEFAULT_ZONE = default_zone;
  567|      1|}
timezone.cpp:_ZN6icu_78L17openOlsonResourceERKNS_13UnicodeStringER15UResourceBundleR10UErrorCode:
  281|      1|{
  282|       |#ifdef U_DEBUG_TZ
  283|       |    char buf[128];
  284|       |    id.extract(0, sizeof(buf)-1, buf, sizeof(buf), "");
  285|       |#endif
  286|      1|    UResourceBundle *top = ures_openDirect(nullptr, kZONEINFO, &ec);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  UResourceBundle *top = ures_openDirect(nullptr, kZONEINFO, &ec);
  ------------------
  |  |   92|      1|#define kZONEINFO "zoneinfo64"
  ------------------
  287|      1|    U_DEBUG_TZ_MSG(("pre: res sz=%d\n", ures_getSize(&res)));
  288|      1|    /* &res = */ getZoneByName(top, id, &res, ec);
  289|       |    // Dereference if this is an alias.  Docs say result should be 1
  290|       |    // but it is 0 in 2.8 (?).
  291|      1|    U_DEBUG_TZ_MSG(("Loading zone '%s' (%s, size %d) - %s\n", buf, ures_getKey((UResourceBundle*)&res), ures_getSize(&res), u_errorName(ec)));
  292|      1|    if (ures_getType(&res) == URES_INT) {
  ------------------
  |  | 1679|      1|#define ures_getType U_ICU_ENTRY_POINT_RENAME(ures_getType)
  |  |  ------------------
  |  |  |  |  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 (292:9): [True: 0, False: 1]
  ------------------
  293|      0|        int32_t deref = ures_getInt(&res, &ec) + 0;
  ------------------
  |  | 1664|      0|#define ures_getInt U_ICU_ENTRY_POINT_RENAME(ures_getInt)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  294|      0|        U_DEBUG_TZ_MSG(("getInt: %s - type is %d\n", u_errorName(ec), ures_getType(&res)));
  295|      0|        UResourceBundle *ares = ures_getByKey(top, kZONES, nullptr, &ec); // dereference Zones section
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      UResourceBundle *ares = ures_getByKey(top, kZONES, nullptr, &ec); // dereference Zones section
  ------------------
  |  |   94|      0|#define kZONES    "Zones"
  ------------------
  296|      0|        ures_getByIndex(ares, deref, &res, &ec);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  297|      0|        ures_close(ares);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  298|      0|        U_DEBUG_TZ_MSG(("alias to #%d (%s) - %s\n", deref, "??", u_errorName(ec)));
  299|      1|    } else {
  300|      1|        U_DEBUG_TZ_MSG(("not an alias - size %d\n", ures_getSize(&res)));
  301|      1|    }
  302|      1|    U_DEBUG_TZ_MSG(("%s - final status is %s\n", buf, u_errorName(ec)));
  303|      1|    return top;
  304|      1|}
timezone.cpp:_ZN6icu_78L13getZoneByNameEPK15UResourceBundleRKNS_13UnicodeStringEPS0_R10UErrorCode:
  230|      1|static UResourceBundle* getZoneByName(const UResourceBundle* top, const UnicodeString& id, UResourceBundle *oldbundle, UErrorCode& status) {
  231|       |    // load the Rules object
  232|      1|    UResourceBundle *tmp = ures_getByKey(top, kNAMES, 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  UResourceBundle *tmp = ures_getByKey(top, kNAMES, nullptr, &status);
  ------------------
  |  |   96|      1|#define kNAMES    "Names"
  ------------------
  233|       |
  234|       |    // search for the string
  235|      1|    int32_t idx = findInStringArray(tmp, id, status);
  236|       |
  237|      1|    if((idx == -1) && U_SUCCESS(status)) {
  ------------------
  |  Branch (237:8): [True: 0, False: 1]
  |  Branch (237:23): [True: 0, False: 0]
  ------------------
  238|       |        // not found
  239|      0|        status = U_MISSING_RESOURCE_ERROR;
  240|       |        //ures_close(oldbundle);
  241|       |        //oldbundle = nullptr;
  242|      1|    } else {
  243|      1|        U_DEBUG_TZ_MSG(("gzbn: oldbundle= size %d, type %d, %s\n", ures_getSize(tmp), ures_getType(tmp), u_errorName(status)));
  244|      1|        tmp = ures_getByKey(top, kZONES, tmp, &status); // get Zones object from top
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      tmp = ures_getByKey(top, kZONES, tmp, &status); // get Zones object from top
  ------------------
  |  |   94|      1|#define kZONES    "Zones"
  ------------------
  245|      1|        U_DEBUG_TZ_MSG(("gzbn: loaded ZONES, size %d, type %d, path %s %s\n", ures_getSize(tmp), ures_getType(tmp), ures_getPath(tmp), u_errorName(status)));
  246|      1|        oldbundle = ures_getByIndex(tmp, idx, oldbundle, &status); // get nth Zone object
  ------------------
  |  | 1660|      1|#define ures_getByIndex U_ICU_ENTRY_POINT_RENAME(ures_getByIndex)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  247|      1|        U_DEBUG_TZ_MSG(("gzbn: loaded z#%d, size %d, type %d, path %s, %s\n", idx, ures_getSize(oldbundle), ures_getType(oldbundle), ures_getPath(oldbundle),  u_errorName(status)));
  248|      1|    }
  249|      1|    ures_close(tmp);
  ------------------
  |  | 1652|      1|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|      1|    if(U_FAILURE(status)) {
  ------------------
  |  Branch (250:8): [True: 0, False: 1]
  ------------------
  251|       |        //ures_close(oldbundle);
  252|      0|        return nullptr;
  253|      1|    } else {
  254|      1|        return oldbundle;
  255|      1|    }
  256|      1|}
timezone.cpp:_ZN6icu_78L17findInStringArrayEP15UResourceBundleRKNS_13UnicodeStringER10UErrorCode:
  183|      3|{
  184|      3|    UnicodeString copy;
  185|      3|    const char16_t *u;
  186|      3|    int32_t len;
  187|       |
  188|      3|    int32_t start = 0;
  189|      3|    int32_t limit = ures_getSize(array);
  ------------------
  |  | 1674|      3|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  123|      3|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      3|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      3|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  190|      3|    int32_t mid;
  191|      3|    int32_t lastMid = INT32_MAX;
  192|      3|    if(U_FAILURE(status) || (limit < 1)) {
  ------------------
  |  Branch (192:8): [True: 0, False: 3]
  |  Branch (192:29): [True: 0, False: 3]
  ------------------
  193|      0|        return -1;
  194|      0|    }
  195|      3|    U_DEBUG_TZ_MSG(("fisa: Looking for %s, between %d and %d\n", U_DEBUG_TZ_STR(UnicodeString(id).getTerminatedBuffer()), start, limit));
  196|       |
  197|     30|    for (;;) {
  198|     30|        mid = static_cast<int32_t>((start + limit) / 2);
  199|     30|        if (lastMid == mid) {   /* Have we moved? */
  ------------------
  |  Branch (199:13): [True: 0, False: 30]
  ------------------
  200|      0|            break;  /* We haven't moved, and it wasn't found. */
  201|      0|        }
  202|     30|        lastMid = mid;
  203|     30|        u = ures_getStringByIndex(array, mid, &len, &status);
  ------------------
  |  | 1676|     30|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  123|     30|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     30|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     30|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  204|     30|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (204:13): [True: 0, False: 30]
  ------------------
  205|      0|            break;
  206|      0|        }
  207|     30|        U_DEBUG_TZ_MSG(("tz: compare to %s, %d .. [%d] .. %d\n", U_DEBUG_TZ_STR(u), start, mid, limit));
  208|     30|        copy.setTo(true, u, len);
  209|     30|        int r = id.compare(copy);
  210|     30|        if(r==0) {
  ------------------
  |  Branch (210:12): [True: 3, False: 27]
  ------------------
  211|      3|            U_DEBUG_TZ_MSG(("fisa: found at %d\n", mid));
  212|      3|            return mid;
  213|     27|        } else if(r<0) {
  ------------------
  |  Branch (213:19): [True: 6, False: 21]
  ------------------
  214|      6|            limit = mid;
  215|     21|        } else {
  216|     21|            start = mid;
  217|     21|        }
  218|     30|    }
  219|      0|    U_DEBUG_TZ_MSG(("fisa: not found\n"));
  220|      0|    return -1;
  221|      3|}

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

_ZNK6icu_788Calendar7getTimeER10UErrorCode:
  432|      1|    inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); }
_ZN6icu_788Calendar7setTimeEdR10UErrorCode:
  444|      1|    inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
_ZNK6icu_788Calendar11internalGetE19UCalendarDateFieldsi:
 1540|      6|    inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;}
  ------------------
  |  Branch (1540:95): [True: 6, False: 0]
  ------------------
_ZNK6icu_788Calendar11internalGetE19UCalendarDateFields:
 1550|      9|    inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];}
_ZNK6icu_788Calendar15internalGetTimeEv:
 1899|      4|    UDate internalGetTime() const { return fTime; }
_ZN6icu_788Calendar15internalSetTimeEd:
 1908|      2|    void        internalSetTime(UDate time)     { fTime = time; }
_ZNK6icu_788Calendar16getGregorianYearEv:
 1967|      4|    int32_t getGregorianYear() const {
 1968|      4|        return fGregorianYear;
 1969|      4|    }
_ZNK6icu_788Calendar17getGregorianMonthEv:
 1976|      4|    int32_t getGregorianMonth() const {
 1977|      4|        return fGregorianMonth;
 1978|      4|    }
_ZNK6icu_788Calendar21getGregorianDayOfYearEv:
 1985|      4|    int32_t getGregorianDayOfYear() const {
 1986|      4|        return fGregorianDayOfYear;
 1987|      4|    }
_ZNK6icu_788Calendar22getGregorianDayOfMonthEv:
 1994|      4|    int32_t getGregorianDayOfMonth() const {
 1995|      4|      return fGregorianDayOfMonth;
 1996|      4|    }
_ZN6icu_788Calendar11internalSetE19UCalendarDateFieldsi:
 2555|     42|{
 2556|     42|    fFields[field] = value;
 2557|     42|    fStamp[field] = kInternallySet;
 2558|     42|}
_ZN6icu_788Calendar10weekNumberEii:
 2573|      4|{
 2574|      4|  return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek);
 2575|      4|}

_ZNK6icu_7812CurrencyUnit14getISOCurrencyEv:
  136|   154k|inline const char16_t* CurrencyUnit::getISOCurrency() const {
  137|   154k|    return isoCode;
  138|   154k|}

_ZNK6icu_7820DecimalFormatSymbols22isCustomCurrencySymbolEv:
  401|  56.1k|    inline UBool isCustomCurrencySymbol() const {
  402|  56.1k|        return fIsCustomCurrencySymbol;
  403|  56.1k|    }
_ZNK6icu_7820DecimalFormatSymbols26isCustomIntlCurrencySymbolEv:
  408|  56.1k|    inline UBool isCustomIntlCurrencySymbol() const {
  409|  56.1k|        return fIsCustomIntlCurrencySymbol;
  410|  56.1k|    }
_ZNK6icu_7820DecimalFormatSymbols16getCodePointZeroEv:
  415|   154k|    inline UChar32 getCodePointZero() const {
  416|   154k|        return fCodePointZero;
  417|   154k|    }
_ZNK6icu_7820DecimalFormatSymbols9getSymbolENS0_19ENumberFormatSymbolE:
  522|   156k|DecimalFormatSymbols::getSymbol(ENumberFormatSymbol symbol) const {
  523|   156k|    const UnicodeString *strPtr;
  524|   156k|    if(symbol < kFormatSymbolCount) {
  ------------------
  |  Branch (524:8): [True: 156k, False: 0]
  ------------------
  525|   156k|        strPtr = &fSymbols[symbol];
  526|   156k|    } else {
  527|      0|        strPtr = &fNoSymbol;
  528|      0|    }
  529|   156k|    return *strPtr;
  530|   156k|}
_ZNK6icu_7820DecimalFormatSymbols14getConstSymbolENS0_19ENumberFormatSymbolE:
  534|   309k|DecimalFormatSymbols::getConstSymbol(ENumberFormatSymbol symbol) const {
  535|   309k|    const UnicodeString *strPtr;
  536|   309k|    if(symbol < kFormatSymbolCount) {
  ------------------
  |  Branch (536:8): [True: 309k, False: 0]
  ------------------
  537|   309k|        strPtr = &fSymbols[symbol];
  538|   309k|    } else {
  539|      0|        strPtr = &fNoSymbol;
  540|      0|    }
  541|   309k|    return *strPtr;
  542|   309k|}
_ZNK6icu_7820DecimalFormatSymbols19getConstDigitSymbolEi:
  545|   444k|inline const UnicodeString& DecimalFormatSymbols::getConstDigitSymbol(int32_t digit) const {
  546|   444k|    if (digit < 0 || digit > 9) {
  ------------------
  |  Branch (546:9): [True: 0, False: 444k]
  |  Branch (546:22): [True: 0, False: 444k]
  ------------------
  547|      0|        digit = 0;
  548|      0|    }
  549|   444k|    if (digit == 0) {
  ------------------
  |  Branch (549:9): [True: 44.4k, False: 400k]
  ------------------
  550|  44.4k|        return fSymbols[kZeroDigitSymbol];
  551|  44.4k|    }
  552|   400k|    ENumberFormatSymbol key = static_cast<ENumberFormatSymbol>(kOneDigitSymbol + digit - 1);
  553|   400k|    return fSymbols[key];
  554|   444k|}
_ZN6icu_7820DecimalFormatSymbols9setSymbolENS0_19ENumberFormatSymbolERKNS_13UnicodeStringEa:
  560|   577k|DecimalFormatSymbols::setSymbol(ENumberFormatSymbol symbol, const UnicodeString &value, const UBool propagateDigits = true) {
  561|   577k|    if (symbol == kCurrencySymbol) {
  ------------------
  |  Branch (561:9): [True: 0, False: 577k]
  ------------------
  562|      0|        fIsCustomCurrencySymbol = true;
  563|      0|    }
  564|   577k|    else if (symbol == kIntlCurrencySymbol) {
  ------------------
  |  Branch (564:14): [True: 0, False: 577k]
  ------------------
  565|      0|        fIsCustomIntlCurrencySymbol = true;
  566|      0|    }
  567|   577k|    if(symbol<kFormatSymbolCount) {
  ------------------
  |  Branch (567:8): [True: 577k, False: 0]
  ------------------
  568|   577k|        fSymbols[symbol]=value;
  569|   577k|    }
  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|   577k|    if (symbol == kZeroDigitSymbol) {
  ------------------
  |  Branch (574:9): [True: 0, False: 577k]
  ------------------
  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|   577k|    } else if (symbol >= kOneDigitSymbol && symbol <= kNineDigitSymbol) {
  ------------------
  |  Branch (585:16): [True: 88.9k, False: 489k]
  |  Branch (585:45): [True: 0, False: 88.9k]
  ------------------
  586|      0|        fCodePointZero = -1;
  587|      0|    }
  588|   577k|}
_ZNK6icu_7820DecimalFormatSymbols9getLocaleEv:
  593|   365k|DecimalFormatSymbols::getLocale() const {
  594|   365k|    return locale;
  595|   365k|}
_ZNK6icu_7820DecimalFormatSymbols22getNumberingSystemNameEv:
  603|  56.1k|DecimalFormatSymbols::getNumberingSystemName() const {
  604|  56.1k|    return nsName;
  605|  56.1k|}

_ZN6icu_788message210data_model7LiteralC2EaRKNS_13UnicodeStringE:
  119|   390k|            Literal(UBool q, const UnicodeString& s) : thisIsQuoted(q), contents(s) {}
_ZN6icu_788message210data_model7LiteralC2ERKS2_:
  126|  9.04M|            Literal(const Literal& other) : thisIsQuoted(other.thisIsQuoted), contents(other.contents) {}
_ZN6icu_788message210data_model4swapERNS1_7LiteralES3_:
  135|  1.09M|            friend inline void swap(Literal& l1, Literal& l2) noexcept {
  136|  1.09M|                using std::swap;
  137|       |
  138|  1.09M|                swap(l1.thisIsQuoted, l2.thisIsQuoted);
  139|  1.09M|                swap(l1.contents, l2.contents);
  140|  1.09M|            }
_ZN6icu_788message210data_model7OperandC2Ev:
  312|   451k|            Operand() : contents(std::nullopt) {}
_ZN6icu_788message210data_model7OperandC2ERKNS_13UnicodeStringE:
  322|  2.52k|            explicit Operand(const UnicodeString& v) : contents(VariableName(v)) {}
_ZN6icu_788message210data_model7OperandC2ERKNS1_7LiteralE:
  332|  34.9k|            explicit Operand(const Literal& l) : contents(l) {}
_ZN6icu_788message210data_model4swapERNS1_7OperandES3_:
  341|   375k|            friend inline void swap(Operand& o1, Operand& o2) noexcept {
  342|   375k|                using std::swap;
  343|   375k|                (void) o1;
  344|   375k|                (void) o2;
  345|   375k|                swap(o1.contents, o2.contents);
  346|   375k|            }
_ZN6icu_788message210data_model3KeyC2ERKS2_:
  414|  3.66M|            Key(const Key& other) : contents(other.contents) {}
_ZN6icu_788message210data_model3KeyC2Ev:
  422|  3.66M|            Key() : contents(std::nullopt) {}
_ZN6icu_788message210data_model3KeyC2ERKNS1_7LiteralE:
  432|  1.05M|            explicit Key(const Literal& lit) : contents(lit) {}
_ZN6icu_788message210data_model4swapERNS1_3KeyES3_:
  441|  3.66M|            friend inline void swap(Key& k1, Key& k2) noexcept {
  442|  3.66M|                using std::swap;
  443|       |
  444|  3.66M|                swap(k1.contents, k2.contents);
  445|  3.66M|            }
_ZN6icu_788message210data_model12SelectorKeysC2Ev:
  617|    545|            SelectorKeys() : len(0) {}
_ZNK6icu_788message210data_model6Option7getNameEv:
  700|  14.1k|            const UnicodeString& getName() const { return name; }
_ZN6icu_788message210data_model6OptionC2ERKNS_13UnicodeStringEONS1_7OperandE:
  711|  31.9k|            Option(const UnicodeString& n, Operand&& r) : name(n), rand(std::move(r)) {}
_ZN6icu_788message210data_model6OptionC2Ev:
  719|   279k|            Option() {}
_ZN6icu_788message210data_model4swapERNS1_6OptionES3_:
  728|   279k|            friend inline void swap(Option& o1, Option& o2) noexcept {
  729|   279k|                using std::swap;
  730|       |
  731|   279k|                swap(o1.name, o2.name);
  732|   279k|                swap(o1.rand, o2.rand);
  733|   279k|            }
_ZN6icu_788message210data_model4swapERNS1_9OptionMapES3_:
  785|   124k|            friend inline void swap(OptionMap& m1, OptionMap& m2) noexcept {
  786|   124k|                using std::swap;
  787|       |
  788|   124k|                swap(m1.bogus, m2.bogus);
  789|   124k|                swap(m1.options, m2.options);
  790|   124k|                swap(m1.len, m2.len);
  791|   124k|            }
_ZN6icu_788message210data_model9OptionMapC2Ev:
  792|   143k|            OptionMap() : len(0) {}
_ZN6icu_788message210data_model4swapERNS1_8OperatorES3_:
  968|  33.6k|            friend inline void swap(Operator& o1, Operator& o2) noexcept {
  969|  33.6k|                using std::swap;
  970|       |
  971|  33.6k|                swap(o1.name, o2.name);
  972|  33.6k|                swap(o1.options, o2.options);
  973|  33.6k|            }
_ZN6icu_788message210data_model8OperatorC2Ev:
  988|  45.1k|            Operator() {}
_ZN6icu_788message210data_model6MarkupC2Ev:
 1113|  23.3k|            Markup() {}
_ZN6icu_788message210data_model6Markup7Builder7setNameERKNS_13UnicodeStringE:
 1148|  23.3k|                Builder& setName(const UnicodeString& n) { name = n; return *this; }
_ZN6icu_788message210data_model6Markup7Builder7setOpenEv:
 1157|  20.8k|                Builder& setOpen() { type = UMARKUP_OPEN; return *this; }
_ZN6icu_788message210data_model6Markup7Builder8setCloseEv:
 1166|  2.25k|                Builder& setClose() { type = UMARKUP_CLOSE; return *this; }
_ZN6icu_788message210data_model6Markup7Builder13setStandaloneEv:
 1175|    277|                Builder& setStandalone() { type = UMARKUP_STANDALONE; return *this; }
_ZN6icu_788message210data_model4swapERNS1_10ExpressionES3_:
 1423|  45.1k|            friend inline void swap(Expression& e1, Expression& e2) noexcept {
 1424|  45.1k|                using std::swap;
 1425|       |
 1426|  45.1k|                swap(e1.rator, e2.rator);
 1427|  45.1k|                swap(e1.rand, e2.rand);
 1428|  45.1k|                swap(e1.attributes, e2.attributes);
 1429|  45.1k|            }
_ZN6icu_788message210data_model10ExpressionC2ERKNS1_8OperatorERKNS1_7OperandERKNS1_9OptionMapE:
 1476|  4.15k|            Expression(const Operator &rAtor, const Operand &rAnd, const OptionMap& attrs) : rator(rAtor), rand(rAnd), attributes(attrs) {}
_ZN6icu_788message210data_model10ExpressionC2ERKNS1_7OperandERKNS1_9OptionMapE:
 1477|  11.5k|            Expression(const Operand &rAnd, const OptionMap& attrs) : rator(std::nullopt), rand(Operand(rAnd)), attributes(attrs) {}
_ZN6icu_788message210data_model10ExpressionC2ERKNS1_8OperatorERKNS1_9OptionMapE:
 1478|  29.4k|            Expression(const Operator &rAtor, const OptionMap& attrs) : rator(rAtor), rand(), attributes(attrs) {}
_ZN6icu_788message210data_model4swapERNS1_11PatternPartES3_:
 1582|  33.1M|            friend inline void swap(PatternPart& p1, PatternPart& p2) noexcept {
 1583|  33.1M|                using std::swap;
 1584|       |
 1585|  33.1M|                swap(p1.piece, p2.piece);
 1586|  33.1M|            }
_ZN6icu_788message210data_model11PatternPartC2ERKNS_13UnicodeStringE:
 1617|  12.1M|            explicit PatternPart(const UnicodeString& t) : piece(t) {}
_ZN6icu_788message210data_model11PatternPartC2EONS1_10ExpressionE:
 1627|  9.77k|            explicit PatternPart(Expression&& e) : piece(e) {}
_ZN6icu_788message210data_model11PatternPartC2EONS1_6MarkupE:
 1637|  23.0k|            explicit PatternPart(Markup&& m) : piece(m) {}
_ZN6icu_788message210data_model7PatternC2Ev:
 1800|  54.4k|            Pattern() : parts(LocalArray<PatternPart>()) {}
_ZN6icu_788message210data_model4swapERNS1_7PatternES3_:
 1809|  15.3k|            friend inline void swap(Pattern& p1, Pattern& p2) noexcept {
 1810|  15.3k|                using std::swap;
 1811|       |
 1812|  15.3k|                swap(p1.bogus, p2.bogus);
 1813|  15.3k|                swap(p1.len, p2.len);
 1814|  15.3k|                swap(p1.parts, p2.parts);
 1815|  15.3k|            }
_ZN6icu_788message210data_model7VariantC2ERKNS1_12SelectorKeysEONS1_7PatternE:
 1975|    273|            Variant(const SelectorKeys& keys, Pattern&& pattern) : k(keys), p(std::move(pattern)) {}
_ZN6icu_788message24swapERNS0_11MFDataModelES2_:
 2395|  8.09k|        friend inline void swap(MFDataModel& m1, MFDataModel& m2) noexcept {
 2396|  8.09k|            using std::swap;
 2397|       |
 2398|  8.09k|            if (m1.bogus) {
  ------------------
  |  Branch (2398:17): [True: 0, False: 8.09k]
  ------------------
 2399|      0|                m2.bogus = true;
 2400|      0|                return;
 2401|      0|            }
 2402|  8.09k|            if (m2.bogus) {
  ------------------
  |  Branch (2402:17): [True: 0, False: 8.09k]
  ------------------
 2403|      0|                m1.bogus = true;
 2404|      0|                return;
 2405|      0|            }
 2406|  8.09k|            swap(m1.body, m2.body);
 2407|  8.09k|            swap(m1.bindings, m2.bindings);
 2408|  8.09k|            swap(m1.bindingsLen, m2.bindingsLen);
 2409|  8.09k|        }
_ZNK6icu_788message211MFDataModel10hasPatternEv:
 2556|  1.00k|        bool hasPattern() const { return std::holds_alternative<Pattern>(body); }
_ZN6icu_788message210data_model7LiteralC2Ev:
  155|  1.79M|            Literal() = default;
_ZN6icu_788message210data_model11PatternPartC2Ev:
 1645|  33.1M|            PatternPart() = default;

_ZN6icu_788message218MFFunctionRegistryC2Ev:
  312|  7.59k|        MFFunctionRegistry() {}

_ZN6icu_786number8NotationC2Ev:
  382|   562k|    Notation() : fType(NTN_SIMPLE), fUnion() {}
_ZN6icu_786number9PrecisionC2ERKNS1_13PrecisionTypeERKNS1_14PrecisionUnionE:
  767|   154k|            : fType(type), fUnion(union_) {}
_ZN6icu_786number9PrecisionC2Ev:
  773|   872k|    Precision() : fType(RND_BOGUS) {}
_ZNK6icu_786number9Precision7isBogusEv:
  775|   154k|    bool isBogus() const {
  776|   154k|        return fType == RND_BOGUS;
  777|   154k|    }
_ZN6icu_786number12IntegerWidthC2Ev:
 1035|   562k|    IntegerWidth() { // NOLINT
 1036|   562k|        fUnion.minMaxInt.fMinInt = -1;
 1037|   562k|    }
_ZN6icu_786number5ScaleC2Ev:
 1170|   562k|    Scale() : fMagnitude(0), fArbitrary(nullptr), fError(U_ZERO_ERROR) {}
_ZN6icu_786number4impl10StringPropC2Ev:
 1256|  1.12M|    StringProp() : fValue(nullptr), fLength(0), fError(U_ZERO_ERROR) {
 1257|  1.12M|    }
_ZN6icu_786number4impl14SymbolsWrapperC2Ev:
 1284|   562k|    SymbolsWrapper() : fType(SYMPTR_NONE), fPtr{nullptr} {}
_ZN6icu_786number4impl7GrouperC2Esss23UNumberGroupingStrategy:
 1388|   210k|            : fGrouping1(grouping1),
 1389|   210k|              fGrouping2(grouping2),
 1390|   210k|              fMinGrouping(minGrouping),
 1391|   210k|              fStrategy(strategy) {}
_ZN6icu_786number4impl7GrouperC2Ev:
 1427|   618k|    Grouper() : fGrouping1(-3) {}
_ZN6icu_786number4impl6PadderC2Ev:
 1487|   562k|    Padder() : fWidth(-2) {} // NOLINT
_ZN6icu_786number26UnlocalizedNumberFormatterC2Ev:
 2464|   154k|    UnlocalizedNumberFormatter() = default;
_ZN6icu_786number23NumberFormatterSettingsINS0_26UnlocalizedNumberFormatterEEC2Ev:
 2408|   154k|    NumberFormatterSettings() = default;
_ZN6icu_786number24LocalizedNumberFormatterC2Ev:
 2634|  98.5k|    LocalizedNumberFormatter() = default;
_ZN6icu_786number23NumberFormatterSettingsINS0_24LocalizedNumberFormatterEEC2Ev:
 2408|   253k|    NumberFormatterSettings() = default;

_ZN6icu_7812PluralFormat21PluralSelectorAdapterC2Ev:
  541|  21.2k|        PluralSelectorAdapter() : pluralRules(nullptr) {
  542|  21.2k|        }

_ZNK6icu_7821RuleBasedNumberFormat17getDefaultRuleSetEv:
 1174|  21.2k|RuleBasedNumberFormat::getDefaultRuleSet() const {
 1175|  21.2k|    return defaultRuleSet;
 1176|  21.2k|}

_ZN6icu_786number21SimpleNumberFormatterD2Ev:
  251|  56.1k|    ~SimpleNumberFormatter() {
  252|  56.1k|        cleanup();
  253|  56.1k|    }
_ZN6icu_786number21SimpleNumberFormatterC2Ev:
  260|  56.1k|    SimpleNumberFormatter() = default;

_ZN6icu_788ZoneMeta18getCanonicalCLDRIDERKNS_13UnicodeStringER10UErrorCode:
  229|      1|ZoneMeta::getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status) {
  230|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (230:9): [True: 0, False: 1]
  ------------------
  231|      0|        return nullptr;
  232|      0|    }
  233|       |
  234|      1|    if (tzid.isBogus() || tzid.length() > ZID_KEY_MAX) {
  ------------------
  |  |  113|      1|#define ZID_KEY_MAX 128
  ------------------
  |  Branch (234:9): [True: 0, False: 1]
  |  Branch (234:27): [True: 0, False: 1]
  ------------------
  235|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  236|      0|        return nullptr;
  237|      0|    }
  238|       |
  239|       |    // Checking the cached results
  240|      1|    umtx_initOnce(gCanonicalIDCacheInitOnce, &initCanonicalIDCache, status);
  241|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (241:9): [True: 0, False: 1]
  ------------------
  242|      0|        return nullptr;
  243|      0|    }
  244|       |
  245|      1|    const char16_t *canonicalID = nullptr;
  246|       |
  247|      1|    UErrorCode tmpStatus = U_ZERO_ERROR;
  248|      1|    char16_t utzid[ZID_KEY_MAX + 1];
  249|      1|    tzid.extract(utzid, ZID_KEY_MAX + 1, tmpStatus);
  ------------------
  |  |  113|      1|#define ZID_KEY_MAX 128
  ------------------
  250|      1|    U_ASSERT(tmpStatus == U_ZERO_ERROR);    // we checked the length of tzid already
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  251|       |
  252|      1|    if (!uprv_isInvariantUString(utzid, -1)) {
  ------------------
  |  | 1518|      1|#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
  |  |  ------------------
  |  |  |  |  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 (252:9): [True: 0, False: 1]
  ------------------
  253|       |        // All of known tz IDs are only containing ASCII invariant characters.
  254|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  255|      0|        return nullptr;
  256|      0|    }
  257|       |
  258|       |    // Check if it was already cached
  259|      1|    umtx_lock(&gZoneMetaLock);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  260|      1|    {
  261|      1|        canonicalID = static_cast<const char16_t*>(uhash_get(gCanonicalIDCache, utzid));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  262|      1|    }
  263|      1|    umtx_unlock(&gZoneMetaLock);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  264|       |
  265|      1|    if (canonicalID != nullptr) {
  ------------------
  |  Branch (265:9): [True: 0, False: 1]
  ------------------
  266|      0|        return canonicalID;
  267|      0|    }
  268|       |
  269|       |    // If not, resolve CLDR canonical ID with resource data
  270|      1|    UBool isInputCanonical = false;
  271|      1|    char id[ZID_KEY_MAX + 1];
  272|      1|    tzid.extract(0, 0x7fffffff, id, UPRV_LENGTHOF(id), US_INV);
  ------------------
  |  |   99|      1|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
                  tzid.extract(0, 0x7fffffff, id, UPRV_LENGTHOF(id), US_INV);
  ------------------
  |  |   98|      1|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  273|       |
  274|       |    // replace '/' with ':'
  275|      1|    char *p = id;
  276|      8|    while (*p++) {
  ------------------
  |  Branch (276:12): [True: 7, False: 1]
  ------------------
  277|      7|        if (*p == '/') {
  ------------------
  |  Branch (277:13): [True: 1, False: 6]
  ------------------
  278|      1|            *p = ':';
  279|      1|        }
  280|      7|    }
  281|       |
  282|      1|    UResourceBundle *top = ures_openDirect(nullptr, gKeyTypeData, &tmpStatus);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  283|      1|    UResourceBundle *rb = ures_getByKey(top, gTypeMapTag, nullptr, &tmpStatus);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  284|      1|    ures_getByKey(rb, gTimezoneTag, rb, &tmpStatus);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  285|      1|    ures_getByKey(rb, id, rb, &tmpStatus);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  286|      1|    if (U_SUCCESS(tmpStatus)) {
  ------------------
  |  Branch (286:9): [True: 1, False: 0]
  ------------------
  287|       |        // type entry (canonical) found
  288|       |        // the input is the canonical ID. resolve to const char16_t*
  289|      1|        canonicalID = TimeZone::findID(tzid);
  290|      1|        isInputCanonical = true;
  291|      1|    }
  292|       |
  293|      1|    if (canonicalID == nullptr) {
  ------------------
  |  Branch (293:9): [True: 0, False: 1]
  ------------------
  294|       |        // If a map element not found, then look for an alias
  295|      0|        tmpStatus = U_ZERO_ERROR;
  296|      0|        ures_getByKey(top, gTypeAliasTag, rb, &tmpStatus);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  297|      0|        ures_getByKey(rb, gTimezoneTag, rb, &tmpStatus);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  298|      0|        const char16_t *canonical = ures_getStringByKey(rb,id,nullptr,&tmpStatus);
  ------------------
  |  | 1677|      0|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  299|      0|        if (U_SUCCESS(tmpStatus)) {
  ------------------
  |  Branch (299:13): [True: 0, False: 0]
  ------------------
  300|       |            // canonical map found
  301|      0|            canonicalID = canonical;
  302|      0|        }
  303|       |
  304|      0|        if (canonicalID == nullptr) {
  ------------------
  |  Branch (304:13): [True: 0, False: 0]
  ------------------
  305|       |            // Dereference the input ID using the tz data
  306|      0|            const char16_t *derefer = TimeZone::dereferOlsonLink(tzid);
  307|      0|            if (derefer == nullptr) {
  ------------------
  |  Branch (307:17): [True: 0, False: 0]
  ------------------
  308|      0|                status = U_ILLEGAL_ARGUMENT_ERROR;
  309|      0|            } else {
  310|      0|                int32_t len = u_strlen(derefer);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  311|      0|                u_UCharsToChars(derefer,id,len);
  ------------------
  |  |  211|      0|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  312|      0|                id[len] = static_cast<char>(0); // Make sure it is null terminated.
  313|       |
  314|       |                // replace '/' with ':'
  315|      0|                char *q = id;
  316|      0|                while (*q++) {
  ------------------
  |  Branch (316:24): [True: 0, False: 0]
  ------------------
  317|      0|                    if (*q == '/') {
  ------------------
  |  Branch (317:25): [True: 0, False: 0]
  ------------------
  318|      0|                        *q = ':';
  319|      0|                    }
  320|      0|                }
  321|       |
  322|       |                // If a dereference turned something up then look for an alias.
  323|       |                // rb still points to the alias table, so we don't have to go looking
  324|       |                // for it.
  325|      0|                tmpStatus = U_ZERO_ERROR;
  326|      0|                canonical = ures_getStringByKey(rb,id,nullptr,&tmpStatus);
  ------------------
  |  | 1677|      0|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  327|      0|                if (U_SUCCESS(tmpStatus)) {
  ------------------
  |  Branch (327:21): [True: 0, False: 0]
  ------------------
  328|       |                    // canonical map for the dereferenced ID found
  329|      0|                    canonicalID = canonical;
  330|      0|                } else {
  331|      0|                    canonicalID = derefer;
  332|      0|                    isInputCanonical = true;
  333|      0|                }
  334|      0|            }
  335|      0|        }
  336|      0|    }
  337|      1|    ures_close(rb);
  ------------------
  |  | 1652|      1|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  338|      1|    ures_close(top);
  ------------------
  |  | 1652|      1|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  339|       |
  340|      1|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (340:9): [True: 1, False: 0]
  ------------------
  341|      1|        U_ASSERT(canonicalID != nullptr);  // canocanilD must be non-nullptr here
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  342|       |
  343|       |        // Put the resolved canonical ID to the cache
  344|      1|        umtx_lock(&gZoneMetaLock);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  345|      1|        {
  346|      1|            const char16_t* idInCache = static_cast<const char16_t*>(uhash_get(gCanonicalIDCache, utzid));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  347|      1|            if (idInCache == nullptr) {
  ------------------
  |  Branch (347:17): [True: 1, False: 0]
  ------------------
  348|      1|                const char16_t* key = ZoneMeta::findTimeZoneID(tzid);
  349|      1|                U_ASSERT(key != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  350|      1|                if (key != nullptr) {
  ------------------
  |  Branch (350:21): [True: 1, False: 0]
  ------------------
  351|      1|                    idInCache = static_cast<const char16_t*>(uhash_put(gCanonicalIDCache, const_cast<char16_t*>(key), const_cast<char16_t*>(canonicalID), &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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  352|      1|                    U_ASSERT(idInCache == nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  353|      1|                }
  354|      1|            }
  355|      1|            if (U_SUCCESS(status) && isInputCanonical) {
  ------------------
  |  Branch (355:17): [True: 1, False: 0]
  |  Branch (355:38): [True: 1, False: 0]
  ------------------
  356|       |                // Also put canonical ID itself into the cache if not exist
  357|      1|                const char16_t* canonicalInCache = static_cast<const char16_t*>(uhash_get(gCanonicalIDCache, canonicalID));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  358|      1|                if (canonicalInCache == nullptr) {
  ------------------
  |  Branch (358:21): [True: 0, False: 1]
  ------------------
  359|      0|                    canonicalInCache = static_cast<const char16_t*>(uhash_put(gCanonicalIDCache, const_cast<char16_t*>(canonicalID), const_cast<char16_t*>(canonicalID), &status));
  ------------------
  |  | 1032|      0|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  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|                    U_ASSERT(canonicalInCache == nullptr);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  361|      0|                }
  362|      1|            }
  363|      1|        }
  364|      1|        umtx_unlock(&gZoneMetaLock);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  365|      1|    }
  366|       |
  367|      1|    return canonicalID;
  368|      1|}
_ZN6icu_788ZoneMeta14findTimeZoneIDERKNS_13UnicodeStringE:
  854|      1|ZoneMeta::findTimeZoneID(const UnicodeString& tzid) {
  855|      1|    return TimeZone::findID(tzid);
  856|      1|}
zonemeta.cpp:_ZN6icu_78L20initCanonicalIDCacheER10UErrorCode:
  215|      1|static void U_CALLCONV initCanonicalIDCache(UErrorCode &status) {
  216|      1|    gCanonicalIDCache = uhash_open(uhash_hashUChars, uhash_compareUChars, 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  gCanonicalIDCache = uhash_open(uhash_hashUChars, uhash_compareUChars, nullptr, &status);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  gCanonicalIDCache = uhash_open(uhash_hashUChars, uhash_compareUChars, nullptr, &status);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  217|      1|    if (gCanonicalIDCache == nullptr) {
  ------------------
  |  Branch (217:9): [True: 0, False: 1]
  ------------------
  218|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  219|      0|    }
  220|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (220:9): [True: 0, False: 1]
  ------------------
  221|      0|        gCanonicalIDCache = nullptr;
  222|      0|    }
  223|       |    // No key/value deleters - keys/values are from a resource bundle
  224|      1|    ucln_i18n_registerCleanup(UCLN_I18N_ZONEMETA, zoneMeta_cleanup);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  225|      1|}

_ZN14IcuEnvironmentC2Ev:
   14|      2|  IcuEnvironment() {
   15|       |    // nothing to initialize yet;
   16|      2|  }

LLVMFuzzerTestOneInput:
   17|  7.59k|extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   18|  7.59k|  UParseError pe = { 0, 0, {0}, {0} };
   19|  7.59k|  UErrorCode status = U_ZERO_ERROR;
   20|       |
   21|  7.59k|  size_t unistr_size = size/2;
   22|  7.59k|  std::unique_ptr<char16_t[]> fuzzbuff(new char16_t[unistr_size]);
   23|  7.59k|  std::memcpy(fuzzbuff.get(), data, unistr_size * 2);
   24|  7.59k|  icu::UnicodeString fuzzstr(false, fuzzbuff.get(), unistr_size);
   25|       |
   26|  7.59k|  icu::MessageFormat mfmt(fuzzstr, status);
   27|       |
   28|  7.59k|  status = U_ZERO_ERROR;
   29|  7.59k|  icu::MessagePattern mpat(fuzzstr, &pe, status);
   30|  7.59k|  pe = { 0, 0, {0}, {0} };
   31|       |
   32|  7.59k|  status = U_ZERO_ERROR;
   33|  7.59k|  icu::message2::MessageFormatter msgfmt2 =
   34|  7.59k|      icu::message2::MessageFormatter::Builder(status)
   35|  7.59k|      .setPattern(fuzzstr, pe, status)
   36|  7.59k|      .build(status);
   37|  7.59k|  return 0;
   38|  7.59k|}

