_ZN6icu_786BMPSetC2EPKii:
   30|  1.77k|        list(parentList), listLength(parentListLength) {
   31|  1.77k|    uprv_memset(latin1Contains, 0, sizeof(latin1Contains));
  ------------------
  |  |  100|  1.77k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  1.77k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   32|  1.77k|    uprv_memset(table7FF, 0, sizeof(table7FF));
  ------------------
  |  |  100|  1.77k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  1.77k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   33|  1.77k|    uprv_memset(bmpBlockBits, 0, sizeof(bmpBlockBits));
  ------------------
  |  |  100|  1.77k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  1.77k|#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|  1.77k|    list4kStarts[0]=findCodePoint(0x800, 0, listLength-1);
   43|  1.77k|    int32_t i;
   44|  30.1k|    for(i=1; i<=0x10; ++i) {
  ------------------
  |  Branch (44:14): [True: 28.3k, False: 1.77k]
  ------------------
   45|  28.3k|        list4kStarts[i]=findCodePoint(i<<12, list4kStarts[i-1], listLength-1);
   46|  28.3k|    }
   47|  1.77k|    list4kStarts[0x11]=listLength-1;
   48|  1.77k|    containsFFFD=containsSlow(0xfffd, list4kStarts[0xf], list4kStarts[0x10]);
   49|       |
   50|  1.77k|    initBits();
   51|  1.77k|    overrideIllegal();
   52|  1.77k|}
_ZN6icu_786BMPSetD2Ev:
   63|  1.74k|BMPSet::~BMPSet() {
   64|  1.74k|}
_ZN6icu_786BMPSet8initBitsEv:
  121|  1.77k|void BMPSet::initBits() {
  122|  1.77k|    UChar32 start, limit;
  123|  1.77k|    int32_t listIndex=0;
  124|       |
  125|       |    // Set latin1Contains[].
  126|  7.92k|    do {
  127|  7.92k|        start=list[listIndex++];
  128|  7.92k|        if(listIndex<listLength) {
  ------------------
  |  Branch (128:12): [True: 7.05k, False: 874]
  ------------------
  129|  7.05k|            limit=list[listIndex++];
  130|  7.05k|        } else {
  131|    874|            limit=0x110000;
  132|    874|        }
  133|  7.92k|        if(start>=0x100) {
  ------------------
  |  Branch (133:12): [True: 1.77k, False: 6.15k]
  ------------------
  134|  1.77k|            break;
  135|  1.77k|        }
  136|  6.18k|        do {
  137|  6.18k|            latin1Contains[start++]=1;
  138|  6.18k|        } while(start<limit && start<0x100);
  ------------------
  |  Branch (138:17): [True: 27, False: 6.15k]
  |  Branch (138:32): [True: 27, False: 0]
  ------------------
  139|  6.15k|    } while(limit<=0x100);
  ------------------
  |  Branch (139:13): [True: 6.15k, False: 0]
  ------------------
  140|       |
  141|       |    // Find the first range overlapping with (or after) 80..FF again,
  142|       |    // to include them in table7FF as well.
  143|  7.04k|    for(listIndex=0;;) {
  144|  7.04k|        start=list[listIndex++];
  145|  7.04k|        if(listIndex<listLength) {
  ------------------
  |  Branch (145:12): [True: 6.17k, False: 874]
  ------------------
  146|  6.17k|            limit=list[listIndex++];
  147|  6.17k|        } else {
  148|    874|            limit=0x110000;
  149|    874|        }
  150|  7.04k|        if(limit>0x80) {
  ------------------
  |  Branch (150:12): [True: 1.77k, False: 5.27k]
  ------------------
  151|  1.77k|            if(start<0x80) {
  ------------------
  |  Branch (151:16): [True: 0, False: 1.77k]
  ------------------
  152|      0|                start=0x80;
  153|      0|            }
  154|  1.77k|            break;
  155|  1.77k|        }
  156|  7.04k|    }
  157|       |
  158|       |    // Set table7FF[].
  159|  5.30k|    while(start<0x800) {
  ------------------
  |  Branch (159:11): [True: 3.53k, False: 1.77k]
  ------------------
  160|  3.53k|        set32x64Bits(table7FF, start, limit<=0x800 ? limit : 0x800);
  ------------------
  |  Branch (160:39): [True: 3.53k, False: 0]
  ------------------
  161|  3.53k|        if(limit>0x800) {
  ------------------
  |  Branch (161:12): [True: 0, False: 3.53k]
  ------------------
  162|      0|            start=0x800;
  163|      0|            break;
  164|      0|        }
  165|       |
  166|  3.53k|        start=list[listIndex++];
  167|  3.53k|        if(listIndex<listLength) {
  ------------------
  |  Branch (167:12): [True: 3.53k, False: 0]
  ------------------
  168|  3.53k|            limit=list[listIndex++];
  169|  3.53k|        } else {
  170|      0|            limit=0x110000;
  171|      0|        }
  172|  3.53k|    }
  173|       |
  174|       |    // Set bmpBlockBits[].
  175|  1.77k|    int32_t minStart=0x800;
  176|  15.9k|    while(start<0x10000) {
  ------------------
  |  Branch (176:11): [True: 14.2k, False: 1.77k]
  ------------------
  177|  14.2k|        if(limit>0x10000) {
  ------------------
  |  Branch (177:12): [True: 0, False: 14.2k]
  ------------------
  178|      0|            limit=0x10000;
  179|      0|        }
  180|       |
  181|  14.2k|        if(start<minStart) {
  ------------------
  |  Branch (181:12): [True: 6.16k, False: 8.04k]
  ------------------
  182|  6.16k|            start=minStart;
  183|  6.16k|        }
  184|  14.2k|        if(start<limit) {  // Else: Another range entirely in a known mixed-value block.
  ------------------
  |  Branch (184:12): [True: 8.04k, False: 6.16k]
  ------------------
  185|  8.04k|            if(start&0x3f) {
  ------------------
  |  Branch (185:16): [True: 6.27k, False: 1.77k]
  ------------------
  186|       |                // Mixed-value block of 64 code points.
  187|  6.27k|                start>>=6;
  188|  6.27k|                bmpBlockBits[start&0x3f]|=0x10001<<(start>>6);
  189|  6.27k|                start=(start+1)<<6;  // Round up to the next block boundary.
  190|  6.27k|                minStart=start;      // Ignore further ranges in this block.
  191|  6.27k|            }
  192|  8.04k|            if(start<limit) {
  ------------------
  |  Branch (192:16): [True: 1.77k, False: 6.27k]
  ------------------
  193|  1.77k|                if(start<(limit&~0x3f)) {
  ------------------
  |  Branch (193:20): [True: 0, False: 1.77k]
  ------------------
  194|       |                    // Multiple all-ones blocks of 64 code points each.
  195|      0|                    set32x64Bits(bmpBlockBits, start>>6, limit>>6);
  196|      0|                }
  197|       |
  198|  1.77k|                if(limit&0x3f) {
  ------------------
  |  Branch (198:20): [True: 1.77k, False: 0]
  ------------------
  199|       |                    // Mixed-value block of 64 code points.
  200|  1.77k|                    limit>>=6;
  201|  1.77k|                    bmpBlockBits[limit&0x3f]|=0x10001<<(limit>>6);
  202|  1.77k|                    limit=(limit+1)<<6;  // Round up to the next block boundary.
  203|  1.77k|                    minStart=limit;      // Ignore further ranges in this block.
  204|  1.77k|                }
  205|  1.77k|            }
  206|  8.04k|        }
  207|       |
  208|  14.2k|        if(limit==0x10000) {
  ------------------
  |  Branch (208:12): [True: 0, False: 14.2k]
  ------------------
  209|      0|            break;
  210|      0|        }
  211|       |
  212|  14.2k|        start=list[listIndex++];
  213|  14.2k|        if(listIndex<listLength) {
  ------------------
  |  Branch (213:12): [True: 13.3k, False: 894]
  ------------------
  214|  13.3k|            limit=list[listIndex++];
  215|  13.3k|        } else {
  216|    894|            limit=0x110000;
  217|    894|        }
  218|  14.2k|    }
  219|  1.77k|}
_ZN6icu_786BMPSet15overrideIllegalEv:
  229|  1.77k|void BMPSet::overrideIllegal() {
  230|  1.77k|    uint32_t bits, mask;
  231|  1.77k|    int32_t i;
  232|       |
  233|  1.77k|    if(containsFFFD) {
  ------------------
  |  Branch (233:8): [True: 0, False: 1.77k]
  ------------------
  234|      0|        bits=3;                 // Lead bytes 0xC0 and 0xC1.
  235|      0|        for(i=0; i<64; ++i) {
  ------------------
  |  Branch (235:18): [True: 0, False: 0]
  ------------------
  236|      0|            table7FF[i]|=bits;
  237|      0|        }
  238|       |
  239|      0|        bits=1;                 // Lead byte 0xE0.
  240|      0|        for(i=0; i<32; ++i) {   // First half of 4k block.
  ------------------
  |  Branch (240:18): [True: 0, False: 0]
  ------------------
  241|      0|            bmpBlockBits[i]|=bits;
  242|      0|        }
  243|       |
  244|      0|        mask= static_cast<uint32_t>(~(0x10001<<0xd));   // Lead byte 0xED.
  245|      0|        bits=1<<0xd;
  246|      0|        for(i=32; i<64; ++i) {  // Second half of 4k block.
  ------------------
  |  Branch (246:19): [True: 0, False: 0]
  ------------------
  247|      0|            bmpBlockBits[i]=(bmpBlockBits[i]&mask)|bits;
  248|      0|        }
  249|  1.77k|    } else {
  250|  1.77k|        mask= static_cast<uint32_t>(~(0x10001<<0xd));   // Lead byte 0xED.
  251|  58.5k|        for(i=32; i<64; ++i) {  // Second half of 4k block.
  ------------------
  |  Branch (251:19): [True: 56.7k, False: 1.77k]
  ------------------
  252|  56.7k|            bmpBlockBits[i]&=mask;
  253|  56.7k|        }
  254|  1.77k|    }
  255|  1.77k|}
_ZNK6icu_786BMPSet13findCodePointEiii:
  257|  6.31M|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|  6.31M|    if (c < list[lo])
  ------------------
  |  Branch (270:9): [True: 3.30M, False: 3.00M]
  ------------------
  271|  3.30M|        return lo;
  272|       |    // High runner test.  c is often after the last range, so an
  273|       |    // initial check for this condition pays off.
  274|  3.00M|    if (lo >= hi || c >= list[hi-1])
  ------------------
  |  Branch (274:9): [True: 0, False: 3.00M]
  |  Branch (274:21): [True: 919k, False: 2.08M]
  ------------------
  275|   919k|        return hi;
  276|       |    // invariant: c >= list[lo]
  277|       |    // invariant: c < list[hi]
  278|  8.87M|    for (;;) {
  279|  8.87M|        int32_t i = (lo + hi) >> 1;
  280|  8.87M|        if (i == lo) {
  ------------------
  |  Branch (280:13): [True: 2.08M, False: 6.78M]
  ------------------
  281|  2.08M|            break; // Found!
  282|  6.78M|        } else if (c < list[i]) {
  ------------------
  |  Branch (282:20): [True: 3.27M, False: 3.51M]
  ------------------
  283|  3.27M|            hi = i;
  284|  3.51M|        } else {
  285|  3.51M|            lo = i;
  286|  3.51M|        }
  287|  8.87M|    }
  288|  2.08M|    return hi;
  289|  3.00M|}
_ZNK6icu_786BMPSet8containsEi:
  292|  54.6M|BMPSet::contains(UChar32 c) const {
  293|  54.6M|    if (static_cast<uint32_t>(c) <= 0xff) {
  ------------------
  |  Branch (293:9): [True: 30.4M, False: 24.2M]
  ------------------
  294|  30.4M|        return latin1Contains[c];
  295|  30.4M|    } else if (static_cast<uint32_t>(c) <= 0x7ff) {
  ------------------
  |  Branch (295:16): [True: 121k, False: 24.1M]
  ------------------
  296|   121k|        return (table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0;
  297|  24.1M|    } else if (static_cast<uint32_t>(c) < 0xd800 || (c >= 0xe000 && c <= 0xffff)) {
  ------------------
  |  Branch (297:16): [True: 16.6M, False: 7.51M]
  |  Branch (297:54): [True: 4.36M, False: 3.14M]
  |  Branch (297:69): [True: 4.35M, False: 11.6k]
  ------------------
  298|  20.9M|        int lead=c>>12;
  299|  20.9M|        uint32_t twoBits=(bmpBlockBits[(c>>6)&0x3f]>>lead)&0x10001;
  300|  20.9M|        if(twoBits<=1) {
  ------------------
  |  Branch (300:12): [True: 17.8M, False: 3.12M]
  ------------------
  301|       |            // All 64 code points with the same bits 15..6
  302|       |            // are either in the set or not.
  303|  17.8M|            return twoBits;
  304|  17.8M|        } else {
  305|       |            // Look up the code point in its 4k block of code points.
  306|  3.12M|            return containsSlow(c, list4kStarts[lead], list4kStarts[lead+1]);
  307|  3.12M|        }
  308|  20.9M|    } else if (static_cast<uint32_t>(c) <= 0x10ffff) {
  ------------------
  |  Branch (308:16): [True: 3.15M, False: 487]
  ------------------
  309|       |        // surrogate or supplementary code point
  310|  3.15M|        return containsSlow(c, list4kStarts[0xd], list4kStarts[0x11]);
  311|  3.15M|    } else {
  312|       |        // Out-of-range code points get false, consistent with long-standing
  313|       |        // behavior of UnicodeSet::contains(c).
  314|    487|        return false;
  315|    487|    }
  316|  54.6M|}
_ZNK6icu_786BMPSet4spanEPKDsS2_17USetSpanCondition:
  323|      2|BMPSet::span(const char16_t *s, const char16_t *limit, USetSpanCondition spanCondition) const {
  324|      2|    char16_t c, c2;
  325|       |
  326|      2|    if(spanCondition) {
  ------------------
  |  Branch (326:8): [True: 2, False: 0]
  ------------------
  327|       |        // span
  328|      2|        do {
  329|      2|            c=*s;
  330|      2|            if(c<=0xff) {
  ------------------
  |  Branch (330:16): [True: 2, False: 0]
  ------------------
  331|      2|                if(!latin1Contains[c]) {
  ------------------
  |  Branch (331:20): [True: 2, False: 0]
  ------------------
  332|      2|                    break;
  333|      2|                }
  334|      2|            } else if(c<=0x7ff) {
  ------------------
  |  Branch (334:23): [True: 0, False: 0]
  ------------------
  335|      0|                if ((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) == 0) {
  ------------------
  |  Branch (335:21): [True: 0, False: 0]
  ------------------
  336|      0|                    break;
  337|      0|                }
  338|      0|            } else if(c<0xd800 || c>=0xe000) {
  ------------------
  |  Branch (338:23): [True: 0, False: 0]
  |  Branch (338:35): [True: 0, False: 0]
  ------------------
  339|      0|                int lead=c>>12;
  340|      0|                uint32_t twoBits=(bmpBlockBits[(c>>6)&0x3f]>>lead)&0x10001;
  341|      0|                if(twoBits<=1) {
  ------------------
  |  Branch (341:20): [True: 0, False: 0]
  ------------------
  342|       |                    // All 64 code points with the same bits 15..6
  343|       |                    // are either in the set or not.
  344|      0|                    if(twoBits==0) {
  ------------------
  |  Branch (344:24): [True: 0, False: 0]
  ------------------
  345|      0|                        break;
  346|      0|                    }
  347|      0|                } else {
  348|       |                    // Look up the code point in its 4k block of code points.
  349|      0|                    if(!containsSlow(c, list4kStarts[lead], list4kStarts[lead+1])) {
  ------------------
  |  Branch (349:24): [True: 0, False: 0]
  ------------------
  350|      0|                        break;
  351|      0|                    }
  352|      0|                }
  353|      0|            } else if(c>=0xdc00 || (s+1)==limit || (c2=s[1])<0xdc00 || c2>=0xe000) {
  ------------------
  |  Branch (353:23): [True: 0, False: 0]
  |  Branch (353:36): [True: 0, False: 0]
  |  Branch (353:52): [True: 0, False: 0]
  |  Branch (353:72): [True: 0, False: 0]
  ------------------
  354|       |                // surrogate code point
  355|      0|                if(!containsSlow(c, list4kStarts[0xd], list4kStarts[0xe])) {
  ------------------
  |  Branch (355:20): [True: 0, False: 0]
  ------------------
  356|      0|                    break;
  357|      0|                }
  358|      0|            } else {
  359|       |                // surrogate pair
  360|      0|                if(!containsSlow(U16_GET_SUPPLEMENTARY(c, c2), list4kStarts[0x10], list4kStarts[0x11])) {
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
  |  Branch (360:20): [True: 0, False: 0]
  ------------------
  361|      0|                    break;
  362|      0|                }
  363|      0|                ++s;
  364|      0|            }
  365|      2|        } while(++s<limit);
  ------------------
  |  Branch (365:17): [True: 0, False: 0]
  ------------------
  366|      2|    } else {
  367|       |        // span not
  368|      0|        do {
  369|      0|            c=*s;
  370|      0|            if(c<=0xff) {
  ------------------
  |  Branch (370:16): [True: 0, False: 0]
  ------------------
  371|      0|                if(latin1Contains[c]) {
  ------------------
  |  Branch (371:20): [True: 0, False: 0]
  ------------------
  372|      0|                    break;
  373|      0|                }
  374|      0|            } else if(c<=0x7ff) {
  ------------------
  |  Branch (374:23): [True: 0, False: 0]
  ------------------
  375|      0|                if ((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0) {
  ------------------
  |  Branch (375:21): [True: 0, False: 0]
  ------------------
  376|      0|                    break;
  377|      0|                }
  378|      0|            } else if(c<0xd800 || c>=0xe000) {
  ------------------
  |  Branch (378:23): [True: 0, False: 0]
  |  Branch (378:35): [True: 0, False: 0]
  ------------------
  379|      0|                int lead=c>>12;
  380|      0|                uint32_t twoBits=(bmpBlockBits[(c>>6)&0x3f]>>lead)&0x10001;
  381|      0|                if(twoBits<=1) {
  ------------------
  |  Branch (381:20): [True: 0, False: 0]
  ------------------
  382|       |                    // All 64 code points with the same bits 15..6
  383|       |                    // are either in the set or not.
  384|      0|                    if(twoBits!=0) {
  ------------------
  |  Branch (384:24): [True: 0, False: 0]
  ------------------
  385|      0|                        break;
  386|      0|                    }
  387|      0|                } else {
  388|       |                    // Look up the code point in its 4k block of code points.
  389|      0|                    if(containsSlow(c, list4kStarts[lead], list4kStarts[lead+1])) {
  ------------------
  |  Branch (389:24): [True: 0, False: 0]
  ------------------
  390|      0|                        break;
  391|      0|                    }
  392|      0|                }
  393|      0|            } else if(c>=0xdc00 || (s+1)==limit || (c2=s[1])<0xdc00 || c2>=0xe000) {
  ------------------
  |  Branch (393:23): [True: 0, False: 0]
  |  Branch (393:36): [True: 0, False: 0]
  |  Branch (393:52): [True: 0, False: 0]
  |  Branch (393:72): [True: 0, False: 0]
  ------------------
  394|       |                // surrogate code point
  395|      0|                if(containsSlow(c, list4kStarts[0xd], list4kStarts[0xe])) {
  ------------------
  |  Branch (395:20): [True: 0, False: 0]
  ------------------
  396|      0|                    break;
  397|      0|                }
  398|      0|            } else {
  399|       |                // surrogate pair
  400|      0|                if(containsSlow(U16_GET_SUPPLEMENTARY(c, c2), list4kStarts[0x10], list4kStarts[0x11])) {
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
  |  Branch (400:20): [True: 0, False: 0]
  ------------------
  401|      0|                    break;
  402|      0|                }
  403|      0|                ++s;
  404|      0|            }
  405|      0|        } while(++s<limit);
  ------------------
  |  Branch (405:17): [True: 0, False: 0]
  ------------------
  406|      0|    }
  407|      0|    return s;
  408|      2|}
_ZNK6icu_786BMPSet8spanBackEPKDsS2_17USetSpanCondition:
  412|      2|BMPSet::spanBack(const char16_t *s, const char16_t *limit, USetSpanCondition spanCondition) const {
  413|      2|    char16_t c, c2;
  414|       |
  415|      2|    if(spanCondition) {
  ------------------
  |  Branch (415:8): [True: 2, False: 0]
  ------------------
  416|       |        // span
  417|      2|        for(;;) {
  418|      2|            c=*(--limit);
  419|      2|            if(c<=0xff) {
  ------------------
  |  Branch (419:16): [True: 2, False: 0]
  ------------------
  420|      2|                if(!latin1Contains[c]) {
  ------------------
  |  Branch (420:20): [True: 2, False: 0]
  ------------------
  421|      2|                    break;
  422|      2|                }
  423|      2|            } else if(c<=0x7ff) {
  ------------------
  |  Branch (423:23): [True: 0, False: 0]
  ------------------
  424|      0|                if ((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) == 0) {
  ------------------
  |  Branch (424:21): [True: 0, False: 0]
  ------------------
  425|      0|                    break;
  426|      0|                }
  427|      0|            } else if(c<0xd800 || c>=0xe000) {
  ------------------
  |  Branch (427:23): [True: 0, False: 0]
  |  Branch (427:35): [True: 0, False: 0]
  ------------------
  428|      0|                int lead=c>>12;
  429|      0|                uint32_t twoBits=(bmpBlockBits[(c>>6)&0x3f]>>lead)&0x10001;
  430|      0|                if(twoBits<=1) {
  ------------------
  |  Branch (430:20): [True: 0, False: 0]
  ------------------
  431|       |                    // All 64 code points with the same bits 15..6
  432|       |                    // are either in the set or not.
  433|      0|                    if(twoBits==0) {
  ------------------
  |  Branch (433:24): [True: 0, False: 0]
  ------------------
  434|      0|                        break;
  435|      0|                    }
  436|      0|                } else {
  437|       |                    // Look up the code point in its 4k block of code points.
  438|      0|                    if(!containsSlow(c, list4kStarts[lead], list4kStarts[lead+1])) {
  ------------------
  |  Branch (438:24): [True: 0, False: 0]
  ------------------
  439|      0|                        break;
  440|      0|                    }
  441|      0|                }
  442|      0|            } else if(c<0xdc00 || s==limit || (c2=*(limit-1))<0xd800 || c2>=0xdc00) {
  ------------------
  |  Branch (442:23): [True: 0, False: 0]
  |  Branch (442:35): [True: 0, False: 0]
  |  Branch (442:47): [True: 0, False: 0]
  |  Branch (442:73): [True: 0, False: 0]
  ------------------
  443|       |                // surrogate code point
  444|      0|                if(!containsSlow(c, list4kStarts[0xd], list4kStarts[0xe])) {
  ------------------
  |  Branch (444:20): [True: 0, False: 0]
  ------------------
  445|      0|                    break;
  446|      0|                }
  447|      0|            } else {
  448|       |                // surrogate pair
  449|      0|                if(!containsSlow(U16_GET_SUPPLEMENTARY(c2, c), list4kStarts[0x10], list4kStarts[0x11])) {
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
  |  Branch (449:20): [True: 0, False: 0]
  ------------------
  450|      0|                    break;
  451|      0|                }
  452|      0|                --limit;
  453|      0|            }
  454|      0|            if(s==limit) {
  ------------------
  |  Branch (454:16): [True: 0, False: 0]
  ------------------
  455|      0|                return s;
  456|      0|            }
  457|      0|        }
  458|      2|    } else {
  459|       |        // span not
  460|      0|        for(;;) {
  461|      0|            c=*(--limit);
  462|      0|            if(c<=0xff) {
  ------------------
  |  Branch (462:16): [True: 0, False: 0]
  ------------------
  463|      0|                if(latin1Contains[c]) {
  ------------------
  |  Branch (463:20): [True: 0, False: 0]
  ------------------
  464|      0|                    break;
  465|      0|                }
  466|      0|            } else if(c<=0x7ff) {
  ------------------
  |  Branch (466:23): [True: 0, False: 0]
  ------------------
  467|      0|                if ((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0) {
  ------------------
  |  Branch (467:21): [True: 0, False: 0]
  ------------------
  468|      0|                    break;
  469|      0|                }
  470|      0|            } else if(c<0xd800 || c>=0xe000) {
  ------------------
  |  Branch (470:23): [True: 0, False: 0]
  |  Branch (470:35): [True: 0, False: 0]
  ------------------
  471|      0|                int lead=c>>12;
  472|      0|                uint32_t twoBits=(bmpBlockBits[(c>>6)&0x3f]>>lead)&0x10001;
  473|      0|                if(twoBits<=1) {
  ------------------
  |  Branch (473:20): [True: 0, False: 0]
  ------------------
  474|       |                    // All 64 code points with the same bits 15..6
  475|       |                    // are either in the set or not.
  476|      0|                    if(twoBits!=0) {
  ------------------
  |  Branch (476:24): [True: 0, False: 0]
  ------------------
  477|      0|                        break;
  478|      0|                    }
  479|      0|                } else {
  480|       |                    // Look up the code point in its 4k block of code points.
  481|      0|                    if(containsSlow(c, list4kStarts[lead], list4kStarts[lead+1])) {
  ------------------
  |  Branch (481:24): [True: 0, False: 0]
  ------------------
  482|      0|                        break;
  483|      0|                    }
  484|      0|                }
  485|      0|            } else if(c<0xdc00 || s==limit || (c2=*(limit-1))<0xd800 || c2>=0xdc00) {
  ------------------
  |  Branch (485:23): [True: 0, False: 0]
  |  Branch (485:35): [True: 0, False: 0]
  |  Branch (485:47): [True: 0, False: 0]
  |  Branch (485:73): [True: 0, False: 0]
  ------------------
  486|       |                // surrogate code point
  487|      0|                if(containsSlow(c, list4kStarts[0xd], list4kStarts[0xe])) {
  ------------------
  |  Branch (487:20): [True: 0, False: 0]
  ------------------
  488|      0|                    break;
  489|      0|                }
  490|      0|            } else {
  491|       |                // surrogate pair
  492|      0|                if(containsSlow(U16_GET_SUPPLEMENTARY(c2, c), list4kStarts[0x10], list4kStarts[0x11])) {
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
  |  Branch (492:20): [True: 0, False: 0]
  ------------------
  493|      0|                    break;
  494|      0|                }
  495|      0|                --limit;
  496|      0|            }
  497|      0|            if(s==limit) {
  ------------------
  |  Branch (497:16): [True: 0, False: 0]
  ------------------
  498|      0|                return s;
  499|      0|            }
  500|      0|        }
  501|      0|    }
  502|      2|    return limit+1;
  503|      2|}
_ZNK6icu_786BMPSet8spanUTF8EPKhi17USetSpanCondition:
  510|      2|BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanCondition) const {
  511|      2|    const uint8_t *limit=s+length;
  512|      2|    uint8_t b=*s;
  513|      2|    if(U8_IS_SINGLE(b)) {
  ------------------
  |  |  173|      2|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  514|       |        // Initial all-ASCII span.
  515|      2|        if(spanCondition) {
  ------------------
  |  Branch (515:12): [True: 2, False: 0]
  ------------------
  516|      2|            do {
  517|      2|                if(!latin1Contains[b] || ++s==limit) {
  ------------------
  |  Branch (517:20): [True: 2, False: 0]
  |  Branch (517:42): [True: 0, False: 0]
  ------------------
  518|      2|                    return s;
  519|      2|                }
  520|      0|                b=*s;
  521|      0|            } while(U8_IS_SINGLE(b));
  ------------------
  |  |  173|      0|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  522|      2|        } else {
  523|      0|            do {
  524|      0|                if(latin1Contains[b] || ++s==limit) {
  ------------------
  |  Branch (524:20): [True: 0, False: 0]
  |  Branch (524:41): [True: 0, False: 0]
  ------------------
  525|      0|                    return s;
  526|      0|                }
  527|      0|                b=*s;
  528|      0|            } while(U8_IS_SINGLE(b));
  ------------------
  |  |  173|      0|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  529|      0|        }
  530|      0|        length = static_cast<int32_t>(limit - s);
  531|      0|    }
  532|       |
  533|      0|    if(spanCondition!=USET_SPAN_NOT_CONTAINED) {
  ------------------
  |  Branch (533:8): [True: 0, False: 0]
  ------------------
  534|      0|        spanCondition=USET_SPAN_CONTAINED;  // Pin to 0/1 values.
  535|      0|    }
  536|       |
  537|      0|    const uint8_t *limit0=limit;
  538|       |
  539|       |    /*
  540|       |     * Make sure that the last 1/2/3/4-byte sequence before limit is complete
  541|       |     * or runs into a lead byte.
  542|       |     * In the span loop compare s with limit only once
  543|       |     * per multi-byte character.
  544|       |     *
  545|       |     * Give a trailing illegal sequence the same value as the result of contains(FFFD),
  546|       |     * including it if that is part of the span, otherwise set limit0 to before
  547|       |     * the truncated sequence.
  548|       |     */
  549|      0|    b=*(limit-1);
  550|      0|    if (static_cast<int8_t>(b) < 0) {
  ------------------
  |  Branch (550:9): [True: 0, False: 0]
  ------------------
  551|       |        // b>=0x80: lead or trail byte
  552|      0|        if(b<0xc0) {
  ------------------
  |  Branch (552:12): [True: 0, False: 0]
  ------------------
  553|       |            // single trail byte, check for preceding 3- or 4-byte lead byte
  554|      0|            if(length>=2 && (b=*(limit-2))>=0xe0) {
  ------------------
  |  Branch (554:16): [True: 0, False: 0]
  |  Branch (554:29): [True: 0, False: 0]
  ------------------
  555|      0|                limit-=2;
  556|      0|                if(containsFFFD!=spanCondition) {
  ------------------
  |  Branch (556:20): [True: 0, False: 0]
  ------------------
  557|      0|                    limit0=limit;
  558|      0|                }
  559|      0|            } else if(b<0xc0 && b>=0x80 && length>=3 && (b=*(limit-3))>=0xf0) {
  ------------------
  |  Branch (559:23): [True: 0, False: 0]
  |  Branch (559:33): [True: 0, False: 0]
  |  Branch (559:44): [True: 0, False: 0]
  |  Branch (559:57): [True: 0, False: 0]
  ------------------
  560|       |                // 4-byte lead byte with only two trail bytes
  561|      0|                limit-=3;
  562|      0|                if(containsFFFD!=spanCondition) {
  ------------------
  |  Branch (562:20): [True: 0, False: 0]
  ------------------
  563|      0|                    limit0=limit;
  564|      0|                }
  565|      0|            }
  566|      0|        } else {
  567|       |            // lead byte with no trail bytes
  568|      0|            --limit;
  569|      0|            if(containsFFFD!=spanCondition) {
  ------------------
  |  Branch (569:16): [True: 0, False: 0]
  ------------------
  570|      0|                limit0=limit;
  571|      0|            }
  572|      0|        }
  573|      0|    }
  574|       |
  575|      0|    uint8_t t1, t2, t3;
  576|       |
  577|      0|    while(s<limit) {
  ------------------
  |  Branch (577:11): [True: 0, False: 0]
  ------------------
  578|      0|        b=*s;
  579|      0|        if(U8_IS_SINGLE(b)) {
  ------------------
  |  |  173|      0|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  580|       |            // ASCII
  581|      0|            if(spanCondition) {
  ------------------
  |  Branch (581:16): [True: 0, False: 0]
  ------------------
  582|      0|                do {
  583|      0|                    if(!latin1Contains[b]) {
  ------------------
  |  Branch (583:24): [True: 0, False: 0]
  ------------------
  584|      0|                        return s;
  585|      0|                    } else if(++s==limit) {
  ------------------
  |  Branch (585:31): [True: 0, False: 0]
  ------------------
  586|      0|                        return limit0;
  587|      0|                    }
  588|      0|                    b=*s;
  589|      0|                } while(U8_IS_SINGLE(b));
  ------------------
  |  |  173|      0|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  590|      0|            } else {
  591|      0|                do {
  592|      0|                    if(latin1Contains[b]) {
  ------------------
  |  Branch (592:24): [True: 0, False: 0]
  ------------------
  593|      0|                        return s;
  594|      0|                    } else if(++s==limit) {
  ------------------
  |  Branch (594:31): [True: 0, False: 0]
  ------------------
  595|      0|                        return limit0;
  596|      0|                    }
  597|      0|                    b=*s;
  598|      0|                } while(U8_IS_SINGLE(b));
  ------------------
  |  |  173|      0|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  599|      0|            }
  600|      0|        }
  601|      0|        ++s;  // Advance past the lead byte.
  602|      0|        if(b>=0xe0) {
  ------------------
  |  Branch (602:12): [True: 0, False: 0]
  ------------------
  603|      0|            if(b<0xf0) {
  ------------------
  |  Branch (603:16): [True: 0, False: 0]
  ------------------
  604|      0|                if( /* handle U+0000..U+FFFF inline */
  605|      0|                    (t1 = static_cast<uint8_t>(s[0] - 0x80)) <= 0x3f &&
  ------------------
  |  Branch (605:21): [True: 0, False: 0]
  ------------------
  606|      0|                    (t2 = static_cast<uint8_t>(s[1] - 0x80)) <= 0x3f
  ------------------
  |  Branch (606:21): [True: 0, False: 0]
  ------------------
  607|      0|                ) {
  608|      0|                    b&=0xf;
  609|      0|                    uint32_t twoBits=(bmpBlockBits[t1]>>b)&0x10001;
  610|      0|                    if(twoBits<=1) {
  ------------------
  |  Branch (610:24): [True: 0, False: 0]
  ------------------
  611|       |                        // All 64 code points with this lead byte and middle trail byte
  612|       |                        // are either in the set or not.
  613|      0|                        if (twoBits != static_cast<uint32_t>(spanCondition)) {
  ------------------
  |  Branch (613:29): [True: 0, False: 0]
  ------------------
  614|      0|                            return s-1;
  615|      0|                        }
  616|      0|                    } else {
  617|       |                        // Look up the code point in its 4k block of code points.
  618|      0|                        UChar32 c=(b<<12)|(t1<<6)|t2;
  619|      0|                        if(containsSlow(c, list4kStarts[b], list4kStarts[b+1]) != spanCondition) {
  ------------------
  |  Branch (619:28): [True: 0, False: 0]
  ------------------
  620|      0|                            return s-1;
  621|      0|                        }
  622|      0|                    }
  623|      0|                    s+=2;
  624|      0|                    continue;
  625|      0|                }
  626|      0|            } else if( /* handle U+10000..U+10FFFF inline */
  627|      0|                (t1 = static_cast<uint8_t>(s[0] - 0x80)) <= 0x3f &&
  ------------------
  |  Branch (627:17): [True: 0, False: 0]
  ------------------
  628|      0|                (t2 = static_cast<uint8_t>(s[1] - 0x80)) <= 0x3f &&
  ------------------
  |  Branch (628:17): [True: 0, False: 0]
  ------------------
  629|      0|                (t3 = static_cast<uint8_t>(s[2] - 0x80)) <= 0x3f
  ------------------
  |  Branch (629:17): [True: 0, False: 0]
  ------------------
  630|      0|            ) {
  631|       |                // Give an illegal sequence the same value as the result of contains(FFFD).
  632|      0|                UChar32 c = (static_cast<UChar32>(b - 0xf0) << 18) | (static_cast<UChar32>(t1) << 12) | (t2 << 6) | t3;
  633|      0|                if( (   (0x10000<=c && c<=0x10ffff) ?
  ------------------
  |  Branch (633:21): [True: 0, False: 0]
  |  Branch (633:26): [True: 0, False: 0]
  |  Branch (633:40): [True: 0, False: 0]
  ------------------
  634|      0|                            containsSlow(c, list4kStarts[0x10], list4kStarts[0x11]) :
  635|      0|                            containsFFFD
  636|      0|                    ) != spanCondition
  637|      0|                ) {
  638|      0|                    return s-1;
  639|      0|                }
  640|      0|                s+=3;
  641|      0|                continue;
  642|      0|            }
  643|      0|        } else {
  644|      0|            if( /* handle U+0000..U+07FF inline */
  645|      0|                b>=0xc0 &&
  ------------------
  |  Branch (645:17): [True: 0, False: 0]
  ------------------
  646|      0|                (t1 = static_cast<uint8_t>(*s - 0x80)) <= 0x3f
  ------------------
  |  Branch (646:17): [True: 0, False: 0]
  ------------------
  647|      0|            ) {
  648|      0|                if (static_cast<USetSpanCondition>((table7FF[t1] & (static_cast<uint32_t>(1) << (b & 0x1f))) != 0) != spanCondition) {
  ------------------
  |  Branch (648:21): [True: 0, False: 0]
  ------------------
  649|      0|                    return s-1;
  650|      0|                }
  651|      0|                ++s;
  652|      0|                continue;
  653|      0|            }
  654|      0|        }
  655|       |
  656|       |        // Give an illegal sequence the same value as the result of contains(FFFD).
  657|       |        // Handle each byte of an illegal sequence separately to simplify the code;
  658|       |        // no need to optimize error handling.
  659|      0|        if(containsFFFD!=spanCondition) {
  ------------------
  |  Branch (659:12): [True: 0, False: 0]
  ------------------
  660|      0|            return s-1;
  661|      0|        }
  662|      0|    }
  663|       |
  664|      0|    return limit0;
  665|      0|}
_ZNK6icu_786BMPSet12spanBackUTF8EPKhi17USetSpanCondition:
  675|      2|BMPSet::spanBackUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanCondition) const {
  676|      2|    if(spanCondition!=USET_SPAN_NOT_CONTAINED) {
  ------------------
  |  Branch (676:8): [True: 2, False: 0]
  ------------------
  677|      2|        spanCondition=USET_SPAN_CONTAINED;  // Pin to 0/1 values.
  678|      2|    }
  679|       |
  680|      2|    uint8_t b;
  681|       |
  682|      2|    do {
  683|      2|        b=s[--length];
  684|      2|        if(U8_IS_SINGLE(b)) {
  ------------------
  |  |  173|      2|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  685|       |            // ASCII sub-span
  686|      2|            if(spanCondition) {
  ------------------
  |  Branch (686:16): [True: 2, False: 0]
  ------------------
  687|      2|                do {
  688|      2|                    if(!latin1Contains[b]) {
  ------------------
  |  Branch (688:24): [True: 2, False: 0]
  ------------------
  689|      2|                        return length+1;
  690|      2|                    } else if(length==0) {
  ------------------
  |  Branch (690:31): [True: 0, False: 0]
  ------------------
  691|      0|                        return 0;
  692|      0|                    }
  693|      0|                    b=s[--length];
  694|      0|                } while(U8_IS_SINGLE(b));
  ------------------
  |  |  173|      0|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  695|      2|            } else {
  696|      0|                do {
  697|      0|                    if(latin1Contains[b]) {
  ------------------
  |  Branch (697:24): [True: 0, False: 0]
  ------------------
  698|      0|                        return length+1;
  699|      0|                    } else if(length==0) {
  ------------------
  |  Branch (699:31): [True: 0, False: 0]
  ------------------
  700|      0|                        return 0;
  701|      0|                    }
  702|      0|                    b=s[--length];
  703|      0|                } while(U8_IS_SINGLE(b));
  ------------------
  |  |  173|      0|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (173:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  704|      0|            }
  705|      2|        }
  706|       |
  707|      0|        int32_t prev=length;
  708|      0|        UChar32 c;
  709|       |        // trail byte: collect a multi-byte character
  710|       |        // (or  lead byte in last-trail position)
  711|      0|        c=utf8_prevCharSafeBody(s, 0, &length, b, -3);
  ------------------
  |  | 1921|      0|#define utf8_prevCharSafeBody U_ICU_ENTRY_POINT_RENAME(utf8_prevCharSafeBody)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  712|       |        // c is a valid code point, not ASCII, not a surrogate
  713|      0|        if(c<=0x7ff) {
  ------------------
  |  Branch (713:12): [True: 0, False: 0]
  ------------------
  714|      0|            if (static_cast<USetSpanCondition>((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0) != spanCondition) {
  ------------------
  |  Branch (714:17): [True: 0, False: 0]
  ------------------
  715|      0|                return prev+1;
  716|      0|            }
  717|      0|        } else if(c<=0xffff) {
  ------------------
  |  Branch (717:19): [True: 0, False: 0]
  ------------------
  718|      0|            int lead=c>>12;
  719|      0|            uint32_t twoBits=(bmpBlockBits[(c>>6)&0x3f]>>lead)&0x10001;
  720|      0|            if(twoBits<=1) {
  ------------------
  |  Branch (720:16): [True: 0, False: 0]
  ------------------
  721|       |                // All 64 code points with the same bits 15..6
  722|       |                // are either in the set or not.
  723|      0|                if (twoBits != static_cast<uint32_t>(spanCondition)) {
  ------------------
  |  Branch (723:21): [True: 0, False: 0]
  ------------------
  724|      0|                    return prev+1;
  725|      0|                }
  726|      0|            } else {
  727|       |                // Look up the code point in its 4k block of code points.
  728|      0|                if(containsSlow(c, list4kStarts[lead], list4kStarts[lead+1]) != spanCondition) {
  ------------------
  |  Branch (728:20): [True: 0, False: 0]
  ------------------
  729|      0|                    return prev+1;
  730|      0|                }
  731|      0|            }
  732|      0|        } else {
  733|      0|            if(containsSlow(c, list4kStarts[0x10], list4kStarts[0x11]) != spanCondition) {
  ------------------
  |  Branch (733:16): [True: 0, False: 0]
  ------------------
  734|      0|                return prev+1;
  735|      0|            }
  736|      0|        }
  737|      0|    } while(length>0);
  ------------------
  |  Branch (737:13): [True: 0, False: 0]
  ------------------
  738|      0|    return 0;
  739|      2|}
bmpset.cpp:_ZN6icu_78L12set32x64BitsEPjii:
   70|  3.53k|static void set32x64Bits(uint32_t table[64], int32_t start, int32_t limit) {
   71|  3.53k|    U_ASSERT(start<limit);
  ------------------
  |  |   35|  3.53k|#   define U_ASSERT(exp) (void)0
  ------------------
   72|  3.53k|    U_ASSERT(limit<=0x800);
  ------------------
  |  |   35|  3.53k|#   define U_ASSERT(exp) (void)0
  ------------------
   73|       |
   74|  3.53k|    int32_t lead=start>>6;  // Named for UTF-8 2-byte lead byte with upper 5 bits.
   75|  3.53k|    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|  3.53k|    uint32_t bits = static_cast<uint32_t>(1) << lead;
   79|  3.53k|    if((start+1)==limit) {  // Single-character shortcut.
  ------------------
  |  Branch (79:8): [True: 2.65k, False: 886]
  ------------------
   80|  2.65k|        table[trail]|=bits;
   81|  2.65k|        return;
   82|  2.65k|    }
   83|       |
   84|    886|    int32_t limitLead=limit>>6;
   85|    886|    int32_t limitTrail=limit&0x3f;
   86|       |
   87|    886|    if(lead==limitLead) {
  ------------------
  |  Branch (87:8): [True: 886, False: 0]
  ------------------
   88|       |        // Partial vertical bit column.
   89|  2.73k|        while(trail<limitTrail) {
  ------------------
  |  Branch (89:15): [True: 1.84k, False: 886]
  ------------------
   90|  1.84k|            table[trail++]|=bits;
   91|  1.84k|        }
   92|    886|    } else {
   93|       |        // Partial vertical bit column,
   94|       |        // followed by a bit rectangle,
   95|       |        // followed by another partial vertical bit column.
   96|      0|        if(trail>0) {
  ------------------
  |  Branch (96:12): [True: 0, False: 0]
  ------------------
   97|      0|            do {
   98|      0|                table[trail++]|=bits;
   99|      0|            } while(trail<64);
  ------------------
  |  Branch (99:21): [True: 0, False: 0]
  ------------------
  100|      0|            ++lead;
  101|      0|        }
  102|      0|        if(lead<limitLead) {
  ------------------
  |  Branch (102:12): [True: 0, False: 0]
  ------------------
  103|      0|            bits = ~((static_cast<unsigned>(1) << lead) - 1);
  104|      0|            if(limitLead<0x20) {
  ------------------
  |  Branch (104:16): [True: 0, False: 0]
  ------------------
  105|      0|                bits &= (static_cast<unsigned>(1) << limitLead) - 1;
  106|      0|            }
  107|      0|            for(trail=0; trail<64; ++trail) {
  ------------------
  |  Branch (107:26): [True: 0, False: 0]
  ------------------
  108|      0|                table[trail]|=bits;
  109|      0|            }
  110|      0|        }
  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|      0|        bits = static_cast<uint32_t>(1) << ((limitLead == 0x20) ? (limitLead - 1) : limitLead);
  ------------------
  |  Branch (114:45): [True: 0, False: 0]
  ------------------
  115|      0|        for(trail=0; trail<limitTrail; ++trail) {
  ------------------
  |  Branch (115:22): [True: 0, False: 0]
  ------------------
  116|      0|            table[trail]|=bits;
  117|      0|        }
  118|      0|    }
  119|    886|}

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

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

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

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

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

_ZN6icu_7819CharacterProperties24getInclusionsForPropertyE9UPropertyR10UErrorCode:
  267|      4|        UProperty prop, UErrorCode &errorCode) {
  268|      4|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (268:9): [True: 0, False: 4]
  ------------------
  269|      4|    if (UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT) {
  ------------------
  |  Branch (269:9): [True: 2, False: 2]
  |  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|      4|    } else {
  275|      4|        UPropertySource src = uprops_getSource(prop);
  ------------------
  |  | 1392|      4|#define uprops_getSource U_ICU_ENTRY_POINT_RENAME(uprops_getSource)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  276|      4|        return getInclusionsForSource(src, errorCode);
  277|      4|    }
  278|      4|}
_ZN6icu_7819CharacterProperties20getBinaryPropertySetE9UPropertyR10UErrorCode:
  394|      3|const UnicodeSet *CharacterProperties::getBinaryPropertySet(UProperty property, UErrorCode &errorCode) {
  395|      3|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (395:9): [True: 0, False: 3]
  ------------------
  396|      3|    if (property < 0 || UCHAR_BINARY_LIMIT <= property) {
  ------------------
  |  Branch (396:9): [True: 0, False: 3]
  |  Branch (396:25): [True: 0, False: 3]
  ------------------
  397|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  398|      0|        return nullptr;
  399|      0|    }
  400|      3|    Mutex m(&cpMutex);
  401|      3|    UnicodeSet *set = sets[property];
  402|      3|    if (set == nullptr) {
  ------------------
  |  Branch (402:9): [True: 2, False: 1]
  ------------------
  403|      2|        sets[property] = set = makeSet(property, errorCode);
  404|      2|    }
  405|      3|    return set;
  406|      3|}
u_getBinaryPropertySet_78:
  413|      3|u_getBinaryPropertySet(UProperty property, UErrorCode *pErrorCode) {
  414|      3|    const UnicodeSet *set = CharacterProperties::getBinaryPropertySet(property, *pErrorCode);
  415|      3|    return U_SUCCESS(*pErrorCode) ? set->toUSet() : nullptr;
  ------------------
  |  Branch (415:12): [True: 3, False: 0]
  ------------------
  416|      3|}
characterproperties.cpp:_ZN12_GLOBAL__N_122getInclusionsForSourceE15UPropertySourceR10UErrorCode:
  211|      4|const UnicodeSet *getInclusionsForSource(UPropertySource src, UErrorCode &errorCode) {
  212|      4|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (212:9): [True: 0, False: 4]
  ------------------
  213|      4|    if (src < 0 || UPROPS_SRC_COUNT <= src) {
  ------------------
  |  Branch (213:9): [True: 0, False: 4]
  |  Branch (213:20): [True: 0, False: 4]
  ------------------
  214|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
  215|      0|        return nullptr;
  216|      0|    }
  217|      4|    Inclusion &i = gInclusions[src];
  218|      4|    umtx_initOnce(i.fInitOnce, &initInclusion, src, errorCode);
  219|      4|    return i.fSet;
  220|      4|}
characterproperties.cpp:_ZN12_GLOBAL__N_113initInclusionE15UPropertySourceR10UErrorCode:
   91|      3|void U_CALLCONV initInclusion(UPropertySource src, UErrorCode &errorCode) {
   92|       |    // This function is invoked only via umtx_initOnce().
   93|      3|    U_ASSERT(0 <= src && src < UPROPS_SRC_COUNT);
  ------------------
  |  |   35|      3|#   define U_ASSERT(exp) (void)0
  ------------------
   94|      3|    if (src == UPROPS_SRC_NONE) {
  ------------------
  |  Branch (94:9): [True: 0, False: 3]
  ------------------
   95|      0|        errorCode = U_INTERNAL_PROGRAM_ERROR;
   96|      0|        return;
   97|      0|    }
   98|      3|    U_ASSERT(gInclusions[src].fSet == nullptr);
  ------------------
  |  |   35|      3|#   define U_ASSERT(exp) (void)0
  ------------------
   99|       |
  100|      3|    LocalPointer<UnicodeSet> incl(new UnicodeSet());
  101|      3|    if (incl.isNull()) {
  ------------------
  |  Branch (101:9): [True: 0, False: 3]
  ------------------
  102|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
  103|      0|        return;
  104|      0|    }
  105|      3|    USetAdder sa = {
  106|      3|        reinterpret_cast<USet*>(incl.getAlias()),
  107|      3|        _set_add,
  108|      3|        _set_addRange,
  109|      3|        _set_addString,
  110|      3|        nullptr, // don't need remove()
  111|      3|        nullptr // don't need removeRange()
  112|      3|    };
  113|       |
  114|      3|    switch(src) {
  115|      1|    case UPROPS_SRC_CHAR:
  ------------------
  |  Branch (115:5): [True: 1, False: 2]
  ------------------
  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|      1|    case UPROPS_SRC_PROPSVEC:
  ------------------
  |  Branch (118:5): [True: 1, False: 2]
  ------------------
  119|      1|        upropsvec_addPropertyStarts(&sa, &errorCode);
  ------------------
  |  | 1393|      1|#define upropsvec_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(upropsvec_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  120|      1|        break;
  121|      0|    case UPROPS_SRC_CHAR_AND_PROPSVEC:
  ------------------
  |  Branch (121:5): [True: 0, False: 3]
  ------------------
  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: 3]
  ------------------
  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: 3]
  ------------------
  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: 3]
  ------------------
  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: 3]
  ------------------
  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: 3]
  ------------------
  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: 3]
  ------------------
  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|      1|    case UPROPS_SRC_BIDI:
  ------------------
  |  Branch (166:5): [True: 1, False: 2]
  ------------------
  167|      1|        ubidi_addPropertyStarts(&sa, &errorCode);
  ------------------
  |  |  435|      1|#define ubidi_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(ubidi_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|      1|        break;
  169|      0|    case UPROPS_SRC_INPC:
  ------------------
  |  Branch (169:5): [True: 0, False: 3]
  ------------------
  170|      0|    case UPROPS_SRC_INSC:
  ------------------
  |  Branch (170:5): [True: 0, False: 3]
  ------------------
  171|      0|    case UPROPS_SRC_VO:
  ------------------
  |  Branch (171:5): [True: 0, False: 3]
  ------------------
  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: 3]
  ------------------
  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: 3]
  ------------------
  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: 3]
  ------------------
  187|      0|    case UPROPS_SRC_MCM:
  ------------------
  |  Branch (187:5): [True: 0, False: 3]
  ------------------
  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: 3]
  ------------------
  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: 3]
  ------------------
  194|      0|        errorCode = U_INTERNAL_PROGRAM_ERROR;
  195|      0|        break;
  196|      3|    }
  197|       |
  198|      3|    if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (198:9): [True: 0, False: 3]
  ------------------
  199|      0|        return;
  200|      0|    }
  201|      3|    if (incl->isBogus()) {
  ------------------
  |  Branch (201:9): [True: 0, False: 3]
  ------------------
  202|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
  203|      0|        return;
  204|      0|    }
  205|       |    // Compact for caching.
  206|      3|    incl->compact();
  207|      3|    gInclusions[src].fSet = incl.orphan();
  208|      3|    ucln_common_registerCleanup(UCLN_COMMON_CHARACTERPROPERTIES, characterproperties_cleanup);
  ------------------
  |  |  617|      3|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  209|      3|}
characterproperties.cpp:_ZN12_GLOBAL__N_18_set_addEP4USeti:
   60|  15.3k|_set_add(USet *set, UChar32 c) {
   61|  15.3k|    reinterpret_cast<UnicodeSet*>(set)->add(c);
   62|  15.3k|}
characterproperties.cpp:_ZN12_GLOBAL__N_113_set_addRangeEP4USetii:
   65|     40|_set_addRange(USet *set, UChar32 start, UChar32 end) {
   66|     40|    reinterpret_cast<UnicodeSet*>(set)->add(start, end);
   67|     40|}
characterproperties.cpp:_ZN12_GLOBAL__N_17makeSetE9UPropertyR10UErrorCode:
  284|      2|UnicodeSet *makeSet(UProperty property, UErrorCode &errorCode) {
  285|      2|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (285:9): [True: 0, False: 2]
  ------------------
  286|      2|    LocalPointer<UnicodeSet> set(new UnicodeSet());
  287|      2|    if (set.isNull()) {
  ------------------
  |  Branch (287:9): [True: 0, False: 2]
  ------------------
  288|      0|        errorCode = U_MEMORY_ALLOCATION_ERROR;
  289|      0|        return nullptr;
  290|      0|    }
  291|      2|    if (UCHAR_BASIC_EMOJI <= property && property <= UCHAR_RGI_EMOJI) {
  ------------------
  |  Branch (291:9): [True: 0, False: 2]
  |  Branch (291:42): [True: 0, False: 0]
  ------------------
  292|       |        // property of strings
  293|      0|        const icu::EmojiProps *ep = icu::EmojiProps::getSingleton(errorCode);
  294|      0|        if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (294:13): [True: 0, False: 0]
  ------------------
  295|      0|        USetAdder sa = {
  296|      0|            reinterpret_cast<USet*>(set.getAlias()),
  297|      0|            _set_add,
  298|      0|            _set_addRange,
  299|      0|            _set_addString,
  300|      0|            nullptr, // don't need remove()
  301|      0|            nullptr // don't need removeRange()
  302|      0|        };
  303|      0|        ep->addStrings(&sa, property, errorCode);
  304|      0|        if (property != UCHAR_BASIC_EMOJI && property != UCHAR_RGI_EMOJI) {
  ------------------
  |  Branch (304:13): [True: 0, False: 0]
  |  Branch (304:46): [True: 0, False: 0]
  ------------------
  305|       |            // property of _only_ strings
  306|      0|            set->freeze();
  307|      0|            return set.orphan();
  308|      0|        }
  309|      0|    }
  310|       |
  311|      2|    const UnicodeSet *inclusions =
  312|      2|        icu::CharacterProperties::getInclusionsForProperty(property, errorCode);
  313|      2|    if (U_FAILURE(errorCode)) { return nullptr; }
  ------------------
  |  Branch (313:9): [True: 0, False: 2]
  ------------------
  314|      2|    int32_t numRanges = inclusions->getRangeCount();
  315|      2|    UChar32 startHasProperty = -1;
  316|       |
  317|  4.14k|    for (int32_t i = 0; i < numRanges; ++i) {
  ------------------
  |  Branch (317:25): [True: 4.14k, False: 2]
  ------------------
  318|  4.14k|        UChar32 rangeEnd = inclusions->getRangeEnd(i);
  319|  13.4k|        for (UChar32 c = inclusions->getRangeStart(i); c <= rangeEnd; ++c) {
  ------------------
  |  Branch (319:56): [True: 9.25k, False: 4.14k]
  ------------------
  320|       |            // TODO: Get a UCharacterProperty.BinaryProperty to avoid the property dispatch.
  321|  9.25k|            if (u_hasBinaryProperty(c, property)) {
  ------------------
  |  |  292|  9.25k|#define u_hasBinaryProperty U_ICU_ENTRY_POINT_RENAME(u_hasBinaryProperty)
  |  |  ------------------
  |  |  |  |  123|  9.25k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.25k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.25k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (321:17): [True: 16, False: 9.23k]
  ------------------
  322|     16|                if (startHasProperty < 0) {
  ------------------
  |  Branch (322:21): [True: 8, False: 8]
  ------------------
  323|       |                    // Transition from false to true.
  324|      8|                    startHasProperty = c;
  325|      8|                }
  326|  9.23k|            } else if (startHasProperty >= 0) {
  ------------------
  |  Branch (326:24): [True: 8, False: 9.23k]
  ------------------
  327|       |                // Transition from true to false.
  328|      8|                set->add(startHasProperty, c - 1);
  329|      8|                startHasProperty = -1;
  330|      8|            }
  331|  9.25k|        }
  332|  4.14k|    }
  333|      2|    if (startHasProperty >= 0) {
  ------------------
  |  Branch (333:9): [True: 0, False: 2]
  ------------------
  334|      0|        set->add(startHasProperty, 0x10FFFF);
  335|      0|    }
  336|      2|    set->freeze();
  337|      2|    return set.orphan();
  338|      2|}

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

_ZN6icu_7810CharStringC2Ev:
   43|  29.9M|    CharString() : len(0) { buffer[0]=0; }
_ZN6icu_7810CharStringC2ENS_11StringPieceER10UErrorCode:
   44|  1.82M|    CharString(StringPiece s, UErrorCode &errorCode) : len(0) {
   45|  1.82M|        buffer[0]=0;
   46|  1.82M|        append(s, errorCode);
   47|  1.82M|    }
_ZN6icu_7810CharStringC2ERKS0_R10UErrorCode:
   48|   498k|    CharString(const CharString &s, UErrorCode &errorCode) : len(0) {
   49|   498k|        buffer[0]=0;
   50|   498k|        append(s, errorCode);
   51|   498k|    }
_ZN6icu_7810CharStringC2EPKciR10UErrorCode:
   52|  56.9k|    CharString(const char *s, int32_t sLength, UErrorCode &errorCode) : len(0) {
   53|  56.9k|        buffer[0]=0;
   54|  56.9k|        append(s, sLength, errorCode);
   55|  56.9k|    }
_ZN6icu_7810CharStringD2Ev:
   56|  33.0M|    ~CharString() {}
_ZNK6icu_7810CharString7isEmptyEv:
   79|  16.8M|    UBool isEmpty() const { return len==0; }
_ZNK6icu_7810CharString6lengthEv:
   80|  13.0M|    int32_t length() const { return len; }
_ZNK6icu_7810CharStringixEi:
   81|  9.28k|    char operator[](int32_t index) const { return buffer[index]; }
_ZNK6icu_7810CharString4dataEv:
   84|  10.0M|    const char *data() const { return buffer.getAlias(); }
_ZN6icu_7810CharString4dataEv:
   85|  12.2M|    char *data() { return buffer.getAlias(); }
_ZNK6icu_7810CharStringeqERKS0_:
  108|   696k|    bool operator==(const CharString& other) const {
  109|   696k|        return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0);
  ------------------
  |  |  101|   696k|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|   696k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (109:16): [True: 696k, False: 0]
  |  Branch (109:42): [True: 0, False: 696k]
  |  Branch (109:54): [True: 654k, False: 41.8k]
  ------------------
  110|   696k|    }
_ZNK6icu_7810CharStringeqENS_11StringPieceE:
  115|  8.86k|    bool operator==(StringPiece other) const {
  116|  8.86k|        return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0);
  ------------------
  |  |  101|    441|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|    441|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (116:16): [True: 441, False: 8.41k]
  |  Branch (116:42): [True: 0, False: 441]
  |  Branch (116:54): [True: 0, False: 441]
  ------------------
  117|  8.86k|    }
_ZN6icu_7810CharString5clearEv:
  127|  2.66M|    CharString &clear() { len=0; buffer[0]=0; return *this; }
_ZN6icu_7810CharString6appendENS_11StringPieceER10UErrorCode:
  131|  8.53M|    CharString &append(StringPiece s, UErrorCode &errorCode) {
  132|  8.53M|        return append(s.data(), s.length(), errorCode);
  133|  8.53M|    }
_ZN6icu_7810CharString6appendERKS0_R10UErrorCode:
  134|  6.78M|    CharString &append(const CharString &s, UErrorCode &errorCode) {
  135|  6.78M|        return append(s.data(), s.length(), errorCode);
  136|  6.78M|    }

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

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

_ZN6icu_7815MaybeStackArrayIcLi40EEC2Ev:
  344|  32.3M|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayIcLi40EED2Ev:
  363|  33.0M|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIcLi40EEC2EOS1_:
  479|   701k|        : ptr(src.ptr), capacity(src.capacity), needToRelease(src.needToRelease) {
  480|   701k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (480:9): [True: 701k, False: 0]
  ------------------
  481|   701k|        ptr = stackArray;
  482|   701k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|   701k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   701k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   701k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   701k|    _Pragma("clang diagnostic push") \
  |  |   45|   701k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   701k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   701k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   701k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   701k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   701k|    _Pragma("clang diagnostic pop") \
  |  |   49|   701k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   701k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   701k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   701k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  483|   701k|    } else {
  484|      0|        src.resetToStackArray();  // take ownership away from src
  485|      0|    }
  486|   701k|}
_ZN6icu_7815MaybeStackArrayIcLi40EEaSEOS1_:
  490|   428k|MaybeStackArray<T, stackCapacity>::operator=(MaybeStackArray <T, stackCapacity>&& src) noexcept {
  491|   428k|    releaseArray();  // in case this instance had its own memory allocated
  492|   428k|    capacity = src.capacity;
  493|   428k|    needToRelease = src.needToRelease;
  494|   428k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (494:9): [True: 428k, False: 0]
  ------------------
  495|   428k|        ptr = stackArray;
  496|   428k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|   428k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   428k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   428k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   428k|    _Pragma("clang diagnostic push") \
  |  |   45|   428k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   428k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   428k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   428k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   428k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   428k|    _Pragma("clang diagnostic pop") \
  |  |   49|   428k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   428k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   428k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   428k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  497|   428k|    } else {
  498|      0|        ptr = src.ptr;
  499|      0|        src.resetToStackArray();  // take ownership away from src
  500|      0|    }
  501|   428k|    return *this;
  502|   428k|}
_ZNK6icu_7815MaybeStackArrayIcLi40EE11getCapacityEv:
  376|  43.0M|    int32_t getCapacity() const { return capacity; }
_ZNK6icu_7815MaybeStackArrayIcLi40EE8getAliasEv:
  381|   103M|    T *getAlias() const { return ptr; }
_ZNK6icu_7815MaybeStackArrayIcLi40EEixEl:
  395|  9.28k|    const T &operator[](ptrdiff_t i) const { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIcLi40EEixEl:
  402|  75.9M|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIcLi40EE6resizeEii:
  505|  91.4k|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|  91.4k|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 91.4k, 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|  91.4k|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|  91.4k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  91.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  91.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  91.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|  91.4k|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 91.4k, False: 0]
  ------------------
  512|  91.4k|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 91.4k, False: 0]
  ------------------
  513|  91.4k|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 91.4k]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|  91.4k|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 91.4k]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|  91.4k|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|  91.4k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  91.4k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  91.4k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  91.4k|    _Pragma("clang diagnostic push") \
  |  |   45|  91.4k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  91.4k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  91.4k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  91.4k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  91.4k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  91.4k|    _Pragma("clang diagnostic pop") \
  |  |   49|  91.4k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  91.4k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  91.4k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  91.4k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|  91.4k|            }
  521|  91.4k|            releaseArray();
  522|  91.4k|            ptr=p;
  523|  91.4k|            capacity=newCapacity;
  524|  91.4k|            needToRelease=true;
  525|  91.4k|        }
  526|  91.4k|        return p;
  527|  91.4k|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|  91.4k|}
_ZN6icu_7815MaybeStackArrayIcLi40EE12releaseArrayEv:
  458|  33.5M|    void releaseArray() {
  459|  33.5M|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 91.4k, False: 33.4M]
  ------------------
  460|  91.4k|            uprv_free(ptr);
  ------------------
  |  | 1503|  91.4k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  91.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  91.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  91.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|  91.4k|        }
  462|  33.5M|    }
_ZN6icu_7810MemoryPoolINS_14SingleUnitImplELi8EED2Ev:
  762|  6.79k|    ~MemoryPool() {
  763|  6.79k|        for (int32_t i = 0; i < fCount; ++i) {
  ------------------
  |  Branch (763:29): [True: 0, False: 6.79k]
  ------------------
  764|      0|            delete fPool[i];
  765|      0|        }
  766|  6.79k|    }
_ZN6icu_7815MaybeStackArrayIPNS_14SingleUnitImplELi8EED2Ev:
  363|  6.79k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIPNS_14SingleUnitImplELi8EE12releaseArrayEv:
  458|  6.79k|    void releaseArray() {
  459|  6.79k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 0, False: 6.79k]
  ------------------
  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|  6.79k|    }
_ZN6icu_7810MemoryPoolINS_14SingleUnitImplELi8EEC2Ev:
  760|  6.79k|    MemoryPool() : fCount(0), fPool() {}
_ZN6icu_7815MaybeStackArrayIPNS_14SingleUnitImplELi8EEC2Ev:
  344|  6.79k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZNK6icu_7816MaybeStackVectorINS_14SingleUnitImplELi8EE6lengthEv:
  863|  5.12k|    int32_t length() const {
  864|  5.12k|        return this->fCount;
  865|  5.12k|    }
_ZN6icu_7810MemoryPoolINS_8numparse4impl16CodePointMatcherELi8EEaSEOS4_:
  776|   102k|    MemoryPool& operator=(MemoryPool&& other) noexcept {
  777|       |        // Since `this` may contain instances that need to be deleted, we can't
  778|       |        // just throw them away and replace them with `other`. The normal way of
  779|       |        // dealing with this in C++ is to swap `this` and `other`, rather than
  780|       |        // simply overwrite: the destruction of `other` can then take care of
  781|       |        // running MemoryPool::~MemoryPool() over the still-to-be-deallocated
  782|       |        // instances.
  783|   102k|        std::swap(fCount, other.fCount);
  784|   102k|        std::swap(fPool, other.fPool);
  785|   102k|        return *this;
  786|   102k|    }
_ZN6icu_7815MaybeStackArrayIPNS_8numparse4impl16CodePointMatcherELi8EEC2EOS5_:
  479|   102k|        : ptr(src.ptr), capacity(src.capacity), needToRelease(src.needToRelease) {
  480|   102k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (480:9): [True: 102k, False: 0]
  ------------------
  481|   102k|        ptr = stackArray;
  482|   102k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|   102k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   102k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   102k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   102k|    _Pragma("clang diagnostic push") \
  |  |   45|   102k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   102k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   102k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   102k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   102k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   102k|    _Pragma("clang diagnostic pop") \
  |  |   49|   102k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   102k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   102k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   102k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  483|   102k|    } else {
  484|      0|        src.resetToStackArray();  // take ownership away from src
  485|      0|    }
  486|   102k|}
_ZN6icu_7815MaybeStackArrayIPNS_8numparse4impl16CodePointMatcherELi8EEaSEOS5_:
  490|   205k|MaybeStackArray<T, stackCapacity>::operator=(MaybeStackArray <T, stackCapacity>&& src) noexcept {
  491|   205k|    releaseArray();  // in case this instance had its own memory allocated
  492|   205k|    capacity = src.capacity;
  493|   205k|    needToRelease = src.needToRelease;
  494|   205k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (494:9): [True: 205k, False: 0]
  ------------------
  495|   205k|        ptr = stackArray;
  496|   205k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|   205k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   205k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   205k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   205k|    _Pragma("clang diagnostic push") \
  |  |   45|   205k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   205k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   205k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   205k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   205k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   205k|    _Pragma("clang diagnostic pop") \
  |  |   49|   205k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   205k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   205k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   205k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  497|   205k|    } else {
  498|      0|        ptr = src.ptr;
  499|      0|        src.resetToStackArray();  // take ownership away from src
  500|      0|    }
  501|   205k|    return *this;
  502|   205k|}
_ZN6icu_7815MaybeStackArrayIPNS_8numparse4impl16CodePointMatcherELi8EE12releaseArrayEv:
  458|   525k|    void releaseArray() {
  459|   525k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 11.8k, False: 513k]
  ------------------
  460|  11.8k|            uprv_free(ptr);
  ------------------
  |  | 1503|  11.8k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  11.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  11.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  11.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|  11.8k|        }
  462|   525k|    }
_ZN6icu_7815MaybeStackArrayIPNS_8numparse4impl16CodePointMatcherELi8EED2Ev:
  363|   308k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7810MemoryPoolINS_8numparse4impl16CodePointMatcherELi8EED2Ev:
  762|   205k|    ~MemoryPool() {
  763|  66.7M|        for (int32_t i = 0; i < fCount; ++i) {
  ------------------
  |  Branch (763:29): [True: 66.5M, False: 205k]
  ------------------
  764|  66.5M|            delete fPool[i];
  765|  66.5M|        }
  766|   205k|    }
_ZN6icu_7815MaybeStackArrayIPNS_8numparse4impl16CodePointMatcherELi8EEixEl:
  402|   133M|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi3EEaSEOS6_:
  490|  1.64M|MaybeStackArray<T, stackCapacity>::operator=(MaybeStackArray <T, stackCapacity>&& src) noexcept {
  491|  1.64M|    releaseArray();  // in case this instance had its own memory allocated
  492|  1.64M|    capacity = src.capacity;
  493|  1.64M|    needToRelease = src.needToRelease;
  494|  1.64M|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (494:9): [True: 1.63M, False: 12.4k]
  ------------------
  495|  1.63M|        ptr = stackArray;
  496|  1.63M|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|  1.63M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.63M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  1.63M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  1.63M|    _Pragma("clang diagnostic push") \
  |  |   45|  1.63M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  1.63M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.63M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  1.63M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.63M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  1.63M|    _Pragma("clang diagnostic pop") \
  |  |   49|  1.63M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  1.63M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  1.63M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.63M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  497|  1.63M|    } else {
  498|  12.4k|        ptr = src.ptr;
  499|  12.4k|        src.resetToStackArray();  // take ownership away from src
  500|  12.4k|    }
  501|  1.64M|    return *this;
  502|  1.64M|}
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi3EE12releaseArrayEv:
  458|  4.71M|    void releaseArray() {
  459|  4.71M|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 35.1k, False: 4.67M]
  ------------------
  460|  35.1k|            uprv_free(ptr);
  ------------------
  |  | 1503|  35.1k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  35.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  35.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  35.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|  35.1k|        }
  462|  4.71M|    }
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi3EE17resetToStackArrayEv:
  463|  24.9k|    void resetToStackArray() {
  464|  24.9k|        ptr=stackArray;
  465|  24.9k|        capacity=stackCapacity;
  466|  24.9k|        needToRelease=false;
  467|  24.9k|    }
_ZN6icu_7815MaybeStackArrayIDsLi4EEaSEOS1_:
  490|  1.64M|MaybeStackArray<T, stackCapacity>::operator=(MaybeStackArray <T, stackCapacity>&& src) noexcept {
  491|  1.64M|    releaseArray();  // in case this instance had its own memory allocated
  492|  1.64M|    capacity = src.capacity;
  493|  1.64M|    needToRelease = src.needToRelease;
  494|  1.64M|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (494:9): [True: 1.63M, False: 12.6k]
  ------------------
  495|  1.63M|        ptr = stackArray;
  496|  1.63M|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|  1.63M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.63M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  1.63M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  1.63M|    _Pragma("clang diagnostic push") \
  |  |   45|  1.63M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  1.63M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.63M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  1.63M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.63M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  1.63M|    _Pragma("clang diagnostic pop") \
  |  |   49|  1.63M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  1.63M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  1.63M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.63M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  497|  1.63M|    } else {
  498|  12.6k|        ptr = src.ptr;
  499|  12.6k|        src.resetToStackArray();  // take ownership away from src
  500|  12.6k|    }
  501|  1.64M|    return *this;
  502|  1.64M|}
_ZN6icu_7815MaybeStackArrayIDsLi4EE12releaseArrayEv:
  458|  4.53M|    void releaseArray() {
  459|  4.53M|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 12.6k, False: 4.51M]
  ------------------
  460|  12.6k|            uprv_free(ptr);
  ------------------
  |  | 1503|  12.6k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  12.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  12.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  12.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|  12.6k|        }
  462|  4.53M|    }
_ZN6icu_7815MaybeStackArrayIDsLi4EE17resetToStackArrayEv:
  463|  12.6k|    void resetToStackArray() {
  464|  12.6k|        ptr=stackArray;
  465|  12.6k|        capacity=stackCapacity;
  466|  12.6k|        needToRelease=false;
  467|  12.6k|    }
_ZN6icu_7815MaybeStackArrayIDsLi4EED2Ev:
  363|  2.87M|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi3EED2Ev:
  363|  3.03M|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIDsLi4EEC2Ev:
  344|  2.87M|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayIDsLi4EEixEl:
  402|  2.87M|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7810MemoryPoolINS_8numparse4impl16CodePointMatcherELi8EEC2Ev:
  760|   205k|    MemoryPool() : fCount(0), fPool() {}
_ZN6icu_7815MaybeStackArrayIPNS_8numparse4impl16CodePointMatcherELi8EEC2Ev:
  344|   205k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi10EEC2Ev:
  344|   102k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi10EED2Ev:
  363|   102k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi10EE12releaseArrayEv:
  458|   102k|    void releaseArray() {
  459|   102k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 21, False: 102k]
  ------------------
  460|     21|            uprv_free(ptr);
  ------------------
  |  | 1503|     21|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|     21|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     21|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     21|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|     21|        }
  462|   102k|    }
_ZNK6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi10EE11getCapacityEv:
  376|   950k|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi10EE6resizeEii:
  505|     21|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|     21|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 21, 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|     21|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|     21|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|     21|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     21|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     21|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|     21|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 21, False: 0]
  ------------------
  512|     21|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 21, False: 0]
  ------------------
  513|     21|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 21]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|     21|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 21]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|     21|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|     21|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|     21|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|     21|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|     21|    _Pragma("clang diagnostic push") \
  |  |   45|     21|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|     21|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|     21|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|     21|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|     21|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|     21|    _Pragma("clang diagnostic pop") \
  |  |   49|     21|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|     21|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|     21|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|     21|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|     21|            }
  521|     21|            releaseArray();
  522|     21|            ptr=p;
  523|     21|            capacity=newCapacity;
  524|     21|            needToRelease=true;
  525|     21|        }
  526|     21|        return p;
  527|     21|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|     21|}
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi10EEixEl:
  402|   950k|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZNK6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi10EEixEl:
  395|   150M|    const T &operator[](ptrdiff_t i) const { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi3EEC2Ev:
  344|  2.87M|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZNK6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi3EE11getCapacityEv:
  376|  66.7M|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi3EE6resizeEii:
  505|  35.1k|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|  35.1k|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 35.1k, 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|  35.1k|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|  35.1k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  35.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  35.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  35.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|  35.1k|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 35.1k, False: 0]
  ------------------
  512|  35.1k|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 35.1k, False: 0]
  ------------------
  513|  35.1k|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 35.1k]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|  35.1k|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 35.1k]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|  35.1k|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|  35.1k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  35.1k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  35.1k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  35.1k|    _Pragma("clang diagnostic push") \
  |  |   45|  35.1k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  35.1k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  35.1k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  35.1k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  35.1k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  35.1k|    _Pragma("clang diagnostic pop") \
  |  |   49|  35.1k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  35.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  35.1k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  35.1k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|  35.1k|            }
  521|  35.1k|            releaseArray();
  522|  35.1k|            ptr=p;
  523|  35.1k|            capacity=newCapacity;
  524|  35.1k|            needToRelease=true;
  525|  35.1k|        }
  526|  35.1k|        return p;
  527|  35.1k|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|  35.1k|}
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi3EEixEl:
  402|  66.7M|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7810MemoryPoolINS_8numparse4impl16CodePointMatcherELi8EE6createIJRiEEEPS3_DpOT_:
  796|  66.5M|    T* create(Args&&... args) {
  797|  66.5M|        int32_t capacity = fPool.getCapacity();
  798|  66.5M|        if (fCount == capacity &&
  ------------------
  |  Branch (798:13): [True: 11.8k, False: 66.5M]
  ------------------
  799|  66.5M|            fPool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity,
  ------------------
  |  Branch (799:13): [True: 0, False: 11.8k]
  |  Branch (799:26): [True: 5.00k, False: 6.89k]
  ------------------
  800|  11.8k|                         capacity) == nullptr) {
  801|      0|            return nullptr;
  802|      0|        }
  803|  66.5M|        return fPool[fCount++] = new T(std::forward<Args>(args)...);
  804|  66.5M|    }
_ZNK6icu_7815MaybeStackArrayIPNS_8numparse4impl16CodePointMatcherELi8EE11getCapacityEv:
  376|  66.5M|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayIPNS_8numparse4impl16CodePointMatcherELi8EE6resizeEii:
  505|  11.8k|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|  11.8k|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 11.8k, 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|  11.8k|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|  11.8k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  11.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  11.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  11.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|  11.8k|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 11.8k, False: 0]
  ------------------
  512|  11.8k|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 11.8k, False: 0]
  ------------------
  513|  11.8k|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 11.8k]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|  11.8k|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 11.8k]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|  11.8k|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|  11.8k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  11.8k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  11.8k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  11.8k|    _Pragma("clang diagnostic push") \
  |  |   45|  11.8k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  11.8k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  11.8k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  11.8k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  11.8k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  11.8k|    _Pragma("clang diagnostic pop") \
  |  |   49|  11.8k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  11.8k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  11.8k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  11.8k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|  11.8k|            }
  521|  11.8k|            releaseArray();
  522|  11.8k|            ptr=p;
  523|  11.8k|            capacity=newCapacity;
  524|  11.8k|            needToRelease=true;
  525|  11.8k|        }
  526|  11.8k|        return p;
  527|  11.8k|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|  11.8k|}
_ZN6icu_7815MaybeStackArrayIDsLi4EEC2Ei10UErrorCode:
  350|   159k|    MaybeStackArray(int32_t newCapacity, UErrorCode status) : MaybeStackArray() {
  351|   159k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (351:13): [True: 0, False: 159k]
  ------------------
  352|      0|            return;
  353|      0|        }
  354|   159k|        if (capacity < newCapacity) {
  ------------------
  |  Branch (354:13): [True: 12.6k, False: 147k]
  ------------------
  355|  12.6k|            if (resize(newCapacity) == nullptr) {
  ------------------
  |  Branch (355:17): [True: 0, False: 12.6k]
  ------------------
  356|      0|                status = U_MEMORY_ALLOCATION_ERROR;
  357|      0|            }
  358|  12.6k|        }
  359|   159k|    }
_ZN6icu_7815MaybeStackArrayIDsLi4EE6resizeEii:
  505|  12.6k|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|  12.6k|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 12.6k, False: 0]
  ------------------
  507|       |#if U_DEBUG && defined(UPRV_MALLOC_COUNT)
  508|       |        ::fprintf(::stderr, "MaybeStackArray (resize) alloc %d * %lu\n", newCapacity, sizeof(T));
  509|       |#endif
  510|  12.6k|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|  12.6k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  12.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  12.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  12.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|  12.6k|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 12.6k, False: 0]
  ------------------
  512|  12.6k|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 0, False: 12.6k]
  ------------------
  513|      0|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 0]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|      0|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 0]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|      0|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|      0|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      0|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      0|    _Pragma("clang diagnostic push") \
  |  |   45|      0|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      0|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      0|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      0|    _Pragma("clang diagnostic pop") \
  |  |   49|      0|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|      0|            }
  521|  12.6k|            releaseArray();
  522|  12.6k|            ptr=p;
  523|  12.6k|            capacity=newCapacity;
  524|  12.6k|            needToRelease=true;
  525|  12.6k|        }
  526|  12.6k|        return p;
  527|  12.6k|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|  12.6k|}
_ZNK6icu_7815MaybeStackArrayIDsLi4EE8getAliasEv:
  381|  9.28M|    T *getAlias() const { return ptr; }
_ZN6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi3EEC2EOS6_:
  479|   159k|        : ptr(src.ptr), capacity(src.capacity), needToRelease(src.needToRelease) {
  480|   159k|    if (src.ptr == src.stackArray) {
  ------------------
  |  Branch (480:9): [True: 147k, False: 12.4k]
  ------------------
  481|   147k|        ptr = stackArray;
  482|   147k|        uprv_memcpy(stackArray, src.stackArray, sizeof(T) * src.capacity);
  ------------------
  |  |   42|   147k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   147k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   147k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   147k|    _Pragma("clang diagnostic push") \
  |  |   45|   147k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   147k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   147k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   147k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   147k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   147k|    _Pragma("clang diagnostic pop") \
  |  |   49|   147k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   147k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   147k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   147k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  483|   147k|    } else {
  484|  12.4k|        src.resetToStackArray();  // take ownership away from src
  485|  12.4k|    }
  486|   159k|}
_ZNK6icu_7815MaybeStackArrayIPKNS_8numparse4impl18NumberParseMatcherELi3EE8getAliasEv:
  381|  72.5M|    T *getAlias() const { return ptr; }
_ZN6icu_7811LocalMemoryIiEC2EPi:
  195|      5|    explicit LocalMemory(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7811LocalMemoryIiED2Ev:
  206|      5|    ~LocalMemory() {
  207|      5|        uprv_free(LocalPointerBase<T>::ptr);
  ------------------
  |  | 1503|      5|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  208|      5|    }
_ZNK6icu_7811LocalMemoryIiEixEl:
  274|  1.29k|    T &operator[](ptrdiff_t i) const { return LocalPointerBase<T>::ptr[i]; }
_ZN6icu_7810MemoryPoolINS_13UnicodeStringELi8EEC2Ev:
  760|      1|    MemoryPool() : fCount(0), fPool() {}
_ZN6icu_7815MaybeStackArrayIPNS_13UnicodeStringELi8EEC2Ev:
  344|      1|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7810MemoryPoolINS_13UnicodeStringELi8EED2Ev:
  762|      1|    ~MemoryPool() {
  763|      1|        for (int32_t i = 0; i < fCount; ++i) {
  ------------------
  |  Branch (763:29): [True: 0, False: 1]
  ------------------
  764|      0|            delete fPool[i];
  765|      0|        }
  766|      1|    }
_ZN6icu_7815MaybeStackArrayIPNS_13UnicodeStringELi8EED2Ev:
  363|      1|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIPNS_13UnicodeStringELi8EE12releaseArrayEv:
  458|      1|    void releaseArray() {
  459|      1|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 0, False: 1]
  ------------------
  460|      0|            uprv_free(ptr);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      0|        }
  462|      1|    }
_ZN6icu_7811LocalMemoryIPKcEC2EPS2_:
  195|      5|    explicit LocalMemory(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7811LocalMemoryIPKcE22allocateInsteadAndCopyEii:
  294|      5|inline T *LocalMemory<T>::allocateInsteadAndCopy(int32_t newCapacity, int32_t length) {
  295|      5|    if(newCapacity>0) {
  ------------------
  |  Branch (295:8): [True: 5, False: 0]
  ------------------
  296|      5|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|      5|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  297|      5|        if(p!=nullptr) {
  ------------------
  |  Branch (297:12): [True: 5, False: 0]
  ------------------
  298|      5|            if(length>0) {
  ------------------
  |  Branch (298:16): [True: 0, False: 5]
  ------------------
  299|      0|                if(length>newCapacity) {
  ------------------
  |  Branch (299:20): [True: 0, False: 0]
  ------------------
  300|      0|                    length=newCapacity;
  301|      0|                }
  302|      0|                uprv_memcpy(p, LocalPointerBase<T>::ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|      0|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      0|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      0|    _Pragma("clang diagnostic push") \
  |  |   45|      0|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      0|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      0|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      0|    _Pragma("clang diagnostic pop") \
  |  |   49|      0|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  303|      0|            }
  304|      5|            uprv_free(LocalPointerBase<T>::ptr);
  ------------------
  |  | 1503|      5|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  305|      5|            LocalPointerBase<T>::ptr=p;
  306|      5|        }
  307|      5|        return p;
  308|      5|    } else {
  309|      0|        return nullptr;
  310|      0|    }
  311|      5|}
_ZN6icu_7811LocalMemoryIiE22allocateInsteadAndCopyEii:
  294|      5|inline T *LocalMemory<T>::allocateInsteadAndCopy(int32_t newCapacity, int32_t length) {
  295|      5|    if(newCapacity>0) {
  ------------------
  |  Branch (295:8): [True: 5, False: 0]
  ------------------
  296|      5|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|      5|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  297|      5|        if(p!=nullptr) {
  ------------------
  |  Branch (297:12): [True: 5, False: 0]
  ------------------
  298|      5|            if(length>0) {
  ------------------
  |  Branch (298:16): [True: 0, False: 5]
  ------------------
  299|      0|                if(length>newCapacity) {
  ------------------
  |  Branch (299:20): [True: 0, False: 0]
  ------------------
  300|      0|                    length=newCapacity;
  301|      0|                }
  302|      0|                uprv_memcpy(p, LocalPointerBase<T>::ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|      0|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      0|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      0|    _Pragma("clang diagnostic push") \
  |  |   45|      0|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      0|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      0|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      0|    _Pragma("clang diagnostic pop") \
  |  |   49|      0|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  303|      0|            }
  304|      5|            uprv_free(LocalPointerBase<T>::ptr);
  ------------------
  |  | 1503|      5|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  305|      5|            LocalPointerBase<T>::ptr=p;
  306|      5|        }
  307|      5|        return p;
  308|      5|    } else {
  309|      0|        return nullptr;
  310|      0|    }
  311|      5|}
_ZNK6icu_7811LocalMemoryIPKcEixEl:
  274|  1.29k|    T &operator[](ptrdiff_t i) const { return LocalPointerBase<T>::ptr[i]; }
_ZN6icu_7811LocalMemoryIPKcED2Ev:
  206|      5|    ~LocalMemory() {
  207|      5|        uprv_free(LocalPointerBase<T>::ptr);
  ------------------
  |  | 1503|      5|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      5|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      5|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      5|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  208|      5|    }
_ZN6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EEC2Ev:
  344|  9.53k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayIdLi8EEC2Ev:
  344|  1.99k|    MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(false) {}
_ZN6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EED2Ev:
  363|  9.53k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EE12releaseArrayEv:
  458|  10.5k|    void releaseArray() {
  459|  10.5k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 975, False: 9.53k]
  ------------------
  460|    975|            uprv_free(ptr);
  ------------------
  |  | 1503|    975|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    975|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    975|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    975|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|    975|        }
  462|  10.5k|    }
_ZN6icu_7815MaybeStackArrayIdLi8EED2Ev:
  363|  1.99k|    ~MaybeStackArray() { releaseArray(); }
_ZN6icu_7815MaybeStackArrayIdLi8EE12releaseArrayEv:
  458|  1.99k|    void releaseArray() {
  459|  1.99k|        if(needToRelease) {
  ------------------
  |  Branch (459:12): [True: 2, False: 1.99k]
  ------------------
  460|      2|            uprv_free(ptr);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      2|        }
  462|  1.99k|    }
_ZNK6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EE8getAliasEv:
  381|  19.0k|    T *getAlias() const { return ptr; }
_ZNK6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EE11getCapacityEv:
  376|   477k|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EE6resizeEii:
  505|    975|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|    975|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 975, 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|    975|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|    975|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|    975|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    975|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    975|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|    975|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 975, False: 0]
  ------------------
  512|    975|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 975, False: 0]
  ------------------
  513|    975|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 975]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|    975|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 975]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|    975|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   42|    975|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    975|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|    975|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|    975|    _Pragma("clang diagnostic push") \
  |  |   45|    975|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|    975|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|    975|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|    975|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|    975|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|    975|    _Pragma("clang diagnostic pop") \
  |  |   49|    975|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|    975|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|    975|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    975|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|    975|            }
  521|    975|            releaseArray();
  522|    975|            ptr=p;
  523|    975|            capacity=newCapacity;
  524|    975|            needToRelease=true;
  525|    975|        }
  526|    975|        return p;
  527|    975|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|    975|}
_ZNK6icu_7815MaybeStackArrayIdLi8EE8getAliasEv:
  381|  1.99k|    T *getAlias() const { return ptr; }
_ZNK6icu_7815MaybeStackArrayIdLi8EE11getCapacityEv:
  376|     34|    int32_t getCapacity() const { return capacity; }
_ZN6icu_7815MaybeStackArrayIdLi8EE6resizeEii:
  505|      2|inline T *MaybeStackArray<T, stackCapacity>::resize(int32_t newCapacity, int32_t length) {
  506|      2|    if(newCapacity>0) {
  ------------------
  |  Branch (506:8): [True: 2, 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|      2|        T *p=(T *)uprv_malloc(newCapacity*sizeof(T));
  ------------------
  |  | 1524|      2|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|      2|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      2|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      2|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  511|      2|        if(p!=nullptr) {
  ------------------
  |  Branch (511:12): [True: 2, False: 0]
  ------------------
  512|      2|            if(length>0) {
  ------------------
  |  Branch (512:16): [True: 2, False: 0]
  ------------------
  513|      2|                if(length>capacity) {
  ------------------
  |  Branch (513:20): [True: 0, False: 2]
  ------------------
  514|      0|                    length=capacity;
  515|      0|                }
  516|      2|                if(length>newCapacity) {
  ------------------
  |  Branch (516:20): [True: 0, False: 2]
  ------------------
  517|      0|                    length=newCapacity;
  518|      0|                }
  519|      2|                uprv_memcpy(p, ptr, (size_t)length*sizeof(T));
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|      2|            }
  521|      2|            releaseArray();
  522|      2|            ptr=p;
  523|      2|            capacity=newCapacity;
  524|      2|            needToRelease=true;
  525|      2|        }
  526|      2|        return p;
  527|      2|    } else {
  528|      0|        return nullptr;
  529|      0|    }
  530|      2|}
_ZN6icu_7815MaybeStackArrayINS_14MessagePattern4PartELi32EEixEl:
  402|   513k|    T &operator[](ptrdiff_t i) { return ptr[i]; }
_ZN6icu_7815MaybeStackArrayIdLi8EEixEl:
  402|  2.02k|    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();} ()

uprv_isASCIILetter_78:
   52|  18.7M|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|  18.7M|    return ('a'<=c && c<='z') || ('A'<=c && c<='Z');
  ------------------
  |  Branch (58:13): [True: 8.74M, False: 9.97M]
  |  Branch (58:23): [True: 8.74M, False: 0]
  |  Branch (58:35): [True: 9.92M, False: 47.6k]
  |  Branch (58:45): [True: 9.92M, False: 0]
  ------------------
   59|  18.7M|#endif
   60|  18.7M|}
uprv_toupper_78:
   63|  13.6M|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|  13.6M|    if('a'<=c && c<='z') {
  ------------------
  |  Branch (69:8): [True: 0, False: 13.6M]
  |  Branch (69:18): [True: 0, False: 0]
  ------------------
   70|      0|        c=(char)(c+('A'-'a'));
   71|      0|    }
   72|  13.6M|#endif
   73|  13.6M|    return c;
   74|  13.6M|}
uprv_asciitolower_78:
  103|  28.1M|uprv_asciitolower(char c) {
  104|  28.1M|    if(0x41<=c && c<=0x5a) {
  ------------------
  |  Branch (104:8): [True: 28.1M, False: 1]
  |  Branch (104:19): [True: 18, False: 28.1M]
  ------------------
  105|     18|        c=(char)(c+0x20);
  106|     18|    }
  107|  28.1M|    return c;
  108|  28.1M|}
T_CString_toLowerCase_78:
  124|      1|{
  125|      1|    char* origPtr = str;
  126|       |
  127|      1|    if (str) {
  ------------------
  |  Branch (127:9): [True: 1, False: 0]
  ------------------
  128|      1|        do
  129|      6|            *str = uprv_tolower(*str);
  ------------------
  |  |   68|      6|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|      6|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|      6|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|      6|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|      6|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  130|      6|        while (*(str++));
  ------------------
  |  Branch (130:16): [True: 5, False: 1]
  ------------------
  131|      1|    }
  132|       |
  133|      1|    return origPtr;
  134|      1|}
T_CString_toUpperCase_78:
  138|   341k|{
  139|   341k|    char* origPtr = str;
  140|       |
  141|   341k|    if (str) {
  ------------------
  |  Branch (141:9): [True: 341k, False: 0]
  ------------------
  142|   341k|        do
  143|  1.36M|            *str = uprv_toupper(*str);
  ------------------
  |  | 1547|  1.36M|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|  1.36M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.36M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.36M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|  1.36M|        while (*(str++));
  ------------------
  |  Branch (144:16): [True: 1.02M, False: 341k]
  ------------------
  145|   341k|    }
  146|       |
  147|   341k|    return origPtr;
  148|   341k|}
T_CString_integerToString_78:
  158|   218k|{
  159|   218k|    char      tbuf[30];
  160|   218k|    int32_t   tbx    = sizeof(tbuf);
  161|   218k|    uint8_t   digit;
  162|   218k|    int32_t   length = 0;
  163|   218k|    uint32_t  uval;
  164|       |    
  165|   218k|    U_ASSERT(radix>=2 && radix<=16);
  ------------------
  |  |   35|   218k|#   define U_ASSERT(exp) (void)0
  ------------------
  166|   218k|    uval = (uint32_t) v;
  167|   218k|    if(v<0 && radix == 10) {
  ------------------
  |  Branch (167:8): [True: 0, False: 218k]
  |  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|   218k|    tbx = sizeof(tbuf)-1;
  174|   218k|    tbuf[tbx] = 0;   /* We are generating the digits backwards.  Null term the end. */
  175|   218k|    do {
  176|   218k|        digit = (uint8_t)(uval % radix);
  177|   218k|        tbuf[--tbx] = (char)(T_CString_itosOffset(digit));
  ------------------
  |  |   81|   218k|#define T_CString_itosOffset(a) ((a)<=9?('0'+(a)):('A'+(a)-10))
  |  |  ------------------
  |  |  |  Branch (81:34): [True: 218k, False: 0]
  |  |  ------------------
  ------------------
  178|   218k|        uval  = uval / radix;
  179|   218k|    } while (uval != 0);
  ------------------
  |  Branch (179:14): [True: 0, False: 218k]
  ------------------
  180|       |    
  181|       |    /* copy converted number into user buffer  */
  182|   218k|    uprv_strcpy(buffer+length, tbuf+tbx);
  ------------------
  |  |   36|   218k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|   218k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  183|   218k|    length += sizeof(tbuf) - tbx -1;
  184|   218k|    return length;
  185|   218k|}
uprv_strnicmp_78:
  274|  6.04M|uprv_strnicmp(const char *str1, const char *str2, uint32_t n) {
  275|  6.04M|    if(str1==nullptr) {
  ------------------
  |  Branch (275:8): [True: 0, False: 6.04M]
  ------------------
  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|  6.04M|    } else if(str2==nullptr) {
  ------------------
  |  Branch (281:15): [True: 0, False: 6.04M]
  ------------------
  282|      0|        return 1;
  283|  6.04M|    } else {
  284|       |        /* compare non-nullptr strings lexically with lowercase */
  285|  6.04M|        int rc;
  286|  6.04M|        unsigned char c1, c2;
  287|       |
  288|  6.05M|        for(; n--;) {
  ------------------
  |  Branch (288:15): [True: 6.05M, False: 1]
  ------------------
  289|  6.05M|            c1=(unsigned char)*str1;
  290|  6.05M|            c2=(unsigned char)*str2;
  291|  6.05M|            if(c1==0) {
  ------------------
  |  Branch (291:16): [True: 0, False: 6.05M]
  ------------------
  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|  6.05M|            } else if(c2==0) {
  ------------------
  |  Branch (297:23): [True: 0, False: 6.05M]
  ------------------
  298|      0|                return 1;
  299|  6.05M|            } else {
  300|       |                /* compare non-zero characters with lowercase */
  301|  6.05M|                rc=(int)(unsigned char)uprv_tolower(c1)-(int)(unsigned char)uprv_tolower(c2);
  ------------------
  |  |   68|  6.05M|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  6.05M|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  6.05M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  6.05M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  6.05M|#       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|  6.05M|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  6.05M|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  6.05M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  6.05M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  6.05M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  302|  6.05M|                if(rc!=0) {
  ------------------
  |  Branch (302:20): [True: 6.04M, False: 6.46k]
  ------------------
  303|  6.04M|                    return rc;
  304|  6.04M|                }
  305|  6.05M|            }
  306|  6.46k|            ++str1;
  307|  6.46k|            ++str2;
  308|  6.46k|        }
  309|  6.04M|    }
  310|       |
  311|      1|    return 0;
  312|  6.04M|}
uprv_strdup_78:
  315|    988|uprv_strdup(const char *src) {
  316|    988|    size_t len = uprv_strlen(src) + 1;
  ------------------
  |  |   37|    988|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|    988|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  317|    988|    char *dup = (char *) uprv_malloc(len);
  ------------------
  |  | 1524|    988|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|    988|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    988|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    988|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  318|       |
  319|    988|    if (dup) {
  ------------------
  |  Branch (319:9): [True: 988, False: 0]
  ------------------
  320|    988|        uprv_memcpy(dup, src, len);
  ------------------
  |  |   42|    988|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|    988|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|    988|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|    988|    _Pragma("clang diagnostic push") \
  |  |   45|    988|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|    988|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|    988|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|    988|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|    988|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|    988|    _Pragma("clang diagnostic pop") \
  |  |   49|    988|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|    988|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|    988|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|    988|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  321|    988|    }
  322|       |
  323|    988|    return dup;
  324|    988|}

_ZN6icu_789ErrorCodeD2Ev:
   24|  7.44M|ErrorCode::~ErrorCode() {}

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

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

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

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

_Z39ulocimp_getRegionForSupplementalData_78PKcbR10UErrorCode:
  434|   269k|                                     UErrorCode& status) {
  435|   269k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (435:9): [True: 0, False: 269k]
  ------------------
  436|      0|        return {};
  437|      0|    }
  438|   269k|    icu::CharString rgBuf = GetRegionFromKey(localeID, "rg", status);
  439|   269k|    if (U_SUCCESS(status) && rgBuf.isEmpty()) {
  ------------------
  |  Branch (439:9): [True: 269k, False: 0]
  |  Branch (439:30): [True: 269k, False: 0]
  ------------------
  440|       |        // No valid rg keyword value, try for unicode_region_subtag
  441|   269k|        rgBuf = ulocimp_getRegion(localeID == nullptr ? uloc_getDefault() : localeID, status);
  ------------------
  |  | 1206|   269k|#define ulocimp_getRegion U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegion)
  |  |  ------------------
  |  |  |  |  123|   269k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   269k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   269k|#       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: 269k]
  ------------------
  442|   269k|        if (U_SUCCESS(status) && rgBuf.isEmpty() && inferRegion) {
  ------------------
  |  Branch (442:13): [True: 269k, False: 0]
  |  Branch (442:34): [True: 49.5k, False: 220k]
  |  Branch (442:53): [True: 0, False: 49.5k]
  ------------------
  443|       |            // Second check for sd keyword value
  444|      0|            rgBuf = GetRegionFromKey(localeID, "sd", status);
  445|      0|            if (U_SUCCESS(status) && rgBuf.isEmpty()) {
  ------------------
  |  Branch (445:17): [True: 0, False: 0]
  |  Branch (445:38): [True: 0, False: 0]
  ------------------
  446|       |                // no unicode_region_subtag but inferRegion true, try likely subtags
  447|      0|                UErrorCode rgStatus = U_ZERO_ERROR;
  448|      0|                icu::CharString locBuf = ulocimp_addLikelySubtags(localeID, rgStatus);
  ------------------
  |  | 1196|      0|#define ulocimp_addLikelySubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_addLikelySubtags)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  449|      0|                if (U_SUCCESS(rgStatus)) {
  ------------------
  |  Branch (449:21): [True: 0, False: 0]
  ------------------
  450|      0|                    rgBuf = ulocimp_getRegion(locBuf.toStringPiece(), status);
  ------------------
  |  | 1206|      0|#define ulocimp_getRegion U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegion)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  451|      0|                }
  452|      0|            }
  453|      0|        }
  454|   269k|    }
  455|       |
  456|   269k|    return rgBuf;
  457|   269k|}
loclikely.cpp:_ZN12_GLOBAL__N_116GetRegionFromKeyEPKcNSt3__117basic_string_viewIcNS2_11char_traitsIcEEEER10UErrorCode:
  400|   269k|GetRegionFromKey(const char* localeID, std::string_view key, UErrorCode& status) {
  401|   269k|    icu::CharString result;
  402|       |    // First check for keyword value
  403|   269k|    icu::CharString kw = ulocimp_getKeywordValue(localeID, key, status);
  ------------------
  |  | 1200|   269k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|   269k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   269k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   269k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  404|   269k|    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|   269k|    if (U_SUCCESS(status) && len >= 3 && len <= 6 &&
  ------------------
  |  Branch (418:9): [True: 269k, False: 0]
  |  Branch (418:30): [True: 0, False: 269k]
  |  Branch (418:42): [True: 0, False: 0]
  ------------------
  419|   269k|        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|   269k|    return result;
  429|   269k|}

_ZN6icu_7814MessagePatternC2ER10UErrorCode:
  147|  9.53k|        : aposMode(UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE),
  ------------------
  |  |  379|  9.53k|#   define UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE UMSGPAT_APOS_DOUBLE_OPTIONAL
  ------------------
  148|  9.53k|          partsList(nullptr), parts(nullptr), partsLength(0),
  149|  9.53k|          numericValuesList(nullptr), numericValues(nullptr), numericValuesLength(0),
  150|  9.53k|          hasArgNames(false), hasArgNumbers(false), needsAutoQuoting(false) {
  151|  9.53k|    init(errorCode);
  152|  9.53k|}
_ZN6icu_7814MessagePattern4initER10UErrorCode:
  173|  9.53k|MessagePattern::init(UErrorCode &errorCode) {
  174|  9.53k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (174:8): [True: 0, False: 9.53k]
  ------------------
  175|      0|        return false;
  176|      0|    }
  177|  9.53k|    partsList=new MessagePatternPartsList();
  178|  9.53k|    if(partsList==nullptr) {
  ------------------
  |  Branch (178:8): [True: 0, False: 9.53k]
  ------------------
  179|      0|        errorCode=U_MEMORY_ALLOCATION_ERROR;
  180|      0|        return false;
  181|      0|    }
  182|  9.53k|    parts=partsList->a.getAlias();
  183|  9.53k|    return true;
  184|  9.53k|}
_ZN6icu_7814MessagePatternD2Ev:
  260|  9.53k|MessagePattern::~MessagePattern() {
  261|  9.53k|    delete partsList;
  262|  9.53k|    delete numericValuesList;
  263|  9.53k|}
_ZN6icu_7814MessagePattern16parseChoiceStyleERKNS_13UnicodeStringEP11UParseErrorR10UErrorCode:
  277|  9.53k|                                 UParseError *parseError, UErrorCode &errorCode) {
  278|  9.53k|    preParse(pattern, parseError, errorCode);
  279|  9.53k|    parseChoiceStyle(0, 0, parseError, errorCode);
  280|  9.53k|    postParse();
  281|  9.53k|    return *this;
  282|  9.53k|}
_ZNK6icu_7814MessagePattern15getNumericValueERKNS0_4PartE:
  361|  20.1k|MessagePattern::getNumericValue(const Part &part) const {
  362|  20.1k|    UMessagePatternPartType type=part.type;
  363|  20.1k|    if(type==UMSGPAT_PART_TYPE_ARG_INT) {
  ------------------
  |  Branch (363:8): [True: 20.0k, False: 142]
  ------------------
  364|  20.0k|        return part.value;
  365|  20.0k|    } else if(type==UMSGPAT_PART_TYPE_ARG_DOUBLE) {
  ------------------
  |  Branch (365:15): [True: 142, False: 0]
  ------------------
  366|    142|        return numericValues[part.value];
  367|    142|    } else {
  368|      0|        return UMSGPAT_NO_NUMERIC_VALUE;
  ------------------
  |  |  299|      0|#define UMSGPAT_NO_NUMERIC_VALUE ((double)(-123456789))
  ------------------
  369|      0|    }
  370|  20.1k|}
_ZN6icu_7814MessagePattern8preParseERKNS_13UnicodeStringEP11UParseErrorR10UErrorCode:
  406|  9.53k|MessagePattern::preParse(const UnicodeString &pattern, UParseError *parseError, UErrorCode &errorCode) {
  407|  9.53k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (407:8): [True: 0, False: 9.53k]
  ------------------
  408|      0|        return;
  409|      0|    }
  410|  9.53k|    if(parseError!=nullptr) {
  ------------------
  |  Branch (410:8): [True: 0, False: 9.53k]
  ------------------
  411|      0|        parseError->line=0;
  412|      0|        parseError->offset=0;
  413|      0|        parseError->preContext[0]=0;
  414|      0|        parseError->postContext[0]=0;
  415|      0|    }
  416|  9.53k|    msg=pattern;
  417|  9.53k|    hasArgNames=hasArgNumbers=false;
  418|  9.53k|    needsAutoQuoting=false;
  419|  9.53k|    partsLength=0;
  420|  9.53k|    numericValuesLength=0;
  421|  9.53k|}
_ZN6icu_7814MessagePattern9postParseEv:
  424|  9.53k|MessagePattern::postParse() {
  425|  9.53k|    if(partsList!=nullptr) {
  ------------------
  |  Branch (425:8): [True: 9.53k, False: 0]
  ------------------
  426|  9.53k|        parts=partsList->a.getAlias();
  427|  9.53k|    }
  428|  9.53k|    if(numericValuesList!=nullptr) {
  ------------------
  |  Branch (428:8): [True: 1.99k, False: 7.53k]
  ------------------
  429|  1.99k|        numericValues=numericValuesList->a.getAlias();
  430|  1.99k|    }
  431|  9.53k|}
_ZN6icu_7814MessagePattern12parseMessageEiii22UMessagePatternArgTypeP11UParseErrorR10UErrorCode:
  436|  32.9k|                             UParseError *parseError, UErrorCode &errorCode) {
  437|  32.9k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (437:8): [True: 0, False: 32.9k]
  ------------------
  438|      0|        return 0;
  439|      0|    }
  440|  32.9k|    if(nestingLevel>Part::MAX_NESTED_LEVELS) {
  ------------------
  |  Branch (440:8): [True: 0, False: 32.9k]
  ------------------
  441|      0|        errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  442|      0|        return 0;
  443|      0|    }
  444|  32.9k|    int32_t msgStart=partsLength;
  445|  32.9k|    addPart(UMSGPAT_PART_TYPE_MSG_START, index, msgStartLength, nestingLevel, errorCode);
  446|  32.9k|    index+=msgStartLength;
  447|  8.80M|    for(;;) {  // while(index<msg.length()) with U_FAILURE(errorCode) check
  448|  8.80M|        if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (448:12): [True: 454, False: 8.80M]
  ------------------
  449|    454|            return 0;
  450|    454|        }
  451|  8.80M|        if(index>=msg.length()) {
  ------------------
  |  Branch (451:12): [True: 450, False: 8.80M]
  ------------------
  452|    450|            break;
  453|    450|        }
  454|  8.80M|        char16_t c=msg.charAt(index++);
  455|  8.80M|        if(c==u_apos) {
  ------------------
  |  Branch (455:12): [True: 239k, False: 8.56M]
  ------------------
  456|   239k|            if(index==msg.length()) {
  ------------------
  |  Branch (456:16): [True: 28, False: 239k]
  ------------------
  457|       |                // The apostrophe is the last character in the pattern. 
  458|       |                // Add a Part for auto-quoting.
  459|     28|                addPart(UMSGPAT_PART_TYPE_INSERT_CHAR, index, 0,
  460|     28|                        u_apos, errorCode);  // value=char to be inserted
  461|     28|                needsAutoQuoting=true;
  462|   239k|            } else {
  463|   239k|                c=msg.charAt(index);
  464|   239k|                if(c==u_apos) {
  ------------------
  |  Branch (464:20): [True: 189k, False: 49.8k]
  ------------------
  465|       |                    // double apostrophe, skip the second one
  466|   189k|                    addPart(UMSGPAT_PART_TYPE_SKIP_SYNTAX, index++, 1, 0, errorCode);
  467|   189k|                } else if(
  468|  49.8k|                    aposMode==UMSGPAT_APOS_DOUBLE_REQUIRED ||
  ------------------
  |  Branch (468:21): [True: 0, False: 49.8k]
  ------------------
  469|  49.8k|                    c==u_leftCurlyBrace || c==u_rightCurlyBrace ||
  ------------------
  |  Branch (469:21): [True: 8.84k, False: 40.9k]
  |  Branch (469:44): [True: 63, False: 40.9k]
  ------------------
  470|  49.8k|                    (parentType==UMSGPAT_ARG_TYPE_CHOICE && c==u_pipe) ||
  ------------------
  |  Branch (470:22): [True: 40.9k, False: 0]
  |  Branch (470:61): [True: 244, False: 40.6k]
  ------------------
  471|  49.8k|                    (UMSGPAT_ARG_TYPE_HAS_PLURAL_STYLE(parentType) && c==u_pound)
  ------------------
  |  |  273|  81.3k|    ((argType)==UMSGPAT_ARG_TYPE_PLURAL || (argType)==UMSGPAT_ARG_TYPE_SELECTORDINAL)
  |  |  ------------------
  |  |  |  Branch (273:6): [True: 0, False: 40.6k]
  |  |  |  Branch (273:44): [True: 0, False: 40.6k]
  |  |  ------------------
  ------------------
  |  Branch (471:71): [True: 0, False: 0]
  ------------------
  472|  49.8k|                ) {
  473|       |                    // skip the quote-starting apostrophe
  474|  9.15k|                    addPart(UMSGPAT_PART_TYPE_SKIP_SYNTAX, index-1, 1, 0, errorCode);
  475|       |                    // find the end of the quoted literal text
  476|  94.5k|                    for(;;) {
  477|  94.5k|                        index=msg.indexOf(u_apos, index+1);
  478|  94.5k|                        if(index>=0) {
  ------------------
  |  Branch (478:28): [True: 94.5k, False: 30]
  ------------------
  479|  94.5k|                            if(/*(index+1)<msg.length() &&*/ msg.charAt(index+1)==u_apos) {
  ------------------
  |  Branch (479:62): [True: 85.4k, False: 9.12k]
  ------------------
  480|       |                                // double apostrophe inside quoted literal text
  481|       |                                // still encodes a single apostrophe, skip the second one
  482|  85.4k|                                addPart(UMSGPAT_PART_TYPE_SKIP_SYNTAX, ++index, 1, 0, errorCode);
  483|  85.4k|                            } else {
  484|       |                                // skip the quote-ending apostrophe
  485|  9.12k|                                addPart(UMSGPAT_PART_TYPE_SKIP_SYNTAX, index++, 1, 0, errorCode);
  486|  9.12k|                                break;
  487|  9.12k|                            }
  488|  94.5k|                        } else {
  489|       |                            // The quoted text reaches to the end of the of the message.
  490|     30|                            index=msg.length();
  491|       |                            // Add a Part for auto-quoting.
  492|     30|                            addPart(UMSGPAT_PART_TYPE_INSERT_CHAR, index, 0,
  493|     30|                                    u_apos, errorCode);  // value=char to be inserted
  494|     30|                            needsAutoQuoting=true;
  495|     30|                            break;
  496|     30|                        }
  497|  94.5k|                    }
  498|  40.6k|                } else {
  499|       |                    // Interpret the apostrophe as literal text.
  500|       |                    // Add a Part for auto-quoting.
  501|  40.6k|                    addPart(UMSGPAT_PART_TYPE_INSERT_CHAR, index, 0,
  502|  40.6k|                            u_apos, errorCode);  // value=char to be inserted
  503|  40.6k|                    needsAutoQuoting=true;
  504|  40.6k|                }
  505|   239k|            }
  506|  8.56M|        } else if(UMSGPAT_ARG_TYPE_HAS_PLURAL_STYLE(parentType) && c==u_pound) {
  ------------------
  |  |  273|  17.1M|    ((argType)==UMSGPAT_ARG_TYPE_PLURAL || (argType)==UMSGPAT_ARG_TYPE_SELECTORDINAL)
  |  |  ------------------
  |  |  |  Branch (273:6): [True: 0, False: 8.56M]
  |  |  |  Branch (273:44): [True: 0, False: 8.56M]
  |  |  ------------------
  ------------------
  |  Branch (506:68): [True: 0, False: 0]
  ------------------
  507|       |            // The unquoted # in a plural message fragment will be replaced
  508|       |            // with the (number-offset).
  509|      0|            addPart(UMSGPAT_PART_TYPE_REPLACE_NUMBER, index-1, 1, 0, errorCode);
  510|  8.56M|        } else if(c==u_leftCurlyBrace) {
  ------------------
  |  Branch (510:19): [True: 2.75k, False: 8.56M]
  ------------------
  511|  2.75k|            index=parseArg(index-1, 1, nestingLevel, parseError, errorCode);
  512|  8.56M|        } else if((nestingLevel>0 && c==u_rightCurlyBrace) ||
  ------------------
  |  Branch (512:20): [True: 8.56M, False: 0]
  |  Branch (512:38): [True: 21, False: 8.56M]
  ------------------
  513|  8.56M|                  (parentType==UMSGPAT_ARG_TYPE_CHOICE && c==u_pipe)) {
  ------------------
  |  Branch (513:20): [True: 8.56M, False: 0]
  |  Branch (513:59): [True: 31.9k, False: 8.53M]
  ------------------
  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|  32.0k|            int32_t limitLength=(parentType==UMSGPAT_ARG_TYPE_CHOICE && c==u_rightCurlyBrace) ? 0 : 1;
  ------------------
  |  Branch (517:34): [True: 32.0k, False: 0]
  |  Branch (517:73): [True: 21, False: 31.9k]
  ------------------
  518|  32.0k|            addLimitPart(msgStart, UMSGPAT_PART_TYPE_MSG_LIMIT, index-1, limitLength,
  519|  32.0k|                         nestingLevel, errorCode);
  520|  32.0k|            if(parentType==UMSGPAT_ARG_TYPE_CHOICE) {
  ------------------
  |  Branch (520:16): [True: 32.0k, False: 0]
  ------------------
  521|       |                // Let the choice style parser see the '}' or '|'.
  522|  32.0k|                return index-1;
  523|  32.0k|            } else {
  524|       |                // continue parsing after the '}'
  525|      0|                return index;
  526|      0|            }
  527|  32.0k|        }  // else: c is part of literal text
  528|  8.80M|    }
  529|    450|    if(nestingLevel>0 && !inTopLevelChoiceMessage(nestingLevel, parentType)) {
  ------------------
  |  Branch (529:8): [True: 450, False: 0]
  |  Branch (529:26): [True: 0, False: 450]
  ------------------
  530|      0|        setParseError(parseError, 0);  // Unmatched '{' braces in message.
  531|      0|        errorCode=U_UNMATCHED_BRACES;
  532|      0|        return 0;
  533|      0|    }
  534|    450|    addLimitPart(msgStart, UMSGPAT_PART_TYPE_MSG_LIMIT, index, 0, nestingLevel, errorCode);
  535|    450|    return index;
  536|    450|}
_ZN6icu_7814MessagePattern8parseArgEiiiP11UParseErrorR10UErrorCode:
  540|  2.75k|                         UParseError *parseError, UErrorCode &errorCode) {
  541|  2.75k|    int32_t argStart=partsLength;
  542|  2.75k|    UMessagePatternArgType argType=UMSGPAT_ARG_TYPE_NONE;
  543|  2.75k|    addPart(UMSGPAT_PART_TYPE_ARG_START, index, argStartLength, argType, errorCode);
  544|  2.75k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (544:8): [True: 0, False: 2.75k]
  ------------------
  545|      0|        return 0;
  546|      0|    }
  547|  2.75k|    int32_t nameIndex=index=skipWhiteSpace(index+argStartLength);
  548|  2.75k|    if(index==msg.length()) {
  ------------------
  |  Branch (548:8): [True: 3, False: 2.75k]
  ------------------
  549|      3|        setParseError(parseError, 0);  // Unmatched '{' braces in message.
  550|      3|        errorCode=U_UNMATCHED_BRACES;
  551|      3|        return 0;
  552|      3|    }
  553|       |    // parse argument name or number
  554|  2.75k|    index=skipIdentifier(index);
  555|  2.75k|    int32_t number=parseArgNumber(nameIndex, index);
  556|  2.75k|    if(number>=0) {
  ------------------
  |  Branch (556:8): [True: 106, False: 2.64k]
  ------------------
  557|    106|        int32_t length=index-nameIndex;
  558|    106|        if(length>Part::MAX_LENGTH || number>Part::MAX_VALUE) {
  ------------------
  |  Branch (558:12): [True: 0, False: 106]
  |  Branch (558:39): [True: 18, False: 88]
  ------------------
  559|     18|            setParseError(parseError, nameIndex);  // Argument number too large.
  560|     18|            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  561|     18|            return 0;
  562|     18|        }
  563|     88|        hasArgNumbers=true;
  564|     88|        addPart(UMSGPAT_PART_TYPE_ARG_NUMBER, nameIndex, length, number, errorCode);
  565|  2.64k|    } else if(number==UMSGPAT_ARG_NAME_NOT_NUMBER) {
  ------------------
  |  Branch (565:15): [True: 2.62k, False: 17]
  ------------------
  566|  2.62k|        int32_t length=index-nameIndex;
  567|  2.62k|        if(length>Part::MAX_LENGTH) {
  ------------------
  |  Branch (567:12): [True: 1, False: 2.62k]
  ------------------
  568|      1|            setParseError(parseError, nameIndex);  // Argument name too long.
  569|      1|            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  570|      1|            return 0;
  571|      1|        }
  572|  2.62k|        hasArgNames=true;
  573|  2.62k|        addPart(UMSGPAT_PART_TYPE_ARG_NAME, nameIndex, length, 0, errorCode);
  574|  2.62k|    } else {  // number<-1 (ARG_NAME_NOT_VALID)
  575|     17|        setParseError(parseError, nameIndex);  // Bad argument syntax.
  576|     17|        errorCode=U_PATTERN_SYNTAX_ERROR;
  577|     17|        return 0;
  578|     17|    }
  579|  2.71k|    index=skipWhiteSpace(index);
  580|  2.71k|    if(index==msg.length()) {
  ------------------
  |  Branch (580:8): [True: 122, False: 2.59k]
  ------------------
  581|    122|        setParseError(parseError, 0);  // Unmatched '{' braces in message.
  582|    122|        errorCode=U_UNMATCHED_BRACES;
  583|    122|        return 0;
  584|    122|    }
  585|  2.59k|    char16_t c=msg.charAt(index);
  586|  2.59k|    if(c==u_rightCurlyBrace) {
  ------------------
  |  Branch (586:8): [True: 1.72k, False: 872]
  ------------------
  587|       |        // all done
  588|  1.72k|    } else if(c!=u_comma) {
  ------------------
  |  Branch (588:15): [True: 101, False: 771]
  ------------------
  589|    101|        setParseError(parseError, nameIndex);  // Bad argument syntax.
  590|    101|        errorCode=U_PATTERN_SYNTAX_ERROR;
  591|    101|        return 0;
  592|    771|    } else /* ',' */ {
  593|       |        // parse argument type: case-sensitive a-zA-Z
  594|    771|        int32_t typeIndex=index=skipWhiteSpace(index+1);
  595|  1.80k|        while(index<msg.length() && isArgTypeChar(msg.charAt(index))) {
  ------------------
  |  Branch (595:15): [True: 1.80k, False: 2]
  |  Branch (595:37): [True: 1.03k, False: 769]
  ------------------
  596|  1.03k|            ++index;
  597|  1.03k|        }
  598|    771|        int32_t length=index-typeIndex;
  599|    771|        index=skipWhiteSpace(index);
  600|    771|        if(index==msg.length()) {
  ------------------
  |  Branch (600:12): [True: 2, False: 769]
  ------------------
  601|      2|            setParseError(parseError, 0);  // Unmatched '{' braces in message.
  602|      2|            errorCode=U_UNMATCHED_BRACES;
  603|      2|            return 0;
  604|      2|        }
  605|    769|        if(length==0 || ((c=msg.charAt(index))!=u_comma && c!=u_rightCurlyBrace)) {
  ------------------
  |  Branch (605:12): [True: 16, False: 753]
  |  Branch (605:26): [True: 86, False: 667]
  |  Branch (605:60): [True: 33, False: 53]
  ------------------
  606|     49|            setParseError(parseError, nameIndex);  // Bad argument syntax.
  607|     49|            errorCode=U_PATTERN_SYNTAX_ERROR;
  608|     49|            return 0;
  609|     49|        }
  610|    720|        if(length>Part::MAX_LENGTH) {
  ------------------
  |  Branch (610:12): [True: 0, False: 720]
  ------------------
  611|      0|            setParseError(parseError, nameIndex);  // Argument type name too long.
  612|      0|            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  613|      0|            return 0;
  614|      0|        }
  615|    720|        argType=UMSGPAT_ARG_TYPE_SIMPLE;
  616|    720|        if(length==6) {
  ------------------
  |  Branch (616:12): [True: 51, False: 669]
  ------------------
  617|       |            // case-insensitive comparisons for complex-type names
  618|     51|            if(isChoice(typeIndex)) {
  ------------------
  |  Branch (618:16): [True: 0, False: 51]
  ------------------
  619|      0|                argType=UMSGPAT_ARG_TYPE_CHOICE;
  620|     51|            } else if(isPlural(typeIndex)) {
  ------------------
  |  Branch (620:23): [True: 0, False: 51]
  ------------------
  621|      0|                argType=UMSGPAT_ARG_TYPE_PLURAL;
  622|     51|            } else if(isSelect(typeIndex)) {
  ------------------
  |  Branch (622:23): [True: 0, False: 51]
  ------------------
  623|      0|                argType=UMSGPAT_ARG_TYPE_SELECT;
  624|      0|            }
  625|    669|        } else if(length==13) {
  ------------------
  |  Branch (625:19): [True: 0, False: 669]
  ------------------
  626|      0|            if(isSelect(typeIndex) && isOrdinal(typeIndex+6)) {
  ------------------
  |  Branch (626:16): [True: 0, False: 0]
  |  Branch (626:39): [True: 0, False: 0]
  ------------------
  627|      0|                argType=UMSGPAT_ARG_TYPE_SELECTORDINAL;
  628|      0|            }
  629|      0|        }
  630|       |        // change the ARG_START type from NONE to argType
  631|    720|        partsList->a[argStart].value = static_cast<int16_t>(argType);
  632|    720|        if(argType==UMSGPAT_ARG_TYPE_SIMPLE) {
  ------------------
  |  Branch (632:12): [True: 720, False: 0]
  ------------------
  633|    720|            addPart(UMSGPAT_PART_TYPE_ARG_TYPE, typeIndex, length, 0, errorCode);
  634|    720|        }
  635|       |        // look for an argument style (pattern)
  636|    720|        if(c==u_rightCurlyBrace) {
  ------------------
  |  Branch (636:12): [True: 53, False: 667]
  ------------------
  637|     53|            if(argType!=UMSGPAT_ARG_TYPE_SIMPLE) {
  ------------------
  |  Branch (637:16): [True: 0, False: 53]
  ------------------
  638|      0|                setParseError(parseError, nameIndex);  // No style field for complex argument.
  639|      0|                errorCode=U_PATTERN_SYNTAX_ERROR;
  640|      0|                return 0;
  641|      0|            }
  642|    667|        } else /* ',' */ {
  643|    667|            ++index;
  644|    667|            if(argType==UMSGPAT_ARG_TYPE_SIMPLE) {
  ------------------
  |  Branch (644:16): [True: 667, False: 0]
  ------------------
  645|    667|                index=parseSimpleStyle(index, parseError, errorCode);
  646|    667|            } else if(argType==UMSGPAT_ARG_TYPE_CHOICE) {
  ------------------
  |  Branch (646:23): [True: 0, False: 0]
  ------------------
  647|      0|                index=parseChoiceStyle(index, nestingLevel, parseError, errorCode);
  648|      0|            } else {
  649|      0|                index=parsePluralOrSelectStyle(argType, index, nestingLevel, parseError, errorCode);
  650|      0|            }
  651|    667|        }
  652|    720|    }
  653|       |    // Argument parsing stopped on the '}'.
  654|  2.44k|    addLimitPart(argStart, UMSGPAT_PART_TYPE_ARG_LIMIT, index, 1, argType, errorCode);
  655|  2.44k|    return index+1;
  656|  2.59k|}
_ZN6icu_7814MessagePattern16parseSimpleStyleEiP11UParseErrorR10UErrorCode:
  659|    667|MessagePattern::parseSimpleStyle(int32_t index, UParseError *parseError, UErrorCode &errorCode) {
  660|    667|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (660:8): [True: 0, False: 667]
  ------------------
  661|      0|        return 0;
  662|      0|    }
  663|    667|    int32_t start=index;
  664|    667|    int32_t nestedBraces=0;
  665|  1.28M|    while(index<msg.length()) {
  ------------------
  |  Branch (665:11): [True: 1.28M, False: 97]
  ------------------
  666|  1.28M|        char16_t c=msg.charAt(index++);
  667|  1.28M|        if(c==u_apos) {
  ------------------
  |  Branch (667:12): [True: 44.6k, False: 1.23M]
  ------------------
  668|       |            // Treat apostrophe as quoting but include it in the style part.
  669|       |            // Find the end of the quoted literal text.
  670|  44.6k|            index=msg.indexOf(u_apos, index);
  671|  44.6k|            if(index<0) {
  ------------------
  |  Branch (671:16): [True: 43, False: 44.6k]
  ------------------
  672|       |                // Quoted literal argument style text reaches to the end of the message.
  673|     43|                setParseError(parseError, start);
  674|     43|                errorCode=U_PATTERN_SYNTAX_ERROR;
  675|     43|                return 0;
  676|     43|            }
  677|       |            // skip the quote-ending apostrophe
  678|  44.6k|            ++index;
  679|  1.23M|        } else if(c==u_leftCurlyBrace) {
  ------------------
  |  Branch (679:19): [True: 2.34k, False: 1.23M]
  ------------------
  680|  2.34k|            ++nestedBraces;
  681|  1.23M|        } else if(c==u_rightCurlyBrace) {
  ------------------
  |  Branch (681:19): [True: 815, False: 1.23M]
  ------------------
  682|    815|            if(nestedBraces>0) {
  ------------------
  |  Branch (682:16): [True: 288, False: 527]
  ------------------
  683|    288|                --nestedBraces;
  684|    527|            } else {
  685|    527|                int32_t length=--index-start;
  686|    527|                if(length>Part::MAX_LENGTH) {
  ------------------
  |  Branch (686:20): [True: 1, False: 526]
  ------------------
  687|      1|                    setParseError(parseError, start);  // Argument style text too long.
  688|      1|                    errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  689|      1|                    return 0;
  690|      1|                }
  691|    526|                addPart(UMSGPAT_PART_TYPE_ARG_STYLE, start, length, 0, errorCode);
  692|    526|                return index;
  693|    527|            }
  694|    815|        }  // c is part of literal text
  695|  1.28M|    }
  696|     97|    setParseError(parseError, 0);  // Unmatched '{' braces in message.
  697|     97|    errorCode=U_UNMATCHED_BRACES;
  698|     97|    return 0;
  699|    667|}
_ZN6icu_7814MessagePattern16parseChoiceStyleEiiP11UParseErrorR10UErrorCode:
  703|  9.53k|                                 UParseError *parseError, UErrorCode &errorCode) {
  704|  9.53k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (704:8): [True: 0, False: 9.53k]
  ------------------
  705|      0|        return 0;
  706|      0|    }
  707|  9.53k|    int32_t start=index;
  708|  9.53k|    index=skipWhiteSpace(index);
  709|  9.53k|    if(index==msg.length() || msg.charAt(index)==u_rightCurlyBrace) {
  ------------------
  |  Branch (709:8): [True: 231, False: 9.30k]
  |  Branch (709:31): [True: 2, False: 9.29k]
  ------------------
  710|    233|        setParseError(parseError, 0);  // Missing choice argument pattern.
  711|    233|        errorCode=U_PATTERN_SYNTAX_ERROR;
  712|    233|        return 0;
  713|    233|    }
  714|  41.2k|    for(;;) {
  715|       |        // The choice argument style contains |-separated (number, separator, message) triples.
  716|       |        // Parse the number.
  717|  41.2k|        int32_t numberIndex=index;
  718|  41.2k|        index=skipDouble(index);
  719|  41.2k|        int32_t length=index-numberIndex;
  720|  41.2k|        if(length==0) {
  ------------------
  |  Branch (720:12): [True: 4.92k, False: 36.3k]
  ------------------
  721|  4.92k|            setParseError(parseError, start);  // Bad choice pattern syntax.
  722|  4.92k|            errorCode=U_PATTERN_SYNTAX_ERROR;
  723|  4.92k|            return 0;
  724|  4.92k|        }
  725|  36.3k|        if(length>Part::MAX_LENGTH) {
  ------------------
  |  Branch (725:12): [True: 4, False: 36.3k]
  ------------------
  726|      4|            setParseError(parseError, numberIndex);  // Choice number too long.
  727|      4|            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
  728|      4|            return 0;
  729|      4|        }
  730|  36.3k|        parseDouble(numberIndex, index, true, parseError, errorCode);  // adds ARG_INT or ARG_DOUBLE
  731|  36.3k|        if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (731:12): [True: 654, False: 35.6k]
  ------------------
  732|    654|            return 0;
  733|    654|        }
  734|       |        // Parse the separator.
  735|  35.6k|        index=skipWhiteSpace(index);
  736|  35.6k|        if(index==msg.length()) {
  ------------------
  |  Branch (736:12): [True: 1.01k, False: 34.6k]
  ------------------
  737|  1.01k|            setParseError(parseError, start);  // Bad choice pattern syntax.
  738|  1.01k|            errorCode=U_PATTERN_SYNTAX_ERROR;
  739|  1.01k|            return 0;
  740|  1.01k|        }
  741|  34.6k|        char16_t c=msg.charAt(index);
  742|  34.6k|        if(!(c==u_pound || c==u_lessThan || c==u_lessOrEqual)) {  // U+2264 is <=
  ------------------
  |  Branch (742:14): [True: 811, False: 33.8k]
  |  Branch (742:28): [True: 32.0k, False: 1.77k]
  |  Branch (742:45): [True: 1, False: 1.77k]
  ------------------
  743|  1.77k|            setParseError(parseError, start);  // Expected choice separator (#<\u2264) instead of c.
  744|  1.77k|            errorCode=U_PATTERN_SYNTAX_ERROR;
  745|  1.77k|            return 0;
  746|  1.77k|        }
  747|  32.9k|        addPart(UMSGPAT_PART_TYPE_ARG_SELECTOR, index, 1, 0, errorCode);
  748|       |        // Parse the message fragment.
  749|  32.9k|        index=parseMessage(++index, 0, nestingLevel+1, UMSGPAT_ARG_TYPE_CHOICE, parseError, errorCode);
  750|  32.9k|        if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (750:12): [True: 454, False: 32.4k]
  ------------------
  751|    454|            return 0;
  752|    454|        }
  753|       |        // parseMessage(..., CHOICE) returns the index of the terminator, or msg.length().
  754|  32.4k|        if(index==msg.length()) {
  ------------------
  |  Branch (754:12): [True: 450, False: 32.0k]
  ------------------
  755|    450|            return index;
  756|    450|        }
  757|  32.0k|        if(msg.charAt(index)==u_rightCurlyBrace) {
  ------------------
  |  Branch (757:12): [True: 21, False: 31.9k]
  ------------------
  758|     21|            if(!inMessageFormatPattern(nestingLevel)) {
  ------------------
  |  Branch (758:16): [True: 21, False: 0]
  ------------------
  759|     21|                setParseError(parseError, start);  // Bad choice pattern syntax.
  760|     21|                errorCode=U_PATTERN_SYNTAX_ERROR;
  761|     21|                return 0;
  762|     21|            }
  763|      0|            return index;
  764|     21|        }  // else the terminator is '|'
  765|  31.9k|        index=skipWhiteSpace(index+1);
  766|  31.9k|    }
  767|  9.29k|}
_ZN6icu_7814MessagePattern14parseArgNumberERKNS_13UnicodeStringEii:
  888|  2.75k|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|  2.75k|    if(start>=limit) {
  ------------------
  |  Branch (892:8): [True: 7, False: 2.74k]
  ------------------
  893|      7|        return UMSGPAT_ARG_NAME_NOT_VALID;
  894|      7|    }
  895|  2.74k|    int32_t number;
  896|       |    // Defer numeric errors until we know there are only digits.
  897|  2.74k|    UBool badNumber;
  898|  2.74k|    char16_t c=s.charAt(start++);
  899|  2.74k|    if(c==0x30) {
  ------------------
  |  Branch (899:8): [True: 95, False: 2.64k]
  ------------------
  900|     95|        if(start==limit) {
  ------------------
  |  Branch (900:12): [True: 42, False: 53]
  ------------------
  901|     42|            return 0;
  902|     53|        } else {
  903|     53|            number=0;
  904|     53|            badNumber=true;  // leading zero
  905|     53|        }
  906|  2.64k|    } else if(0x31<=c && c<=0x39) {
  ------------------
  |  Branch (906:15): [True: 1.95k, False: 697]
  |  Branch (906:26): [True: 645, False: 1.30k]
  ------------------
  907|    645|        number=c-0x30;
  908|    645|        badNumber=false;
  909|  2.00k|    } else {
  910|  2.00k|        return UMSGPAT_ARG_NAME_NOT_NUMBER;
  911|  2.00k|    }
  912|  7.59k|    while(start<limit) {
  ------------------
  |  Branch (912:11): [True: 7.52k, False: 74]
  ------------------
  913|  7.52k|        c=s.charAt(start++);
  914|  7.52k|        if(0x30<=c && c<=0x39) {
  ------------------
  |  Branch (914:12): [True: 7.50k, False: 17]
  |  Branch (914:23): [True: 6.90k, False: 607]
  ------------------
  915|  6.90k|            if(number>=INT32_MAX/10) {
  ------------------
  |  Branch (915:16): [True: 975, False: 5.92k]
  ------------------
  916|    975|                badNumber=true;  // overflow
  917|    975|            }
  918|  6.90k|            number=number*10+(c-0x30);
  919|  6.90k|        } else {
  920|    624|            return UMSGPAT_ARG_NAME_NOT_NUMBER;
  921|    624|        }
  922|  7.52k|    }
  923|       |    // There are only ASCII digits.
  924|     74|    if(badNumber) {
  ------------------
  |  Branch (924:8): [True: 10, False: 64]
  ------------------
  925|     10|        return UMSGPAT_ARG_NAME_NOT_VALID;
  926|     64|    } else {
  927|     64|        return number;
  928|     64|    }
  929|     74|}
_ZN6icu_7814MessagePattern11parseDoubleEiiaP11UParseErrorR10UErrorCode:
  933|  36.3k|                            UParseError *parseError, UErrorCode &errorCode) {
  934|  36.3k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (934:8): [True: 0, False: 36.3k]
  ------------------
  935|      0|        return;
  936|      0|    }
  937|  36.3k|    U_ASSERT(start<limit);
  ------------------
  |  |   35|  36.3k|#   define U_ASSERT(exp) (void)0
  ------------------
  938|       |    // fake loop for easy exit and single throw statement
  939|  36.3k|    for(;;) { /*loop doesn't iterate*/
  940|       |        // fast path for small integers and infinity
  941|  36.3k|        int32_t value=0;
  942|  36.3k|        int32_t isNegative=0;  // not boolean so that we can easily add it to value
  943|  36.3k|        int32_t index=start;
  944|  36.3k|        char16_t c=msg.charAt(index++);
  945|  36.3k|        if(c==u_minus) {
  ------------------
  |  Branch (945:12): [True: 264, False: 36.0k]
  ------------------
  946|    264|            isNegative=1;
  947|    264|            if(index==limit) {
  ------------------
  |  Branch (947:16): [True: 53, False: 211]
  ------------------
  948|     53|                break;  // no number
  949|     53|            }
  950|    211|            c=msg.charAt(index++);
  951|  36.0k|        } else if(c==u_plus) {
  ------------------
  |  Branch (951:19): [True: 37, False: 36.0k]
  ------------------
  952|     37|            if(index==limit) {
  ------------------
  |  Branch (952:16): [True: 2, False: 35]
  ------------------
  953|      2|                break;  // no number
  954|      2|            }
  955|     35|            c=msg.charAt(index++);
  956|     35|        }
  957|  36.2k|        if(c==0x221e) {  // infinity
  ------------------
  |  Branch (957:12): [True: 22, False: 36.2k]
  ------------------
  958|     22|            if(allowInfinity && index==limit) {
  ------------------
  |  Branch (958:16): [True: 22, False: 0]
  |  Branch (958:33): [True: 13, False: 9]
  ------------------
  959|     13|                double infinity=uprv_getInfinity();
  ------------------
  |  | 1506|     13|#define uprv_getInfinity U_ICU_ENTRY_POINT_RENAME(uprv_getInfinity)
  |  |  ------------------
  |  |  |  |  123|     13|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     13|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     13|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  960|     13|                addArgDoublePart(
  961|     13|                    isNegative!=0 ? -infinity : infinity,
  ------------------
  |  Branch (961:21): [True: 2, False: 11]
  ------------------
  962|     13|                    start, limit-start, errorCode);
  963|     13|                return;
  964|     13|            } else {
  965|      9|                break;
  966|      9|            }
  967|     22|        }
  968|       |        // try to parse the number as a small integer but fall back to a double
  969|  46.4k|        while('0'<=c && c<='9') {
  ------------------
  |  Branch (969:15): [True: 46.0k, False: 452]
  |  Branch (969:25): [True: 45.3k, False: 704]
  ------------------
  970|  45.3k|            value=value*10+(c-'0');
  971|  45.3k|            if(value>(Part::MAX_VALUE+isNegative)) {
  ------------------
  |  Branch (971:16): [True: 1.44k, False: 43.8k]
  ------------------
  972|  1.44k|                break;  // not a small-enough integer
  973|  1.44k|            }
  974|  43.8k|            if(index==limit) {
  ------------------
  |  Branch (974:16): [True: 33.6k, False: 10.2k]
  ------------------
  975|  33.6k|                addPart(UMSGPAT_PART_TYPE_ARG_INT, start, limit-start,
  976|  33.6k|                        isNegative!=0 ? -value : value, errorCode);
  ------------------
  |  Branch (976:25): [True: 51, False: 33.6k]
  ------------------
  977|  33.6k|                return;
  978|  33.6k|            }
  979|  10.2k|            c=msg.charAt(index++);
  980|  10.2k|        }
  981|       |        // Let Double.parseDouble() throw a NumberFormatException.
  982|  2.60k|        char numberChars[128];
  983|  2.60k|        int32_t capacity = static_cast<int32_t>(sizeof(numberChars));
  984|  2.60k|        int32_t length=limit-start;
  985|  2.60k|        if(length>=capacity) {
  ------------------
  |  Branch (985:12): [True: 109, False: 2.49k]
  ------------------
  986|    109|            break;  // number too long
  987|    109|        }
  988|  2.49k|        msg.extract(start, length, numberChars, capacity, US_INV);
  ------------------
  |  |   98|  2.49k|#define US_INV icu::UnicodeString::kInvariant
  ------------------
  989|  2.49k|        if (static_cast<int32_t>(uprv_strlen(numberChars)) < length) {
  ------------------
  |  |   37|  2.49k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  2.49k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (989:13): [True: 5, False: 2.49k]
  ------------------
  990|      5|            break;  // contains non-invariant character that was turned into NUL
  991|      5|        }
  992|  2.49k|        char *end;
  993|  2.49k|        double numericValue=uprv_strtod(numberChars, &end);
  ------------------
  |  |   75|  2.49k|#define uprv_strtod(source, end) U_STANDARD_CPP_NAMESPACE strtod(source, end)
  |  |  ------------------
  |  |  |  |  393|  2.49k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  994|  2.49k|        if(end!=(numberChars+length)) {
  ------------------
  |  Branch (994:12): [True: 476, False: 2.01k]
  ------------------
  995|    476|            break;  // parsing error
  996|    476|        }
  997|  2.01k|        addArgDoublePart(numericValue, start, length, errorCode);
  998|  2.01k|        return;
  999|  2.49k|    }
 1000|    654|    setParseError(parseError, start /*, limit*/);  // Bad syntax for numeric value.
 1001|    654|    errorCode=U_PATTERN_SYNTAX_ERROR;
 1002|    654|}
_ZN6icu_7814MessagePattern14skipWhiteSpaceEi:
 1005|  84.2k|MessagePattern::skipWhiteSpace(int32_t index) {
 1006|  84.2k|    const char16_t *s=msg.getBuffer();
 1007|  84.2k|    int32_t msgLength=msg.length();
 1008|  84.2k|    const char16_t *t=PatternProps::skipWhiteSpace(s+index, msgLength-index);
 1009|  84.2k|    return static_cast<int32_t>(t - s);
 1010|  84.2k|}
_ZN6icu_7814MessagePattern14skipIdentifierEi:
 1013|  2.75k|MessagePattern::skipIdentifier(int32_t index) {
 1014|  2.75k|    const char16_t *s=msg.getBuffer();
 1015|  2.75k|    int32_t msgLength=msg.length();
 1016|  2.75k|    const char16_t *t=PatternProps::skipIdentifier(s+index, msgLength-index);
 1017|  2.75k|    return static_cast<int32_t>(t - s);
 1018|  2.75k|}
_ZN6icu_7814MessagePattern10skipDoubleEi:
 1021|  41.2k|MessagePattern::skipDouble(int32_t index) {
 1022|  41.2k|    int32_t msgLength=msg.length();
 1023|  1.13M|    while(index<msgLength) {
  ------------------
  |  Branch (1023:11): [True: 1.13M, False: 1.18k]
  ------------------
 1024|  1.13M|        char16_t c=msg.charAt(index);
 1025|       |        // U+221E: Allow the infinity symbol, for ChoiceFormat patterns.
 1026|  1.13M|        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: 5.13k, False: 1.12M]
  |  Branch (1026:23): [True: 4.22k, False: 908]
  |  Branch (1026:36): [True: 2.86k, False: 1.36k]
  |  Branch (1026:50): [True: 2.09k, False: 767]
  |  Branch (1026:64): [True: 39.3k, False: 1.09M]
  |  Branch (1026:74): [True: 38.7k, False: 603]
  |  Branch (1026:84): [True: 38.2k, False: 469]
  |  Branch (1026:94): [True: 38.0k, False: 286]
  ------------------
 1027|  40.0k|            break;
 1028|  40.0k|        }
 1029|  1.09M|        ++index;
 1030|  1.09M|    }
 1031|  41.2k|    return index;
 1032|  41.2k|}
_ZN6icu_7814MessagePattern13isArgTypeCharEi:
 1035|  1.80k|MessagePattern::isArgTypeChar(UChar32 c) {
 1036|  1.80k|    return (u_a<=c && c<=u_z) || (u_A<=c && c<=u_Z);
  ------------------
  |  Branch (1036:13): [True: 390, False: 1.41k]
  |  Branch (1036:23): [True: 298, False: 92]
  |  Branch (1036:35): [True: 831, False: 676]
  |  Branch (1036:45): [True: 738, False: 93]
  ------------------
 1037|  1.80k|}
_ZN6icu_7814MessagePattern8isChoiceEi:
 1040|     51|MessagePattern::isChoice(int32_t index) {
 1041|     51|    char16_t c;
 1042|     51|    return
 1043|     51|        ((c=msg.charAt(index++))==u_c || c==u_C) &&
  ------------------
  |  Branch (1043:10): [True: 51, False: 0]
  |  Branch (1043:42): [True: 0, False: 0]
  ------------------
 1044|     51|        ((c=msg.charAt(index++))==u_h || c==u_H) &&
  ------------------
  |  Branch (1044:10): [True: 0, False: 51]
  |  Branch (1044:42): [True: 51, False: 0]
  ------------------
 1045|     51|        ((c=msg.charAt(index++))==u_o || c==u_O) &&
  ------------------
  |  Branch (1045:10): [True: 51, False: 0]
  |  Branch (1045:42): [True: 0, False: 0]
  ------------------
 1046|     51|        ((c=msg.charAt(index++))==u_i || c==u_I) &&
  ------------------
  |  Branch (1046:10): [True: 0, False: 51]
  |  Branch (1046:42): [True: 0, False: 51]
  ------------------
 1047|     51|        ((c=msg.charAt(index++))==u_c || c==u_C) &&
  ------------------
  |  Branch (1047:10): [True: 0, False: 0]
  |  Branch (1047:42): [True: 0, False: 0]
  ------------------
 1048|     51|        ((c=msg.charAt(index))==u_e || c==u_E);
  ------------------
  |  Branch (1048:10): [True: 0, False: 0]
  |  Branch (1048:40): [True: 0, False: 0]
  ------------------
 1049|     51|}
_ZN6icu_7814MessagePattern8isPluralEi:
 1052|     51|MessagePattern::isPlural(int32_t index) {
 1053|     51|    char16_t c;
 1054|     51|    return
 1055|     51|        ((c=msg.charAt(index++))==u_p || c==u_P) &&
  ------------------
  |  Branch (1055:10): [True: 0, False: 51]
  |  Branch (1055:42): [True: 0, False: 51]
  ------------------
 1056|     51|        ((c=msg.charAt(index++))==u_l || c==u_L) &&
  ------------------
  |  Branch (1056:10): [True: 0, False: 0]
  |  Branch (1056:42): [True: 0, False: 0]
  ------------------
 1057|     51|        ((c=msg.charAt(index++))==u_u || c==u_U) &&
  ------------------
  |  Branch (1057:10): [True: 0, False: 0]
  |  Branch (1057:42): [True: 0, False: 0]
  ------------------
 1058|     51|        ((c=msg.charAt(index++))==u_r || c==u_R) &&
  ------------------
  |  Branch (1058:10): [True: 0, False: 0]
  |  Branch (1058:42): [True: 0, False: 0]
  ------------------
 1059|     51|        ((c=msg.charAt(index++))==u_a || c==u_A) &&
  ------------------
  |  Branch (1059:10): [True: 0, False: 0]
  |  Branch (1059:42): [True: 0, False: 0]
  ------------------
 1060|     51|        ((c=msg.charAt(index))==u_l || c==u_L);
  ------------------
  |  Branch (1060:10): [True: 0, False: 0]
  |  Branch (1060:40): [True: 0, False: 0]
  ------------------
 1061|     51|}
_ZN6icu_7814MessagePattern8isSelectEi:
 1064|     51|MessagePattern::isSelect(int32_t index) {
 1065|     51|    char16_t c;
 1066|     51|    return
 1067|     51|        ((c=msg.charAt(index++))==u_s || c==u_S) &&
  ------------------
  |  Branch (1067:10): [True: 0, False: 51]
  |  Branch (1067:42): [True: 0, False: 51]
  ------------------
 1068|     51|        ((c=msg.charAt(index++))==u_e || c==u_E) &&
  ------------------
  |  Branch (1068:10): [True: 0, False: 0]
  |  Branch (1068:42): [True: 0, False: 0]
  ------------------
 1069|     51|        ((c=msg.charAt(index++))==u_l || c==u_L) &&
  ------------------
  |  Branch (1069:10): [True: 0, False: 0]
  |  Branch (1069:42): [True: 0, False: 0]
  ------------------
 1070|     51|        ((c=msg.charAt(index++))==u_e || c==u_E) &&
  ------------------
  |  Branch (1070:10): [True: 0, False: 0]
  |  Branch (1070:42): [True: 0, False: 0]
  ------------------
 1071|     51|        ((c=msg.charAt(index++))==u_c || c==u_C) &&
  ------------------
  |  Branch (1071:10): [True: 0, False: 0]
  |  Branch (1071:42): [True: 0, False: 0]
  ------------------
 1072|     51|        ((c=msg.charAt(index))==u_t || c==u_T);
  ------------------
  |  Branch (1072:10): [True: 0, False: 0]
  |  Branch (1072:40): [True: 0, False: 0]
  ------------------
 1073|     51|}
_ZN6icu_7814MessagePattern22inMessageFormatPatternEi:
 1089|     21|MessagePattern::inMessageFormatPattern(int32_t nestingLevel) {
 1090|     21|    return nestingLevel>0 || partsList->a[0].type==UMSGPAT_PART_TYPE_MSG_START;
  ------------------
  |  Branch (1090:12): [True: 0, False: 21]
  |  Branch (1090:30): [True: 0, False: 21]
  ------------------
 1091|     21|}
_ZN6icu_7814MessagePattern23inTopLevelChoiceMessageEi22UMessagePatternArgType:
 1094|    450|MessagePattern::inTopLevelChoiceMessage(int32_t nestingLevel, UMessagePatternArgType parentType) {
 1095|    450|    return
 1096|    450|        nestingLevel==1 &&
  ------------------
  |  Branch (1096:9): [True: 450, False: 0]
  ------------------
 1097|    450|        parentType==UMSGPAT_ARG_TYPE_CHOICE &&
  ------------------
  |  Branch (1097:9): [True: 450, False: 0]
  ------------------
 1098|    450|        partsList->a[0].type!=UMSGPAT_PART_TYPE_MSG_START;
  ------------------
  |  Branch (1098:9): [True: 450, False: 0]
  ------------------
 1099|    450|}
_ZN6icu_7814MessagePattern7addPartE23UMessagePatternPartTypeiiiR10UErrorCode:
 1103|   477k|                        int32_t value, UErrorCode &errorCode) {
 1104|   477k|    if(partsList->ensureCapacityForOneMore(partsLength, errorCode)) {
  ------------------
  |  Branch (1104:8): [True: 477k, False: 141]
  ------------------
 1105|   477k|        Part &part=partsList->a[partsLength++];
 1106|   477k|        part.type=type;
 1107|   477k|        part.index=index;
 1108|   477k|        part.length = static_cast<uint16_t>(length);
 1109|   477k|        part.value = static_cast<int16_t>(value);
 1110|   477k|        part.limitPartIndex=0;
 1111|   477k|    }
 1112|   477k|}
_ZN6icu_7814MessagePattern12addLimitPartEi23UMessagePatternPartTypeiiiR10UErrorCode:
 1117|  34.8k|                             int32_t value, UErrorCode &errorCode) {
 1118|  34.8k|    partsList->a[start].limitPartIndex=partsLength;
 1119|  34.8k|    addPart(type, index, length, value, errorCode);
 1120|  34.8k|}
_ZN6icu_7814MessagePattern16addArgDoublePartEdiiR10UErrorCode:
 1124|  2.02k|                                 UErrorCode &errorCode) {
 1125|  2.02k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (1125:8): [True: 0, False: 2.02k]
  ------------------
 1126|      0|        return;
 1127|      0|    }
 1128|  2.02k|    int32_t numericIndex=numericValuesLength;
 1129|  2.02k|    if(numericValuesList==nullptr) {
  ------------------
  |  Branch (1129:8): [True: 1.99k, False: 34]
  ------------------
 1130|  1.99k|        numericValuesList=new MessagePatternDoubleList();
 1131|  1.99k|        if(numericValuesList==nullptr) {
  ------------------
  |  Branch (1131:12): [True: 0, False: 1.99k]
  ------------------
 1132|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
 1133|      0|            return;
 1134|      0|        }
 1135|  1.99k|    } else if(!numericValuesList->ensureCapacityForOneMore(numericValuesLength, errorCode)) {
  ------------------
  |  Branch (1135:15): [True: 0, False: 34]
  ------------------
 1136|      0|        return;
 1137|     34|    } else {
 1138|     34|        if(numericIndex>Part::MAX_VALUE) {
  ------------------
  |  Branch (1138:12): [True: 0, False: 34]
  ------------------
 1139|      0|            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
 1140|      0|            return;
 1141|      0|        }
 1142|     34|    }
 1143|  2.02k|    numericValuesList->a[numericValuesLength++]=numericValue;
 1144|  2.02k|    addPart(UMSGPAT_PART_TYPE_ARG_DOUBLE, start, length, numericIndex, errorCode);
 1145|  2.02k|}
_ZN6icu_7814MessagePattern13setParseErrorEP11UParseErrori:
 1148|  9.08k|MessagePattern::setParseError(UParseError *parseError, int32_t index) {
 1149|  9.08k|    if(parseError==nullptr) {
  ------------------
  |  Branch (1149:8): [True: 9.08k, False: 0]
  ------------------
 1150|  9.08k|        return;
 1151|  9.08k|    }
 1152|      0|    parseError->offset=index;
 1153|       |
 1154|       |    // Set preContext to some of msg before index.
 1155|       |    // Avoid splitting a surrogate pair.
 1156|      0|    int32_t length=index;
 1157|      0|    if(length>=U_PARSE_CONTEXT_LEN) {
  ------------------
  |  Branch (1157:8): [True: 0, False: 0]
  ------------------
 1158|      0|        length=U_PARSE_CONTEXT_LEN-1;
 1159|      0|        if(length>0 && U16_IS_TRAIL(msg[index-length])) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1159:12): [True: 0, False: 0]
  ------------------
 1160|      0|            --length;
 1161|      0|        }
 1162|      0|    }
 1163|      0|    msg.extract(index-length, length, parseError->preContext);
 1164|      0|    parseError->preContext[length]=0;
 1165|       |
 1166|       |    // Set postContext to some of msg starting at index.
 1167|      0|    length=msg.length()-index;
 1168|      0|    if(length>=U_PARSE_CONTEXT_LEN) {
  ------------------
  |  Branch (1168:8): [True: 0, False: 0]
  ------------------
 1169|      0|        length=U_PARSE_CONTEXT_LEN-1;
 1170|      0|        if(length>0 && U16_IS_LEAD(msg[index+length-1])) {
  ------------------
  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1170:12): [True: 0, False: 0]
  ------------------
 1171|      0|            --length;
 1172|      0|        }
 1173|      0|    }
 1174|      0|    msg.extract(index, length, parseError->postContext);
 1175|      0|    parseError->postContext[length]=0;
 1176|      0|}
_ZN6icu_7818MessagePatternListINS_14MessagePattern4PartELi32EEC2Ev:
   93|  9.53k|    MessagePatternList() {}
_ZN6icu_7818MessagePatternListIdLi8EEC2Ev:
   93|  1.99k|    MessagePatternList() {}
_ZN6icu_7818MessagePatternListINS_14MessagePattern4PartELi32EE24ensureCapacityForOneMoreEiR10UErrorCode:
  125|   477k|MessagePatternList<T, stackCapacity>::ensureCapacityForOneMore(int32_t oldLength, UErrorCode &errorCode) {
  126|   477k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (126:8): [True: 141, False: 477k]
  ------------------
  127|    141|        return false;
  128|    141|    }
  129|   477k|    if(a.getCapacity()>oldLength || a.resize(2*oldLength, oldLength)!=nullptr) {
  ------------------
  |  Branch (129:8): [True: 476k, False: 975]
  |  Branch (129:37): [True: 975, False: 0]
  ------------------
  130|   477k|        return true;
  131|   477k|    }
  132|      0|    errorCode=U_MEMORY_ALLOCATION_ERROR;
  133|      0|    return false;
  134|   477k|}
_ZN6icu_7818MessagePatternListIdLi8EE24ensureCapacityForOneMoreEiR10UErrorCode:
  125|     34|MessagePatternList<T, stackCapacity>::ensureCapacityForOneMore(int32_t oldLength, UErrorCode &errorCode) {
  126|     34|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (126:8): [True: 0, False: 34]
  ------------------
  127|      0|        return false;
  128|      0|    }
  129|     34|    if(a.getCapacity()>oldLength || a.resize(2*oldLength, oldLength)!=nullptr) {
  ------------------
  |  Branch (129:8): [True: 32, False: 2]
  |  Branch (129:37): [True: 2, False: 0]
  ------------------
  130|     34|        return true;
  131|     34|    }
  132|      0|    errorCode=U_MEMORY_ALLOCATION_ERROR;
  133|      0|    return false;
  134|     34|}

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

_ZN6icu_7813ParsePositionD2Ev:
   16|  65.2M|ParsePosition::~ParsePosition() {}

_ZN6icu_7812PatternProps20isSyntaxOrWhiteSpaceEi:
  137|   196k|PatternProps::isSyntaxOrWhiteSpace(UChar32 c) {
  138|   196k|    if(c<0) {
  ------------------
  |  Branch (138:8): [True: 0, False: 196k]
  ------------------
  139|      0|        return false;
  140|   196k|    } else if(c<=0xff) {
  ------------------
  |  Branch (140:15): [True: 17.8k, False: 178k]
  ------------------
  141|  17.8k|        return latin1[c] & 1;
  142|   178k|    } else if(c<0x200e) {
  ------------------
  |  Branch (142:15): [True: 158k, False: 19.5k]
  ------------------
  143|   158k|        return false;
  144|   158k|    } else if(c<=0x3030) {
  ------------------
  |  Branch (144:15): [True: 356, False: 19.2k]
  ------------------
  145|    356|        uint32_t bits=syntaxOrWhiteSpace2000[index2000[(c-0x2000)>>5]];
  146|    356|        return (bits >> (c & 0x1f)) & 1;
  147|  19.2k|    } else if(0xfd3e<=c && c<=0xfe46) {
  ------------------
  |  Branch (147:15): [True: 2.16k, False: 17.0k]
  |  Branch (147:28): [True: 416, False: 1.74k]
  ------------------
  148|    416|        return c<=0xfd3f || 0xfe45<=c;
  ------------------
  |  Branch (148:16): [True: 1, False: 415]
  |  Branch (148:29): [True: 0, False: 415]
  ------------------
  149|  18.8k|    } else {
  150|  18.8k|        return false;
  151|  18.8k|    }
  152|   196k|}
_ZN6icu_7812PatternProps12isWhiteSpaceEi:
  155|   886k|PatternProps::isWhiteSpace(UChar32 c) {
  156|   886k|    if(c<0) {
  ------------------
  |  Branch (156:8): [True: 19, False: 886k]
  ------------------
  157|     19|        return false;
  158|   886k|    } else if(c<=0xff) {
  ------------------
  |  Branch (158:15): [True: 787k, False: 99.8k]
  ------------------
  159|   787k|        return (latin1[c] >> 2) & 1;
  160|   787k|    } else if(0x200e<=c && c<=0x2029) {
  ------------------
  |  Branch (160:15): [True: 78.6k, False: 21.1k]
  |  Branch (160:28): [True: 17.3k, False: 61.2k]
  ------------------
  161|  17.3k|        return c<=0x200f || 0x2028<=c;
  ------------------
  |  Branch (161:16): [True: 9.61k, False: 7.75k]
  |  Branch (161:29): [True: 7.56k, False: 195]
  ------------------
  162|  82.4k|    } else {
  163|  82.4k|        return false;
  164|  82.4k|    }
  165|   886k|}
_ZN6icu_7812PatternProps14skipWhiteSpaceEPKDsi:
  168|  84.2k|PatternProps::skipWhiteSpace(const char16_t *s, int32_t length) {
  169|  89.7k|    while(length>0 && isWhiteSpace(*s)) {
  ------------------
  |  Branch (169:11): [True: 88.3k, False: 1.39k]
  |  Branch (169:23): [True: 5.54k, False: 82.8k]
  ------------------
  170|  5.54k|        ++s;
  171|  5.54k|        --length;
  172|  5.54k|    }
  173|  84.2k|    return s;
  174|  84.2k|}
_ZN6icu_7812PatternProps14skipIdentifierEPKDsi:
  222|  2.75k|PatternProps::skipIdentifier(const char16_t *s, int32_t length) {
  223|   196k|    while(length>0 && !isSyntaxOrWhiteSpace(*s)) {
  ------------------
  |  Branch (223:11): [True: 196k, False: 142]
  |  Branch (223:23): [True: 193k, False: 2.60k]
  ------------------
  224|   193k|        ++s;
  225|   193k|        --length;
  226|   193k|    }
  227|  2.75k|    return s;
  228|  2.75k|}

_ZN6icu_7812PropNameData12findPropertyEi:
  148|      8|int32_t PropNameData::findProperty(int32_t property) {
  149|      8|    int32_t i=1;  // valueMaps index, initially after numRanges
  150|     21|    for(int32_t numRanges=valueMaps[0]; numRanges>0; --numRanges) {
  ------------------
  |  Branch (150:41): [True: 21, False: 0]
  ------------------
  151|       |        // Read and skip the start and limit of this range.
  152|     21|        int32_t start=valueMaps[i];
  153|     21|        int32_t limit=valueMaps[i+1];
  154|     21|        i+=2;
  155|     21|        if(property<start) {
  ------------------
  |  Branch (155:12): [True: 0, False: 21]
  ------------------
  156|      0|            break;
  157|      0|        }
  158|     21|        if(property<limit) {
  ------------------
  |  Branch (158:12): [True: 8, False: 13]
  ------------------
  159|      8|            return i+(property-start)*2;
  160|      8|        }
  161|     13|        i+=(limit-start)*2;  // Skip all entries for this range.
  162|     13|    }
  163|      0|    return 0;
  164|      8|}
_ZN6icu_7812PropNameData12containsNameERNS_9BytesTrieEPKc:
  219|     11|UBool PropNameData::containsName(BytesTrie &trie, const char *name) {
  220|     11|    if(name==nullptr) {
  ------------------
  |  Branch (220:8): [True: 0, False: 11]
  ------------------
  221|      0|        return false;
  222|      0|    }
  223|     11|    UStringTrieResult result=USTRINGTRIE_NO_VALUE;
  224|     11|    char c;
  225|     70|    while((c=*name++)!=0) {
  ------------------
  |  Branch (225:11): [True: 65, False: 5]
  ------------------
  226|     65|        c=uprv_invCharToLowercaseAscii(c);
  ------------------
  |  |  193|     65|#   define uprv_invCharToLowercaseAscii uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|     65|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|     65|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|     65|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|     65|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  227|       |        // Ignore delimiters '-', '_', and ASCII White_Space.
  228|     65|        if(c==0x2d || c==0x5f || c==0x20 || (0x09<=c && c<=0x0d)) {
  ------------------
  |  Branch (228:12): [True: 0, False: 65]
  |  Branch (228:23): [True: 3, False: 62]
  |  Branch (228:34): [True: 0, False: 62]
  |  Branch (228:46): [True: 62, False: 0]
  |  Branch (228:57): [True: 0, False: 62]
  ------------------
  229|      3|            continue;
  230|      3|        }
  231|     62|        if(!USTRINGTRIE_HAS_NEXT(result)) {
  ------------------
  |  |   95|     62|#define USTRINGTRIE_HAS_NEXT(result) ((result)&1)
  ------------------
  |  Branch (231:12): [True: 6, False: 56]
  ------------------
  232|      6|            return false;
  233|      6|        }
  234|     56|        result = trie.next(static_cast<uint8_t>(c));
  235|     56|    }
  236|      5|    return USTRINGTRIE_HAS_VALUE(result);
  ------------------
  |  |   86|      5|#define USTRINGTRIE_HAS_VALUE(result) ((result)>=USTRINGTRIE_FINAL_VALUE)
  ------------------
  237|     11|}
_ZN6icu_7812PropNameData22getPropertyOrValueEnumEiPKc:
  259|     11|int32_t PropNameData::getPropertyOrValueEnum(int32_t bytesTrieOffset, const char *alias) {
  260|     11|    BytesTrie trie(bytesTries+bytesTrieOffset);
  261|     11|    if(containsName(trie, alias)) {
  ------------------
  |  Branch (261:8): [True: 5, False: 6]
  ------------------
  262|      5|        return trie.getValue();
  263|      6|    } else {
  264|      6|        return UCHAR_INVALID_CODE;
  265|      6|    }
  266|     11|}
_ZN6icu_7812PropNameData15getPropertyEnumEPKc:
  268|      3|int32_t PropNameData::getPropertyEnum(const char *alias) {
  269|      3|    return getPropertyOrValueEnum(0, alias);
  270|      3|}
_ZN6icu_7812PropNameData20getPropertyValueEnumEiPKc:
  272|      8|int32_t PropNameData::getPropertyValueEnum(int32_t property, const char *alias) {
  273|      8|    int32_t valueMapIndex=findProperty(property);
  274|      8|    if(valueMapIndex==0) {
  ------------------
  |  Branch (274:8): [True: 0, False: 8]
  ------------------
  275|      0|        return UCHAR_INVALID_CODE;  // Not a known property.
  276|      0|    }
  277|      8|    valueMapIndex=valueMaps[valueMapIndex+1];
  278|      8|    if(valueMapIndex==0) {
  ------------------
  |  Branch (278:8): [True: 0, False: 8]
  ------------------
  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|      8|    return getPropertyOrValueEnum(valueMaps[valueMapIndex], alias);
  284|      8|}
u_getPropertyEnum_78:
  301|      3|u_getPropertyEnum(const char* alias) {
  302|      3|    U_NAMESPACE_USE
  ------------------
  |  |  112|      3|#   define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
  ------------------
  303|      3|    return (UProperty)PropNameData::getPropertyEnum(alias);
  304|      3|}
u_getPropertyValueEnum_78:
  319|      8|                       const char* alias) {
  320|      8|    U_NAMESPACE_USE
  ------------------
  |  |  112|      8|#   define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
  ------------------
  321|      8|    return PropNameData::getPropertyValueEnum(property, alias);
  322|      8|}

uprv_isNaN_78:
  340|  6.04M|{
  341|  6.04M|#if IEEE_754
  342|  6.04M|    BitPatternConversion convertedNumber;
  343|  6.04M|    convertedNumber.d64 = number;
  344|       |    /* Infinity is 0x7FF0000000000000U. Anything greater than that is a NaN */
  345|  6.04M|    return (convertedNumber.i64 & U_INT64_MAX) > gInf.i64;
  ------------------
  |  |  249|  6.04M|#     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|  6.04M|}
uprv_isInfinite_78:
  366|  5.70k|{
  367|  5.70k|#if IEEE_754
  368|  5.70k|    BitPatternConversion convertedNumber;
  369|  5.70k|    convertedNumber.d64 = number;
  370|       |    /* Infinity is exactly 0x7FF0000000000000U. */
  371|  5.70k|    return (convertedNumber.i64 & U_INT64_MAX) == gInf.i64;
  ------------------
  |  |  249|  5.70k|#     define U_INT64_MAX       ((int64_t)(INT64_C(9223372036854775807)))
  ------------------
  372|       |#elif U_PLATFORM == U_PF_OS390
  373|       |    uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number,
  374|       |                        sizeof(uint32_t));
  375|       |    uint32_t lowBits  = *(uint32_t*)u_bottomNBytesOfDouble(&number,
  376|       |                        sizeof(uint32_t));
  377|       |
  378|       |    return ((highBits  & ~SIGN) == 0x70FF0000L) && (lowBits == 0x00000000L);
  379|       |
  380|       |#else
  381|       |    /* If your platform doesn't support IEEE 754 but *does* have an infinity*/
  382|       |    /* value, you'll need to replace this default implementation with what's*/
  383|       |    /* correct for your platform.*/
  384|       |    return number == (2.0 * number);
  385|       |#endif
  386|  5.70k|}
uprv_getNaN_78:
  414|  22.0k|{
  415|  22.0k|#if IEEE_754 || U_PLATFORM == U_PF_OS390
  416|  22.0k|    return gNan.d64;
  417|       |#else
  418|       |    /* If your platform doesn't support IEEE 754 but *does* have an NaN value,*/
  419|       |    /* you'll need to replace this default implementation with what's correct*/
  420|       |    /* for your platform.*/
  421|       |    return 0.0;
  422|       |#endif
  423|  22.0k|}
uprv_getInfinity_78:
  427|     22|{
  428|     22|#if IEEE_754 || U_PLATFORM == U_PF_OS390
  429|     22|    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|     22|}
uprv_floor_78:
  440|  6.03M|{
  441|  6.03M|    return floor(x);
  442|  6.03M|}
uprv_round_78:
  452|  2.58k|{
  453|  2.58k|    return uprv_floor(x + 0.5);
  ------------------
  |  | 1499|  2.58k|#define uprv_floor U_ICU_ENTRY_POINT_RENAME(uprv_floor)
  |  |  ------------------
  |  |  |  |  123|  2.58k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.58k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.58k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  454|  2.58k|}
uprv_fmod_78:
  470|  3.21M|{
  471|  3.21M|    return fmod(x, y);
  472|  3.21M|}
uprv_add32_overflow_78:
  524|  15.9M|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|  15.9M|    auto a64 = static_cast<int64_t>(a);
  528|  15.9M|    auto b64 = static_cast<int64_t>(b);
  529|  15.9M|    int64_t res64 = a64 + b64;
  530|  15.9M|    *res = static_cast<int32_t>(res64);
  531|  15.9M|    return res64 != *res;
  532|  15.9M|}
uprv_trunc_78:
  554|  5.70k|{
  555|  5.70k|#if IEEE_754
  556|       |    /* handle error cases*/
  557|  5.70k|    if(uprv_isNaN(d))
  ------------------
  |  | 1519|  5.70k|#define uprv_isNaN U_ICU_ENTRY_POINT_RENAME(uprv_isNaN)
  |  |  ------------------
  |  |  |  |  123|  5.70k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.70k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.70k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (557:8): [True: 0, False: 5.70k]
  ------------------
  558|      0|        return uprv_getNaN();
  ------------------
  |  | 1509|      0|#define uprv_getNaN U_ICU_ENTRY_POINT_RENAME(uprv_getNaN)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  559|  5.70k|    if(uprv_isInfinite(d))
  ------------------
  |  | 1516|  5.70k|#define uprv_isInfinite U_ICU_ENTRY_POINT_RENAME(uprv_isInfinite)
  |  |  ------------------
  |  |  |  |  123|  5.70k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.70k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.70k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (559:8): [True: 9, False: 5.69k]
  ------------------
  560|      9|        return uprv_getInfinity();
  ------------------
  |  | 1506|      9|#define uprv_getInfinity U_ICU_ENTRY_POINT_RENAME(uprv_getInfinity)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  561|       |
  562|  5.69k|    if(u_signBit(d))    /* Signbit() picks up -0.0;  d<0 does not. */
  ------------------
  |  Branch (562:8): [True: 5, False: 5.69k]
  ------------------
  563|      5|        return ceil(d);
  564|  5.69k|    else
  565|  5.69k|        return floor(d);
  566|       |
  567|       |#else
  568|       |    return d >= 0 ? floor(d) : ceil(d);
  569|       |
  570|       |#endif
  571|  5.69k|}
uprv_maxMantissa_78:
  579|  6.03M|{
  580|  6.03M|    return pow(2.0, DBL_MANT_DIG + 1.0) - 1.0;
  581|  6.03M|}
uprv_log_78:
  585|   736k|{
  586|   736k|    return log(d);
  587|   736k|}
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|    988|{
 1356|    988|  if(!path || !*path) {
  ------------------
  |  Branch (1356:6): [True: 0, False: 988]
  |  Branch (1356:15): [True: 0, False: 988]
  ------------------
 1357|      0|    return false;
 1358|      0|  }
 1359|       |
 1360|    988|  if(*path == U_FILE_SEP_CHAR) {
  ------------------
  |  |  130|    988|#   define U_FILE_SEP_CHAR '/'
  ------------------
  |  Branch (1360:6): [True: 0, False: 988]
  ------------------
 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|    988|  return false;
 1379|    988|}
u_getDataDirectory_78:
 1499|  1.79k|u_getDataDirectory() {
 1500|  1.79k|    umtx_initOnce(gDataDirInitOnce, &dataDirectoryInitFn);
 1501|  1.79k|    return gDataDirectory;
 1502|  1.79k|}
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:_ZL9u_signBitd:
  223|  5.69k|u_signBit(double d) {
  224|  5.69k|    uint8_t hiByte;
  225|       |#if U_IS_BIG_ENDIAN
  226|       |    hiByte = *(uint8_t *)&d;
  227|       |#else
  228|  5.69k|    hiByte = *(reinterpret_cast<uint8_t*>(&d) + sizeof(double) - 1);
  229|  5.69k|#endif
  230|  5.69k|    return (hiByte & 0x80) != 0;
  231|  5.69k|}
putil.cpp:_ZL19dataDirectoryInitFnv:
 1424|      1|static void U_CALLCONV dataDirectoryInitFn() {
 1425|       |    /* If we already have the directory, then return immediately. Will happen if user called
 1426|       |     * u_setDataDirectory().
 1427|       |     */
 1428|      1|    if (gDataDirectory) {
  ------------------
  |  Branch (1428:9): [True: 0, False: 1]
  ------------------
 1429|      0|        return;
 1430|      0|    }
 1431|       |
 1432|      1|    const char *path = nullptr;
 1433|       |#if defined(ICU_DATA_DIR_PREFIX_ENV_VAR)
 1434|       |    char datadir_path_buffer[PATH_MAX];
 1435|       |#endif
 1436|       |
 1437|       |    /*
 1438|       |    When ICU_NO_USER_DATA_OVERRIDE is defined, users aren't allowed to
 1439|       |    override ICU's data with the ICU_DATA environment variable. This prevents
 1440|       |    problems where multiple custom copies of ICU's specific version of data
 1441|       |    are installed on a system. Either the application must define the data
 1442|       |    directory with u_setDataDirectory, define ICU_DATA_DIR when compiling
 1443|       |    ICU, set the data with udata_setCommonData or trust that all of the
 1444|       |    required data is contained in ICU's data library that contains
 1445|       |    the entry point defined by U_ICUDATA_ENTRY_POINT.
 1446|       |
 1447|       |    There may also be some platforms where environment variables
 1448|       |    are not allowed.
 1449|       |    */
 1450|      1|#   if !defined(ICU_NO_USER_DATA_OVERRIDE) && !UCONFIG_NO_FILE_IO
 1451|       |    /* First try to get the environment variable */
 1452|      1|#     if U_PLATFORM_HAS_WINUWP_API == 0  // Windows UWP does not support getenv
 1453|      1|        path=getenv("ICU_DATA");
 1454|      1|#     endif
 1455|      1|#   endif
 1456|       |
 1457|       |    /* ICU_DATA_DIR may be set as a compile option.
 1458|       |     * U_ICU_DATA_DEFAULT_DIR is provided and is set by ICU at compile time
 1459|       |     * and is used only when data is built in archive mode eliminating the need
 1460|       |     * for ICU_DATA_DIR to be set. U_ICU_DATA_DEFAULT_DIR is set to the installation
 1461|       |     * directory of the data dat file. Users should use ICU_DATA_DIR if they want to
 1462|       |     * set their own path.
 1463|       |     */
 1464|       |#if defined(ICU_DATA_DIR) || defined(U_ICU_DATA_DEFAULT_DIR)
 1465|       |    if(path==nullptr || *path==0) {
 1466|       |# if defined(ICU_DATA_DIR_PREFIX_ENV_VAR)
 1467|       |        const char *prefix = getenv(ICU_DATA_DIR_PREFIX_ENV_VAR);
 1468|       |# endif
 1469|       |# ifdef ICU_DATA_DIR
 1470|       |        path=ICU_DATA_DIR;
 1471|       |# else
 1472|       |        path=U_ICU_DATA_DEFAULT_DIR;
 1473|       |# endif
 1474|       |# if defined(ICU_DATA_DIR_PREFIX_ENV_VAR)
 1475|       |        if (prefix != nullptr) {
 1476|       |            snprintf(datadir_path_buffer, sizeof(datadir_path_buffer), "%s%s", prefix, path);
 1477|       |            path=datadir_path_buffer;
 1478|       |        }
 1479|       |# endif
 1480|       |    }
 1481|       |#endif
 1482|       |
 1483|       |#if defined(ICU_DATA_DIR_WINDOWS)
 1484|       |    char datadir_path_buffer[MAX_PATH];
 1485|       |    if (getIcuDataDirectoryUnderWindowsDirectory(datadir_path_buffer, UPRV_LENGTHOF(datadir_path_buffer))) {
 1486|       |        path = datadir_path_buffer;
 1487|       |    }
 1488|       |#endif
 1489|       |
 1490|      1|    if(path==nullptr) {
  ------------------
  |  Branch (1490:8): [True: 1, False: 0]
  ------------------
 1491|       |        /* It looks really bad, set it to something. */
 1492|      1|        path = "";
 1493|      1|    }
 1494|       |
 1495|      1|    u_setDataDirectory(path);
  ------------------
  |  |  347|      1|#define u_setDataDirectory U_ICU_ENTRY_POINT_RENAME(u_setDataDirectory)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1496|      1|}
putil.cpp:_ZL31uprv_getPOSIXIDForDefaultLocalev:
 1660|      1|{
 1661|      1|    static const char* posixID = nullptr;
 1662|      1|    if (posixID == nullptr) {
  ------------------
  |  Branch (1662:9): [True: 1, False: 0]
  ------------------
 1663|      1|        posixID = uprv_getPOSIXIDForCategory(LC_MESSAGES);
 1664|      1|    }
 1665|      1|    return posixID;
 1666|      1|}
putil.cpp:_ZL26uprv_getPOSIXIDForCategoryi:
 1597|      1|{
 1598|      1|    const char* posixID = nullptr;
 1599|      1|    if (category == LC_MESSAGES || category == LC_CTYPE) {
  ------------------
  |  Branch (1599:9): [True: 1, False: 0]
  |  Branch (1599:36): [True: 0, False: 0]
  ------------------
 1600|       |        /*
 1601|       |        * On Solaris two different calls to setlocale can result in
 1602|       |        * different values. Only get this value once.
 1603|       |        *
 1604|       |        * We must check this first because an application can set this.
 1605|       |        *
 1606|       |        * LC_ALL can't be used because it's platform dependent. The LANG
 1607|       |        * environment variable seems to affect LC_CTYPE variable by default.
 1608|       |        * Here is what setlocale(LC_ALL, nullptr) can return.
 1609|       |        * HPUX can return 'C C C C C C C'
 1610|       |        * Solaris can return /en_US/C/C/C/C/C on the second try.
 1611|       |        * Linux can return LC_CTYPE=C;LC_NUMERIC=C;...
 1612|       |        *
 1613|       |        * The default codepage detection also needs to use LC_CTYPE.
 1614|       |        *
 1615|       |        * Do not call setlocale(LC_*, "")! Using an empty string instead
 1616|       |        * of nullptr, will modify the libc behavior.
 1617|       |        */
 1618|      1|        posixID = setlocale(category, nullptr);
 1619|      1|        if ((posixID == nullptr)
  ------------------
  |  Branch (1619:13): [True: 0, False: 1]
  ------------------
 1620|      1|            || (uprv_strcmp("C", posixID) == 0)
  ------------------
  |  |   38|      1|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1620:16): [True: 1, False: 0]
  ------------------
 1621|      1|            || (uprv_strcmp("POSIX", posixID) == 0))
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1621:16): [True: 0, False: 0]
  ------------------
 1622|      1|        {
 1623|       |            /* Maybe we got some garbage.  Try something more reasonable */
 1624|      1|            posixID = getenv("LC_ALL");
 1625|       |            /* Solaris speaks POSIX -  See IEEE Std 1003.1-2008
 1626|       |             * This is needed to properly handle empty env. variables
 1627|       |             */
 1628|       |#if U_PLATFORM == U_PF_SOLARIS
 1629|       |            if ((posixID == 0) || (posixID[0] == '\0')) {
 1630|       |                posixID = getenv(category == LC_MESSAGES ? "LC_MESSAGES" : "LC_CTYPE");
 1631|       |                if ((posixID == 0) || (posixID[0] == '\0')) {
 1632|       |#else
 1633|      1|            if (posixID == nullptr) {
  ------------------
  |  Branch (1633:17): [True: 1, False: 0]
  ------------------
 1634|      1|                posixID = getenv(category == LC_MESSAGES ? "LC_MESSAGES" : "LC_CTYPE");
  ------------------
  |  Branch (1634:34): [True: 1, False: 0]
  ------------------
 1635|      1|                if (posixID == nullptr) {
  ------------------
  |  Branch (1635:21): [True: 1, False: 0]
  ------------------
 1636|      1|#endif
 1637|      1|                    posixID = getenv("LANG");
 1638|      1|                }
 1639|      1|            }
 1640|      1|        }
 1641|      1|    }
 1642|      1|    if ((posixID == nullptr)
  ------------------
  |  Branch (1642:9): [True: 1, False: 0]
  ------------------
 1643|      1|        || (uprv_strcmp("C", posixID) == 0)
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1643:12): [True: 0, False: 0]
  ------------------
 1644|      1|        || (uprv_strcmp("POSIX", posixID) == 0))
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1644:12): [True: 0, False: 0]
  ------------------
 1645|      1|    {
 1646|       |        /* Nothing worked.  Give it a nice POSIX default value. */
 1647|      1|        posixID = "en_US_POSIX";
 1648|       |        // Note: this test will not catch 'C.UTF-8',
 1649|       |        // that will be handled in uprv_getDefaultLocaleID().
 1650|       |        // Leave this mapping here for the uprv_getPOSIXIDForDefaultCodepage()
 1651|       |        // caller which expects to see "en_US_POSIX" in many branches.
 1652|      1|    }
 1653|      1|    return posixID;
 1654|      1|}

_ZN6icu_7813ResourceValueD2Ev:
   18|   311k|ResourceValue::~ResourceValue() {}
_ZN6icu_7812ResourceSinkD2Ev:
   20|   302k|ResourceSink::~ResourceSink() {}

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

_ZN6icu_7814ResourceTracerC2Ev:
  116|   311k|    ResourceTracer() {}
_ZN6icu_7814ResourceTracerC2EPKv:
  118|  7.50M|    ResourceTracer(const void*) {}
_ZN6icu_7814ResourceTracerC2EPKvPKc:
  120|   369k|    ResourceTracer(const void*, const char*) {}
_ZN6icu_7814ResourceTracerC2EPKvi:
  122|   340k|    ResourceTracer(const void*, int32_t) {}
_ZN6icu_7814ResourceTracerC2ERKS0_PKc:
  124|  4.74M|    ResourceTracer(const ResourceTracer&, const char*) {}
_ZN6icu_7814ResourceTracerC2ERKS0_i:
  126|     14|    ResourceTracer(const ResourceTracer&, int32_t) {}
_ZNK6icu_7814ResourceTracer5traceEPKc:
  128|  8.37M|    void trace(const char*) const {}
_ZNK6icu_7814ResourceTracer9traceOpenEv:
  130|  1.85M|    void traceOpen() const {}
_ZNK6icu_7814ResourceTracer10maybeTraceEPKc:
  132|  9.28k|    void maybeTrace(const char*) const {}
_ZN6icu_7810FileTracer9traceOpenEPKcS2_S2_:
  140|  1.79k|    static void traceOpen(const char*, const char*, const char*) {}

_ZN6icu_7821RuleCharacterIteratorC2ERKNS_13UnicodeStringEPKNS_11SymbolTableERNS_13ParsePositionE:
   27|     19|    text(theText),
   28|     19|    pos(thePos),
   29|     19|    sym(theSym),
   30|     19|    buf(nullptr),
   31|     19|    bufPos(0)
   32|     19|{}
_ZNK6icu_7821RuleCharacterIterator5atEndEv:
   34|    135|UBool RuleCharacterIterator::atEnd() const {
   35|    135|    return buf == nullptr && pos.getIndex() == text.length();
  ------------------
  |  Branch (35:12): [True: 135, False: 0]
  |  Branch (35:30): [True: 0, False: 135]
  ------------------
   36|    135|}
_ZN6icu_7821RuleCharacterIterator4nextEiRaR10UErrorCode:
   38|    312|UChar32 RuleCharacterIterator::next(int32_t options, UBool& isEscaped, UErrorCode& ec) {
   39|    312|    if (U_FAILURE(ec)) return DONE;
  ------------------
  |  Branch (39:9): [True: 0, False: 312]
  ------------------
   40|       |
   41|    312|    UChar32 c = DONE;
   42|    312|    isEscaped = false;
   43|       |
   44|    356|    for (;;) {
   45|    356|        c = _current();
   46|    356|        _advance(U16_LENGTH(c));
  ------------------
  |  |  141|    356|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 356, False: 0]
  |  |  ------------------
  ------------------
   47|       |
   48|    356|        if (c == SymbolTable::SYMBOL_REF && buf == nullptr &&
  ------------------
  |  Branch (48:13): [True: 4, False: 352]
  |  Branch (48:45): [True: 4, False: 0]
  ------------------
   49|    356|            (options & PARSE_VARIABLES) != 0 && sym != nullptr) {
  ------------------
  |  Branch (49:13): [True: 4, False: 0]
  |  Branch (49:49): [True: 0, False: 4]
  ------------------
   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|    356|        if ((options & SKIP_WHITESPACE) != 0 && PatternProps::isWhiteSpace(c)) {
  ------------------
  |  Branch (69:13): [True: 323, False: 33]
  |  Branch (69:49): [True: 44, False: 279]
  ------------------
   70|     44|            continue;
   71|     44|        }
   72|       |
   73|    312|        if (c == 0x5C /*'\\'*/ && (options & PARSE_ESCAPES) != 0) {
  ------------------
  |  Branch (73:13): [True: 21, False: 291]
  |  Branch (73:35): [True: 10, False: 11]
  ------------------
   74|     10|            UnicodeString tempEscape;
   75|     10|            int32_t offset = 0;
   76|     10|            c = lookahead(tempEscape, MAX_U_NOTATION_LEN).unescapeAt(offset);
  ------------------
  |  |   21|     10|#define MAX_U_NOTATION_LEN 12
  ------------------
   77|     10|            jumpahead(offset);
   78|     10|            isEscaped = true;
   79|     10|            if (c < 0) {
  ------------------
  |  Branch (79:17): [True: 0, False: 10]
  ------------------
   80|      0|                ec = U_MALFORMED_UNICODE_ESCAPE;
   81|      0|                return DONE;
   82|      0|            }
   83|     10|        }
   84|       |
   85|    312|        break;
   86|    312|    }
   87|       |
   88|    312|    return c;
   89|    312|}
_ZNK6icu_7821RuleCharacterIterator6getPosERNS0_3PosE:
   91|    273|void RuleCharacterIterator::getPos(RuleCharacterIterator::Pos& p) const {
   92|    273|    p.buf = buf;
   93|    273|    p.pos = pos.getIndex();
   94|    273|    p.bufPos = bufPos;
   95|    273|}
_ZN6icu_7821RuleCharacterIterator6setPosERKNS0_3PosE:
   97|    149|void RuleCharacterIterator::setPos(const RuleCharacterIterator::Pos& p) {
   98|    149|    buf = p.buf;
   99|    149|    pos.setIndex(p.pos);
  100|    149|    bufPos = p.bufPos;
  101|    149|}
_ZN6icu_7821RuleCharacterIterator11skipIgnoredEi:
  103|     25|void RuleCharacterIterator::skipIgnored(int32_t options) {
  104|     25|    if ((options & SKIP_WHITESPACE) != 0) {
  ------------------
  |  Branch (104:9): [True: 25, False: 0]
  ------------------
  105|     25|        for (;;) {
  106|     25|            UChar32 a = _current();
  107|     25|            if (!PatternProps::isWhiteSpace(a)) break;
  ------------------
  |  Branch (107:17): [True: 25, 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|     25|    }
  111|     25|}
_ZNK6icu_7821RuleCharacterIterator9lookaheadERNS_13UnicodeStringEi:
  113|     15|UnicodeString& RuleCharacterIterator::lookahead(UnicodeString& result, int32_t maxLookAhead) const {
  114|     15|    if (maxLookAhead < 0) {
  ------------------
  |  Branch (114:9): [True: 5, False: 10]
  ------------------
  115|      5|        maxLookAhead = 0x7FFFFFFF;
  116|      5|    }
  117|     15|    if (buf != nullptr) {
  ------------------
  |  Branch (117:9): [True: 0, False: 15]
  ------------------
  118|      0|        buf->extract(bufPos, maxLookAhead, result);
  119|     15|    } else {
  120|     15|        text.extract(pos.getIndex(), maxLookAhead, result);
  121|     15|    }
  122|     15|    return result;
  123|     15|}
_ZN6icu_7821RuleCharacterIterator9jumpaheadEi:
  125|     15|void RuleCharacterIterator::jumpahead(int32_t count) {
  126|     15|    _advance(count);
  127|     15|}
_ZNK6icu_7821RuleCharacterIterator8_currentEv:
  137|    381|UChar32 RuleCharacterIterator::_current() const {
  138|    381|    if (buf != nullptr) {
  ------------------
  |  Branch (138:9): [True: 0, False: 381]
  ------------------
  139|      0|        return buf->char32At(bufPos);
  140|    381|    } else {
  141|    381|        int i = pos.getIndex();
  142|    381|        return (i < text.length()) ? text.char32At(i) : static_cast<UChar32>(DONE);
  ------------------
  |  Branch (142:16): [True: 362, False: 19]
  ------------------
  143|    381|    }
  144|    381|}
_ZN6icu_7821RuleCharacterIterator8_advanceEi:
  146|    371|void RuleCharacterIterator::_advance(int32_t count) {
  147|    371|    if (buf != nullptr) {
  ------------------
  |  Branch (147:9): [True: 0, False: 371]
  ------------------
  148|      0|        bufPos += count;
  149|      0|        if (bufPos == buf->length()) {
  ------------------
  |  Branch (149:13): [True: 0, False: 0]
  ------------------
  150|      0|            buf = nullptr;
  151|      0|        }
  152|    371|    } else {
  153|    371|        pos.setIndex(pos.getIndex() + count);
  154|    371|        if (pos.getIndex() > text.length()) {
  ------------------
  |  Branch (154:13): [True: 0, False: 371]
  ------------------
  155|      0|            pos.setIndex(text.length());
  156|      0|        }
  157|    371|    }
  158|    371|}

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

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

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

_ZN6icu_787unisets3getENS0_3KeyE:
  213|  2.30M|const UnicodeSet* unisets::get(Key key) {
  214|  2.30M|    UErrorCode localStatus = U_ZERO_ERROR;
  215|  2.30M|    umtx_initOnce(gNumberParseUniSetsInitOnce, &initNumberParseUniSets, localStatus);
  216|  2.30M|    if (U_FAILURE(localStatus)) {
  ------------------
  |  Branch (216:9): [True: 0, False: 2.30M]
  ------------------
  217|      0|        return reinterpret_cast<UnicodeSet*>(gEmptyUnicodeSet);
  218|      0|    }
  219|  2.30M|    return getImpl(key);
  220|  2.30M|}
_ZN6icu_787unisets10chooseFromENS_13UnicodeStringENS0_3KeyE:
  222|  97.8k|Key unisets::chooseFrom(UnicodeString str, Key key1) {
  223|  97.8k|    return get(key1)->contains(str) ? key1 : NONE;
  ------------------
  |  Branch (223:12): [True: 96.9k, False: 873]
  ------------------
  224|  97.8k|}
_ZN6icu_787unisets10chooseFromENS_13UnicodeStringENS0_3KeyES2_:
  226|   205k|Key unisets::chooseFrom(UnicodeString str, Key key1, Key key2) {
  227|   205k|    return get(key1)->contains(str) ? key1 : chooseFrom(str, key2);
  ------------------
  |  Branch (227:12): [True: 107k, False: 97.8k]
  ------------------
  228|   205k|}
static_unicode_sets.cpp:_ZN12_GLOBAL__N_122initNumberParseUniSetsER10UErrorCode:
  147|      1|void U_CALLCONV initNumberParseUniSets(UErrorCode& status) {
  148|      1|    ucln_common_registerCleanup(UCLN_COMMON_NUMPARSE_UNISETS, cleanupNumberParseUniSets);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  149|       |
  150|       |    // Initialize the empty instance for well-defined fallback behavior
  151|      1|    new(gEmptyUnicodeSet) UnicodeSet();
  152|      1|    reinterpret_cast<UnicodeSet*>(gEmptyUnicodeSet)->freeze();
  153|      1|    gEmptyUnicodeSetInitialized = true;
  154|       |
  155|       |    // These sets were decided after discussion with icu-design@. See tickets #13084 and #13309.
  156|       |    // Zs+TAB is "horizontal whitespace" according to UTS #18 (blank property).
  157|      1|    gUnicodeSets[DEFAULT_IGNORABLES] = new UnicodeSet(
  158|      1|            u"[[:Zs:][\\u0009][:Bidi_Control:][:Variation_Selector:]]", status);
  159|      1|    gUnicodeSets[STRICT_IGNORABLES] = new UnicodeSet(u"[[:Bidi_Control:]]", status);
  160|       |
  161|      1|    LocalUResourceBundlePointer rb(ures_open(nullptr, "root", &status));
  ------------------
  |  | 1691|      1|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  162|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (162:9): [True: 0, False: 1]
  ------------------
  163|      1|    ParseDataSink sink;
  164|      1|    ures_getAllItemsWithFallback(rb.getAlias(), "parse", 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  165|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (165:9): [True: 0, False: 1]
  ------------------
  166|       |
  167|       |    // NOTE: It is OK for these assertions to fail if there was a no-data build.
  168|      1|    U_ASSERT(gUnicodeSets[COMMA] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  169|      1|    U_ASSERT(gUnicodeSets[STRICT_COMMA] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  170|      1|    U_ASSERT(gUnicodeSets[PERIOD] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  171|      1|    U_ASSERT(gUnicodeSets[STRICT_PERIOD] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  172|      1|    U_ASSERT(gUnicodeSets[APOSTROPHE_SIGN] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  173|       |
  174|      1|    LocalPointer<UnicodeSet> otherGrouping(new UnicodeSet(
  175|      1|        u"[٬‘\\u0020\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]",
  176|      1|        status
  177|      1|    ), status);
  178|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (178:9): [True: 0, False: 1]
  ------------------
  179|      1|    otherGrouping->addAll(*gUnicodeSets[APOSTROPHE_SIGN]);
  180|      1|    gUnicodeSets[OTHER_GROUPING_SEPARATORS] = otherGrouping.orphan();
  181|      1|    gUnicodeSets[ALL_SEPARATORS] = computeUnion(COMMA, PERIOD, OTHER_GROUPING_SEPARATORS);
  182|      1|    gUnicodeSets[STRICT_ALL_SEPARATORS] = computeUnion(
  183|      1|            STRICT_COMMA, STRICT_PERIOD, OTHER_GROUPING_SEPARATORS);
  184|       |
  185|      1|    U_ASSERT(gUnicodeSets[MINUS_SIGN] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  186|      1|    U_ASSERT(gUnicodeSets[PLUS_SIGN] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  187|      1|    U_ASSERT(gUnicodeSets[PERCENT_SIGN] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  188|      1|    U_ASSERT(gUnicodeSets[PERMILLE_SIGN] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  189|       |
  190|      1|    gUnicodeSets[INFINITY_SIGN] = new UnicodeSet(u"[∞]", status);
  191|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (191:9): [True: 0, False: 1]
  ------------------
  192|       |
  193|      1|    U_ASSERT(gUnicodeSets[DOLLAR_SIGN] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  194|      1|    U_ASSERT(gUnicodeSets[POUND_SIGN] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  195|      1|    U_ASSERT(gUnicodeSets[RUPEE_SIGN] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  196|      1|    U_ASSERT(gUnicodeSets[YEN_SIGN] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  197|      1|    U_ASSERT(gUnicodeSets[WON_SIGN] != nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  198|       |
  199|      1|    gUnicodeSets[DIGITS] = new UnicodeSet(u"[:digit:]", status);
  200|      1|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (200:9): [True: 0, False: 1]
  ------------------
  201|      1|    gUnicodeSets[DIGITS_OR_ALL_SEPARATORS] = computeUnion(DIGITS, ALL_SEPARATORS);
  202|      1|    gUnicodeSets[DIGITS_OR_STRICT_ALL_SEPARATORS] = computeUnion(DIGITS, STRICT_ALL_SEPARATORS);
  203|       |
  204|     24|    for (auto* uniset : gUnicodeSets) {
  ------------------
  |  Branch (204:23): [True: 24, False: 1]
  ------------------
  205|     24|        if (uniset != nullptr) {
  ------------------
  |  Branch (205:13): [True: 23, False: 1]
  ------------------
  206|     23|            uniset->freeze();
  207|     23|        }
  208|     24|    }
  209|      1|}
static_unicode_sets.cpp:_ZN12_GLOBAL__N_113ParseDataSink3putEPKcRN6icu_7813ResourceValueEaR10UErrorCode:
   75|      1|    void put(const char* key, ResourceValue& value, UBool /*noFallback*/, UErrorCode& status) override {
   76|      1|        ResourceTable contextsTable = value.getTable(status);
   77|      1|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (77:13): [True: 0, False: 1]
  ------------------
   78|      4|        for (int i = 0; contextsTable.getKeyAndValue(i, key, value); i++) {
  ------------------
  |  Branch (78:25): [True: 3, False: 1]
  ------------------
   79|      3|            if (uprv_strcmp(key, "date") == 0) {
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (79:17): [True: 1, False: 2]
  ------------------
   80|       |                // ignore
   81|      2|            } else {
   82|      2|                ResourceTable strictnessTable = value.getTable(status);
   83|      2|                if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (83:21): [True: 0, False: 2]
  ------------------
   84|      5|                for (int j = 0; strictnessTable.getKeyAndValue(j, key, value); j++) {
  ------------------
  |  Branch (84:33): [True: 3, False: 2]
  ------------------
   85|      3|                    bool isLenient = (uprv_strcmp(key, "lenient") == 0);
  ------------------
  |  |   38|      3|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      3|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   86|      3|                    ResourceArray array = value.getArray(status);
   87|      3|                    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (87:25): [True: 0, False: 3]
  ------------------
   88|     17|                    for (int k = 0; k < array.getSize(); k++) {
  ------------------
  |  Branch (88:37): [True: 14, False: 3]
  ------------------
   89|     14|                        array.getValue(k, value);
   90|     14|                        UnicodeString str = value.getUnicodeString(status);
   91|     14|                        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (91:29): [True: 0, False: 14]
  ------------------
   92|       |                        // There is both lenient and strict data for comma/period,
   93|       |                        // but not for any of the other symbols.
   94|     14|                        if (str.indexOf(u'.') != -1) {
  ------------------
  |  Branch (94:29): [True: 2, False: 12]
  ------------------
   95|      2|                            saveSet(isLenient ? PERIOD : STRICT_PERIOD, str, status);
  ------------------
  |  Branch (95:37): [True: 1, False: 1]
  ------------------
   96|     12|                        } else if (str.indexOf(u',') != -1) {
  ------------------
  |  Branch (96:36): [True: 2, False: 10]
  ------------------
   97|      2|                            saveSet(isLenient ? COMMA : STRICT_COMMA, str, status);
  ------------------
  |  Branch (97:37): [True: 1, False: 1]
  ------------------
   98|     10|                        } else if (str.indexOf(u'+') != -1) {
  ------------------
  |  Branch (98:36): [True: 1, False: 9]
  ------------------
   99|      1|                            saveSet(PLUS_SIGN, str, status);
  100|      9|                        } else if (str.indexOf(u'-') != -1) {
  ------------------
  |  Branch (100:36): [True: 1, False: 8]
  ------------------
  101|      1|                            saveSet(MINUS_SIGN, str, status);
  102|      8|                        } else if (str.indexOf(u'$') != -1) {
  ------------------
  |  Branch (102:36): [True: 1, False: 7]
  ------------------
  103|      1|                            saveSet(DOLLAR_SIGN, str, status);
  104|      7|                        } else if (str.indexOf(u'£') != -1) {
  ------------------
  |  Branch (104:36): [True: 1, False: 6]
  ------------------
  105|      1|                            saveSet(POUND_SIGN, str, status);
  106|      6|                        } else if (str.indexOf(u'₹') != -1) {
  ------------------
  |  Branch (106:36): [True: 1, False: 5]
  ------------------
  107|      1|                            saveSet(RUPEE_SIGN, str, status);
  108|      5|                        } else if (str.indexOf(u'¥') != -1) {
  ------------------
  |  Branch (108:36): [True: 1, False: 4]
  ------------------
  109|      1|                            saveSet(YEN_SIGN, str, status);
  110|      4|                        } else if (str.indexOf(u'₩') != -1) {
  ------------------
  |  Branch (110:36): [True: 1, False: 3]
  ------------------
  111|      1|                            saveSet(WON_SIGN, str, status);
  112|      3|                        } else if (str.indexOf(u'%') != -1) {
  ------------------
  |  Branch (112:36): [True: 1, False: 2]
  ------------------
  113|      1|                            saveSet(PERCENT_SIGN, str, status);
  114|      2|                        } else if (str.indexOf(u'‰') != -1) {
  ------------------
  |  Branch (114:36): [True: 1, False: 1]
  ------------------
  115|      1|                            saveSet(PERMILLE_SIGN, str, status);
  116|      1|                        } else if (str.indexOf(u'’') != -1) {
  ------------------
  |  Branch (116:36): [True: 1, False: 0]
  ------------------
  117|      1|                            saveSet(APOSTROPHE_SIGN, str, status);
  118|      1|                        } else {
  119|       |                            // Unknown class of parse lenients
  120|       |                            // TODO(ICU-20428): Make ICU automatically accept new classes?
  121|      0|                            U_ASSERT(false);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  122|      0|                        }
  123|     14|                        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (123:29): [True: 0, False: 14]
  ------------------
  124|     14|                    }
  125|      3|                }
  126|      2|            }
  127|      3|        }
  128|      1|    }
static_unicode_sets.cpp:_ZN12_GLOBAL__N_17saveSetEN6icu_787unisets3KeyERKNS0_13UnicodeStringER10UErrorCode:
   68|     14|void saveSet(Key key, const UnicodeString& unicodeSetPattern, UErrorCode& status) {
   69|       |    // assert unicodeSets.get(key) == null;
   70|     14|    gUnicodeSets[key] = new UnicodeSet(unicodeSetPattern, status);
   71|     14|}
static_unicode_sets.cpp:_ZN12_GLOBAL__N_112computeUnionEN6icu_787unisets3KeyES2_S2_:
   55|      2|UnicodeSet* computeUnion(Key k1, Key k2, Key k3) {
   56|      2|    UnicodeSet* result = new UnicodeSet();
   57|      2|    if (result == nullptr) {
  ------------------
  |  Branch (57:9): [True: 0, False: 2]
  ------------------
   58|      0|        return nullptr;
   59|      0|    }
   60|      2|    result->addAll(*getImpl(k1));
   61|      2|    result->addAll(*getImpl(k2));
   62|      2|    result->addAll(*getImpl(k3));
   63|      2|    result->freeze();
   64|      2|    return result;
   65|      2|}
static_unicode_sets.cpp:_ZN12_GLOBAL__N_112computeUnionEN6icu_787unisets3KeyES2_:
   44|      2|UnicodeSet* computeUnion(Key k1, Key k2) {
   45|      2|    UnicodeSet* result = new UnicodeSet();
   46|      2|    if (result == nullptr) {
  ------------------
  |  Branch (46:9): [True: 0, False: 2]
  ------------------
   47|      0|        return nullptr;
   48|      0|    }
   49|      2|    result->addAll(*getImpl(k1));
   50|      2|    result->addAll(*getImpl(k2));
   51|      2|    result->freeze();
   52|      2|    return result;
   53|      2|}
static_unicode_sets.cpp:_ZN12_GLOBAL__N_17getImplEN6icu_787unisets3KeyE:
   36|  2.30M|inline UnicodeSet* getImpl(Key key) {
   37|  2.30M|    UnicodeSet* candidate = gUnicodeSets[key];
   38|  2.30M|    if (candidate == nullptr) {
  ------------------
  |  Branch (38:9): [True: 104k, False: 2.20M]
  ------------------
   39|   104k|        return reinterpret_cast<UnicodeSet*>(gEmptyUnicodeSet);
   40|   104k|    }
   41|  2.20M|    return candidate;
   42|  2.30M|}

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

uprv_sortArray_78:
  258|    717|               UBool sortStable, UErrorCode *pErrorCode) {
  259|    717|    if(pErrorCode==nullptr || U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (259:8): [True: 0, False: 717]
  |  Branch (259:31): [True: 0, False: 717]
  ------------------
  260|      0|        return;
  261|      0|    }
  262|    717|    if((length>0 && array==nullptr) || length<0 || itemSize<=0 || cmp==nullptr) {
  ------------------
  |  Branch (262:9): [True: 1, False: 716]
  |  Branch (262:21): [True: 0, False: 1]
  |  Branch (262:40): [True: 0, False: 717]
  |  Branch (262:52): [True: 0, False: 717]
  |  Branch (262:67): [True: 0, False: 717]
  ------------------
  263|      0|        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
  264|      0|        return;
  265|      0|    }
  266|       |
  267|    717|    if(length<=1) {
  ------------------
  |  Branch (267:8): [True: 717, False: 0]
  ------------------
  268|    717|        return;
  269|    717|    } 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|    717|}

ubidi_addPropertyStarts_78:
   60|      1|ubidi_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) {
   61|      1|    int32_t i, length;
   62|      1|    UChar32 c, start, limit;
   63|       |
   64|      1|    const uint8_t *jgArray;
   65|      1|    uint8_t prev, jg;
   66|       |
   67|      1|    if(U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (67:8): [True: 0, False: 1]
  ------------------
   68|      0|        return;
   69|      0|    }
   70|       |
   71|       |    /* add the start code point of each same-value range of the trie */
   72|      1|    utrie2_enum(&ubidi_props_singleton.trie, 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   73|       |
   74|       |    /* add the code points from the bidi mirroring table */
   75|      1|    length=ubidi_props_singleton.indexes[UBIDI_IX_MIRROR_LENGTH];
   76|     41|    for(i=0; i<length; ++i) {
  ------------------
  |  Branch (76:14): [True: 40, False: 1]
  ------------------
   77|     40|        c=UBIDI_GET_MIRROR_CODE_POINT(ubidi_props_singleton.mirrors[i]);
  ------------------
  |  |  142|     40|#define UBIDI_GET_MIRROR_CODE_POINT(m) (UChar32)((m)&0x1fffff)
  ------------------
   78|     40|        sa->addRange(sa->set, c, c+1);
   79|     40|    }
   80|       |
   81|       |    /* add the code points from the Joining_Group array where the value changes */
   82|      1|    start=ubidi_props_singleton.indexes[UBIDI_IX_JG_START];
   83|      1|    limit=ubidi_props_singleton.indexes[UBIDI_IX_JG_LIMIT];
   84|      1|    jgArray=ubidi_props_singleton.jgArray;
   85|      2|    for(;;) {
   86|      2|        prev=0;
   87|  1.71k|        while(start<limit) {
  ------------------
  |  Branch (87:15): [True: 1.71k, False: 2]
  ------------------
   88|  1.71k|            jg=*jgArray++;
   89|  1.71k|            if(jg!=prev) {
  ------------------
  |  Branch (89:16): [True: 246, False: 1.46k]
  ------------------
   90|    246|                sa->add(sa->set, start);
   91|    246|                prev=jg;
   92|    246|            }
   93|  1.71k|            ++start;
   94|  1.71k|        }
   95|      2|        if(prev!=0) {
  ------------------
  |  Branch (95:12): [True: 1, False: 1]
  ------------------
   96|       |            /* add the limit code point if the last value was not 0 (it is now start==limit) */
   97|      1|            sa->add(sa->set, limit);
   98|      1|        }
   99|      2|        if(limit==ubidi_props_singleton.indexes[UBIDI_IX_JG_LIMIT]) {
  ------------------
  |  Branch (99:12): [True: 1, False: 1]
  ------------------
  100|       |            /* switch to the second Joining_Group range */
  101|      1|            start=ubidi_props_singleton.indexes[UBIDI_IX_JG_START2];
  102|      1|            limit=ubidi_props_singleton.indexes[UBIDI_IX_JG_LIMIT2];
  103|      1|            jgArray=ubidi_props_singleton.jgArray2;
  104|      1|        } else {
  105|      1|            break;
  106|      1|        }
  107|      2|    }
  108|       |
  109|       |    /* add code points with hardcoded properties, plus the ones following them */
  110|       |
  111|       |    /* (none right now) */
  112|      1|}
ubidi_isBidiControl_78:
  184|  2.12k|ubidi_isBidiControl(UChar32 c) {
  185|  2.12k|    uint16_t props=UTRIE2_GET16(&ubidi_props_singleton.trie, c);
  ------------------
  |  |  360|  2.12k|#define UTRIE2_GET16(trie, c) _UTRIE2_GET((trie), index, (trie)->indexLength, (c))
  |  |  ------------------
  |  |  |  |  871|  2.12k|    (trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
  |  |  |  |  ------------------
  |  |  |  |  |  |  845|  2.12k|    ((uint32_t)(c)<0xd800 ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (845:6): [True: 1.45k, False: 668]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  846|  2.12k|        _UTRIE2_INDEX_RAW(0, (trie)->index, c) : \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|  1.45k|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  816|  1.45k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|  1.45k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  847|  2.12k|        (uint32_t)(c)<=0xffff ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (847:9): [True: 88, False: 580]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  848|    668|            _UTRIE2_INDEX_RAW( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|    176|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (815:30): [True: 0, False: 88]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  816|     88|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|     88|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  849|    668|                (c)<=0xdbff ? UTRIE2_LSCP_INDEX_2_OFFSET-(0xd800>>UTRIE2_SHIFT_2) : 0, \
  |  |  |  |  |  |  850|    668|                (trie)->index, c) : \
  |  |  |  |  |  |  851|    668|            (uint32_t)(c)>0x10ffff ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (851:13): [True: 0, False: 580]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  852|    580|                (asciiOffset)+UTRIE2_BAD_UTF8_DATA_OFFSET : \
  |  |  |  |  |  |  853|    580|                (c)>=(trie)->highStart ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (853:17): [True: 0, False: 580]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    580|                    (trie)->highValueIndex : \
  |  |  |  |  |  |  855|    580|                    _UTRIE2_INDEX_FROM_SUPP((trie)->index, c))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  833|    580|    (((int32_t)((trieIndex)[ \
  |  |  |  |  |  |  |  |  834|    580|        (trieIndex)[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+ \
  |  |  |  |  |  |  |  |  835|    580|                      ((c)>>UTRIE2_SHIFT_1)]+ \
  |  |  |  |  |  |  |  |  836|    580|        (((c)>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK)]) \
  |  |  |  |  |  |  |  |  837|    580|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  838|    580|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  186|  2.12k|    return UBIDI_GET_FLAG(props, UBIDI_BIDI_CONTROL_SHIFT);
  ------------------
  |  |  120|  2.12k|#define UBIDI_GET_FLAG(props, shift) (((props)>>(shift))&1)
  ------------------
  187|  2.12k|}
ubidi_props.cpp:_ZL24_enumPropertyStartsRangePKviij:
   50|  1.98k|_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32_t value) {
   51|  1.98k|    (void)end;
   52|  1.98k|    (void)value;
   53|       |    /* add the start code point to the USet */
   54|  1.98k|    const USetAdder* sa = static_cast<const USetAdder*>(context);
   55|  1.98k|    sa->add(sa->set, start);
   56|  1.98k|    return true;
   57|  1.98k|}

ucase_fold_78:
 1470|  61.1M|ucase_fold(UChar32 c, uint32_t options) {
 1471|  61.1M|    uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
  ------------------
  |  |  360|  61.1M|#define UTRIE2_GET16(trie, c) _UTRIE2_GET((trie), index, (trie)->indexLength, (c))
  |  |  ------------------
  |  |  |  |  871|  61.1M|    (trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
  |  |  |  |  ------------------
  |  |  |  |  |  |  845|  61.1M|    ((uint32_t)(c)<0xd800 ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (845:6): [True: 51.6M, False: 9.50M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  846|  61.1M|        _UTRIE2_INDEX_RAW(0, (trie)->index, c) : \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|  51.6M|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  816|  51.6M|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|  51.6M|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  847|  61.1M|        (uint32_t)(c)<=0xffff ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (847:9): [True: 8.88M, False: 623k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  848|  9.50M|            _UTRIE2_INDEX_RAW( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|  17.7M|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (815:30): [True: 6.70M, False: 2.17M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  816|  8.88M|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|  8.88M|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  849|  9.50M|                (c)<=0xdbff ? UTRIE2_LSCP_INDEX_2_OFFSET-(0xd800>>UTRIE2_SHIFT_2) : 0, \
  |  |  |  |  |  |  850|  9.50M|                (trie)->index, c) : \
  |  |  |  |  |  |  851|  9.50M|            (uint32_t)(c)>0x10ffff ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (851:13): [True: 2.99k, False: 620k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  852|   623k|                (asciiOffset)+UTRIE2_BAD_UTF8_DATA_OFFSET : \
  |  |  |  |  |  |  853|   623k|                (c)>=(trie)->highStart ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (853:17): [True: 1.10k, False: 619k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   620k|                    (trie)->highValueIndex : \
  |  |  |  |  |  |  855|   620k|                    _UTRIE2_INDEX_FROM_SUPP((trie)->index, c))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  833|   619k|    (((int32_t)((trieIndex)[ \
  |  |  |  |  |  |  |  |  834|   619k|        (trieIndex)[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+ \
  |  |  |  |  |  |  |  |  835|   619k|                      ((c)>>UTRIE2_SHIFT_1)]+ \
  |  |  |  |  |  |  |  |  836|   619k|        (((c)>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK)]) \
  |  |  |  |  |  |  |  |  837|   619k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  838|   619k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1472|  61.1M|    if(!UCASE_HAS_EXCEPTION(props)) {
  ------------------
  |  |  380|  61.1M|#define UCASE_HAS_EXCEPTION(props) ((props)&UCASE_EXCEPTION)
  |  |  ------------------
  |  |  |  |  377|  61.1M|#define UCASE_EXCEPTION         8
  |  |  ------------------
  ------------------
  |  Branch (1472:8): [True: 59.5M, False: 1.56M]
  ------------------
 1473|  59.5M|        if(UCASE_IS_UPPER_OR_TITLE(props)) {
  ------------------
  |  |  374|  59.5M|#define UCASE_IS_UPPER_OR_TITLE(props) ((props)&2)
  |  |  ------------------
  |  |  |  Branch (374:40): [True: 21.2M, False: 38.2M]
  |  |  ------------------
  ------------------
 1474|  21.2M|            c+=UCASE_GET_DELTA(props);
  ------------------
  |  |  397|  21.2M|#   define UCASE_GET_DELTA(props) ((int16_t)(props)>>UCASE_DELTA_SHIFT)
  |  |  ------------------
  |  |  |  |  391|  21.2M|#define UCASE_DELTA_SHIFT   7
  |  |  ------------------
  ------------------
 1475|  21.2M|        }
 1476|  59.5M|    } else {
 1477|  1.56M|        const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props);
  ------------------
  |  |   79|  1.56M|#define GET_EXCEPTIONS(csp, props) ((csp)->exceptions+((props)>>UCASE_EXC_SHIFT))
  |  |  ------------------
  |  |  |  |  403|  1.56M|#define UCASE_EXC_SHIFT     4
  |  |  ------------------
  ------------------
 1478|  1.56M|        uint16_t excWord=*pe++;
 1479|  1.56M|        int32_t idx;
 1480|  1.56M|        if(excWord&UCASE_EXC_CONDITIONAL_FOLD) {
  ------------------
  |  |  445|  1.56M|#define UCASE_EXC_CONDITIONAL_FOLD      0x8000
  ------------------
  |  Branch (1480:12): [True: 514k, False: 1.04M]
  ------------------
 1481|       |            /* special case folding mappings, hardcoded */
 1482|   514k|            if((options&_FOLD_CASE_OPTIONS_MASK)==U_FOLD_CASE_DEFAULT) {
  ------------------
  |  |   83|   514k|#define _FOLD_CASE_OPTIONS_MASK 7
  ------------------
                          if((options&_FOLD_CASE_OPTIONS_MASK)==U_FOLD_CASE_DEFAULT) {
  ------------------
  |  |   22|   514k|#define U_FOLD_CASE_DEFAULT 0
  ------------------
  |  Branch (1482:16): [True: 0, False: 514k]
  ------------------
 1483|       |                /* default mappings */
 1484|      0|                if(c==0x49) {
  ------------------
  |  Branch (1484:20): [True: 0, False: 0]
  ------------------
 1485|       |                    /* 0049; C; 0069; # LATIN CAPITAL LETTER I */
 1486|      0|                    return 0x69;
 1487|      0|                } else if(c==0x130) {
  ------------------
  |  Branch (1487:27): [True: 0, False: 0]
  ------------------
 1488|       |                    /* no simple case folding for U+0130 */
 1489|      0|                    return c;
 1490|      0|                }
 1491|   514k|            } else {
 1492|       |                /* Turkic mappings */
 1493|   514k|                if(c==0x49) {
  ------------------
  |  Branch (1493:20): [True: 514k, False: 460]
  ------------------
 1494|       |                    /* 0049; T; 0131; # LATIN CAPITAL LETTER I */
 1495|   514k|                    return 0x131;
 1496|   514k|                } else if(c==0x130) {
  ------------------
  |  Branch (1496:27): [True: 460, False: 0]
  ------------------
 1497|       |                    /* 0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE */
 1498|    460|                    return 0x69;
 1499|    460|                }
 1500|   514k|            }
 1501|   514k|        }
 1502|  1.04M|        if((excWord&UCASE_EXC_NO_SIMPLE_CASE_FOLDING)!=0) {
  ------------------
  |  Branch (1502:12): [True: 1.45k, False: 1.04M]
  ------------------
 1503|  1.45k|            return c;
 1504|  1.45k|        }
 1505|  1.04M|        if(HAS_SLOT(excWord, UCASE_EXC_DELTA) && UCASE_IS_UPPER_OR_TITLE(props)) {
  ------------------
  |  |  101|  2.09M|#define HAS_SLOT(flags, idx) ((flags)&(1<<(idx)))
  |  |  ------------------
  |  |  |  Branch (101:30): [True: 627k, False: 420k]
  |  |  ------------------
  ------------------
                      if(HAS_SLOT(excWord, UCASE_EXC_DELTA) && UCASE_IS_UPPER_OR_TITLE(props)) {
  ------------------
  |  |  374|   627k|#define UCASE_IS_UPPER_OR_TITLE(props) ((props)&2)
  |  |  ------------------
  |  |  |  Branch (374:40): [True: 1.79k, False: 626k]
  |  |  ------------------
  ------------------
 1506|  1.79k|            int32_t delta;
 1507|  1.79k|            GET_SLOT_VALUE(excWord, UCASE_EXC_DELTA, pe, delta);
  ------------------
  |  |  113|  1.79k|#define GET_SLOT_VALUE(excWord, idx, pExc16, value) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.79k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  114|  1.79k|    if(((excWord)&UCASE_EXC_DOUBLE_SLOTS)==0) { \
  |  |  ------------------
  |  |  |  |  423|  1.79k|#define UCASE_EXC_DOUBLE_SLOTS      0x100
  |  |  ------------------
  |  |  |  Branch (114:8): [True: 1.79k, False: 0]
  |  |  ------------------
  |  |  115|  1.79k|        (pExc16)+=SLOT_OFFSET(excWord, idx); \
  |  |  ------------------
  |  |  |  |  102|  1.79k|#define SLOT_OFFSET(flags, idx) flagsOffset[(flags)&((1<<(idx))-1)]
  |  |  ------------------
  |  |  116|  1.79k|        (value)=*pExc16; \
  |  |  117|  1.79k|    } 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|  1.79k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.79k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1508|  1.79k|            return (excWord&UCASE_EXC_DELTA_IS_NEGATIVE)==0 ? c+delta : c-delta;
  ------------------
  |  Branch (1508:20): [True: 1.71k, False: 78]
  ------------------
 1509|  1.79k|        }
 1510|  1.04M|        if(HAS_SLOT(excWord, UCASE_EXC_FOLD)) {
  ------------------
  |  |  101|  1.04M|#define HAS_SLOT(flags, idx) ((flags)&(1<<(idx)))
  |  |  ------------------
  |  |  |  Branch (101:30): [True: 240, False: 1.04M]
  |  |  ------------------
  ------------------
 1511|    240|            idx=UCASE_EXC_FOLD;
 1512|  1.04M|        } else if(HAS_SLOT(excWord, UCASE_EXC_LOWER)) {
  ------------------
  |  |  101|  1.04M|#define HAS_SLOT(flags, idx) ((flags)&(1<<(idx)))
  |  |  ------------------
  |  |  |  Branch (101:30): [True: 411k, False: 634k]
  |  |  ------------------
  ------------------
 1513|   411k|            idx=UCASE_EXC_LOWER;
 1514|   634k|        } else {
 1515|   634k|            return c;
 1516|   634k|        }
 1517|  1.04M|        GET_SLOT_VALUE(excWord, idx, pe, c);
  ------------------
  |  |  113|   411k|#define GET_SLOT_VALUE(excWord, idx, pExc16, value) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   411k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  114|   411k|    if(((excWord)&UCASE_EXC_DOUBLE_SLOTS)==0) { \
  |  |  ------------------
  |  |  |  |  423|   411k|#define UCASE_EXC_DOUBLE_SLOTS      0x100
  |  |  ------------------
  |  |  |  Branch (114:8): [True: 411k, False: 0]
  |  |  ------------------
  |  |  115|   411k|        (pExc16)+=SLOT_OFFSET(excWord, idx); \
  |  |  ------------------
  |  |  |  |  102|   411k|#define SLOT_OFFSET(flags, idx) flagsOffset[(flags)&((1<<(idx))-1)]
  |  |  ------------------
  |  |  116|   411k|        (value)=*pExc16; \
  |  |  117|   411k|    } 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|  1.04M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.04M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1518|   411k|    }
 1519|  59.9M|    return c;
 1520|  61.1M|}
u_foldCase_78:
 1654|  61.1M|u_foldCase(UChar32 c, uint32_t options) {
 1655|  61.1M|    return ucase_fold(c, options);
  ------------------
  |  |  571|  61.1M|#define ucase_fold U_ICU_ENTRY_POINT_RENAME(ucase_fold)
  |  |  ------------------
  |  |  |  |  123|  61.1M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  61.1M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  61.1M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1656|  61.1M|}

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_isdigit_78:
  115|  90.9M|u_isdigit(UChar32 c) {
  116|  90.9M|    uint32_t props;
  117|  90.9M|    GET_PROPS(c, props);
  ------------------
  |  |   44|  90.9M|#define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c))
  |  |  ------------------
  |  |  |  |  360|  90.9M|#define UTRIE2_GET16(trie, c) _UTRIE2_GET((trie), index, (trie)->indexLength, (c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  871|  90.9M|    (trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  845|  90.9M|    ((uint32_t)(c)<0xd800 ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (845:6): [True: 90.1M, False: 736k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  846|  90.9M|        _UTRIE2_INDEX_RAW(0, (trie)->index, c) : \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  815|  90.1M|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  |  |  816|  90.1M|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  817|  90.1M|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  847|  90.9M|        (uint32_t)(c)<=0xffff ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (847:9): [True: 717k, False: 18.8k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  848|   736k|            _UTRIE2_INDEX_RAW( \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  815|  1.43M|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (815:30): [True: 748, False: 716k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  816|   717k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  817|   717k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  849|   736k|                (c)<=0xdbff ? UTRIE2_LSCP_INDEX_2_OFFSET-(0xd800>>UTRIE2_SHIFT_2) : 0, \
  |  |  |  |  |  |  |  |  850|   736k|                (trie)->index, c) : \
  |  |  |  |  |  |  |  |  851|   736k|            (uint32_t)(c)>0x10ffff ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (851:13): [True: 467, False: 18.4k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  852|  18.8k|                (asciiOffset)+UTRIE2_BAD_UTF8_DATA_OFFSET : \
  |  |  |  |  |  |  |  |  853|  18.8k|                (c)>=(trie)->highStart ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (853:17): [True: 0, False: 18.4k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  18.4k|                    (trie)->highValueIndex : \
  |  |  |  |  |  |  |  |  855|  18.4k|                    _UTRIE2_INDEX_FROM_SUPP((trie)->index, c))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  833|  18.4k|    (((int32_t)((trieIndex)[ \
  |  |  |  |  |  |  |  |  |  |  834|  18.4k|        (trieIndex)[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+ \
  |  |  |  |  |  |  |  |  |  |  835|  18.4k|                      ((c)>>UTRIE2_SHIFT_1)]+ \
  |  |  |  |  |  |  |  |  |  |  836|  18.4k|        (((c)>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK)]) \
  |  |  |  |  |  |  |  |  |  |  837|  18.4k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  838|  18.4k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  118|  90.9M|    return GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER;
  ------------------
  |  |   65|  90.9M|#define GET_CATEGORY(props) ((props)&0x1f)
  ------------------
  119|  90.9M|}
u_charDigitValue_78:
  343|  87.9M|u_charDigitValue(UChar32 c) {
  344|  87.9M|    uint32_t props;
  345|  87.9M|    int32_t value;
  346|  87.9M|    GET_PROPS(c, props);
  ------------------
  |  |   44|  87.9M|#define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c))
  |  |  ------------------
  |  |  |  |  360|  87.9M|#define UTRIE2_GET16(trie, c) _UTRIE2_GET((trie), index, (trie)->indexLength, (c))
  |  |  |  |  ------------------
  |  |  |  |  |  |  871|  87.9M|    (trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  845|  87.9M|    ((uint32_t)(c)<0xd800 ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (845:6): [True: 87.6M, False: 244k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  846|  87.9M|        _UTRIE2_INDEX_RAW(0, (trie)->index, c) : \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  815|  87.6M|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  |  |  816|  87.6M|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  817|  87.6M|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  847|  87.9M|        (uint32_t)(c)<=0xffff ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (847:9): [True: 226k, False: 17.9k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  848|   244k|            _UTRIE2_INDEX_RAW( \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  815|   452k|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (815:30): [True: 0, False: 226k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  816|   226k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  817|   226k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  849|   244k|                (c)<=0xdbff ? UTRIE2_LSCP_INDEX_2_OFFSET-(0xd800>>UTRIE2_SHIFT_2) : 0, \
  |  |  |  |  |  |  |  |  850|   244k|                (trie)->index, c) : \
  |  |  |  |  |  |  |  |  851|   244k|            (uint32_t)(c)>0x10ffff ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (851:13): [True: 0, False: 17.9k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  852|  17.9k|                (asciiOffset)+UTRIE2_BAD_UTF8_DATA_OFFSET : \
  |  |  |  |  |  |  |  |  853|  17.9k|                (c)>=(trie)->highStart ? \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (853:17): [True: 0, False: 17.9k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  17.9k|                    (trie)->highValueIndex : \
  |  |  |  |  |  |  |  |  855|  17.9k|                    _UTRIE2_INDEX_FROM_SUPP((trie)->index, c))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  833|  17.9k|    (((int32_t)((trieIndex)[ \
  |  |  |  |  |  |  |  |  |  |  834|  17.9k|        (trieIndex)[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+ \
  |  |  |  |  |  |  |  |  |  |  835|  17.9k|                      ((c)>>UTRIE2_SHIFT_1)]+ \
  |  |  |  |  |  |  |  |  |  |  836|  17.9k|        (((c)>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK)]) \
  |  |  |  |  |  |  |  |  |  |  837|  17.9k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  |  |  838|  17.9k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  347|  87.9M|    value=(int32_t)GET_NUMERIC_TYPE_VALUE(props)-UPROPS_NTV_DECIMAL_START;
  ------------------
  |  |   68|  87.9M|#define GET_NUMERIC_TYPE_VALUE(props) ((props)>>UPROPS_NUMERIC_TYPE_VALUE_SHIFT)
  ------------------
  348|  87.9M|    if(value<=9) {
  ------------------
  |  Branch (348:8): [True: 87.9M, False: 0]
  ------------------
  349|  87.9M|        return value;
  350|  87.9M|    } else {
  351|      0|        return -1;
  352|      0|    }
  353|  87.9M|}
u_digit_78:
  449|  87.9M|u_digit(UChar32 ch, int8_t radix) {
  450|  87.9M|    int8_t value;
  451|  87.9M|    if((uint8_t)(radix-2)<=(36-2)) {
  ------------------
  |  Branch (451:8): [True: 87.9M, False: 0]
  ------------------
  452|  87.9M|        value=(int8_t)u_charDigitValue(ch);
  ------------------
  |  |  220|  87.9M|#define u_charDigitValue U_ICU_ENTRY_POINT_RENAME(u_charDigitValue)
  |  |  ------------------
  |  |  |  |  123|  87.9M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  87.9M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  87.9M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  453|  87.9M|        if(value<0) {
  ------------------
  |  Branch (453:12): [True: 0, False: 87.9M]
  ------------------
  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|  87.9M|    } else {
  466|      0|        value=-1;   /* invalid radix */
  467|      0|    }
  468|  87.9M|    return (int8_t)((value<radix) ? value : -1);
  ------------------
  |  Branch (468:21): [True: 87.9M, False: 0]
  ------------------
  469|  87.9M|}
u_getUnicodeProperties_78:
  499|  7.12k|u_getUnicodeProperties(UChar32 c, int32_t column) {
  500|  7.12k|    U_ASSERT(column>=0);
  ------------------
  |  |   35|  7.12k|#   define U_ASSERT(exp) (void)0
  ------------------
  501|  7.12k|    if(column>=propsVectorsColumns) {
  ------------------
  |  Branch (501:8): [True: 0, False: 7.12k]
  ------------------
  502|      0|        return 0;
  503|  7.12k|    } else {
  504|  7.12k|        uint16_t vecIndex=UTRIE2_GET16(&propsVectorsTrie, c);
  ------------------
  |  |  360|  7.12k|#define UTRIE2_GET16(trie, c) _UTRIE2_GET((trie), index, (trie)->indexLength, (c))
  |  |  ------------------
  |  |  |  |  871|  7.12k|    (trie)->data[_UTRIE2_INDEX_FROM_CP(trie, asciiOffset, c)]
  |  |  |  |  ------------------
  |  |  |  |  |  |  845|  7.12k|    ((uint32_t)(c)<0xd800 ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (845:6): [True: 4.86k, False: 2.26k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  846|  7.12k|        _UTRIE2_INDEX_RAW(0, (trie)->index, c) : \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|  4.86k|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  816|  4.86k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|  4.86k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  847|  7.12k|        (uint32_t)(c)<=0xffff ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (847:9): [True: 554, False: 1.71k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  848|  2.26k|            _UTRIE2_INDEX_RAW( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  815|  1.10k|    (((int32_t)((trieIndex)[(offset)+((c)>>UTRIE2_SHIFT_2)]) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (815:30): [True: 1, False: 553]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  816|    554|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  817|    554|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  849|  2.26k|                (c)<=0xdbff ? UTRIE2_LSCP_INDEX_2_OFFSET-(0xd800>>UTRIE2_SHIFT_2) : 0, \
  |  |  |  |  |  |  850|  2.26k|                (trie)->index, c) : \
  |  |  |  |  |  |  851|  2.26k|            (uint32_t)(c)>0x10ffff ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (851:13): [True: 0, False: 1.71k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  852|  1.71k|                (asciiOffset)+UTRIE2_BAD_UTF8_DATA_OFFSET : \
  |  |  |  |  |  |  853|  1.71k|                (c)>=(trie)->highStart ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (853:17): [True: 0, False: 1.71k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  1.71k|                    (trie)->highValueIndex : \
  |  |  |  |  |  |  855|  1.71k|                    _UTRIE2_INDEX_FROM_SUPP((trie)->index, c))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  833|  1.71k|    (((int32_t)((trieIndex)[ \
  |  |  |  |  |  |  |  |  834|  1.71k|        (trieIndex)[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+ \
  |  |  |  |  |  |  |  |  835|  1.71k|                      ((c)>>UTRIE2_SHIFT_1)]+ \
  |  |  |  |  |  |  |  |  836|  1.71k|        (((c)>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK)]) \
  |  |  |  |  |  |  |  |  837|  1.71k|    <<UTRIE2_INDEX_SHIFT)+ \
  |  |  |  |  |  |  |  |  838|  1.71k|    ((c)&UTRIE2_DATA_MASK))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  505|  7.12k|        return propsVectors[vecIndex+column];
  506|  7.12k|    }
  507|  7.12k|}
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|}
upropsvec_addPropertyStarts_78:
  709|      1|upropsvec_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) {
  710|      1|    if(U_FAILURE(*pErrorCode)) {
  ------------------
  |  Branch (710:8): [True: 0, False: 1]
  ------------------
  711|      0|        return;
  712|      0|    }
  713|       |
  714|       |    /* add the start code point of each same-value range of the properties vectors trie */
  715|      1|    utrie2_enum(&propsVectorsTrie, 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  716|      1|}
uchar.cpp:_ZL24_enumPropertyStartsRangePKviij:
  635|  13.1k|_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32_t value) {
  636|       |    /* add the start code point to the USet */
  637|  13.1k|    const USetAdder* sa = static_cast<const USetAdder*>(context);
  638|  13.1k|    sa->add(sa->set, start);
  639|  13.1k|    (void)end;
  640|  13.1k|    (void)value;
  641|  13.1k|    return true;
  642|  13.1k|}

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

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

ucurr_forLocale_78:
  505|   269k|                UErrorCode* ec) {
  506|   269k|    if (U_FAILURE(*ec)) { return 0; }
  ------------------
  |  Branch (506:9): [True: 0, False: 269k]
  ------------------
  507|   269k|    if (buffCapacity < 0 || (buff == nullptr && buffCapacity > 0)) {
  ------------------
  |  Branch (507:9): [True: 0, False: 269k]
  |  Branch (507:30): [True: 0, False: 269k]
  |  Branch (507:49): [True: 0, False: 0]
  ------------------
  508|      0|        *ec = U_ILLEGAL_ARGUMENT_ERROR;
  509|      0|        return 0;
  510|      0|    }
  511|       |
  512|   269k|    UErrorCode localStatus = U_ZERO_ERROR;
  513|   269k|    CharString currency = ulocimp_getKeywordValue(locale, "currency", localStatus);
  ------------------
  |  | 1200|   269k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|   269k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   269k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   269k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  514|   269k|    int32_t resLen = currency.length();
  515|       |
  516|   269k|    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: 269k, False: 0]
  |  Branch (516:35): [True: 0, False: 269k]
  |  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|   269k|    CharString id = idForLocale(locale, ec);
  526|   269k|    if (U_FAILURE(*ec)) {
  ------------------
  |  Branch (526:9): [True: 0, False: 269k]
  ------------------
  527|      0|        return 0;
  528|      0|    }
  529|       |
  530|   269k|#if !UCONFIG_NO_SERVICE
  531|   269k|    const char16_t* result = CReg::get(id.data());
  532|   269k|    if (result) {
  ------------------
  |  Branch (532:9): [True: 0, False: 269k]
  ------------------
  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|   269k|#endif
  540|       |    // Remove variants, which is only needed for registration.
  541|   269k|    char *idDelim = uprv_strchr(id.data(), VAR_DELIM);
  ------------------
  |  |   40|   269k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   269k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  542|   269k|    if (idDelim) {
  ------------------
  |  Branch (542:9): [True: 0, False: 269k]
  ------------------
  543|      0|        id.truncate(idDelim - id.data());
  544|      0|    }
  545|       |
  546|   269k|    const char16_t* s = nullptr;  // Currency code from data file.
  547|   269k|    if (id.isEmpty()) {
  ------------------
  |  Branch (547:9): [True: 49.5k, False: 220k]
  ------------------
  548|       |        // No point looking in the data for an empty string.
  549|       |        // This is what we would get.
  550|  49.5k|        localStatus = U_MISSING_RESOURCE_ERROR;
  551|   220k|    } else {
  552|       |        // Look up the CurrencyMap element in the root bundle.
  553|   220k|        localStatus = U_ZERO_ERROR;
  554|   220k|        UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus);
  ------------------
  |  | 1693|   220k|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|   220k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   220k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   220k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus);
  ------------------
  |  |   21|   220k|#define U_ICUDATA_CURR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "curr"
  |  |  ------------------
  |  |  |  |  154|   220k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  555|   220k|        UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus);
  ------------------
  |  | 1661|   220k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|   220k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   220k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   220k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  556|   220k|        LocalUResourceBundlePointer countryArray(ures_getByKey(rb, id.data(), cm, &localStatus));
  ------------------
  |  | 1661|   220k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|   220k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   220k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   220k|#       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|   220k|        if (U_SUCCESS(localStatus)) {
  ------------------
  |  Branch (559:13): [True: 216k, False: 3.86k]
  ------------------
  560|   216k|            int32_t arrayLength = ures_getSize(countryArray.getAlias());
  ------------------
  |  | 1674|   216k|#define ures_getSize U_ICU_ENTRY_POINT_RENAME(ures_getSize)
  |  |  ------------------
  |  |  |  |  123|   216k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   216k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   216k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  561|   216k|            for (int32_t i = 0; i < arrayLength; ++i) {
  ------------------
  |  Branch (561:33): [True: 216k, False: 0]
  ------------------
  562|   216k|                LocalUResourceBundlePointer currencyReq(
  563|   216k|                    ures_getByIndex(countryArray.getAlias(), i, nullptr, &localStatus));
  ------------------
  |  | 1660|   216k|#define ures_getByIndex U_ICU_ENTRY_POINT_RENAME(ures_getByIndex)
  |  |  ------------------
  |  |  |  |  123|   216k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   216k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   216k|#       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|   216k|                UErrorCode tenderStatus = localStatus;
  566|   216k|                const char16_t *tender =
  567|   216k|                    ures_getStringByKey(currencyReq.getAlias(), "tender", nullptr, &tenderStatus);
  ------------------
  |  | 1677|   216k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|   216k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   216k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   216k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  568|   216k|                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: 216k, False: 0]
  |  Branch (568:60): [True: 0, False: 0]
  ------------------
  569|   216k|                if (!isTender && s != nullptr) {
  ------------------
  |  Branch (569:21): [True: 0, False: 216k]
  |  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|   216k|                s = ures_getStringByKey(currencyReq.getAlias(), "id", &resLen, &localStatus);
  ------------------
  |  | 1677|   216k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|   216k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   216k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   216k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  575|   216k|                if (isTender) {
  ------------------
  |  Branch (575:21): [True: 216k, False: 0]
  ------------------
  576|   216k|                    break;
  577|   216k|                }
  578|   216k|            }
  579|   216k|            if (U_SUCCESS(localStatus) && s == nullptr) {
  ------------------
  |  Branch (579:17): [True: 216k, False: 0]
  |  Branch (579:43): [True: 0, False: 216k]
  ------------------
  580|      0|                localStatus = U_MISSING_RESOURCE_ERROR;
  581|      0|            }
  582|   216k|        }
  583|   220k|    }
  584|       |
  585|   269k|    if ((U_FAILURE(localStatus)) && strchr(id.data(), '_') != nullptr) {
  ------------------
  |  Branch (585:9): [True: 53.4k, False: 216k]
  |  Branch (585:37): [True: 0, False: 53.4k]
  ------------------
  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|   269k|    if (*ec == U_ZERO_ERROR || localStatus != U_ZERO_ERROR) {
  ------------------
  |  Branch (593:9): [True: 269k, False: 0]
  |  Branch (593:32): [True: 0, False: 0]
  ------------------
  594|       |        // There is nothing to fallback to. Report the failure/warning if possible.
  595|   269k|        *ec = localStatus;
  596|   269k|    }
  597|   269k|    if (U_SUCCESS(*ec)) {
  ------------------
  |  Branch (597:9): [True: 216k, False: 53.4k]
  ------------------
  598|   216k|        if(buffCapacity > resLen) {
  ------------------
  |  Branch (598:12): [True: 216k, False: 0]
  ------------------
  599|   216k|            u_strcpy(buff, s);
  ------------------
  |  |  390|   216k|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|   216k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   216k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   216k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  600|   216k|        }
  601|   216k|    }
  602|   269k|    return u_terminateUChars(buff, buffCapacity, resLen, ec);
  ------------------
  |  |  408|   269k|#define u_terminateUChars U_ICU_ENTRY_POINT_RENAME(u_terminateUChars)
  |  |  ------------------
  |  |  |  |  123|   269k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   269k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   269k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  603|   269k|}
ucurr_getName_78:
  645|   341k|              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|   341k|    if (U_FAILURE(*ec)) {
  ------------------
  |  Branch (658:9): [True: 0, False: 341k]
  ------------------
  659|      0|        return nullptr;
  660|      0|    }
  661|       |
  662|   341k|    int32_t choice = (int32_t) nameStyle;
  663|   341k|    if (choice < 0 || choice > 4) {
  ------------------
  |  Branch (663:9): [True: 0, False: 341k]
  |  Branch (663:23): [True: 0, False: 341k]
  ------------------
  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|   341k|    UErrorCode ec2 = U_ZERO_ERROR;
  680|       |
  681|   341k|    if (locale == nullptr) {
  ------------------
  |  Branch (681:9): [True: 0, False: 341k]
  ------------------
  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|   341k|    CharString loc = ulocimp_getName(locale, ec2);
  ------------------
  |  | 1204|   341k|#define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName)
  |  |  ------------------
  |  |  |  |  123|   341k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   341k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   341k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  685|   341k|    if (U_FAILURE(ec2)) {
  ------------------
  |  Branch (685:9): [True: 0, False: 341k]
  ------------------
  686|      0|        *ec = U_ILLEGAL_ARGUMENT_ERROR;
  687|      0|        return nullptr;
  688|      0|    }
  689|       |
  690|   341k|    char buf[ISO_CURRENCY_CODE_LENGTH+1];
  691|   341k|    myUCharsToChars(buf, currency);
  692|       |    
  693|       |    /* Normalize the keyword value to uppercase */
  694|   341k|    T_CString_toUpperCase(buf);
  ------------------
  |  |   70|   341k|#define T_CString_toUpperCase U_ICU_ENTRY_POINT_RENAME(T_CString_toUpperCase)
  |  |  ------------------
  |  |  |  |  123|   341k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   341k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   341k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  695|       |    
  696|   341k|    const char16_t* s = nullptr;
  697|   341k|    ec2 = U_ZERO_ERROR;
  698|   341k|    LocalUResourceBundlePointer rb(ures_open(U_ICUDATA_CURR, loc.data(), &ec2));
  ------------------
  |  | 1691|   341k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|   341k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   341k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   341k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  LocalUResourceBundlePointer rb(ures_open(U_ICUDATA_CURR, loc.data(), &ec2));
  ------------------
  |  |   21|   341k|#define U_ICUDATA_CURR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "curr"
  |  |  ------------------
  |  |  |  |  154|   341k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  699|       |
  700|   341k|    if (nameStyle == UCURR_NARROW_SYMBOL_NAME || nameStyle == UCURR_FORMAL_SYMBOL_NAME || nameStyle == UCURR_VARIANT_SYMBOL_NAME) {
  ------------------
  |  Branch (700:9): [True: 0, False: 341k]
  |  Branch (700:50): [True: 0, False: 341k]
  |  Branch (700:91): [True: 0, False: 341k]
  ------------------
  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|   341k|    if (s == nullptr) {
  ------------------
  |  Branch (725:9): [True: 341k, False: 0]
  ------------------
  726|   341k|        ures_getByKey(rb.getAlias(), CURRENCIES, rb.getAlias(), &ec2);
  ------------------
  |  | 1661|   341k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|   341k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   341k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   341k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  727|   341k|        ures_getByKeyWithFallback(rb.getAlias(), buf, rb.getAlias(), &ec2);
  ------------------
  |  | 1662|   341k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|   341k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   341k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   341k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  728|   341k|        s = ures_getStringByIndex(rb.getAlias(), choice, len, &ec2);
  ------------------
  |  | 1676|   341k|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  123|   341k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   341k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   341k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  729|   341k|    }
  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|   341k|    if (U_SUCCESS(ec2)) {
  ------------------
  |  Branch (733:9): [True: 335k, False: 6.72k]
  ------------------
  734|   335k|        if (ec2 == U_USING_DEFAULT_WARNING
  ------------------
  |  Branch (734:13): [True: 79.0k, False: 256k]
  ------------------
  735|   335k|            || (ec2 == U_USING_FALLBACK_WARNING && *ec != U_USING_DEFAULT_WARNING)) {
  ------------------
  |  Branch (735:17): [True: 217k, False: 38.3k]
  |  Branch (735:52): [True: 129k, False: 88.2k]
  ------------------
  736|   208k|            *ec = ec2;
  737|   208k|        }
  738|   335k|    }
  739|       |
  740|       |    // We no longer support choice format data in names.  Data should not contain
  741|       |    // choice patterns.
  742|   341k|    if (isChoiceFormat != nullptr) {
  ------------------
  |  Branch (742:9): [True: 0, False: 341k]
  ------------------
  743|      0|        *isChoiceFormat = false;
  744|      0|    }
  745|   341k|    if (U_SUCCESS(ec2)) {
  ------------------
  |  Branch (745:9): [True: 335k, False: 6.72k]
  ------------------
  746|   335k|        U_ASSERT(s != nullptr);
  ------------------
  |  |   35|   335k|#   define U_ASSERT(exp) (void)0
  ------------------
  747|   335k|        return s;
  748|   335k|    }
  749|       |
  750|       |    // If we fail to find a match, use the ISO 4217 code
  751|  6.72k|    *len = u_strlen(currency); // Should == ISO_CURRENCY_CODE_LENGTH, but maybe not...?
  ------------------
  |  |  393|  6.72k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|  6.72k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.72k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.72k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  752|  6.72k|    *ec = U_USING_DEFAULT_WARNING;
  753|  6.72k|    return currency;
  754|   341k|}
ucurr_getPluralName_78:
  762|   443k|                    UErrorCode* ec) {
  763|       |    // Look up the Currencies resource for the given locale.  The
  764|       |    // Currencies locale data looks like this:
  765|       |    //|en {
  766|       |    //|  CurrencyPlurals {
  767|       |    //|    USD{
  768|       |    //|      one{"US dollar"}
  769|       |    //|      other{"US dollars"}
  770|       |    //|    }
  771|       |    //|  }
  772|       |    //|}
  773|       |
  774|   443k|    if (U_FAILURE(*ec)) {
  ------------------
  |  Branch (774:9): [True: 0, False: 443k]
  ------------------
  775|      0|        return nullptr;
  776|      0|    }
  777|       |
  778|       |    // Use a separate UErrorCode here that does not propagate out of
  779|       |    // this function.
  780|   443k|    UErrorCode ec2 = U_ZERO_ERROR;
  781|       |
  782|   443k|    if (locale == nullptr) {
  ------------------
  |  Branch (782:9): [True: 0, False: 443k]
  ------------------
  783|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  784|      0|    }
  785|   443k|    CharString loc = ulocimp_getName(locale, ec2);
  ------------------
  |  | 1204|   443k|#define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName)
  |  |  ------------------
  |  |  |  |  123|   443k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   443k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   443k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  786|   443k|    if (U_FAILURE(ec2)) {
  ------------------
  |  Branch (786:9): [True: 0, False: 443k]
  ------------------
  787|      0|        *ec = U_ILLEGAL_ARGUMENT_ERROR;
  788|      0|        return nullptr;
  789|      0|    }
  790|       |
  791|   443k|    char buf[ISO_CURRENCY_CODE_LENGTH+1];
  792|   443k|    myUCharsToChars(buf, currency);
  793|       |
  794|   443k|    const char16_t* s = nullptr;
  795|   443k|    ec2 = U_ZERO_ERROR;
  796|   443k|    UResourceBundle* rb = ures_open(U_ICUDATA_CURR, loc.data(), &ec2);
  ------------------
  |  | 1691|   443k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|   443k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   443k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   443k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  UResourceBundle* rb = ures_open(U_ICUDATA_CURR, loc.data(), &ec2);
  ------------------
  |  |   21|   443k|#define U_ICUDATA_CURR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "curr"
  |  |  ------------------
  |  |  |  |  154|   443k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  797|       |
  798|   443k|    rb = ures_getByKey(rb, CURRENCYPLURALS, rb, &ec2);
  ------------------
  |  | 1661|   443k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|   443k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   443k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   443k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  799|       |
  800|       |    // Fetch resource with multi-level resource inheritance fallback
  801|   443k|    LocalUResourceBundlePointer curr(ures_getByKeyWithFallback(rb, buf, rb, &ec2));
  ------------------
  |  | 1662|   443k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|   443k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   443k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   443k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  802|       |
  803|   443k|    s = ures_getStringByKeyWithFallback(curr.getAlias(), pluralCount, len, &ec2);
  ------------------
  |  | 1678|   443k|#define ures_getStringByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getStringByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|   443k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   443k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   443k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  804|   443k|    if (U_FAILURE(ec2)) {
  ------------------
  |  Branch (804:9): [True: 363k, False: 80.4k]
  ------------------
  805|       |        //  fall back to "other"
  806|   363k|        ec2 = U_ZERO_ERROR;
  807|   363k|        s = ures_getStringByKeyWithFallback(curr.getAlias(), "other", len, &ec2);     
  ------------------
  |  | 1678|   363k|#define ures_getStringByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getStringByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|   363k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   363k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   363k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  808|   363k|        if (U_FAILURE(ec2)) {
  ------------------
  |  Branch (808:13): [True: 153k, False: 209k]
  ------------------
  809|       |            // fall back to long name in Currencies
  810|   153k|            return ucurr_getName(currency, locale, UCURR_LONG_NAME, 
  ------------------
  |  |  837|   153k|#define ucurr_getName U_ICU_ENTRY_POINT_RENAME(ucurr_getName)
  |  |  ------------------
  |  |  |  |  123|   153k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   153k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   153k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  811|   153k|                                 isChoiceFormat, len, ec);
  812|   153k|        }
  813|   363k|    }
  814|       |
  815|       |    // If we've succeeded we're done.  Otherwise, try to fallback.
  816|       |    // If that fails (because we are already at root) then exit.
  817|   290k|    if (U_SUCCESS(ec2)) {
  ------------------
  |  Branch (817:9): [True: 290k, False: 0]
  ------------------
  818|   290k|        if (ec2 == U_USING_DEFAULT_WARNING
  ------------------
  |  Branch (818:13): [True: 0, False: 290k]
  ------------------
  819|   290k|            || (ec2 == U_USING_FALLBACK_WARNING && *ec != U_USING_DEFAULT_WARNING)) {
  ------------------
  |  Branch (819:17): [True: 69.5k, False: 220k]
  |  Branch (819:52): [True: 69.5k, False: 0]
  ------------------
  820|  69.5k|            *ec = ec2;
  821|  69.5k|        }
  822|   290k|        U_ASSERT(s != nullptr);
  ------------------
  |  |   35|   290k|#   define U_ASSERT(exp) (void)0
  ------------------
  823|   290k|        return s;
  824|   290k|    }
  825|       |
  826|       |    // If we fail to find a match, use the ISO 4217 code
  827|      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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  828|      0|    *ec = U_USING_DEFAULT_WARNING;
  829|      0|    return currency;
  830|   290k|}
uprv_getStaticCurrencyName_78:
 1633|   132k|{
 1634|   132k|    U_NAMESPACE_USE
  ------------------
  |  |  112|   132k|#   define U_NAMESPACE_USE using namespace U_ICU_NAMESPACE;
  ------------------
 1635|       |
 1636|   132k|    int32_t len;
 1637|   132k|    const char16_t* currname = ucurr_getName(iso, loc, UCURR_SYMBOL_NAME,
  ------------------
  |  |  837|   132k|#define ucurr_getName U_ICU_ENTRY_POINT_RENAME(ucurr_getName)
  |  |  ------------------
  |  |  |  |  123|   132k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   132k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   132k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1638|   132k|                                          nullptr /* isChoiceFormat */, &len, &ec);
 1639|   132k|    if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (1639:9): [True: 132k, False: 0]
  ------------------
 1640|   132k|        result.setTo(currname, len);
 1641|   132k|    }
 1642|   132k|}
ucurr_getDefaultFractionDigitsForUsage_78:
 1650|  31.2k|ucurr_getDefaultFractionDigitsForUsage(const char16_t* currency, const UCurrencyUsage usage, UErrorCode* ec) {
 1651|  31.2k|    int32_t fracDigits = 0;
 1652|  31.2k|    if (U_SUCCESS(*ec)) {
  ------------------
  |  Branch (1652:9): [True: 31.2k, False: 0]
  ------------------
 1653|  31.2k|        switch (usage) {
 1654|  31.2k|            case UCURR_USAGE_STANDARD:
  ------------------
  |  Branch (1654:13): [True: 31.2k, False: 0]
  ------------------
 1655|  31.2k|                fracDigits = (_findMetaData(currency, *ec))[0];
 1656|  31.2k|                break;
 1657|      0|            case UCURR_USAGE_CASH:
  ------------------
  |  Branch (1657:13): [True: 0, False: 31.2k]
  ------------------
 1658|      0|                fracDigits = (_findMetaData(currency, *ec))[2];
 1659|      0|                break;
 1660|      0|            default:
  ------------------
  |  Branch (1660:13): [True: 0, False: 31.2k]
  ------------------
 1661|      0|                *ec = U_UNSUPPORTED_ERROR;
 1662|  31.2k|        }
 1663|  31.2k|    }
 1664|  31.2k|    return fracDigits;
 1665|  31.2k|}
ucurr_getRoundingIncrementForUsage_78:
 1673|  15.6k|ucurr_getRoundingIncrementForUsage(const char16_t* currency, const UCurrencyUsage usage, UErrorCode* ec) {
 1674|  15.6k|    double result = 0.0;
 1675|       |
 1676|  15.6k|    const int32_t *data = _findMetaData(currency, *ec);
 1677|  15.6k|    if (U_SUCCESS(*ec)) {
  ------------------
  |  Branch (1677:9): [True: 15.6k, False: 0]
  ------------------
 1678|  15.6k|        int32_t fracDigits;
 1679|  15.6k|        int32_t increment;
 1680|  15.6k|        switch (usage) {
 1681|  15.6k|            case UCURR_USAGE_STANDARD:
  ------------------
  |  Branch (1681:13): [True: 15.6k, False: 0]
  ------------------
 1682|  15.6k|                fracDigits = data[0];
 1683|  15.6k|                increment = data[1];
 1684|  15.6k|                break;
 1685|      0|            case UCURR_USAGE_CASH:
  ------------------
  |  Branch (1685:13): [True: 0, False: 15.6k]
  ------------------
 1686|      0|                fracDigits = data[2];
 1687|      0|                increment = data[3];
 1688|      0|                break;
 1689|      0|            default:
  ------------------
  |  Branch (1689:13): [True: 0, False: 15.6k]
  ------------------
 1690|      0|                *ec = U_UNSUPPORTED_ERROR;
 1691|      0|                return result;
 1692|  15.6k|        }
 1693|       |
 1694|       |        // If the meta data is invalid, return 0.0
 1695|  15.6k|        if (fracDigits < 0 || fracDigits > MAX_POW10) {
  ------------------
  |  Branch (1695:13): [True: 0, False: 15.6k]
  |  Branch (1695:31): [True: 0, False: 15.6k]
  ------------------
 1696|      0|            *ec = U_INVALID_FORMAT_ERROR;
 1697|  15.6k|        } else {
 1698|       |            // A rounding value of 0 or 1 indicates no rounding.
 1699|  15.6k|            if (increment >= 2) {
  ------------------
  |  Branch (1699:17): [True: 0, False: 15.6k]
  ------------------
 1700|       |                // Return (increment) / 10^(fracDigits).  The only actual rounding data,
 1701|       |                // as of this writing, is CHF { 2, 5 }.
 1702|      0|                result = double(increment) / POW10[fracDigits];
 1703|      0|            }
 1704|  15.6k|        }
 1705|  15.6k|    }
 1706|       |
 1707|  15.6k|    return result;
 1708|  15.6k|}
ucurr.cpp:_ZL11idForLocalePKcP10UErrorCode:
  345|   269k|{
  346|   269k|    return ulocimp_getRegionForSupplementalData(locale, false, *ec);
  ------------------
  |  | 1207|   269k|#define ulocimp_getRegionForSupplementalData U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegionForSupplementalData)
  |  |  ------------------
  |  |  |  |  123|   269k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   269k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   269k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  347|   269k|}
_ZN4CReg3getEPKc:
  420|   269k|    static const char16_t* get(const char* id) {
  421|   269k|        const char16_t* result = nullptr;
  422|   269k|        umtx_lock(&gCRegLock);
  ------------------
  |  | 1250|   269k|#define umtx_lock U_ICU_ENTRY_POINT_RENAME(umtx_lock)
  |  |  ------------------
  |  |  |  |  123|   269k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   269k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   269k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  423|   269k|        CReg* p = gCRegHead;
  424|       |
  425|       |        /* register cleanup of the mutex */
  426|   269k|        ucln_common_registerCleanup(UCLN_COMMON_CURRENCY, currency_cleanup);
  ------------------
  |  |  617|   269k|#define ucln_common_registerCleanup U_ICU_ENTRY_POINT_RENAME(ucln_common_registerCleanup)
  |  |  ------------------
  |  |  |  |  123|   269k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   269k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   269k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  427|   269k|        while (p) {
  ------------------
  |  Branch (427:16): [True: 0, False: 269k]
  ------------------
  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|   269k|        umtx_unlock(&gCRegLock);
  ------------------
  |  | 1251|   269k|#define umtx_unlock U_ICU_ENTRY_POINT_RENAME(umtx_unlock)
  |  |  ------------------
  |  |  |  |  123|   269k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   269k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   269k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  435|   269k|        return result;
  436|   269k|    }
ucurr.cpp:_ZL15myUCharsToCharsPcPKDs:
  281|   832k|myUCharsToChars(char* resultOfLen4, const char16_t* currency) {
  282|   832k|    u_UCharsToChars(currency, resultOfLen4, ISO_CURRENCY_CODE_LENGTH);
  ------------------
  |  |  211|   832k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|   832k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   832k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   832k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  u_UCharsToChars(currency, resultOfLen4, ISO_CURRENCY_CODE_LENGTH);
  ------------------
  |  |   74|   832k|#define ISO_CURRENCY_CODE_LENGTH 3
  ------------------
  283|   832k|    resultOfLen4[ISO_CURRENCY_CODE_LENGTH] = 0;
  ------------------
  |  |   74|   832k|#define ISO_CURRENCY_CODE_LENGTH 3
  ------------------
  284|   832k|    return resultOfLen4;
  285|   832k|}
ucurr.cpp:_ZL13_findMetaDataPKDsR10UErrorCode:
  296|  46.8k|_findMetaData(const char16_t* currency, UErrorCode& ec) {
  297|       |
  298|  46.8k|    if (currency == nullptr || *currency == 0) {
  ------------------
  |  Branch (298:9): [True: 0, False: 46.8k]
  |  Branch (298:32): [True: 0, False: 46.8k]
  ------------------
  299|      0|        if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (299:13): [True: 0, False: 0]
  ------------------
  300|      0|            ec = U_ILLEGAL_ARGUMENT_ERROR;
  301|      0|        }
  302|      0|        return LAST_RESORT_DATA;
  303|      0|    }
  304|       |
  305|       |    // Get CurrencyMeta resource out of root locale file.  [This may
  306|       |    // move out of the root locale file later; if it does, update this
  307|       |    // code.]
  308|  46.8k|    UResourceBundle* currencyData = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &ec);
  ------------------
  |  | 1693|  46.8k|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|  46.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  46.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  46.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  UResourceBundle* currencyData = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &ec);
  ------------------
  |  |   21|  46.8k|#define U_ICUDATA_CURR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "curr"
  |  |  ------------------
  |  |  |  |  154|  46.8k|#define U_ICUDATA_NAME    "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER
  |  |  ------------------
  ------------------
  309|  46.8k|    LocalUResourceBundlePointer currencyMeta(ures_getByKey(currencyData, CURRENCY_META, currencyData, &ec));
  ------------------
  |  | 1661|  46.8k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  46.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  46.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  46.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  310|       |
  311|  46.8k|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (311:9): [True: 0, False: 46.8k]
  ------------------
  312|       |        // Config/build error; return hard-coded defaults
  313|      0|        return LAST_RESORT_DATA;
  314|      0|    }
  315|       |
  316|       |    // Look up our currency, or if that's not available, then DEFAULT
  317|  46.8k|    char buf[ISO_CURRENCY_CODE_LENGTH+1];
  318|  46.8k|    UErrorCode ec2 = U_ZERO_ERROR; // local error code: soft failure
  319|  46.8k|    LocalUResourceBundlePointer rb(ures_getByKey(currencyMeta.getAlias(), myUCharsToChars(buf, currency), nullptr, &ec2));
  ------------------
  |  | 1661|  46.8k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  46.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  46.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  46.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  320|  46.8k|      if (U_FAILURE(ec2)) {
  ------------------
  |  Branch (320:11): [True: 34.4k, False: 12.4k]
  ------------------
  321|  34.4k|        rb.adoptInstead(ures_getByKey(currencyMeta.getAlias(),DEFAULT_META, nullptr, &ec));
  ------------------
  |  | 1661|  34.4k|#define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey)
  |  |  ------------------
  |  |  |  |  123|  34.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  34.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  34.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  322|  34.4k|        if (U_FAILURE(ec)) {
  ------------------
  |  Branch (322:13): [True: 0, False: 34.4k]
  ------------------
  323|       |            // Config/build error; return hard-coded defaults
  324|      0|            return LAST_RESORT_DATA;
  325|      0|        }
  326|  34.4k|    }
  327|       |
  328|  46.8k|    int32_t len;
  329|  46.8k|    const int32_t *data = ures_getIntVector(rb.getAlias(), &len, &ec);
  ------------------
  |  | 1665|  46.8k|#define ures_getIntVector U_ICU_ENTRY_POINT_RENAME(ures_getIntVector)
  |  |  ------------------
  |  |  |  |  123|  46.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  46.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  46.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|  46.8k|    if (U_FAILURE(ec) || len != 4) {
  ------------------
  |  Branch (330:9): [True: 0, False: 46.8k]
  |  Branch (330:26): [True: 0, False: 46.8k]
  ------------------
  331|       |        // Config/build error; return hard-coded defaults
  332|      0|        if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (332:13): [True: 0, False: 0]
  ------------------
  333|      0|            ec = U_INVALID_FORMAT_ERROR;
  334|      0|        }
  335|      0|        return LAST_RESORT_DATA;
  336|      0|    }
  337|       |
  338|  46.8k|    return data;
  339|  46.8k|}

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

UDataMemory_init_78:
   28|  3.58k|U_CFUNC void UDataMemory_init(UDataMemory *This) {
   29|  3.58k|    uprv_memset(This, 0, sizeof(UDataMemory));
  ------------------
  |  |  100|  3.58k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  3.58k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   30|  3.58k|    This->length=-1;
   31|  3.58k|}
UDatamemory_assign_78:
   34|      1|U_CFUNC void UDatamemory_assign(UDataMemory *dest, UDataMemory *source) {
   35|       |    /* UDataMemory Assignment.  Destination UDataMemory must be initialized first.  */
   36|      1|    UBool mallocedFlag = dest->heapAllocated;
   37|      1|    uprv_memcpy(dest, source, sizeof(UDataMemory));
  ------------------
  |  |   42|      1|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      1|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      1|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      1|    _Pragma("clang diagnostic push") \
  |  |   45|      1|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      1|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      1|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      1|    _Pragma("clang diagnostic pop") \
  |  |   49|      1|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      1|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      1|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      1|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   38|      1|    dest->heapAllocated = mallocedFlag;
   39|      1|}
UDataMemory_createNewInstance_78:
   41|  1.32k|U_CFUNC UDataMemory *UDataMemory_createNewInstance(UErrorCode *pErr) {
   42|  1.32k|    UDataMemory *This;
   43|       |
   44|  1.32k|    if (U_FAILURE(*pErr)) {
  ------------------
  |  Branch (44:9): [True: 0, False: 1.32k]
  ------------------
   45|      0|        return nullptr;
   46|      0|    }
   47|  1.32k|    This = (UDataMemory *)uprv_malloc(sizeof(UDataMemory));
  ------------------
  |  | 1524|  1.32k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.32k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.32k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.32k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   48|  1.32k|    if (This == nullptr) {
  ------------------
  |  Branch (48:9): [True: 0, False: 1.32k]
  ------------------
   49|      0|        *pErr = U_MEMORY_ALLOCATION_ERROR; }
   50|  1.32k|    else {
   51|  1.32k|        UDataMemory_init(This);
  ------------------
  |  |   80|  1.32k|#define UDataMemory_init U_ICU_ENTRY_POINT_RENAME(UDataMemory_init)
  |  |  ------------------
  |  |  |  |  123|  1.32k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.32k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.32k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   52|  1.32k|        This->heapAllocated = true;
   53|  1.32k|    }
   54|  1.32k|    return This;
   55|  1.32k|}
UDataMemory_normalizeDataPointer_78:
   59|      1|UDataMemory_normalizeDataPointer(const void *p) {
   60|       |    /* allow the data to be optionally prepended with an alignment-forcing double value */
   61|      1|    const DataHeader *pdh = (const DataHeader *)p;
   62|      1|    if(pdh==nullptr || (pdh->dataHeader.magic1==0xda && pdh->dataHeader.magic2==0x27)) {
  ------------------
  |  Branch (62:8): [True: 0, False: 1]
  |  Branch (62:25): [True: 1, False: 0]
  |  Branch (62:57): [True: 1, False: 0]
  ------------------
   63|      1|        return pdh;
   64|      1|    } else {
   65|       |#if U_PLATFORM == U_PF_OS400
   66|       |        /*
   67|       |        TODO: Fix this once the compiler implements this feature. Keep in sync with genccode.c
   68|       |
   69|       |        This is here because this platform can't currently put
   70|       |        const data into the read-only pages of an object or
   71|       |        shared library (service program). Only strings are allowed in read-only
   72|       |        pages, so we use char * strings to store the data.
   73|       |
   74|       |        In order to prevent the beginning of the data from ever matching the
   75|       |        magic numbers we must skip the initial double.
   76|       |        [grhoten 4/24/2003]
   77|       |        */
   78|       |        return (const DataHeader *)*((const void **)p+1);
   79|       |#else
   80|      0|        return (const DataHeader *)((const double *)p+1);
   81|      0|#endif
   82|      0|    }
   83|      1|}
UDataMemory_setData_78:
   86|      1|U_CFUNC void UDataMemory_setData (UDataMemory *This, const void *dataAddr) {
   87|      1|    This->pHeader = UDataMemory_normalizeDataPointer(dataAddr);
  ------------------
  |  |   82|      1|#define UDataMemory_normalizeDataPointer U_ICU_ENTRY_POINT_RENAME(UDataMemory_normalizeDataPointer)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   88|      1|}
udata_getMemory_78:
  104|  1.32k|udata_getMemory(UDataMemory *pData) {
  105|  1.32k|    if(pData!=nullptr && pData->pHeader!=nullptr) {
  ------------------
  |  Branch (105:8): [True: 1.32k, False: 0]
  |  Branch (105:26): [True: 1.32k, False: 0]
  ------------------
  106|  1.32k|        return (char *)(pData->pHeader)+udata_getHeaderSize(pData->pHeader);
  ------------------
  |  |  887|  1.32k|#define udata_getHeaderSize U_ICU_ENTRY_POINT_RENAME(udata_getHeaderSize)
  |  |  ------------------
  |  |  |  |  123|  1.32k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.32k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.32k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  107|  1.32k|    } else {
  108|      0|        return nullptr;
  109|      0|    }
  110|  1.32k|}
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|      6|           UErrorCode *status) {
  548|       |
  549|      6|    return _uhash_create(keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status);
  ------------------
  |  |   91|      6|#define DEFAULT_PRIME_INDEX 4
  ------------------
  550|      6|}
uhash_openSize_78:
  557|      5|               UErrorCode *status) {
  558|       |
  559|       |    /* Find the smallest index i for which PRIMES[i] >= size. */
  560|      5|    int32_t i = 0;
  561|     18|    while (i<(PRIMES_LENGTH-1) && PRIMES[i]<size) {
  ------------------
  |  |   90|     18|#define PRIMES_LENGTH UPRV_LENGTHOF(PRIMES)
  |  |  ------------------
  |  |  |  |   99|     18|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  |  |  ------------------
  ------------------
  |  Branch (561:12): [True: 18, False: 0]
  |  Branch (561:35): [True: 13, False: 5]
  ------------------
  562|     13|        ++i;
  563|     13|    }
  564|       |
  565|      5|    return _uhash_create(keyHash, keyComp, valueComp, i, status);
  566|      5|}
uhash_init_78:
  573|      1|           UErrorCode *status) {
  574|       |
  575|      1|    return _uhash_init(fillinResult, keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status);
  ------------------
  |  |   91|      1|#define DEFAULT_PRIME_INDEX 4
  ------------------
  576|      1|}
uhash_close_78:
  595|     11|uhash_close(UHashtable *hash) {
  596|     11|    if (hash == nullptr) {
  ------------------
  |  Branch (596:9): [True: 10, False: 1]
  ------------------
  597|     10|        return;
  598|     10|    }
  599|      1|    if (hash->elements != nullptr) {
  ------------------
  |  Branch (599:9): [True: 1, False: 0]
  ------------------
  600|      1|        if (hash->keyDeleter != nullptr || hash->valueDeleter != nullptr) {
  ------------------
  |  Branch (600:13): [True: 0, False: 1]
  |  Branch (600:44): [True: 0, False: 1]
  ------------------
  601|      0|            int32_t pos=UHASH_FIRST;
  ------------------
  |  |  610|      0|#define UHASH_FIRST (-1)
  ------------------
  602|      0|            UHashElement *e;
  603|      0|            while ((e = (UHashElement*) uhash_nextElement(hash, &pos)) != nullptr) {
  ------------------
  |  | 1029|      0|#define uhash_nextElement U_ICU_ENTRY_POINT_RENAME(uhash_nextElement)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (603:20): [True: 0, False: 0]
  ------------------
  604|      0|                HASH_DELETE_KEY_VALUE(hash, e->key.pointer, e->value.pointer);
  ------------------
  |  |  124|      0|#define HASH_DELETE_KEY_VALUE(hash, keypointer, valuepointer) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  125|      0|    if (hash->keyDeleter != nullptr && keypointer != nullptr) { \
  |  |  ------------------
  |  |  |  Branch (125:9): [True: 0, False: 0]
  |  |  |  Branch (125:40): [True: 0, False: 0]
  |  |  ------------------
  |  |  126|      0|        (*hash->keyDeleter)(keypointer); \
  |  |  127|      0|    } \
  |  |  128|      0|    if (hash->valueDeleter != nullptr && valuepointer != nullptr) { \
  |  |  ------------------
  |  |  |  Branch (128:9): [True: 0, False: 0]
  |  |  |  Branch (128:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  129|      0|        (*hash->valueDeleter)(valuepointer); \
  |  |  130|      0|    } \
  |  |  131|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  605|      0|            }
  606|      0|        }
  607|      1|        uprv_free(hash->elements);
  ------------------
  |  | 1503|      1|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  608|      1|        hash->elements = nullptr;
  609|      1|    }
  610|      1|    if (hash->allocated) {
  ------------------
  |  Branch (610:9): [True: 0, False: 1]
  ------------------
  611|      0|        uprv_free(hash);
  ------------------
  |  | 1503|      0|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  612|      0|    }
  613|      1|}
uhash_setKeyDeleter_78:
  636|      1|uhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn) {
  637|      1|    UObjectDeleter *result = hash->keyDeleter;
  638|      1|    hash->keyDeleter = fn;
  639|      1|    return result;
  640|      1|}
uhash_setValueDeleter_78:
  643|      3|uhash_setValueDeleter(UHashtable *hash, UObjectDeleter *fn) {
  644|      3|    UObjectDeleter *result = hash->valueDeleter;
  645|      3|    hash->valueDeleter = fn;
  646|      3|    return result;
  647|      3|}
uhash_count_78:
  659|  10.2k|uhash_count(const UHashtable *hash) {
  660|  10.2k|    return hash->count;
  661|  10.2k|}
uhash_get_78:
  665|  3.60M|          const void* key) {
  666|  3.60M|    UHashTok keyholder;
  667|  3.60M|    keyholder.pointer = (void*) key;
  668|  3.60M|    return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer;
  669|  3.60M|}
uhash_iget_78:
  673|  29.3k|           int32_t key) {
  674|  29.3k|    UHashTok keyholder;
  675|  29.3k|    keyholder.integer = key;
  676|  29.3k|    return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.pointer;
  677|  29.3k|}
uhash_geti_78:
  681|  2.17k|           const void* key) {
  682|  2.17k|    UHashTok keyholder;
  683|  2.17k|    keyholder.pointer = (void*) key;
  684|  2.17k|    return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer;
  685|  2.17k|}
uhash_put_78:
  721|  3.84k|          UErrorCode *status) {
  722|  3.84k|    UHashTok keyholder, valueholder;
  723|  3.84k|    keyholder.pointer = key;
  724|  3.84k|    valueholder.pointer = value;
  725|  3.84k|    return _uhash_put(hash, keyholder, valueholder,
  726|  3.84k|                      HINT_KEY_POINTER | HINT_VALUE_POINTER,
  ------------------
  |  |  139|  3.84k|#define HINT_KEY_POINTER   (1)
  ------------------
                                    HINT_KEY_POINTER | HINT_VALUE_POINTER,
  ------------------
  |  |  140|  3.84k|#define HINT_VALUE_POINTER (2)
  ------------------
  727|  3.84k|                      status).pointer;
  728|  3.84k|}
uhash_iput_78:
  734|    760|           UErrorCode *status) {
  735|    760|    UHashTok keyholder, valueholder;
  736|    760|    keyholder.integer = key;
  737|    760|    valueholder.pointer = value;
  738|    760|    return _uhash_put(hash, keyholder, valueholder,
  739|    760|                      HINT_VALUE_POINTER,
  ------------------
  |  |  140|    760|#define HINT_VALUE_POINTER (2)
  ------------------
  740|    760|                      status).pointer;
  741|    760|}
uhash_puti_78:
  747|    992|           UErrorCode *status) {
  748|    992|    UHashTok keyholder, valueholder;
  749|    992|    keyholder.pointer = key;
  750|    992|    valueholder.integer = value;
  751|    992|    return _uhash_put(hash, keyholder, valueholder,
  752|    992|                      HINT_KEY_POINTER,
  ------------------
  |  |  139|    992|#define HINT_KEY_POINTER   (1)
  ------------------
  753|    992|                      status).integer;
  754|    992|}
uhash_find_78:
  866|  10.2k|uhash_find(const UHashtable *hash, const void* key) {
  867|  10.2k|    UHashTok keyholder;
  868|  10.2k|    const UHashElement *e;
  869|  10.2k|    keyholder.pointer = (void*) key;
  870|  10.2k|    e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder));
  871|  10.2k|    return IS_EMPTY_OR_DELETED(e->hashcode) ? nullptr : e;
  ------------------
  |  |  120|  10.2k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  |  |  ------------------
  |  |  |  Branch (120:32): [True: 760, False: 9.53k]
  |  |  ------------------
  ------------------
  872|  10.2k|}
uhash_hashUChars_78:
  932|  2.10k|uhash_hashUChars(const UHashTok key) {
  933|  2.10k|    const char16_t *s = (const char16_t *)key.pointer;
  934|  2.10k|    return s == nullptr ? 0 : ustr_hashUCharsN(s, u_strlen(s));
  ------------------
  |  | 1880|  2.10k|#define ustr_hashUCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashUCharsN)
  |  |  ------------------
  |  |  |  |  123|  2.10k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.10k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.10k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return s == nullptr ? 0 : ustr_hashUCharsN(s, u_strlen(s));
  ------------------
  |  |  393|  2.10k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|  2.10k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.10k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.10k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (934:12): [True: 0, False: 2.10k]
  ------------------
  935|  2.10k|}
uhash_hashChars_78:
  938|  7.20M|uhash_hashChars(const UHashTok key) {
  939|  7.20M|    const char *s = (const char *)key.pointer;
  940|  7.20M|    return s == nullptr ? 0 : static_cast<int32_t>(ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s))));
  ------------------
  |  | 1878|  6.69M|#define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN)
  |  |  ------------------
  |  |  |  |  123|  6.69M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.69M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.69M|#       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|  6.69M|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  6.69M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (940:12): [True: 517k, False: 6.69M]
  ------------------
  941|  7.20M|}
uhash_compareUChars_78:
 1012|    476|uhash_compareUChars(const UHashTok key1, const UHashTok key2) {
 1013|    476|    const char16_t *p1 = (const char16_t*) key1.pointer;
 1014|    476|    const char16_t *p2 = (const char16_t*) key2.pointer;
 1015|    476|    if (p1 == p2) {
  ------------------
  |  Branch (1015:9): [True: 476, False: 0]
  ------------------
 1016|    476|        return true;
 1017|    476|    }
 1018|      0|    if (p1 == nullptr || p2 == nullptr) {
  ------------------
  |  Branch (1018:9): [True: 0, False: 0]
  |  Branch (1018:26): [True: 0, False: 0]
  ------------------
 1019|      0|        return false;
 1020|      0|    }
 1021|      0|    while (*p1 != 0 && *p1 == *p2) {
  ------------------
  |  Branch (1021:12): [True: 0, False: 0]
  |  Branch (1021:24): [True: 0, False: 0]
  ------------------
 1022|      0|        ++p1;
 1023|      0|        ++p2;
 1024|      0|    }
 1025|      0|    return *p1 == *p2;
 1026|      0|}
uhash_compareChars_78:
 1029|  7.19M|uhash_compareChars(const UHashTok key1, const UHashTok key2) {
 1030|  7.19M|    const char *p1 = (const char*) key1.pointer;
 1031|  7.19M|    const char *p2 = (const char*) key2.pointer;
 1032|  7.19M|    if (p1 == p2) {
  ------------------
  |  Branch (1032:9): [True: 515k, False: 6.67M]
  ------------------
 1033|   515k|        return true;
 1034|   515k|    }
 1035|  6.67M|    if (p1 == nullptr || p2 == nullptr) {
  ------------------
  |  Branch (1035:9): [True: 0, False: 6.67M]
  |  Branch (1035:26): [True: 0, False: 6.67M]
  ------------------
 1036|      0|        return false;
 1037|      0|    }
 1038|  72.8M|    while (*p1 != 0 && *p1 == *p2) {
  ------------------
  |  Branch (1038:12): [True: 66.1M, False: 6.67M]
  |  Branch (1038:24): [True: 66.1M, False: 0]
  ------------------
 1039|  66.1M|        ++p1;
 1040|  66.1M|        ++p2;
 1041|  66.1M|    }
 1042|  6.67M|    return *p1 == *p2;
 1043|  6.67M|}
uhash_hashLong_78:
 1090|  30.1k|uhash_hashLong(const UHashTok key) {
 1091|  30.1k|    return key.integer;
 1092|  30.1k|}
uhash_compareLong_78:
 1095|  28.5k|uhash_compareLong(const UHashTok key1, const UHashTok key2) {
 1096|  28.5k|    return key1.integer == key2.integer;
 1097|  28.5k|}
uhash.cpp:_ZL13_uhash_createPFi8UElementEPFaS_S_ES3_iP10UErrorCode:
  287|     11|              UErrorCode *status) {
  288|     11|    UHashtable *result;
  289|       |
  290|     11|    if (U_FAILURE(*status)) return nullptr;
  ------------------
  |  Branch (290:9): [True: 0, False: 11]
  ------------------
  291|       |
  292|     11|    result = static_cast<UHashtable*>(uprv_malloc(sizeof(UHashtable)));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  293|     11|    if (result == nullptr) {
  ------------------
  |  Branch (293:9): [True: 0, False: 11]
  ------------------
  294|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  295|      0|        return nullptr;
  296|      0|    }
  297|       |
  298|     11|    _uhash_init(result, keyHash, keyComp, valueComp, primeIndex, status);
  299|     11|    result->allocated       = true;
  300|       |
  301|     11|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (301:9): [True: 0, False: 11]
  ------------------
  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|     11|    return result;
  307|     11|}
uhash.cpp:_ZL11_uhash_initP10UHashtablePFi8UElementEPFaS1_S1_ES5_iP10UErrorCode:
  260|     12|{
  261|     12|    if (U_FAILURE(*status)) return nullptr;
  ------------------
  |  Branch (261:9): [True: 0, False: 12]
  ------------------
  262|     12|    U_ASSERT(keyHash != nullptr);
  ------------------
  |  |   35|     12|#   define U_ASSERT(exp) (void)0
  ------------------
  263|     12|    U_ASSERT(keyComp != nullptr);
  ------------------
  |  |   35|     12|#   define U_ASSERT(exp) (void)0
  ------------------
  264|       |
  265|     12|    result->keyHasher       = keyHash;
  266|     12|    result->keyComparator   = keyComp;
  267|     12|    result->valueComparator = valueComp;
  268|     12|    result->keyDeleter      = nullptr;
  269|     12|    result->valueDeleter    = nullptr;
  270|     12|    result->allocated       = false;
  271|     12|    _uhash_internalSetResizePolicy(result, U_GROW);
  272|       |
  273|     12|    _uhash_allocate(result, primeIndex, status);
  274|       |
  275|     12|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (275:9): [True: 0, False: 12]
  ------------------
  276|      0|        return nullptr;
  277|      0|    }
  278|       |
  279|     12|    return result;
  280|     12|}
uhash.cpp:_ZL15_uhash_allocateP10UHashtableiP10UErrorCode:
  217|     39|                UErrorCode *status) {
  218|       |
  219|     39|    UHashElement *p, *limit;
  220|     39|    UHashTok emptytok;
  221|       |
  222|     39|    if (U_FAILURE(*status)) return;
  ------------------
  |  Branch (222:9): [True: 0, False: 39]
  ------------------
  223|       |
  224|     39|    U_ASSERT(primeIndex >= 0 && primeIndex < PRIMES_LENGTH);
  ------------------
  |  |   35|     39|#   define U_ASSERT(exp) (void)0
  ------------------
  225|       |
  226|     39|    hash->primeIndex = static_cast<int8_t>(primeIndex);
  227|     39|    hash->length = PRIMES[primeIndex];
  228|       |
  229|     39|    p = hash->elements = static_cast<UHashElement*>(
  230|     39|        uprv_malloc(sizeof(UHashElement) * hash->length));
  ------------------
  |  | 1524|     39|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|     39|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     39|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     39|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|       |
  232|     39|    if (hash->elements == nullptr) {
  ------------------
  |  Branch (232:9): [True: 0, False: 39]
  ------------------
  233|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  234|      0|        return;
  235|      0|    }
  236|       |
  237|     39|    emptytok.pointer = nullptr; /* Only one of these two is needed */
  238|     39|    emptytok.integer = 0;    /* but we don't know which one. */
  239|       |
  240|     39|    limit = p + hash->length;
  241|  26.6k|    while (p < limit) {
  ------------------
  |  Branch (241:12): [True: 26.6k, False: 39]
  ------------------
  242|  26.6k|        p->key = emptytok;
  243|  26.6k|        p->value = emptytok;
  244|  26.6k|        p->hashcode = HASH_EMPTY;
  ------------------
  |  |  118|  26.6k|#define HASH_EMPTY      ((int32_t) HASH_DELETED + 1)
  |  |  ------------------
  |  |  |  |  117|  26.6k|#define HASH_DELETED    ((int32_t) 0x80000000)
  |  |  ------------------
  ------------------
  245|  26.6k|        ++p;
  246|  26.6k|    }
  247|       |
  248|     39|    hash->count = 0;
  249|     39|    hash->lowWaterMark = static_cast<int32_t>(hash->length * hash->lowWaterRatio);
  250|     39|    hash->highWaterMark = static_cast<int32_t>(hash->length * hash->highWaterRatio);
  251|     39|}
uhash.cpp:_ZL30_uhash_internalSetResizePolicyP10UHashtable17UHashResizePolicy:
  197|     12|_uhash_internalSetResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) {
  198|     12|    U_ASSERT(hash != nullptr);
  ------------------
  |  |   35|     12|#   define U_ASSERT(exp) (void)0
  ------------------
  199|     12|    U_ASSERT(((int32_t)policy) >= 0);
  ------------------
  |  |   35|     12|#   define U_ASSERT(exp) (void)0
  ------------------
  200|     12|    U_ASSERT(((int32_t)policy) < 3);
  ------------------
  |  |   35|     12|#   define U_ASSERT(exp) (void)0
  ------------------
  201|     12|    hash->lowWaterRatio  = RESIZE_POLICY_RATIO_TABLE[policy * 2];
  202|     12|    hash->highWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2 + 1];
  203|     12|}
uhash.cpp:_ZL13_uhash_rehashP10UHashtableP10UErrorCode:
  399|     27|_uhash_rehash(UHashtable *hash, UErrorCode *status) {
  400|       |
  401|     27|    UHashElement *old = hash->elements;
  402|     27|    int32_t oldLength = hash->length;
  403|     27|    int32_t newPrimeIndex = hash->primeIndex;
  404|     27|    int32_t i;
  405|       |
  406|     27|    if (hash->count > hash->highWaterMark) {
  ------------------
  |  Branch (406:9): [True: 27, False: 0]
  ------------------
  407|     27|        if (++newPrimeIndex >= PRIMES_LENGTH) {
  ------------------
  |  |   90|     27|#define PRIMES_LENGTH UPRV_LENGTHOF(PRIMES)
  |  |  ------------------
  |  |  |  |   99|     27|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  |  |  ------------------
  ------------------
  |  Branch (407:13): [True: 0, False: 27]
  ------------------
  408|      0|            return;
  409|      0|        }
  410|     27|    } 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|     27|    _uhash_allocate(hash, newPrimeIndex, status);
  419|       |
  420|     27|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (420:9): [True: 0, False: 27]
  ------------------
  421|      0|        hash->elements = old;
  422|      0|        hash->length = oldLength;
  423|      0|        return;
  424|      0|    }
  425|       |
  426|  12.0k|    for (i = oldLength - 1; i >= 0; --i) {
  ------------------
  |  Branch (426:29): [True: 12.0k, False: 27]
  ------------------
  427|  12.0k|        if (!IS_EMPTY_OR_DELETED(old[i].hashcode)) {
  ------------------
  |  |  120|  12.0k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  ------------------
  |  Branch (427:13): [True: 6.04k, False: 6.02k]
  ------------------
  428|  6.04k|            UHashElement *e = _uhash_find(hash, old[i].key, old[i].hashcode);
  429|  6.04k|            U_ASSERT(e != nullptr);
  ------------------
  |  |   35|  6.04k|#   define U_ASSERT(exp) (void)0
  ------------------
  430|  6.04k|            U_ASSERT(e->hashcode == HASH_EMPTY);
  ------------------
  |  |   35|  6.04k|#   define U_ASSERT(exp) (void)0
  ------------------
  431|  6.04k|            e->key = old[i].key;
  432|  6.04k|            e->value = old[i].value;
  433|  6.04k|            e->hashcode = old[i].hashcode;
  434|  6.04k|            ++hash->count;
  435|  6.04k|        }
  436|  12.0k|    }
  437|       |
  438|     27|    uprv_free(old);
  ------------------
  |  | 1503|     27|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|     27|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     27|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     27|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  439|     27|}
uhash.cpp:_ZL11_uhash_findPK10UHashtable8UElementi:
  339|  3.65M|            int32_t hashcode) {
  340|       |
  341|  3.65M|    int32_t firstDeleted = -1;  /* assume invalid index */
  342|  3.65M|    int32_t theIndex, startIndex;
  343|  3.65M|    int32_t jump = 0; /* lazy evaluate */
  344|  3.65M|    int32_t tableHash;
  345|  3.65M|    UHashElement *elements = hash->elements;
  346|       |
  347|  3.65M|    hashcode &= 0x7FFFFFFF; /* must be positive */
  348|  3.65M|    startIndex = theIndex = (hashcode ^ 0x4000000) % hash->length;
  349|       |
  350|  4.16M|    do {
  351|  4.16M|        tableHash = elements[theIndex].hashcode;
  352|  4.16M|        if (tableHash == hashcode) {          /* quick check */
  ------------------
  |  Branch (352:13): [True: 3.63M, False: 526k]
  ------------------
  353|  3.63M|            if ((*hash->keyComparator)(key, elements[theIndex].key)) {
  ------------------
  |  Branch (353:17): [True: 3.63M, False: 0]
  ------------------
  354|  3.63M|                return &(elements[theIndex]);
  355|  3.63M|            }
  356|  3.63M|        } else if (!IS_EMPTY_OR_DELETED(tableHash)) {
  ------------------
  |  |  120|   526k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  ------------------
  |  Branch (356:20): [True: 505k, False: 20.6k]
  ------------------
  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|   505k|        } else if (tableHash == HASH_EMPTY) { /* empty, end o' the line */
  ------------------
  |  |  118|  20.6k|#define HASH_EMPTY      ((int32_t) HASH_DELETED + 1)
  |  |  ------------------
  |  |  |  |  117|  20.6k|#define HASH_DELETED    ((int32_t) 0x80000000)
  |  |  ------------------
  ------------------
  |  Branch (361:20): [True: 20.6k, False: 0]
  ------------------
  362|  20.6k|            break;
  363|  20.6k|        } else if (firstDeleted < 0) { /* remember first deleted */
  ------------------
  |  Branch (363:20): [True: 0, False: 0]
  ------------------
  364|      0|            firstDeleted = theIndex;
  365|      0|        }
  366|   505k|        if (jump == 0) { /* lazy compute jump */
  ------------------
  |  Branch (366:13): [True: 427k, False: 77.7k]
  ------------------
  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|   427k|            jump = (hashcode % (hash->length - 1)) + 1;
  372|   427k|        }
  373|   505k|        theIndex = (theIndex + jump) % hash->length;
  374|   505k|    } while (theIndex != startIndex);
  ------------------
  |  Branch (374:14): [True: 505k, False: 0]
  ------------------
  375|       |
  376|  20.6k|    if (firstDeleted >= 0) {
  ------------------
  |  Branch (376:9): [True: 0, False: 20.6k]
  ------------------
  377|      0|        theIndex = firstDeleted; /* reset if had deleted slot */
  378|  20.6k|    } else if (tableHash != HASH_EMPTY) {
  ------------------
  |  |  118|  20.6k|#define HASH_EMPTY      ((int32_t) HASH_DELETED + 1)
  |  |  ------------------
  |  |  |  |  117|  20.6k|#define HASH_DELETED    ((int32_t) 0x80000000)
  |  |  ------------------
  ------------------
  |  Branch (378:16): [True: 0, False: 20.6k]
  ------------------
  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|  20.6k|    return &(elements[theIndex]);
  387|  20.6k|}
uhash.cpp:_ZL10_uhash_putP10UHashtable8UElementS1_aP10UErrorCode:
  471|  5.59k|           UErrorCode *status) {
  472|       |
  473|       |    /* Put finds the position in the table for the new value.  If the
  474|       |     * key is already in the table, it is deleted, if there is a
  475|       |     * non-nullptr keyDeleter.  Then the key, the hash and the value are
  476|       |     * all put at the position in their respective arrays.
  477|       |     */
  478|  5.59k|    int32_t hashcode;
  479|  5.59k|    UHashElement* e;
  480|  5.59k|    UHashTok emptytok;
  481|       |
  482|  5.59k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (482:9): [True: 0, False: 5.59k]
  ------------------
  483|      0|        goto err;
  484|      0|    }
  485|  5.59k|    U_ASSERT(hash != nullptr);
  ------------------
  |  |   35|  5.59k|#   define U_ASSERT(exp) (void)0
  ------------------
  486|  5.59k|    if ((hint & HINT_VALUE_POINTER) ?
  ------------------
  |  |  140|  5.59k|#define HINT_VALUE_POINTER (2)
  ------------------
  |  Branch (486:9): [True: 4.60k, False: 992]
  |  Branch (486:9): [True: 0, False: 5.59k]
  ------------------
  487|  4.60k|            value.pointer == nullptr :
  488|  5.59k|            value.integer == 0 && (hint & HINT_ALLOW_ZERO) == 0) {
  ------------------
  |  |  141|      0|#define HINT_ALLOW_ZERO    (4)
  ------------------
  |  Branch (488:13): [True: 0, False: 992]
  |  Branch (488:35): [True: 0, False: 0]
  ------------------
  489|       |        /* Disallow storage of nullptr values, since nullptr is returned by
  490|       |         * get() to indicate an absent key.  Storing nullptr == removing.
  491|       |         */
  492|      0|        return _uhash_remove(hash, key);
  493|      0|    }
  494|  5.59k|    if (hash->count > hash->highWaterMark) {
  ------------------
  |  Branch (494:9): [True: 27, False: 5.56k]
  ------------------
  495|     27|        _uhash_rehash(hash, status);
  496|     27|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (496:13): [True: 0, False: 27]
  ------------------
  497|      0|            goto err;
  498|      0|        }
  499|     27|    }
  500|       |
  501|  5.59k|    hashcode = (*hash->keyHasher)(key);
  502|  5.59k|    e = _uhash_find(hash, key, hashcode);
  503|  5.59k|    U_ASSERT(e != nullptr);
  ------------------
  |  |   35|  5.59k|#   define U_ASSERT(exp) (void)0
  ------------------
  504|       |
  505|  5.59k|    if (IS_EMPTY_OR_DELETED(e->hashcode)) {
  ------------------
  |  |  120|  5.59k|#define IS_EMPTY_OR_DELETED(x) ((x) < 0)
  |  |  ------------------
  |  |  |  Branch (120:32): [True: 5.59k, False: 0]
  |  |  ------------------
  ------------------
  506|       |        /* Important: We must never actually fill the table up.  If we
  507|       |         * do so, then _uhash_find() will return nullptr, and we'll have
  508|       |         * to check for nullptr after every call to _uhash_find().  To
  509|       |         * avoid this we make sure there is always at least one empty
  510|       |         * or deleted slot in the table.  This only is a problem if we
  511|       |         * are out of memory and rehash isn't working.
  512|       |         */
  513|  5.59k|        ++hash->count;
  514|  5.59k|        if (hash->count == hash->length) {
  ------------------
  |  Branch (514:13): [True: 0, False: 5.59k]
  ------------------
  515|       |            /* Don't allow count to reach length */
  516|      0|            --hash->count;
  517|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
  518|      0|            goto err;
  519|      0|        }
  520|  5.59k|    }
  521|       |
  522|       |    /* We must in all cases handle storage properly.  If there was an
  523|       |     * old key, then it must be deleted (if the deleter != nullptr).
  524|       |     * Make hashcodes stored in table positive.
  525|       |     */
  526|  5.59k|    return _uhash_setElement(hash, e, hashcode & 0x7FFFFFFF, key, value, hint);
  527|       |
  528|      0| err:
  529|       |    /* If the deleters are non-nullptr, this method adopts its key and/or
  530|       |     * value arguments, and we must be sure to delete the key and/or
  531|       |     * value in all cases, even upon failure.
  532|       |     */
  533|      0|    HASH_DELETE_KEY_VALUE(hash, key.pointer, value.pointer);
  ------------------
  |  |  124|      0|#define HASH_DELETE_KEY_VALUE(hash, keypointer, valuepointer) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  125|      0|    if (hash->keyDeleter != nullptr && keypointer != nullptr) { \
  |  |  ------------------
  |  |  |  Branch (125:9): [True: 0, False: 0]
  |  |  |  Branch (125:40): [True: 0, False: 0]
  |  |  ------------------
  |  |  126|      0|        (*hash->keyDeleter)(keypointer); \
  |  |  127|      0|    } \
  |  |  128|      0|    if (hash->valueDeleter != nullptr && valuepointer != nullptr) { \
  |  |  ------------------
  |  |  |  Branch (128:9): [True: 0, False: 0]
  |  |  |  Branch (128:42): [True: 0, False: 0]
  |  |  ------------------
  |  |  129|      0|        (*hash->valueDeleter)(valuepointer); \
  |  |  130|      0|    } \
  |  |  131|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  534|      0|    emptytok.pointer = nullptr; emptytok.integer = 0;
  535|      0|    return emptytok;
  536|  5.59k|}
uhash.cpp:_ZL17_uhash_setElementP10UHashtableP12UHashElementi8UElementS3_a:
  150|  5.59k|                  UHashTok key, UHashTok value, int8_t hint) {
  151|       |
  152|  5.59k|    UHashTok oldValue = e->value;
  153|  5.59k|    if (hash->keyDeleter != nullptr && e->key.pointer != nullptr &&
  ------------------
  |  Branch (153:9): [True: 760, False: 4.83k]
  |  Branch (153:40): [True: 0, False: 760]
  ------------------
  154|  5.59k|        e->key.pointer != key.pointer) { /* Avoid double deletion */
  ------------------
  |  Branch (154:9): [True: 0, False: 0]
  ------------------
  155|      0|        (*hash->keyDeleter)(e->key.pointer);
  156|      0|    }
  157|  5.59k|    if (hash->valueDeleter != nullptr) {
  ------------------
  |  Branch (157:9): [True: 761, False: 4.83k]
  ------------------
  158|    761|        if (oldValue.pointer != nullptr &&
  ------------------
  |  Branch (158:13): [True: 0, False: 761]
  ------------------
  159|    761|            oldValue.pointer != value.pointer) { /* Avoid double deletion */
  ------------------
  |  Branch (159:13): [True: 0, False: 0]
  ------------------
  160|      0|            (*hash->valueDeleter)(oldValue.pointer);
  161|      0|        }
  162|    761|        oldValue.pointer = nullptr;
  163|    761|    }
  164|       |    /* Compilers should copy the UHashTok union correctly, but even if
  165|       |     * they do, memory heap tools (e.g. BoundsChecker) can get
  166|       |     * confused when a pointer is cloaked in a union and then copied.
  167|       |     * TO ALLEVIATE THIS, we use hints (based on what API the user is
  168|       |     * calling) to copy pointers when we know the user thinks
  169|       |     * something is a pointer. */
  170|  5.59k|    if (hint & HINT_KEY_POINTER) {
  ------------------
  |  |  139|  5.59k|#define HINT_KEY_POINTER   (1)
  ------------------
  |  Branch (170:9): [True: 4.83k, False: 760]
  ------------------
  171|  4.83k|        e->key.pointer = key.pointer;
  172|  4.83k|    } else {
  173|    760|        e->key = key;
  174|    760|    }
  175|  5.59k|    if (hint & HINT_VALUE_POINTER) {
  ------------------
  |  |  140|  5.59k|#define HINT_VALUE_POINTER (2)
  ------------------
  |  Branch (175:9): [True: 4.60k, False: 992]
  ------------------
  176|  4.60k|        e->value.pointer = value.pointer;
  177|  4.60k|    } else {
  178|    992|        e->value = value;
  179|    992|    }
  180|  5.59k|    e->hashcode = hashcode;
  181|  5.59k|    return oldValue;
  182|  5.59k|}

u_UCharsToChars_78:
  204|  1.68M|u_UCharsToChars(const char16_t *us, char *cs, int32_t length) {
  205|  1.68M|    char16_t u;
  206|       |
  207|  7.84M|    while(length>0) {
  ------------------
  |  Branch (207:11): [True: 6.15M, False: 1.68M]
  ------------------
  208|  6.15M|        u=*us++;
  209|  6.15M|        if(!UCHAR_IS_INVARIANT(u)) {
  ------------------
  |  |  168|  6.15M|#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0)
  |  |  ------------------
  |  |  |  Branch (168:32): [True: 6.15M, False: 25]
  |  |  |  Branch (168:47): [True: 6.15M, False: 0]
  |  |  ------------------
  ------------------
  210|     25|            U_ASSERT(false); /* Variant characters were used. These are not portable in ICU. */
  ------------------
  |  |   35|     25|#   define U_ASSERT(exp) (void)0
  ------------------
  211|     25|            u=0;
  212|     25|        }
  213|  6.15M|        *cs++=(char)UCHAR_TO_CHAR(u);
  ------------------
  |  |  175|  6.15M|#define UCHAR_TO_CHAR(c) c
  ------------------
  214|  6.15M|        --length;
  215|  6.15M|    }
  216|  1.68M|}
uprv_isInvariantUString_78:
  263|  93.7k|uprv_isInvariantUString(const char16_t *s, int32_t length) {
  264|  93.7k|    char16_t c;
  265|       |
  266|   732k|    for(;;) {
  267|   732k|        if(length<0) {
  ------------------
  |  Branch (267:12): [True: 0, False: 732k]
  ------------------
  268|       |            /* NUL-terminated */
  269|      0|            c=*s++;
  270|      0|            if(c==0) {
  ------------------
  |  Branch (270:16): [True: 0, False: 0]
  ------------------
  271|      0|                break;
  272|      0|            }
  273|   732k|        } else {
  274|       |            /* count length */
  275|   732k|            if(length==0) {
  ------------------
  |  Branch (275:16): [True: 93.7k, False: 638k]
  ------------------
  276|  93.7k|                break;
  277|  93.7k|            }
  278|   638k|            --length;
  279|   638k|            c=*s++;
  280|   638k|        }
  281|       |
  282|       |        /*
  283|       |         * no assertions here because these functions are legitimately called
  284|       |         * for strings with variant characters
  285|       |         */
  286|   638k|        if(!UCHAR_IS_INVARIANT(c)) {
  ------------------
  |  |  168|   638k|#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0)
  |  |  ------------------
  |  |  |  Branch (168:32): [True: 638k, False: 0]
  |  |  |  Branch (168:47): [True: 638k, False: 0]
  |  |  ------------------
  ------------------
  287|      0|            return false; /* found a variant char */
  288|      0|        }
  289|   638k|    }
  290|  93.7k|    return true;
  291|  93.7k|}

locale_getKeywordsStart_78:
  526|  2.92M|locale_getKeywordsStart(std::string_view localeID) {
  527|  2.92M|    if (size_t pos = localeID.find('@'); pos != std::string_view::npos) {
  ------------------
  |  Branch (527:42): [True: 0, False: 2.92M]
  ------------------
  528|      0|        return localeID.data() + pos;
  529|      0|    }
  530|       |#if (U_CHARSET_FAMILY == U_EBCDIC_FAMILY)
  531|       |    else {
  532|       |        /* We do this because the @ sign is variant, and the @ sign used on one
  533|       |        EBCDIC machine won't be compiled the same way on other EBCDIC based
  534|       |        machines. */
  535|       |        static const uint8_t ebcdicSigns[] = { 0x7C, 0x44, 0x66, 0x80, 0xAC, 0xAE, 0xAF, 0xB5, 0xEC, 0xEF, 0x00 };
  536|       |        const uint8_t *charToFind = ebcdicSigns;
  537|       |        while(*charToFind) {
  538|       |            if (size_t pos = localeID.find(*charToFind); pos != std::string_view::npos) {
  539|       |                return localeID.data() + pos;
  540|       |            }
  541|       |            charToFind++;
  542|       |        }
  543|       |    }
  544|       |#endif
  545|  2.92M|    return nullptr;
  546|  2.92M|}
uloc_getKeywordValue_78:
  733|   161k|{
  734|   161k|    if (U_FAILURE(*status)) { return 0; }
  ------------------
  |  Branch (734:9): [True: 0, False: 161k]
  ------------------
  735|   161k|    if (keywordName == nullptr || *keywordName == '\0') {
  ------------------
  |  Branch (735:9): [True: 0, False: 161k]
  |  Branch (735:35): [True: 0, False: 161k]
  ------------------
  736|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
  737|      0|        return 0;
  738|      0|    }
  739|   161k|    return ByteSinkUtil::viaByteSinkToTerminatedChars(
  740|   161k|        buffer, bufferCapacity,
  741|   161k|        [&](ByteSink& sink, UErrorCode& status) {
  742|   161k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  743|   161k|        },
  744|   161k|        *status);
  745|   161k|}
_Z26ulocimp_getKeywordValue_78PKcNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEER10UErrorCode:
  751|   539k|{
  752|   539k|    return ByteSinkUtil::viaByteSinkToCharString(
  753|   539k|        [&](ByteSink& sink, UErrorCode& status) {
  754|   539k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  755|   539k|        },
  756|   539k|        status);
  757|   539k|}
_Z26ulocimp_getKeywordValue_78PKcNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
  764|   701k|{
  765|   701k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (765:9): [True: 0, False: 701k]
  ------------------
  766|       |
  767|   701k|    if (localeID == nullptr || keywordName.empty()) {
  ------------------
  |  Branch (767:9): [True: 0, False: 701k]
  |  Branch (767:32): [True: 0, False: 701k]
  ------------------
  768|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  769|      0|        return;
  770|      0|    }
  771|       |
  772|   701k|    const char* startSearchHere = nullptr;
  773|   701k|    const char* nextSeparator = nullptr;
  774|       |
  775|   701k|    CharString tempBuffer;
  776|   701k|    const char* tmpLocaleID;
  777|       |
  778|   701k|    CharString canonKeywordName = locale_canonKeywordName(keywordName, status);
  779|   701k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (779:9): [True: 0, False: 701k]
  ------------------
  780|      0|      return;
  781|      0|    }
  782|       |
  783|   701k|    if (localeID != nullptr && _hasBCP47Extension(localeID)) {
  ------------------
  |  Branch (783:9): [True: 701k, False: 0]
  |  Branch (783:32): [True: 0, False: 701k]
  ------------------
  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|   701k|    } else {
  787|   701k|        tmpLocaleID=localeID;
  788|   701k|    }
  789|       |
  790|   701k|    startSearchHere = locale_getKeywordsStart(tmpLocaleID);
  ------------------
  |  |  138|   701k|#define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart)
  |  |  ------------------
  |  |  |  |  123|   701k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   701k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   701k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  791|   701k|    if(startSearchHere == nullptr) {
  ------------------
  |  Branch (791:8): [True: 701k, False: 0]
  ------------------
  792|       |        /* no keywords, return at once */
  793|   701k|        return;
  794|   701k|    }
  795|       |
  796|       |    /* find the first keyword */
  797|      0|    while(startSearchHere) {
  ------------------
  |  Branch (797:11): [True: 0, False: 0]
  ------------------
  798|      0|        const char* keyValueTail;
  799|       |
  800|      0|        startSearchHere++; /* skip @ or ; */
  801|      0|        nextSeparator = uprv_strchr(startSearchHere, '=');
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  802|      0|        if(!nextSeparator) {
  ------------------
  |  Branch (802:12): [True: 0, False: 0]
  ------------------
  803|      0|            status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */
  804|      0|            return;
  805|      0|        }
  806|       |        /* strip leading & trailing spaces (TC decided to tolerate these) */
  807|      0|        while(*startSearchHere == ' ') {
  ------------------
  |  Branch (807:15): [True: 0, False: 0]
  ------------------
  808|      0|            startSearchHere++;
  809|      0|        }
  810|      0|        keyValueTail = nextSeparator;
  811|      0|        while (keyValueTail > startSearchHere && *(keyValueTail-1) == ' ') {
  ------------------
  |  Branch (811:16): [True: 0, False: 0]
  |  Branch (811:50): [True: 0, False: 0]
  ------------------
  812|      0|            keyValueTail--;
  813|      0|        }
  814|       |        /* now keyValueTail points to first char after the keyName */
  815|       |        /* copy & normalize keyName from locale */
  816|      0|        if (startSearchHere == keyValueTail) {
  ------------------
  |  Branch (816:13): [True: 0, False: 0]
  ------------------
  817|      0|            status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */
  818|      0|            return;
  819|      0|        }
  820|      0|        CharString localeKeywordName;
  821|      0|        while (startSearchHere < keyValueTail) {
  ------------------
  |  Branch (821:16): [True: 0, False: 0]
  ------------------
  822|      0|          if (!UPRV_ISALPHANUM(*startSearchHere)) {
  ------------------
  |  Branch (822:15): [True: 0, False: 0]
  ------------------
  823|      0|            status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */
  824|      0|            return;
  825|      0|          }
  826|      0|          localeKeywordName.append(uprv_tolower(*startSearchHere++), status);
  ------------------
  |  |   68|      0|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|      0|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  827|      0|        }
  828|      0|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (828:13): [True: 0, False: 0]
  ------------------
  829|      0|            return;
  830|      0|        }
  831|       |
  832|      0|        startSearchHere = uprv_strchr(nextSeparator, ';');
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  833|       |
  834|      0|        if (canonKeywordName == localeKeywordName) {
  ------------------
  |  Branch (834:13): [True: 0, False: 0]
  ------------------
  835|       |             /* current entry matches the keyword. */
  836|      0|           nextSeparator++; /* skip '=' */
  837|       |            /* First strip leading & trailing spaces (TC decided to tolerate these) */
  838|      0|            while(*nextSeparator == ' ') {
  ------------------
  |  Branch (838:19): [True: 0, False: 0]
  ------------------
  839|      0|              nextSeparator++;
  840|      0|            }
  841|      0|            keyValueTail = (startSearchHere)? startSearchHere: nextSeparator + uprv_strlen(nextSeparator);
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (841:28): [True: 0, False: 0]
  ------------------
  842|      0|            while(keyValueTail > nextSeparator && *(keyValueTail-1) == ' ') {
  ------------------
  |  Branch (842:19): [True: 0, False: 0]
  |  Branch (842:51): [True: 0, False: 0]
  ------------------
  843|      0|              keyValueTail--;
  844|      0|            }
  845|       |            /* Now copy the value, but check well-formedness */
  846|      0|            if (nextSeparator == keyValueTail) {
  ------------------
  |  Branch (846:17): [True: 0, False: 0]
  ------------------
  847|      0|              status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value name in passed-in locale */
  848|      0|              return;
  849|      0|            }
  850|      0|            while (nextSeparator < keyValueTail) {
  ------------------
  |  Branch (850:20): [True: 0, False: 0]
  ------------------
  851|      0|              if (!UPRV_ISALPHANUM(*nextSeparator) && !UPRV_OK_VALUE_PUNCTUATION(*nextSeparator)) {
  ------------------
  |  Branch (851:19): [True: 0, False: 0]
  |  Branch (851:55): [True: 0, False: 0]
  ------------------
  852|      0|                status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */
  853|      0|                return;
  854|      0|              }
  855|       |              /* Should we lowercase value to return here? Tests expect as-is. */
  856|      0|              sink.Append(nextSeparator++, 1);
  857|      0|            }
  858|      0|            return;
  859|      0|        }
  860|      0|    }
  861|      0|}
_Z20ulocimp_getRegion_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 1475|   269k|ulocimp_getRegion(std::string_view localeID, UErrorCode& status) {
 1476|   269k|    return ByteSinkUtil::viaByteSinkToCharString(
 1477|   269k|        [&](ByteSink& sink, UErrorCode& status) {
 1478|   269k|            ulocimp_getSubtags(
 1479|   269k|                    localeID,
 1480|   269k|                    nullptr,
 1481|   269k|                    nullptr,
 1482|   269k|                    &sink,
 1483|   269k|                    nullptr,
 1484|   269k|                    nullptr,
 1485|   269k|                    status);
 1486|   269k|        },
 1487|   269k|        status);
 1488|   269k|}
_Z21ulocimp_getSubtags_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEEPN6icu_7810CharStringES6_S6_S6_PPKcR10UErrorCode:
 1514|  4.22M|        UErrorCode& status) {
 1515|  4.22M|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1515:9): [True: 0, False: 4.22M]
  ------------------
 1516|       |
 1517|  4.22M|    std::optional<CharStringByteSink> languageSink;
 1518|  4.22M|    std::optional<CharStringByteSink> scriptSink;
 1519|  4.22M|    std::optional<CharStringByteSink> regionSink;
 1520|  4.22M|    std::optional<CharStringByteSink> variantSink;
 1521|       |
 1522|  4.22M|    if (language != nullptr) { languageSink.emplace(language); }
  ------------------
  |  Branch (1522:9): [True: 4.22M, False: 0]
  ------------------
 1523|  4.22M|    if (script != nullptr) { scriptSink.emplace(script); }
  ------------------
  |  Branch (1523:9): [True: 4.22M, False: 0]
  ------------------
 1524|  4.22M|    if (region != nullptr) { regionSink.emplace(region); }
  ------------------
  |  Branch (1524:9): [True: 3.57M, False: 654k]
  ------------------
 1525|  4.22M|    if (variant != nullptr) { variantSink.emplace(variant); }
  ------------------
  |  Branch (1525:9): [True: 2.21M, False: 2.00M]
  ------------------
 1526|       |
 1527|  4.22M|    ulocimp_getSubtags(
  ------------------
  |  | 1209|  4.22M|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  4.22M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.22M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.22M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1528|  4.22M|            localeID,
 1529|  4.22M|            languageSink.has_value() ? &*languageSink : nullptr,
  ------------------
  |  Branch (1529:13): [True: 4.22M, False: 0]
  ------------------
 1530|  4.22M|            scriptSink.has_value() ? &*scriptSink : nullptr,
  ------------------
  |  Branch (1530:13): [True: 4.22M, False: 0]
  ------------------
 1531|  4.22M|            regionSink.has_value() ? &*regionSink : nullptr,
  ------------------
  |  Branch (1531:13): [True: 3.57M, False: 654k]
  ------------------
 1532|  4.22M|            variantSink.has_value() ? &*variantSink : nullptr,
  ------------------
  |  Branch (1532:13): [True: 2.21M, False: 2.00M]
  ------------------
 1533|  4.22M|            pEnd,
 1534|  4.22M|            status);
 1535|  4.22M|}
_Z21ulocimp_getSubtags_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEEPN6icu_788ByteSinkES6_S6_S6_PPKcR10UErrorCode:
 1545|  6.23M|        UErrorCode& status) {
 1546|  6.23M|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1546:9): [True: 0, False: 6.23M]
  ------------------
 1547|       |
 1548|  6.23M|    if (pEnd != nullptr) {
  ------------------
  |  Branch (1548:9): [True: 2.21M, False: 4.02M]
  ------------------
 1549|  2.21M|        *pEnd = localeID.data();
 1550|  4.02M|    } else if (language == nullptr &&
  ------------------
  |  Branch (1550:16): [True: 2.01M, False: 2.00M]
  ------------------
 1551|  4.02M|               script == nullptr &&
  ------------------
  |  Branch (1551:16): [True: 2.01M, False: 0]
  ------------------
 1552|  4.02M|               region == nullptr &&
  ------------------
  |  Branch (1552:16): [True: 1.74M, False: 269k]
  ------------------
 1553|  4.02M|               variant == nullptr) {
  ------------------
  |  Branch (1553:16): [True: 0, False: 1.74M]
  ------------------
 1554|      0|        return;
 1555|      0|    }
 1556|       |
 1557|  6.23M|    if (localeID.empty()) { return; }
  ------------------
  |  Branch (1557:9): [True: 0, False: 6.23M]
  ------------------
 1558|       |
 1559|  6.23M|    bool hasRegion = false;
 1560|       |
 1561|  6.23M|    {
 1562|  6.23M|        size_t len = _getLanguage(localeID, language, status);
 1563|  6.23M|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1563:13): [True: 0, False: 6.23M]
  ------------------
 1564|  6.23M|        if (len > 0) {
  ------------------
  |  Branch (1564:13): [True: 6.23M, False: 0]
  ------------------
 1565|  6.23M|            localeID.remove_prefix(len);
 1566|  6.23M|        }
 1567|  6.23M|    }
 1568|       |
 1569|  6.23M|    if (pEnd != nullptr) {
  ------------------
  |  Branch (1569:9): [True: 2.21M, False: 4.02M]
  ------------------
 1570|  2.21M|        *pEnd = localeID.data();
 1571|  4.02M|    } else if (script == nullptr &&
  ------------------
  |  Branch (1571:16): [True: 2.01M, False: 2.00M]
  ------------------
 1572|  4.02M|               region == nullptr &&
  ------------------
  |  Branch (1572:16): [True: 1.74M, False: 269k]
  ------------------
 1573|  4.02M|               variant == nullptr) {
  ------------------
  |  Branch (1573:16): [True: 0, False: 1.74M]
  ------------------
 1574|      0|        return;
 1575|      0|    }
 1576|       |
 1577|  6.23M|    if (localeID.empty()) { return; }
  ------------------
  |  Branch (1577:9): [True: 402k, False: 5.83M]
  ------------------
 1578|       |
 1579|  5.83M|    if (_isIDSeparator(localeID.front())) {
  ------------------
  |  Branch (1579:9): [True: 5.83M, False: 0]
  ------------------
 1580|  5.83M|        std::string_view sub = localeID;
 1581|  5.83M|        sub.remove_prefix(1);
 1582|  5.83M|        size_t len = _getScript(sub, script);
 1583|  5.83M|        if (len > 0) {
  ------------------
  |  Branch (1583:13): [True: 1.65M, False: 4.18M]
  ------------------
 1584|  1.65M|            localeID.remove_prefix(len + 1);
 1585|  1.65M|            if (pEnd != nullptr) { *pEnd = localeID.data(); }
  ------------------
  |  Branch (1585:17): [True: 233k, False: 1.41M]
  ------------------
 1586|  1.65M|        }
 1587|  5.83M|    }
 1588|       |
 1589|  5.83M|    if ((region == nullptr && variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
  ------------------
  |  Branch (1589:10): [True: 2.39M, False: 3.43M]
  |  Branch (1589:31): [True: 654k, False: 1.74M]
  |  Branch (1589:53): [True: 654k, False: 0]
  |  Branch (1589:73): [True: 1.36M, False: 3.82M]
  ------------------
 1590|       |
 1591|  3.82M|    if (_isIDSeparator(localeID.front())) {
  ------------------
  |  Branch (1591:9): [True: 3.82M, False: 0]
  ------------------
 1592|  3.82M|        std::string_view sub = localeID;
 1593|  3.82M|        sub.remove_prefix(1);
 1594|  3.82M|        size_t len = _getRegion(sub, region);
 1595|  3.82M|        if (len > 0) {
  ------------------
  |  Branch (1595:13): [True: 3.82M, False: 0]
  ------------------
 1596|  3.82M|            hasRegion = true;
 1597|  3.82M|            localeID.remove_prefix(len + 1);
 1598|  3.82M|            if (pEnd != nullptr) { *pEnd = localeID.data(); }
  ------------------
  |  Branch (1598:17): [True: 1.80M, False: 2.01M]
  ------------------
 1599|  3.82M|        }
 1600|  3.82M|    }
 1601|       |
 1602|  3.82M|    if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
  ------------------
  |  Branch (1602:10): [True: 920k, False: 2.89M]
  |  Branch (1602:32): [True: 920k, False: 0]
  |  Branch (1602:52): [True: 1.72M, False: 1.17M]
  ------------------
 1603|       |
 1604|  1.17M|    bool hasVariant = false;
 1605|       |
 1606|  1.17M|    if (_isIDSeparator(localeID.front()) && !_isBCP47Extension(localeID)) {
  ------------------
  |  Branch (1606:9): [True: 1.17M, False: 0]
  |  Branch (1606:45): [True: 1.17M, False: 0]
  ------------------
 1607|  1.17M|        std::string_view sub = localeID;
 1608|       |        /* If there was no country ID, skip a possible extra IDSeparator */
 1609|  1.17M|        size_t skip = !hasRegion && localeID.size() > 1 && _isIDSeparator(localeID[1]) ? 2 : 1;
  ------------------
  |  Branch (1609:23): [True: 0, False: 1.17M]
  |  Branch (1609:37): [True: 0, False: 0]
  |  Branch (1609:60): [True: 0, False: 0]
  ------------------
 1610|  1.17M|        sub.remove_prefix(skip);
 1611|  1.17M|        size_t len = _getVariant(sub, localeID[0], variant, false, status);
 1612|  1.17M|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (1612:13): [True: 0, False: 1.17M]
  ------------------
 1613|  1.17M|        if (len > 0) {
  ------------------
  |  Branch (1613:13): [True: 1.17M, False: 0]
  ------------------
 1614|  1.17M|            hasVariant = true;
 1615|  1.17M|            localeID.remove_prefix(skip + len);
 1616|  1.17M|            if (pEnd != nullptr) { *pEnd = localeID.data(); }
  ------------------
  |  Branch (1616:17): [True: 785k, False: 392k]
  ------------------
 1617|  1.17M|        }
 1618|  1.17M|    }
 1619|       |
 1620|  1.17M|    if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
  ------------------
  |  Branch (1620:10): [True: 0, False: 1.17M]
  |  Branch (1620:32): [True: 0, False: 0]
  |  Branch (1620:52): [True: 1.17M, False: 0]
  ------------------
 1621|       |
 1622|      0|    if (_isBCP47Extension(localeID)) {
  ------------------
  |  Branch (1622:9): [True: 0, False: 0]
  ------------------
 1623|      0|        localeID.remove_prefix(2);
 1624|      0|        constexpr char vaposix[] = "-va-posix";
 1625|      0|        constexpr size_t length = sizeof vaposix - 1;
 1626|      0|        for (size_t next;; localeID.remove_prefix(next)) {
 1627|      0|            next = localeID.find('-', 1);
 1628|      0|            if (next == std::string_view::npos) { break; }
  ------------------
  |  Branch (1628:17): [True: 0, False: 0]
  ------------------
 1629|      0|            next = localeID.find('-', next + 1);
 1630|      0|            bool finished = next == std::string_view::npos;
 1631|      0|            std::string_view sub = localeID;
 1632|      0|            if (!finished) { sub.remove_suffix(sub.length() - next); }
  ------------------
  |  Branch (1632:17): [True: 0, False: 0]
  ------------------
 1633|       |
 1634|      0|            if (sub.length() == length && uprv_strnicmp(sub.data(), vaposix, length) == 0) {
  ------------------
  |  | 1544|      0|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1634:17): [True: 0, False: 0]
  |  Branch (1634:43): [True: 0, False: 0]
  ------------------
 1635|      0|                if (variant != nullptr) {
  ------------------
  |  Branch (1635:21): [True: 0, False: 0]
  ------------------
 1636|      0|                    if (hasVariant) { variant->Append("_", 1); }
  ------------------
  |  Branch (1636:25): [True: 0, False: 0]
  ------------------
 1637|      0|                    constexpr char posix[] = "POSIX";
 1638|      0|                    variant->Append(posix, sizeof posix - 1);
 1639|      0|                }
 1640|      0|                if (pEnd != nullptr) { *pEnd = localeID.data() + length; }
  ------------------
  |  Branch (1640:21): [True: 0, False: 0]
  ------------------
 1641|      0|            }
 1642|       |
 1643|      0|            if (finished) { break; }
  ------------------
  |  Branch (1643:17): [True: 0, False: 0]
  ------------------
 1644|      0|        }
 1645|      0|    }
 1646|      0|}
_Z18ulocimp_getName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 2159|   785k|{
 2160|   785k|    return ByteSinkUtil::viaByteSinkToCharString(
 2161|   785k|        [&](ByteSink& sink, UErrorCode& status) {
 2162|   785k|            ulocimp_getName(localeID, sink, status);
 2163|   785k|        },
 2164|   785k|        err);
 2165|   785k|}
_Z18ulocimp_getName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
 2171|   786k|{
 2172|   786k|    _canonicalize(localeID, sink, 0, err);
 2173|   786k|}
_Z22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 2195|  1.43M|{
 2196|  1.43M|    return ByteSinkUtil::viaByteSinkToCharString(
 2197|  1.43M|        [&](ByteSink& sink, UErrorCode& status) {
 2198|  1.43M|            ulocimp_getBaseName(localeID, sink, status);
 2199|  1.43M|        },
 2200|  1.43M|        err);
 2201|  1.43M|}
_Z22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
 2207|  1.43M|{
 2208|  1.43M|    _canonicalize(localeID, sink, _ULOC_STRIP_KEYWORDS, err);
  ------------------
  |  | 1785|  1.43M|#define _ULOC_STRIP_KEYWORDS 0x2
  ------------------
 2209|  1.43M|}
_Z23ulocimp_canonicalize_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode:
 2231|      1|{
 2232|      1|    return ByteSinkUtil::viaByteSinkToCharString(
 2233|      1|        [&](ByteSink& sink, UErrorCode& status) {
 2234|      1|            ulocimp_canonicalize(localeID, sink, status);
 2235|      1|        },
 2236|      1|        err);
 2237|      1|}
_Z23ulocimp_canonicalize_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEERN6icu_788ByteSinkER10UErrorCode:
 2243|    886|{
 2244|    886|    _canonicalize(localeID, sink, _ULOC_CANONICALIZE, err);
  ------------------
  |  | 1786|    886|#define _ULOC_CANONICALIZE   0x1
  ------------------
 2245|    886|}
uloc_getDefault_78:
 2336|  2.23M|{
 2337|  2.23M|    return locale_get_default();
  ------------------
  |  |  139|  2.23M|#define locale_get_default U_ICU_ENTRY_POINT_RENAME(locale_get_default)
  |  |  ------------------
  |  |  |  |  123|  2.23M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.23M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.23M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2338|  2.23M|}
uloc.cpp:_ZN12_GLOBAL__N_123locale_canonKeywordNameENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEER10UErrorCode:
  556|   701k|{
  557|   701k|  if (U_FAILURE(status)) { return {}; }
  ------------------
  |  Branch (557:7): [True: 0, False: 701k]
  ------------------
  558|   701k|  CharString result;
  559|       |
  560|  3.78M|  for (char c : keywordName) {
  ------------------
  |  Branch (560:15): [True: 3.78M, False: 701k]
  ------------------
  561|  3.78M|    if (!UPRV_ISALPHANUM(c)) {
  ------------------
  |  Branch (561:9): [True: 0, False: 3.78M]
  ------------------
  562|      0|      status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */
  563|      0|      return {};
  564|      0|    }
  565|  3.78M|    result.append(uprv_tolower(c), status);
  ------------------
  |  |   68|  3.78M|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  3.78M|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  3.78M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  3.78M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  3.78M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  566|  3.78M|  }
  567|   701k|  if (result.isEmpty()) {
  ------------------
  |  Branch (567:7): [True: 0, False: 701k]
  ------------------
  568|      0|    status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name */
  569|      0|    return {};
  570|      0|  }
  571|       |
  572|   701k|  return result;
  573|   701k|}
uloc.cpp:_ZN12_GLOBAL__N_118_hasBCP47ExtensionENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
  510|  2.92M|inline bool _hasBCP47Extension(std::string_view id) {
  511|  2.92M|    return id.find('@') == std::string_view::npos && getShortestSubtagLength(id) == 1;
  ------------------
  |  Branch (511:12): [True: 2.92M, False: 0]
  |  Branch (511:54): [True: 0, False: 2.92M]
  ------------------
  512|  2.92M|}
uloc.cpp:_ZN12_GLOBAL__N_123getShortestSubtagLengthENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
  485|  2.92M|int32_t getShortestSubtagLength(std::string_view localeID) {
  486|  2.92M|    int32_t localeIDLength = static_cast<int32_t>(localeID.length());
  487|  2.92M|    int32_t length = localeIDLength;
  488|  2.92M|    int32_t tmpLength = 0;
  489|  2.92M|    int32_t i;
  490|  2.92M|    bool reset = true;
  491|       |
  492|  24.5M|    for (i = 0; i < localeIDLength; i++) {
  ------------------
  |  Branch (492:17): [True: 21.6M, False: 2.92M]
  ------------------
  493|  21.6M|        if (localeID[i] != '_' && localeID[i] != '-') {
  ------------------
  |  Branch (493:13): [True: 17.9M, False: 3.76M]
  |  Branch (493:35): [True: 17.9M, False: 0]
  ------------------
  494|  17.9M|            if (reset) {
  ------------------
  |  Branch (494:17): [True: 6.68M, False: 11.2M]
  ------------------
  495|  6.68M|                tmpLength = 0;
  496|  6.68M|                reset = false;
  497|  6.68M|            }
  498|  17.9M|            tmpLength++;
  499|  17.9M|        } else {
  500|  3.76M|            if (tmpLength != 0 && tmpLength < length) {
  ------------------
  |  Branch (500:17): [True: 3.76M, False: 0]
  |  Branch (500:35): [True: 2.45M, False: 1.30M]
  ------------------
  501|  2.45M|                length = tmpLength;
  502|  2.45M|            }
  503|  3.76M|            reset = true;
  504|  3.76M|        }
  505|  21.6M|    }
  506|       |
  507|  2.92M|    return length;
  508|  2.92M|}
uloc.cpp:_ZN12_GLOBAL__N_115UPRV_ISALPHANUMEc:
  516|  3.78M|inline bool UPRV_ISALPHANUM(char c) { return uprv_isASCIILetter(c) || UPRV_ISDIGIT(c); }
  ------------------
  |  | 1514|  3.78M|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|  3.78M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.78M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.78M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (516:46): [True: 3.78M, False: 0]
  |  Branch (516:71): [True: 0, False: 0]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_110_findIndexEPKPKcS1_:
 1178|  1.09M|{
 1179|  1.09M|    const char* const* anchor = list;
 1180|  1.09M|    int32_t pass = 0;
 1181|       |
 1182|       |    /* Make two passes through two nullptr-terminated arrays at 'list' */
 1183|  1.15M|    while (pass++ < 2) {
  ------------------
  |  Branch (1183:12): [True: 1.12M, False: 31.9k]
  ------------------
 1184|   252M|        while (*list) {
  ------------------
  |  Branch (1184:16): [True: 252M, False: 63.9k]
  ------------------
 1185|   252M|            if (uprv_strcmp(key, *list) == 0) {
  ------------------
  |  |   38|   252M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   252M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1185:17): [True: 1.06M, False: 251M]
  ------------------
 1186|  1.06M|                return static_cast<int16_t>(list - anchor);
 1187|  1.06M|            }
 1188|   251M|            list++;
 1189|   251M|        }
 1190|  63.9k|        ++list;     /* skip final nullptr *CWB*/
 1191|  63.9k|    }
 1192|  31.9k|    return std::nullopt;
 1193|  1.09M|}
uloc.cpp:_ZN12_GLOBAL__N_112_getLanguageENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEPN6icu_788ByteSinkER10UErrorCode:
 1219|  6.23M|size_t _getLanguage(std::string_view localeID, ByteSink* sink, UErrorCode& status) {
 1220|  6.23M|    size_t skip = 0;
 1221|  6.23M|    if (localeID.size() == 4 && uprv_strnicmp(localeID.data(), "root", 4) == 0) {
  ------------------
  |  | 1544|      1|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  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 (1221:9): [True: 1, False: 6.23M]
  |  Branch (1221:33): [True: 1, False: 0]
  ------------------
 1222|      1|        skip = 4;
 1223|      1|        localeID.remove_prefix(skip);
 1224|  6.23M|    } else if (localeID.size() >= 3 && uprv_strnicmp(localeID.data(), "und", 3) == 0 &&
  ------------------
  |  | 1544|  6.04M|#define uprv_strnicmp U_ICU_ENTRY_POINT_RENAME(uprv_strnicmp)
  |  |  ------------------
  |  |  |  |  123|  6.04M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.04M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.04M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1224:16): [True: 6.04M, False: 196k]
  |  Branch (1224:40): [True: 0, False: 6.04M]
  ------------------
 1225|  6.23M|               (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|  6.23M|    constexpr int32_t MAXLEN = ULOC_LANG_CAPACITY - 1;  // Minus NUL.
  ------------------
  |  |  251|  6.23M|#define ULOC_LANG_CAPACITY 12
  ------------------
 1234|       |
 1235|       |    /* if it starts with i- or x- then copy that prefix */
 1236|  6.23M|    size_t len = _isIDPrefix(localeID) ? 2 : 0;
  ------------------
  |  Branch (1236:18): [True: 0, False: 6.23M]
  ------------------
 1237|  20.1M|    while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) {
  ------------------
  |  Branch (1237:12): [True: 19.7M, False: 402k]
  |  Branch (1237:37): [True: 19.7M, False: 0]
  |  Branch (1237:70): [True: 13.9M, False: 5.83M]
  ------------------
 1238|  13.9M|        if (len == MAXLEN) {
  ------------------
  |  Branch (1238:13): [True: 0, False: 13.9M]
  ------------------
 1239|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
 1240|      0|            return 0;
 1241|      0|        }
 1242|  13.9M|        len++;
 1243|  13.9M|    }
 1244|       |
 1245|  6.23M|    if (sink == nullptr || len == 0) { return skip + len; }
  ------------------
  |  Branch (1245:9): [True: 2.01M, False: 4.22M]
  |  Branch (1245:28): [True: 1, False: 4.22M]
  ------------------
 1246|       |
 1247|  4.22M|    int32_t minCapacity = uprv_max(static_cast<int32_t>(len), 4);  // Minimum 3 letters plus NUL.
  ------------------
  |  | 1526|  4.22M|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|  4.22M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.22M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.22M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1248|  4.22M|    char scratch[MAXLEN];
 1249|  4.22M|    int32_t capacity = 0;
 1250|  4.22M|    char* buffer = sink->GetAppendBuffer(
 1251|  4.22M|            minCapacity, minCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity);
  ------------------
  |  |   99|  4.22M|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1252|       |
 1253|  13.7M|    for (size_t i = 0; i < len; ++i) {
  ------------------
  |  Branch (1253:24): [True: 9.51M, False: 4.22M]
  ------------------
 1254|  9.51M|        buffer[i] = uprv_tolower(localeID[i]);
  ------------------
  |  |   68|  9.51M|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  9.51M|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  9.51M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  9.51M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  9.51M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1255|  9.51M|    }
 1256|  4.22M|    if (localeID.size() >= 2 && _isIDSeparator(localeID[1])) {
  ------------------
  |  Branch (1256:9): [True: 4.22M, False: 0]
  |  Branch (1256:33): [True: 0, False: 4.22M]
  ------------------
 1257|      0|        buffer[1] = '-';
 1258|      0|    }
 1259|       |
 1260|  4.22M|    if (len == 3) {
  ------------------
  |  Branch (1260:9): [True: 1.06M, False: 3.16M]
  ------------------
 1261|       |        /* convert 3 character code to 2 character code if possible *CWB*/
 1262|  1.06M|        U_ASSERT(capacity >= 4);
  ------------------
  |  |   35|  1.06M|#   define U_ASSERT(exp) (void)0
  ------------------
 1263|  1.06M|        buffer[3] = '\0';
 1264|  1.06M|        std::optional<int16_t> offset = _findIndex(LANGUAGES_3, buffer);
 1265|  1.06M|        if (offset.has_value()) {
  ------------------
  |  Branch (1265:13): [True: 1.06M, False: 0]
  ------------------
 1266|  1.06M|            const char* const alias = LANGUAGES[*offset];
 1267|  1.06M|            sink->Append(alias, static_cast<int32_t>(uprv_strlen(alias)));
  ------------------
  |  |   37|  1.06M|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.06M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1268|  1.06M|            return skip + len;
 1269|  1.06M|        }
 1270|  1.06M|    }
 1271|       |
 1272|  3.16M|    sink->Append(buffer, static_cast<int32_t>(len));
 1273|  3.16M|    return skip + len;
 1274|  4.22M|}
uloc.cpp:_ZN12_GLOBAL__N_111_isIDPrefixENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
 1152|  6.23M|inline bool _isIDPrefix(std::string_view s) {
 1153|  6.23M|    return s.size() >= 2 && _isPrefixLetter(s[0]) && _isIDSeparator(s[1]);
  ------------------
  |  Branch (1153:12): [True: 6.23M, False: 1]
  |  Branch (1153:29): [True: 30.8k, False: 6.20M]
  |  Branch (1153:54): [True: 0, False: 30.8k]
  ------------------
 1154|  6.23M|}
uloc.cpp:_ZN12_GLOBAL__N_115_isPrefixLetterEc:
 1148|  6.23M|inline bool _isPrefixLetter(char a) { return a == 'x' || a == 'X' || a == 'i' || a == 'I'; }
  ------------------
  |  Branch (1148:46): [True: 11.7k, False: 6.22M]
  |  Branch (1148:58): [True: 0, False: 6.22M]
  |  Branch (1148:70): [True: 19.1k, False: 6.20M]
  |  Branch (1148:82): [True: 0, False: 6.20M]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_113_isTerminatorEc:
 1159|  45.6M|inline bool _isTerminator(char a) { return a == '.' || a == '@'; }
  ------------------
  |  Branch (1159:44): [True: 0, False: 45.6M]
  |  Branch (1159:56): [True: 0, False: 45.6M]
  ------------------
uloc.cpp:_ZN12_GLOBAL__N_110_getScriptENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEPN6icu_788ByteSinkE:
 1276|  5.83M|size_t _getScript(std::string_view localeID, ByteSink* sink) {
 1277|  5.83M|    constexpr int32_t LENGTH = 4;
 1278|       |
 1279|  5.83M|    size_t len = 0;
 1280|  20.7M|    while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len]) &&
  ------------------
  |  Branch (1280:12): [True: 16.8M, False: 3.82M]
  |  Branch (1280:37): [True: 16.8M, False: 0]
  |  Branch (1280:70): [True: 14.9M, False: 1.96M]
  ------------------
 1281|  20.7M|            uprv_isASCIILetter(localeID[len])) {
  ------------------
  |  | 1514|  14.9M|#define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
  |  |  ------------------
  |  |  |  |  123|  14.9M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  14.9M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  14.9M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1281:13): [True: 14.8M, False: 47.6k]
  ------------------
 1282|  14.8M|        if (len == LENGTH) { return 0; }
  ------------------
  |  Branch (1282:13): [True: 0, False: 14.8M]
  ------------------
 1283|  14.8M|        len++;
 1284|  14.8M|    }
 1285|  5.83M|    if (len != LENGTH) { return 0; }
  ------------------
  |  Branch (1285:9): [True: 4.18M, False: 1.65M]
  ------------------
 1286|       |
 1287|  1.65M|    if (sink == nullptr) { return len; }
  ------------------
  |  Branch (1287:9): [True: 719k, False: 933k]
  ------------------
 1288|       |
 1289|   933k|    char scratch[LENGTH];
 1290|   933k|    int32_t capacity = 0;
 1291|   933k|    char* buffer = sink->GetAppendBuffer(
 1292|   933k|            LENGTH, LENGTH, scratch, UPRV_LENGTHOF(scratch), &capacity);
  ------------------
  |  |   99|   933k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1293|       |
 1294|   933k|    buffer[0] = uprv_toupper(localeID[0]);
  ------------------
  |  | 1547|   933k|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|   933k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   933k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   933k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1295|  3.73M|    for (int32_t i = 1; i < LENGTH; ++i) {
  ------------------
  |  Branch (1295:25): [True: 2.79M, False: 933k]
  ------------------
 1296|  2.79M|        buffer[i] = uprv_tolower(localeID[i]);
  ------------------
  |  |   68|  2.79M|#   define uprv_tolower uprv_asciitolower
  |  |  ------------------
  |  |  |  | 1397|  2.79M|#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|  2.79M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|  2.79M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|  2.79M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1297|  2.79M|    }
 1298|       |
 1299|   933k|    sink->Append(buffer, LENGTH);
 1300|   933k|    return len;
 1301|  1.65M|}
uloc.cpp:_ZN12_GLOBAL__N_110_getRegionENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEPN6icu_788ByteSinkE:
 1303|  3.82M|size_t _getRegion(std::string_view localeID, ByteSink* sink) {
 1304|  3.82M|    constexpr int32_t MINLEN = 2;
 1305|  3.82M|    constexpr int32_t MAXLEN = ULOC_COUNTRY_CAPACITY - 1;  // Minus NUL.
  ------------------
  |  |  258|  3.82M|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
 1306|       |
 1307|  3.82M|    size_t len = 0;
 1308|  11.5M|    while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) {
  ------------------
  |  Branch (1308:12): [True: 8.96M, False: 2.53M]
  |  Branch (1308:37): [True: 8.96M, False: 0]
  |  Branch (1308:70): [True: 7.68M, False: 1.28M]
  ------------------
 1309|  7.68M|        if (len == MAXLEN) { return 0; }
  ------------------
  |  Branch (1309:13): [True: 0, False: 7.68M]
  ------------------
 1310|  7.68M|        len++;
 1311|  7.68M|    }
 1312|  3.82M|    if (len < MINLEN) { return 0; }
  ------------------
  |  Branch (1312:9): [True: 0, False: 3.82M]
  ------------------
 1313|       |
 1314|  3.82M|    if (sink == nullptr) { return len; }
  ------------------
  |  Branch (1314:9): [True: 1.09M, False: 2.72M]
  ------------------
 1315|       |
 1316|  2.72M|    char scratch[ULOC_COUNTRY_CAPACITY];
 1317|  2.72M|    int32_t capacity = 0;
 1318|  2.72M|    char* buffer = sink->GetAppendBuffer(
 1319|  2.72M|            ULOC_COUNTRY_CAPACITY,
  ------------------
  |  |  258|  2.72M|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
 1320|  2.72M|            ULOC_COUNTRY_CAPACITY,
  ------------------
  |  |  258|  2.72M|#define ULOC_COUNTRY_CAPACITY 4
  ------------------
 1321|  2.72M|            scratch,
 1322|  2.72M|            UPRV_LENGTHOF(scratch),
  ------------------
  |  |   99|  2.72M|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1323|  2.72M|            &capacity);
 1324|       |
 1325|  8.21M|    for (size_t i = 0; i < len; ++i) {
  ------------------
  |  Branch (1325:24): [True: 5.48M, False: 2.72M]
  ------------------
 1326|  5.48M|        buffer[i] = uprv_toupper(localeID[i]);
  ------------------
  |  | 1547|  5.48M|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|  5.48M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.48M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.48M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1327|  5.48M|    }
 1328|       |
 1329|  2.72M|    if (len == 3) {
  ------------------
  |  Branch (1329:9): [True: 31.9k, False: 2.69M]
  ------------------
 1330|       |        /* convert 3 character code to 2 character code if possible *CWB*/
 1331|  31.9k|        U_ASSERT(capacity >= 4);
  ------------------
  |  |   35|  31.9k|#   define U_ASSERT(exp) (void)0
  ------------------
 1332|  31.9k|        buffer[3] = '\0';
 1333|  31.9k|        std::optional<int16_t> offset = _findIndex(COUNTRIES_3, buffer);
 1334|  31.9k|        if (offset.has_value()) {
  ------------------
  |  Branch (1334:13): [True: 0, False: 31.9k]
  ------------------
 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|  31.9k|    }
 1340|       |
 1341|  2.72M|    sink->Append(buffer, static_cast<int32_t>(len));
 1342|  2.72M|    return len;
 1343|  2.72M|}
uloc.cpp:_ZN12_GLOBAL__N_117_isBCP47ExtensionENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
 1161|  1.17M|inline bool _isBCP47Extension(std::string_view p) {
 1162|  1.17M|    return p.size() >= 3 &&
  ------------------
  |  Branch (1162:12): [True: 1.17M, False: 0]
  ------------------
 1163|  1.17M|           p[0] == '-' &&
  ------------------
  |  Branch (1163:12): [True: 0, False: 1.17M]
  ------------------
 1164|  1.17M|           (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|  1.17M|           p[2] == '-';
  ------------------
  |  Branch (1167:12): [True: 0, False: 0]
  ------------------
 1168|  1.17M|}
uloc.cpp:_ZN12_GLOBAL__N_111_getVariantENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEcPN6icu_788ByteSinkEbR10UErrorCode:
 1354|  1.17M|            UErrorCode& status) {
 1355|  1.17M|    if (U_FAILURE(status) || localeID.empty()) return 0;
  ------------------
  |  Branch (1355:9): [True: 0, False: 1.17M]
  |  Branch (1355:30): [True: 0, False: 1.17M]
  ------------------
 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|  1.17M|    constexpr int32_t MAX_VARIANTS_LENGTH = 179;
 1366|       |
 1367|       |    /* get one or more variant tags and separate them with '_' */
 1368|  1.17M|    size_t index = 0;
 1369|  1.17M|    if (_isIDSeparator(prev)) {
  ------------------
  |  Branch (1369:9): [True: 1.17M, False: 0]
  ------------------
 1370|       |        /* get a variant string after a '-' or '_' */
 1371|  1.17M|        for (std::string_view sub = localeID;;) {
 1372|  1.17M|            size_t next = sub.find_first_of(".@_-");
 1373|       |            // For historical reasons, a trailing separator is included in the variant.
 1374|  1.17M|            bool finished = next == std::string_view::npos || next + 1 == sub.length();
  ------------------
  |  Branch (1374:29): [True: 1.17M, False: 0]
  |  Branch (1374:63): [True: 0, False: 0]
  ------------------
 1375|  1.17M|            size_t limit = finished ? sub.length() : next;
  ------------------
  |  Branch (1375:28): [True: 1.17M, False: 0]
  ------------------
 1376|  1.17M|            index += limit;
 1377|  1.17M|            if (index > MAX_VARIANTS_LENGTH) {
  ------------------
  |  Branch (1377:17): [True: 0, False: 1.17M]
  ------------------
 1378|      0|                status = U_ILLEGAL_ARGUMENT_ERROR;
 1379|      0|                return 0;
 1380|      0|            }
 1381|       |
 1382|  1.17M|            if (sink != nullptr) {
  ------------------
  |  Branch (1382:17): [True: 1.17M, False: 0]
  ------------------
 1383|  1.17M|                if (needSeparator) {
  ------------------
  |  Branch (1383:21): [True: 0, False: 1.17M]
  ------------------
 1384|      0|                    sink->Append("_", 1);
 1385|  1.17M|                } else {
 1386|  1.17M|                    needSeparator = true;
 1387|  1.17M|                }
 1388|       |
 1389|  1.17M|                int32_t length = static_cast<int32_t>(limit);
 1390|  1.17M|                int32_t minCapacity = uprv_min(length, MAX_VARIANTS_LENGTH);
  ------------------
  |  | 1529|  1.17M|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|  1.17M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.17M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.17M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1391|  1.17M|                char scratch[MAX_VARIANTS_LENGTH];
 1392|  1.17M|                int32_t capacity = 0;
 1393|  1.17M|                char* buffer = sink->GetAppendBuffer(
 1394|  1.17M|                        minCapacity, minCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity);
  ------------------
  |  |   99|  1.17M|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 1395|       |
 1396|  7.06M|                for (size_t i = 0; i < limit; ++i) {
  ------------------
  |  Branch (1396:36): [True: 5.88M, False: 1.17M]
  ------------------
 1397|  5.88M|                    buffer[i] = uprv_toupper(sub[i]);
  ------------------
  |  | 1547|  5.88M|#define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper)
  |  |  ------------------
  |  |  |  |  123|  5.88M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.88M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.88M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1398|  5.88M|                }
 1399|  1.17M|                sink->Append(buffer, length);
 1400|  1.17M|            }
 1401|       |
 1402|  1.17M|            if (finished) { return index; }
  ------------------
  |  Branch (1402:17): [True: 1.17M, 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|  1.17M|    }
 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|  2.21M|              UErrorCode& err) {
 1807|  2.21M|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (1807:9): [True: 0, False: 2.21M]
  ------------------
 1808|      0|        return;
 1809|      0|    }
 1810|       |
 1811|  2.21M|    int32_t j, fieldCount=0;
 1812|  2.21M|    CharString tempBuffer;  // if localeID has a BCP47 extension, tmpLocaleID points to this
 1813|  2.21M|    CharString localeIDWithHyphens;  // if localeID has a BPC47 extension and have _, tmpLocaleID points to this
 1814|  2.21M|    std::string_view origLocaleID;
 1815|  2.21M|    std::string_view tmpLocaleID;
 1816|  2.21M|    size_t keywordAssign = std::string_view::npos;
 1817|  2.21M|    size_t separatorIndicator = std::string_view::npos;
 1818|       |
 1819|  2.21M|    if (_hasBCP47Extension(localeID)) {
  ------------------
  |  Branch (1819:9): [True: 0, False: 2.21M]
  ------------------
 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|  2.21M|    } else {
 1838|  2.21M|        tmpLocaleID=localeID;
 1839|  2.21M|    }
 1840|       |
 1841|  2.21M|    origLocaleID=tmpLocaleID;
 1842|       |
 1843|       |    /* get all pieces, one after another, and separate with '_' */
 1844|  2.21M|    CharString tag;
 1845|  2.21M|    CharString script;
 1846|  2.21M|    CharString country;
 1847|  2.21M|    CharString variant;
 1848|  2.21M|    const char* end = nullptr;
 1849|  2.21M|    ulocimp_getSubtags(
  ------------------
  |  | 1209|  2.21M|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  2.21M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.21M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.21M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1850|  2.21M|            tmpLocaleID,
 1851|  2.21M|            &tag,
 1852|  2.21M|            &script,
 1853|  2.21M|            &country,
 1854|  2.21M|            &variant,
 1855|  2.21M|            &end,
 1856|  2.21M|            err);
 1857|  2.21M|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (1857:9): [True: 0, False: 2.21M]
  ------------------
 1858|      0|        return;
 1859|      0|    }
 1860|  2.21M|    U_ASSERT(end != nullptr);
  ------------------
  |  |   35|  2.21M|#   define U_ASSERT(exp) (void)0
  ------------------
 1861|  2.21M|    if (end > tmpLocaleID.data()) {
  ------------------
  |  Branch (1861:9): [True: 2.21M, False: 0]
  ------------------
 1862|  2.21M|        tmpLocaleID.remove_prefix(end - tmpLocaleID.data());
 1863|  2.21M|    }
 1864|       |
 1865|  2.21M|    if (tag.length() == I_DEFAULT_LENGTH && origLocaleID.length() >= I_DEFAULT_LENGTH &&
  ------------------
  |  Branch (1865:9): [True: 0, False: 2.21M]
  |  Branch (1865:45): [True: 0, False: 0]
  ------------------
 1866|  2.21M|            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|  2.21M|    } else {
 1870|  2.21M|        if (!script.isEmpty()) {
  ------------------
  |  Branch (1870:13): [True: 233k, False: 1.98M]
  ------------------
 1871|   233k|            ++fieldCount;
 1872|   233k|            tag.append('_', err);
 1873|   233k|            tag.append(script, err);
 1874|   233k|        }
 1875|  2.21M|        if (!country.isEmpty()) {
  ------------------
  |  Branch (1875:13): [True: 1.80M, False: 412k]
  ------------------
 1876|  1.80M|            ++fieldCount;
 1877|  1.80M|            tag.append('_', err);
 1878|  1.80M|            tag.append(country, err);
 1879|  1.80M|        }
 1880|  2.21M|        if (!variant.isEmpty()) {
  ------------------
  |  Branch (1880:13): [True: 785k, False: 1.43M]
  ------------------
 1881|   785k|            ++fieldCount;
 1882|   785k|            if (country.isEmpty()) {
  ------------------
  |  Branch (1882:17): [True: 0, False: 785k]
  ------------------
 1883|      0|                tag.append('_', err);
 1884|      0|            }
 1885|   785k|            tag.append('_', err);
 1886|   785k|            tag.append(variant, err);
 1887|   785k|        }
 1888|  2.21M|    }
 1889|       |
 1890|       |    /* Copy POSIX-style charset specifier, if any [mr.utf8] */
 1891|  2.21M|    if (!OPTION_SET(options, _ULOC_CANONICALIZE) && !tmpLocaleID.empty() && tmpLocaleID.front() == '.') {
  ------------------
  |  | 1786|  2.21M|#define _ULOC_CANONICALIZE   0x1
  ------------------
  |  Branch (1891:9): [True: 2.21M, False: 886]
  |  Branch (1891:53): [True: 0, False: 2.21M]
  |  Branch (1891:77): [True: 0, False: 0]
  ------------------
 1892|      0|        tag.append('.', err);
 1893|      0|        tmpLocaleID.remove_prefix(1);
 1894|      0|        size_t length;
 1895|      0|        if (size_t atPos = tmpLocaleID.find('@'); atPos != std::string_view::npos) {
  ------------------
  |  Branch (1895:51): [True: 0, False: 0]
  ------------------
 1896|      0|            length = atPos;
 1897|      0|        } else {
 1898|      0|            length = tmpLocaleID.length();
 1899|      0|        }
 1900|       |        // The longest charset name we found in IANA charset registry
 1901|       |        // https://www.iana.org/assignments/character-sets/ is
 1902|       |        // "Extended_UNIX_Code_Packed_Format_for_Japanese" in length 45.
 1903|       |        // we therefore restrict the length here to be 64 which is a power of 2
 1904|       |        // number that is longer than 45.
 1905|      0|        constexpr size_t kMaxCharsetLength = 64;
 1906|      0|        if (length > kMaxCharsetLength) {
  ------------------
  |  Branch (1906:13): [True: 0, False: 0]
  ------------------
 1907|      0|           err = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */
 1908|      0|           return;
 1909|      0|        }
 1910|      0|        if (length > 0) {
  ------------------
  |  Branch (1910:13): [True: 0, False: 0]
  ------------------
 1911|      0|            tag.append(tmpLocaleID.data(), static_cast<int32_t>(length), err);
 1912|      0|            tmpLocaleID.remove_prefix(length);
 1913|      0|        }
 1914|      0|    }
 1915|       |
 1916|       |    /* Scan ahead to next '@' and determine if it is followed by '=' and/or ';'
 1917|       |       After this, tmpLocaleID either starts at '@' or is empty. */
 1918|  2.21M|    if (const char* start = locale_getKeywordsStart(tmpLocaleID); start != nullptr) {
  ------------------
  |  |  138|  2.21M|#define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart)
  |  |  ------------------
  |  |  |  |  123|  2.21M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.21M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.21M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1918:67): [True: 0, False: 2.21M]
  ------------------
 1919|      0|        if (start > tmpLocaleID.data()) {
  ------------------
  |  Branch (1919:13): [True: 0, False: 0]
  ------------------
 1920|      0|            tmpLocaleID.remove_prefix(start - tmpLocaleID.data());
 1921|      0|        }
 1922|      0|        keywordAssign = tmpLocaleID.find('=');
 1923|      0|        separatorIndicator = tmpLocaleID.find(';');
 1924|  2.21M|    } else {
 1925|  2.21M|        tmpLocaleID = {};
 1926|  2.21M|    }
 1927|       |
 1928|       |    /* Copy POSIX-style variant, if any [mr@FOO] */
 1929|  2.21M|    if (!OPTION_SET(options, _ULOC_CANONICALIZE) &&
  ------------------
  |  | 1786|  2.21M|#define _ULOC_CANONICALIZE   0x1
  ------------------
  |  Branch (1929:9): [True: 2.21M, False: 886]
  ------------------
 1930|  2.21M|        !tmpLocaleID.empty() && keywordAssign == std::string_view::npos) {
  ------------------
  |  Branch (1930:9): [True: 0, False: 2.21M]
  |  Branch (1930:33): [True: 0, False: 0]
  ------------------
 1931|      0|        tag.append(tmpLocaleID, err);
 1932|      0|        tmpLocaleID = {};
 1933|      0|    }
 1934|       |
 1935|  2.21M|    if (OPTION_SET(options, _ULOC_CANONICALIZE)) {
  ------------------
  |  | 1786|  2.21M|#define _ULOC_CANONICALIZE   0x1
  ------------------
  |  Branch (1935:9): [True: 886, False: 2.21M]
  ------------------
 1936|       |        /* Handle @FOO variant if @ is present and not followed by = */
 1937|    886|        if (!tmpLocaleID.empty() && keywordAssign == std::string_view::npos) {
  ------------------
  |  Branch (1937:13): [True: 0, False: 886]
  |  Branch (1937:37): [True: 0, False: 0]
  ------------------
 1938|       |            /* Add missing '_' if needed */
 1939|      0|            if (fieldCount < 2 || (fieldCount < 3 && !script.isEmpty())) {
  ------------------
  |  Branch (1939:17): [True: 0, False: 0]
  |  Branch (1939:36): [True: 0, False: 0]
  |  Branch (1939:54): [True: 0, False: 0]
  ------------------
 1940|      0|                do {
 1941|      0|                    tag.append('_', err);
 1942|      0|                    ++fieldCount;
 1943|      0|                } while(fieldCount<2);
  ------------------
  |  Branch (1943:25): [True: 0, False: 0]
  ------------------
 1944|      0|            }
 1945|       |
 1946|      0|            CharStringByteSink s(&tag);
 1947|      0|            std::string_view sub = tmpLocaleID;
 1948|      0|            sub.remove_prefix(1);
 1949|      0|            _getVariant(sub, '@', &s, !variant.isEmpty(), err);
 1950|      0|            if (U_FAILURE(err)) { return; }
  ------------------
  |  Branch (1950:17): [True: 0, False: 0]
  ------------------
 1951|      0|        }
 1952|       |
 1953|       |        /* Look up the ID in the canonicalization map */
 1954|  9.74k|        for (j=0; j<UPRV_LENGTHOF(CANONICALIZE_MAP); j++) {
  ------------------
  |  |   99|  9.74k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (1954:19): [True: 8.86k, False: 886]
  ------------------
 1955|  8.86k|            StringPiece id(CANONICALIZE_MAP[j].id);
 1956|  8.86k|            if (tag == id) {
  ------------------
  |  Branch (1956:17): [True: 0, False: 8.86k]
  ------------------
 1957|      0|                if (id.empty() && !tmpLocaleID.empty()) {
  ------------------
  |  Branch (1957:21): [True: 0, False: 0]
  |  Branch (1957:35): [True: 0, False: 0]
  ------------------
 1958|      0|                    break; /* Don't remap "" if keywords present */
 1959|      0|                }
 1960|      0|                tag.clear();
 1961|      0|                tag.append(CANONICALIZE_MAP[j].canonicalID, err);
 1962|      0|                break;
 1963|      0|            }
 1964|  8.86k|        }
 1965|    886|    }
 1966|       |
 1967|  2.21M|    sink.Append(tag.data(), tag.length());
 1968|       |
 1969|  2.21M|    if (!OPTION_SET(options, _ULOC_STRIP_KEYWORDS)) {
  ------------------
  |  | 1785|  2.21M|#define _ULOC_STRIP_KEYWORDS 0x2
  ------------------
  |  Branch (1969:9): [True: 787k, False: 1.43M]
  ------------------
 1970|   787k|        if (!tmpLocaleID.empty() && keywordAssign != std::string_view::npos &&
  ------------------
  |  Branch (1970:13): [True: 0, False: 787k]
  |  Branch (1970:37): [True: 0, False: 0]
  ------------------
 1971|   787k|            (separatorIndicator == std::string_view::npos || separatorIndicator > keywordAssign)) {
  ------------------
  |  Branch (1971:14): [True: 0, False: 0]
  |  Branch (1971:62): [True: 0, False: 0]
  ------------------
 1972|      0|            sink.Append("@", 1);
 1973|      0|            ++fieldCount;
 1974|      0|            tmpLocaleID.remove_prefix(1);
 1975|      0|            ulocimp_getKeywords(tmpLocaleID, '@', sink, true, err);
  ------------------
  |  | 1201|      0|#define ulocimp_getKeywords U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywords)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1976|      0|        }
 1977|   787k|    }
 1978|  2.21M|}
uloc.cpp:_ZN12_GLOBAL__N_110OPTION_SETEjj:
 1790|  8.87M|inline bool OPTION_SET(uint32_t options, uint32_t mask) { return (options & mask) != 0; }
uloc.cpp:_ZZ23uloc_getKeywordValue_78ENK3$_0clERN6icu_788ByteSinkER10UErrorCode:
  741|   161k|        [&](ByteSink& sink, UErrorCode& status) {
  742|   161k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  ------------------
  |  | 1200|   161k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|   161k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   161k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   161k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  743|   161k|        },
uloc.cpp:_ZZ26ulocimp_getKeywordValue_78PKcNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES7_:
  753|   539k|        [&](ByteSink& sink, UErrorCode& status) {
  754|   539k|            ulocimp_getKeywordValue(localeID, keywordName, sink, status);
  ------------------
  |  | 1200|   539k|#define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue)
  |  |  ------------------
  |  |  |  |  123|   539k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   539k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   539k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  755|   539k|        },
uloc.cpp:_ZZ20ulocimp_getRegion_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 1477|   269k|        [&](ByteSink& sink, UErrorCode& status) {
 1478|   269k|            ulocimp_getSubtags(
  ------------------
  |  | 1209|   269k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|   269k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   269k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   269k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1479|   269k|                    localeID,
 1480|   269k|                    nullptr,
 1481|   269k|                    nullptr,
 1482|   269k|                    &sink,
 1483|   269k|                    nullptr,
 1484|   269k|                    nullptr,
 1485|   269k|                    status);
 1486|   269k|        },
uloc.cpp:_ZZ18ulocimp_getName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 2161|   785k|        [&](ByteSink& sink, UErrorCode& status) {
 2162|   785k|            ulocimp_getName(localeID, sink, status);
  ------------------
  |  | 1204|   785k|#define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName)
  |  |  ------------------
  |  |  |  |  123|   785k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   785k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   785k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2163|   785k|        },
uloc.cpp:_ZZ22ulocimp_getBaseName_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 2197|  1.43M|        [&](ByteSink& sink, UErrorCode& status) {
 2198|  1.43M|            ulocimp_getBaseName(localeID, sink, status);
  ------------------
  |  | 1199|  1.43M|#define ulocimp_getBaseName U_ICU_ENTRY_POINT_RENAME(ulocimp_getBaseName)
  |  |  ------------------
  |  |  |  |  123|  1.43M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.43M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.43M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2199|  1.43M|        },
uloc.cpp:_ZZ23ulocimp_canonicalize_78NSt3__117basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCodeENK3$_0clERN6icu_788ByteSinkES5_:
 2233|      1|        [&](ByteSink& sink, UErrorCode& status) {
 2234|      1|            ulocimp_canonicalize(localeID, sink, status);
  ------------------
  |  | 1197|      1|#define ulocimp_canonicalize U_ICU_ENTRY_POINT_RENAME(ulocimp_canonicalize)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2235|      1|        },

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

uprv_max_78:
   17|  4.81M|{
   18|  4.81M|    return (x > y ? x : y);
  ------------------
  |  Branch (18:13): [True: 19.3k, False: 4.79M]
  ------------------
   19|  4.81M|}
uprv_min_78:
   23|  12.8M|{
   24|  12.8M|    return (x > y ? y : x);
  ------------------
  |  Branch (24:13): [True: 11.0M, False: 1.73M]
  ------------------
   25|  12.8M|}

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

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

_ZNK6icu_789BytesTrie8getValueEv:
  246|      5|    inline int32_t getValue() const {
  247|      5|        const uint8_t *pos=pos_;
  248|      5|        int32_t leadByte=*pos++;
  249|       |        // U_ASSERT(leadByte>=kMinValueLead);
  250|      5|        return readValue(pos, leadByte>>1);
  251|      5|    }
_ZN6icu_789BytesTrieC2EPKv:
   72|     11|            : ownedArray_(nullptr), bytes_(static_cast<const uint8_t *>(trieBytes)),
   73|     11|              pos_(bytes_), remainingMatchLength_(-1) {}
_ZN6icu_789BytesTrie4stopEv:
  399|      6|    inline void stop() {
  400|      6|        pos_=nullptr;
  401|      6|    }
_ZN6icu_789BytesTrie9skipValueEPKhi:
  406|     34|    static inline const uint8_t *skipValue(const uint8_t *pos, int32_t leadByte) {
  407|       |        // U_ASSERT(leadByte>=kMinValueLead);
  408|     34|        if(leadByte>=(kMinTwoByteValueLead<<1)) {
  ------------------
  |  Branch (408:12): [True: 18, False: 16]
  ------------------
  409|     18|            if(leadByte<(kMinThreeByteValueLead<<1)) {
  ------------------
  |  Branch (409:16): [True: 15, False: 3]
  ------------------
  410|     15|                ++pos;
  411|     15|            } else if(leadByte<(kFourByteValueLead<<1)) {
  ------------------
  |  Branch (411:23): [True: 3, False: 0]
  ------------------
  412|      3|                pos+=2;
  413|      3|            } else {
  414|      0|                pos+=3+((leadByte>>1)&1);
  415|      0|            }
  416|     18|        }
  417|     34|        return pos;
  418|     34|    }
_ZN6icu_789BytesTrie9skipValueEPKh:
  419|     31|    static inline const uint8_t *skipValue(const uint8_t *pos) {
  420|     31|        int32_t leadByte=*pos++;
  421|     31|        return skipValue(pos, leadByte);
  422|     31|    }
_ZN6icu_789BytesTrie9skipDeltaEPKh:
  427|      9|    static inline const uint8_t *skipDelta(const uint8_t *pos) {
  428|      9|        int32_t delta=*pos++;
  429|      9|        if(delta>=kMinTwoByteDeltaLead) {
  ------------------
  |  Branch (429:12): [True: 6, False: 3]
  ------------------
  430|      6|            if(delta<kMinThreeByteDeltaLead) {
  ------------------
  |  Branch (430:16): [True: 6, False: 0]
  ------------------
  431|      6|                ++pos;
  432|      6|            } else if(delta<kFourByteDeltaLead) {
  ------------------
  |  Branch (432:23): [True: 0, False: 0]
  ------------------
  433|      0|                pos+=2;
  434|      0|            } else {
  435|      0|                pos+=3+(delta&1);
  436|      0|            }
  437|      6|        }
  438|      9|        return pos;
  439|      9|    }
_ZN6icu_789BytesTrie11valueResultEi:
  441|      8|    static inline UStringTrieResult valueResult(int32_t node) {
  442|      8|        return static_cast<UStringTrieResult>(USTRINGTRIE_INTERMEDIATE_VALUE - (node & kValueIsFinal));
  443|      8|    }

_ZN6icu_7814ConstChar16PtrC2EPKDs:
  229|  13.6M|ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p_(p) {}
_ZN6icu_7814ConstChar16PtrD2Ev:
  237|  13.6M|ConstChar16Ptr::~ConstChar16Ptr() {
  238|  13.6M|    U_ALIASING_BARRIER(p_);
  ------------------
  |  |   35|  13.6M|#   define U_ALIASING_BARRIER(ptr) asm volatile("" : : "rm"(ptr) : "memory")
  ------------------
  239|  13.6M|}
_ZNK6icu_7814ConstChar16PtrcvPKDsEv:
  205|  14.2M|    inline operator const char16_t *() const { return get(); }
_ZNK6icu_7814ConstChar16Ptr3getEv:
  241|  14.2M|const char16_t *ConstChar16Ptr::get() const { return p_; }
_ZN6icu_788internal15toU16StringViewENSt3__117basic_string_viewIDsNS1_11char_traitsIDsEEEE:
  400|   303k|inline std::u16string_view toU16StringView(std::u16string_view sv) { return sv; }
_ZN6icu_788internal23toU16StringViewNullableIA4_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA2_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|   246k|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|   246k|    return toU16StringView(text);
  432|   246k|}
_ZN6icu_788internal23toU16StringViewNullableIA1_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|  19.2k|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|  19.2k|    return toU16StringView(text);
  432|  19.2k|}
_ZN6icu_788internal23toU16StringViewNullableIA10_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA55_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA19_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}
_ZN6icu_788internal23toU16StringViewNullableIA48_DsvEENSt3__117basic_string_viewIDsNS3_11char_traitsIDsEEEERKT_:
  430|      1|inline std::u16string_view toU16StringViewNullable(const T& text) {
  431|      1|    return toU16StringView(text);
  432|      1|}

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

_ZNK6icu_7816LocalPointerBaseINS_18CurrencyPluralInfoEE6isNullEv:
   94|   551k|    UBool isNull() const { return ptr==nullptr; }
_ZN6icu_7812LocalPointerINS_18CurrencyPluralInfoEE12adoptInsteadEPS1_:
  300|   293k|    void adoptInstead(T *p) {
  301|   293k|        delete LocalPointerBase<T>::ptr;
  302|   293k|        LocalPointerBase<T>::ptr=p;
  303|   293k|    }
_ZN6icu_7812LocalPointerINS_15NumberingSystemEEC2EPS1_:
  200|   180k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_15NumberingSystemEEC2EPS1_:
   82|   485k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_15NumberingSystemEED2Ev:
  245|   485k|    ~LocalPointer() {
  246|   485k|        delete LocalPointerBase<T>::ptr;
  247|   485k|    }
_ZN6icu_7816LocalPointerBaseINS_15NumberingSystemEED2Ev:
   88|   485k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_15NumberingSystemEE12adoptInsteadEPS1_:
  300|   151k|    void adoptInstead(T *p) {
  301|   151k|        delete LocalPointerBase<T>::ptr;
  302|   151k|        LocalPointerBase<T>::ptr=p;
  303|   151k|    }
_ZNK6icu_7816LocalPointerBaseINS_15NumberingSystemEE8getAliasEv:
  122|   151k|    T *getAlias() const { return ptr; }
_ZN6icu_788internal16LocalOpenPointerI15UResourceBundleXadL_Z13ures_close_78EEEC2EPS2_:
  567|  2.86M|    explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase<Type>(p) {}
_ZN6icu_7816LocalPointerBaseI15UResourceBundleEC2EPS1_:
   82|  2.86M|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_788internal16LocalOpenPointerI15UResourceBundleXadL_Z13ures_close_78EEED2Ev:
  575|  2.86M|    ~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } }
  ------------------
  |  Branch (575:31): [True: 2.85M, False: 9.28k]
  ------------------
_ZN6icu_7816LocalPointerBaseI15UResourceBundleED2Ev:
   88|  2.86M|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseI15UResourceBundleE8getAliasEv:
  122|  6.59M|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerINS_11PluralRulesEEC2EPS1_:
  200|   151k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_11PluralRulesEEC2EPS1_:
   82|   151k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_11PluralRulesEED2Ev:
  245|   150k|    ~LocalPointer() {
  246|   150k|        delete LocalPointerBase<T>::ptr;
  247|   150k|    }
_ZN6icu_7816LocalPointerBaseINS_11PluralRulesEED2Ev:
   88|   150k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_18CurrencyPluralInfoEEC2EPS1_:
  200|   302k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_18CurrencyPluralInfoEEC2EPS1_:
   82|   302k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_18CurrencyPluralInfoEED2Ev:
  245|   301k|    ~LocalPointer() {
  246|   301k|        delete LocalPointerBase<T>::ptr;
  247|   301k|    }
_ZN6icu_7816LocalPointerBaseINS_18CurrencyPluralInfoEED2Ev:
   88|   301k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerIKNS_20DecimalFormatSymbolsEEC2EPS2_:
  200|   293k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_20DecimalFormatSymbolsEEC2EPS2_:
   82|   293k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerIKNS_20DecimalFormatSymbolsEED2Ev:
  245|   292k|    ~LocalPointer() {
  246|   292k|        delete LocalPointerBase<T>::ptr;
  247|   292k|    }
_ZN6icu_7816LocalPointerBaseIKNS_20DecimalFormatSymbolsEED2Ev:
   88|   292k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_15NumberingSystemEEptEv:
  134|   761k|    T *operator->() const { return ptr; }
_ZNK6icu_7816LocalPointerBaseIKNS_20DecimalFormatSymbolsEE6isNullEv:
   94|   475k|    UBool isNull() const { return ptr==nullptr; }
_ZN6icu_7812LocalPointerIKNS_20DecimalFormatSymbolsEE29adoptInsteadAndCheckErrorCodeEPS2_R10UErrorCode:
  319|   151k|    void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) {
  320|   151k|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (320:12): [True: 151k, False: 0]
  ------------------
  321|   151k|            delete LocalPointerBase<T>::ptr;
  322|   151k|            LocalPointerBase<T>::ptr=p;
  323|   151k|            if(p==nullptr) {
  ------------------
  |  Branch (323:16): [True: 0, False: 151k]
  ------------------
  324|      0|                errorCode=U_MEMORY_ALLOCATION_ERROR;
  325|      0|            }
  326|   151k|        } else {
  327|      0|            delete p;
  328|      0|        }
  329|   151k|    }
_ZN6icu_7816LocalPointerBaseIKNS_20DecimalFormatSymbolsEE6orphanEv:
  141|  48.4k|    T *orphan() {
  142|  48.4k|        T *p=ptr;
  143|  48.4k|        ptr=nullptr;
  144|  48.4k|        return p;
  145|  48.4k|    }
_ZN6icu_7812LocalPointerINS_20DecimalFormatSymbolsEEC2EPS1_R10UErrorCode:
  214|  93.5k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  93.5k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 93.5k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  93.5k|    }
_ZN6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEEC2EPS1_:
   82|   122k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_20DecimalFormatSymbolsEED2Ev:
  245|   122k|    ~LocalPointer() {
  246|   122k|        delete LocalPointerBase<T>::ptr;
  247|   122k|    }
_ZN6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEED2Ev:
   88|   122k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerIKNS_20DecimalFormatSymbolsEE12adoptInsteadEPS2_:
  300|   230k|    void adoptInstead(T *p) {
  301|   230k|        delete LocalPointerBase<T>::ptr;
  302|   230k|        LocalPointerBase<T>::ptr=p;
  303|   230k|    }
_ZN6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEE6orphanEv:
  141|   122k|    T *orphan() {
  142|   122k|        T *p=ptr;
  143|   122k|        ptr=nullptr;
  144|   122k|        return p;
  145|   122k|    }
_ZN6icu_7812LocalPointerINS_13DecimalFormatEEC2EPS1_:
  200|  38.8k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_13DecimalFormatEEC2EPS1_:
   82|  38.8k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_13DecimalFormatEED2Ev:
  245|  38.8k|    ~LocalPointer() {
  246|  38.8k|        delete LocalPointerBase<T>::ptr;
  247|  38.8k|    }
_ZN6icu_7816LocalPointerBaseINS_13DecimalFormatEED2Ev:
   88|  38.8k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_13DecimalFormatEE7isValidEv:
  100|  38.8k|    UBool isValid() const { return ptr!=nullptr; }
_ZNK6icu_7816LocalPointerBaseINS_13DecimalFormatEEptEv:
  134|  9.53k|    T *operator->() const { return ptr; }
_ZN6icu_7816LocalPointerBaseINS_13DecimalFormatEE6orphanEv:
  141|  38.8k|    T *orphan() {
  142|  38.8k|        T *p=ptr;
  143|  38.8k|        ptr=nullptr;
  144|  38.8k|        return p;
  145|  38.8k|    }
_ZNK6icu_7816LocalPointerBaseIKNS_20DecimalFormatSymbolsEE8getAliasEv:
  122|   146k|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerINS_20DecimalFormatSymbolsEEC2EPS1_:
  200|  29.3k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZNK6icu_7816LocalPointerBaseINS_18CurrencyPluralInfoEE8getAliasEv:
  122|   254k|    T *getAlias() const { return ptr; }
_ZNK6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEEptEv:
  134|  9.53k|    T *operator->() const { return ptr; }
_ZN6icu_7816LocalPointerBaseINS_13UnicodeStringEEC2EPS1_:
   82|      2|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseINS_13UnicodeStringEED2Ev:
   88|      2|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_20DecimalFormatSymbolsEE8getAliasEv:
  122|  29.3k|    T *getAlias() const { return ptr; }
_ZN6icu_7812LocalPointerINS_12NumberFormatEEC2EPS1_:
  200|  29.3k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_12NumberFormatEEC2EPS1_:
   82|  29.3k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_12NumberFormatEED2Ev:
  245|  29.3k|    ~LocalPointer() {
  246|  29.3k|        delete LocalPointerBase<T>::ptr;
  247|  29.3k|    }
_ZN6icu_7816LocalPointerBaseINS_12NumberFormatEED2Ev:
   88|  29.3k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_12NumberFormatEEptEv:
  134|  29.3k|    T *operator->() const { return ptr; }
_ZN6icu_7812LocalPointerINS_20DecimalFormatSymbolsEE29adoptInsteadAndCheckErrorCodeEPS1_R10UErrorCode:
  319|  29.3k|    void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) {
  320|  29.3k|        if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (320:12): [True: 29.3k, False: 0]
  ------------------
  321|  29.3k|            delete LocalPointerBase<T>::ptr;
  322|  29.3k|            LocalPointerBase<T>::ptr=p;
  323|  29.3k|            if(p==nullptr) {
  ------------------
  |  Branch (323:16): [True: 0, False: 29.3k]
  ------------------
  324|      0|                errorCode=U_MEMORY_ALLOCATION_ERROR;
  325|      0|            }
  326|  29.3k|        } else {
  327|      0|            delete p;
  328|      0|        }
  329|  29.3k|    }
_ZN6icu_7812LocalPointerINS_12NumberFormatEE12adoptInsteadEPS1_:
  300|  29.3k|    void adoptInstead(T *p) {
  301|  29.3k|        delete LocalPointerBase<T>::ptr;
  302|  29.3k|        LocalPointerBase<T>::ptr=p;
  303|  29.3k|    }
_ZN6icu_7816LocalPointerBaseINS_12NumberFormatEE6orphanEv:
  141|  29.3k|    T *orphan() {
  142|  29.3k|        T *p=ptr;
  143|  29.3k|        ptr=nullptr;
  144|  29.3k|        return p;
  145|  29.3k|    }
_ZN6icu_7812LocalPointerIKNS_10UnicodeSetEEaSEOS3_:
  255|   410k|    LocalPointer<T> &operator=(LocalPointer<T> &&src) noexcept {
  256|   410k|        delete LocalPointerBase<T>::ptr;
  257|   410k|        LocalPointerBase<T>::ptr=src.ptr;
  258|   410k|        src.ptr=nullptr;
  259|   410k|        return *this;
  260|   410k|    }
_ZN6icu_7810LocalArrayIKNS_13UnicodeStringEEaSEOS3_:
  430|   205k|    LocalArray<T> &operator=(LocalArray<T> &&src) noexcept {
  431|   205k|        delete[] LocalPointerBase<T>::ptr;
  432|   205k|        LocalPointerBase<T>::ptr=src.ptr;
  433|   205k|        src.ptr=nullptr;
  434|   205k|        return *this;
  435|   205k|    }
_ZN6icu_7810LocalArrayIKNS_13UnicodeStringEED2Ev:
  420|   410k|    ~LocalArray() {
  421|   410k|        delete[] LocalPointerBase<T>::ptr;
  422|   410k|    }
_ZN6icu_7816LocalPointerBaseIKNS_13UnicodeStringEED2Ev:
   88|   410k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerIKNS_10UnicodeSetEED2Ev:
  245|   821k|    ~LocalPointer() {
  246|   821k|        delete LocalPointerBase<T>::ptr;
  247|   821k|    }
_ZN6icu_7816LocalPointerBaseIKNS_10UnicodeSetEED2Ev:
   88|   821k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerIKNS_10UnicodeSetEEC2EPS2_:
  200|   821k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_10UnicodeSetEEC2EPS2_:
   82|   821k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7810LocalArrayIKNS_13UnicodeStringEEC2EPS2_:
  375|   410k|    explicit LocalArray(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseIKNS_13UnicodeStringEEC2EPS2_:
   82|   410k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_8numparse4impl16NumberParserImplEEC2EPS3_:
  200|   102k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_8numparse4impl16NumberParserImplEEC2EPS3_:
   82|   102k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_8numparse4impl16NumberParserImplEED2Ev:
  245|   102k|    ~LocalPointer() {
  246|   102k|        delete LocalPointerBase<T>::ptr;
  247|   102k|    }
_ZN6icu_7816LocalPointerBaseINS_8numparse4impl16NumberParserImplEED2Ev:
   88|   102k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZNK6icu_7816LocalPointerBaseINS_8numparse4impl16NumberParserImplEEptEv:
  134|  2.20M|    T *operator->() const { return ptr; }
_ZNK6icu_7816LocalPointerBaseINS_8numparse4impl16NumberParserImplEEdeEv:
  128|   102k|    T &operator*() const { return *ptr; }
_ZN6icu_7816LocalPointerBaseINS_8numparse4impl16NumberParserImplEE6orphanEv:
  141|   102k|    T *orphan() {
  142|   102k|        T *p=ptr;
  143|   102k|        ptr=nullptr;
  144|   102k|        return p;
  145|   102k|    }
_ZN6icu_7812LocalPointerINS_15NumberingSystemEEC2EPS1_R10UErrorCode:
  214|   304k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|   304k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 304k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|   304k|    }
_ZN6icu_7816LocalPointerBaseINS_15NumberingSystemEE6orphanEv:
  141|   304k|    T *orphan() {
  142|   304k|        T *p=ptr;
  143|   304k|        ptr=nullptr;
  144|   304k|        return p;
  145|   304k|    }
_ZN6icu_7812LocalPointerINS_13UnicodeStringEED2Ev:
  245|      2|    ~LocalPointer() {
  246|      2|        delete LocalPointerBase<T>::ptr;
  247|      2|    }
_ZN6icu_7816LocalPointerBaseINS_13UnicodeStringEE6orphanEv:
  141|      2|    T *orphan() {
  142|      2|        T *p=ptr;
  143|      2|        ptr=nullptr;
  144|      2|        return p;
  145|      2|    }
_ZN6icu_7812LocalPointerINS_6NFRuleEEC2EPS1_R10UErrorCode:
  214|  19.0k|    LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
  215|  19.0k|        if(p==nullptr && U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (215:12): [True: 0, False: 19.0k]
  |  Branch (215:26): [True: 0, False: 0]
  ------------------
  216|      0|            errorCode=U_MEMORY_ALLOCATION_ERROR;
  217|      0|        }
  218|  19.0k|    }
_ZN6icu_7816LocalPointerBaseINS_6NFRuleEEC2EPS1_:
   82|   400k|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_6NFRuleEED2Ev:
  245|   400k|    ~LocalPointer() {
  246|   400k|        delete LocalPointerBase<T>::ptr;
  247|   400k|    }
_ZN6icu_7816LocalPointerBaseINS_6NFRuleEED2Ev:
   88|   400k|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseINS_6NFRuleEE6orphanEv:
  141|   398k|    T *orphan() {
  142|   398k|        T *p=ptr;
  143|   398k|        ptr=nullptr;
  144|   398k|        return p;
  145|   398k|    }
_ZN6icu_7812LocalPointerINS_10UnicodeSetEEC2EPS1_:
  200|      5|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZN6icu_7816LocalPointerBaseINS_10UnicodeSetEEC2EPS1_:
   82|      6|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7812LocalPointerINS_10UnicodeSetEED2Ev:
  245|      6|    ~LocalPointer() {
  246|      6|        delete LocalPointerBase<T>::ptr;
  247|      6|    }
_ZN6icu_7816LocalPointerBaseINS_10UnicodeSetEED2Ev:
   88|      6|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_6NFRuleEEC2EPS1_:
  200|   381k|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZNK6icu_7816LocalPointerBaseINS_6NFRuleEE6isNullEv:
   94|   381k|    UBool isNull() const { return ptr==nullptr; }
_ZNK6icu_7816LocalPointerBaseINS_6NFRuleEEptEv:
  134|  1.14M|    T *operator->() const { return ptr; }
_ZN6icu_7812LocalPointerINS_6NFRuleEE12adoptInsteadEPS1_:
  300|     42|    void adoptInstead(T *p) {
  301|     42|        delete LocalPointerBase<T>::ptr;
  302|     42|        LocalPointerBase<T>::ptr=p;
  303|     42|    }
_ZN6icu_7812LocalPointerIKNS_10UnicodeSetEE12adoptInsteadEPS2_:
  300|  1.74k|    void adoptInstead(T *p) {
  301|  1.74k|        delete LocalPointerBase<T>::ptr;
  302|  1.74k|        LocalPointerBase<T>::ptr=p;
  303|  1.74k|    }
_ZNK6icu_7816LocalPointerBaseIKNS_13UnicodeStringEE6isNullEv:
   94|  12.7M|    UBool isNull() const { return ptr==nullptr; }
_ZN6icu_788internal16LocalOpenPointerI15UResourceBundleXadL_Z13ures_close_78EEE12adoptInsteadEPS2_:
  595|  34.4k|    void adoptInstead(Type *p) {
  596|  34.4k|        if (ptr != nullptr) { closeFunction(ptr); }
  ------------------
  |  Branch (596:13): [True: 0, False: 34.4k]
  ------------------
  597|  34.4k|        ptr=p;
  598|  34.4k|    }
_ZN6icu_7816LocalPointerBaseIiEC2EPi:
   82|      5|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseIiED2Ev:
   88|      5|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7816LocalPointerBaseIPKcEC2EPS2_:
   82|      5|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZN6icu_7816LocalPointerBaseIPKcED2Ev:
   88|      5|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_788internal16LocalOpenPointerI10UHashtableXadL_Z14uhash_close_78EEEC2EPS2_:
  567|      1|    explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase<Type>(p) {}
_ZN6icu_7816LocalPointerBaseI10UHashtableEC2EPS1_:
   82|      1|    explicit LocalPointerBase(T *p=nullptr) : ptr(p) {}
_ZNK6icu_7816LocalPointerBaseI10UHashtableE8getAliasEv:
  122|    178|    T *getAlias() const { return ptr; }
_ZN6icu_7816LocalPointerBaseI10UHashtableE6orphanEv:
  141|      1|    T *orphan() {
  142|      1|        T *p=ptr;
  143|      1|        ptr=nullptr;
  144|      1|        return p;
  145|      1|    }
_ZN6icu_788internal16LocalOpenPointerI10UHashtableXadL_Z14uhash_close_78EEED2Ev:
  575|      1|    ~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } }
  ------------------
  |  Branch (575:31): [True: 0, False: 1]
  ------------------
_ZN6icu_7816LocalPointerBaseI10UHashtableED2Ev:
   88|      1|    ~LocalPointerBase() { /* delete ptr; */ }
_ZN6icu_7812LocalPointerINS_10UnicodeSetEEC2EPS1_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|    }
_ZNK6icu_7816LocalPointerBaseINS_10UnicodeSetEE8getAliasEv:
  122|      3|    T *getAlias() const { return ptr; }
_ZN6icu_7816LocalPointerBaseINS_10UnicodeSetEE6orphanEv:
  141|      6|    T *orphan() {
  142|      6|        T *p=ptr;
  143|      6|        ptr=nullptr;
  144|      6|        return p;
  145|      6|    }
_ZNK6icu_7816LocalPointerBaseINS_10UnicodeSetEEptEv:
  134|     17|    T *operator->() const { return ptr; }
_ZN6icu_7812LocalPointerINS_13UnicodeStringEEC2EPS1_:
  200|      2|    explicit LocalPointer(T *p=nullptr) : LocalPointerBase<T>(p) {}
_ZNK6icu_7816LocalPointerBaseINS_13UnicodeStringEE6isNullEv:
   94|      2|    UBool isNull() const { return ptr==nullptr; }
_ZNK6icu_7816LocalPointerBaseINS_10UnicodeSetEE6isNullEv:
   94|      5|    UBool isNull() const { return ptr==nullptr; }

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

_ZNK6icu_7814MessagePattern16getPatternStringEv:
  561|  20.1k|    const UnicodeString &getPatternString() const {
  562|  20.1k|        return msg;
  563|  20.1k|    }
_ZNK6icu_7814MessagePattern10countPartsEv:
  616|    450|    int32_t countParts() const {
  617|    450|        return partsLength;
  618|    450|    }
_ZNK6icu_7814MessagePattern7getPartEi:
  626|   105k|    const Part &getPart(int32_t i) const {
  627|   105k|        return parts[i];
  628|   105k|    }
_ZNK6icu_7814MessagePattern11getPartTypeEi:
  637|  20.1k|    UMessagePatternPartType getPartType(int32_t i) const {
  638|  20.1k|        return getPart(i).type;
  639|  20.1k|    }
_ZNK6icu_7814MessagePattern17getLimitPartIndexEi:
  698|  20.1k|    int32_t getLimitPartIndex(int32_t start) const {
  699|  20.1k|        int32_t limit=getPart(start).limitPartIndex;
  700|  20.1k|        if(limit<start) {
  ------------------
  |  Branch (700:12): [True: 0, False: 20.1k]
  ------------------
  701|      0|            return start;
  702|      0|        }
  703|  20.1k|        return limit;
  704|  20.1k|    }
_ZN6icu_7814MessagePattern4PartC2Ev:
  719|   304k|        Part() {}
_ZNK6icu_7814MessagePattern4Part7getTypeEv:
  726|  4.91k|        UMessagePatternPartType getType() const {
  727|  4.91k|            return type;
  728|  4.91k|        }
_ZNK6icu_7814MessagePattern4Part8getIndexEv:
  735|  20.1k|        int32_t getIndex() const {
  736|  20.1k|            return index;
  737|  20.1k|        }
_ZNK6icu_7814MessagePattern4Part8getLimitEv:
  755|  20.1k|        int32_t getLimit() const {
  756|  20.1k|            return index+length;
  757|  20.1k|        }
_ZN6icu_7814MessagePattern14parseArgNumberEii:
  865|  2.75k|    int32_t parseArgNumber(int32_t start, int32_t limit) {
  866|  2.75k|        return parseArgNumber(msg, start, limit);
  867|  2.75k|    }

_ZN6icu_7813ParsePositionC2Ev:
   59|  59.1M|        : UObject(),
   60|  59.1M|        index(0),
   61|  59.1M|        errorIndex(-1)
   62|  59.1M|      {}
_ZN6icu_7813ParsePositionC2Ei:
   70|  76.9k|        : UObject(),
   71|  76.9k|        index(newIndex),
   72|  76.9k|        errorIndex(-1)
   73|  76.9k|      {}
_ZN6icu_7813ParsePositionC2ERKS0_:
   81|  6.03M|        : UObject(copy),
   82|  6.03M|        index(copy.index),
   83|  6.03M|        errorIndex(copy.errorIndex)
   84|  6.03M|      {}
_ZN6icu_7813ParsePositionaSERKS0_:
  189|  13.4M|{
  190|  13.4M|  index = copy.index;
  191|  13.4M|  errorIndex = copy.errorIndex;
  192|  13.4M|  return *this;
  193|  13.4M|}
_ZNK6icu_7813ParsePosition8getIndexEv:
  212|  1.25G|{
  213|  1.25G|  return index;
  214|  1.25G|}
_ZN6icu_7813ParsePosition8setIndexEi:
  218|  75.1M|{
  219|  75.1M|  this->index = offset;
  220|  75.1M|}
_ZNK6icu_7813ParsePosition13getErrorIndexEv:
  224|  80.7M|{
  225|  80.7M|  return errorIndex;
  226|  80.7M|}
_ZN6icu_7813ParsePosition13setErrorIndexEi:
  230|  50.9M|{
  231|  50.9M|  this->errorIndex = ei;
  232|  50.9M|}

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

_ZN6icu_7811StringPieceC2Ev:
   71|      1|  StringPiece() : ptr_(nullptr), length_(0) { }
_ZNK6icu_7811StringPiececvNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEEEv:
  185|  1.64k|  inline operator std::string_view() const {
  186|  1.64k|    return {data(), static_cast<std::string_view::size_type>(size())};
  187|  1.64k|  }
_ZNK6icu_7811StringPiece4dataEv:
  200|  29.7M|  const char* data() const { return ptr_; }
_ZNK6icu_7811StringPiece4sizeEv:
  206|  1.64k|  int32_t size() const { return length_; }
_ZNK6icu_7811StringPiece6lengthEv:
  212|  31.9M|  int32_t length() const { return length_; }

_ZN6icu_7810UnicodeSet10setPatternERKNS_13UnicodeStringE:
 1830|     19|    void setPattern(const UnicodeString& newPat) {
 1831|     19|        setPattern(newPat.getBuffer(), newPat.length());
 1832|     19|    }
_ZNK6icu_7810UnicodeSet8isFrozenEv:
 1848|  21.7k|inline UBool UnicodeSet::isFrozen() const {
 1849|  21.7k|    return bmpSet != nullptr || stringSpan != nullptr;
  ------------------
  |  Branch (1849:12): [True: 4, False: 21.7k]
  |  Branch (1849:33): [True: 0, False: 21.7k]
  ------------------
 1850|  21.7k|}
_ZNK6icu_7810UnicodeSet7isBogusEv:
 1864|  21.6k|inline UBool UnicodeSet::isBogus() const {
 1865|  21.6k|    return fFlags & kIsBogus;
 1866|  21.6k|}
_ZN6icu_7810UnicodeSet8fromUSetEPK4USet:
 1872|      3|inline const UnicodeSet *UnicodeSet::fromUSet(const USet *uset) {
 1873|      3|    return reinterpret_cast<const UnicodeSet *>(uset);
 1874|      3|}
_ZNK6icu_7810UnicodeSet6toUSetEv:
 1880|      3|inline const USet *UnicodeSet::toUSet() const {
 1881|      3|    return reinterpret_cast<const USet *>(this);
 1882|      3|}

_ZNK6icu_7813UnicodeString8doEqualsERKS0_i:
 3773|  1.06M|  inline UBool doEquals(const UnicodeString &text, int32_t len) const {
 3774|  1.06M|    return doEquals(text.getArrayStart(), len);
 3775|  1.06M|  }
_ZNK6icu_7813UnicodeString8pinIndexERi:
 4138|  21.5M|{
 4139|       |  // pin index
 4140|  21.5M|  if(start < 0) {
  ------------------
  |  Branch (4140:6): [True: 0, False: 21.5M]
  ------------------
 4141|      0|    start = 0;
 4142|  21.5M|  } else if(start > length()) {
  ------------------
  |  Branch (4142:13): [True: 0, False: 21.5M]
  ------------------
 4143|      0|    start = length();
 4144|      0|  }
 4145|  21.5M|}
_ZNK6icu_7813UnicodeString10pinIndicesERiS1_:
 4150|   134M|{
 4151|       |  // pin indices
 4152|   134M|  int32_t len = length();
 4153|   134M|  if(start < 0) {
  ------------------
  |  Branch (4153:6): [True: 2.84k, False: 134M]
  ------------------
 4154|  2.84k|    start = 0;
 4155|   134M|  } else if(start > len) {
  ------------------
  |  Branch (4155:13): [True: 45, False: 134M]
  ------------------
 4156|     45|    start = len;
 4157|     45|  }
 4158|   134M|  if(_length < 0) {
  ------------------
  |  Branch (4158:6): [True: 132, False: 134M]
  ------------------
 4159|    132|    _length = 0;
 4160|   134M|  } else if(_length > (len - start)) {
  ------------------
  |  Branch (4160:13): [True: 2.22M, False: 132M]
  ------------------
 4161|  2.22M|    _length = (len - start);
 4162|  2.22M|  }
 4163|   134M|}
_ZN6icu_7813UnicodeString13getArrayStartEv:
 4166|   155M|UnicodeString::getArrayStart() {
 4167|   155M|  return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ?
  ------------------
  |  Branch (4167:10): [True: 41.9M, False: 113M]
  ------------------
 4168|   113M|    fUnion.fStackFields.fBuffer : fUnion.fFields.fArray;
 4169|   155M|}
_ZNK6icu_7813UnicodeString13getArrayStartEv:
 4172|   820M|UnicodeString::getArrayStart() const {
 4173|   820M|  return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ?
  ------------------
  |  Branch (4173:10): [True: 141M, False: 679M]
  ------------------
 4174|   679M|    fUnion.fStackFields.fBuffer : fUnion.fFields.fArray;
 4175|   820M|}
_ZNK6icu_7813UnicodeString14hasShortLengthEv:
 4202|  3.06G|UnicodeString::hasShortLength() const {
 4203|  3.06G|  return fUnion.fFields.fLengthAndFlags>=0;
 4204|  3.06G|}
_ZNK6icu_7813UnicodeString14getShortLengthEv:
 4207|  1.12G|UnicodeString::getShortLength() const {
 4208|       |  // fLengthAndFlags must be non-negative -> short length >= 0
 4209|       |  // and arithmetic or logical shift does not matter.
 4210|  1.12G|  return fUnion.fFields.fLengthAndFlags>>kLengthShift;
 4211|  1.12G|}
_ZNK6icu_7813UnicodeString6lengthEv:
 4214|  3.03G|UnicodeString::length() const {
 4215|  3.03G|  return hasShortLength() ? getShortLength() : fUnion.fFields.fLength;
  ------------------
  |  Branch (4215:10): [True: 1.08G, False: 1.95G]
  ------------------
 4216|  3.03G|}
_ZNK6icu_7813UnicodeString11getCapacityEv:
 4219|   146M|UnicodeString::getCapacity() const {
 4220|   146M|  return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ?
  ------------------
  |  Branch (4220:10): [True: 42.7M, False: 104M]
  ------------------
 4221|   104M|    US_STACKBUF_SIZE : fUnion.fFields.fCapacity;
 4222|   146M|}
_ZNK6icu_7813UnicodeString7isBogusEv:
 4230|   302M|{ return fUnion.fFields.fLengthAndFlags & kIsBogus; }
_ZNK6icu_7813UnicodeString10isWritableEv:
 4234|   272M|{ return !(fUnion.fFields.fLengthAndFlags & (kOpenGetBuffer | kIsBogus)); }
_ZNK6icu_7813UnicodeString16isBufferWritableEv:
 4238|   131M|{
 4239|   131M|  return
 4240|   131M|      !(fUnion.fFields.fLengthAndFlags&(kOpenGetBuffer|kIsBogus|kBufferIsReadonly)) &&
  ------------------
  |  Branch (4240:7): [True: 130M, False: 161k]
  ------------------
 4241|   131M|      (!(fUnion.fFields.fLengthAndFlags&kRefCounted) || refCount()==1);
  ------------------
  |  Branch (4241:8): [True: 34.5M, False: 96.3M]
  |  Branch (4241:57): [True: 95.7M, False: 563k]
  ------------------
 4242|   131M|}
_ZNK6icu_7813UnicodeString9getBufferEv:
 4245|   979k|UnicodeString::getBuffer() const {
 4246|   979k|  if(fUnion.fFields.fLengthAndFlags&(kIsBogus|kOpenGetBuffer)) {
  ------------------
  |  Branch (4246:6): [True: 0, False: 979k]
  ------------------
 4247|      0|    return nullptr;
 4248|   979k|  } else if(fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) {
  ------------------
  |  Branch (4248:13): [True: 815k, False: 163k]
  ------------------
 4249|   815k|    return fUnion.fStackFields.fBuffer;
 4250|   815k|  } else {
 4251|   163k|    return fUnion.fFields.fArray;
 4252|   163k|  }
 4253|   979k|}
_ZNK6icu_7813UnicodeString9doCompareEiiRKS0_ii:
 4264|  19.9k|{
 4265|  19.9k|  if(srcText.isBogus()) {
  ------------------
  |  Branch (4265:6): [True: 0, False: 19.9k]
  ------------------
 4266|      0|    return static_cast<int8_t>(!isBogus()); // 0 if both are bogus, 1 otherwise
 4267|  19.9k|  } else {
 4268|  19.9k|    srcText.pinIndices(srcStart, srcLength);
 4269|  19.9k|    return doCompare(start, thisLength, srcText.getArrayStart(), srcStart, srcLength);
 4270|  19.9k|  }
 4271|  19.9k|}
_ZNK6icu_7813UnicodeString17doEqualsSubstringEiiRKS0_ii:
 4279|  2.74M|{
 4280|  2.74M|  if(srcText.isBogus()) {
  ------------------
  |  Branch (4280:6): [True: 0, False: 2.74M]
  ------------------
 4281|      0|    return isBogus();
 4282|  2.74M|  } else {
 4283|  2.74M|    srcText.pinIndices(srcStart, srcLength);
 4284|  2.74M|    return !isBogus() && doEqualsSubstring(start, thisLength, srcText.getArrayStart(), srcStart, srcLength);
  ------------------
  |  Branch (4284:12): [True: 2.74M, False: 0]
  |  Branch (4284:26): [True: 1.95M, False: 789k]
  ------------------
 4285|  2.74M|  }
 4286|  2.74M|}
_ZNK6icu_7813UnicodeStringeqERKS0_:
 4290|  10.4M|{
 4291|  10.4M|  if(isBogus()) {
  ------------------
  |  Branch (4291:6): [True: 505k, False: 9.95M]
  ------------------
 4292|   505k|    return text.isBogus();
 4293|  9.95M|  } else {
 4294|  9.95M|    int32_t len = length(), textLength = text.length();
 4295|  9.95M|    return !text.isBogus() && len == textLength && doEquals(text, len);
  ------------------
  |  Branch (4295:12): [True: 1.37M, False: 8.58M]
  |  Branch (4295:31): [True: 1.06M, False: 313k]
  |  Branch (4295:52): [True: 1.05M, False: 5.43k]
  ------------------
 4296|  9.95M|  }
 4297|  10.4M|}
_ZNK6icu_7813UnicodeStringneERKS0_:
 4301|  1.02M|{ return (! operator==(text)); }
_ZNK6icu_7813UnicodeString7compareERKS0_:
 4321|      1|{ return doCompare(0, length(), text, 0, text.length()); }
_ZNK6icu_7813UnicodeString7compareENS_14ConstChar16PtrEi:
 4332|   171k|{ return doCompare(0, length(), srcChars, 0, srcLength); }
_ZNK6icu_7813UnicodeString7compareEiiRKS0_ii:
 4340|  19.9k|{ return doCompare(start, _length, srcText, srcStart, srcLength); }
_ZNK6icu_7813UnicodeString7indexOfERKS0_iiii:
 4506|  19.2M|{
 4507|  19.2M|  if(!srcText.isBogus()) {
  ------------------
  |  Branch (4507:6): [True: 19.2M, False: 0]
  ------------------
 4508|  19.2M|    srcText.pinIndices(srcStart, srcLength);
 4509|  19.2M|    if(srcLength > 0) {
  ------------------
  |  Branch (4509:8): [True: 19.2M, False: 0]
  ------------------
 4510|  19.2M|      return indexOf(srcText.getArrayStart(), srcStart, srcLength, start, _length);
 4511|  19.2M|    }
 4512|  19.2M|  }
 4513|      0|  return -1;
 4514|  19.2M|}
_ZNK6icu_7813UnicodeString7indexOfERKS0_i:
 4522|  19.2M|               int32_t start) const {
 4523|  19.2M|  pinIndex(start);
 4524|  19.2M|  return indexOf(text, 0, text.length(), start, length() - start);
 4525|  19.2M|}
_ZNK6icu_7813UnicodeString7indexOfEPKDsii:
 4536|   757k|               int32_t start) const {
 4537|   757k|  pinIndex(start);
 4538|   757k|  return indexOf(srcChars, 0, srcLength, start, length() - start);
 4539|   757k|}
_ZNK6icu_7813UnicodeString7indexOfEDs:
 4562|  6.08M|{ return doIndexOf(c, 0, length()); }
_ZNK6icu_7813UnicodeString7indexOfEDsi:
 4570|  1.51M|               int32_t start) const {
 4571|  1.51M|  pinIndex(start);
 4572|  1.51M|  return doIndexOf(c, start, length() - start);
 4573|  1.51M|}
_ZNK6icu_7813UnicodeString10startsWithERKS0_:
 4668|  2.74M|{ return doEqualsSubstring(0, text.length(), text, 0, text.length()); }
_ZNK6icu_7813UnicodeString8endsWithENS_14ConstChar16PtrEi:
 4708|  13.7k|            int32_t srcLength) const {
 4709|  13.7k|  if(srcLength < 0) {
  ------------------
  |  Branch (4709:6): [True: 0, False: 13.7k]
  ------------------
 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|  13.7k|  return doEqualsSubstring(length() - srcLength, srcLength, srcChars, 0, srcLength);
 4713|  13.7k|}
_ZN6icu_7813UnicodeString7replaceEiiRKS0_ii:
 4741|     20|{ return doReplace(start, _length, srcText, srcStart, srcLength); }
_ZNK6icu_7813UnicodeString9doExtractEiiRS0_:
 4799|     20|{ target.replace(0, target.length(), *this, start, _length); }
_ZNK6icu_7813UnicodeString7extractEiiRS0_:
 4812|     15|{ doExtract(start, _length, target); }
_ZNK6icu_7813UnicodeString8doCharAtEi:
 4846|   312M|{
 4847|   312M|  if (static_cast<uint32_t>(offset) < static_cast<uint32_t>(length())) {
  ------------------
  |  Branch (4847:7): [True: 312M, False: 14.3k]
  ------------------
 4848|   312M|    return getArrayStart()[offset];
 4849|   312M|  } else {
 4850|  14.3k|    return kInvalidUChar;
 4851|  14.3k|  }
 4852|   312M|}
_ZNK6icu_7813UnicodeString6charAtEi:
 4856|   312M|{ return doCharAt(offset); }
_ZNK6icu_7813UnicodeString7isEmptyEv:
 4863|  50.5M|UnicodeString::isEmpty() const {
 4864|       |  // Arithmetic or logical right shift does not matter: only testing for 0.
 4865|  50.5M|  return (fUnion.fFields.fLengthAndFlags>>kLengthShift) == 0;
 4866|  50.5M|}
_ZN6icu_7813UnicodeString13setZeroLengthEv:
 4872|  1.42M|UnicodeString::setZeroLength() {
 4873|  1.42M|  fUnion.fFields.fLengthAndFlags &= kAllStorageFlags;
 4874|  1.42M|}
_ZN6icu_7813UnicodeString14setShortLengthEi:
 4877|  68.2M|UnicodeString::setShortLength(int32_t len) {
 4878|       |  // requires 0 <= len <= kMaxShortLength
 4879|  68.2M|  fUnion.fFields.fLengthAndFlags =
 4880|  68.2M|    static_cast<int16_t>((fUnion.fFields.fLengthAndFlags & kAllStorageFlags) | (len << kLengthShift));
 4881|  68.2M|}
_ZN6icu_7813UnicodeString9setLengthEi:
 4884|   155M|UnicodeString::setLength(int32_t len) {
 4885|   155M|  if(len <= kMaxShortLength) {
  ------------------
  |  Branch (4885:6): [True: 68.1M, False: 87.2M]
  ------------------
 4886|  68.1M|    setShortLength(len);
 4887|  87.2M|  } else {
 4888|  87.2M|    fUnion.fFields.fLengthAndFlags |= kLengthIsLarge;
 4889|  87.2M|    fUnion.fFields.fLength = len;
 4890|  87.2M|  }
 4891|   155M|}
_ZN6icu_7813UnicodeString10setToEmptyEv:
 4894|  1.38M|UnicodeString::setToEmpty() {
 4895|  1.38M|  fUnion.fFields.fLengthAndFlags = kShortString;
 4896|  1.38M|}
_ZN6icu_7813UnicodeString8setArrayEPDsii:
 4899|  13.2M|UnicodeString::setArray(char16_t *array, int32_t len, int32_t capacity) {
 4900|  13.2M|  setLength(len);
 4901|  13.2M|  fUnion.fFields.fArray = array;
 4902|  13.2M|  fUnion.fFields.fCapacity = capacity;
 4903|  13.2M|}
_ZN6icu_7813UnicodeStringaSEDs:
 4907|  3.93M|{ return doReplace(0, length(), &ch, 0, 1); }
_ZN6icu_7813UnicodeString5setToERKS0_ii:
 4917|  73.1M|{
 4918|  73.1M|  unBogus();
 4919|  73.1M|  return doReplace(0, length(), srcText, srcStart, srcLength);
 4920|  73.1M|}
_ZN6icu_7813UnicodeString5setToERKS0_i:
 4925|  8.19k|{
 4926|  8.19k|  unBogus();
 4927|  8.19k|  srcText.pinIndex(srcStart);
 4928|  8.19k|  return doReplace(0, length(), srcText, srcStart, srcText.length() - srcStart);
 4929|  8.19k|}
_ZN6icu_7813UnicodeString5setToERKS0_:
 4933|   322k|{
 4934|   322k|  return copyFrom(srcText);
 4935|   322k|}
_ZN6icu_7813UnicodeString5setToEPKDsi:
 4940|   265k|{
 4941|   265k|  unBogus();
 4942|   265k|  return doReplace(0, length(), srcChars, 0, srcLength);
 4943|   265k|}
_ZN6icu_7813UnicodeString5setToEi:
 4954|  1.51M|{
 4955|  1.51M|  unBogus();
 4956|  1.51M|  return replace(0, length(), srcChar);
 4957|  1.51M|}
_ZN6icu_7813UnicodeString6appendERKS0_ii:
 4963|   683k|{ return doAppend(srcText, srcStart, srcLength); }
_ZN6icu_7813UnicodeString6appendERKS0_:
 4967|   472k|{ return doAppend(srcText, 0, srcText.length()); }
_ZN6icu_7813UnicodeString6appendENS_14ConstChar16PtrEi:
 4978|     21|{ return doAppend(srcChars, 0, srcLength); }
_ZN6icu_7813UnicodeString6appendEDs:
 4982|  67.6M|{ return doAppend(&srcChar, 0, 1); }
_ZN6icu_7813UnicodeString6insertEii:
 5030|   895k|{ return replace(start, 0, srcChar); }
_ZN6icu_7813UnicodeString6removeEv:
 5035|   713k|{
 5036|       |  // remove() of a bogus string makes the string empty and non-bogus
 5037|   713k|  if(isBogus()) {
  ------------------
  |  Branch (5037:6): [True: 0, False: 713k]
  ------------------
 5038|      0|    setToEmpty();
 5039|   713k|  } else {
 5040|   713k|    setZeroLength();
 5041|   713k|  }
 5042|   713k|  return *this;
 5043|   713k|}
_ZN6icu_7813UnicodeString6removeEii:
 5048|  2.20M|{
 5049|  2.20M|    if(start <= 0 && _length == INT32_MAX) {
  ------------------
  |  Branch (5049:8): [True: 2.08M, False: 124k]
  |  Branch (5049:22): [True: 0, False: 2.08M]
  ------------------
 5050|       |        // remove(guaranteed everything) of a bogus string makes the string empty and non-bogus
 5051|      0|        return remove();
 5052|      0|    }
 5053|  2.20M|    return doReplace(start, _length, nullptr, 0, 0);
 5054|  2.20M|}
_ZN6icu_7813UnicodeString13removeBetweenEii:
 5059|   183k|{ return doReplace(start, limit - start, nullptr, 0, 0); }
_ZN6icu_7813UnicodeString8truncateEi:
 5069|      2|{
 5070|      2|  if(isBogus() && targetLength == 0) {
  ------------------
  |  Branch (5070:6): [True: 0, False: 2]
  |  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|      2|  } else if (static_cast<uint32_t>(targetLength) < static_cast<uint32_t>(length())) {
  ------------------
  |  Branch (5074:14): [True: 1, False: 1]
  ------------------
 5075|      1|    setLength(targetLength);
 5076|      1|    return true;
 5077|      1|  } else {
 5078|      1|    return false;
 5079|      1|  }
 5080|      2|}
_ZN6icu_7813UnicodeStringC2Ev:
 4182|   171M|UnicodeString::UnicodeString() {
 4183|   171M|  fUnion.fStackFields.fLengthAndFlags=kShortString;
 4184|   171M|}
_ZN6icu_7813UnicodeString6appendIA12_DsvEERS0_RKT_:
 2300|      2|  inline UnicodeString& append(const S &src) {
 2301|      2|    return doAppend(internal::toU16StringView(src));
 2302|      2|  }
_ZN6icu_7813UnicodeStringC2IA4_DsvEERKT_:
 3274|      1|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      1|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      1|    doAppend(internal::toU16StringViewNullable(text));
 3277|      1|  }
_ZN6icu_7813UnicodeStringaSIA1_DsvEERS0_RKT_:
 1960|  38.5k|  inline UnicodeString &operator=(const S &src) {
 1961|  38.5k|    unBogus();
 1962|  38.5k|    return doReplace(0, length(), internal::toU16StringView(src));
 1963|  38.5k|  }
_ZN6icu_7813UnicodeStringC2IA2_DsvEERKT_:
 3274|   246k|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|   246k|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|   246k|    doAppend(internal::toU16StringViewNullable(text));
 3277|   246k|  }
_ZN6icu_7813UnicodeStringC2IA1_DsvEERKT_:
 3274|  19.2k|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|  19.2k|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|  19.2k|    doAppend(internal::toU16StringViewNullable(text));
 3277|  19.2k|  }
_ZN6icu_7813UnicodeStringC2IA10_DsvEERKT_:
 3274|      1|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      1|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      1|    doAppend(internal::toU16StringViewNullable(text));
 3277|      1|  }
_ZN6icu_7813UnicodeStringC2IA55_DsvEERKT_:
 3274|      1|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      1|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      1|    doAppend(internal::toU16StringViewNullable(text));
 3277|      1|  }
_ZN6icu_7813UnicodeStringC2IA19_DsvEERKT_:
 3274|      1|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      1|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      1|    doAppend(internal::toU16StringViewNullable(text));
 3277|      1|  }
_ZN6icu_7813UnicodeStringC2IA48_DsvEERKT_:
 3274|      1|  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
 3275|      1|    fUnion.fFields.fLengthAndFlags = kShortString;
 3276|      1|    doAppend(internal::toU16StringViewNullable(text));
 3277|      1|  }

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

_ZN6icu_7828ures_getUnicodeStringByIndexEPK15UResourceBundleiP10UErrorCode:
  860|  3.42k|ures_getUnicodeStringByIndex(const UResourceBundle *resB, int32_t indexS, UErrorCode* status) {
  861|  3.42k|    UnicodeString result;
  862|  3.42k|    int32_t len = 0;
  863|  3.42k|    const char16_t* r = ConstChar16Ptr(ures_getStringByIndex(resB, indexS, &len, status));
  ------------------
  |  | 1676|  3.42k|#define ures_getStringByIndex U_ICU_ENTRY_POINT_RENAME(ures_getStringByIndex)
  |  |  ------------------
  |  |  |  |  123|  3.42k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.42k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.42k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  864|  3.42k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (864:8): [True: 3.42k, False: 0]
  ------------------
  865|  3.42k|        result.setTo(true, r, len);
  866|  3.42k|    } else {
  867|      0|        result.setToBogus();
  868|      0|    }
  869|  3.42k|    return result;
  870|  3.42k|}
_ZN6icu_7826ures_getUnicodeStringByKeyEPK15UResourceBundlePKcP10UErrorCode:
  883|   152k|ures_getUnicodeStringByKey(const UResourceBundle *resB, const char* key, UErrorCode* status) {
  884|   152k|    UnicodeString result;
  885|   152k|    int32_t len = 0;
  886|   152k|    const char16_t* r = ConstChar16Ptr(ures_getStringByKey(resB, key, &len, status));
  ------------------
  |  | 1677|   152k|#define ures_getStringByKey U_ICU_ENTRY_POINT_RENAME(ures_getStringByKey)
  |  |  ------------------
  |  |  |  |  123|   152k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   152k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   152k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  887|   152k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (887:8): [True: 152k, False: 0]
  ------------------
  888|   152k|        result.setTo(true, r, len);
  889|   152k|    } else {
  890|      0|        result.setToBogus();
  891|      0|    }
  892|   152k|    return result;
  893|   152k|}

number_format_fuzzer.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  85.7k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
compactdecimalformat.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  19.0k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
dcfmtsym.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  3.70M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
dcfmtsym.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   573k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
decimfmt.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  23.0M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
decimfmt.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   274k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
fmtable.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  3.75M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
measunit.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  5.12k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_affixutils.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   211M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_decimfmtprops.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   292k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_longnames.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   152k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
number_patternstring.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  46.1M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_utils.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   117k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
numfmt.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   471k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
numfmt.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  48.4k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
numparse_impl.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  11.8M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
numsys.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   913k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
rbnf.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  38.1k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
rbnf.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  28.6k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
currunit.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  83.6k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
nfrs.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   199k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
nfrule.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  8.38M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
nfsubs.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  83.9k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
number_currencysymbols.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   118k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
numparse_affixes.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  66.8M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
bytesinkutil.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  8.67M|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
charstr.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  62.9M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
charstr.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  19.0k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
locavailable.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  2.66k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
locbased.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   879k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
locid.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  29.0k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
locid.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  3.48k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
loclikely.cpp:_ZL9U_FAILURE10UErrorCode:
  737|   269k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
loclikely.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   809k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
messagepattern.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  9.45M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
static_unicode_sets.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  6.91M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uarrsort.cpp:_ZL9U_FAILURE10UErrorCode:
  737|    717|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uchar.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      2|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ucurr.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  3.57M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ucurr.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  2.13M|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
udata.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  10.3k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
udata.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  3.19k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
udatamem.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  1.32k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uhash.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  5.73k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uloc.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  29.1M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
unifiedcache.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  30.1k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
unifiedcache.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|    760|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uniset.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      4|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uniset_props.cpp:_ZL9U_FAILURE10UErrorCode:
  737|    267|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uniset_props.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|     10|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
unisetspan.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|      4|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uresbund.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  38.5M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uresbund.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|  7.11M|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
uresdata.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  3.43M|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ustring.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|   435k|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
ustrtrns.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      4|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uvector.cpp:_ZL9U_FAILURE10UErrorCode:
  737|  1.43k|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
uvector.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|    717|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
characterproperties.cpp:_ZL9U_FAILURE10UErrorCode:
  737|     23|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
characterproperties.cpp:_ZL9U_SUCCESS10UErrorCode:
  731|      3|    inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; }
ruleiter.cpp:_ZL9U_FAILURE10UErrorCode:
  737|    312|    inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; }
ubidi_props.cpp:_ZL9U_FAILURE10UErrorCode:
  737|      1|    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|  11.0k|ucache_hashKeys(const UHashTok key) {
   50|  11.0k|    const CacheKeyBase* ckey = static_cast<const CacheKeyBase*>(key.pointer);
   51|  11.0k|    return ckey->hashCode();
   52|  11.0k|}
_ZN6icu_7818ucache_compareKeysE8UElementS0_:
   55|  9.53k|ucache_compareKeys(const UHashTok key1, const UHashTok key2) {
   56|  9.53k|    const CacheKeyBase* p1 = static_cast<const CacheKeyBase*>(key1.pointer);
   57|  9.53k|    const CacheKeyBase* p2 = static_cast<const CacheKeyBase*>(key2.pointer);
   58|  9.53k|    return *p1 == *p2;
   59|  9.53k|}
_ZN6icu_7812CacheKeyBaseD2Ev:
   67|  9.53k|CacheKeyBase::~CacheKeyBase() {
   68|  9.53k|}
_ZN6icu_7812UnifiedCache11getInstanceER10UErrorCode:
   88|  9.53k|UnifiedCache *UnifiedCache::getInstance(UErrorCode &status) {
   89|  9.53k|    umtx_initOnce(gCacheInitOnce, &cacheInit, status);
   90|  9.53k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (90:9): [True: 0, False: 9.53k]
  ------------------
   91|      0|        return nullptr;
   92|      0|    }
   93|  9.53k|    U_ASSERT(gCache != nullptr);
  ------------------
  |  |   35|  9.53k|#   define U_ASSERT(exp) (void)0
  ------------------
   94|  9.53k|    return gCache;
   95|  9.53k|}
_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|  9.53k|void UnifiedCache::handleUnreferencedObject() const {
  168|  9.53k|    std::lock_guard<std::mutex> lock(*gCacheMutex);
  169|  9.53k|    --fNumValuesInUse;
  170|  9.53k|    _runEvictionSlice();
  171|  9.53k|}
_ZNK6icu_7812UnifiedCache27_computeCountOfItemsToEvictEv:
  266|  10.2k|int32_t UnifiedCache::_computeCountOfItemsToEvict() const {
  267|  10.2k|    int32_t totalItems = uhash_count(fHashtable);
  ------------------
  |  | 1001|  10.2k|#define uhash_count U_ICU_ENTRY_POINT_RENAME(uhash_count)
  |  |  ------------------
  |  |  |  |  123|  10.2k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  10.2k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  10.2k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  268|  10.2k|    int32_t evictableItems = totalItems - fNumValuesInUse;
  269|       |
  270|  10.2k|    int32_t unusedLimitByPercentage = fNumValuesInUse * fMaxPercentageOfInUse / 100;
  271|  10.2k|    int32_t unusedLimit = std::max(unusedLimitByPercentage, fMaxUnused);
  272|  10.2k|    int32_t countOfItemsToEvict = std::max<int32_t>(0, evictableItems - unusedLimit);
  273|  10.2k|    return countOfItemsToEvict;
  274|  10.2k|}
_ZNK6icu_7812UnifiedCache17_runEvictionSliceEv:
  276|  10.2k|void UnifiedCache::_runEvictionSlice() const {
  277|  10.2k|    int32_t maxItemsToEvict = _computeCountOfItemsToEvict();
  278|  10.2k|    if (maxItemsToEvict <= 0) {
  ------------------
  |  Branch (278:9): [True: 10.2k, False: 0]
  ------------------
  279|  10.2k|        return;
  280|  10.2k|    }
  281|      0|    for (int32_t i = 0; i < MAX_EVICT_ITERATIONS; ++i) {
  ------------------
  |  Branch (281:25): [True: 0, False: 0]
  ------------------
  282|      0|        const UHashElement *element = _nextElement();
  283|      0|        if (element == nullptr) {
  ------------------
  |  Branch (283:13): [True: 0, False: 0]
  ------------------
  284|      0|            break;
  285|      0|        }
  286|      0|        if (_isEvictable(element)) {
  ------------------
  |  Branch (286:13): [True: 0, False: 0]
  ------------------
  287|      0|            const SharedObject *sharedObject =
  288|      0|                    static_cast<const SharedObject*>(element->value.pointer);
  289|      0|            uhash_removeElement(fHashtable, element);
  ------------------
  |  | 1037|      0|#define uhash_removeElement U_ICU_ENTRY_POINT_RENAME(uhash_removeElement)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  290|      0|            removeSoftRef(sharedObject);   // Deletes sharedObject when SoftRefCount goes to zero.
  291|      0|            ++fAutoEvictedCount;
  292|      0|            if (--maxItemsToEvict == 0) {
  ------------------
  |  Branch (292:17): [True: 0, False: 0]
  ------------------
  293|      0|                break;
  294|      0|            }
  295|      0|        }
  296|      0|    }
  297|      0|}
_ZNK6icu_7812UnifiedCache7_putNewERKNS_12CacheKeyBaseEPKNS_12SharedObjectE10UErrorCodeRS7_:
  303|    760|        UErrorCode &status) const {
  304|    760|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (304:9): [True: 0, False: 760]
  ------------------
  305|      0|        return;
  306|      0|    }
  307|    760|    CacheKeyBase *keyToAdopt = key.clone();
  308|    760|    if (keyToAdopt == nullptr) {
  ------------------
  |  Branch (308:9): [True: 0, False: 760]
  ------------------
  309|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  310|      0|        return;
  311|      0|    }
  312|    760|    keyToAdopt->fCreationStatus = creationStatus;
  313|    760|    if (value->softRefCount == 0) {
  ------------------
  |  Branch (313:9): [True: 0, False: 760]
  ------------------
  314|      0|        _registerPrimary(keyToAdopt, value);
  315|      0|    }
  316|    760|    void *oldValue = uhash_put(fHashtable, keyToAdopt, (void *) value, &status);
  ------------------
  |  | 1032|    760|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|    760|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    760|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    760|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  317|    760|    U_ASSERT(oldValue == nullptr);
  ------------------
  |  |   35|    760|#   define U_ASSERT(exp) (void)0
  ------------------
  318|    760|    (void)oldValue;
  319|    760|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (319:9): [True: 760, False: 0]
  ------------------
  320|    760|        value->softRefCount++;
  321|    760|    }
  322|    760|}
_ZNK6icu_7812UnifiedCache18_putIfAbsentAndGetERKNS_12CacheKeyBaseERPKNS_12SharedObjectER10UErrorCode:
  327|    760|        UErrorCode &status) const {
  328|    760|    std::lock_guard<std::mutex> lock(*gCacheMutex);
  329|    760|    const UHashElement *element = uhash_find(fHashtable, &key);
  ------------------
  |  | 1006|    760|#define uhash_find U_ICU_ENTRY_POINT_RENAME(uhash_find)
  |  |  ------------------
  |  |  |  |  123|    760|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    760|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    760|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|    760|    if (element != nullptr && !_inProgress(element)) {
  ------------------
  |  Branch (330:9): [True: 760, False: 0]
  |  Branch (330:31): [True: 0, False: 760]
  ------------------
  331|      0|        _fetch(element, value, status);
  332|      0|        return;
  333|      0|    }
  334|    760|    if (element == nullptr) {
  ------------------
  |  Branch (334:9): [True: 0, False: 760]
  ------------------
  335|      0|        UErrorCode putError = U_ZERO_ERROR;
  336|       |        // best-effort basis only.
  337|      0|        _putNew(key, value, status, putError);
  338|    760|    } else {
  339|    760|        _put(element, value, status);
  340|    760|    }
  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|    760|    _runEvictionSlice();
  344|    760|}
_ZNK6icu_7812UnifiedCache5_pollERKNS_12CacheKeyBaseERPKNS_12SharedObjectER10UErrorCode:
  350|  9.53k|        UErrorCode &status) const {
  351|  9.53k|    U_ASSERT(value == nullptr);
  ------------------
  |  |   35|  9.53k|#   define U_ASSERT(exp) (void)0
  ------------------
  352|  9.53k|    U_ASSERT(status == U_ZERO_ERROR);
  ------------------
  |  |   35|  9.53k|#   define U_ASSERT(exp) (void)0
  ------------------
  353|  9.53k|    std::unique_lock<std::mutex> lock(*gCacheMutex);
  354|  9.53k|    const UHashElement *element = uhash_find(fHashtable, &key);
  ------------------
  |  | 1006|  9.53k|#define uhash_find U_ICU_ENTRY_POINT_RENAME(uhash_find)
  |  |  ------------------
  |  |  |  |  123|  9.53k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.53k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.53k|#       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|  9.53k|     while (element != nullptr && _inProgress(element)) {
  ------------------
  |  Branch (359:13): [True: 8.77k, False: 760]
  |  Branch (359:35): [True: 0, False: 8.77k]
  ------------------
  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|  9.53k|    if (element != nullptr) {
  ------------------
  |  Branch (366:9): [True: 8.77k, False: 760]
  ------------------
  367|  8.77k|         _fetch(element, value, status);
  368|  8.77k|        return true;
  369|  8.77k|    }
  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|    760|    _putNew(key, fNoValue, U_ZERO_ERROR, status);
  375|    760|    return false;
  376|  9.53k|}
_ZNK6icu_7812UnifiedCache4_getERKNS_12CacheKeyBaseERPKNS_12SharedObjectEPKvR10UErrorCode:
  382|  9.53k|        UErrorCode &status) const {
  383|  9.53k|    U_ASSERT(value == nullptr);
  ------------------
  |  |   35|  9.53k|#   define U_ASSERT(exp) (void)0
  ------------------
  384|  9.53k|    U_ASSERT(status == U_ZERO_ERROR);
  ------------------
  |  |   35|  9.53k|#   define U_ASSERT(exp) (void)0
  ------------------
  385|  9.53k|    if (_poll(key, value, status)) {
  ------------------
  |  Branch (385:9): [True: 8.77k, False: 760]
  ------------------
  386|  8.77k|        if (value == fNoValue) {
  ------------------
  |  Branch (386:13): [True: 0, False: 8.77k]
  ------------------
  387|      0|            SharedObject::clearPtr(value);
  388|      0|        }
  389|  8.77k|        return;
  390|  8.77k|    }
  391|    760|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (391:9): [True: 0, False: 760]
  ------------------
  392|      0|        return;
  393|      0|    }
  394|    760|    value = key.createObject(creationContext, status);
  395|    760|    U_ASSERT(value == nullptr || value->hasHardReferences());
  ------------------
  |  |   35|    760|#   define U_ASSERT(exp) (void)0
  ------------------
  396|    760|    U_ASSERT(value != nullptr || status != U_ZERO_ERROR);
  ------------------
  |  |   35|    760|#   define U_ASSERT(exp) (void)0
  ------------------
  397|    760|    if (value == nullptr) {
  ------------------
  |  Branch (397:9): [True: 0, False: 760]
  ------------------
  398|      0|        SharedObject::copyPtr(fNoValue, value);
  399|      0|    }
  400|    760|    _putIfAbsentAndGet(key, value, status);
  401|    760|    if (value == fNoValue) {
  ------------------
  |  Branch (401:9): [True: 0, False: 760]
  ------------------
  402|      0|        SharedObject::clearPtr(value);
  403|      0|    }
  404|    760|}
_ZNK6icu_7812UnifiedCache16_registerPrimaryEPKNS_12CacheKeyBaseEPKNS_12SharedObjectE:
  407|    760|            const CacheKeyBase *theKey, const SharedObject *value) const {
  408|    760|    theKey->fIsPrimary = true;
  409|    760|    value->cachePtr = this;
  410|    760|    ++fNumValuesTotal;
  411|    760|    ++fNumValuesInUse;
  412|    760|}
_ZNK6icu_7812UnifiedCache4_putEPK12UHashElementPKNS_12SharedObjectE10UErrorCode:
  417|    760|        const UErrorCode status) const {
  418|    760|    U_ASSERT(_inProgress(element));
  ------------------
  |  |   35|    760|#   define U_ASSERT(exp) (void)0
  ------------------
  419|    760|    const CacheKeyBase* theKey = static_cast<const CacheKeyBase*>(element->key.pointer);
  420|    760|    const SharedObject* oldValue = static_cast<const SharedObject*>(element->value.pointer);
  421|    760|    theKey->fCreationStatus = status;
  422|    760|    if (value->softRefCount == 0) {
  ------------------
  |  Branch (422:9): [True: 760, False: 0]
  ------------------
  423|    760|        _registerPrimary(theKey, value);
  424|    760|    }
  425|    760|    value->softRefCount++;
  426|    760|    UHashElement *ptr = const_cast<UHashElement *>(element);
  427|    760|    ptr->value.pointer = (void *) value;
  428|    760|    U_ASSERT(oldValue == fNoValue);
  ------------------
  |  |   35|    760|#   define U_ASSERT(exp) (void)0
  ------------------
  429|    760|    removeSoftRef(oldValue);
  430|       |
  431|       |    // Tell waiting threads that we replace in-progress status with
  432|       |    // an error.
  433|    760|    gInProgressValueAddedCond->notify_all();
  434|    760|}
_ZNK6icu_7812UnifiedCache6_fetchEPK12UHashElementRPKNS_12SharedObjectER10UErrorCode:
  439|  18.3k|        UErrorCode &status) const {
  440|  18.3k|    const CacheKeyBase* theKey = static_cast<const CacheKeyBase*>(element->key.pointer);
  441|  18.3k|    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|  18.3k|    removeHardRef(value);
  447|  18.3k|    value = static_cast<const SharedObject *>(element->value.pointer);
  448|  18.3k|    addHardRef(value);
  449|  18.3k|}
_ZNK6icu_7812UnifiedCache11_inProgressEPK12UHashElement:
  452|  9.53k|UBool UnifiedCache::_inProgress(const UHashElement* element) const {
  453|  9.53k|    UErrorCode status = U_ZERO_ERROR;
  454|  9.53k|    const SharedObject * value = nullptr;
  455|  9.53k|    _fetch(element, value, status);
  456|  9.53k|    UBool result = _inProgress(value, status);
  457|  9.53k|    removeHardRef(value);
  458|  9.53k|    return result;
  459|  9.53k|}
_ZNK6icu_7812UnifiedCache11_inProgressEPKNS_12SharedObjectE10UErrorCode:
  462|  9.53k|        const SharedObject* theValue, UErrorCode creationStatus) const {
  463|  9.53k|    return (theValue == fNoValue && creationStatus == U_ZERO_ERROR);
  ------------------
  |  Branch (463:13): [True: 760, False: 8.77k]
  |  Branch (463:37): [True: 760, False: 0]
  ------------------
  464|  9.53k|}
_ZNK6icu_7812UnifiedCache13removeSoftRefEPKNS_12SharedObjectE:
  481|    760|void UnifiedCache::removeSoftRef(const SharedObject *value) const {
  482|    760|    U_ASSERT(value->cachePtr == this);
  ------------------
  |  |   35|    760|#   define U_ASSERT(exp) (void)0
  ------------------
  483|    760|    U_ASSERT(value->softRefCount > 0);
  ------------------
  |  |   35|    760|#   define U_ASSERT(exp) (void)0
  ------------------
  484|    760|    if (--value->softRefCount == 0) {
  ------------------
  |  Branch (484:9): [True: 0, False: 760]
  ------------------
  485|      0|        --fNumValuesTotal;
  486|      0|        if (value->noHardReferences()) {
  ------------------
  |  Branch (486:13): [True: 0, False: 0]
  ------------------
  487|      0|            delete value;
  488|      0|        } else {
  489|       |            // This path only happens from flush(all). Which only happens from the
  490|       |            // UnifiedCache destructor.  Nulling out value.cacheptr changes the behavior
  491|       |            // of value.removeRef(), causing the deletion to be done there.
  492|      0|            value->cachePtr = nullptr;
  493|      0|        }
  494|      0|    }
  495|    760|}
_ZNK6icu_7812UnifiedCache13removeHardRefEPKNS_12SharedObjectE:
  497|  27.8k|int32_t UnifiedCache::removeHardRef(const SharedObject *value) const {
  498|  27.8k|    int refCount = 0;
  499|  27.8k|    if (value) {
  ------------------
  |  Branch (499:9): [True: 9.53k, False: 18.3k]
  ------------------
  500|  9.53k|        refCount = umtx_atomic_dec(&value->hardRefCount);
  501|  9.53k|        U_ASSERT(refCount >= 0);
  ------------------
  |  |   35|  9.53k|#   define U_ASSERT(exp) (void)0
  ------------------
  502|  9.53k|        if (refCount == 0) {
  ------------------
  |  Branch (502:13): [True: 8.77k, False: 760]
  ------------------
  503|  8.77k|            --fNumValuesInUse;
  504|  8.77k|        }
  505|  9.53k|    }
  506|  27.8k|    return refCount;
  507|  27.8k|}
_ZNK6icu_7812UnifiedCache10addHardRefEPKNS_12SharedObjectE:
  509|  18.3k|int32_t UnifiedCache::addHardRef(const SharedObject *value) const {
  510|  18.3k|    int refCount = 0;
  511|  18.3k|    if (value) {
  ------------------
  |  Branch (511:9): [True: 18.3k, False: 0]
  ------------------
  512|  18.3k|        refCount = umtx_atomic_inc(&value->hardRefCount);
  513|  18.3k|        U_ASSERT(refCount >= 1);
  ------------------
  |  |   35|  18.3k|#   define U_ASSERT(exp) (void)0
  ------------------
  514|  18.3k|        if (refCount == 1) {
  ------------------
  |  Branch (514:13): [True: 17.5k, False: 760]
  ------------------
  515|  17.5k|            fNumValuesInUse++;
  516|  17.5k|        }
  517|  18.3k|    }
  518|  18.3k|    return refCount;
  519|  18.3k|}
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|  9.53k|   CacheKeyBase() : fCreationStatus(U_ZERO_ERROR), fIsPrimary(false) {}
_ZN6icu_7812CacheKeyBaseC2ERKS0_:
   43|    760|           : UObject(other), fCreationStatus(other.fCreationStatus), fIsPrimary(false) { }
_ZN6icu_78eqERKNS_12CacheKeyBaseES2_:
   79|  9.53k|                                 const CacheKeyBase& rhs) {
   80|  9.53k|       return lhs.equals(rhs);
   81|  9.53k|   }
_ZN6icu_7812UnifiedCache11getByLocaleINS_18SharedNumberFormatEEEvRKNS_6LocaleERPKT_R10UErrorCode:
  269|  9.53k|           const Locale &loc, const T *&ptr, UErrorCode &status) {
  270|  9.53k|       const UnifiedCache *cache = getInstance(status);
  271|  9.53k|       if (U_FAILURE(status)) {
  ------------------
  |  Branch (271:12): [True: 0, False: 9.53k]
  ------------------
  272|      0|           return;
  273|      0|       }
  274|  9.53k|       cache->get(LocaleCacheKey<T>(loc), ptr, status);
  275|  9.53k|   }
_ZNK6icu_7812UnifiedCache3getINS_18SharedNumberFormatEEEvRKNS_8CacheKeyIT_EERPKS4_R10UErrorCode:
  205|  9.53k|           UErrorCode &status) const {
  206|  9.53k|       get(key, nullptr, ptr, status);
  207|  9.53k|   }
_ZNK6icu_7812UnifiedCache3getINS_18SharedNumberFormatEEEvRKNS_8CacheKeyIT_EEPKvRPKS4_R10UErrorCode:
  228|  9.53k|           UErrorCode &status) const {
  229|  9.53k|       if (U_FAILURE(status)) {
  ------------------
  |  Branch (229:12): [True: 0, False: 9.53k]
  ------------------
  230|      0|           return;
  231|      0|       }
  232|  9.53k|       UErrorCode creationStatus = U_ZERO_ERROR;
  233|  9.53k|       const SharedObject *value = nullptr;
  234|  9.53k|       _get(key, value, creationContext, creationStatus);
  235|  9.53k|       const T *tvalue = (const T *) value;
  236|  9.53k|       if (U_SUCCESS(creationStatus)) {
  ------------------
  |  Branch (236:12): [True: 9.53k, False: 0]
  ------------------
  237|  9.53k|           SharedObject::copyPtr(tvalue, ptr);
  238|  9.53k|       }
  239|  9.53k|       SharedObject::clearPtr(tvalue);
  240|       |       // Take care not to overwrite a warning status passed in with
  241|       |       // another warning or U_ZERO_ERROR.
  242|  9.53k|       if (status == U_ZERO_ERROR || U_FAILURE(creationStatus)) {
  ------------------
  |  Branch (242:12): [True: 9.53k, False: 0]
  |  Branch (242:38): [True: 0, False: 0]
  ------------------
  243|  9.53k|           status = creationStatus;
  244|  9.53k|       }
  245|  9.53k|   }
_ZN6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEEC2ERKNS_6LocaleE:
  151|  9.53k|   LocaleCacheKey(const Locale &loc) : fLoc(loc) {}
_ZNK6icu_788CacheKeyINS_18SharedNumberFormatEE8hashCodeEv:
  110|  11.0k|   virtual int32_t hashCode() const override {
  111|  11.0k|       const char *s = typeid(T).name();
  112|  11.0k|       return ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s)));
  ------------------
  |  | 1878|  11.0k|#define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN)
  |  |  ------------------
  |  |  |  |  123|  11.0k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  11.0k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  11.0k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                     return ustr_hashCharsN(s, static_cast<int32_t>(uprv_strlen(s)));
  ------------------
  |  |   37|  11.0k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  11.0k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  113|  11.0k|   }
_ZNK6icu_788CacheKeyINS_18SharedNumberFormatEE6equalsERKNS_12CacheKeyBaseE:
  129|  9.53k|   virtual bool equals(const CacheKeyBase &other) const override {
  130|  9.53k|       return this == &other || typeid(*this) == typeid(other);
  ------------------
  |  Branch (130:15): [True: 0, False: 9.53k]
  |  Branch (130:33): [True: 9.53k, False: 0]
  ------------------
  131|  9.53k|   }
_ZNK6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEE8hashCodeEv:
  155|  11.0k|   virtual int32_t hashCode() const override {
  156|  11.0k|       return (int32_t)(37u * (uint32_t)CacheKey<T>::hashCode() + (uint32_t)fLoc.hashCode());
  157|  11.0k|   }
_ZNK6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEE5cloneEv:
  161|    760|   virtual CacheKeyBase *clone() const override {
  162|    760|       return new LocaleCacheKey<T>(*this);
  163|    760|   }
_ZN6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEEC2ERKS2_:
  153|    760|           : CacheKey<T>(other), fLoc(other.fLoc) { }
_ZNK6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEE6equalsERKNS_12CacheKeyBaseE:
  142|  9.53k|   virtual bool equals(const CacheKeyBase &other) const override {
  143|  9.53k|       if (!CacheKey<T>::equals(other)) {
  ------------------
  |  Branch (143:12): [True: 0, False: 9.53k]
  ------------------
  144|      0|           return false;
  145|      0|       }
  146|       |       // We know this and other are of same class because equals() on
  147|       |       // CacheKey returned true.
  148|  9.53k|       return operator==(static_cast<const LocaleCacheKey<T> &>(other));
  149|  9.53k|   }
_ZNK6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEEeqERKS2_:
  158|  9.53k|   inline bool operator == (const LocaleCacheKey<T> &other) const {
  159|  9.53k|       return fLoc == other.fLoc;
  160|  9.53k|   }
_ZN6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEED2Ev:
  154|  9.53k|   virtual ~LocaleCacheKey() { }

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

_ZN6icu_7814UnicodeFunctorD2Ev:
   16|  1.74k|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|  1.29k|    int32_t add(const char16_t*p, UErrorCode &errorCode) {
   59|  1.29k|        if (U_FAILURE(errorCode)) { return -1; }
  ------------------
  |  Branch (59:13): [True: 0, False: 1.29k]
  ------------------
   60|  1.29k|        if (isFrozen) {
  ------------------
  |  Branch (60:13): [True: 0, False: 1.29k]
  ------------------
   61|      0|            errorCode = U_NO_WRITE_PERMISSION;
   62|      0|            return -1;
   63|      0|        }
   64|       |        // The string points into the resource bundle.
   65|  1.29k|        int32_t oldIndex = uhash_geti(&map, p);
  ------------------
  |  | 1008|  1.29k|#define uhash_geti U_ICU_ENTRY_POINT_RENAME(uhash_geti)
  |  |  ------------------
  |  |  |  |  123|  1.29k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.29k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.29k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   66|  1.29k|        if (oldIndex != 0) {  // found duplicate
  ------------------
  |  Branch (66:13): [True: 476, False: 814]
  ------------------
   67|    476|            return oldIndex;
   68|    476|        }
   69|       |        // Explicit NUL terminator for the previous string.
   70|       |        // The strings object is also terminated with one implicit NUL.
   71|    814|        strings->append(0, errorCode);
   72|    814|        int32_t newIndex = strings->length();
   73|    814|        strings->appendInvariantChars(p, u_strlen(p), errorCode);
  ------------------
  |  |  393|    814|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|    814|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    814|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    814|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   74|    814|        uhash_puti(&map, const_cast<char16_t *>(p), newIndex, &errorCode);
  ------------------
  |  | 1033|    814|#define uhash_puti U_ICU_ENTRY_POINT_RENAME(uhash_puti)
  |  |  ------------------
  |  |  |  |  123|    814|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    814|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    814|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|    814|        return newIndex;
   76|  1.29k|    }
_ZN6icu_7817UniqueCharStrings6freezeEv:
  100|      1|    void freeze() { isFrozen = true; }
_ZNK6icu_7817UniqueCharStrings3getEi:
  106|  1.29k|    const char *get(int32_t i) const {
  107|  1.29k|        U_ASSERT(isFrozen);
  ------------------
  |  |   35|  1.29k|#   define U_ASSERT(exp) (void)0
  ------------------
  108|  1.29k|        return isFrozen && i > 0 ? strings->data() + i : nullptr;
  ------------------
  |  Branch (108:16): [True: 1.29k, False: 0]
  |  Branch (108:28): [True: 1.29k, False: 0]
  ------------------
  109|  1.29k|    }
_ZN6icu_7817UniqueCharStrings17orphanCharStringsEv:
   44|      1|    CharString *orphanCharStrings() {
   45|      1|        CharString *result = strings;
   46|      1|        strings = nullptr;
   47|      1|        return result;
   48|      1|    }
_ZN6icu_7817UniqueCharStringsD2Ev:
   38|      1|    ~UniqueCharStrings() {
   39|      1|        uhash_close(&map);
  ------------------
  |  |  991|      1|#define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close)
  |  |  ------------------
  |  |  |  |  123|      1|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      1|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      1|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   40|      1|        delete strings;
   41|      1|    }

_ZNK6icu_7810UnicodeSet10hasStringsEv:
  120|  1.78k|UBool UnicodeSet::hasStrings() const {
  121|  1.78k|    return strings_ != nullptr && !strings_->isEmpty();
  ------------------
  |  Branch (121:12): [True: 1, False: 1.78k]
  |  Branch (121:35): [True: 1, False: 0]
  ------------------
  122|  1.78k|}
_ZNK6icu_7810UnicodeSet15stringsContainsERKNS_13UnicodeStringE:
  128|   346k|UBool UnicodeSet::stringsContains(const UnicodeString &s) const {
  129|   346k|    return strings_ != nullptr && strings_->contains((void*) &s);
  ------------------
  |  Branch (129:12): [True: 1, False: 346k]
  |  Branch (129:35): [True: 0, False: 1]
  ------------------
  130|   346k|}
_ZN6icu_7810UnicodeSetC2Ev:
  139|  1.75k|UnicodeSet::UnicodeSet() {
  140|  1.75k|    list[0] = UNICODESET_HIGH;
  ------------------
  |  |   34|  1.75k|#define UNICODESET_HIGH 0x0110000
  ------------------
  141|  1.75k|    _dbgct(this);
  142|  1.75k|}
_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_7810UnicodeSetC2ERKS0_a:
  166|      1|UnicodeSet::UnicodeSet(const UnicodeSet& o, UBool /* asThawed */) : UnicodeFilter(o) {
  167|      1|    if (ensureCapacity(o.len)) {
  ------------------
  |  Branch (167:9): [True: 1, False: 0]
  ------------------
  168|       |        // *this = o except for bmpSet and stringSpan
  169|      1|        len = o.len;
  170|      1|        uprv_memcpy(list, o.list, (size_t)len*sizeof(UChar32));
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  171|      1|        if (o.hasStrings()) {
  ------------------
  |  Branch (171:13): [True: 0, False: 1]
  ------------------
  172|      0|            UErrorCode status = U_ZERO_ERROR;
  173|      0|            if (!allocateStrings(status) ||
  ------------------
  |  Branch (173:17): [True: 0, False: 0]
  ------------------
  174|      0|                    (strings_->assign(*o.strings_, cloneUnicodeString, status), U_FAILURE(status))) {
  ------------------
  |  Branch (174:21): [True: 0, False: 0]
  ------------------
  175|      0|                setToBogus();
  176|      0|                return;
  177|      0|            }
  178|      0|        }
  179|      1|        if (o.pat) {
  ------------------
  |  Branch (179:13): [True: 0, False: 1]
  ------------------
  180|      0|            setPattern(o.pat, o.patLen);
  181|      0|        }
  182|      1|        _dbgct(this);
  183|      1|    }
  184|      1|}
_ZN6icu_7810UnicodeSetD2Ev:
  189|  1.74k|UnicodeSet::~UnicodeSet() {
  190|  1.74k|    _dbgdt(this); // first!
  191|  1.74k|    if (list != stackList) {
  ------------------
  |  Branch (191:9): [True: 874, False: 875]
  ------------------
  192|    874|        uprv_free(list);
  ------------------
  |  | 1503|    874|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    874|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    874|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    874|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|    874|    }
  194|  1.74k|    delete bmpSet;
  195|  1.74k|    if (buffer != stackList) {
  ------------------
  |  Branch (195:9): [True: 1.74k, False: 0]
  ------------------
  196|  1.74k|        uprv_free(buffer);
  ------------------
  |  | 1503|  1.74k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  1.74k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.74k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.74k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  197|  1.74k|    }
  198|  1.74k|    delete strings_;
  199|  1.74k|    delete stringSpan;
  200|  1.74k|    releasePattern();
  201|  1.74k|}
_ZN6icu_7810UnicodeSetaSERKS0_:
  206|      1|UnicodeSet& UnicodeSet::operator=(const UnicodeSet& o) {
  207|      1|    return copyFrom(o, false);
  208|      1|}
_ZN6icu_7810UnicodeSet8copyFromERKS0_a:
  210|      4|UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) {
  211|      4|    if (this == &o) {
  ------------------
  |  Branch (211:9): [True: 0, False: 4]
  ------------------
  212|      0|        return *this;
  213|      0|    }
  214|      4|    if (isFrozen()) {
  ------------------
  |  Branch (214:9): [True: 0, False: 4]
  ------------------
  215|      0|        return *this;
  216|      0|    }
  217|      4|    if (o.isBogus()) {
  ------------------
  |  Branch (217:9): [True: 0, False: 4]
  ------------------
  218|      0|        setToBogus();
  219|      0|        return *this;
  220|      0|    }
  221|      4|    if (!ensureCapacity(o.len)) {
  ------------------
  |  Branch (221:9): [True: 0, False: 4]
  ------------------
  222|       |        // ensureCapacity will mark the UnicodeSet as Bogus if OOM failure happens.
  223|      0|        return *this;
  224|      0|    }
  225|      4|    len = o.len;
  226|      4|    uprv_memcpy(list, o.list, (size_t)len*sizeof(UChar32));
  ------------------
  |  |   42|      4|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      4|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|      4|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|      4|    _Pragma("clang diagnostic push") \
  |  |   45|      4|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|      4|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|      4|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|      4|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|      4|    _Pragma("clang diagnostic pop") \
  |  |   49|      4|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|      4|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|      4|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      4|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  227|      4|    if (o.bmpSet != nullptr && !asThawed) {
  ------------------
  |  Branch (227:9): [True: 3, False: 1]
  |  Branch (227:32): [True: 0, False: 3]
  ------------------
  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|      4|    if (o.hasStrings()) {
  ------------------
  |  Branch (234:9): [True: 0, False: 4]
  ------------------
  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|      4|    } else if (hasStrings()) {
  ------------------
  |  Branch (241:16): [True: 0, False: 4]
  ------------------
  242|      0|        strings_->removeAllElements();
  243|      0|    }
  244|      4|    if (o.stringSpan != nullptr && !asThawed) {
  ------------------
  |  Branch (244:9): [True: 0, False: 4]
  |  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|      4|    releasePattern();
  252|      4|    if (o.pat) {
  ------------------
  |  Branch (252:9): [True: 0, False: 4]
  ------------------
  253|      0|        setPattern(o.pat, o.patLen);
  254|      0|    }
  255|      4|    return *this;
  256|      4|}
_ZNK6icu_7810UnicodeSet13cloneAsThawedEv:
  267|      1|UnicodeSet *UnicodeSet::cloneAsThawed() const {
  268|      1|    return new UnicodeSet(*this, true);
  269|      1|}
_ZNK6icu_7810UnicodeSet8containsEi:
  340|  54.6M|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|  54.6M|    if (bmpSet != nullptr) {
  ------------------
  |  Branch (348:9): [True: 54.6M, False: 2]
  ------------------
  349|  54.6M|        return bmpSet->contains(c);
  350|  54.6M|    }
  351|      2|    if (stringSpan != nullptr) {
  ------------------
  |  Branch (351:9): [True: 0, False: 2]
  ------------------
  352|      0|        return stringSpan->contains(c);
  353|      0|    }
  354|      2|    if (c >= UNICODESET_HIGH) { // Don't need to check LOW bound
  ------------------
  |  |   34|      2|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (354:9): [True: 0, False: 2]
  ------------------
  355|      0|        return false;
  356|      0|    }
  357|      2|    int32_t i = findCodePoint(c);
  358|      2|    return i & 1; // return true if odd
  359|      2|}
_ZNK6icu_7810UnicodeSet13findCodePointEi:
  370|  16.3k|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|  16.3k|    if (c < list[0])
  ------------------
  |  Branch (383:9): [True: 901, False: 15.4k]
  ------------------
  384|    901|        return 0;
  385|       |    // High runner test.  c is often after the last range, so an
  386|       |    // initial check for this condition pays off.
  387|  15.4k|    int32_t lo = 0;
  388|  15.4k|    int32_t hi = len - 1;
  389|  15.4k|    if (lo >= hi || c >= list[hi-1])
  ------------------
  |  Branch (389:9): [True: 0, False: 15.4k]
  |  Branch (389:21): [True: 15.1k, False: 331]
  ------------------
  390|  15.1k|        return hi;
  391|       |    // invariant: c >= list[lo]
  392|       |    // invariant: c < list[hi]
  393|  3.66k|    for (;;) {
  394|  3.66k|        int32_t i = (lo + hi) >> 1;
  395|  3.66k|        if (i == lo) {
  ------------------
  |  Branch (395:13): [True: 331, False: 3.33k]
  ------------------
  396|    331|            break; // Found!
  397|  3.33k|        } else if (c < list[i]) {
  ------------------
  |  Branch (397:20): [True: 2.01k, False: 1.32k]
  ------------------
  398|  2.01k|            hi = i;
  399|  2.01k|        } else {
  400|  1.32k|            lo = i;
  401|  1.32k|        }
  402|  3.66k|    }
  403|    331|    return hi;
  404|  15.4k|}
_ZNK6icu_7810UnicodeSet8containsERKNS_13UnicodeStringE:
  428|  1.06M|UBool UnicodeSet::contains(const UnicodeString& s) const {
  429|  1.06M|    int32_t cp = getSingleCP(s);
  430|  1.06M|    if (cp < 0) {
  ------------------
  |  Branch (430:9): [True: 346k, False: 716k]
  ------------------
  431|   346k|        return stringsContains(s);
  432|   716k|    } else {
  433|   716k|        return contains(static_cast<UChar32>(cp));
  434|   716k|    }
  435|  1.06M|}
_ZN6icu_7810UnicodeSet3addEii:
  765|    209|UnicodeSet& UnicodeSet::add(UChar32 start, UChar32 end) {
  766|    209|    if (pinCodePoint(start) < pinCodePoint(end)) {
  ------------------
  |  Branch (766:9): [True: 120, False: 89]
  ------------------
  767|    120|        UChar32 limit = end + 1;
  768|       |        // Fast path for adding a new range after the last one.
  769|       |        // Odd list length: [..., lastStart, lastLimit, HIGH]
  770|    120|        if ((len & 1) != 0) {
  ------------------
  |  Branch (770:13): [True: 120, False: 0]
  ------------------
  771|       |            // If the list is empty, set lastLimit low enough to not be adjacent to 0.
  772|    120|            UChar32 lastLimit = len == 1 ? -2 : list[len - 2];
  ------------------
  |  Branch (772:33): [True: 3, False: 117]
  ------------------
  773|    120|            if (lastLimit <= start && !isFrozen() && !isBogus()) {
  ------------------
  |  Branch (773:17): [True: 79, False: 41]
  |  Branch (773:39): [True: 79, False: 0]
  |  Branch (773:54): [True: 79, False: 0]
  ------------------
  774|     79|                if (lastLimit == start) {
  ------------------
  |  Branch (774:21): [True: 0, False: 79]
  ------------------
  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|     79|                } else {
  781|     79|                    list[len - 1] = start;
  782|     79|                    if (limit < UNICODESET_HIGH) {
  ------------------
  |  |   34|     79|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (782:25): [True: 78, False: 1]
  ------------------
  783|     78|                        if (ensureCapacity(len + 2)) {
  ------------------
  |  Branch (783:29): [True: 78, False: 0]
  ------------------
  784|     78|                            list[len++] = limit;
  785|     78|                            list[len++] = UNICODESET_HIGH;
  ------------------
  |  |   34|     78|#define UNICODESET_HIGH 0x0110000
  ------------------
  786|     78|                        }
  787|     78|                    } 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|     79|                }
  793|     79|                releasePattern();
  794|     79|                return *this;
  795|     79|            }
  796|    120|        }
  797|       |        // This is slow. Could be much faster using findCodePoint(start)
  798|       |        // and modifying the list, dealing with adjacent & overlapping ranges.
  799|     41|        UChar32 range[3] = { start, limit, UNICODESET_HIGH };
  ------------------
  |  |   34|     41|#define UNICODESET_HIGH 0x0110000
  ------------------
  800|     41|        add(range, 2, 0);
  801|     89|    } else if (start == end) {
  ------------------
  |  Branch (801:16): [True: 89, False: 0]
  ------------------
  802|     89|        add(start);
  803|     89|    }
  804|    130|    return *this;
  805|    209|}
_ZN6icu_7810UnicodeSet3addEi:
  833|  16.3k|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|  16.3k|    int32_t i = findCodePoint(pinCodePoint(c));
  838|       |
  839|       |    // already in set?
  840|  16.3k|    if ((i & 1) != 0  || isFrozen() || isBogus()) return *this;
  ------------------
  |  Branch (840:9): [True: 141, False: 16.2k]
  |  Branch (840:26): [True: 0, False: 16.2k]
  |  Branch (840:40): [True: 0, False: 16.2k]
  ------------------
  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|  16.2k|    if (c == list[i]-1) {
  ------------------
  |  Branch (863:9): [True: 28, False: 16.1k]
  ------------------
  864|       |        // c is before start of next range
  865|     28|        list[i] = c;
  866|       |        // if we touched the HIGH mark, then add a new one
  867|     28|        if (c == (UNICODESET_HIGH - 1)) {
  ------------------
  |  |   34|     28|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (867:13): [True: 0, False: 28]
  ------------------
  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|     28|        if (i > 0 && c == list[i-1]) {
  ------------------
  |  Branch (874:13): [True: 28, False: 0]
  |  Branch (874:22): [True: 19, False: 9]
  ------------------
  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|     19|            UChar32* dst = list + i - 1;
  885|     19|            UChar32* src = dst + 2;
  886|     19|            UChar32* srclimit = list + len;
  887|  32.4k|            while (src < srclimit) *(dst++) = *(src++);
  ------------------
  |  Branch (887:20): [True: 32.3k, False: 19]
  ------------------
  888|       |
  889|     19|            len -= 2;
  890|     19|        }
  891|     28|    }
  892|       |
  893|  16.1k|    else if (i > 0 && c == list[i-1]) {
  ------------------
  |  Branch (893:14): [True: 15.2k, False: 899]
  |  Branch (893:23): [True: 9.10k, False: 6.17k]
  ------------------
  894|       |        // c is after end of prior range
  895|  9.10k|        list[i-1]++;
  896|       |        // no need to check for collapse here
  897|  9.10k|    }
  898|       |
  899|  7.07k|    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|  7.07k|        if (!ensureCapacity(len+2)) {
  ------------------
  |  Branch (912:13): [True: 0, False: 7.07k]
  ------------------
  913|       |            // ensureCapacity will mark the object as Bogus if OOM failure happens.
  914|      0|            return *this;
  915|      0|        }
  916|       |
  917|  7.07k|        UChar32 *p = list + i;
  918|  7.07k|        uprv_memmove(p + 2, p, (len - i) * sizeof(*p));
  ------------------
  |  |   51|  7.07k|#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  7.07k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   52|  7.07k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   53|  7.07k|    _Pragma("clang diagnostic push") \
  |  |   54|  7.07k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   55|  7.07k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  7.07k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   56|  7.07k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  7.07k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   57|  7.07k|    _Pragma("clang diagnostic pop") \
  |  |   58|  7.07k|    U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  7.07k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   59|  7.07k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  7.07k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  919|  7.07k|        list[i] = c;
  920|  7.07k|        list[i+1] = c+1;
  921|  7.07k|        len += 2;
  922|  7.07k|    }
  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|  16.2k|    releasePattern();
  938|  16.2k|    return *this;
  939|  16.2k|}
_ZN6icu_7810UnicodeSet3addERKNS_13UnicodeStringE:
  950|      2|UnicodeSet& UnicodeSet::add(const UnicodeString& s) {
  951|      2|    if (isFrozen() || isBogus()) return *this;
  ------------------
  |  Branch (951:9): [True: 0, False: 2]
  |  Branch (951:23): [True: 0, False: 2]
  ------------------
  952|      2|    int32_t cp = getSingleCP(s);
  953|      2|    if (cp < 0) {
  ------------------
  |  Branch (953:9): [True: 2, False: 0]
  ------------------
  954|      2|        if (!stringsContains(s)) {
  ------------------
  |  Branch (954:13): [True: 2, False: 0]
  ------------------
  955|      2|            _add(s);
  956|      2|            releasePattern();
  957|      2|        }
  958|      2|    } else {
  959|      0|        add(static_cast<UChar32>(cp));
  960|      0|    }
  961|      2|    return *this;
  962|      2|}
_ZN6icu_7810UnicodeSet4_addERKNS_13UnicodeStringE:
  968|      2|void UnicodeSet::_add(const UnicodeString& s) {
  969|      2|    if (isFrozen() || isBogus()) {
  ------------------
  |  Branch (969:9): [True: 0, False: 2]
  |  Branch (969:23): [True: 0, False: 2]
  ------------------
  970|      0|        return;
  971|      0|    }
  972|      2|    UErrorCode ec = U_ZERO_ERROR;
  973|      2|    if (strings_ == nullptr && !allocateStrings(ec)) {
  ------------------
  |  Branch (973:9): [True: 1, False: 1]
  |  Branch (973:32): [True: 0, False: 1]
  ------------------
  974|      0|        setToBogus();
  975|      0|        return;
  976|      0|    }
  977|      2|    LocalPointer<UnicodeString> t(new UnicodeString(s));
  978|      2|    if (t.isNull()) { // Check for memory allocation error.
  ------------------
  |  Branch (978:9): [True: 0, False: 2]
  ------------------
  979|      0|        setToBogus();
  980|      0|        return;
  981|      0|    }
  982|      2|    strings_->sortedInsert(t.orphan(), compareUnicodeString, ec);
  983|      2|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (983:9): [True: 0, False: 2]
  ------------------
  984|      0|        setToBogus();
  985|      0|    }
  986|      2|}
_ZN6icu_7810UnicodeSet11getSingleCPERKNS_13UnicodeStringE:
  993|  1.06M|int32_t UnicodeSet::getSingleCP(const UnicodeString& s) {
  994|  1.06M|    int32_t sLength = s.length();
  995|  1.06M|    if (sLength == 1) return s.charAt(0);
  ------------------
  |  Branch (995:9): [True: 716k, False: 346k]
  ------------------
  996|   346k|    if (sLength == 2) {
  ------------------
  |  Branch (996:9): [True: 26.7k, False: 319k]
  ------------------
  997|  26.7k|        UChar32 cp = s.char32At(0);
  998|  26.7k|        if (cp > 0xFFFF) { // is surrogate pair
  ------------------
  |  Branch (998:13): [True: 10, False: 26.7k]
  ------------------
  999|     10|            return cp;
 1000|     10|        }
 1001|  26.7k|    }
 1002|   346k|    return -1;
 1003|   346k|}
_ZN6icu_7810UnicodeSet6addAllERKS0_:
 1272|  1.76k|UnicodeSet& UnicodeSet::addAll(const UnicodeSet& c) {
 1273|  1.76k|    if ( c.len>0 && c.list!=nullptr ) {
  ------------------
  |  Branch (1273:10): [True: 1.76k, False: 0]
  |  Branch (1273:21): [True: 1.76k, False: 0]
  ------------------
 1274|  1.76k|        add(c.list, c.len, 0);
 1275|  1.76k|    }
 1276|       |
 1277|       |    // Add strings in order
 1278|  1.76k|    if ( c.strings_!=nullptr ) {
  ------------------
  |  Branch (1278:10): [True: 0, False: 1.76k]
  ------------------
 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|  1.76k|    return *this;
 1287|  1.76k|}
_ZN6icu_7810UnicodeSet9retainAllERKS0_:
 1298|      1|UnicodeSet& UnicodeSet::retainAll(const UnicodeSet& c) {
 1299|      1|    if (isFrozen() || isBogus()) {
  ------------------
  |  Branch (1299:9): [True: 0, False: 1]
  |  Branch (1299:23): [True: 0, False: 1]
  ------------------
 1300|      0|        return *this;
 1301|      0|    }
 1302|      1|    retain(c.list, c.len, 0);
 1303|      1|    if (hasStrings()) {
  ------------------
  |  Branch (1303:9): [True: 0, False: 1]
  ------------------
 1304|      0|        if (!c.hasStrings()) {
  ------------------
  |  Branch (1304:13): [True: 0, False: 0]
  ------------------
 1305|      0|            strings_->removeAllElements();
 1306|      0|        } else {
 1307|      0|            strings_->retainAll(*c.strings_);
 1308|      0|        }
 1309|      0|    }
 1310|      1|    return *this;
 1311|      1|}
_ZN6icu_7810UnicodeSet5clearEv:
 1362|     22|UnicodeSet& UnicodeSet::clear() {
 1363|     22|    if (isFrozen()) {
  ------------------
  |  Branch (1363:9): [True: 0, False: 22]
  ------------------
 1364|      0|        return *this;
 1365|      0|    }
 1366|     22|    list[0] = UNICODESET_HIGH;
  ------------------
  |  |   34|     22|#define UNICODESET_HIGH 0x0110000
  ------------------
 1367|     22|    len = 1;
 1368|     22|    releasePattern();
 1369|     22|    if (strings_ != nullptr) {
  ------------------
  |  Branch (1369:9): [True: 0, False: 22]
  ------------------
 1370|      0|        strings_->removeAllElements();
 1371|      0|    }
 1372|       |    // Remove bogus
 1373|     22|    fFlags = 0;
 1374|     22|    return *this;
 1375|     22|}
_ZNK6icu_7810UnicodeSet13getRangeCountEv:
 1383|      4|int32_t UnicodeSet::getRangeCount() const {
 1384|      4|    return len/2;
 1385|      4|}
_ZNK6icu_7810UnicodeSet13getRangeStartEi:
 1393|  8.03k|UChar32 UnicodeSet::getRangeStart(int32_t index) const {
 1394|  8.03k|    return list[index*2];
 1395|  8.03k|}
_ZNK6icu_7810UnicodeSet11getRangeEndEi:
 1403|  8.03k|UChar32 UnicodeSet::getRangeEnd(int32_t index) const {
 1404|  8.03k|    return list[index*2 + 1] - 1;
 1405|  8.03k|}
_ZN6icu_7810UnicodeSet7compactEv:
 1415|  1.77k|UnicodeSet& UnicodeSet::compact() {
 1416|  1.77k|    if (isFrozen() || isBogus()) {
  ------------------
  |  Branch (1416:9): [True: 0, False: 1.77k]
  |  Branch (1416:23): [True: 0, False: 1.77k]
  ------------------
 1417|      0|        return *this;
 1418|      0|    }
 1419|       |    // Delete buffer first to defragment memory less.
 1420|  1.77k|    if (buffer != stackList) {
  ------------------
  |  Branch (1420:9): [True: 1.77k, False: 3]
  ------------------
 1421|  1.77k|        uprv_free(buffer);
  ------------------
  |  | 1503|  1.77k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  1.77k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.77k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.77k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1422|  1.77k|        buffer = nullptr;
 1423|  1.77k|        bufferCapacity = 0;
 1424|  1.77k|    }
 1425|  1.77k|    if (list == stackList) {
  ------------------
  |  Branch (1425:9): [True: 892, False: 885]
  ------------------
 1426|       |        // pass
 1427|    892|    } else if (len <= INITIAL_CAPACITY) {
  ------------------
  |  Branch (1427:16): [True: 2, False: 883]
  ------------------
 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|    883|    } else if ((len + 7) < capacity) {
  ------------------
  |  Branch (1432:16): [True: 883, False: 0]
  ------------------
 1433|       |        // If we have more than a little unused capacity, shrink it to len.
 1434|    883|        UChar32* temp = static_cast<UChar32*>(uprv_realloc(list, sizeof(UChar32) * len));
  ------------------
  |  | 1536|    883|#define uprv_realloc U_ICU_ENTRY_POINT_RENAME(uprv_realloc)
  |  |  ------------------
  |  |  |  |  123|    883|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    883|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    883|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1435|    883|        if (temp) {
  ------------------
  |  Branch (1435:13): [True: 883, False: 0]
  ------------------
 1436|    883|            list = temp;
 1437|    883|            capacity = len;
 1438|    883|        }
 1439|       |        // else what the heck happened?! We allocated less memory!
 1440|       |        // Oh well. We'll keep our original array.
 1441|    883|    }
 1442|  1.77k|    if (strings_ != nullptr && strings_->isEmpty()) {
  ------------------
  |  Branch (1442:9): [True: 1, False: 1.77k]
  |  Branch (1442:32): [True: 0, False: 1]
  ------------------
 1443|      0|        delete strings_;
 1444|      0|        strings_ = nullptr;
 1445|      0|    }
 1446|  1.77k|    return *this;
 1447|  1.77k|}
_ZN6icu_7810UnicodeSet15allocateStringsER10UErrorCode:
 1606|      1|UBool UnicodeSet::allocateStrings(UErrorCode &status) {
 1607|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1607:9): [True: 0, False: 1]
  ------------------
 1608|      0|        return false;
 1609|      0|    }
 1610|      1|    strings_ = new UVector(uprv_deleteUObject,
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1611|      1|                          uhash_compareUnicodeString, 1, 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1612|      1|    if (strings_ == nullptr) { // Check for memory allocation error.
  ------------------
  |  Branch (1612:9): [True: 0, False: 1]
  ------------------
 1613|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1614|      0|        return false;
 1615|      0|    }
 1616|      1|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1616:9): [True: 0, False: 1]
  ------------------
 1617|      0|        delete strings_;
 1618|      0|        strings_ = nullptr;
 1619|      0|        return false;
 1620|      0|    } 
 1621|      1|    return true;
 1622|      1|}
_ZN6icu_7810UnicodeSet12nextCapacityEi:
 1624|  1.77k|int32_t UnicodeSet::nextCapacity(int32_t minCapacity) {
 1625|       |    // Grow exponentially to reduce the frequency of allocations.
 1626|  1.77k|    if (minCapacity < INITIAL_CAPACITY) {
  ------------------
  |  Branch (1626:9): [True: 6, False: 1.77k]
  ------------------
 1627|      6|        return minCapacity + INITIAL_CAPACITY;
 1628|  1.77k|    } else if (minCapacity <= 2500) {
  ------------------
  |  Branch (1628:16): [True: 1.76k, False: 2]
  ------------------
 1629|  1.76k|        return 5 * minCapacity;
 1630|  1.76k|    } else {
 1631|      2|        int32_t newCapacity = 2 * minCapacity;
 1632|      2|        if (newCapacity > MAX_LENGTH) {
  ------------------
  |  Branch (1632:13): [True: 0, False: 2]
  ------------------
 1633|      0|            newCapacity = MAX_LENGTH;
 1634|      0|        }
 1635|      2|        return newCapacity;
 1636|      2|    }
 1637|  1.77k|}
_ZN6icu_7810UnicodeSet14ensureCapacityEi:
 1639|  7.15k|bool UnicodeSet::ensureCapacity(int32_t newLen) {
 1640|  7.15k|    if (newLen > MAX_LENGTH) {
  ------------------
  |  Branch (1640:9): [True: 0, False: 7.15k]
  ------------------
 1641|      0|        newLen = MAX_LENGTH;
 1642|      0|    }
 1643|  7.15k|    if (newLen <= capacity) {
  ------------------
  |  Branch (1643:9): [True: 7.14k, False: 14]
  ------------------
 1644|  7.14k|        return true;
 1645|  7.14k|    }
 1646|     14|    int32_t newCapacity = nextCapacity(newLen);
 1647|     14|    UChar32* temp = static_cast<UChar32*>(uprv_malloc(newCapacity * sizeof(UChar32)));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1648|     14|    if (temp == nullptr) {
  ------------------
  |  Branch (1648:9): [True: 0, False: 14]
  ------------------
 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|     14|    uprv_memcpy(temp, list, len * sizeof(UChar32));
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1654|     14|    if (list != stackList) {
  ------------------
  |  Branch (1654:9): [True: 9, False: 5]
  ------------------
 1655|      9|        uprv_free(list);
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1656|      9|    }
 1657|     14|    list = temp;
 1658|     14|    capacity = newCapacity;
 1659|     14|    return true;
 1660|     14|}
_ZN6icu_7810UnicodeSet20ensureBufferCapacityEi:
 1662|  1.80k|bool UnicodeSet::ensureBufferCapacity(int32_t newLen) {
 1663|  1.80k|    if (newLen > MAX_LENGTH) {
  ------------------
  |  Branch (1663:9): [True: 0, False: 1.80k]
  ------------------
 1664|      0|        newLen = MAX_LENGTH;
 1665|      0|    }
 1666|  1.80k|    if (newLen <= bufferCapacity) {
  ------------------
  |  Branch (1666:9): [True: 42, False: 1.76k]
  ------------------
 1667|     42|        return true;
 1668|     42|    }
 1669|  1.76k|    int32_t newCapacity = nextCapacity(newLen);
 1670|  1.76k|    UChar32* temp = static_cast<UChar32*>(uprv_malloc(newCapacity * sizeof(UChar32)));
  ------------------
  |  | 1524|  1.76k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.76k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.76k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.76k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1671|  1.76k|    if (temp == nullptr) {
  ------------------
  |  Branch (1671:9): [True: 0, False: 1.76k]
  ------------------
 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|  1.76k|    if (buffer != stackList) {
  ------------------
  |  Branch (1677:9): [True: 884, False: 878]
  ------------------
 1678|    884|        uprv_free(buffer);
  ------------------
  |  | 1503|    884|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    884|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    884|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    884|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1679|    884|    }
 1680|  1.76k|    buffer = temp;
 1681|  1.76k|    bufferCapacity = newCapacity;
 1682|  1.76k|    return true;
 1683|  1.76k|}
_ZN6icu_7810UnicodeSet11swapBuffersEv:
 1688|  1.80k|void UnicodeSet::swapBuffers() {
 1689|       |    // swap list and buffer
 1690|  1.80k|    UChar32* temp = list;
 1691|  1.80k|    list = buffer;
 1692|  1.80k|    buffer = temp;
 1693|       |
 1694|  1.80k|    int32_t c = capacity;
 1695|  1.80k|    capacity = bufferCapacity;
 1696|  1.80k|    bufferCapacity = c;
 1697|  1.80k|}
_ZN6icu_7810UnicodeSet3addEPKiia:
 1763|  1.80k|void UnicodeSet::add(const UChar32* other, int32_t otherLen, int8_t polarity) {
 1764|  1.80k|    if (isFrozen() || isBogus() || other==nullptr) {
  ------------------
  |  Branch (1764:9): [True: 0, False: 1.80k]
  |  Branch (1764:23): [True: 0, False: 1.80k]
  |  Branch (1764:36): [True: 0, False: 1.80k]
  ------------------
 1765|      0|        return;
 1766|      0|    }
 1767|  1.80k|    if (!ensureBufferCapacity(len + otherLen)) {
  ------------------
  |  Branch (1767:9): [True: 0, False: 1.80k]
  ------------------
 1768|      0|        return;
 1769|      0|    }
 1770|       |
 1771|  1.80k|    int32_t i = 0, j = 0, k = 0;
 1772|  1.80k|    UChar32 a = list[i++];
 1773|  1.80k|    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|   174k|    for (;;) {
 1777|   174k|        switch (polarity) {
  ------------------
  |  Branch (1777:17): [True: 0, False: 174k]
  ------------------
 1778|  88.2k|          case 0: // both first; take lower if unequal
  ------------------
  |  Branch (1778:11): [True: 88.2k, False: 86.4k]
  ------------------
 1779|  88.2k|            if (a < b) { // take a
  ------------------
  |  Branch (1779:17): [True: 64.3k, False: 23.9k]
  ------------------
 1780|       |                // Back up over overlapping ranges in buffer[]
 1781|  64.3k|                if (k > 0 && a <= buffer[k-1]) {
  ------------------
  |  Branch (1781:21): [True: 63.4k, False: 919]
  |  Branch (1781:30): [True: 6, False: 63.4k]
  ------------------
 1782|       |                    // Pick latter end value in buffer[] vs. list[]
 1783|      6|                    a = max(list[i], buffer[--k]);
 1784|  64.3k|                } else {
 1785|       |                    // No overlap
 1786|  64.3k|                    buffer[k++] = a;
 1787|  64.3k|                    a = list[i];
 1788|  64.3k|                }
 1789|  64.3k|                i++; // Common if/else code factored out
 1790|  64.3k|                polarity ^= 1;
 1791|  64.3k|            } else if (b < a) { // take b
  ------------------
  |  Branch (1791:24): [True: 22.0k, False: 1.81k]
  ------------------
 1792|  22.0k|                if (k > 0 && b <= buffer[k-1]) {
  ------------------
  |  Branch (1792:21): [True: 21.2k, False: 884]
  |  Branch (1792:30): [True: 0, False: 21.2k]
  ------------------
 1793|      0|                    b = max(other[j], buffer[--k]);
 1794|  22.0k|                } else {
 1795|  22.0k|                    buffer[k++] = b;
 1796|  22.0k|                    b = other[j];
 1797|  22.0k|                }
 1798|  22.0k|                j++;
 1799|  22.0k|                polarity ^= 2;
 1800|  22.0k|            } else { // a == b, take a, drop b
 1801|  1.81k|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|  1.81k|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1801:21): [True: 1.80k, False: 10]
  ------------------
 1802|       |                // This is symmetrical; it doesn't matter if
 1803|       |                // we backtrack with a or b. - liu
 1804|     10|                if (k > 0 && a <= buffer[k-1]) {
  ------------------
  |  Branch (1804:21): [True: 10, False: 0]
  |  Branch (1804:30): [True: 0, False: 10]
  ------------------
 1805|      0|                    a = max(list[i], buffer[--k]);
 1806|     10|                } else {
 1807|       |                    // No overlap
 1808|     10|                    buffer[k++] = a;
 1809|     10|                    a = list[i];
 1810|     10|                }
 1811|     10|                i++;
 1812|     10|                polarity ^= 1;
 1813|     10|                b = other[j++];
 1814|     10|                polarity ^= 2;
 1815|     10|            }
 1816|  86.4k|            break;
 1817|  86.4k|          case 3: // both second; take higher if unequal, and drop other
  ------------------
  |  Branch (1817:11): [True: 40, False: 174k]
  ------------------
 1818|     40|            if (b <= a) { // take a
  ------------------
  |  Branch (1818:17): [True: 27, False: 13]
  ------------------
 1819|     27|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|     27|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1819:21): [True: 0, False: 27]
  ------------------
 1820|     27|                buffer[k++] = a;
 1821|     27|            } else { // take b
 1822|     13|                if (b == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|     13|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1822:21): [True: 0, False: 13]
  ------------------
 1823|     13|                buffer[k++] = b;
 1824|     13|            }
 1825|     40|            a = list[i++];
 1826|     40|            polarity ^= 1;   // factored common code
 1827|     40|            b = other[j++];
 1828|     40|            polarity ^= 2;
 1829|     40|            break;
 1830|  64.3k|          case 1: // a second, b first; if b < a, overlap
  ------------------
  |  Branch (1830:11): [True: 64.3k, False: 110k]
  ------------------
 1831|  64.3k|            if (a < b) { // no overlap, take a
  ------------------
  |  Branch (1831:17): [True: 64.2k, False: 36]
  ------------------
 1832|  64.2k|                buffer[k++] = a; a = list[i++]; polarity ^= 1;
 1833|  64.2k|            } else if (b < a) { // OVERLAP, drop b
  ------------------
  |  Branch (1833:24): [True: 30, False: 6]
  ------------------
 1834|     30|                b = other[j++];
 1835|     30|                polarity ^= 2;
 1836|     30|            } else { // a == b, drop both!
 1837|      6|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|      6|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1837:21): [True: 0, False: 6]
  ------------------
 1838|      6|                a = list[i++];
 1839|      6|                polarity ^= 1;
 1840|      6|                b = other[j++];
 1841|      6|                polarity ^= 2;
 1842|      6|            }
 1843|  64.3k|            break;
 1844|  64.3k|          case 2: // a first, b second; if a < b, overlap
  ------------------
  |  Branch (1844:11): [True: 22.0k, False: 152k]
  ------------------
 1845|  22.0k|            if (b < a) { // no overlap, take b
  ------------------
  |  Branch (1845:17): [True: 22.0k, False: 2]
  ------------------
 1846|  22.0k|                buffer[k++] = b;
 1847|  22.0k|                b = other[j++];
 1848|  22.0k|                polarity ^= 2;
 1849|  22.0k|            } else  if (a < b) { // OVERLAP, drop a
  ------------------
  |  Branch (1849:25): [True: 0, False: 2]
  ------------------
 1850|      0|                a = list[i++];
 1851|      0|                polarity ^= 1;
 1852|      2|            } else { // a == b, drop both!
 1853|      2|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|      2|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1853:21): [True: 0, False: 2]
  ------------------
 1854|      2|                a = list[i++];
 1855|      2|                polarity ^= 1;
 1856|      2|                b = other[j++];
 1857|      2|                polarity ^= 2;
 1858|      2|            }
 1859|  22.0k|            break;
 1860|   174k|        }
 1861|   174k|    }
 1862|  1.80k| loop_end:
 1863|  1.80k|    buffer[k++] = UNICODESET_HIGH;    // terminate
  ------------------
  |  |   34|  1.80k|#define UNICODESET_HIGH 0x0110000
  ------------------
 1864|  1.80k|    len = k;
 1865|  1.80k|    swapBuffers();
 1866|  1.80k|    releasePattern();
 1867|  1.80k|}
_ZN6icu_7810UnicodeSet6retainEPKiia:
 1874|      1|void UnicodeSet::retain(const UChar32* other, int32_t otherLen, int8_t polarity) {
 1875|      1|    if (isFrozen() || isBogus()) {
  ------------------
  |  Branch (1875:9): [True: 0, False: 1]
  |  Branch (1875:23): [True: 0, False: 1]
  ------------------
 1876|      0|        return;
 1877|      0|    }
 1878|      1|    if (!ensureBufferCapacity(len + otherLen)) {
  ------------------
  |  Branch (1878:9): [True: 0, False: 1]
  ------------------
 1879|      0|        return;
 1880|      0|    }
 1881|       |
 1882|      1|    int32_t i = 0, j = 0, k = 0;
 1883|      1|    UChar32 a = list[i++];
 1884|      1|    UChar32 b = other[j++];
 1885|       |    // change from xor is that we have to check overlapping pairs
 1886|       |    // polarity bit 1 means a is second, bit 2 means b is.
 1887|      6|    for (;;) {
 1888|      6|        switch (polarity) {
  ------------------
  |  Branch (1888:17): [True: 0, False: 6]
  ------------------
 1889|      1|          case 0: // both first; drop the smaller
  ------------------
  |  Branch (1889:11): [True: 1, False: 5]
  ------------------
 1890|      1|            if (a < b) { // drop a
  ------------------
  |  Branch (1890:17): [True: 1, False: 0]
  ------------------
 1891|      1|                a = list[i++];
 1892|      1|                polarity ^= 1;
 1893|      1|            } else if (b < a) { // drop b
  ------------------
  |  Branch (1893:24): [True: 0, False: 0]
  ------------------
 1894|      0|                b = other[j++];
 1895|      0|                polarity ^= 2;
 1896|      0|            } else { // a == b, take one, drop other
 1897|      0|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|      0|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1897:21): [True: 0, False: 0]
  ------------------
 1898|      0|                buffer[k++] = a;
 1899|      0|                a = list[i++];
 1900|      0|                polarity ^= 1;
 1901|      0|                b = other[j++];
 1902|      0|                polarity ^= 2;
 1903|      0|            }
 1904|      1|            break;
 1905|      2|          case 3: // both second; take lower if unequal
  ------------------
  |  Branch (1905:11): [True: 2, False: 4]
  ------------------
 1906|      2|            if (a < b) { // take a
  ------------------
  |  Branch (1906:17): [True: 0, False: 2]
  ------------------
 1907|      0|                buffer[k++] = a;
 1908|      0|                a = list[i++];
 1909|      0|                polarity ^= 1;
 1910|      2|            } else if (b < a) { // take b
  ------------------
  |  Branch (1910:24): [True: 2, False: 0]
  ------------------
 1911|      2|                buffer[k++] = b;
 1912|      2|                b = other[j++];
 1913|      2|                polarity ^= 2;
 1914|      2|            } else { // a == b, take one, drop other
 1915|      0|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|      0|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1915:21): [True: 0, False: 0]
  ------------------
 1916|      0|                buffer[k++] = a;
 1917|      0|                a = list[i++];
 1918|      0|                polarity ^= 1;
 1919|      0|                b = other[j++];
 1920|      0|                polarity ^= 2;
 1921|      0|            }
 1922|      2|            break;
 1923|      3|          case 1: // a second, b first;
  ------------------
  |  Branch (1923:11): [True: 3, False: 3]
  ------------------
 1924|      3|            if (a < b) { // NO OVERLAP, drop a
  ------------------
  |  Branch (1924:17): [True: 0, False: 3]
  ------------------
 1925|      0|                a = list[i++];
 1926|      0|                polarity ^= 1;
 1927|      3|            } else if (b < a) { // OVERLAP, take b
  ------------------
  |  Branch (1927:24): [True: 2, False: 1]
  ------------------
 1928|      2|                buffer[k++] = b;
 1929|      2|                b = other[j++];
 1930|      2|                polarity ^= 2;
 1931|      2|            } else { // a == b, drop both!
 1932|      1|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|      1|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1932:21): [True: 1, False: 0]
  ------------------
 1933|      0|                a = list[i++];
 1934|      0|                polarity ^= 1;
 1935|      0|                b = other[j++];
 1936|      0|                polarity ^= 2;
 1937|      0|            }
 1938|      2|            break;
 1939|      2|          case 2: // a first, b second; if a < b, overlap
  ------------------
  |  Branch (1939:11): [True: 0, False: 6]
  ------------------
 1940|      0|            if (b < a) { // no overlap, drop b
  ------------------
  |  Branch (1940:17): [True: 0, False: 0]
  ------------------
 1941|      0|                b = other[j++];
 1942|      0|                polarity ^= 2;
 1943|      0|            } else  if (a < b) { // OVERLAP, take a
  ------------------
  |  Branch (1943:25): [True: 0, False: 0]
  ------------------
 1944|      0|                buffer[k++] = a;
 1945|      0|                a = list[i++];
 1946|      0|                polarity ^= 1;
 1947|      0|            } else { // a == b, drop both!
 1948|      0|                if (a == UNICODESET_HIGH) goto loop_end;
  ------------------
  |  |   34|      0|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (1948:21): [True: 0, False: 0]
  ------------------
 1949|      0|                a = list[i++];
 1950|      0|                polarity ^= 1;
 1951|      0|                b = other[j++];
 1952|      0|                polarity ^= 2;
 1953|      0|            }
 1954|      0|            break;
 1955|      6|        }
 1956|      6|    }
 1957|      1| loop_end:
 1958|      1|    buffer[k++] = UNICODESET_HIGH;    // terminate
  ------------------
  |  |   34|      1|#define UNICODESET_HIGH 0x0110000
  ------------------
 1959|      1|    len = k;
 1960|      1|    swapBuffers();
 1961|      1|    releasePattern();
 1962|      1|}
_ZN6icu_7810UnicodeSet12_appendToPatERNS_13UnicodeStringERKS1_a:
 1968|      4|void UnicodeSet::_appendToPat(UnicodeString& buf, const UnicodeString& s, UBool escapeUnprintable) {
 1969|      4|    UChar32 cp;
 1970|     12|    for (int32_t i = 0; i < s.length(); i += U16_LENGTH(cp)) {
  ------------------
  |  |  141|      8|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 8, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1970:25): [True: 8, False: 4]
  ------------------
 1971|      8|        _appendToPat(buf, cp = s.char32At(i), escapeUnprintable);
 1972|      8|    }
 1973|      4|}
_ZN6icu_7810UnicodeSet12_appendToPatERNS_13UnicodeStringEia:
 1979|    172|void UnicodeSet::_appendToPat(UnicodeString& buf, UChar32 c, UBool escapeUnprintable) {
 1980|    172|    if (escapeUnprintable ? ICU_Utility::isUnprintable(c) : ICU_Utility::shouldAlwaysBeEscaped(c)) {
  ------------------
  |  Branch (1980:9): [True: 0, False: 172]
  |  Branch (1980:9): [True: 2, False: 170]
  ------------------
 1981|       |        // Use hex escape notation (\uxxxx or \Uxxxxxxxx) for anything
 1982|       |        // unprintable
 1983|      2|        ICU_Utility::escape(buf, c);
 1984|      2|        return;
 1985|      2|    }
 1986|       |    // Okay to let ':' pass through
 1987|    170|    switch (c) {
 1988|      0|    case u'[':
  ------------------
  |  Branch (1988:5): [True: 0, False: 170]
  ------------------
 1989|      0|    case u']':
  ------------------
  |  Branch (1989:5): [True: 0, False: 170]
  ------------------
 1990|      2|    case u'-':
  ------------------
  |  Branch (1990:5): [True: 2, False: 168]
  ------------------
 1991|      2|    case u'^':
  ------------------
  |  Branch (1991:5): [True: 0, False: 170]
  ------------------
 1992|      2|    case u'&':
  ------------------
  |  Branch (1992:5): [True: 0, False: 170]
  ------------------
 1993|      2|    case u'\\':
  ------------------
  |  Branch (1993:5): [True: 0, False: 170]
  ------------------
 1994|      2|    case u'{':
  ------------------
  |  Branch (1994:5): [True: 0, False: 170]
  ------------------
 1995|      2|    case u'}':
  ------------------
  |  Branch (1995:5): [True: 0, False: 170]
  ------------------
 1996|      2|    case u':':
  ------------------
  |  Branch (1996:5): [True: 0, False: 170]
  ------------------
 1997|      4|    case SymbolTable::SYMBOL_REF:
  ------------------
  |  Branch (1997:5): [True: 2, False: 168]
  ------------------
 1998|      4|        buf.append(u'\\');
 1999|      4|        break;
 2000|    166|    default:
  ------------------
  |  Branch (2000:5): [True: 166, False: 4]
  ------------------
 2001|       |        // Escape whitespace
 2002|    166|        if (PatternProps::isWhiteSpace(c)) {
  ------------------
  |  Branch (2002:13): [True: 2, False: 164]
  ------------------
 2003|      2|            buf.append(u'\\');
 2004|      2|        }
 2005|    166|        break;
 2006|    170|    }
 2007|    170|    buf.append(c);
 2008|    170|}
_ZN6icu_7810UnicodeSet12_appendToPatERNS_13UnicodeStringEiia:
 2011|     77|                              UBool escapeUnprintable) {
 2012|     77|    _appendToPat(result, start, escapeUnprintable);
 2013|     77|    if (start != end) {
  ------------------
  |  Branch (2013:9): [True: 4, False: 73]
  ------------------
 2014|      4|        if ((start+1) != end ||
  ------------------
  |  Branch (2014:13): [True: 2, False: 2]
  ------------------
 2015|       |                // Avoid writing what looks like a lead+trail surrogate pair.
 2016|      4|                start == 0xdbff) {
  ------------------
  |  Branch (2016:17): [True: 0, False: 2]
  ------------------
 2017|      2|            result.append(u'-');
 2018|      2|        }
 2019|      4|        _appendToPat(result, end, escapeUnprintable);
 2020|      4|    }
 2021|     77|}
_ZNK6icu_7810UnicodeSet16_generatePatternERNS_13UnicodeStringEa:
 2082|     17|{
 2083|     17|    result.append(u'[');
 2084|       |
 2085|     17|    int32_t i = 0;
 2086|     17|    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|     17|    if (len >= 4 && list[0] == 0 && limit == len && !hasStrings()) {
  ------------------
  |  Branch (2099:9): [True: 15, False: 2]
  |  Branch (2099:21): [True: 0, False: 15]
  |  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|     94|    while (i < limit) {
  ------------------
  |  Branch (2109:12): [True: 77, False: 17]
  ------------------
 2110|     77|        UChar32 start = list[i];  // getRangeStart()
 2111|     77|        UChar32 end = list[i + 1] - 1;  // getRangeEnd() = range limit minus one
 2112|     77|        if (!(0xd800 <= end && end <= 0xdbff)) {
  ------------------
  |  Branch (2112:15): [True: 27, False: 50]
  |  Branch (2112:32): [True: 0, False: 27]
  ------------------
 2113|     77|            _appendToPat(result, start, end, escapeUnprintable);
 2114|     77|            i += 2;
 2115|     77|        } 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|     77|    }
 2133|       |
 2134|     17|    if (strings_ != nullptr) {
  ------------------
  |  Branch (2134:9): [True: 1, False: 16]
  ------------------
 2135|      3|        for (int32_t i = 0; i<strings_->size(); ++i) {
  ------------------
  |  Branch (2135:29): [True: 2, False: 1]
  ------------------
 2136|      2|            result.append(u'{');
 2137|      2|            _appendToPat(result,
 2138|      2|                         *static_cast<const UnicodeString*>(strings_->elementAt(i)),
 2139|      2|                         escapeUnprintable);
 2140|      2|            result.append(u'}');
 2141|      2|        }
 2142|      1|    }
 2143|     17|    return result.append(u']');
 2144|     17|}
_ZN6icu_7810UnicodeSet14releasePatternEv:
 2149|  19.8k|void UnicodeSet::releasePattern() {
 2150|  19.8k|    if (pat) {
  ------------------
  |  Branch (2150:9): [True: 1, False: 19.8k]
  ------------------
 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|  19.8k|}
_ZN6icu_7810UnicodeSet10setPatternEPKDsi:
 2160|     19|void UnicodeSet::setPattern(const char16_t *newPat, int32_t newPatLen) {
 2161|     19|    releasePattern();
 2162|     19|    pat = static_cast<char16_t*>(uprv_malloc((newPatLen + 1) * sizeof(char16_t)));
  ------------------
  |  | 1524|     19|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2163|     19|    if (pat) {
  ------------------
  |  Branch (2163:9): [True: 19, False: 0]
  ------------------
 2164|     19|        patLen = newPatLen;
 2165|     19|        u_memcpy(pat, newPat, patLen);
  ------------------
  |  |  334|     19|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2166|     19|        pat[patLen] = 0;
 2167|     19|    }
 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|     19|}
_ZN6icu_7810UnicodeSet6freezeEv:
 2172|  1.77k|UnicodeSet *UnicodeSet::freeze() {
 2173|  1.77k|    if(!isFrozen() && !isBogus()) {
  ------------------
  |  Branch (2173:8): [True: 1.77k, False: 4]
  |  Branch (2173:23): [True: 1.77k, False: 0]
  ------------------
 2174|  1.77k|        compact();
 2175|       |
 2176|       |        // Optimize contains() and span() and similar functions.
 2177|  1.77k|        if (hasStrings()) {
  ------------------
  |  Branch (2177:13): [True: 1, False: 1.77k]
  ------------------
 2178|      1|            stringSpan = new UnicodeSetStringSpan(*this, *strings_, UnicodeSetStringSpan::ALL);
 2179|      1|            if (stringSpan == nullptr) {
  ------------------
  |  Branch (2179:17): [True: 0, False: 1]
  ------------------
 2180|      0|                setToBogus();
 2181|      0|                return this;
 2182|      1|            } else if (!stringSpan->needsStringSpanUTF16()) {
  ------------------
  |  Branch (2182:24): [True: 0, False: 1]
  ------------------
 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|      1|        }
 2192|  1.77k|        if (stringSpan == nullptr) {
  ------------------
  |  Branch (2192:13): [True: 1.77k, False: 1]
  ------------------
 2193|       |            // No span-relevant strings: Optimize for code point spans.
 2194|  1.77k|            bmpSet=new BMPSet(list, len);
 2195|  1.77k|            if (bmpSet == nullptr) { // Check for memory allocation error.
  ------------------
  |  Branch (2195:17): [True: 0, False: 1.77k]
  ------------------
 2196|      0|                setToBogus();
 2197|      0|            }
 2198|  1.77k|        }
 2199|  1.77k|    }
 2200|  1.77k|    return this;
 2201|  1.77k|}
_ZNK6icu_7810UnicodeSet4spanEPKDsi17USetSpanCondition:
 2203|      4|int32_t UnicodeSet::span(const char16_t *s, int32_t length, USetSpanCondition spanCondition) const {
 2204|      4|    if(length>0 && bmpSet!=nullptr) {
  ------------------
  |  Branch (2204:8): [True: 4, False: 0]
  |  Branch (2204:20): [True: 2, False: 2]
  ------------------
 2205|      2|        return static_cast<int32_t>(bmpSet->span(s, s + length, spanCondition) - s);
 2206|      2|    }
 2207|      2|    if(length<0) {
  ------------------
  |  Branch (2207:8): [True: 0, False: 2]
  ------------------
 2208|      0|        length=u_strlen(s);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2209|      0|    }
 2210|      2|    if(length==0) {
  ------------------
  |  Branch (2210:8): [True: 0, False: 2]
  ------------------
 2211|      0|        return 0;
 2212|      0|    }
 2213|      2|    if(stringSpan!=nullptr) {
  ------------------
  |  Branch (2213:8): [True: 0, False: 2]
  ------------------
 2214|      0|        return stringSpan->span(s, length, spanCondition);
 2215|      2|    } else if(hasStrings()) {
  ------------------
  |  Branch (2215:15): [True: 0, False: 2]
  ------------------
 2216|      0|        uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ?
  ------------------
  |  Branch (2216:25): [True: 0, False: 0]
  ------------------
 2217|      0|                            UnicodeSetStringSpan::FWD_UTF16_NOT_CONTAINED :
 2218|      0|                            UnicodeSetStringSpan::FWD_UTF16_CONTAINED;
 2219|      0|        UnicodeSetStringSpan strSpan(*this, *strings_, which);
 2220|      0|        if(strSpan.needsStringSpanUTF16()) {
  ------------------
  |  Branch (2220:12): [True: 0, False: 0]
  ------------------
 2221|      0|            return strSpan.span(s, length, spanCondition);
 2222|      0|        }
 2223|      0|    }
 2224|       |
 2225|      2|    if(spanCondition!=USET_SPAN_NOT_CONTAINED) {
  ------------------
  |  Branch (2225:8): [True: 2, False: 0]
  ------------------
 2226|      2|        spanCondition=USET_SPAN_CONTAINED;  // Pin to 0/1 values.
 2227|      2|    }
 2228|       |
 2229|      2|    UChar32 c;
 2230|      2|    int32_t start=0, prev=0;
 2231|      2|    do {
 2232|      2|        U16_NEXT(s, start, length, c);
  ------------------
  |  |  309|      2|#define U16_NEXT(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      2|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  310|      2|    (c)=(s)[(i)++]; \
  |  |  311|      2|    if(U16_IS_LEAD(c)) { \
  |  |  ------------------
  |  |  |  |   59|      2|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  312|      0|        uint16_t __c2; \
  |  |  313|      0|        if((i)!=(length) && U16_IS_TRAIL(__c2=(s)[(i)])) { \
  |  |  ------------------
  |  |  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (313:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  314|      0|            ++(i); \
  |  |  315|      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)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  316|      0|        } \
  |  |  317|      0|    } \
  |  |  318|      2|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      2|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2233|      2|        if(spanCondition!=contains(c)) {
  ------------------
  |  Branch (2233:12): [True: 2, False: 0]
  ------------------
 2234|      2|            break;
 2235|      2|        }
 2236|      2|    } while((prev=start)<length);
  ------------------
  |  Branch (2236:13): [True: 0, False: 0]
  ------------------
 2237|      0|    return prev;
 2238|      2|}
_ZNK6icu_7810UnicodeSet8spanBackEPKDsi17USetSpanCondition:
 2240|      2|int32_t UnicodeSet::spanBack(const char16_t *s, int32_t length, USetSpanCondition spanCondition) const {
 2241|      2|    if(length>0 && bmpSet!=nullptr) {
  ------------------
  |  Branch (2241:8): [True: 2, False: 0]
  |  Branch (2241:20): [True: 2, False: 0]
  ------------------
 2242|      2|        return static_cast<int32_t>(bmpSet->spanBack(s, s + length, spanCondition) - s);
 2243|      2|    }
 2244|      0|    if(length<0) {
  ------------------
  |  Branch (2244:8): [True: 0, False: 0]
  ------------------
 2245|      0|        length=u_strlen(s);
  ------------------
  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2246|      0|    }
 2247|      0|    if(length==0) {
  ------------------
  |  Branch (2247:8): [True: 0, False: 0]
  ------------------
 2248|      0|        return 0;
 2249|      0|    }
 2250|      0|    if(stringSpan!=nullptr) {
  ------------------
  |  Branch (2250:8): [True: 0, False: 0]
  ------------------
 2251|      0|        return stringSpan->spanBack(s, length, spanCondition);
 2252|      0|    } else if(hasStrings()) {
  ------------------
  |  Branch (2252:15): [True: 0, False: 0]
  ------------------
 2253|      0|        uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ?
  ------------------
  |  Branch (2253:25): [True: 0, False: 0]
  ------------------
 2254|      0|                            UnicodeSetStringSpan::BACK_UTF16_NOT_CONTAINED :
 2255|      0|                            UnicodeSetStringSpan::BACK_UTF16_CONTAINED;
 2256|      0|        UnicodeSetStringSpan strSpan(*this, *strings_, which);
 2257|      0|        if(strSpan.needsStringSpanUTF16()) {
  ------------------
  |  Branch (2257:12): [True: 0, False: 0]
  ------------------
 2258|      0|            return strSpan.spanBack(s, length, spanCondition);
 2259|      0|        }
 2260|      0|    }
 2261|       |
 2262|      0|    if(spanCondition!=USET_SPAN_NOT_CONTAINED) {
  ------------------
  |  Branch (2262:8): [True: 0, False: 0]
  ------------------
 2263|      0|        spanCondition=USET_SPAN_CONTAINED;  // Pin to 0/1 values.
 2264|      0|    }
 2265|       |
 2266|      0|    UChar32 c;
 2267|      0|    int32_t prev=length;
 2268|      0|    do {
 2269|      0|        U16_PREV(s, 0, length, c);
  ------------------
  |  |  570|      0|#define U16_PREV(s, start, i, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  571|      0|    (c)=(s)[--(i)]; \
  |  |  572|      0|    if(U16_IS_TRAIL(c)) { \
  |  |  ------------------
  |  |  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  573|      0|        uint16_t __c2; \
  |  |  574|      0|        if((i)>(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \
  |  |  ------------------
  |  |  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (574:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  575|      0|            --(i); \
  |  |  576|      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)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  577|      0|        } \
  |  |  578|      0|    } \
  |  |  579|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2270|      0|        if(spanCondition!=contains(c)) {
  ------------------
  |  Branch (2270:12): [True: 0, False: 0]
  ------------------
 2271|      0|            break;
 2272|      0|        }
 2273|      0|    } while((prev=length)>0);
  ------------------
  |  Branch (2273:13): [True: 0, False: 0]
  ------------------
 2274|      0|    return prev;
 2275|      0|}
_ZNK6icu_7810UnicodeSet8spanUTF8EPKci17USetSpanCondition:
 2277|      2|int32_t UnicodeSet::spanUTF8(const char *s, int32_t length, USetSpanCondition spanCondition) const {
 2278|      2|    if(length>0 && bmpSet!=nullptr) {
  ------------------
  |  Branch (2278:8): [True: 2, False: 0]
  |  Branch (2278:20): [True: 2, False: 0]
  ------------------
 2279|      2|        const uint8_t* s0 = reinterpret_cast<const uint8_t*>(s);
 2280|      2|        return static_cast<int32_t>(bmpSet->spanUTF8(s0, length, spanCondition) - s0);
 2281|      2|    }
 2282|      0|    if(length<0) {
  ------------------
  |  Branch (2282:8): [True: 0, False: 0]
  ------------------
 2283|      0|        length = static_cast<int32_t>(uprv_strlen(s));
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2284|      0|    }
 2285|      0|    if(length==0) {
  ------------------
  |  Branch (2285:8): [True: 0, False: 0]
  ------------------
 2286|      0|        return 0;
 2287|      0|    }
 2288|      0|    if(stringSpan!=nullptr) {
  ------------------
  |  Branch (2288:8): [True: 0, False: 0]
  ------------------
 2289|      0|        return stringSpan->spanUTF8(reinterpret_cast<const uint8_t*>(s), length, spanCondition);
 2290|      0|    } else if(hasStrings()) {
  ------------------
  |  Branch (2290:15): [True: 0, False: 0]
  ------------------
 2291|      0|        uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ?
  ------------------
  |  Branch (2291:25): [True: 0, False: 0]
  ------------------
 2292|      0|                            UnicodeSetStringSpan::FWD_UTF8_NOT_CONTAINED :
 2293|      0|                            UnicodeSetStringSpan::FWD_UTF8_CONTAINED;
 2294|      0|        UnicodeSetStringSpan strSpan(*this, *strings_, which);
 2295|      0|        if(strSpan.needsStringSpanUTF8()) {
  ------------------
  |  Branch (2295:12): [True: 0, False: 0]
  ------------------
 2296|      0|            return strSpan.spanUTF8(reinterpret_cast<const uint8_t*>(s), length, spanCondition);
 2297|      0|        }
 2298|      0|    }
 2299|       |
 2300|      0|    if(spanCondition!=USET_SPAN_NOT_CONTAINED) {
  ------------------
  |  Branch (2300:8): [True: 0, False: 0]
  ------------------
 2301|      0|        spanCondition=USET_SPAN_CONTAINED;  // Pin to 0/1 values.
 2302|      0|    }
 2303|       |
 2304|      0|    UChar32 c;
 2305|      0|    int32_t start=0, prev=0;
 2306|      0|    do {
 2307|      0|        U8_NEXT_OR_FFFD(s, start, length, c);
  ------------------
  |  |  378|      0|#define U8_NEXT_OR_FFFD(s, i, length, c) U8_INTERNAL_NEXT_OR_SUB(s, i, length, c, 0xfffd)
  |  |  ------------------
  |  |  |  |  381|      0|#define U8_INTERNAL_NEXT_OR_SUB(s, i, length, c, sub) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  |  |  ------------------
  |  |  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  |  |  ------------------
  |  |  |  |  382|      0|    (c)=(uint8_t)(s)[(i)++]; \
  |  |  |  |  383|      0|    if(!U8_IS_SINGLE(c)) { \
  |  |  |  |  ------------------
  |  |  |  |  |  |  173|      0|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (383:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  384|      0|        uint8_t __t = 0; \
  |  |  |  |  385|      0|        if((i)!=(length) && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|            /* fetch/validate/assemble all but last trail byte */ \
  |  |  |  |  387|      0|            ((c)>=0xe0 ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:13): [True: 0, False: 0]
  |  |  |  |  |  Branch (387:14): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  388|      0|                ((c)<0xf0 ?  /* U+0800..U+FFFF except surrogates */ \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (388:17): [True: 0, False: 0]
  |  |  |  |  |  Branch (388:18): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  389|      0|                    U8_LEAD3_T1_BITS[(c)&=0xf]&(1<<((__t=(s)[i])>>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 (389:21): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  390|      0|                    (__t&=0x3f, 1) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (390:21): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  391|      0|                :  /* U+10000..U+10FFFF */ \
  |  |  |  |  392|      0|                    ((c)-=0xf0)<=4 && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (392:21): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  393|      0|                    U8_LEAD4_T1_BITS[(__t=(s)[i])>>4]&(1<<(c)) && \
  |  |  |  |  ------------------
  |  |  |  |  |  |  108|      0|#define U8_LEAD4_T1_BITS "\x00\x00\x00\x00\x00\x00\x00\x00\x1E\x0F\x0F\x0F\x00\x00\x00\x00"
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:21): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|                    ((c)=((c)<<6)|(__t&0x3f), ++(i)!=(length)) && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (394:21): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  395|      0|                    (__t=(s)[i]-0x80)<=0x3f) && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:21): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  396|      0|                /* valid second-to-last trail byte */ \
  |  |  |  |  397|      0|                ((c)=((c)<<6)|__t, ++(i)!=(length)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (397:17): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  398|      0|            :  /* U+0080..U+07FF */ \
  |  |  |  |  399|      0|                (c)>=0xc2 && ((c)&=0x1f, 1)) && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (399:17): [True: 0, False: 0]
  |  |  |  |  |  Branch (399:30): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  400|      0|            /* last trail byte */ \
  |  |  |  |  401|      0|            (__t=(s)[i]-0x80)<=0x3f && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (401:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  402|      0|            ((c)=((c)<<6)|__t, ++(i), 1)) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (402:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  403|      0|        } else { \
  |  |  |  |  404|      0|            (c)=(sub);  /* ill-formed*/ \
  |  |  |  |  405|      0|        } \
  |  |  |  |  406|      0|    } \
  |  |  |  |  407|      0|} UPRV_BLOCK_MACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2308|      0|        if(spanCondition!=contains(c)) {
  ------------------
  |  Branch (2308:12): [True: 0, False: 0]
  ------------------
 2309|      0|            break;
 2310|      0|        }
 2311|      0|    } while((prev=start)<length);
  ------------------
  |  Branch (2311:13): [True: 0, False: 0]
  ------------------
 2312|      0|    return prev;
 2313|      0|}
_ZNK6icu_7810UnicodeSet12spanBackUTF8EPKci17USetSpanCondition:
 2315|      2|int32_t UnicodeSet::spanBackUTF8(const char *s, int32_t length, USetSpanCondition spanCondition) const {
 2316|      2|    if(length>0 && bmpSet!=nullptr) {
  ------------------
  |  Branch (2316:8): [True: 2, False: 0]
  |  Branch (2316:20): [True: 2, False: 0]
  ------------------
 2317|      2|        const uint8_t* s0 = reinterpret_cast<const uint8_t*>(s);
 2318|      2|        return bmpSet->spanBackUTF8(s0, length, spanCondition);
 2319|      2|    }
 2320|      0|    if(length<0) {
  ------------------
  |  Branch (2320:8): [True: 0, False: 0]
  ------------------
 2321|      0|        length = static_cast<int32_t>(uprv_strlen(s));
  ------------------
  |  |   37|      0|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2322|      0|    }
 2323|      0|    if(length==0) {
  ------------------
  |  Branch (2323:8): [True: 0, False: 0]
  ------------------
 2324|      0|        return 0;
 2325|      0|    }
 2326|      0|    if(stringSpan!=nullptr) {
  ------------------
  |  Branch (2326:8): [True: 0, False: 0]
  ------------------
 2327|      0|        return stringSpan->spanBackUTF8(reinterpret_cast<const uint8_t*>(s), length, spanCondition);
 2328|      0|    } else if(hasStrings()) {
  ------------------
  |  Branch (2328:15): [True: 0, False: 0]
  ------------------
 2329|      0|        uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ?
  ------------------
  |  Branch (2329:25): [True: 0, False: 0]
  ------------------
 2330|      0|                            UnicodeSetStringSpan::BACK_UTF8_NOT_CONTAINED :
 2331|      0|                            UnicodeSetStringSpan::BACK_UTF8_CONTAINED;
 2332|      0|        UnicodeSetStringSpan strSpan(*this, *strings_, which);
 2333|      0|        if(strSpan.needsStringSpanUTF8()) {
  ------------------
  |  Branch (2333:12): [True: 0, False: 0]
  ------------------
 2334|      0|            return strSpan.spanBackUTF8(reinterpret_cast<const uint8_t*>(s), length, spanCondition);
 2335|      0|        }
 2336|      0|    }
 2337|       |
 2338|      0|    if(spanCondition!=USET_SPAN_NOT_CONTAINED) {
  ------------------
  |  Branch (2338:8): [True: 0, False: 0]
  ------------------
 2339|      0|        spanCondition=USET_SPAN_CONTAINED;  // Pin to 0/1 values.
 2340|      0|    }
 2341|       |
 2342|      0|    UChar32 c;
 2343|      0|    int32_t prev=length;
 2344|      0|    do {
 2345|      0|        U8_PREV_OR_FFFD(s, 0, length, c);
  ------------------
  |  |  757|      0|#define U8_PREV_OR_FFFD(s, start, i, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      0|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  758|      0|    (c)=(uint8_t)(s)[--(i)]; \
  |  |  759|      0|    if(!U8_IS_SINGLE(c)) { \
  |  |  ------------------
  |  |  |  |  173|      0|#define U8_IS_SINGLE(c) (((c)&0x80)==0)
  |  |  ------------------
  |  |  |  Branch (759:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  760|      0|        (c)=utf8_prevCharSafeBody((const uint8_t *)s, start, &(i), c, -3); \
  |  |  ------------------
  |  |  |  | 1921|      0|#define utf8_prevCharSafeBody U_ICU_ENTRY_POINT_RENAME(utf8_prevCharSafeBody)
  |  |  |  |  ------------------
  |  |  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  761|      0|    } \
  |  |  762|      0|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      0|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2346|      0|        if(spanCondition!=contains(c)) {
  ------------------
  |  Branch (2346:12): [True: 0, False: 0]
  ------------------
 2347|      0|            break;
 2348|      0|        }
 2349|      0|    } while((prev=length)>0);
  ------------------
  |  Branch (2349:13): [True: 0, False: 0]
  ------------------
 2350|      0|    return prev;
 2351|      0|}
uniset.cpp:_ZN6icu_78L12pinCodePointERi:
   54|  16.7k|static inline UChar32 pinCodePoint(UChar32& c) {
   55|  16.7k|    if (c < UNICODESET_LOW) {
  ------------------
  |  |   37|  16.7k|#define UNICODESET_LOW 0x000000
  ------------------
  |  Branch (55:9): [True: 0, False: 16.7k]
  ------------------
   56|      0|        c = UNICODESET_LOW;
  ------------------
  |  |   37|      0|#define UNICODESET_LOW 0x000000
  ------------------
   57|  16.7k|    } else if (c > (UNICODESET_HIGH-1)) {
  ------------------
  |  |   34|  16.7k|#define UNICODESET_HIGH 0x0110000
  ------------------
  |  Branch (57:16): [True: 0, False: 16.7k]
  ------------------
   58|      0|        c = (UNICODESET_HIGH-1);
  ------------------
  |  |   34|      0|#define UNICODESET_HIGH 0x0110000
  ------------------
   59|      0|    }
   60|  16.7k|    return c;
   61|  16.7k|}
uniset.cpp:_ZN6icu_78L20compareUnicodeStringE8UElementS0_:
  114|      1|static int32_t U_CALLCONV compareUnicodeString(UElement t1, UElement t2) {
  115|      1|    const UnicodeString& a = *static_cast<const UnicodeString*>(t1.pointer);
  116|      1|    const UnicodeString& b = *static_cast<const UnicodeString*>(t2.pointer);
  117|      1|    return a.compare(b);
  118|      1|}
uniset.cpp:_ZN6icu_78L3maxEii:
 1708|      6|static inline UChar32 max(UChar32 a, UChar32 b) {
 1709|      6|    return (a > b) ? a : b;
  ------------------
  |  Branch (1709:12): [True: 6, False: 0]
  ------------------
 1710|      6|}

_ZN6icu_7810UnicodeSetC2ERKNS_13UnicodeStringER10UErrorCode:
  156|     19|                       UErrorCode& status) {
  157|     19|    applyPattern(pattern, status);
  158|     19|    _dbgct(this);
  159|     19|}
_ZN6icu_7810UnicodeSet12applyPatternERKNS_13UnicodeStringER10UErrorCode:
  166|     19|                                     UErrorCode& status) {
  167|       |    // Equivalent to
  168|       |    //   return applyPattern(pattern, USET_IGNORE_SPACE, nullptr, status);
  169|       |    // but without dependency on closeOver().
  170|     19|    ParsePosition pos(0);
  171|     19|    applyPatternIgnoreSpace(pattern, pos, nullptr, status);
  172|     19|    if (U_FAILURE(status)) return *this;
  ------------------
  |  Branch (172:9): [True: 0, False: 19]
  ------------------
  173|       |
  174|     19|    int32_t i = pos.getIndex();
  175|       |    // Skip over trailing whitespace
  176|     19|    ICU_Utility::skipWhitespace(pattern, i, true);
  177|     19|    if (i != pattern.length()) {
  ------------------
  |  Branch (177:9): [True: 0, False: 19]
  ------------------
  178|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  179|      0|    }
  180|     19|    return *this;
  181|     19|}
_ZN6icu_7810UnicodeSet23applyPatternIgnoreSpaceERKNS_13UnicodeStringERNS_13ParsePositionEPKNS_11SymbolTableER10UErrorCode:
  187|     19|                                    UErrorCode& status) {
  188|     19|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (188:9): [True: 0, False: 19]
  ------------------
  189|      0|        return;
  190|      0|    }
  191|     19|    if (isFrozen()) {
  ------------------
  |  Branch (191:9): [True: 0, False: 19]
  ------------------
  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|     19|    UnicodeString rebuiltPat;
  198|     19|    RuleCharacterIterator chars(pattern, symbols, pos);
  199|     19|    applyPattern(chars, symbols, rebuiltPat, USET_IGNORE_SPACE, nullptr, 0, status);
  200|     19|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (200:9): [True: 0, False: 19]
  ------------------
  201|     19|    if (chars.inVariable()) {
  ------------------
  |  Branch (201:9): [True: 0, False: 19]
  ------------------
  202|       |        // syntaxError(chars, "Extra chars in variable value");
  203|      0|        status = U_MALFORMED_SET;
  204|      0|        return;
  205|      0|    }
  206|     19|    setPattern(rebuiltPat);
  207|     19|}
_ZN6icu_7810UnicodeSet12applyPatternERNS_21RuleCharacterIteratorEPKNS_11SymbolTableERNS_13UnicodeStringEjMS0_FRS0_iEiR10UErrorCode:
  267|     20|                              UErrorCode& ec) {
  268|     20|    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (268:9): [True: 0, False: 20]
  ------------------
  269|     20|    if (depth > MAX_DEPTH) {
  ------------------
  |  Branch (269:9): [True: 0, False: 20]
  ------------------
  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|     20|    int32_t opts = RuleCharacterIterator::PARSE_VARIABLES |
  279|     20|                   RuleCharacterIterator::PARSE_ESCAPES;
  280|     20|    if ((options & USET_IGNORE_SPACE) != 0) {
  ------------------
  |  Branch (280:9): [True: 20, False: 0]
  ------------------
  281|     20|        opts |= RuleCharacterIterator::SKIP_WHITESPACE;
  282|     20|    }
  283|       |
  284|     20|    UnicodeString patLocal, buf;
  285|     20|    UBool usePat = false;
  286|     20|    UnicodeSetPointer scratch;
  287|     20|    RuleCharacterIterator::Pos backup;
  288|       |
  289|       |    // mode: 0=before [, 1=between [...], 2=after ]
  290|       |    // lastItem: 0=none, 1=char, 2=set
  291|     20|    int8_t lastItem = 0, mode = 0;
  292|     20|    UChar32 lastChar = 0;
  293|     20|    char16_t op = 0;
  294|       |
  295|     20|    UBool invert = false;
  296|       |
  297|     20|    clear();
  298|       |
  299|    148|    while (mode != 2 && !chars.atEnd()) {
  ------------------
  |  Branch (299:12): [True: 129, False: 19]
  |  Branch (299:25): [True: 129, False: 0]
  ------------------
  300|    129|        U_ASSERT((lastItem == 0 && op == 0) ||
  ------------------
  |  |   35|    129|#   define U_ASSERT(exp) (void)0
  ------------------
  301|    129|                 (lastItem == 1 && (op == 0 || op == u'-')) ||
  302|    129|                 (lastItem == 2 && (op == 0 || op == u'-' || op == u'&')));
  303|       |
  304|    129|        UChar32 c = 0;
  305|    129|        UBool literal = false;
  306|    129|        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|    129|        int8_t setMode = 0;
  312|    129|        if (resemblesPropertyPattern(chars, opts)) {
  ------------------
  |  Branch (312:13): [True: 5, False: 124]
  ------------------
  313|      5|            setMode = 2;
  314|      5|        }
  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|    124|        else {
  325|       |            // Prepare to backup if necessary
  326|    124|            chars.getPos(backup);
  327|    124|            c = chars.next(opts, literal, ec);
  328|    124|            if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (328:17): [True: 0, False: 124]
  ------------------
  329|       |
  330|    124|            if (c == u'[' && !literal) {
  ------------------
  |  Branch (330:17): [True: 20, False: 104]
  |  Branch (330:30): [True: 20, False: 0]
  ------------------
  331|     20|                if (mode == 1) {
  ------------------
  |  Branch (331:21): [True: 1, False: 19]
  ------------------
  332|      1|                    chars.setPos(backup); // backup
  333|      1|                    setMode = 1;
  334|     19|                } else {
  335|       |                    // Handle opening '[' delimiter
  336|     19|                    mode = 1;
  337|     19|                    patLocal.append(u'[');
  338|     19|                    chars.getPos(backup); // prepare to backup
  339|     19|                    c = chars.next(opts, literal, ec); 
  340|     19|                    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (340:25): [True: 0, False: 19]
  ------------------
  341|     19|                    if (c == u'^' && !literal) {
  ------------------
  |  Branch (341:25): [True: 0, False: 19]
  |  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|     19|                    if (c == u'-') {
  ------------------
  |  Branch (350:25): [True: 1, False: 18]
  ------------------
  351|      1|                        literal = true;
  352|       |                        // Fall through to handle literal '-' below
  353|     18|                    } else {
  354|     18|                        chars.setPos(backup); // backup
  355|     18|                        continue;
  356|     18|                    }
  357|     19|                }
  358|    104|            } else if (symbols != nullptr) {
  ------------------
  |  Branch (358:24): [True: 0, False: 104]
  ------------------
  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|    124|        }
  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|    111|        if (setMode != 0) {
  ------------------
  |  Branch (379:13): [True: 6, False: 105]
  ------------------
  380|      6|            if (lastItem == 1) {
  ------------------
  |  Branch (380:17): [True: 0, False: 6]
  ------------------
  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|      6|            if (op == u'-' || op == u'&') {
  ------------------
  |  Branch (392:17): [True: 0, False: 6]
  |  Branch (392:31): [True: 0, False: 6]
  ------------------
  393|      0|                patLocal.append(op);
  394|      0|            }
  395|       |
  396|      6|            if (nested == nullptr) {
  ------------------
  |  Branch (396:17): [True: 6, False: 0]
  ------------------
  397|       |                // lazy allocation
  398|      6|                if (!scratch.allocate()) {
  ------------------
  |  Branch (398:21): [True: 0, False: 6]
  ------------------
  399|      0|                    ec = U_MEMORY_ALLOCATION_ERROR;
  400|      0|                    return;
  401|      0|                }
  402|      6|                nested = scratch.pointer();
  403|      6|            }
  404|      6|            switch (setMode) {
  ------------------
  |  Branch (404:21): [True: 0, False: 6]
  ------------------
  405|      1|            case 1:
  ------------------
  |  Branch (405:13): [True: 1, False: 5]
  ------------------
  406|      1|                nested->applyPattern(chars, symbols, patLocal, options, caseClosure, depth + 1, ec);
  407|      1|                break;
  408|      5|            case 2:
  ------------------
  |  Branch (408:13): [True: 5, False: 1]
  ------------------
  409|      5|                chars.skipIgnored(opts);
  410|      5|                nested->applyPropertyPattern(chars, patLocal, ec);
  411|      5|                if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (411:21): [True: 0, False: 5]
  ------------------
  412|      5|                break;
  413|      5|            case 3: // `nested' already parsed
  ------------------
  |  Branch (413:13): [True: 0, False: 6]
  ------------------
  414|      0|                nested->_toPattern(patLocal, false);
  415|      0|                break;
  416|      6|            }
  417|       |
  418|      6|            usePat = true;
  419|       |
  420|      6|            if (mode == 0) {
  ------------------
  |  Branch (420:17): [True: 1, False: 5]
  ------------------
  421|       |                // Entire pattern is a category; leave parse loop
  422|      1|                *this = *nested;
  423|      1|                mode = 2;
  424|      1|                break;
  425|      1|            }
  426|       |
  427|      5|            switch (op) {
  ------------------
  |  Branch (427:21): [True: 0, False: 5]
  ------------------
  428|      0|            case u'-':
  ------------------
  |  Branch (428:13): [True: 0, False: 5]
  ------------------
  429|      0|                removeAll(*nested);
  430|      0|                break;
  431|      0|            case u'&':
  ------------------
  |  Branch (431:13): [True: 0, False: 5]
  ------------------
  432|      0|                retainAll(*nested);
  433|      0|                break;
  434|      5|            case 0:
  ------------------
  |  Branch (434:13): [True: 5, False: 0]
  ------------------
  435|      5|                addAll(*nested);
  436|      5|                break;
  437|      5|            }
  438|       |
  439|      5|            op = 0;
  440|      5|            lastItem = 2;
  441|       |
  442|      5|            continue;
  443|      5|        }
  444|       |
  445|    105|        if (mode == 0) {
  ------------------
  |  Branch (445:13): [True: 0, False: 105]
  ------------------
  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|    105|        if (!literal) {
  ------------------
  |  Branch (455:13): [True: 96, False: 9]
  ------------------
  456|     96|            switch (c) {
  457|     19|            case u']':
  ------------------
  |  Branch (457:13): [True: 19, False: 77]
  ------------------
  458|     19|                if (lastItem == 1) {
  ------------------
  |  Branch (458:21): [True: 17, False: 2]
  ------------------
  459|     17|                    add(lastChar, lastChar);
  460|     17|                    _appendToPat(patLocal, lastChar, false);
  461|     17|                }
  462|       |                // Treat final trailing '-' as a literal
  463|     19|                if (op == u'-') {
  ------------------
  |  Branch (463:21): [True: 0, False: 19]
  ------------------
  464|      0|                    add(op, op);
  465|      0|                    patLocal.append(op);
  466|     19|                } else if (op == u'&') {
  ------------------
  |  Branch (466:28): [True: 0, False: 19]
  ------------------
  467|       |                    // syntaxError(chars, "Trailing '&'");
  468|      0|                    ec = U_MALFORMED_SET;
  469|      0|                    return;
  470|      0|                }
  471|     19|                patLocal.append(u']');
  472|     19|                mode = 2;
  473|     19|                continue;
  474|      1|            case u'-':
  ------------------
  |  Branch (474:13): [True: 1, False: 95]
  ------------------
  475|      1|                if (op == 0) {
  ------------------
  |  Branch (475:21): [True: 1, False: 0]
  ------------------
  476|      1|                    if (lastItem != 0) {
  ------------------
  |  Branch (476:25): [True: 1, False: 0]
  ------------------
  477|      1|                        op = static_cast<char16_t>(c);
  478|      1|                        continue;
  479|      1|                    } 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|      1|                }
  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: 96]
  ------------------
  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: 96]
  ------------------
  503|       |                // syntaxError(chars, "'^' not after '['");
  504|      0|                ec = U_MALFORMED_SET;
  505|      0|                return;
  506|      2|            case u'{':
  ------------------
  |  Branch (506:13): [True: 2, False: 94]
  ------------------
  507|      2|                if (op != 0) {
  ------------------
  |  Branch (507:21): [True: 0, False: 2]
  ------------------
  508|       |                    // syntaxError(chars, "Missing operand after operator");
  509|      0|                    ec = U_MALFORMED_SET;
  510|      0|                    return;
  511|      0|                }
  512|      2|                if (lastItem == 1) {
  ------------------
  |  Branch (512:21): [True: 1, False: 1]
  ------------------
  513|      1|                    add(lastChar, lastChar);
  514|      1|                    _appendToPat(patLocal, lastChar, false);
  515|      1|                }
  516|      2|                lastItem = 0;
  517|      2|                buf.truncate(0);
  518|      2|                {
  519|      2|                    UBool ok = false;
  520|      6|                    while (!chars.atEnd()) {
  ------------------
  |  Branch (520:28): [True: 6, False: 0]
  ------------------
  521|      6|                        c = chars.next(opts, literal, ec);
  522|      6|                        if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (522:29): [True: 0, False: 6]
  ------------------
  523|      6|                        if (c == u'}' && !literal) {
  ------------------
  |  Branch (523:29): [True: 2, False: 4]
  |  Branch (523:42): [True: 2, False: 0]
  ------------------
  524|      2|                            ok = true;
  525|      2|                            break;
  526|      2|                        }
  527|      4|                        buf.append(c);
  528|      4|                    }
  529|      2|                    if (!ok) {
  ------------------
  |  Branch (529:25): [True: 0, False: 2]
  ------------------
  530|       |                        // syntaxError(chars, "Invalid multicharacter string");
  531|      0|                        ec = U_MALFORMED_SET;
  532|      0|                        return;
  533|      0|                    }
  534|      2|                }
  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|      2|                add(buf);
  539|      2|                patLocal.append(u'{');
  540|      2|                _appendToPat(patLocal, buf, false);
  541|      2|                patLocal.append(u'}');
  542|      2|                continue;
  543|      1|            case SymbolTable::SYMBOL_REF:
  ------------------
  |  Branch (543:13): [True: 1, False: 95]
  ------------------
  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|      1|                {
  551|      1|                    chars.getPos(backup);
  552|      1|                    c = chars.next(opts, literal, ec);
  553|      1|                    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (553:25): [True: 0, False: 1]
  ------------------
  554|      1|                    UBool anchor = (c == u']' && !literal);
  ------------------
  |  Branch (554:37): [True: 0, False: 1]
  |  Branch (554:50): [True: 0, False: 0]
  ------------------
  555|      1|                    if (symbols == nullptr && !anchor) {
  ------------------
  |  Branch (555:25): [True: 1, False: 0]
  |  Branch (555:47): [True: 1, False: 0]
  ------------------
  556|      1|                        c = SymbolTable::SYMBOL_REF;
  557|      1|                        chars.setPos(backup);
  558|      1|                        break; // literal '$'
  559|      1|                    }
  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|     73|            default:
  ------------------
  |  Branch (576:13): [True: 73, False: 23]
  ------------------
  577|     73|                break;
  578|     96|            }
  579|     96|        }
  580|       |
  581|       |        // -------- Parse literal characters.  This includes both
  582|       |        // escaped chars ("\u4E01") and non-syntax characters
  583|       |        // ("a").
  584|       |
  585|     83|        switch (lastItem) {
  ------------------
  |  Branch (585:17): [True: 0, False: 83]
  ------------------
  586|     19|        case 0:
  ------------------
  |  Branch (586:9): [True: 19, False: 64]
  ------------------
  587|     19|            lastItem = 1;
  588|     19|            lastChar = c;
  589|     19|            break;
  590|     64|        case 1:
  ------------------
  |  Branch (590:9): [True: 64, False: 19]
  ------------------
  591|     64|            if (op == u'-') {
  ------------------
  |  Branch (591:17): [True: 1, False: 63]
  ------------------
  592|      1|                if (lastChar >= c) {
  ------------------
  |  Branch (592:21): [True: 0, False: 1]
  ------------------
  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|      1|                add(lastChar, c);
  600|      1|                _appendToPat(patLocal, lastChar, false);
  601|      1|                patLocal.append(op);
  602|      1|                _appendToPat(patLocal, c, false);
  603|      1|                lastItem = 0;
  604|      1|                op = 0;
  605|     63|            } else {
  606|     63|                add(lastChar, lastChar);
  607|     63|                _appendToPat(patLocal, lastChar, false);
  608|     63|                lastChar = c;
  609|     63|            }
  610|     64|            break;
  611|     64|        case 2:
  ------------------
  |  Branch (611:9): [True: 0, False: 83]
  ------------------
  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|     83|        }
  621|     83|    }
  622|       |
  623|     20|    if (mode != 2) {
  ------------------
  |  Branch (623:9): [True: 0, False: 20]
  ------------------
  624|       |        // syntaxError(chars, "Missing ']'");
  625|      0|        ec = U_MALFORMED_SET;
  626|      0|        return;
  627|      0|    }
  628|       |
  629|     20|    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|     20|    if ((options & USET_CASE_MASK) != 0) {
  ------------------
  |  Branch (637:9): [True: 0, False: 20]
  ------------------
  638|      0|        (this->*caseClosure)(options);
  639|      0|    }
  640|     20|    if (invert) {
  ------------------
  |  Branch (640:9): [True: 0, False: 20]
  ------------------
  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|     20|    if (usePat) {
  ------------------
  |  Branch (646:9): [True: 3, False: 17]
  ------------------
  647|      3|        rebuiltPat.append(patLocal);
  648|     17|    } else {
  649|     17|        _generatePattern(rebuiltPat, false);
  650|     17|    }
  651|     20|    if (isBogus() && U_SUCCESS(ec)) {
  ------------------
  |  Branch (651:9): [True: 0, False: 20]
  |  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|     20|}
_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: 770, False: 11.2k]
  ------------------
  734|    770|                if (startHasProperty < 0) {
  ------------------
  |  Branch (734:21): [True: 78, False: 692]
  ------------------
  735|     78|                    startHasProperty = ch;
  736|     78|                }
  737|  11.2k|            } else if (startHasProperty >= 0) {
  ------------------
  |  Branch (737:24): [True: 78, False: 11.1k]
  ------------------
  738|     78|                add(startHasProperty, ch-1);
  739|     78|                startHasProperty = -1;
  740|     78|            }
  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|      5|UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) {
  784|      5|    if (U_FAILURE(ec) || isFrozen()) { return *this; }
  ------------------
  |  Branch (784:9): [True: 0, False: 5]
  |  Branch (784:26): [True: 0, False: 5]
  ------------------
  785|      5|    if (prop == UCHAR_GENERAL_CATEGORY_MASK) {
  ------------------
  |  Branch (785:9): [True: 2, False: 3]
  ------------------
  786|      2|        const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec);
  787|      2|        applyFilter(generalCategoryMaskFilter, &value, inclusions, ec);
  788|      3|    } else if (prop == UCHAR_SCRIPT_EXTENSIONS) {
  ------------------
  |  Branch (788:16): [True: 0, False: 3]
  ------------------
  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|      3|    } else if (prop == UCHAR_IDENTIFIER_TYPE) {
  ------------------
  |  Branch (792:16): [True: 0, False: 3]
  ------------------
  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|      3|    } else if (0 <= prop && prop < UCHAR_BINARY_LIMIT) {
  ------------------
  |  Branch (796:16): [True: 3, False: 0]
  |  Branch (796:29): [True: 3, False: 0]
  ------------------
  797|      3|        if (value == 0 || value == 1) {
  ------------------
  |  Branch (797:13): [True: 0, False: 3]
  |  Branch (797:27): [True: 3, False: 0]
  ------------------
  798|      3|            const USet *set = u_getBinaryPropertySet(prop, &ec);
  ------------------
  |  |  269|      3|#define u_getBinaryPropertySet U_ICU_ENTRY_POINT_RENAME(u_getBinaryPropertySet)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  799|      3|            if (U_FAILURE(ec)) { return *this; }
  ------------------
  |  Branch (799:17): [True: 0, False: 3]
  ------------------
  800|      3|            copyFrom(*UnicodeSet::fromUSet(set), true);
  801|      3|            if (value == 0) {
  ------------------
  |  Branch (801:17): [True: 0, False: 3]
  ------------------
  802|      0|                complement().removeAllStrings();  // code point complement
  803|      0|            }
  804|      3|        } else {
  805|      0|            clear();
  806|      0|        }
  807|      3|    } 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|      5|    return *this;
  815|      5|}
_ZN6icu_7810UnicodeSet18applyPropertyAliasERKNS_13UnicodeStringES3_R10UErrorCode:
  820|      5|                               UErrorCode& ec) {
  821|      5|    if (U_FAILURE(ec) || isFrozen()) return *this;
  ------------------
  |  Branch (821:9): [True: 0, False: 5]
  |  Branch (821:26): [True: 0, False: 5]
  ------------------
  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|      5|    if( !uprv_isInvariantUString(prop.getBuffer(), prop.length()) ||
  ------------------
  |  | 1518|      5|#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (829:9): [True: 0, False: 5]
  ------------------
  830|      5|        !uprv_isInvariantUString(value.getBuffer(), value.length())
  ------------------
  |  | 1518|      5|#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (830:9): [True: 0, False: 5]
  ------------------
  831|      5|    ) {
  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|      5|    CharString pname, vname;
  835|      5|    pname.appendInvariantChars(prop, ec);
  836|      5|    vname.appendInvariantChars(value, ec);
  837|      5|    if (U_FAILURE(ec)) return *this;
  ------------------
  |  Branch (837:9): [True: 0, False: 5]
  ------------------
  838|       |
  839|      5|    UProperty p;
  840|      5|    int32_t v;
  841|      5|    UBool invert = false;
  842|       |
  843|      5|    if (value.length() > 0) {
  ------------------
  |  Branch (843:9): [True: 0, False: 5]
  ------------------
  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|      5|    else {
  945|       |        // value is empty.  Interpret as General Category, Script, or
  946|       |        // Binary property.
  947|      5|        p = UCHAR_GENERAL_CATEGORY_MASK;
  948|      5|        v = u_getPropertyValueEnum(p, pname.data());
  ------------------
  |  |  285|      5|#define u_getPropertyValueEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyValueEnum)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  949|      5|        if (v == UCHAR_INVALID_CODE) {
  ------------------
  |  Branch (949:13): [True: 3, False: 2]
  ------------------
  950|      3|            p = UCHAR_SCRIPT;
  951|      3|            v = u_getPropertyValueEnum(p, pname.data());
  ------------------
  |  |  285|      3|#define u_getPropertyValueEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyValueEnum)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  952|      3|            if (v == UCHAR_INVALID_CODE) {
  ------------------
  |  Branch (952:17): [True: 3, False: 0]
  ------------------
  953|      3|                p = u_getPropertyEnum(pname.data());
  ------------------
  |  |  283|      3|#define u_getPropertyEnum U_ICU_ENTRY_POINT_RENAME(u_getPropertyEnum)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  954|      3|                if (p >= UCHAR_BINARY_START && p < UCHAR_BINARY_LIMIT) {
  ------------------
  |  Branch (954:21): [True: 3, False: 0]
  |  Branch (954:48): [True: 3, False: 0]
  ------------------
  955|      3|                    v = 1;
  956|      3|                } 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|      3|            }
  971|      3|        }
  972|      5|    }
  973|       |
  974|      5|    applyIntPropertyValue(p, v, ec);
  975|      5|    if(invert) {
  ------------------
  |  Branch (975:8): [True: 0, False: 5]
  ------------------
  976|      0|        complement().removeAllStrings();  // code point complement
  977|      0|    }
  978|       |
  979|      5|    if (isBogus() && U_SUCCESS(ec)) {
  ------------------
  |  Branch (979:9): [True: 0, False: 5]
  |  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|      5|    return *this;
  984|      5|}
_ZN6icu_7810UnicodeSet24resemblesPropertyPatternERNS_21RuleCharacterIteratorEi:
 1014|    129|                                           int32_t iterOpts) {
 1015|       |    // NOTE: literal will always be false, because we don't parse escapes.
 1016|    129|    UBool result = false, literal;
 1017|    129|    UErrorCode ec = U_ZERO_ERROR;
 1018|    129|    iterOpts &= ~RuleCharacterIterator::PARSE_ESCAPES;
 1019|    129|    RuleCharacterIterator::Pos pos;
 1020|    129|    chars.getPos(pos);
 1021|    129|    UChar32 c = chars.next(iterOpts, literal, ec);
 1022|    129|    if (c == u'[' || c == u'\\') {
  ------------------
  |  Branch (1022:9): [True: 25, False: 104]
  |  Branch (1022:22): [True: 8, False: 96]
  ------------------
 1023|     33|        UChar32 d = chars.next(iterOpts & ~RuleCharacterIterator::SKIP_WHITESPACE,
 1024|     33|                               literal, ec);
 1025|     33|        result = (c == u'[') ? (d == u':') :
  ------------------
  |  Branch (1025:18): [True: 25, False: 8]
  ------------------
 1026|     33|                               (d == u'N' || d == u'p' || d == u'P');
  ------------------
  |  Branch (1026:33): [True: 0, False: 8]
  |  Branch (1026:46): [True: 0, False: 8]
  |  Branch (1026:59): [True: 0, False: 8]
  ------------------
 1027|     33|    }
 1028|    129|    chars.setPos(pos);
 1029|    129|    return result && U_SUCCESS(ec);
  ------------------
  |  Branch (1029:12): [True: 5, False: 124]
  |  Branch (1029:22): [True: 5, False: 0]
  ------------------
 1030|    129|}
_ZN6icu_7810UnicodeSet20applyPropertyPatternERKNS_13UnicodeStringERNS_13ParsePositionER10UErrorCode:
 1037|      5|                                             UErrorCode &ec) {
 1038|      5|    int32_t pos = ppos.getIndex();
 1039|       |
 1040|      5|    UBool posix = false; // true for [:pat:], false for \p{pat} \P{pat} \N{pat}
 1041|      5|    UBool isName = false; // true for \N{pat}, o/w false
 1042|      5|    UBool invert = false;
 1043|       |
 1044|      5|    if (U_FAILURE(ec)) return *this;
  ------------------
  |  Branch (1044:9): [True: 0, False: 5]
  ------------------
 1045|       |
 1046|       |    // Minimum length is 5 characters, e.g. \p{L}
 1047|      5|    if ((pos+5) > pattern.length()) {
  ------------------
  |  Branch (1047:9): [True: 0, False: 5]
  ------------------
 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|      5|    if (isPOSIXOpen(pattern, pos)) {
  ------------------
  |  Branch (1053:9): [True: 5, False: 0]
  ------------------
 1054|      5|        posix = true;
 1055|      5|        pos += 2;
 1056|      5|        pos = ICU_Utility::skipWhitespace(pattern, pos);
 1057|      5|        if (pos < pattern.length() && pattern.charAt(pos) == u'^') {
  ------------------
  |  Branch (1057:13): [True: 5, False: 0]
  |  Branch (1057:39): [True: 0, False: 5]
  ------------------
 1058|      0|            ++pos;
 1059|      0|            invert = true;
 1060|      0|        }
 1061|      5|    } 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|      5|    int32_t close;
 1078|      5|    if (posix) {
  ------------------
  |  Branch (1078:9): [True: 5, False: 0]
  ------------------
 1079|      5|      close = pattern.indexOf(u":]", 2, pos);
 1080|      5|    } else {
 1081|      0|      close = pattern.indexOf(u'}', pos);
 1082|      0|    }
 1083|      5|    if (close < 0) {
  ------------------
  |  Branch (1083:9): [True: 0, False: 5]
  ------------------
 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|      5|    int32_t equals = pattern.indexOf(u'=', pos);
 1092|      5|    UnicodeString propName, valueName;
 1093|      5|    if (equals >= 0 && equals < close && !isName) {
  ------------------
  |  Branch (1093:9): [True: 0, False: 5]
  |  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|      5|    else {
 1100|       |        // Handle case where no '=' is seen, and \N{}
 1101|      5|        pattern.extractBetween(pos, close, propName);
 1102|       |            
 1103|       |        // Handle \N{name}
 1104|      5|        if (isName) {
  ------------------
  |  Branch (1104:13): [True: 0, False: 5]
  ------------------
 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|      5|    }
 1114|       |
 1115|      5|    applyPropertyAlias(propName, valueName, ec);
 1116|       |
 1117|      5|    if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (1117:9): [True: 5, False: 0]
  ------------------
 1118|      5|        if (invert) {
  ------------------
  |  Branch (1118:13): [True: 0, False: 5]
  ------------------
 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|      5|        ppos.setIndex(close + (posix ? 2 : 1));
  ------------------
  |  Branch (1124:32): [True: 5, False: 0]
  ------------------
 1125|      5|    }
 1126|       |
 1127|      5|    return *this;
 1128|      5|}
_ZN6icu_7810UnicodeSet20applyPropertyPatternERNS_21RuleCharacterIteratorERNS_13UnicodeStringER10UErrorCode:
 1141|      5|                                      UErrorCode& ec) {
 1142|      5|    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (1142:9): [True: 0, False: 5]
  ------------------
 1143|      5|    UnicodeString pattern;
 1144|      5|    chars.lookahead(pattern);
 1145|      5|    ParsePosition pos(0);
 1146|      5|    applyPropertyPattern(pattern, pos, ec);
 1147|      5|    if (U_FAILURE(ec)) return;
  ------------------
  |  Branch (1147:9): [True: 0, False: 5]
  ------------------
 1148|      5|    if (pos.getIndex() == 0) {
  ------------------
  |  Branch (1148:9): [True: 0, False: 5]
  ------------------
 1149|       |        // syntaxError(chars, "Invalid property pattern");
 1150|      0|        ec = U_MALFORMED_SET;
 1151|      0|        return;
 1152|      0|    }
 1153|      5|    chars.jumpahead(pos.getIndex());
 1154|      5|    rebuiltPat.append(pattern, 0, pos.getIndex());
 1155|      5|}
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117UnicodeSetPointerC2Ev:
  232|     20|    inline UnicodeSetPointer() : p(nullptr) {}
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117UnicodeSetPointer8allocateEv:
  235|      6|    inline UBool allocate() {
  236|      6|        if (p == nullptr) {
  ------------------
  |  Branch (236:13): [True: 3, False: 3]
  ------------------
  237|      3|            p = new UnicodeSet();
  238|      3|        }
  239|      6|        return p != nullptr;
  240|      6|    }
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117UnicodeSetPointer7pointerEv:
  234|      6|    inline UnicodeSet* pointer() { return p; }
uniset_props.cpp:_ZN6icu_7812_GLOBAL__N_117UnicodeSetPointerD2Ev:
  233|     20|    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|      5|isPOSIXOpen(const UnicodeString &pattern, int32_t pos) {
  130|      5|    return pattern.charAt(pos)==u'[' && pattern.charAt(pos+1)==u':';
  ------------------
  |  Branch (130:12): [True: 5, False: 0]
  |  Branch (130:41): [True: 5, False: 0]
  ------------------
  131|      5|}

_ZN6icu_7820UnicodeSetStringSpanC2ERKNS_10UnicodeSetERKNS_7UVectorEj:
  207|      1|        : spanSet(0, 0x10ffff), pSpanNotSet(nullptr), strings(setStrings),
  208|      1|          utf8Lengths(nullptr), spanLengths(nullptr), utf8(nullptr),
  209|      1|          utf8Length(0),
  210|      1|          maxLength16(0), maxLength8(0),
  211|      1|          all(static_cast<UBool>(which == ALL)) {
  212|      1|    spanSet.retainAll(set);
  213|      1|    if(which&NOT_CONTAINED) {
  ------------------
  |  Branch (213:8): [True: 1, False: 0]
  ------------------
  214|       |        // Default to the same sets.
  215|       |        // addToSpanNotSet() will create a separate set if necessary.
  216|      1|        pSpanNotSet=&spanSet;
  217|      1|    }
  218|       |
  219|       |    // Determine if the strings even need to be taken into account at all for span() etc.
  220|       |    // If any string is relevant, then all strings need to be used for
  221|       |    // span(longest match) but only the relevant ones for span(while contained).
  222|       |    // TODO: Possible optimization: Distinguish CONTAINED vs. LONGEST_MATCH
  223|       |    //   and do not store UTF-8 strings if !thisRelevant and CONTAINED.
  224|       |    //   (Only store irrelevant UTF-8 strings for LONGEST_MATCH where they are relevant after all.)
  225|       |    // Also count the lengths of the UTF-8 versions of the strings for memory allocation.
  226|      1|    int32_t stringsLength=strings.size();
  227|       |
  228|      1|    int32_t i, spanLength;
  229|      1|    UBool someRelevant=false;
  230|      3|    for(i=0; i<stringsLength; ++i) {
  ------------------
  |  Branch (230:14): [True: 2, False: 1]
  ------------------
  231|      2|        const UnicodeString& string = *static_cast<const UnicodeString*>(strings.elementAt(i));
  232|      2|        const char16_t *s16=string.getBuffer();
  233|      2|        int32_t length16=string.length();
  234|      2|        if (length16==0) {
  ------------------
  |  Branch (234:13): [True: 0, False: 2]
  ------------------
  235|      0|            continue;  // skip the empty string
  236|      0|        }
  237|      2|        UBool thisRelevant;
  238|      2|        spanLength=spanSet.span(s16, length16, USET_SPAN_CONTAINED);
  239|      2|        if(spanLength<length16) {  // Relevant string.
  ------------------
  |  Branch (239:12): [True: 2, False: 0]
  ------------------
  240|      2|            someRelevant=thisRelevant=true;
  241|      2|        } else {
  242|      0|            thisRelevant=false;
  243|      0|        }
  244|      2|        if((which&UTF16) && length16>maxLength16) {
  ------------------
  |  Branch (244:12): [True: 2, False: 0]
  |  Branch (244:29): [True: 1, False: 1]
  ------------------
  245|      1|            maxLength16=length16;
  246|      1|        }
  247|      2|        if((which&UTF8) && (thisRelevant || (which&CONTAINED))) {
  ------------------
  |  Branch (247:12): [True: 2, False: 0]
  |  Branch (247:29): [True: 2, False: 0]
  |  Branch (247:45): [True: 0, False: 0]
  ------------------
  248|      2|            int32_t length8=getUTF8Length(s16, length16);
  249|      2|            utf8Length+=length8;
  250|      2|            if(length8>maxLength8) {
  ------------------
  |  Branch (250:16): [True: 1, False: 1]
  ------------------
  251|      1|                maxLength8=length8;
  252|      1|            }
  253|      2|        }
  254|      2|    }
  255|      1|    if(!someRelevant) {
  ------------------
  |  Branch (255:8): [True: 0, False: 1]
  ------------------
  256|      0|        maxLength16=maxLength8=0;
  257|      0|        return;
  258|      0|    }
  259|       |
  260|       |    // Freeze after checking for the need to use strings at all because freezing
  261|       |    // a set takes some time and memory which are wasted if there are no relevant strings.
  262|      1|    if(all) {
  ------------------
  |  Branch (262:8): [True: 1, False: 0]
  ------------------
  263|      1|        spanSet.freeze();
  264|      1|    }
  265|       |
  266|      1|    uint8_t *spanBackLengths;
  267|      1|    uint8_t *spanUTF8Lengths;
  268|      1|    uint8_t *spanBackUTF8Lengths;
  269|       |
  270|       |    // Allocate a block of meta data.
  271|      1|    int32_t allocSize;
  272|      1|    if(all) {
  ------------------
  |  Branch (272:8): [True: 1, False: 0]
  ------------------
  273|       |        // UTF-8 lengths, 4 sets of span lengths, UTF-8 strings.
  274|      1|        allocSize=stringsLength*(4+1+1+1+1)+utf8Length;
  275|      1|    } else {
  276|      0|        allocSize=stringsLength;  // One set of span lengths.
  277|      0|        if(which&UTF8) {
  ------------------
  |  Branch (277:12): [True: 0, False: 0]
  ------------------
  278|       |            // UTF-8 lengths and UTF-8 strings.
  279|      0|            allocSize+=stringsLength*4+utf8Length;
  280|      0|        }
  281|      0|    }
  282|      1|    if (allocSize <= static_cast<int32_t>(sizeof(staticLengths))) {
  ------------------
  |  Branch (282:9): [True: 1, False: 0]
  ------------------
  283|      1|        utf8Lengths=staticLengths;
  284|      1|    } else {
  285|      0|        utf8Lengths = static_cast<int32_t*>(uprv_malloc(allocSize));
  ------------------
  |  | 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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  286|      0|        if(utf8Lengths==nullptr) {
  ------------------
  |  Branch (286:12): [True: 0, False: 0]
  ------------------
  287|      0|            maxLength16=maxLength8=0;  // Prevent usage by making needsStringSpanUTF16/8() return false.
  288|      0|            return;  // Out of memory.
  289|      0|        }
  290|      0|    }
  291|       |
  292|      1|    if(all) {
  ------------------
  |  Branch (292:8): [True: 1, False: 0]
  ------------------
  293|       |        // Store span lengths for all span() variants.
  294|      1|        spanLengths = reinterpret_cast<uint8_t*>(utf8Lengths + stringsLength);
  295|      1|        spanBackLengths=spanLengths+stringsLength;
  296|      1|        spanUTF8Lengths=spanBackLengths+stringsLength;
  297|      1|        spanBackUTF8Lengths=spanUTF8Lengths+stringsLength;
  298|      1|        utf8=spanBackUTF8Lengths+stringsLength;
  299|      1|    } else {
  300|       |        // Store span lengths for only one span() variant.
  301|      0|        if(which&UTF8) {
  ------------------
  |  Branch (301:12): [True: 0, False: 0]
  ------------------
  302|      0|            spanLengths = reinterpret_cast<uint8_t*>(utf8Lengths + stringsLength);
  303|      0|            utf8=spanLengths+stringsLength;
  304|      0|        } else {
  305|      0|            spanLengths = reinterpret_cast<uint8_t*>(utf8Lengths);
  306|      0|        }
  307|      0|        spanBackLengths=spanUTF8Lengths=spanBackUTF8Lengths=spanLengths;
  308|      0|    }
  309|       |
  310|       |    // Set the meta data and pSpanNotSet and write the UTF-8 strings.
  311|      1|    int32_t utf8Count=0;  // Count UTF-8 bytes written so far.
  312|       |
  313|      3|    for(i=0; i<stringsLength; ++i) {
  ------------------
  |  Branch (313:14): [True: 2, False: 1]
  ------------------
  314|      2|        const UnicodeString& string = *static_cast<const UnicodeString*>(strings.elementAt(i));
  315|      2|        const char16_t *s16=string.getBuffer();
  316|      2|        int32_t length16=string.length();
  317|      2|        spanLength=spanSet.span(s16, length16, USET_SPAN_CONTAINED);
  318|      2|        if(spanLength<length16 && length16>0) {  // Relevant string.
  ------------------
  |  Branch (318:12): [True: 2, False: 0]
  |  Branch (318:35): [True: 2, False: 0]
  ------------------
  319|      2|            if(which&UTF16) {
  ------------------
  |  Branch (319:16): [True: 2, False: 0]
  ------------------
  320|      2|                if(which&CONTAINED) {
  ------------------
  |  Branch (320:20): [True: 2, False: 0]
  ------------------
  321|      2|                    if(which&FWD) {
  ------------------
  |  Branch (321:24): [True: 2, False: 0]
  ------------------
  322|      2|                        spanLengths[i]=makeSpanLengthByte(spanLength);
  323|      2|                    }
  324|      2|                    if(which&BACK) {
  ------------------
  |  Branch (324:24): [True: 2, False: 0]
  ------------------
  325|      2|                        spanLength=length16-spanSet.spanBack(s16, length16, USET_SPAN_CONTAINED);
  326|      2|                        spanBackLengths[i]=makeSpanLengthByte(spanLength);
  327|      2|                    }
  328|      2|                } else /* not CONTAINED, not all, but NOT_CONTAINED */ {
  329|      0|                    spanLengths[i]=spanBackLengths[i]=0;  // Only store a relevant/irrelevant flag.
  330|      0|                }
  331|      2|            }
  332|      2|            if(which&UTF8) {
  ------------------
  |  Branch (332:16): [True: 2, False: 0]
  ------------------
  333|      2|                uint8_t *s8=utf8+utf8Count;
  334|      2|                int32_t length8=appendUTF8(s16, length16, s8, utf8Length-utf8Count);
  335|      2|                utf8Count+=utf8Lengths[i]=length8;
  336|      2|                if(length8==0) {  // Irrelevant for UTF-8 because not representable in UTF-8.
  ------------------
  |  Branch (336:20): [True: 0, False: 2]
  ------------------
  337|      0|                    spanUTF8Lengths[i] = spanBackUTF8Lengths[i] = static_cast<uint8_t>(ALL_CP_CONTAINED);
  338|      2|                } else {  // Relevant for UTF-8.
  339|      2|                    if(which&CONTAINED) {
  ------------------
  |  Branch (339:24): [True: 2, False: 0]
  ------------------
  340|      2|                        if(which&FWD) {
  ------------------
  |  Branch (340:28): [True: 2, False: 0]
  ------------------
  341|      2|                            spanLength = spanSet.spanUTF8(reinterpret_cast<const char*>(s8), length8, USET_SPAN_CONTAINED);
  342|      2|                            spanUTF8Lengths[i]=makeSpanLengthByte(spanLength);
  343|      2|                        }
  344|      2|                        if(which&BACK) {
  ------------------
  |  Branch (344:28): [True: 2, False: 0]
  ------------------
  345|      2|                            spanLength = length8 - spanSet.spanBackUTF8(reinterpret_cast<const char*>(s8), length8, USET_SPAN_CONTAINED);
  346|      2|                            spanBackUTF8Lengths[i]=makeSpanLengthByte(spanLength);
  347|      2|                        }
  348|      2|                    } else /* not CONTAINED, not all, but NOT_CONTAINED */ {
  349|      0|                        spanUTF8Lengths[i]=spanBackUTF8Lengths[i]=0;  // Only store a relevant/irrelevant flag.
  350|      0|                    }
  351|      2|                }
  352|      2|            }
  353|      2|            if(which&NOT_CONTAINED) {
  ------------------
  |  Branch (353:16): [True: 2, False: 0]
  ------------------
  354|       |                // Add string start and end code points to the spanNotSet so that
  355|       |                // a span(while not contained) stops before any string.
  356|      2|                UChar32 c;
  357|      2|                if(which&FWD) {
  ------------------
  |  Branch (357:20): [True: 2, False: 0]
  ------------------
  358|      2|                    int32_t len=0;
  359|      2|                    U16_NEXT(s16, len, length16, c);
  ------------------
  |  |  309|      2|#define U16_NEXT(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      2|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  310|      2|    (c)=(s)[(i)++]; \
  |  |  311|      2|    if(U16_IS_LEAD(c)) { \
  |  |  ------------------
  |  |  |  |   59|      2|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  312|      0|        uint16_t __c2; \
  |  |  313|      0|        if((i)!=(length) && U16_IS_TRAIL(__c2=(s)[(i)])) { \
  |  |  ------------------
  |  |  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (313:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  314|      0|            ++(i); \
  |  |  315|      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)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  316|      0|        } \
  |  |  317|      0|    } \
  |  |  318|      2|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      2|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  360|      2|                    addToSpanNotSet(c);
  361|      2|                }
  362|      2|                if(which&BACK) {
  ------------------
  |  Branch (362:20): [True: 2, False: 0]
  ------------------
  363|      2|                    int32_t len=length16;
  364|      2|                    U16_PREV(s16, 0, len, c);
  ------------------
  |  |  570|      2|#define U16_PREV(s, start, i, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|      2|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  571|      2|    (c)=(s)[--(i)]; \
  |  |  572|      2|    if(U16_IS_TRAIL(c)) { \
  |  |  ------------------
  |  |  |  |   67|      2|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  573|      0|        uint16_t __c2; \
  |  |  574|      0|        if((i)>(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \
  |  |  ------------------
  |  |  |  |   59|      0|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (574:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  575|      0|            --(i); \
  |  |  576|      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)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  577|      0|        } \
  |  |  578|      0|    } \
  |  |  579|      2|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|      2|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  365|      2|                    addToSpanNotSet(c);
  366|      2|                }
  367|      2|            }
  368|      2|        } else {  // Irrelevant string. (Also the empty string.)
  369|      0|            if(which&UTF8) {
  ------------------
  |  Branch (369:16): [True: 0, False: 0]
  ------------------
  370|      0|                if(which&CONTAINED) {  // Only necessary for LONGEST_MATCH.
  ------------------
  |  Branch (370:20): [True: 0, False: 0]
  ------------------
  371|      0|                    uint8_t *s8=utf8+utf8Count;
  372|      0|                    int32_t length8=appendUTF8(s16, length16, s8, utf8Length-utf8Count);
  373|      0|                    utf8Count+=utf8Lengths[i]=length8;
  374|      0|                } else {
  375|      0|                    utf8Lengths[i]=0;
  376|      0|                }
  377|      0|            }
  378|      0|            if(all) {
  ------------------
  |  Branch (378:16): [True: 0, False: 0]
  ------------------
  379|      0|                spanLengths[i]=spanBackLengths[i]=
  380|      0|                    spanUTF8Lengths[i]=spanBackUTF8Lengths[i]=
  381|      0|                        static_cast<uint8_t>(ALL_CP_CONTAINED);
  382|      0|            } else {
  383|       |                // All spanXYZLengths pointers contain the same address.
  384|      0|                spanLengths[i] = static_cast<uint8_t>(ALL_CP_CONTAINED);
  385|      0|            }
  386|      0|        }
  387|      2|    }
  388|       |
  389|       |    // Finish.
  390|      1|    if(all) {
  ------------------
  |  Branch (390:8): [True: 1, False: 0]
  ------------------
  391|      1|        pSpanNotSet->freeze();
  392|      1|    }
  393|      1|}
_ZN6icu_7820UnicodeSetStringSpan15addToSpanNotSetEi:
  437|      4|void UnicodeSetStringSpan::addToSpanNotSet(UChar32 c) {
  438|      4|    if(pSpanNotSet==nullptr || pSpanNotSet==&spanSet) {
  ------------------
  |  Branch (438:8): [True: 0, False: 4]
  |  Branch (438:32): [True: 1, False: 3]
  ------------------
  439|      1|        if(spanSet.contains(c)) {
  ------------------
  |  Branch (439:12): [True: 0, False: 1]
  ------------------
  440|      0|            return;  // Nothing to do.
  441|      0|        }
  442|      1|        UnicodeSet *newSet=spanSet.cloneAsThawed();
  443|      1|        if(newSet==nullptr) {
  ------------------
  |  Branch (443:12): [True: 0, False: 1]
  ------------------
  444|      0|            return;  // Out of memory.
  445|      1|        } else {
  446|      1|            pSpanNotSet=newSet;
  447|      1|        }
  448|      1|    }
  449|      4|    pSpanNotSet->add(c);
  450|      4|}
unisetspan.cpp:_ZN6icu_78L13getUTF8LengthEPKDsi:
  168|      2|getUTF8Length(const char16_t *s, int32_t length) {
  169|      2|    UErrorCode errorCode=U_ZERO_ERROR;
  170|      2|    int32_t length8=0;
  171|      2|    u_strToUTF8(nullptr, 0, &length8, s, length, &errorCode);
  ------------------
  |  |  379|      2|#define u_strToUTF8 U_ICU_ENTRY_POINT_RENAME(u_strToUTF8)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  172|      2|    if(U_SUCCESS(errorCode) || errorCode==U_BUFFER_OVERFLOW_ERROR) {
  ------------------
  |  Branch (172:8): [True: 0, False: 2]
  |  Branch (172:32): [True: 2, False: 0]
  ------------------
  173|      2|        return length8;
  174|      2|    } else {
  175|       |        // The string contains an unpaired surrogate.
  176|       |        // Ignore this string.
  177|      0|        return 0;
  178|      0|    }
  179|      2|}
unisetspan.cpp:_ZN6icu_78L18makeSpanLengthByteEi:
  197|      8|makeSpanLengthByte(int32_t spanLength) {
  198|       |    // 0xfe==UnicodeSetStringSpan::LONG_SPAN
  199|      8|    return spanLength < 0xfe ? static_cast<uint8_t>(spanLength) : static_cast<uint8_t>(0xfe);
  ------------------
  |  Branch (199:12): [True: 8, False: 0]
  ------------------
  200|      8|}
unisetspan.cpp:_ZN6icu_78L10appendUTF8EPKDsiPhi:
  183|      2|appendUTF8(const char16_t *s, int32_t length, uint8_t *t, int32_t capacity) {
  184|      2|    UErrorCode errorCode=U_ZERO_ERROR;
  185|      2|    int32_t length8=0;
  186|      2|    u_strToUTF8(reinterpret_cast<char*>(t), capacity, &length8, s, length, &errorCode);
  ------------------
  |  |  379|      2|#define u_strToUTF8 U_ICU_ENTRY_POINT_RENAME(u_strToUTF8)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  187|      2|    if(U_SUCCESS(errorCode)) {
  ------------------
  |  Branch (187:8): [True: 2, False: 0]
  ------------------
  188|      2|        return length8;
  189|      2|    } else {
  190|       |        // The string contains an unpaired surrogate.
  191|       |        // Ignore this string.
  192|      0|        return 0;
  193|      0|    }
  194|      2|}

_ZN6icu_7820UnicodeSetStringSpan20needsStringSpanUTF16Ev:
  143|      1|UBool UnicodeSetStringSpan::needsStringSpanUTF16() {
  144|      1|    return maxLength16 != 0;
  145|      1|}

_ZN6icu_7811ReplaceableD2Ev:
  106|   213M|Replaceable::~Replaceable() {}
_ZN6icu_78plERKNS_13UnicodeStringES2_:
  111|   226k|operator+ (const UnicodeString &s1, const UnicodeString &s2) {
  112|   226k|  int32_t sumLengths;
  113|   226k|  if (uprv_add32_overflow(s1.length(), s2.length(), &sumLengths)) {
  ------------------
  |  | 1394|   226k|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|   226k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   226k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   226k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (113:7): [True: 0, False: 226k]
  ------------------
  114|      0|    UnicodeString bogus;
  115|      0|    bogus.setToBogus();
  116|      0|    return bogus;
  117|      0|  }
  118|   226k|  if (sumLengths != INT32_MAX) {
  ------------------
  |  Branch (118:7): [True: 226k, False: 0]
  ------------------
  119|   226k|    ++sumLengths;  // space for a terminating NUL if we need one
  120|   226k|  }
  121|   226k|  return UnicodeString(sumLengths, static_cast<UChar32>(0), 0).append(s1).append(s2);
  122|   226k|}
_ZN6icu_7813UnicodeString6addRefEv:
  146|  20.6M|UnicodeString::addRef() {
  147|  20.6M|  umtx_atomic_inc(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1);
  148|  20.6M|}
_ZN6icu_7813UnicodeString9removeRefEv:
  151|  28.8M|UnicodeString::removeRef() {
  152|  28.8M|  return umtx_atomic_dec(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1);
  153|  28.8M|}
_ZNK6icu_7813UnicodeString8refCountEv:
  156|  97.3M|UnicodeString::refCount() const {
  157|  97.3M|  return umtx_loadAcquire(*(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1));
  158|  97.3M|}
_ZN6icu_7813UnicodeString12releaseArrayEv:
  161|   329M|UnicodeString::releaseArray() {
  162|   329M|  if((fUnion.fFields.fLengthAndFlags & kRefCounted) && removeRef() == 0) {
  ------------------
  |  Branch (162:6): [True: 28.8M, False: 300M]
  |  Branch (162:56): [True: 8.74M, False: 20.1M]
  ------------------
  163|  8.74M|    uprv_free(reinterpret_cast<int32_t*>(fUnion.fFields.fArray) - 1);
  ------------------
  |  | 1503|  8.74M|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  8.74M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  8.74M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  8.74M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  164|  8.74M|  }
  165|   329M|}
_ZN6icu_7813UnicodeStringC2Eiii:
  175|   226k|UnicodeString::UnicodeString(int32_t capacity, UChar32 c, int32_t count) {
  176|   226k|  fUnion.fFields.fLengthAndFlags = 0;
  177|   226k|  if (count <= 0 || static_cast<uint32_t>(c) > 0x10ffff) {
  ------------------
  |  Branch (177:7): [True: 226k, False: 0]
  |  Branch (177:21): [True: 0, False: 0]
  ------------------
  178|       |    // just allocate and do not do anything else
  179|   226k|    allocate(capacity);
  180|   226k|  } 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|   226k|}
_ZN6icu_7813UnicodeStringC2Ei:
  221|  6.16k|UnicodeString::UnicodeString(UChar32 ch) {
  222|  6.16k|  fUnion.fFields.fLengthAndFlags = kShortString;
  223|  6.16k|  int32_t i = 0;
  224|  6.16k|  UBool isError = false;
  225|  6.16k|  U16_APPEND(fUnion.fStackFields.fBuffer, i, US_STACKBUF_SIZE, ch, isError);
  ------------------
  |  |  393|  6.16k|#define U16_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  6.16k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  394|  6.16k|    if((uint32_t)(c)<=0xffff) { \
  |  |  ------------------
  |  |  |  Branch (394:8): [True: 6.16k, False: 0]
  |  |  ------------------
  |  |  395|  6.16k|        (s)[(i)++]=(uint16_t)(c); \
  |  |  396|  6.16k|    } 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|  6.16k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  6.16k|#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|  6.16k|  if(!isError) {
  ------------------
  |  Branch (228:6): [True: 6.16k, False: 0]
  ------------------
  229|  6.16k|    setShortLength(i);
  230|  6.16k|  }
  231|  6.16k|}
_ZN6icu_7813UnicodeStringC2EPKDsi:
  234|  61.7k|                             int32_t textLength) {
  235|  61.7k|  fUnion.fFields.fLengthAndFlags = kShortString;
  236|  61.7k|  doAppend(text, 0, textLength);
  237|  61.7k|}
_ZN6icu_7813UnicodeStringC2EaNS_14ConstChar16PtrEi:
  241|  12.9M|                             int32_t textLength) {
  242|  12.9M|  fUnion.fFields.fLengthAndFlags = kReadonlyAlias;
  243|  12.9M|  const char16_t *text = textPtr;
  244|  12.9M|  if(text == nullptr) {
  ------------------
  |  Branch (244:6): [True: 0, False: 12.9M]
  ------------------
  245|       |    // treat as an empty string, do not alias
  246|      0|    setToEmpty();
  247|  12.9M|  } else if(textLength < -1 ||
  ------------------
  |  Branch (247:13): [True: 0, False: 12.9M]
  ------------------
  248|  12.9M|            (textLength == -1 && !isTerminated) ||
  ------------------
  |  Branch (248:14): [True: 9.36M, False: 3.58M]
  |  Branch (248:34): [True: 0, False: 9.36M]
  ------------------
  249|  12.9M|            (textLength >= 0 && isTerminated && text[textLength] != 0)
  ------------------
  |  Branch (249:14): [True: 3.58M, False: 9.36M]
  |  Branch (249:33): [True: 3.06M, False: 521k]
  |  Branch (249:49): [True: 0, False: 3.06M]
  ------------------
  250|  12.9M|  ) {
  251|      0|    setToBogus();
  252|  12.9M|  } else {
  253|  12.9M|    if(textLength == -1) {
  ------------------
  |  Branch (253:8): [True: 9.36M, False: 3.58M]
  ------------------
  254|       |      // text is terminated, or else it would have failed the above test
  255|  9.36M|      textLength = u_strlen(text);
  ------------------
  |  |  393|  9.36M|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|  9.36M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.36M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.36M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|  9.36M|    }
  257|  12.9M|    setArray(const_cast<char16_t *>(text), textLength,
  258|  12.9M|             isTerminated ? textLength + 1 : textLength);
  ------------------
  |  Branch (258:14): [True: 12.4M, False: 521k]
  ------------------
  259|  12.9M|  }
  260|  12.9M|}
_ZN6icu_7813UnicodeStringC2ERKS0_:
  345|  28.6M|UnicodeString::UnicodeString(const UnicodeString& that) {
  346|  28.6M|  fUnion.fFields.fLengthAndFlags = kShortString;
  347|  28.6M|  copyFrom(that);
  348|  28.6M|}
_ZN6icu_7813UnicodeStringC2ERKS0_i:
  355|  8.19k|                             int32_t srcStart) {
  356|  8.19k|  fUnion.fFields.fLengthAndFlags = kShortString;
  357|  8.19k|  setTo(that, srcStart);
  358|  8.19k|}
_ZN6icu_7813UnicodeStringC2ERKS0_ii:
  362|  42.7k|                             int32_t srcLength) {
  363|  42.7k|  fUnion.fFields.fLengthAndFlags = kShortString;
  364|  42.7k|  setTo(that, srcStart, srcLength);
  365|  42.7k|}
_ZN6icu_7813UnicodeString8allocateEi:
  409|  12.1M|UnicodeString::allocate(int32_t capacity) {
  410|  12.1M|  if(capacity <= US_STACKBUF_SIZE) {
  ------------------
  |  Branch (410:6): [True: 3.36M, False: 8.77M]
  ------------------
  411|  3.36M|    fUnion.fFields.fLengthAndFlags = kShortString;
  412|  3.36M|    return true;
  413|  3.36M|  }
  414|  8.77M|  if(capacity <= kMaxCapacity) {
  ------------------
  |  Branch (414:6): [True: 8.77M, False: 0]
  ------------------
  415|  8.77M|    ++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|  8.77M|    size_t numBytes = sizeof(int32_t) + static_cast<size_t>(capacity) * U_SIZEOF_UCHAR;
  ------------------
  |  |  352|  8.77M|#define U_SIZEOF_UCHAR 2
  ------------------
  419|       |    // Round up to a multiple of 16.
  420|  8.77M|    numBytes = (numBytes + 15) & ~15;
  421|  8.77M|    int32_t* array = static_cast<int32_t*>(uprv_malloc(numBytes));
  ------------------
  |  | 1524|  8.77M|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  8.77M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  8.77M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  8.77M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  422|  8.77M|    if(array != nullptr) {
  ------------------
  |  Branch (422:8): [True: 8.77M, False: 0]
  ------------------
  423|       |      // set initial refCount and point behind the refCount
  424|  8.77M|      *array++ = 1;
  425|  8.77M|      numBytes -= sizeof(int32_t);
  426|       |
  427|       |      // have fArray point to the first char16_t
  428|  8.77M|      fUnion.fFields.fArray = reinterpret_cast<char16_t*>(array);
  429|  8.77M|      fUnion.fFields.fCapacity = static_cast<int32_t>(numBytes / U_SIZEOF_UCHAR);
  ------------------
  |  |  352|  8.77M|#define U_SIZEOF_UCHAR 2
  ------------------
  430|  8.77M|      fUnion.fFields.fLengthAndFlags = kLongString;
  431|  8.77M|      return true;
  432|  8.77M|    }
  433|  8.77M|  }
  434|      0|  fUnion.fFields.fLengthAndFlags = kIsBogus;
  435|      0|  fUnion.fFields.fArray = nullptr;
  436|      0|  fUnion.fFields.fCapacity = 0;
  437|      0|  return false;
  438|  8.77M|}
_ZN6icu_7813UnicodeStringD2Ev:
  462|   213M|{
  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|   213M|  releaseArray();
  478|   213M|}
_ZN6icu_7813UnicodeStringaSERKS0_:
  527|  5.81M|UnicodeString::operator=(const UnicodeString &src) {
  528|  5.81M|  return copyFrom(src);
  529|  5.81M|}
_ZN6icu_7813UnicodeString12fastCopyFromERKS0_:
  532|  8.39M|UnicodeString::fastCopyFrom(const UnicodeString &src) {
  533|  8.39M|  return copyFrom(src, true);
  534|  8.39M|}
_ZN6icu_7813UnicodeString8copyFromERKS0_a:
  537|  43.2M|UnicodeString::copyFrom(const UnicodeString &src, UBool fastCopy) {
  538|       |  // if assigning to ourselves, do nothing
  539|  43.2M|  if(this == &src) {
  ------------------
  |  Branch (539:6): [True: 0, False: 43.2M]
  ------------------
  540|      0|    return *this;
  541|      0|  }
  542|       |
  543|       |  // is the right side bogus?
  544|  43.2M|  if(src.isBogus()) {
  ------------------
  |  Branch (544:6): [True: 392k, False: 42.8M]
  ------------------
  545|   392k|    setToBogus();
  546|   392k|    return *this;
  547|   392k|  }
  548|       |
  549|       |  // delete the current contents
  550|  42.8M|  releaseArray();
  551|       |
  552|  42.8M|  if(src.isEmpty()) {
  ------------------
  |  Branch (552:6): [True: 1.38M, False: 41.4M]
  ------------------
  553|       |    // empty string - use the stack buffer
  554|  1.38M|    setToEmpty();
  555|  1.38M|    return *this;
  556|  1.38M|  }
  557|       |
  558|       |  // fLength>0 and not an "open" src.getBuffer(minCapacity)
  559|  41.4M|  fUnion.fFields.fLengthAndFlags = src.fUnion.fFields.fLengthAndFlags;
  560|  41.4M|  switch(src.fUnion.fFields.fLengthAndFlags & kAllStorageFlags) {
  561|  17.7M|  case kShortString:
  ------------------
  |  Branch (561:3): [True: 17.7M, False: 23.7M]
  ------------------
  562|       |    // short string using the stack buffer, do the same
  563|  17.7M|    uprv_memcpy(fUnion.fStackFields.fBuffer, src.fUnion.fStackFields.fBuffer,
  ------------------
  |  |   42|  17.7M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  17.7M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  17.7M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  17.7M|    _Pragma("clang diagnostic push") \
  |  |   45|  17.7M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  17.7M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  17.7M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  17.7M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  17.7M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  17.7M|    _Pragma("clang diagnostic pop") \
  |  |   49|  17.7M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  17.7M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  17.7M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  17.7M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  564|  17.7M|                getShortLength() * U_SIZEOF_UCHAR);
  565|  17.7M|    break;
  566|  20.6M|  case kLongString:
  ------------------
  |  Branch (566:3): [True: 20.6M, False: 20.7M]
  ------------------
  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|  20.6M|    const_cast<UnicodeString &>(src).addRef();
  570|       |    // copy all fields, share the reference-counted buffer
  571|  20.6M|    fUnion.fFields.fArray = src.fUnion.fFields.fArray;
  572|  20.6M|    fUnion.fFields.fCapacity = src.fUnion.fFields.fCapacity;
  573|  20.6M|    if(!hasShortLength()) {
  ------------------
  |  Branch (573:8): [True: 16.2M, False: 4.48M]
  ------------------
  574|  16.2M|      fUnion.fFields.fLength = src.fUnion.fFields.fLength;
  575|  16.2M|    }
  576|  20.6M|    break;
  577|  3.02M|  case kReadonlyAlias:
  ------------------
  |  Branch (577:3): [True: 3.02M, False: 38.4M]
  ------------------
  578|  3.02M|    if(fastCopy) {
  ------------------
  |  Branch (578:8): [True: 70.5k, False: 2.95M]
  ------------------
  579|       |      // src is a readonly alias, do the same
  580|       |      // -> maintain the readonly alias as such
  581|  70.5k|      fUnion.fFields.fArray = src.fUnion.fFields.fArray;
  582|  70.5k|      fUnion.fFields.fCapacity = src.fUnion.fFields.fCapacity;
  583|  70.5k|      if(!hasShortLength()) {
  ------------------
  |  Branch (583:10): [True: 0, False: 70.5k]
  ------------------
  584|      0|        fUnion.fFields.fLength = src.fUnion.fFields.fLength;
  585|      0|      }
  586|  70.5k|      break;
  587|  70.5k|    }
  588|       |    // else if(!fastCopy) fall through to case kWritableAlias
  589|       |    // -> allocate a new buffer and copy the contents
  590|  2.95M|    U_FALLTHROUGH;
  ------------------
  |  |  511|  2.95M|#       define U_FALLTHROUGH [[clang::fallthrough]]
  ------------------
  591|  2.95M|  case kWritableAlias: {
  ------------------
  |  Branch (591:3): [True: 0, False: 41.4M]
  ------------------
  592|       |    // src is a writable alias; we make a copy of that instead
  593|  2.95M|    int32_t srcLength = src.length();
  594|  2.95M|    if(allocate(srcLength)) {
  ------------------
  |  Branch (594:8): [True: 2.95M, False: 0]
  ------------------
  595|  2.95M|      u_memcpy(getArrayStart(), src.getArrayStart(), srcLength);
  ------------------
  |  |  334|  2.95M|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|  2.95M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.95M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.95M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  596|  2.95M|      setLength(srcLength);
  597|  2.95M|      break;
  598|  2.95M|    }
  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: 41.4M]
  ------------------
  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|  41.4M|  }
  610|       |
  611|  41.4M|  return *this;
  612|  41.4M|}
_ZN6icu_7813UnicodeStringaSEOS0_:
  614|  16.8M|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|  16.8M|  releaseArray();
  618|  16.8M|  copyFieldsFrom(src, true);
  619|  16.8M|  return *this;
  620|  16.8M|}
_ZN6icu_7813UnicodeString14copyFieldsFromERS0_a:
  623|  16.8M|void UnicodeString::copyFieldsFrom(UnicodeString &src, UBool setSrcToBogus) noexcept {
  624|  16.8M|  int16_t lengthAndFlags = fUnion.fFields.fLengthAndFlags = src.fUnion.fFields.fLengthAndFlags;
  625|  16.8M|  if(lengthAndFlags & kUsingStackBuffer) {
  ------------------
  |  Branch (625:6): [True: 15.4M, False: 1.41M]
  ------------------
  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|  15.4M|    if(this != &src) {
  ------------------
  |  Branch (629:8): [True: 15.4M, False: 0]
  ------------------
  630|  15.4M|      uprv_memcpy(fUnion.fStackFields.fBuffer, src.fUnion.fStackFields.fBuffer,
  ------------------
  |  |   42|  15.4M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  15.4M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  15.4M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  15.4M|    _Pragma("clang diagnostic push") \
  |  |   45|  15.4M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  15.4M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  15.4M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  15.4M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  15.4M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  15.4M|    _Pragma("clang diagnostic pop") \
  |  |   49|  15.4M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  15.4M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  15.4M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  15.4M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  631|  15.4M|                  getShortLength() * U_SIZEOF_UCHAR);
  632|  15.4M|    }
  633|  15.4M|  } else {
  634|       |    // In all other cases, copy all fields.
  635|  1.41M|    fUnion.fFields.fArray = src.fUnion.fFields.fArray;
  636|  1.41M|    fUnion.fFields.fCapacity = src.fUnion.fFields.fCapacity;
  637|  1.41M|    if(!hasShortLength()) {
  ------------------
  |  Branch (637:8): [True: 694, False: 1.41M]
  ------------------
  638|    694|      fUnion.fFields.fLength = src.fUnion.fFields.fLength;
  639|    694|    }
  640|  1.41M|    if(setSrcToBogus) {
  ------------------
  |  Branch (640:8): [True: 1.41M, False: 0]
  ------------------
  641|       |      // Set src to bogus without releasing any memory.
  642|  1.41M|      src.fUnion.fFields.fLengthAndFlags = kIsBogus;
  643|  1.41M|      src.fUnion.fFields.fArray = nullptr;
  644|  1.41M|      src.fUnion.fFields.fCapacity = 0;
  645|  1.41M|    }
  646|  1.41M|  }
  647|  16.8M|}
_ZNK6icu_7813UnicodeString10unescapeAtERi:
  690|     10|UChar32 UnicodeString::unescapeAt(int32_t &offset) const {
  691|     10|    return u_unescapeAt(UnicodeString_charAt, &offset, length(), (void*)this);
  ------------------
  |  |  416|     10|#define u_unescapeAt U_ICU_ENTRY_POINT_RENAME(u_unescapeAt)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  692|     10|}
_ZNK6icu_7813UnicodeString8doEqualsEPKDsi:
  698|  1.06M|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|  1.06M|  return uprv_memcmp(getArrayStart(), text, len * U_SIZEOF_UCHAR) == 0;
  ------------------
  |  |  101|  1.06M|#define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size)
  |  |  ------------------
  |  |  |  |  393|  1.06M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  702|  1.06M|}
_ZNK6icu_7813UnicodeString17doEqualsSubstringEiiPKDsii:
  710|  2.75M|{
  711|       |  // compare illegal string values
  712|  2.75M|  if(isBogus()) {
  ------------------
  |  Branch (712:6): [True: 0, False: 2.75M]
  ------------------
  713|      0|    return false;
  714|      0|  }
  715|       |  
  716|       |  // pin indices to legal values
  717|  2.75M|  pinIndices(start, length);
  718|       |
  719|  2.75M|  if(srcChars == nullptr) {
  ------------------
  |  Branch (719:6): [True: 0, False: 2.75M]
  ------------------
  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|  2.75M|  const char16_t *chars = getArrayStart();
  726|       |
  727|  2.75M|  chars += start;
  728|  2.75M|  srcChars += srcStart;
  729|       |
  730|       |  // get the srcLength if necessary
  731|  2.75M|  if(srcLength < 0) {
  ------------------
  |  Branch (731:6): [True: 0, False: 2.75M]
  ------------------
  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|  2.75M|  if (length != srcLength) {
  ------------------
  |  Branch (735:7): [True: 46.2k, False: 2.70M]
  ------------------
  736|  46.2k|    return false;
  737|  46.2k|  }
  738|       |
  739|  2.70M|  if(length == 0 || chars == srcChars) {
  ------------------
  |  Branch (739:6): [True: 0, False: 2.70M]
  |  Branch (739:21): [True: 0, False: 2.70M]
  ------------------
  740|      0|    return true;
  741|      0|  }
  742|       |
  743|  2.70M|  return u_memcmp(chars, srcChars, srcLength) == 0;
  ------------------
  |  |  332|  2.70M|#define u_memcmp U_ICU_ENTRY_POINT_RENAME(u_memcmp)
  |  |  ------------------
  |  |  |  |  123|  2.70M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.70M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.70M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  744|  2.70M|}
_ZNK6icu_7813UnicodeString9doCompareEiiPKDsii:
  752|   191k|{
  753|       |  // compare illegal string values
  754|   191k|  if(isBogus()) {
  ------------------
  |  Branch (754:6): [True: 0, False: 191k]
  ------------------
  755|      0|    return -1;
  756|      0|  }
  757|       |  
  758|       |  // pin indices to legal values
  759|   191k|  pinIndices(start, length);
  760|       |
  761|   191k|  if(srcChars == nullptr) {
  ------------------
  |  Branch (761:6): [True: 0, False: 191k]
  ------------------
  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|   191k|  const char16_t *chars = getArrayStart();
  768|       |
  769|   191k|  chars += start;
  770|   191k|  srcChars += srcStart;
  771|       |
  772|   191k|  int32_t minLength;
  773|   191k|  int8_t lengthResult;
  774|       |
  775|       |  // get the srcLength if necessary
  776|   191k|  if(srcLength < 0) {
  ------------------
  |  Branch (776:6): [True: 0, False: 191k]
  ------------------
  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|   191k|  if(length != srcLength) {
  ------------------
  |  Branch (781:6): [True: 62.0k, False: 129k]
  ------------------
  782|  62.0k|    if(length < srcLength) {
  ------------------
  |  Branch (782:8): [True: 18.2k, False: 43.7k]
  ------------------
  783|  18.2k|      minLength = length;
  784|  18.2k|      lengthResult = -1;
  785|  43.7k|    } else {
  786|  43.7k|      minLength = srcLength;
  787|  43.7k|      lengthResult = 1;
  788|  43.7k|    }
  789|   129k|  } else {
  790|   129k|    minLength = length;
  791|   129k|    lengthResult = 0;
  792|   129k|  }
  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|   191k|  if(minLength > 0 && chars != srcChars) {
  ------------------
  |  Branch (802:6): [True: 184k, False: 7.12k]
  |  Branch (802:23): [True: 184k, False: 0]
  ------------------
  803|   184k|    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|   332k|      do {
  814|   332k|        result = static_cast<int32_t>(*(chars++)) - static_cast<int32_t>(*(srcChars++));
  815|   332k|        if(result != 0) {
  ------------------
  |  Branch (815:12): [True: 126k, False: 206k]
  ------------------
  816|   126k|          return static_cast<int8_t>(result >> 15 | 1);
  817|   126k|        }
  818|   332k|      } while(--minLength > 0);
  ------------------
  |  Branch (818:15): [True: 148k, False: 57.8k]
  ------------------
  819|   184k|#   endif
  820|   184k|  }
  821|  64.9k|  return lengthResult;
  822|   191k|}
_ZNK6icu_7813UnicodeString8char32AtEi:
  871|   374M|{
  872|   374M|  int32_t len = length();
  873|   374M|  if (static_cast<uint32_t>(offset) < static_cast<uint32_t>(len)) {
  ------------------
  |  Branch (873:7): [True: 374M, False: 0]
  ------------------
  874|   374M|    const char16_t *array = getArrayStart();
  875|   374M|    UChar32 c;
  876|   374M|    U16_GET(array, 0, offset, len, c);
  ------------------
  |  |  201|   374M|#define U16_GET(s, start, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   374M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  202|   374M|    (c)=(s)[i]; \
  |  |  203|   374M|    if(U16_IS_SURROGATE(c)) { \
  |  |  ------------------
  |  |  |  |   75|   374M|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   374M|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:27): [True: 6.29M, False: 368M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  204|  6.29M|        uint16_t __c2; \
  |  |  205|  6.29M|        if(U16_IS_SURROGATE_LEAD(c)) { \
  |  |  ------------------
  |  |  |  |   84|  6.29M|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:34): [True: 6.24M, False: 57.6k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  206|  6.24M|            if((i)+1!=(length) && U16_IS_TRAIL(__c2=(s)[(i)+1])) { \
  |  |  ------------------
  |  |  |  |   67|  6.24M|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:25): [True: 703k, False: 5.53M]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (206:16): [True: 6.24M, False: 735]
  |  |  ------------------
  |  |  207|   703k|                (c)=U16_GET_SUPPLEMENTARY((c), __c2); \
  |  |  ------------------
  |  |  |  |  113|   703k|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  |  |  ------------------
  |  |  |  |  |  |   99|   703k|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  208|   703k|            } \
  |  |  209|  6.24M|        } else { \
  |  |  210|  57.6k|            if((i)>(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \
  |  |  ------------------
  |  |  |  |   59|  56.8k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (59:24): [True: 0, False: 56.8k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (210:16): [True: 56.8k, False: 801]
  |  |  ------------------
  |  |  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|  57.6k|        } \
  |  |  214|  6.29M|    } \
  |  |  215|   374M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   374M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  877|   374M|    return c;
  878|   374M|  } else {
  879|      0|    return kInvalidUChar;
  880|      0|  }
  881|   374M|}
_ZNK6icu_7813UnicodeString11countChar32Eii:
  907|  1.66M|UnicodeString::countChar32(int32_t start, int32_t length) const {
  908|  1.66M|  pinIndices(start, length);
  909|       |  // if(isBogus()) then fArray==0 and start==0 - u_countChar32() checks for nullptr
  910|  1.66M|  return u_countChar32(getArrayStart()+start, length);
  ------------------
  |  |  228|  1.66M|#define u_countChar32 U_ICU_ENTRY_POINT_RENAME(u_countChar32)
  |  |  ------------------
  |  |  |  |  123|  1.66M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.66M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.66M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  911|  1.66M|}
_ZNK6icu_7813UnicodeString7extractEiiPciNS0_10EInvariantE:
  981|  2.49k|{
  982|       |  // if the arguments are illegal, then do nothing
  983|  2.49k|  if(targetCapacity < 0 || (targetCapacity > 0 && target == nullptr)) {
  ------------------
  |  Branch (983:6): [True: 0, False: 2.49k]
  |  Branch (983:29): [True: 2.49k, False: 0]
  |  Branch (983:51): [True: 0, False: 2.49k]
  ------------------
  984|      0|    return 0;
  985|      0|  }
  986|       |
  987|       |  // pin the indices to legal values
  988|  2.49k|  pinIndices(start, length);
  989|       |
  990|  2.49k|  if(length <= targetCapacity) {
  ------------------
  |  Branch (990:6): [True: 2.49k, False: 0]
  ------------------
  991|  2.49k|    u_UCharsToChars(getArrayStart() + start, target, length);
  ------------------
  |  |  211|  2.49k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  2.49k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.49k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.49k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  992|  2.49k|  }
  993|  2.49k|  UErrorCode status = U_ZERO_ERROR;
  994|  2.49k|  return u_terminateChars(target, targetCapacity, length, &status);
  ------------------
  |  |  406|  2.49k|#define u_terminateChars U_ICU_ENTRY_POINT_RENAME(u_terminateChars)
  |  |  ------------------
  |  |  |  |  123|  2.49k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.49k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.49k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  995|  2.49k|}
_ZNK6icu_7813UnicodeString13tempSubStringEii:
  998|   512k|UnicodeString::tempSubString(int32_t start, int32_t len) const {
  999|   512k|  pinIndices(start, len);
 1000|   512k|  const char16_t *array = getBuffer();  // not getArrayStart() to check kIsBogus & kOpenGetBuffer
 1001|   512k|  if(array==nullptr) {
  ------------------
  |  Branch (1001:6): [True: 0, False: 512k]
  ------------------
 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|   512k|  return UnicodeString(false, array + start, len);
 1006|   512k|}
_ZNK6icu_7813UnicodeString14extractBetweenEiiRS0_:
 1040|      5|                  UnicodeString& target) const {
 1041|      5|  pinIndex(start);
 1042|      5|  pinIndex(limit);
 1043|      5|  doExtract(start, limit - start, target);
 1044|      5|}
_ZNK6icu_7813UnicodeString7indexOfEPKDsiiii:
 1112|  20.0M|{
 1113|  20.0M|  if (isBogus() || srcChars == nullptr || srcStart < 0 || srcLength == 0) {
  ------------------
  |  Branch (1113:7): [True: 0, False: 20.0M]
  |  Branch (1113:20): [True: 0, False: 20.0M]
  |  Branch (1113:43): [True: 0, False: 20.0M]
  |  Branch (1113:59): [True: 0, False: 20.0M]
  ------------------
 1114|      0|    return -1;
 1115|      0|  }
 1116|       |
 1117|       |  // UnicodeString does not find empty substrings
 1118|  20.0M|  if(srcLength < 0 && srcChars[srcStart] == 0) {
  ------------------
  |  Branch (1118:6): [True: 390k, False: 19.6M]
  |  Branch (1118:23): [True: 0, False: 390k]
  ------------------
 1119|      0|    return -1;
 1120|      0|  }
 1121|       |
 1122|       |  // get the indices within bounds
 1123|  20.0M|  pinIndices(start, length);
 1124|       |
 1125|       |  // find the first occurrence of the substring
 1126|  20.0M|  const char16_t *array = getArrayStart();
 1127|  20.0M|  const char16_t *match = u_strFindFirst(array + start, length, srcChars + srcStart, srcLength);
  ------------------
  |  |  361|  20.0M|#define u_strFindFirst U_ICU_ENTRY_POINT_RENAME(u_strFindFirst)
  |  |  ------------------
  |  |  |  |  123|  20.0M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  20.0M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  20.0M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1128|  20.0M|  if(match == nullptr) {
  ------------------
  |  Branch (1128:6): [True: 4.41M, False: 15.6M]
  ------------------
 1129|  4.41M|    return -1;
 1130|  15.6M|  } else {
 1131|  15.6M|    return static_cast<int32_t>(match - array);
 1132|  15.6M|  }
 1133|  20.0M|}
_ZNK6icu_7813UnicodeString9doIndexOfEDsii:
 1139|  7.59M|{
 1140|       |  // pin indices
 1141|  7.59M|  pinIndices(start, length);
 1142|       |
 1143|       |  // find the first occurrence of c
 1144|  7.59M|  const char16_t *array = getArrayStart();
 1145|  7.59M|  const char16_t *match = u_memchr(array + start, c, length);
  ------------------
  |  |  330|  7.59M|#define u_memchr U_ICU_ENTRY_POINT_RENAME(u_memchr)
  |  |  ------------------
  |  |  |  |  123|  7.59M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.59M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.59M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1146|  7.59M|  if(match == nullptr) {
  ------------------
  |  Branch (1146:6): [True: 5.35M, False: 2.24M]
  ------------------
 1147|  5.35M|    return -1;
 1148|  5.35M|  } else {
 1149|  2.24M|    return static_cast<int32_t>(match - array);
 1150|  2.24M|  }
 1151|  7.59M|}
_ZN6icu_7813UnicodeString10setToBogusEv:
 1283|  56.0M|{
 1284|  56.0M|  releaseArray();
 1285|       |
 1286|  56.0M|  fUnion.fFields.fLengthAndFlags = kIsBogus;
 1287|  56.0M|  fUnion.fFields.fArray = nullptr;
 1288|  56.0M|  fUnion.fFields.fCapacity = 0;
 1289|  56.0M|}
_ZN6icu_7813UnicodeString7unBogusEv:
 1293|  74.9M|UnicodeString::unBogus() {
 1294|  74.9M|  if(fUnion.fFields.fLengthAndFlags & kIsBogus) {
  ------------------
  |  Branch (1294:6): [True: 7, False: 74.9M]
  ------------------
 1295|      7|    setToEmpty();
 1296|      7|  }
 1297|  74.9M|}
_ZN6icu_7813UnicodeString5setToEaNS_14ConstChar16PtrEi:
 1342|   307k|{
 1343|   307k|  if(fUnion.fFields.fLengthAndFlags & kOpenGetBuffer) {
  ------------------
  |  Branch (1343:6): [True: 0, False: 307k]
  ------------------
 1344|       |    // do not modify a string that has an "open" getBuffer(minCapacity)
 1345|      0|    return *this;
 1346|      0|  }
 1347|       |
 1348|   307k|  const char16_t *text = textPtr;
 1349|   307k|  if(text == nullptr) {
  ------------------
  |  Branch (1349:6): [True: 0, False: 307k]
  ------------------
 1350|       |    // treat as an empty string, do not alias
 1351|      0|    releaseArray();
 1352|      0|    setToEmpty();
 1353|      0|    return *this;
 1354|      0|  }
 1355|       |
 1356|   307k|  if( textLength < -1 ||
  ------------------
  |  Branch (1356:7): [True: 0, False: 307k]
  ------------------
 1357|   307k|      (textLength == -1 && !isTerminated) ||
  ------------------
  |  Branch (1357:8): [True: 0, False: 307k]
  |  Branch (1357:28): [True: 0, False: 0]
  ------------------
 1358|   307k|      (textLength >= 0 && isTerminated && text[textLength] != 0)
  ------------------
  |  Branch (1358:8): [True: 307k, False: 0]
  |  Branch (1358:27): [True: 307k, False: 0]
  |  Branch (1358:43): [True: 0, False: 307k]
  ------------------
 1359|   307k|  ) {
 1360|      0|    setToBogus();
 1361|      0|    return *this;
 1362|      0|  }
 1363|       |
 1364|   307k|  releaseArray();
 1365|       |
 1366|   307k|  if(textLength == -1) {
  ------------------
  |  Branch (1366:6): [True: 0, False: 307k]
  ------------------
 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|   307k|  fUnion.fFields.fLengthAndFlags = kReadonlyAlias;
 1371|   307k|  setArray(const_cast<char16_t*>(text), textLength, isTerminated ? textLength + 1 : textLength);
  ------------------
  |  Branch (1371:53): [True: 307k, False: 0]
  ------------------
 1372|   307k|  return *this;
 1373|   307k|}
_ZN6icu_7813UnicodeString7replaceEiii:
 1456|  2.41M|               UChar32 srcChar) {
 1457|  2.41M|  char16_t buffer[U16_MAX_LENGTH];
 1458|  2.41M|  int32_t count = 0;
 1459|  2.41M|  UBool isError = false;
 1460|  2.41M|  U16_APPEND(buffer, count, U16_MAX_LENGTH, srcChar, isError);
  ------------------
  |  |  393|  2.41M|#define U16_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.41M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  394|  2.41M|    if((uint32_t)(c)<=0xffff) { \
  |  |  ------------------
  |  |  |  Branch (394:8): [True: 2.40M, False: 7.53k]
  |  |  ------------------
  |  |  395|  2.40M|        (s)[(i)++]=(uint16_t)(c); \
  |  |  396|  2.40M|    } else if((uint32_t)(c)<=0x10ffff && (i)+1<(capacity)) { \
  |  |  ------------------
  |  |  |  Branch (396:15): [True: 7.53k, False: 0]
  |  |  |  Branch (396:42): [True: 7.53k, False: 0]
  |  |  ------------------
  |  |  397|  7.53k|        (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
  |  |  398|  7.53k|        (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
  |  |  399|  7.53k|    } else /* c>0x10ffff or not enough space */ { \
  |  |  400|      0|        (isError)=true; \
  |  |  401|      0|    } \
  |  |  402|  2.41M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.41M|#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|  2.41M|  return doReplace(start, _length, buffer, 0, isError ? 0 : count);
  ------------------
  |  Branch (1464:47): [True: 0, False: 2.41M]
  ------------------
 1465|  2.41M|}
_ZN6icu_7813UnicodeString6appendEi:
 1468|  30.7M|UnicodeString::append(UChar32 srcChar) {
 1469|  30.7M|  char16_t buffer[U16_MAX_LENGTH];
 1470|  30.7M|  int32_t _length = 0;
 1471|  30.7M|  UBool isError = false;
 1472|  30.7M|  U16_APPEND(buffer, _length, U16_MAX_LENGTH, srcChar, isError);
  ------------------
  |  |  393|  30.7M|#define U16_APPEND(s, i, capacity, c, isError) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  30.7M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |  394|  30.7M|    if((uint32_t)(c)<=0xffff) { \
  |  |  ------------------
  |  |  |  Branch (394:8): [True: 30.7M, False: 0]
  |  |  ------------------
  |  |  395|  30.7M|        (s)[(i)++]=(uint16_t)(c); \
  |  |  396|  30.7M|    } 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|  30.7M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  30.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|  30.7M|  return isError ? *this : doAppend(buffer, 0, _length);
  ------------------
  |  Branch (1475:10): [True: 0, False: 30.7M]
  ------------------
 1476|  30.7M|}
_ZN6icu_7813UnicodeString9doReplaceEiiRKS0_ii:
 1484|  73.1M|{
 1485|       |  // pin the indices to legal values
 1486|  73.1M|  src.pinIndices(srcStart, srcLength);
 1487|       |
 1488|       |  // get the characters from src
 1489|       |  // and replace the range in ourselves with them
 1490|  73.1M|  return doReplace(start, length, src.getArrayStart(), srcStart, srcLength);
 1491|  73.1M|}
_ZN6icu_7813UnicodeString9doReplaceEiiPKDsii:
 1499|  82.1M|{
 1500|  82.1M|  if(!isWritable()) {
  ------------------
  |  Branch (1500:6): [True: 0, False: 82.1M]
  ------------------
 1501|      0|    return *this;
 1502|      0|  }
 1503|       |
 1504|  82.1M|  int32_t oldLength = this->length();
 1505|       |
 1506|       |  // optimize (read-only alias).remove(0, start) and .remove(start, end)
 1507|  82.1M|  if((fUnion.fFields.fLengthAndFlags&kBufferIsReadonly) && srcLength == 0) {
  ------------------
  |  Branch (1507:6): [True: 133k, False: 82.0M]
  |  Branch (1507:60): [True: 0, False: 133k]
  ------------------
 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|  82.1M|  if(start == oldLength) {
  ------------------
  |  Branch (1526:6): [True: 76.8M, False: 5.32M]
  ------------------
 1527|  76.8M|    return doAppend(srcChars, srcStart, srcLength);
 1528|  76.8M|  }
 1529|       |
 1530|  5.32M|  if (srcChars == nullptr) {
  ------------------
  |  Branch (1530:7): [True: 2.38M, False: 2.93M]
  ------------------
 1531|  2.38M|    srcLength = 0;
 1532|  2.93M|  } else {
 1533|       |    // Perform all remaining operations relative to srcChars + srcStart.
 1534|       |    // From this point forward, do not use srcStart.
 1535|  2.93M|    srcChars += srcStart;
 1536|  2.93M|    if (srcLength < 0) {
  ------------------
  |  Branch (1536:9): [True: 0, False: 2.93M]
  ------------------
 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|  2.93M|  }
 1541|       |
 1542|       |  // pin the indices to legal values
 1543|  5.32M|  pinIndices(start, length);
 1544|       |
 1545|       |  // Calculate the size of the string after the replace.
 1546|       |  // Avoid int32_t overflow.
 1547|  5.32M|  int32_t newLength = oldLength - length;
 1548|  5.32M|  if(srcLength > (INT32_MAX - newLength)) {
  ------------------
  |  Branch (1548:6): [True: 0, False: 5.32M]
  ------------------
 1549|      0|    setToBogus();
 1550|      0|    return *this;
 1551|      0|  }
 1552|  5.32M|  newLength += srcLength;
 1553|       |
 1554|       |  // Check for insertion into ourself
 1555|  5.32M|  const char16_t *oldArray = getArrayStart();
 1556|  5.32M|  if (isBufferWritable() &&
  ------------------
  |  Branch (1556:7): [True: 4.62M, False: 696k]
  ------------------
 1557|  5.32M|      oldArray < srcChars + srcLength &&
  ------------------
  |  Branch (1557:7): [True: 1.85M, False: 2.77M]
  ------------------
 1558|  5.32M|      srcChars < oldArray + oldLength) {
  ------------------
  |  Branch (1558:7): [True: 0, False: 1.85M]
  ------------------
 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|  5.32M|  char16_t oldStackBuffer[US_STACKBUF_SIZE];
 1571|  5.32M|  if((fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) && (newLength > US_STACKBUF_SIZE)) {
  ------------------
  |  Branch (1571:6): [True: 4.25M, False: 1.06M]
  |  Branch (1571:60): [True: 12.1k, False: 4.24M]
  ------------------
 1572|       |    // copy the stack buffer contents because it will be overwritten with
 1573|       |    // fUnion.fFields values
 1574|  12.1k|    u_memcpy(oldStackBuffer, oldArray, oldLength);
  ------------------
  |  |  334|  12.1k|#define u_memcpy U_ICU_ENTRY_POINT_RENAME(u_memcpy)
  |  |  ------------------
  |  |  |  |  123|  12.1k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  12.1k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  12.1k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1575|  12.1k|    oldArray = oldStackBuffer;
 1576|  12.1k|  }
 1577|       |
 1578|       |  // clone our array and allocate a bigger array if needed
 1579|  5.32M|  int32_t *bufferToDelete = nullptr;
 1580|  5.32M|  if(!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength),
  ------------------
  |  Branch (1580:6): [True: 0, False: 5.32M]
  ------------------
 1581|  5.32M|                         false, &bufferToDelete)
 1582|  5.32M|  ) {
 1583|      0|    return *this;
 1584|      0|  }
 1585|       |
 1586|       |  // now do the replace
 1587|       |
 1588|  5.32M|  char16_t *newArray = getArrayStart();
 1589|  5.32M|  if(newArray != oldArray) {
  ------------------
  |  Branch (1589:6): [True: 709k, False: 4.61M]
  ------------------
 1590|       |    // if fArray changed, then we need to copy everything except what will change
 1591|   709k|    us_arrayCopy(oldArray, 0, newArray, 0, start);
 1592|   709k|    us_arrayCopy(oldArray, start + length,
 1593|   709k|                 newArray, start + srcLength,
 1594|   709k|                 oldLength - (start + length));
 1595|  4.61M|  } else if(length != srcLength) {
  ------------------
  |  Branch (1595:13): [True: 2.97M, False: 1.63M]
  ------------------
 1596|       |    // fArray did not change; copy only the portion that isn't changing, leaving a hole
 1597|  2.97M|    us_arrayCopy(oldArray, start + length,
 1598|  2.97M|                 newArray, start + srcLength,
 1599|  2.97M|                 oldLength - (start + length));
 1600|  2.97M|  }
 1601|       |
 1602|       |  // now fill in the hole with the new string
 1603|  5.32M|  us_arrayCopy(srcChars, 0, newArray, start, srcLength);
 1604|       |
 1605|  5.32M|  setLength(newLength);
 1606|       |
 1607|       |  // delayed delete in case srcChars == fArray when we started, and
 1608|       |  // to keep oldArray alive for the above operations
 1609|  5.32M|  if (bufferToDelete) {
  ------------------
  |  Branch (1609:7): [True: 746, False: 5.32M]
  ------------------
 1610|    746|    uprv_free(bufferToDelete);
  ------------------
  |  | 1503|    746|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    746|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    746|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    746|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1611|    746|  }
 1612|       |
 1613|  5.32M|  return *this;
 1614|  5.32M|}
_ZN6icu_7813UnicodeString9doReplaceEiiNSt3__117basic_string_viewIDsNS1_11char_traitsIDsEEEE:
 1617|  38.5k|UnicodeString::doReplace(int32_t start, int32_t length, std::u16string_view src) {
 1618|  38.5k|  if (!isWritable()) {
  ------------------
  |  Branch (1618:7): [True: 0, False: 38.5k]
  ------------------
 1619|      0|    return *this;
 1620|      0|  }
 1621|  38.5k|  if (src.length() > INT32_MAX) {
  ------------------
  |  Branch (1621:7): [True: 0, False: 38.5k]
  ------------------
 1622|      0|    setToBogus();
 1623|      0|    return *this;
 1624|      0|  }
 1625|  38.5k|  return doReplace(start, length, src.data(), 0, static_cast<int32_t>(src.length()));
 1626|  38.5k|}
_ZN6icu_7813UnicodeString8doAppendERKS0_ii:
 1632|  1.15M|UnicodeString::doAppend(const UnicodeString& src, int32_t srcStart, int32_t srcLength) {
 1633|  1.15M|  if(srcLength == 0) {
  ------------------
  |  Branch (1633:6): [True: 211k, False: 944k]
  ------------------
 1634|   211k|    return *this;
 1635|   211k|  }
 1636|       |
 1637|       |  // pin the indices to legal values
 1638|   944k|  src.pinIndices(srcStart, srcLength);
 1639|   944k|  return doAppend(src.getArrayStart(), srcStart, srcLength);
 1640|  1.15M|}
_ZN6icu_7813UnicodeString8doAppendEPKDsii:
 1643|   176M|UnicodeString::doAppend(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) {
 1644|   176M|  if(!isWritable() || srcLength == 0 || srcChars == nullptr) {
  ------------------
  |  Branch (1644:6): [True: 0, False: 176M]
  |  Branch (1644:23): [True: 50.8M, False: 125M]
  |  Branch (1644:41): [True: 0, False: 125M]
  ------------------
 1645|  50.8M|    return *this;
 1646|  50.8M|  }
 1647|       |
 1648|       |  // Perform all remaining operations relative to srcChars + srcStart.
 1649|       |  // From this point forward, do not use srcStart.
 1650|   125M|  srcChars += srcStart;
 1651|       |
 1652|   125M|  if(srcLength < 0) {
  ------------------
  |  Branch (1652:6): [True: 28, False: 125M]
  ------------------
 1653|       |    // get the srcLength if necessary
 1654|     28|    if((srcLength = u_strlen(srcChars)) == 0) {
  ------------------
  |  |  393|     28|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|     28|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     28|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     28|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1654:8): [True: 0, False: 28]
  ------------------
 1655|      0|      return *this;
 1656|      0|    }
 1657|     28|  }
 1658|       |
 1659|   125M|  int32_t oldLength = length();
 1660|   125M|  int32_t newLength;
 1661|       |
 1662|   125M|  if (srcLength <= getCapacity() - oldLength && isBufferWritable()) {
  ------------------
  |  Branch (1662:7): [True: 117M, False: 8.23M]
  |  Branch (1662:49): [True: 117M, False: 9.40k]
  ------------------
 1663|   117M|    newLength = oldLength + srcLength;
 1664|       |    // Faster than a memmove
 1665|   117M|    if (srcLength <= 4) {
  ------------------
  |  Branch (1665:9): [True: 114M, False: 3.13M]
  ------------------
 1666|   114M|      char16_t *arr = getArrayStart();
 1667|   114M|      arr[oldLength] = srcChars[0];
 1668|   114M|      if (srcLength > 1) arr[oldLength+1] = srcChars[1];
  ------------------
  |  Branch (1668:11): [True: 4.76M, False: 109M]
  ------------------
 1669|   114M|      if (srcLength > 2) arr[oldLength+2] = srcChars[2];
  ------------------
  |  Branch (1669:11): [True: 2.18M, False: 112M]
  ------------------
 1670|   114M|      if (srcLength > 3) arr[oldLength+3] = srcChars[3];
  ------------------
  |  Branch (1670:11): [True: 724k, False: 113M]
  ------------------
 1671|   114M|      setLength(newLength);
 1672|   114M|      return *this;
 1673|   114M|    }
 1674|   117M|  } else {
 1675|  8.24M|    if (uprv_add32_overflow(oldLength, srcLength, &newLength)) {
  ------------------
  |  | 1394|  8.24M|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|  8.24M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  8.24M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  8.24M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1675:9): [True: 0, False: 8.24M]
  ------------------
 1676|      0|      setToBogus();
 1677|      0|      return *this;
 1678|      0|    }
 1679|       |
 1680|       |    // Check for append onto ourself
 1681|  8.24M|    const char16_t* oldArray = getArrayStart();
 1682|  8.24M|    if (isBufferWritable() &&
  ------------------
  |  Branch (1682:9): [True: 8.22M, False: 19.0k]
  ------------------
 1683|  8.24M|        oldArray < srcChars + srcLength &&
  ------------------
  |  Branch (1683:9): [True: 25.9k, False: 8.20M]
  ------------------
 1684|  8.24M|        srcChars < oldArray + oldLength) {
  ------------------
  |  Branch (1684:9): [True: 0, False: 25.9k]
  ------------------
 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|  8.24M|    if (!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength))) {
  ------------------
  |  Branch (1695:9): [True: 0, False: 8.24M]
  ------------------
 1696|      0|      return *this;
 1697|      0|    }
 1698|  8.24M|  }
 1699|       |
 1700|  11.3M|  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|  11.3M|  if(srcChars != newArray + oldLength) {
  ------------------
  |  Branch (1708:6): [True: 11.3M, False: 0]
  ------------------
 1709|  11.3M|    us_arrayCopy(srcChars, 0, newArray, oldLength, srcLength);
 1710|  11.3M|  }
 1711|  11.3M|  setLength(newLength);
 1712|       |
 1713|  11.3M|  return *this;
 1714|   125M|}
_ZN6icu_7813UnicodeString8doAppendENSt3__117basic_string_viewIDsNS1_11char_traitsIDsEEEE:
 1717|   265k|UnicodeString::doAppend(std::u16string_view src) {
 1718|   265k|  if (!isWritable() || src.empty()) {
  ------------------
  |  Branch (1718:7): [True: 0, False: 265k]
  |  Branch (1718:24): [True: 19.2k, False: 246k]
  ------------------
 1719|  19.2k|    return *this;
 1720|  19.2k|  }
 1721|   246k|  if (src.length() > INT32_MAX) {
  ------------------
  |  Branch (1721:7): [True: 0, False: 246k]
  ------------------
 1722|      0|    setToBogus();
 1723|      0|    return *this;
 1724|      0|  }
 1725|   246k|  return doAppend(src.data(), 0, static_cast<int32_t>(src.length()));
 1726|   246k|}
_ZN6icu_7813UnicodeString18cloneArrayIfNeededEiiaPPia:
 1917|  13.5M|                                  UBool forceClone) {
 1918|       |  // default parameters need to be static, therefore
 1919|       |  // the defaults are -1 to have convenience defaults
 1920|  13.5M|  if(newCapacity == -1) {
  ------------------
  |  Branch (1920:6): [True: 0, False: 13.5M]
  ------------------
 1921|      0|    newCapacity = getCapacity();
 1922|      0|  }
 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|  13.5M|  if(!isWritable()) {
  ------------------
  |  Branch (1927:6): [True: 0, False: 13.5M]
  ------------------
 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|  13.5M|  if(forceClone ||
  ------------------
  |  Branch (1938:6): [True: 0, False: 13.5M]
  ------------------
 1939|  13.5M|     fUnion.fFields.fLengthAndFlags & kBufferIsReadonly ||
  ------------------
  |  Branch (1939:6): [True: 152k, False: 13.4M]
  ------------------
 1940|  13.5M|     (fUnion.fFields.fLengthAndFlags & kRefCounted && refCount() > 1) ||
  ------------------
  |  Branch (1940:7): [True: 959k, False: 12.4M]
  |  Branch (1940:55): [True: 563k, False: 396k]
  ------------------
 1941|  13.5M|     newCapacity > getCapacity()
  ------------------
  |  Branch (1941:6): [True: 8.24M, False: 4.61M]
  ------------------
 1942|  13.5M|  ) {
 1943|       |    // check growCapacity for default value and use of the stack buffer
 1944|  8.95M|    if(growCapacity < 0) {
  ------------------
  |  Branch (1944:8): [True: 0, False: 8.95M]
  ------------------
 1945|      0|      growCapacity = newCapacity;
 1946|  8.95M|    } else if(newCapacity <= US_STACKBUF_SIZE && growCapacity > US_STACKBUF_SIZE) {
  ------------------
  |  Branch (1946:15): [True: 203k, False: 8.75M]
  |  Branch (1946:50): [True: 203k, False: 0]
  ------------------
 1947|   203k|      growCapacity = US_STACKBUF_SIZE;
 1948|  8.75M|    } else if(newCapacity > growCapacity) {
  ------------------
  |  Branch (1948:15): [True: 0, False: 8.75M]
  ------------------
 1949|      0|      setToBogus();
 1950|      0|      return false;  // bad inputs
 1951|      0|    }
 1952|  8.95M|    if(growCapacity > kMaxCapacity) {
  ------------------
  |  Branch (1952:8): [True: 0, False: 8.95M]
  ------------------
 1953|      0|      setToBogus();
 1954|      0|      return false;
 1955|      0|    }
 1956|       |
 1957|       |    // save old values
 1958|  8.95M|    char16_t oldStackBuffer[US_STACKBUF_SIZE];
 1959|  8.95M|    char16_t *oldArray;
 1960|  8.95M|    int32_t oldLength = length();
 1961|  8.95M|    int16_t flags = fUnion.fFields.fLengthAndFlags;
 1962|       |
 1963|  8.95M|    if(flags&kUsingStackBuffer) {
  ------------------
  |  Branch (1963:8): [True: 8.21M, False: 741k]
  ------------------
 1964|  8.21M|      U_ASSERT(!(flags&kRefCounted)); /* kRefCounted and kUsingStackBuffer are mutally exclusive */
  ------------------
  |  |   35|  8.21M|#   define U_ASSERT(exp) (void)0
  ------------------
 1965|  8.21M|      if(doCopyArray && growCapacity > US_STACKBUF_SIZE) {
  ------------------
  |  Branch (1965:10): [True: 8.20M, False: 12.1k]
  |  Branch (1965:25): [True: 8.20M, False: 0]
  ------------------
 1966|       |        // copy the stack buffer contents because it will be overwritten with
 1967|       |        // fUnion.fFields values
 1968|  8.20M|        us_arrayCopy(fUnion.fStackFields.fBuffer, 0, oldStackBuffer, 0, oldLength);
 1969|  8.20M|        oldArray = oldStackBuffer;
 1970|  8.20M|      } else {
 1971|  12.1k|        oldArray = nullptr; // no need to copy from the stack buffer to itself
 1972|  12.1k|      }
 1973|  8.21M|    } else {
 1974|   741k|      oldArray = fUnion.fFields.fArray;
 1975|   741k|      U_ASSERT(oldArray!=nullptr); /* when stack buffer is not used, oldArray must have a non-nullptr reference */
  ------------------
  |  |   35|   741k|#   define U_ASSERT(exp) (void)0
  ------------------
 1976|   741k|    }
 1977|       |
 1978|       |    // allocate a new array
 1979|  8.95M|    if(allocate(growCapacity) ||
  ------------------
  |  Branch (1979:8): [True: 8.95M, False: 0]
  ------------------
 1980|  8.95M|       (newCapacity < growCapacity && allocate(newCapacity))
  ------------------
  |  Branch (1980:9): [True: 0, False: 0]
  |  Branch (1980:39): [True: 0, False: 0]
  ------------------
 1981|  8.95M|    ) {
 1982|  8.95M|      if(doCopyArray) {
  ------------------
  |  Branch (1982:10): [True: 8.24M, False: 709k]
  ------------------
 1983|       |        // copy the contents
 1984|       |        // do not copy more than what fits - it may be smaller than before
 1985|  8.24M|        int32_t minLength = oldLength;
 1986|  8.24M|        newCapacity = getCapacity();
 1987|  8.24M|        if(newCapacity < minLength) {
  ------------------
  |  Branch (1987:12): [True: 0, False: 8.24M]
  ------------------
 1988|      0|          minLength = newCapacity;
 1989|      0|        }
 1990|  8.24M|        if(oldArray != nullptr) {
  ------------------
  |  Branch (1990:12): [True: 8.24M, False: 0]
  ------------------
 1991|  8.24M|          us_arrayCopy(oldArray, 0, getArrayStart(), 0, minLength);
 1992|  8.24M|        }
 1993|  8.24M|        setLength(minLength);
 1994|  8.24M|      } else {
 1995|   709k|        setZeroLength();
 1996|   709k|      }
 1997|       |
 1998|       |      // release the old array
 1999|  8.95M|      if(flags & kRefCounted) {
  ------------------
  |  Branch (1999:10): [True: 589k, False: 8.36M]
  ------------------
 2000|       |        // the array is refCounted; decrement and release if 0
 2001|   589k|        u_atomic_int32_t* pRefCount = reinterpret_cast<u_atomic_int32_t*>(oldArray) - 1;
 2002|   589k|        if(umtx_atomic_dec(pRefCount) == 0) {
  ------------------
  |  Branch (2002:12): [True: 25.6k, False: 563k]
  ------------------
 2003|  25.6k|          if (pBufferToDelete == nullptr) {
  ------------------
  |  Branch (2003:15): [True: 24.8k, False: 746]
  ------------------
 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|  24.8k|            uprv_free((void *)pRefCount);
  ------------------
  |  | 1503|  24.8k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  24.8k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  24.8k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  24.8k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2008|  24.8k|          } else {
 2009|       |            // the caller requested to delete it himself
 2010|    746|            *pBufferToDelete = reinterpret_cast<int32_t*>(pRefCount);
 2011|    746|          }
 2012|  25.6k|        }
 2013|   589k|      }
 2014|  8.95M|    } else {
 2015|       |      // not enough memory for growCapacity and not even for the smaller newCapacity
 2016|       |      // reset the old values for setToBogus() to release the array
 2017|      0|      if(!(flags&kUsingStackBuffer)) {
  ------------------
  |  Branch (2017:10): [True: 0, False: 0]
  ------------------
 2018|      0|        fUnion.fFields.fArray = oldArray;
 2019|      0|      }
 2020|      0|      fUnion.fFields.fLengthAndFlags = flags;
 2021|      0|      setToBogus();
 2022|      0|      return false;
 2023|      0|    }
 2024|  8.95M|  }
 2025|  13.5M|  return true;
 2026|  13.5M|}
uhash_compareUnicodeString_78:
 2089|      1|uhash_compareUnicodeString(const UElement key1, const UElement key2) {
 2090|      1|    const UnicodeString *str1 = (const UnicodeString*) key1.pointer;
 2091|      1|    const UnicodeString *str2 = (const UnicodeString*) key2.pointer;
 2092|      1|    if (str1 == str2) {
  ------------------
  |  Branch (2092:9): [True: 0, False: 1]
  ------------------
 2093|      0|        return true;
 2094|      0|    }
 2095|      1|    if (str1 == nullptr || str2 == nullptr) {
  ------------------
  |  Branch (2095:9): [True: 0, False: 1]
  |  Branch (2095:28): [True: 0, False: 1]
  ------------------
 2096|      0|        return false;
 2097|      0|    }
 2098|      1|    return *str1 == *str2;
 2099|      1|}
unistr.cpp:_ZL20UnicodeString_charAtiPv:
   96|     46|UnicodeString_charAt(int32_t offset, void *context) {
   97|     46|    return ((icu::UnicodeString*) context)->charAt(offset);
   98|     46|}
unistr.cpp:_ZL12us_arrayCopyPKDsiPDsii:
   87|  37.5M|{
   88|  37.5M|  if(count>0) {
  ------------------
  |  Branch (88:6): [True: 17.3M, False: 20.2M]
  ------------------
   89|  17.3M|    uprv_memmove(dst+dstStart, src+srcStart, (size_t)count*sizeof(*src));
  ------------------
  |  |   51|  17.3M|#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  17.3M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   52|  17.3M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   53|  17.3M|    _Pragma("clang diagnostic push") \
  |  |   54|  17.3M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   55|  17.3M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  17.3M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   56|  17.3M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  17.3M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   57|  17.3M|    _Pragma("clang diagnostic pop") \
  |  |   58|  17.3M|    U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  17.3M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   59|  17.3M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  17.3M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   90|  17.3M|  }
   91|  37.5M|}
unistr.cpp:_ZN6icu_7812_GLOBAL__N_115getGrowCapacityEi:
  397|  13.5M|int32_t getGrowCapacity(int32_t newLength) {
  398|  13.5M|  int32_t growSize = (newLength >> 2) + kGrowSize;
  399|  13.5M|  if(growSize <= (kMaxCapacity - newLength)) {
  ------------------
  |  Branch (399:6): [True: 13.5M, False: 0]
  ------------------
  400|  13.5M|    return newLength + growSize;
  401|  13.5M|  } else {
  402|      0|    return kMaxCapacity;
  403|      0|  }
  404|  13.5M|}

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

u_hasBinaryProperty_78:
  487|  9.25k|u_hasBinaryProperty(UChar32 c, UProperty which) {
  488|       |    /* c is range-checked in the functions that are called from here */
  489|  9.25k|    if(which<UCHAR_BINARY_START || UCHAR_BINARY_LIMIT<=which) {
  ------------------
  |  Branch (489:8): [True: 0, False: 9.25k]
  |  Branch (489:36): [True: 0, False: 9.25k]
  ------------------
  490|       |        /* not a known binary property */
  491|      0|        return false;
  492|  9.25k|    } else {
  493|  9.25k|        const BinaryProperty &prop=binProps[which];
  494|  9.25k|        return prop.contains(prop, c, which);
  495|  9.25k|    }
  496|  9.25k|}
uprops_getSource_78:
  791|      4|uprops_getSource(UProperty which) {
  792|      4|    if(which<UCHAR_BINARY_START) {
  ------------------
  |  Branch (792:8): [True: 0, False: 4]
  ------------------
  793|      0|        return UPROPS_SRC_NONE; /* undefined */
  794|      4|    } else if(which<UCHAR_BINARY_LIMIT) {
  ------------------
  |  Branch (794:15): [True: 2, False: 2]
  ------------------
  795|      2|        const BinaryProperty &prop=binProps[which];
  796|      2|        if(prop.mask!=0) {
  ------------------
  |  Branch (796:12): [True: 1, False: 1]
  ------------------
  797|      1|            return UPROPS_SRC_PROPSVEC;
  798|      1|        } else {
  799|      1|            return (UPropertySource)prop.column;
  800|      1|        }
  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|      4|}
uprops.cpp:_ZL15defaultContainsRK14BinaryPropertyi9UProperty:
  168|  7.12k|static UBool defaultContains(const BinaryProperty &prop, UChar32 c, UProperty /*which*/) {
  169|       |    /* systematic, directly stored properties */
  170|  7.12k|    return (u_getUnicodeProperties(c, prop.column)&prop.mask)!=0;
  ------------------
  |  |  288|  7.12k|#define u_getUnicodeProperties U_ICU_ENTRY_POINT_RENAME(u_getUnicodeProperties)
  |  |  ------------------
  |  |  |  |  123|  7.12k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  7.12k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  7.12k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  171|  7.12k|}
uprops.cpp:_ZL13isBidiControlRK14BinaryPropertyi9UProperty:
  177|  2.12k|static UBool isBidiControl(const BinaryProperty &/*prop*/, UChar32 c, UProperty /*which*/) {
  178|  2.12k|    return ubidi_isBidiControl(c);
  ------------------
  |  |  471|  2.12k|#define ubidi_isBidiControl U_ICU_ENTRY_POINT_RENAME(ubidi_isBidiControl)
  |  |  ------------------
  |  |  |  |  123|  2.12k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.12k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.12k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  179|  2.12k|}

ures_initStackObject_78:
  726|  1.78M|U_CFUNC void ures_initStackObject(UResourceBundle* resB) {
  727|  1.78M|  uprv_memset(resB, 0, sizeof(UResourceBundle));
  ------------------
  |  |  100|  1.78M|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  1.78M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  728|  1.78M|  ures_setIsStackObject(resB, true);
  729|  1.78M|}
_ZN6icu_7820StackUResourceBundleC2Ev:
  733|   795k|StackUResourceBundle::StackUResourceBundle() {
  734|   795k|    ures_initStackObject(&bundle);
  ------------------
  |  | 1690|   795k|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|   795k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   795k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   795k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  735|   795k|}
_ZN6icu_7820StackUResourceBundleD2Ev:
  737|   795k|StackUResourceBundle::~StackUResourceBundle() {
  738|   795k|    ures_close(&bundle);
  ------------------
  |  | 1652|   795k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|   795k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   795k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   795k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  739|   795k|}
ures_close_78:
 1147|  7.13M|{
 1148|  7.13M|    ures_closeBundle(resB, true);
 1149|  7.13M|}
ures_getString_78:
 1524|   988k|U_CAPI const char16_t* U_EXPORT2 ures_getString(const UResourceBundle* resB, int32_t* len, UErrorCode* status) {
 1525|   988k|    const char16_t *s;
 1526|   988k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1526:9): [True: 0, False: 988k]
  |  Branch (1526:28): [True: 517k, False: 471k]
  ------------------
 1527|   517k|        return nullptr;
 1528|   517k|    }
 1529|   471k|    if(resB == nullptr) {
  ------------------
  |  Branch (1529:8): [True: 0, False: 471k]
  ------------------
 1530|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1531|      0|        return nullptr;
 1532|      0|    }
 1533|   471k|    s = res_getString({resB}, &resB->getResData(), resB->fRes, len);
 1534|   471k|    if (s == nullptr) {
  ------------------
  |  Branch (1534:9): [True: 0, False: 471k]
  ------------------
 1535|      0|        *status = U_RESOURCE_TYPE_MISMATCH;
 1536|      0|    }
 1537|   471k|    return s;
 1538|   471k|}
ures_getIntVector_78:
 1630|  46.8k|                                                   UErrorCode*               status) {
 1631|  46.8k|  const int32_t *p;
 1632|  46.8k|  if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1632:7): [True: 0, False: 46.8k]
  |  Branch (1632:26): [True: 0, False: 46.8k]
  ------------------
 1633|      0|    return nullptr;
 1634|      0|  }
 1635|  46.8k|  if(resB == nullptr) {
  ------------------
  |  Branch (1635:6): [True: 0, False: 46.8k]
  ------------------
 1636|      0|    *status = U_ILLEGAL_ARGUMENT_ERROR;
 1637|      0|    return nullptr;
 1638|      0|  }
 1639|  46.8k|  p = res_getIntVector({resB}, &resB->getResData(), resB->fRes, len);
 1640|  46.8k|  if (p == nullptr) {
  ------------------
  |  Branch (1640:7): [True: 0, False: 46.8k]
  ------------------
 1641|      0|    *status = U_RESOURCE_TYPE_MISMATCH;
 1642|      0|  }
 1643|  46.8k|  return p;
 1644|  46.8k|}
ures_getInt_78:
 1648|   304k|U_CAPI int32_t U_EXPORT2 ures_getInt(const UResourceBundle* resB, UErrorCode *status) {
 1649|   304k|  if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1649:7): [True: 0, False: 304k]
  |  Branch (1649:26): [True: 0, False: 304k]
  ------------------
 1650|      0|    return 0xffffffff;
 1651|      0|  }
 1652|   304k|  if(resB == nullptr) {
  ------------------
  |  Branch (1652:6): [True: 0, False: 304k]
  ------------------
 1653|      0|    *status = U_ILLEGAL_ARGUMENT_ERROR;
 1654|      0|    return 0xffffffff;
 1655|      0|  }
 1656|   304k|  if(RES_GET_TYPE(resB->fRes) != URES_INT) {
  ------------------
  |  |   68|   304k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (1656:6): [True: 0, False: 304k]
  ------------------
 1657|      0|    *status = U_RESOURCE_TYPE_MISMATCH;
 1658|      0|    return 0xffffffff;
 1659|      0|  }
 1660|   304k|  return res_getInt({resB}, resB->fRes);
 1661|   304k|}
ures_getKey_78:
 1685|  1.29k|U_CAPI const char * U_EXPORT2 ures_getKey(const UResourceBundle *resB) {
 1686|       |  //
 1687|       |  // TODO: Trace ures_getKey? I guess not usually.
 1688|       |  //
 1689|       |  // We usually get the key string to decide whether we want the value, or to
 1690|       |  // make a key-value pair. Tracing the value should suffice.
 1691|       |  //
 1692|       |  // However, I believe we have some data (e.g., in res_index) where the key
 1693|       |  // strings are the data. Tracing the enclosing table should suffice.
 1694|       |  //
 1695|  1.29k|  if(resB == nullptr) {
  ------------------
  |  Branch (1695:6): [True: 0, False: 1.29k]
  ------------------
 1696|      0|    return nullptr;
 1697|      0|  }
 1698|  1.29k|  return(resB->fKey);
 1699|  1.29k|}
ures_getSize_78:
 1701|   348k|U_CAPI int32_t U_EXPORT2 ures_getSize(const UResourceBundle *resB) {
 1702|   348k|  if(resB == nullptr) {
  ------------------
  |  Branch (1702:6): [True: 0, False: 348k]
  ------------------
 1703|      0|    return 0;
 1704|      0|  }
 1705|       |  
 1706|   348k|  return resB->fSize;
 1707|   348k|}
ures_hasNext_78:
 1728|  1.29k|U_CAPI UBool U_EXPORT2 ures_hasNext(const UResourceBundle *resB) {
 1729|  1.29k|  if(resB == nullptr) {
  ------------------
  |  Branch (1729:6): [True: 0, False: 1.29k]
  ------------------
 1730|      0|    return false;
 1731|      0|  }
 1732|  1.29k|  return resB->fIndex < resB->fSize-1;
 1733|  1.29k|}
ures_getNextResource_78:
 1784|  1.29k|U_CAPI UResourceBundle* U_EXPORT2 ures_getNextResource(UResourceBundle *resB, UResourceBundle *fillIn, UErrorCode *status) {
 1785|  1.29k|    const char *key = nullptr;
 1786|  1.29k|    Resource r = RES_BOGUS;
  ------------------
  |  |   65|  1.29k|#define RES_BOGUS 0xffffffff
  ------------------
 1787|       |
 1788|  1.29k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1788:9): [True: 0, False: 1.29k]
  |  Branch (1788:28): [True: 0, False: 1.29k]
  ------------------
 1789|       |            /*return nullptr;*/
 1790|      0|            return fillIn;
 1791|      0|    }
 1792|  1.29k|    if(resB == nullptr) {
  ------------------
  |  Branch (1792:8): [True: 0, False: 1.29k]
  ------------------
 1793|      0|            *status = U_ILLEGAL_ARGUMENT_ERROR;
 1794|       |            /*return nullptr;*/
 1795|      0|            return fillIn;
 1796|      0|    }
 1797|       |
 1798|  1.29k|    if(resB->fIndex == resB->fSize-1) {
  ------------------
  |  Branch (1798:8): [True: 0, False: 1.29k]
  ------------------
 1799|      0|      *status = U_INDEX_OUTOFBOUNDS_ERROR;
 1800|       |      /*return nullptr;*/
 1801|  1.29k|    } else {
 1802|  1.29k|        resB->fIndex++;
 1803|  1.29k|        switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|  1.29k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1804|      0|        case URES_INT:
  ------------------
  |  Branch (1804:9): [True: 0, False: 1.29k]
  ------------------
 1805|      0|        case URES_BINARY:
  ------------------
  |  Branch (1805:9): [True: 0, False: 1.29k]
  ------------------
 1806|      0|        case URES_STRING:
  ------------------
  |  Branch (1806:9): [True: 0, False: 1.29k]
  ------------------
 1807|      0|        case URES_STRING_V2:
  ------------------
  |  Branch (1807:9): [True: 0, False: 1.29k]
  ------------------
 1808|      0|        case URES_INT_VECTOR:
  ------------------
  |  Branch (1808:9): [True: 0, False: 1.29k]
  ------------------
 1809|      0|            return ures_copyResb(fillIn, resB, status);
  ------------------
  |  | 1653|      0|#define ures_copyResb U_ICU_ENTRY_POINT_RENAME(ures_copyResb)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1810|  1.29k|        case URES_TABLE:
  ------------------
  |  Branch (1810:9): [True: 1.29k, False: 0]
  ------------------
 1811|  1.29k|        case URES_TABLE16:
  ------------------
  |  Branch (1811:9): [True: 0, False: 1.29k]
  ------------------
 1812|  1.29k|        case URES_TABLE32:
  ------------------
  |  Branch (1812:9): [True: 0, False: 1.29k]
  ------------------
 1813|  1.29k|            r = res_getTableItemByIndex(&resB->getResData(), resB->fRes, resB->fIndex, &key);
  ------------------
  |  |  206|  1.29k|#define res_getTableItemByIndex U_ICU_ENTRY_POINT_RENAME(res_getTableItemByIndex)
  |  |  ------------------
  |  |  |  |  123|  1.29k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.29k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.29k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1814|  1.29k|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|  2.58k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1814:16): [True: 0, False: 1.29k]
  |  Branch (1814:34): [True: 0, False: 0]
  ------------------
 1815|       |                /* TODO: do the fallback */
 1816|      0|            }
 1817|  1.29k|            return init_resb_result(resB->fData, r, key, resB->fIndex, resB, fillIn, status);
 1818|      0|        case URES_ARRAY:
  ------------------
  |  Branch (1818:9): [True: 0, False: 1.29k]
  ------------------
 1819|      0|        case URES_ARRAY16:
  ------------------
  |  Branch (1819:9): [True: 0, False: 1.29k]
  ------------------
 1820|      0|            r = res_getArrayItem(&resB->getResData(), resB->fRes, resB->fIndex);
  ------------------
  |  |  200|      0|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1821|      0|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1821:16): [True: 0, False: 0]
  |  Branch (1821:34): [True: 0, False: 0]
  ------------------
 1822|       |                /* TODO: do the fallback */
 1823|      0|            }
 1824|      0|            return init_resb_result(resB->fData, r, key, resB->fIndex, resB, fillIn, status);
 1825|      0|        default:
  ------------------
  |  Branch (1825:9): [True: 0, False: 1.29k]
  ------------------
 1826|       |            /*return nullptr;*/
 1827|      0|            return fillIn;
 1828|  1.29k|        }
 1829|  1.29k|    }
 1830|       |    /*return nullptr;*/
 1831|      0|    return fillIn;
 1832|  1.29k|}
ures_getByIndex_78:
 1834|   218k|U_CAPI UResourceBundle* U_EXPORT2 ures_getByIndex(const UResourceBundle *resB, int32_t indexR, UResourceBundle *fillIn, UErrorCode *status) {
 1835|   218k|    const char* key = nullptr;
 1836|   218k|    Resource r = RES_BOGUS;
  ------------------
  |  |   65|   218k|#define RES_BOGUS 0xffffffff
  ------------------
 1837|       |
 1838|   218k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1838:9): [True: 0, False: 218k]
  |  Branch (1838:28): [True: 0, False: 218k]
  ------------------
 1839|       |        /*return nullptr;*/
 1840|      0|        return fillIn;
 1841|      0|    }
 1842|   218k|    if(resB == nullptr) {
  ------------------
  |  Branch (1842:8): [True: 0, False: 218k]
  ------------------
 1843|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1844|       |        /*return nullptr;*/
 1845|      0|        return fillIn;
 1846|      0|    }
 1847|       |
 1848|   218k|    if(indexR >= 0 && resB->fSize > indexR) {
  ------------------
  |  Branch (1848:8): [True: 218k, False: 0]
  |  Branch (1848:23): [True: 218k, False: 0]
  ------------------
 1849|   218k|        switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|   218k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1850|      0|        case URES_INT:
  ------------------
  |  Branch (1850:9): [True: 0, False: 218k]
  ------------------
 1851|      0|        case URES_BINARY:
  ------------------
  |  Branch (1851:9): [True: 0, False: 218k]
  ------------------
 1852|      0|        case URES_STRING:
  ------------------
  |  Branch (1852:9): [True: 0, False: 218k]
  ------------------
 1853|      0|        case URES_STRING_V2:
  ------------------
  |  Branch (1853:9): [True: 0, False: 218k]
  ------------------
 1854|      0|        case URES_INT_VECTOR:
  ------------------
  |  Branch (1854:9): [True: 0, False: 218k]
  ------------------
 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: 218k]
  ------------------
 1857|      0|        case URES_TABLE16:
  ------------------
  |  Branch (1857:9): [True: 0, False: 218k]
  ------------------
 1858|      0|        case URES_TABLE32:
  ------------------
  |  Branch (1858:9): [True: 0, False: 218k]
  ------------------
 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|   218k|        case URES_ARRAY:
  ------------------
  |  Branch (1864:9): [True: 218k, False: 0]
  ------------------
 1865|   218k|        case URES_ARRAY16:
  ------------------
  |  Branch (1865:9): [True: 0, False: 218k]
  ------------------
 1866|   218k|            r = res_getArrayItem(&resB->getResData(), resB->fRes, indexR);
  ------------------
  |  |  200|   218k|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|   218k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   218k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   218k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1867|   218k|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|   436k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1867:16): [True: 0, False: 218k]
  |  Branch (1867:34): [True: 0, False: 0]
  ------------------
 1868|       |                /* TODO: do the fallback */
 1869|      0|            }
 1870|   218k|            return init_resb_result(resB->fData, r, key, indexR, resB, fillIn, status);
 1871|      0|        default:
  ------------------
  |  Branch (1871:9): [True: 0, False: 218k]
  ------------------
 1872|       |            /*return nullptr;*/
 1873|      0|            return fillIn;
 1874|   218k|        }
 1875|   218k|    } else {
 1876|      0|        *status = U_MISSING_RESOURCE_ERROR;
 1877|      0|    }
 1878|       |    /*return nullptr;*/
 1879|      0|    return fillIn;
 1880|   218k|}
ures_getStringByIndex_78:
 1882|   347k|U_CAPI const char16_t* U_EXPORT2 ures_getStringByIndex(const UResourceBundle *resB, int32_t indexS, int32_t* len, UErrorCode *status) {
 1883|   347k|    const char* key = nullptr;
 1884|   347k|    Resource r = RES_BOGUS;
  ------------------
  |  |   65|   347k|#define RES_BOGUS 0xffffffff
  ------------------
 1885|       |
 1886|   347k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1886:9): [True: 0, False: 347k]
  |  Branch (1886:28): [True: 6.72k, False: 340k]
  ------------------
 1887|  6.72k|        return nullptr;
 1888|  6.72k|    }
 1889|   340k|    if(resB == nullptr) {
  ------------------
  |  Branch (1889:8): [True: 0, False: 340k]
  ------------------
 1890|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1891|      0|        return nullptr;
 1892|      0|    }
 1893|       |
 1894|   340k|    if(indexS >= 0 && resB->fSize > indexS) {
  ------------------
  |  Branch (1894:8): [True: 340k, False: 0]
  |  Branch (1894:23): [True: 340k, False: 0]
  ------------------
 1895|   340k|        switch(RES_GET_TYPE(resB->fRes)) {
  ------------------
  |  |   68|   340k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1896|      0|        case URES_STRING:
  ------------------
  |  Branch (1896:9): [True: 0, False: 340k]
  ------------------
 1897|      0|        case URES_STRING_V2:
  ------------------
  |  Branch (1897:9): [True: 0, False: 340k]
  ------------------
 1898|      0|            return res_getString({resB}, &resB->getResData(), resB->fRes, len);
 1899|      0|        case URES_TABLE:
  ------------------
  |  Branch (1899:9): [True: 0, False: 340k]
  ------------------
 1900|      0|        case URES_TABLE16:
  ------------------
  |  Branch (1900:9): [True: 0, False: 340k]
  ------------------
 1901|      0|        case URES_TABLE32:
  ------------------
  |  Branch (1901:9): [True: 0, False: 340k]
  ------------------
 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|  29.8k|        case URES_ARRAY:
  ------------------
  |  Branch (1907:9): [True: 29.8k, False: 310k]
  ------------------
 1908|   340k|        case URES_ARRAY16:
  ------------------
  |  Branch (1908:9): [True: 310k, False: 29.8k]
  ------------------
 1909|   340k|            r = res_getArrayItem(&resB->getResData(), resB->fRes, indexS);
  ------------------
  |  |  200|   340k|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|   340k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   340k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   340k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1910|   340k|            if(r == RES_BOGUS && resB->fHasFallback) {
  ------------------
  |  |   65|   680k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1910:16): [True: 0, False: 340k]
  |  Branch (1910:34): [True: 0, False: 0]
  ------------------
 1911|       |                /* TODO: do the fallback */
 1912|      0|            }
 1913|   340k|            return ures_getStringWithAlias(resB, r, indexS, len, status);
 1914|      0|        case URES_ALIAS:
  ------------------
  |  Branch (1914:9): [True: 0, False: 340k]
  ------------------
 1915|      0|            return ures_getStringWithAlias(resB, resB->fRes, indexS, len, status);
 1916|      0|        case URES_INT:
  ------------------
  |  Branch (1916:9): [True: 0, False: 340k]
  ------------------
 1917|      0|        case URES_BINARY:
  ------------------
  |  Branch (1917:9): [True: 0, False: 340k]
  ------------------
 1918|      0|        case URES_INT_VECTOR:
  ------------------
  |  Branch (1918:9): [True: 0, False: 340k]
  ------------------
 1919|      0|            *status = U_RESOURCE_TYPE_MISMATCH;
 1920|      0|            break;
 1921|      0|        default:
  ------------------
  |  Branch (1921:9): [True: 0, False: 340k]
  ------------------
 1922|       |          /* must not occur */
 1923|      0|          *status = U_INTERNAL_PROGRAM_ERROR;
 1924|      0|          break;
 1925|   340k|        }
 1926|   340k|    } else {
 1927|      0|        *status = U_MISSING_RESOURCE_ERROR;
 1928|      0|    }
 1929|      0|    return nullptr;
 1930|   340k|}
ures_getStringByKeyWithFallback_78:
 2033|   988k|                                UErrorCode *status) {
 2034|       |
 2035|   988k|    UResourceBundle stack;
 2036|   988k|    const char16_t* retVal = nullptr;
 2037|   988k|    ures_initStackObject(&stack);
  ------------------
  |  | 1690|   988k|#define ures_initStackObject U_ICU_ENTRY_POINT_RENAME(ures_initStackObject)
  |  |  ------------------
  |  |  |  |  123|   988k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   988k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   988k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2038|   988k|    ures_getByKeyWithFallback(resB, inKey, &stack, status);
  ------------------
  |  | 1662|   988k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|   988k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   988k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   988k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2039|   988k|    int32_t length;
 2040|   988k|    retVal = ures_getString(&stack, &length, status);
  ------------------
  |  | 1675|   988k|#define ures_getString U_ICU_ENTRY_POINT_RENAME(ures_getString)
  |  |  ------------------
  |  |  |  |  123|   988k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   988k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   988k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2041|   988k|    ures_close(&stack);
  ------------------
  |  | 1652|   988k|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|   988k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   988k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   988k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2042|   988k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (2042:9): [True: 517k, False: 471k]
  ------------------
 2043|   517k|        return nullptr;
 2044|   517k|    }
 2045|   471k|    if (length == 3 && retVal[0] == EMPTY_SET && retVal[1] == EMPTY_SET && retVal[2] == EMPTY_SET ) {
  ------------------
  |  |   35|   480k|#define EMPTY_SET 0x2205
  ------------------
                  if (length == 3 && retVal[0] == EMPTY_SET && retVal[1] == EMPTY_SET && retVal[2] == EMPTY_SET ) {
  ------------------
  |  |   35|   471k|#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: 9.37k, False: 462k]
  |  Branch (2045:24): [True: 0, False: 9.37k]
  |  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|   471k|    if (len != nullptr) {
  ------------------
  |  Branch (2050:9): [True: 442k, False: 29.3k]
  ------------------
 2051|   442k|        *len = length;
 2052|   442k|    }
 2053|   471k|    return retVal;
 2054|   988k|}
ures_getByKeyWithFallback_78:
 2164|  2.74M|                          UErrorCode *status) {
 2165|  2.74M|    Resource res = RES_BOGUS, rootRes = RES_BOGUS;
  ------------------
  |  |   65|  2.74M|#define RES_BOGUS 0xffffffff
  ------------------
                  Resource res = RES_BOGUS, rootRes = RES_BOGUS;
  ------------------
  |  |   65|  2.74M|#define RES_BOGUS 0xffffffff
  ------------------
 2166|  2.74M|    UResourceBundle *helper = nullptr;
 2167|       |
 2168|  2.74M|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2168:9): [True: 0, False: 2.74M]
  |  Branch (2168:28): [True: 252k, False: 2.49M]
  ------------------
 2169|   252k|        return fillIn;
 2170|   252k|    }
 2171|  2.49M|    if(resB == nullptr) {
  ------------------
  |  Branch (2171:8): [True: 0, False: 2.49M]
  ------------------
 2172|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2173|      0|        return fillIn;
 2174|      0|    }
 2175|       |
 2176|  2.49M|    int32_t type = RES_GET_TYPE(resB->fRes);
  ------------------
  |  |   68|  2.49M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2177|  2.49M|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|  2.49M|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 2.00M, False: 490k]
  |  |  |  Branch (84:61): [True: 490k, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2178|  2.49M|        const char* origResPath = resB->fResPath;
 2179|  2.49M|        int32_t origResPathLen = resB->fResPathLen;
 2180|  2.49M|        res = getTableItemByKeyPath(&resB->getResData(), resB->fRes, inKey);
 2181|  2.49M|        const char* key = inKey;
 2182|  2.49M|        bool didRootOnce = false;
 2183|  2.49M|        if(res == RES_BOGUS) {
  ------------------
  |  |   65|  2.49M|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2183:12): [True: 1.03M, False: 1.45M]
  ------------------
 2184|  1.03M|            UResourceDataEntry *dataEntry = resB->fData;
 2185|  1.03M|            CharString path;
 2186|  1.03M|            char *myPath = nullptr;
 2187|  1.03M|            const char* resPath = resB->fResPath;
 2188|  1.03M|            int32_t len = resB->fResPathLen;
 2189|  2.80M|            while(res == RES_BOGUS && (dataEntry->fParent != nullptr || !didRootOnce)) { /* Otherwise, we'll look in parents */
  ------------------
  |  |   65|  5.61M|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2189:19): [True: 2.19M, False: 607k]
  |  Branch (2189:40): [True: 1.34M, False: 851k]
  |  Branch (2189:73): [True: 425k, False: 425k]
  ------------------
 2190|  1.77M|                if (dataEntry->fParent != nullptr) {
  ------------------
  |  Branch (2190:21): [True: 1.34M, False: 425k]
  ------------------
 2191|  1.34M|                    dataEntry = dataEntry->fParent;
 2192|  1.34M|                } 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|   425k|                    didRootOnce = true;
 2199|   425k|                }
 2200|  1.77M|                rootRes = dataEntry->fData.rootRes;
 2201|       |
 2202|  1.77M|                if(dataEntry->fBogus == U_ZERO_ERROR) {
  ------------------
  |  Branch (2202:20): [True: 1.77M, False: 0]
  ------------------
 2203|  1.77M|                    createPath(origResPath, origResPathLen, resPath, len, inKey, path, status);
 2204|  1.77M|                    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (2204:25): [True: 0, False: 1.77M]
  ------------------
 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|  1.77M|                    myPath = path.data();
 2209|  1.77M|                    key = inKey;
 2210|  1.77M|                    do {
 2211|  1.77M|                        res = res_findResource(&(dataEntry->fData), rootRes, &myPath, &key);
  ------------------
  |  |  198|  1.77M|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|  1.77M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.77M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.77M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2212|  1.77M|                        if (RES_GET_TYPE(res) == URES_ALIAS && *myPath) {
  ------------------
  |  |   68|  1.77M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (2212:29): [True: 8.53k, False: 1.76M]
  |  Branch (2212:64): [True: 0, False: 8.53k]
  ------------------
 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|  1.77M|                        } else if (res == RES_BOGUS) {
  ------------------
  |  |   65|  1.77M|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2225:36): [True: 1.16M, False: 607k]
  ------------------
 2226|  1.16M|                            break;
 2227|  1.16M|                        }
 2228|  1.77M|                    } while(*myPath); /* Continue until the whole path is consumed */
  ------------------
  |  Branch (2228:29): [True: 0, False: 607k]
  ------------------
 2229|  1.77M|                }
 2230|  1.77M|            }
 2231|       |            /*dataEntry = getFallbackData(resB, &key, &res, status);*/
 2232|  1.03M|            if(res != RES_BOGUS) {
  ------------------
  |  |   65|  1.03M|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2232:16): [True: 607k, False: 425k]
  ------------------
 2233|       |              /* check if resB->fResPath gives the right name here */
 2234|   607k|                if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|   607k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   607k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                              if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|   607k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   607k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (2234:20): [True: 0, False: 607k]
  |  Branch (2234:75): [True: 361k, False: 245k]
  ------------------
 2235|   361k|                    *status = U_USING_DEFAULT_WARNING;
 2236|   361k|                } else {
 2237|   245k|                    *status = U_USING_FALLBACK_WARNING;
 2238|   245k|                }
 2239|       |
 2240|   607k|                fillIn = init_resb_result(dataEntry, res, key, -1, resB, fillIn, status);
 2241|   607k|                if (resPath != nullptr) {
  ------------------
  |  Branch (2241:21): [True: 240k, False: 366k]
  ------------------
 2242|   240k|                    createPath(origResPath, origResPathLen, resPath, len, inKey, path, status);
 2243|   366k|                } else {
 2244|   366k|                    const char* separator = nullptr;
 2245|   366k|                    if (fillIn->fResPath != nullptr) {
  ------------------
  |  Branch (2245:25): [True: 366k, False: 0]
  ------------------
 2246|   366k|                        separator = uprv_strchr(fillIn->fResPath, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|   366k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   366k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2247|   366k|                    }
 2248|   366k|                    if (separator != nullptr && separator[1] != '\0') {
  ------------------
  |  Branch (2248:25): [True: 366k, False: 0]
  |  Branch (2248:49): [True: 8.53k, False: 357k]
  ------------------
 2249|  8.53k|                        createPath(origResPath, origResPathLen, fillIn->fResPath,
 2250|  8.53k|                                   static_cast<int32_t>(uprv_strlen(fillIn->fResPath)), inKey, path, status);
  ------------------
  |  |   37|  8.53k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  8.53k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2251|   357k|                    } else {
 2252|   357k|                        createPath(origResPath, origResPathLen, "", 0, inKey, path, status);
 2253|   357k|                    }
 2254|   366k|                }
 2255|   607k|                ures_freeResPath(fillIn);
 2256|   607k|                ures_appendResPath(fillIn, path.data(), path.length(), status);
 2257|   607k|                if(fillIn->fResPath[fillIn->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   607k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2257:20): [True: 500k, False: 106k]
  ------------------
 2258|   500k|                    ures_appendResPath(fillIn, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|   500k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 2259|   500k|                }
 2260|   607k|            } else {
 2261|   425k|                *status = U_MISSING_RESOURCE_ERROR;
 2262|   425k|            }
 2263|  1.45M|        } else {
 2264|  1.45M|            fillIn = init_resb_result(resB->fData, res, key, -1, resB, fillIn, status);
 2265|  1.45M|        }
 2266|  2.49M|    } 
 2267|      0|    else {
 2268|      0|        *status = U_RESOURCE_TYPE_MISMATCH;
 2269|      0|    }
 2270|  2.49M|    ures_close(helper);
  ------------------
  |  | 1652|  2.49M|#define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close)
  |  |  ------------------
  |  |  |  |  123|  2.49M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.49M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.49M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2271|  2.49M|    return fillIn;
 2272|  2.49M|}
ures_getAllItemsWithFallback_78:
 2471|   311k|                             icu::ResourceSink &sink, UErrorCode &errorCode) {
 2472|   311k|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2472:9): [True: 0, False: 311k]
  ------------------
 2473|   311k|    if (path == nullptr) {
  ------------------
  |  Branch (2473:9): [True: 0, False: 311k]
  ------------------
 2474|      0|        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
 2475|      0|        return;
 2476|      0|    }
 2477|   311k|    StackUResourceBundle stackBundle;
 2478|   311k|    const UResourceBundle *rb;
 2479|   311k|    if (*path == 0) {
  ------------------
  |  Branch (2479:9): [True: 1, False: 311k]
  ------------------
 2480|       |        // empty path
 2481|      1|        rb = bundle;
 2482|   311k|    } else {
 2483|   311k|        rb = ures_getByKeyWithFallback(bundle, path, stackBundle.getAlias(), &errorCode);
  ------------------
  |  | 1662|   311k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|   311k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   311k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   311k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2484|   311k|        if (U_FAILURE(errorCode)) {
  ------------------
  |  Branch (2484:13): [True: 0, False: 311k]
  ------------------
 2485|      0|            return;
 2486|      0|        }
 2487|   311k|    }
 2488|       |    // Get all table items with fallback.
 2489|   311k|    ResourceDataValue value;
 2490|   311k|    getAllItemsWithFallback(rb, value, sink, errorCode);
 2491|   311k|}
ures_getByKey_78:
 2493|  2.11M|U_CAPI UResourceBundle* U_EXPORT2 ures_getByKey(const UResourceBundle *resB, const char* inKey, UResourceBundle *fillIn, UErrorCode *status) {
 2494|  2.11M|    Resource res = RES_BOGUS;
  ------------------
  |  |   65|  2.11M|#define RES_BOGUS 0xffffffff
  ------------------
 2495|  2.11M|    UResourceDataEntry *dataEntry = nullptr;
 2496|  2.11M|    const char *key = inKey;
 2497|       |
 2498|  2.11M|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2498:9): [True: 0, False: 2.11M]
  |  Branch (2498:28): [True: 0, False: 2.11M]
  ------------------
 2499|      0|        return fillIn;
 2500|      0|    }
 2501|  2.11M|    if(resB == nullptr) {
  ------------------
  |  Branch (2501:8): [True: 0, False: 2.11M]
  ------------------
 2502|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2503|      0|        return fillIn;
 2504|      0|    }
 2505|       |
 2506|  2.11M|    int32_t type = RES_GET_TYPE(resB->fRes);
  ------------------
  |  |   68|  2.11M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2507|  2.11M|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|  2.11M|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 2.04M, False: 70.6k]
  |  |  |  Branch (84:61): [True: 70.6k, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2508|  2.11M|        int32_t t;
 2509|  2.11M|        res = res_getTableItemByKey(&resB->getResData(), resB->fRes, &t, &key);
  ------------------
  |  |  207|  2.11M|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  2.11M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.11M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.11M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2510|  2.11M|        if(res == RES_BOGUS) {
  ------------------
  |  |   65|  2.11M|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2510:12): [True: 337k, False: 1.77M]
  ------------------
 2511|   337k|            key = inKey;
 2512|   337k|            if(resB->fHasFallback) {
  ------------------
  |  Branch (2512:16): [True: 298k, False: 38.2k]
  ------------------
 2513|   298k|                dataEntry = getFallbackData(resB, &key, &res, status);
 2514|   298k|                if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (2514:20): [True: 200k, False: 98.6k]
  ------------------
 2515|       |                    /* check if resB->fResPath gives the right name here */
 2516|   200k|                    return init_resb_result(dataEntry, res, key, -1, resB, fillIn, status);
 2517|   200k|                } else {
 2518|  98.6k|                    *status = U_MISSING_RESOURCE_ERROR;
 2519|  98.6k|                }
 2520|   298k|            } else {
 2521|  38.2k|                *status = U_MISSING_RESOURCE_ERROR;
 2522|  38.2k|            }
 2523|  1.77M|        } else {
 2524|  1.77M|            return init_resb_result(resB->fData, res, key, -1, resB, fillIn, status);
 2525|  1.77M|        }
 2526|  2.11M|    } 
 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|   136k|    return fillIn;
 2544|  2.11M|}
ures_getStringByKey_78:
 2546|   586k|U_CAPI const char16_t* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, const char* inKey, int32_t* len, UErrorCode *status) {
 2547|   586k|    Resource res = RES_BOGUS;
  ------------------
  |  |   65|   586k|#define RES_BOGUS 0xffffffff
  ------------------
 2548|   586k|    UResourceDataEntry *dataEntry = nullptr;
 2549|   586k|    const char* key = inKey;
 2550|       |
 2551|   586k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2551:9): [True: 0, False: 586k]
  |  Branch (2551:28): [True: 0, False: 586k]
  ------------------
 2552|      0|        return nullptr;
 2553|      0|    }
 2554|   586k|    if(resB == nullptr) {
  ------------------
  |  Branch (2554:8): [True: 0, False: 586k]
  ------------------
 2555|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2556|      0|        return nullptr;
 2557|      0|    }
 2558|       |
 2559|   586k|    int32_t type = RES_GET_TYPE(resB->fRes);
  ------------------
  |  |   68|   586k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2560|   586k|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|   586k|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 585k, False: 1.29k]
  |  |  |  Branch (84:61): [True: 1.29k, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2561|   586k|        int32_t t=0;
 2562|       |
 2563|   586k|        res = res_getTableItemByKey(&resB->getResData(), resB->fRes, &t, &key);
  ------------------
  |  |  207|   586k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|   586k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   586k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   586k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2564|       |
 2565|   586k|        if(res == RES_BOGUS) {
  ------------------
  |  |   65|   586k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2565:12): [True: 216k, False: 369k]
  ------------------
 2566|   216k|            key = inKey;
 2567|   216k|            if(resB->fHasFallback) {
  ------------------
  |  Branch (2567:16): [True: 0, False: 216k]
  ------------------
 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|   216k|            } else {
 2589|   216k|                *status = U_MISSING_RESOURCE_ERROR;
 2590|   216k|            }
 2591|   369k|        } else {
 2592|   369k|            switch (RES_GET_TYPE(res)) {
  ------------------
  |  |   68|   369k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2593|      0|            case URES_STRING:
  ------------------
  |  Branch (2593:13): [True: 0, False: 369k]
  ------------------
 2594|   369k|            case URES_STRING_V2:
  ------------------
  |  Branch (2594:13): [True: 369k, False: 0]
  ------------------
 2595|   369k|                return res_getString({resB, key}, &resB->getResData(), res, len);
 2596|      0|            case URES_ALIAS:
  ------------------
  |  Branch (2596:13): [True: 0, False: 369k]
  ------------------
 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: 369k]
  ------------------
 2605|      0|                *status = U_RESOURCE_TYPE_MISMATCH;
 2606|   369k|            }
 2607|   369k|        }
 2608|   586k|    } 
 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|   216k|    return nullptr;
 2627|   586k|}
ures_getLocaleByType_78:
 2671|   361k|                     UErrorCode* status) {
 2672|   361k|    if (status==nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (2672:9): [True: 0, False: 361k]
  |  Branch (2672:28): [True: 0, False: 361k]
  ------------------
 2673|      0|        return nullptr;
 2674|      0|    }
 2675|   361k|    if (!resourceBundle) {
  ------------------
  |  Branch (2675:9): [True: 0, False: 361k]
  ------------------
 2676|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 2677|      0|        return nullptr;
 2678|   361k|    } else {
 2679|   361k|        switch(type) {
 2680|   180k|        case ULOC_ACTUAL_LOCALE:
  ------------------
  |  Branch (2680:9): [True: 180k, False: 180k]
  ------------------
 2681|   180k|            return resourceBundle->fData->fName;
 2682|   180k|        case ULOC_VALID_LOCALE:
  ------------------
  |  Branch (2682:9): [True: 180k, False: 180k]
  ------------------
 2683|   180k|            return resourceBundle->fValidLocaleDataEntry->fName;
 2684|      0|        case ULOC_REQUESTED_LOCALE:
  ------------------
  |  Branch (2684:9): [True: 0, False: 361k]
  ------------------
 2685|      0|        default:
  ------------------
  |  Branch (2685:9): [True: 0, False: 361k]
  ------------------
 2686|      0|            *status = U_ILLEGAL_ARGUMENT_ERROR;
 2687|      0|            return nullptr;
 2688|   361k|        }
 2689|   361k|    }
 2690|   361k|}
ures_open_78:
 2769|  1.43M|ures_open(const char* path, const char* localeID, UErrorCode* status) {
 2770|  1.43M|    return ures_openWithType(nullptr, path, localeID, URES_OPEN_LOCALE_DEFAULT_ROOT, status);
 2771|  1.43M|}
ures_openDirect_78:
 2783|   419k|ures_openDirect(const char* path, const char* localeID, UErrorCode* status) {
 2784|   419k|    return ures_openWithType(nullptr, path, localeID, URES_OPEN_DIRECT, status);
 2785|   419k|}
uresbund.cpp:_ZL21ures_setIsStackObjectP15UResourceBundlea:
  711|  4.64M|static void ures_setIsStackObject( UResourceBundle* resB, UBool state) {
  712|  4.64M|    if(state) {
  ------------------
  |  Branch (712:8): [True: 1.78M, False: 2.85M]
  ------------------
  713|  1.78M|        resB->fMagic1 = 0;
  714|  1.78M|        resB->fMagic2 = 0;
  715|  2.85M|    } else {
  716|  2.85M|        resB->fMagic1 = MAGIC1;
  ------------------
  |  |   30|  2.85M|#define MAGIC1 19700503
  ------------------
  717|  2.85M|        resB->fMagic2 = MAGIC2;
  ------------------
  |  |   31|  2.85M|#define MAGIC2 19641227
  ------------------
  718|  2.85M|    }
  719|  4.64M|}
uresbund.cpp:_ZL16ures_closeBundleP15UResourceBundlea:
 1123|  7.13M|{
 1124|  7.13M|    if(resB != nullptr) {
  ------------------
  |  Branch (1124:8): [True: 4.64M, False: 2.49M]
  ------------------
 1125|  4.64M|        if(resB->fData != nullptr) {
  ------------------
  |  Branch (1125:12): [True: 4.12M, False: 517k]
  ------------------
 1126|  4.12M|            entryClose(resB->fData);
 1127|  4.12M|        }
 1128|  4.64M|        if(resB->fVersion != nullptr) {
  ------------------
  |  Branch (1128:12): [True: 0, False: 4.64M]
  ------------------
 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|  4.64M|        ures_freeResPath(resB);
 1132|       |
 1133|  4.64M|        if(ures_isStackObject(resB) == false && freeBundleObj) {
  ------------------
  |  Branch (1133:12): [True: 2.85M, False: 1.78M]
  |  Branch (1133:49): [True: 2.85M, False: 0]
  ------------------
 1134|  2.85M|            uprv_free(resB);
  ------------------
  |  | 1503|  2.85M|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  2.85M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.85M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.85M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1135|  2.85M|        }
 1136|       |#if 0 /*U_DEBUG*/
 1137|       |        else {
 1138|       |            /* poison the data */
 1139|       |            uprv_memset(resB, -1, sizeof(UResourceBundle));
 1140|       |        }
 1141|       |#endif
 1142|  4.64M|    }
 1143|  7.13M|}
uresbund.cpp:_ZL10entryCloseP18UResourceDataEntry:
 1061|  6.35M|static void entryClose(UResourceDataEntry *resB) {
 1062|  6.35M|  Mutex lock(&resbMutex);
 1063|  6.35M|  entryCloseInt(resB);
 1064|  6.35M|}
uresbund.cpp:_ZL13entryCloseIntP18UResourceDataEntry:
 1028|  6.35M|static void entryCloseInt(UResourceDataEntry *resB) {
 1029|  6.35M|    UResourceDataEntry *p = resB;
 1030|       |
 1031|  18.4M|    while(resB != nullptr) {
  ------------------
  |  Branch (1031:11): [True: 12.0M, False: 6.35M]
  ------------------
 1032|  12.0M|        p = resB->fParent;
 1033|  12.0M|        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|  12.0M|        resB = p;
 1054|  12.0M|    }
 1055|  6.35M|}
uresbund.cpp:_ZL18ures_isStackObjectPK15UResourceBundle:
  721|  4.64M|static UBool ures_isStackObject(const UResourceBundle* resB) {
  722|  4.64M|  return((resB->fMagic1 == MAGIC1 && resB->fMagic2 == MAGIC2)?false:true);
  ------------------
  |  |   30|  9.28M|#define MAGIC1 19700503
  ------------------
                return((resB->fMagic1 == MAGIC1 && resB->fMagic2 == MAGIC2)?false:true);
  ------------------
  |  |   31|  2.85M|#define MAGIC2 19641227
  ------------------
  |  Branch (722:11): [True: 2.85M, False: 1.78M]
  |  Branch (722:38): [True: 2.85M, False: 0]
  ------------------
  723|  4.64M|}
uresbund.cpp:_ZL18ures_appendResPathP15UResourceBundlePKciP10UErrorCode:
 1083|  10.6M|static void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t lenToAdd, UErrorCode *status) {
 1084|  10.6M|    int32_t resPathLenOrig = resB->fResPathLen;
 1085|  10.6M|    if(resB->fResPath == nullptr) {
  ------------------
  |  Branch (1085:8): [True: 3.90M, False: 6.77M]
  ------------------
 1086|  3.90M|        resB->fResPath = resB->fResBuf;
 1087|  3.90M|        *(resB->fResPath) = 0;
 1088|  3.90M|        resB->fResPathLen = 0;
 1089|  3.90M|    } 
 1090|  10.6M|    resB->fResPathLen += lenToAdd;
 1091|  10.6M|    if(RES_BUFSIZE <= resB->fResPathLen+1) {
  ------------------
  |  |   59|  10.6M|#define RES_BUFSIZE 64
  ------------------
  |  Branch (1091:8): [True: 0, False: 10.6M]
  ------------------
 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|  10.6M|    uprv_strcpy(resB->fResPath + resPathLenOrig, toAdd);
  ------------------
  |  |   36|  10.6M|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  10.6M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1111|  10.6M|}
uresbund.cpp:_ZL13entryIncreaseP18UResourceDataEntry:
  304|  4.50M|static void entryIncrease(UResourceDataEntry *entry) {
  305|  4.50M|    Mutex lock(&resbMutex);
  306|  4.50M|    entry->fCountExisting++;
  307|  7.86M|    while(entry->fParent != nullptr) {
  ------------------
  |  Branch (307:11): [True: 3.35M, False: 4.50M]
  ------------------
  308|  3.35M|      entry = entry->fParent;
  309|  3.35M|      entry->fCountExisting++;
  310|  3.35M|    }
  311|  4.50M|}
uresbund.cpp:_ZL23ures_getStringWithAliasPK15UResourceBundlejiPiP10UErrorCode:
 1709|   340k|static const char16_t* ures_getStringWithAlias(const UResourceBundle *resB, Resource r, int32_t sIndex, int32_t *len, UErrorCode *status) {
 1710|   340k|  if(RES_GET_TYPE(r) == URES_ALIAS) {
  ------------------
  |  |   68|   340k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (1710:6): [True: 0, False: 340k]
  ------------------
 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|   340k|  } else {
 1717|   340k|    return res_getString({resB, sIndex}, &resB->getResData(), r, len); 
 1718|   340k|  }
 1719|   340k|}
uresbund.cpp:_ZN12_GLOBAL__N_116init_resb_resultEP18UResourceDataEntryjPKciPK15UResourceBundlePS4_P10UErrorCode:
 1480|  4.26M|        UResourceBundle *resB, UErrorCode *status) {
 1481|  4.26M|    return init_resb_result(
 1482|  4.26M|        dataEntry, r, key, idx,
 1483|  4.26M|        container->fValidLocaleDataEntry, container->fResPath, 0, resB, status);
 1484|  4.26M|}
uresbund.cpp:_ZN12_GLOBAL__N_116init_resb_resultEP18UResourceDataEntryjPKciS1_S3_iP15UResourceBundleP10UErrorCode:
 1389|  4.27M|        UResourceBundle *resB, UErrorCode *status) {
 1390|       |    // TODO: When an error occurs: Should we return nullptr vs. resB?
 1391|  4.27M|    if(status == nullptr || U_FAILURE(*status)) {
  ------------------
  |  Branch (1391:8): [True: 0, False: 4.27M]
  |  Branch (1391:29): [True: 0, False: 4.27M]
  ------------------
 1392|      0|        return resB;
 1393|      0|    }
 1394|  4.27M|    if (validLocaleDataEntry == nullptr) {
  ------------------
  |  Branch (1394:9): [True: 0, False: 4.27M]
  ------------------
 1395|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1396|      0|        return nullptr;
 1397|      0|    }
 1398|  4.27M|    if(RES_GET_TYPE(r) == URES_ALIAS) {
  ------------------
  |  |   68|  4.27M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (1398:8): [True: 9.28k, False: 4.26M]
  ------------------
 1399|       |        // This is an alias, need to exchange with real data.
 1400|  9.28k|        if(recursionDepth >= URES_MAX_ALIAS_LEVEL) {
  ------------------
  |  |   33|  9.28k|#define URES_MAX_ALIAS_LEVEL 256
  ------------------
  |  Branch (1400:12): [True: 0, False: 9.28k]
  ------------------
 1401|      0|            *status = U_TOO_MANY_ALIASES_ERROR;
 1402|      0|            return resB;
 1403|      0|        }
 1404|  9.28k|        return getAliasTargetAsResourceBundle(
 1405|  9.28k|            dataEntry->fData, r, key, idx,
 1406|  9.28k|            validLocaleDataEntry, containerResPath, recursionDepth, resB, status);
 1407|  9.28k|    }
 1408|  4.26M|    if(resB == nullptr) {
  ------------------
  |  Branch (1408:8): [True: 1.00M, False: 3.25M]
  ------------------
 1409|  1.00M|        resB = static_cast<UResourceBundle*>(uprv_malloc(sizeof(UResourceBundle)));
  ------------------
  |  | 1524|  1.00M|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1410|  1.00M|        if (resB == nullptr) {
  ------------------
  |  Branch (1410:13): [True: 0, False: 1.00M]
  ------------------
 1411|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
 1412|      0|            return nullptr;
 1413|      0|        }
 1414|  1.00M|        ures_setIsStackObject(resB, false);
 1415|  1.00M|        resB->fResPath = nullptr;
 1416|  1.00M|        resB->fResPathLen = 0;
 1417|  3.25M|    } else {
 1418|  3.25M|        if(resB->fData != nullptr) {
  ------------------
  |  Branch (1418:12): [True: 2.23M, False: 1.02M]
  ------------------
 1419|  2.23M|            entryClose(resB->fData);
 1420|  2.23M|        }
 1421|  3.25M|        if(resB->fVersion != nullptr) {
  ------------------
  |  Branch (1421:12): [True: 0, False: 3.25M]
  ------------------
 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|  3.25M|        if(containerResPath != resB->fResPath) {
  ------------------
  |  Branch (1435:12): [True: 746k, False: 2.51M]
  ------------------
 1436|   746k|            ures_freeResPath(resB);
 1437|   746k|        }
 1438|  3.25M|    }
 1439|  4.26M|    resB->fData = dataEntry;
 1440|  4.26M|    entryIncrease(resB->fData);
 1441|  4.26M|    resB->fHasFallback = false;
 1442|  4.26M|    resB->fIsTopLevel = false;
 1443|  4.26M|    resB->fIndex = -1;
 1444|  4.26M|    resB->fKey = key; 
 1445|  4.26M|    resB->fValidLocaleDataEntry = validLocaleDataEntry;
 1446|  4.26M|    if(containerResPath != resB->fResPath) {
  ------------------
  |  Branch (1446:8): [True: 1.16M, False: 3.10M]
  ------------------
 1447|  1.16M|        ures_appendResPath(
 1448|  1.16M|            resB, containerResPath, static_cast<int32_t>(uprv_strlen(containerResPath)), status);
  ------------------
  |  |   37|  1.16M|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.16M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1449|  1.16M|    }
 1450|  4.26M|    if(key != nullptr) {
  ------------------
  |  Branch (1450:8): [True: 4.04M, False: 218k]
  ------------------
 1451|  4.04M|        ures_appendResPath(resB, key, static_cast<int32_t>(uprv_strlen(key)), status);
  ------------------
  |  |   37|  4.04M|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  4.04M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1452|  4.04M|        if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  4.04M|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1452:12): [True: 3.90M, False: 143k]
  ------------------
 1453|  3.90M|            ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|  3.90M|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 1454|  3.90M|        }
 1455|  4.04M|    } else if(idx >= 0) {
  ------------------
  |  Branch (1455:15): [True: 218k, False: 0]
  ------------------
 1456|   218k|        char buf[256];
 1457|   218k|        int32_t len = T_CString_integerToString(buf, idx, 10);
  ------------------
  |  |   67|   218k|#define T_CString_integerToString U_ICU_ENTRY_POINT_RENAME(T_CString_integerToString)
  |  |  ------------------
  |  |  |  |  123|   218k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   218k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   218k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1458|   218k|        ures_appendResPath(resB, buf, len, status);
 1459|   218k|        if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   218k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1459:12): [True: 218k, False: 0]
  ------------------
 1460|   218k|            ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|   218k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 1461|   218k|        }
 1462|   218k|    }
 1463|       |    /* Make sure that Purify doesn't complain about uninitialized memory copies. */
 1464|  4.26M|    {
 1465|  4.26M|        int32_t usedLen = ((resB->fResBuf == resB->fResPath) ? resB->fResPathLen : 0);
  ------------------
  |  Branch (1465:28): [True: 4.26M, False: 0]
  ------------------
 1466|  4.26M|        uprv_memset(resB->fResBuf + usedLen, 0, sizeof(resB->fResBuf) - usedLen);
  ------------------
  |  |  100|  4.26M|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  4.26M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1467|  4.26M|    }
 1468|       |
 1469|  4.26M|    resB->fVersion = nullptr;
 1470|  4.26M|    resB->fRes = r;
 1471|  4.26M|    resB->fSize = res_countArrayItems(&resB->getResData(), resB->fRes);
  ------------------
  |  |  197|  4.26M|#define res_countArrayItems U_ICU_ENTRY_POINT_RENAME(res_countArrayItems)
  |  |  ------------------
  |  |  |  |  123|  4.26M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  4.26M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  4.26M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1472|  4.26M|    ResourceTracer(resB).trace("get");
 1473|  4.26M|    return resB;
 1474|  4.26M|}
uresbund.cpp:_ZN12_GLOBAL__N_130getAliasTargetAsResourceBundleERK12ResourceDatajPKciP18UResourceDataEntryS4_iP15UResourceBundleP10UErrorCode:
 1166|  9.28k|        UResourceBundle *resB, UErrorCode *status) {
 1167|       |    // TODO: When an error occurs: Should we return nullptr vs. resB?
 1168|  9.28k|    if (U_FAILURE(*status)) { return resB; }
  ------------------
  |  Branch (1168:9): [True: 0, False: 9.28k]
  ------------------
 1169|  9.28k|    U_ASSERT(RES_GET_TYPE(r) == URES_ALIAS);
  ------------------
  |  |   35|  9.28k|#   define U_ASSERT(exp) (void)0
  ------------------
 1170|  9.28k|    int32_t len = 0;
 1171|  9.28k|    const char16_t *alias = res_getAlias(&resData, r, &len);
  ------------------
  |  |  199|  9.28k|#define res_getAlias U_ICU_ENTRY_POINT_RENAME(res_getAlias)
  |  |  ------------------
  |  |  |  |  123|  9.28k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.28k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.28k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1172|  9.28k|    if(len <= 0) {
  ------------------
  |  Branch (1172:8): [True: 0, False: 9.28k]
  ------------------
 1173|       |        // bad alias
 1174|      0|        *status = U_ILLEGAL_ARGUMENT_ERROR;
 1175|      0|        return resB;
 1176|      0|    }
 1177|       |
 1178|       |    // Copy the UTF-16 alias string into an invariant-character string.
 1179|       |    //
 1180|       |    // We do this so that res_findResource() can modify the path,
 1181|       |    // which allows us to remove redundant _res_findResource() variants
 1182|       |    // in uresdata.c.
 1183|       |    // res_findResource() now NUL-terminates each segment so that table keys
 1184|       |    // can always be compared with strcmp() instead of strncmp().
 1185|       |    // Saves code there and simplifies testing and code coverage.
 1186|       |    //
 1187|       |    // markus 2003oct17
 1188|  9.28k|    CharString chAlias;
 1189|  9.28k|    chAlias.appendInvariantChars(alias, len, *status);
 1190|  9.28k|    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1190:9): [True: 0, False: 9.28k]
  ------------------
 1191|      0|        return nullptr;
 1192|      0|    }
 1193|       |
 1194|       |    // We have an alias, now let's cut it up.
 1195|  9.28k|    const char *path = nullptr, *locale = nullptr, *keyPath = nullptr;
 1196|  9.28k|    if(chAlias[0] == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  9.28k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1196:8): [True: 9.28k, False: 0]
  ------------------
 1197|       |        // There is a path included.
 1198|  9.28k|        char *chAliasData = chAlias.data();
 1199|  9.28k|        char *sep = chAliasData + 1;
 1200|  9.28k|        path = sep;
 1201|  9.28k|        sep = uprv_strchr(sep, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|  9.28k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  9.28k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1202|  9.28k|        if(sep != nullptr) {
  ------------------
  |  Branch (1202:12): [True: 9.28k, False: 0]
  ------------------
 1203|  9.28k|            *sep++ = 0;
 1204|  9.28k|        }
 1205|  9.28k|        if(uprv_strcmp(path, "LOCALE") == 0) {
  ------------------
  |  |   38|  9.28k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  9.28k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1205:12): [True: 9.28k, False: 0]
  ------------------
 1206|       |            // This is an XPath alias, starting with "/LOCALE/".
 1207|       |            // It contains the path to a resource which should be looked up
 1208|       |            // starting in the valid locale.
 1209|       |            // TODO: Can/should we forbid a /LOCALE alias without key path?
 1210|       |            //   It seems weird to alias to the same path, just starting from the valid locale.
 1211|       |            //   That will often yield an infinite loop.
 1212|  9.28k|            keyPath = sep;
 1213|       |            // Read from the valid locale which we already have.
 1214|  9.28k|            path = locale = nullptr;
 1215|  9.28k|        } else {
 1216|      0|            if(uprv_strcmp(path, "ICUDATA") == 0) { /* want ICU data */
  ------------------
  |  |   38|      0|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1216:16): [True: 0, False: 0]
  ------------------
 1217|      0|                path = nullptr;
 1218|      0|            }
 1219|      0|            if (sep == nullptr) {
  ------------------
  |  Branch (1219:17): [True: 0, False: 0]
  ------------------
 1220|       |                // TODO: This ends up using the root bundle. Can/should we forbid this?
 1221|      0|                locale = "";
 1222|      0|            } else {
 1223|      0|                locale = sep;
 1224|      0|                sep = uprv_strchr(sep, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1225|      0|                if(sep != nullptr) {
  ------------------
  |  Branch (1225:20): [True: 0, False: 0]
  ------------------
 1226|      0|                    *sep++ = 0;
 1227|      0|                }
 1228|      0|                keyPath = sep;
 1229|      0|            }
 1230|      0|        }
 1231|  9.28k|    } else {
 1232|       |        // No path, start with a locale.
 1233|      0|        char *sep = chAlias.data();
 1234|      0|        locale = sep;
 1235|      0|        sep = uprv_strchr(sep, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|      0|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|      0|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1236|      0|        if(sep != nullptr) {
  ------------------
  |  Branch (1236:12): [True: 0, False: 0]
  ------------------
 1237|      0|            *sep++ = 0;
 1238|      0|        }
 1239|      0|        keyPath = sep;
 1240|      0|        path = validLocaleDataEntry->fPath;
 1241|      0|    }
 1242|       |
 1243|       |    // Got almost everything, let's try to open.
 1244|       |    // First, open the bundle with real data.
 1245|  9.28k|    LocalUResourceBundlePointer mainRes;
 1246|  9.28k|    UResourceDataEntry *dataEntry;
 1247|  9.28k|    if (locale == nullptr) {
  ------------------
  |  Branch (1247:9): [True: 9.28k, False: 0]
  ------------------
 1248|       |        // alias = /LOCALE/keyPath
 1249|       |        // Read from the valid locale which we already have.
 1250|  9.28k|        dataEntry = validLocaleDataEntry;
 1251|  9.28k|    } else {
 1252|      0|        UErrorCode intStatus = U_ZERO_ERROR;
 1253|       |        // TODO: Shouldn't we use ures_open() for locale data bundles (!noFallback)?
 1254|      0|        mainRes.adoptInstead(ures_openDirect(path, locale, &intStatus));
  ------------------
  |  | 1693|      0|#define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1255|      0|        if(U_FAILURE(intStatus)) {
  ------------------
  |  Branch (1255:12): [True: 0, False: 0]
  ------------------
 1256|       |            // We failed to open the resource bundle we're aliasing to.
 1257|      0|            *status = intStatus;
 1258|      0|            return resB;
 1259|      0|        }
 1260|      0|        dataEntry = mainRes->fData;
 1261|      0|    }
 1262|       |
 1263|  9.28k|    const char* temp = nullptr;
 1264|  9.28k|    if(keyPath == nullptr) {
  ------------------
  |  Branch (1264:8): [True: 0, False: 9.28k]
  ------------------
 1265|       |        // No key path. This means that we are going to to use the corresponding resource from
 1266|       |        // another bundle.
 1267|       |        // TODO: Why the special code path?
 1268|       |        //   Why not put together a key path from containerResPath + key or idx,
 1269|       |        //   as a comment below suggests, and go into the regular code branch?
 1270|       |        // First, we are going to get a corresponding container
 1271|       |        // resource to the one we are searching.
 1272|      0|        r = dataEntry->fData.rootRes;
 1273|      0|        if(containerResPath) {
  ------------------
  |  Branch (1273:12): [True: 0, False: 0]
  ------------------
 1274|      0|            chAlias.clear().append(containerResPath, *status);
 1275|      0|            if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1275:17): [True: 0, False: 0]
  ------------------
 1276|      0|                return nullptr;
 1277|      0|            }
 1278|      0|            char *aKey = chAlias.data();
 1279|       |            // TODO: should res_findResource() return a new dataEntry, too?
 1280|      0|            r = res_findResource(&dataEntry->fData, r, &aKey, &temp);
  ------------------
  |  |  198|      0|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1281|      0|        }
 1282|      0|        if(key) {
  ------------------
  |  Branch (1282:12): [True: 0, False: 0]
  ------------------
 1283|       |            // We need to make keyPath from the containerResPath and
 1284|       |            // current key, if there is a key associated.
 1285|      0|            chAlias.clear().append(key, *status);
 1286|      0|            if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1286:17): [True: 0, False: 0]
  ------------------
 1287|      0|                return nullptr;
 1288|      0|            }
 1289|      0|            char *aKey = chAlias.data();
 1290|      0|            r = res_findResource(&dataEntry->fData, r, &aKey, &temp);
  ------------------
  |  |  198|      0|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1291|      0|        } else if(idx != -1) {
  ------------------
  |  Branch (1291:19): [True: 0, False: 0]
  ------------------
 1292|       |            // If there is no key, but there is an index, try to get by the index.
 1293|       |            // Here we have either a table or an array, so get the element.
 1294|      0|            int32_t type = RES_GET_TYPE(r);
  ------------------
  |  |   68|      0|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 1295|      0|            if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|      0|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 0, False: 0]
  |  |  |  Branch (84:61): [True: 0, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1296|      0|                const char *aKey;
 1297|      0|                r = res_getTableItemByIndex(&dataEntry->fData, r, idx, &aKey);
  ------------------
  |  |  206|      0|#define res_getTableItemByIndex U_ICU_ENTRY_POINT_RENAME(res_getTableItemByIndex)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1298|      0|            } else { /* array */
 1299|      0|                r = res_getArrayItem(&dataEntry->fData, r, idx);
  ------------------
  |  |  200|      0|#define res_getArrayItem U_ICU_ENTRY_POINT_RENAME(res_getArrayItem)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1300|      0|            }
 1301|      0|        }
 1302|      0|        if(r != RES_BOGUS) {
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1302:12): [True: 0, False: 0]
  ------------------
 1303|      0|            resB = init_resb_result(
 1304|      0|                dataEntry, r, temp, -1, validLocaleDataEntry, nullptr, recursionDepth+1,
 1305|      0|                resB, status);
 1306|      0|        } else {
 1307|      0|            *status = U_MISSING_RESOURCE_ERROR;
 1308|      0|        }
 1309|  9.28k|    } else {
 1310|       |        // This one is a bit trickier.
 1311|       |        // We start finding keys, but after we resolve one alias, the path might continue.
 1312|       |        // Consider:
 1313|       |        //     aliastest:alias { "testtypes/anotheralias/Sequence" }
 1314|       |        //     anotheralias:alias { "/ICUDATA/sh/CollationElements" }
 1315|       |        // aliastest resource should finally have the sequence, not collation elements.
 1316|  9.28k|        CharString pathBuf(keyPath, *status);
 1317|  9.28k|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1317:13): [True: 0, False: 9.28k]
  ------------------
 1318|      0|            return nullptr;
 1319|      0|        }
 1320|  9.28k|        char *myPath = pathBuf.data();
 1321|  9.28k|        containerResPath = nullptr;
 1322|       |        // Now we have fallback following here.
 1323|  23.4k|        for(;;) {
 1324|  23.4k|            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|  32.7k|            while(*myPath && U_SUCCESS(*status)) {
  ------------------
  |  Branch (1329:19): [True: 23.4k, False: 9.28k]
  |  Branch (1329:30): [True: 23.4k, False: 0]
  ------------------
 1330|  23.4k|                r = res_findResource(&(dataEntry->fData), r, &myPath, &temp);
  ------------------
  |  |  198|  23.4k|#define res_findResource U_ICU_ENTRY_POINT_RENAME(res_findResource)
  |  |  ------------------
  |  |  |  |  123|  23.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  23.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  23.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1331|  23.4k|                if(r == RES_BOGUS) {
  ------------------
  |  |   65|  23.4k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1331:20): [True: 14.1k, False: 9.28k]
  ------------------
 1332|       |                    // No resource found, we don't really want to look anymore on this level.
 1333|  14.1k|                    break;
 1334|  14.1k|                }
 1335|       |                // Found a resource, but it might be an indirection.
 1336|  9.28k|                resB = init_resb_result(
 1337|  9.28k|                    dataEntry, r, temp, -1,
 1338|  9.28k|                    validLocaleDataEntry, containerResPath, recursionDepth+1,
 1339|  9.28k|                    resB, status);
 1340|  9.28k|                if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1340:21): [True: 0, False: 9.28k]
  ------------------
 1341|      0|                    break;
 1342|      0|                }
 1343|  9.28k|                if (temp == nullptr || uprv_strcmp(keyPath, temp) != 0) {
  ------------------
  |  |   38|  9.28k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  9.28k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (1343:21): [True: 0, False: 9.28k]
  |  Branch (1343:40): [True: 9.28k, 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|  9.28k|                    ures_freeResPath(resB);
 1350|  9.28k|                    ures_appendResPath(resB, keyPath, static_cast<int32_t>(uprv_strlen(keyPath)), status);
  ------------------
  |  |   37|  9.28k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  9.28k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1351|  9.28k|                    if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  9.28k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (1351:24): [True: 9.28k, False: 0]
  ------------------
 1352|  9.28k|                        ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status);
  ------------------
  |  |   61|  9.28k|#define RES_PATH_SEPARATOR_S   "/"
  ------------------
 1353|  9.28k|                    }
 1354|  9.28k|                    if (U_FAILURE(*status)) {
  ------------------
  |  Branch (1354:25): [True: 0, False: 9.28k]
  ------------------
 1355|      0|                        break;
 1356|      0|                    }
 1357|  9.28k|                }
 1358|  9.28k|                r = resB->fRes; /* switch to a new resource, possibly a new tree */
 1359|  9.28k|                dataEntry = resB->fData;
 1360|  9.28k|                containerResPath = resB->fResPath;
 1361|  9.28k|            }
 1362|  23.4k|            if (U_FAILURE(*status) || r != RES_BOGUS) {
  ------------------
  |  |   65|  23.4k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (1362:17): [True: 0, False: 23.4k]
  |  Branch (1362:39): [True: 9.28k, False: 14.1k]
  ------------------
 1363|  9.28k|                break;
 1364|  9.28k|            }
 1365|       |            // Fall back to the parent bundle, if there is one.
 1366|  14.1k|            dataEntry = dataEntry->fParent;
 1367|  14.1k|            if (dataEntry == nullptr) {
  ------------------
  |  Branch (1367:17): [True: 0, False: 14.1k]
  ------------------
 1368|      0|                *status = U_MISSING_RESOURCE_ERROR;
 1369|      0|                break;
 1370|      0|            }
 1371|       |            // Copy the same keyPath again.
 1372|  14.1k|            myPath = pathBuf.data();
 1373|  14.1k|            uprv_strcpy(myPath, keyPath);
  ------------------
  |  |   36|  14.1k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  14.1k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1374|  14.1k|        }
 1375|  9.28k|    }
 1376|  9.28k|    if(mainRes.getAlias() == resB) {
  ------------------
  |  Branch (1376:8): [True: 0, False: 9.28k]
  ------------------
 1377|      0|        mainRes.orphan();
 1378|      0|    }
 1379|  9.28k|    ResourceTracer(resB).maybeTrace("getalias");
 1380|  9.28k|    return resB;
 1381|  9.28k|}
uresbund.cpp:_ZL21getTableItemByKeyPathPK12ResourceDatajPKc:
 2059|  2.49M|static Resource getTableItemByKeyPath(const ResourceData *pResData, Resource table, const char *key) {
 2060|  2.49M|  Resource resource = table;  /* The current resource */
 2061|  2.49M|  icu::CharString path;
 2062|  2.49M|  UErrorCode errorCode = U_ZERO_ERROR;
 2063|  2.49M|  path.append(key, errorCode);
 2064|  2.49M|  if (U_FAILURE(errorCode)) { return RES_BOGUS; }
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (2064:7): [True: 0, False: 2.49M]
  ------------------
 2065|  2.49M|  char *pathPart = path.data();  /* Path from current resource to desired resource */
 2066|  2.49M|  UResType type = static_cast<UResType>(RES_GET_TYPE(resource)); /* the current resource type */
  ------------------
  |  |   68|  2.49M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2067|  5.56M|  while (*pathPart && resource != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   65|  8.78M|#define RES_BOGUS 0xffffffff
  ------------------
                while (*pathPart && resource != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   85|  3.06M|#define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   84|  6.13M|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:30): [True: 2.56M, False: 507k]
  |  |  |  |  |  Branch (84:61): [True: 507k, 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: 3.22M, False: 2.33M]
  |  Branch (2067:23): [True: 3.06M, False: 155k]
  ------------------
 2068|  3.06M|    char *nextPathPart = uprv_strchr(pathPart, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|  3.06M|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  3.06M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2069|  3.06M|    if (nextPathPart != nullptr) {
  ------------------
  |  Branch (2069:9): [True: 879k, False: 2.18M]
  ------------------
 2070|   879k|      *nextPathPart = 0;  /* Terminating null for this part of path. */
 2071|   879k|      nextPathPart++;
 2072|  2.18M|    } else {
 2073|  2.18M|      nextPathPart = uprv_strchr(pathPart, 0);
  ------------------
  |  |   40|  2.18M|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  2.18M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2074|  2.18M|    }
 2075|  3.06M|    int32_t t;
 2076|  3.06M|    const char *pathP = pathPart;
 2077|  3.06M|    resource = res_getTableItemByKey(pResData, resource, &t, &pathP);
  ------------------
  |  |  207|  3.06M|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  3.06M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.06M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.06M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2078|  3.06M|    type = static_cast<UResType>(RES_GET_TYPE(resource));
  ------------------
  |  |   68|  3.06M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
 2079|  3.06M|    pathPart = nextPathPart; 
 2080|  3.06M|  }
 2081|  2.49M|  if (*pathPart) {
  ------------------
  |  Branch (2081:7): [True: 155k, False: 2.33M]
  ------------------
 2082|   155k|    return RES_BOGUS;
  ------------------
  |  |   65|   155k|#define RES_BOGUS 0xffffffff
  ------------------
 2083|   155k|  }
 2084|  2.33M|  return resource;
 2085|  2.49M|}
uresbund.cpp:_ZL10createPathPKciS0_iS0_RN6icu_7810CharStringEP10UErrorCode:
 2093|  2.38M|                       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|  2.38M|    path.clear();
 2107|  2.38M|    const char* key = inKey;
 2108|  2.38M|    if (resPathLen > 0) {
  ------------------
  |  Branch (2108:9): [True: 1.35M, False: 1.02M]
  ------------------
 2109|  1.35M|        path.append(resPath, resPathLen, *status);
 2110|  1.35M|        if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (2110:13): [True: 1.35M, False: 0]
  ------------------
 2111|  1.35M|            const char* resPathLimit = resPath + resPathLen;
 2112|  1.35M|            const char* origResPathLimit = origResPath + origResPathLen;
 2113|  1.35M|            const char* resPathPtr = resPath;
 2114|  1.35M|            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|  3.12M|            while (origResPathPtr < origResPathLimit && resPathPtr < resPathLimit) {
  ------------------
  |  Branch (2118:20): [True: 1.76M, False: 1.35M]
  |  Branch (2118:57): [True: 1.76M, False: 0]
  ------------------
 2119|  22.2M|                while (origResPathPtr < origResPathLimit && *origResPathPtr != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  22.2M|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2119:24): [True: 22.2M, False: 0]
  |  Branch (2119:61): [True: 20.4M, False: 1.76M]
  ------------------
 2120|  20.4M|                    ++origResPathPtr;
 2121|  20.4M|                }
 2122|  1.76M|                if (origResPathPtr < origResPathLimit && *origResPathPtr == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  1.76M|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2122:21): [True: 1.76M, False: 0]
  |  Branch (2122:58): [True: 1.76M, False: 0]
  ------------------
 2123|  1.76M|                    ++origResPathPtr;
 2124|  1.76M|                }
 2125|  22.2M|                while (resPathPtr < resPathLimit && *resPathPtr != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  22.2M|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2125:24): [True: 22.2M, False: 0]
  |  Branch (2125:53): [True: 20.4M, False: 1.76M]
  ------------------
 2126|  20.4M|                    ++resPathPtr;
 2127|  20.4M|                }
 2128|  1.76M|                if (resPathPtr < resPathLimit && *resPathPtr == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  1.76M|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2128:21): [True: 1.76M, False: 0]
  |  Branch (2128:50): [True: 1.76M, False: 0]
  ------------------
 2129|  1.76M|                    ++resPathPtr;
 2130|  1.76M|                }
 2131|  1.76M|            }
 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|  1.38M|            while (resPathPtr < resPathLimit && *key != '\0') {
  ------------------
  |  Branch (2135:20): [True: 29.2k, False: 1.35M]
  |  Branch (2135:49): [True: 29.2k, False: 0]
  ------------------
 2136|   298k|                while (resPathPtr < resPathLimit && *resPathPtr != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   298k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2136:24): [True: 298k, False: 0]
  |  Branch (2136:53): [True: 269k, False: 29.2k]
  ------------------
 2137|   269k|                    ++resPathPtr;
 2138|   269k|                }
 2139|  29.2k|                if (resPathPtr < resPathLimit && *resPathPtr == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  29.2k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2139:21): [True: 29.2k, False: 0]
  |  Branch (2139:50): [True: 29.2k, False: 0]
  ------------------
 2140|  29.2k|                    ++resPathPtr;
 2141|  29.2k|                }
 2142|   299k|                while (*key != '\0' && *key != RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|   291k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2142:24): [True: 291k, False: 8.53k]
  |  Branch (2142:40): [True: 270k, False: 20.6k]
  ------------------
 2143|   270k|                    ++key;
 2144|   270k|                }
 2145|  29.2k|                if (*key == RES_PATH_SEPARATOR) {
  ------------------
  |  |   60|  29.2k|#define RES_PATH_SEPARATOR   '/'
  ------------------
  |  Branch (2145:21): [True: 20.6k, False: 8.53k]
  ------------------
 2146|  20.6k|                    ++key;
 2147|  20.6k|                }
 2148|  29.2k|            }
 2149|  1.35M|        }
 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|  1.35M|        path.append(key, *status);
 2155|  1.35M|    } else {
 2156|  1.02M|        path.append(inKey, *status);
 2157|  1.02M|    }
 2158|  2.38M|}
uresbund.cpp:_ZL16ures_freeResPathP15UResourceBundle:
 1113|  6.00M|static void ures_freeResPath(UResourceBundle *resB) {
 1114|  6.00M|    if (resB->fResPath && resB->fResPath != resB->fResBuf) {
  ------------------
  |  Branch (1114:9): [True: 3.90M, False: 2.09M]
  |  Branch (1114:27): [True: 0, False: 3.90M]
  ------------------
 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|  6.00M|    resB->fResPath = nullptr;
 1118|  6.00M|    resB->fResPathLen = 0;
 1119|  6.00M|}
uresbund.cpp:_ZN12_GLOBAL__N_123getAllItemsWithFallbackEPK15UResourceBundleRN6icu_7817ResourceDataValueERNS3_12ResourceSinkER10UErrorCode:
 2278|   553k|        ResourceSink &sink, UErrorCode &errorCode) {
 2279|   553k|    if (U_FAILURE(errorCode)) { return; }
  ------------------
  |  Branch (2279:9): [True: 0, False: 553k]
  ------------------
 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|   553k|    value.setData(bundle->getResData());
 2291|   553k|    value.setValidLocaleDataEntry(bundle->fValidLocaleDataEntry);
 2292|   553k|    UResourceDataEntry *parentEntry = bundle->fData->fParent;
 2293|   553k|    UBool hasParent = parentEntry != nullptr && U_SUCCESS(parentEntry->fBogus);
  ------------------
  |  Branch (2293:23): [True: 242k, False: 311k]
  |  Branch (2293:49): [True: 242k, False: 0]
  ------------------
 2294|   553k|    value.setResource(bundle->fRes, ResourceTracer(bundle));
 2295|   553k|    sink.put(bundle->fKey, value, !hasParent, errorCode);
 2296|   553k|    if (hasParent) {
  ------------------
  |  Branch (2296:9): [True: 242k, False: 311k]
  ------------------
 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|   242k|        StackUResourceBundle parentBundle;
 2306|   242k|        UResourceBundle &parentRef = parentBundle.ref();
 2307|   242k|        parentRef.fData = parentEntry;
 2308|   242k|        parentRef.fValidLocaleDataEntry = bundle->fValidLocaleDataEntry;
 2309|   242k|        parentRef.fHasFallback = !parentRef.getResData().noFallback;
 2310|   242k|        parentRef.fIsTopLevel = true;
 2311|   242k|        parentRef.fRes = parentRef.getResData().rootRes;
 2312|   242k|        parentRef.fSize = res_countArrayItems(&parentRef.getResData(), parentRef.fRes);
  ------------------
  |  |  197|   242k|#define res_countArrayItems U_ICU_ENTRY_POINT_RENAME(res_countArrayItems)
  |  |  ------------------
  |  |  |  |  123|   242k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   242k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   242k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2313|   242k|        parentRef.fIndex = -1;
 2314|   242k|        entryIncrease(parentEntry);
 2315|       |
 2316|       |        // Look up the container item in the parent bundle.
 2317|   242k|        StackUResourceBundle containerBundle;
 2318|   242k|        const UResourceBundle *rb;
 2319|   242k|        UErrorCode pathErrorCode = U_ZERO_ERROR;  // Ignore if parents up to root do not have this path.
 2320|   242k|        if (bundle->fResPath == nullptr || *bundle->fResPath == 0) {
  ------------------
  |  Branch (2320:13): [True: 0, False: 242k]
  |  Branch (2320:44): [True: 0, False: 242k]
  ------------------
 2321|      0|            rb = parentBundle.getAlias();
 2322|   242k|        } else {
 2323|   242k|            rb = ures_getByKeyWithFallback(parentBundle.getAlias(), bundle->fResPath,
  ------------------
  |  | 1662|   242k|#define ures_getByKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getByKeyWithFallback)
  |  |  ------------------
  |  |  |  |  123|   242k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   242k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   242k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2324|   242k|                                           containerBundle.getAlias(), &pathErrorCode);
 2325|   242k|        }
 2326|   242k|        if (U_SUCCESS(pathErrorCode)) {
  ------------------
  |  Branch (2326:13): [True: 242k, False: 0]
  ------------------
 2327|   242k|            getAllItemsWithFallback(rb, value, sink, errorCode);
 2328|   242k|        }
 2329|   242k|    }
 2330|   553k|}
uresbund.cpp:_ZL15getFallbackDataPK15UResourceBundlePPKcPjP10UErrorCode:
  319|   298k|        const char **resTag, Resource *res, UErrorCode *status) {
  320|   298k|    UResourceDataEntry *dataEntry = resBundle->fData;
  321|   298k|    int32_t indexR = -1;
  322|   298k|    int32_t i = 0;
  323|   298k|    *res = RES_BOGUS;
  ------------------
  |  |   65|   298k|#define RES_BOGUS 0xffffffff
  ------------------
  324|   298k|    if(dataEntry == nullptr) {
  ------------------
  |  Branch (324:8): [True: 0, False: 298k]
  ------------------
  325|      0|        *status = U_MISSING_RESOURCE_ERROR;
  326|      0|        return nullptr;
  327|      0|    }
  328|   298k|    if(dataEntry->fBogus == U_ZERO_ERROR) { /* if this resource is real, */
  ------------------
  |  Branch (328:8): [True: 298k, False: 0]
  ------------------
  329|   298k|        *res = res_getTableItemByKey(&(dataEntry->fData), dataEntry->fData.rootRes, &indexR, resTag); /* try to get data from there */
  ------------------
  |  |  207|   298k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|   298k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   298k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   298k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|   298k|        i++;
  331|   298k|    }
  332|   298k|    if(resBundle->fHasFallback) {
  ------------------
  |  Branch (332:8): [True: 298k, False: 0]
  ------------------
  333|       |        // Otherwise, we'll look in parents.
  334|   652k|        while(*res == RES_BOGUS && dataEntry->fParent != nullptr) {
  ------------------
  |  |   65|  1.30M|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (334:15): [True: 452k, False: 200k]
  |  Branch (334:36): [True: 354k, False: 98.6k]
  ------------------
  335|   354k|            dataEntry = dataEntry->fParent;
  336|   354k|            if(dataEntry->fBogus == U_ZERO_ERROR) {
  ------------------
  |  Branch (336:16): [True: 354k, False: 0]
  ------------------
  337|   354k|                i++;
  338|   354k|                *res = res_getTableItemByKey(&(dataEntry->fData), dataEntry->fData.rootRes, &indexR, resTag);
  ------------------
  |  |  207|   354k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|   354k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   354k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   354k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  339|   354k|            }
  340|   354k|        }
  341|   298k|    }
  342|       |
  343|   298k|    if(*res == RES_BOGUS) {
  ------------------
  |  |   65|   298k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (343:8): [True: 98.6k, False: 200k]
  ------------------
  344|       |        // If the resource is not found, we need to give an error.
  345|  98.6k|        *status = U_MISSING_RESOURCE_ERROR;
  346|  98.6k|        return nullptr;
  347|  98.6k|    }
  348|       |    // If the resource is found in parents, we need to adjust the error.
  349|   200k|    if(i>1) {
  ------------------
  |  Branch (349:8): [True: 200k, False: 0]
  ------------------
  350|   200k|        if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|   200k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   200k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
                      if(uprv_strcmp(dataEntry->fName, uloc_getDefault())==0 || uprv_strcmp(dataEntry->fName, kRootLocaleName)==0) {
  ------------------
  |  |   38|   200k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   200k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (350:12): [True: 0, False: 200k]
  |  Branch (350:67): [True: 56.2k, False: 143k]
  ------------------
  351|  56.2k|            *status = U_USING_DEFAULT_WARNING;
  352|   143k|        } else {
  353|   143k|            *status = U_USING_FALLBACK_WARNING;
  354|   143k|        }
  355|   200k|    }
  356|   200k|    return dataEntry;
  357|   298k|}
uresbund.cpp:_ZL17ures_openWithTypeP15UResourceBundlePKcS2_12UResOpenTypeP10UErrorCode:
 2712|  1.85M|                  UResOpenType openType, UErrorCode* status) {
 2713|  1.85M|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (2713:8): [True: 0, False: 1.85M]
  ------------------
 2714|      0|        return nullptr;
 2715|      0|    }
 2716|       |
 2717|  1.85M|    UResourceDataEntry *entry;
 2718|  1.85M|    if(openType != URES_OPEN_DIRECT) {
  ------------------
  |  Branch (2718:8): [True: 1.43M, False: 419k]
  ------------------
 2719|  1.43M|        if (localeID == nullptr) {
  ------------------
  |  Branch (2719:13): [True: 0, False: 1.43M]
  ------------------
 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|  1.43M|        CharString canonLocaleID = ulocimp_getBaseName(localeID, *status);
  ------------------
  |  | 1199|  1.43M|#define ulocimp_getBaseName U_ICU_ENTRY_POINT_RENAME(ulocimp_getBaseName)
  |  |  ------------------
  |  |  |  |  123|  1.43M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.43M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.43M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2724|  1.43M|        if(U_FAILURE(*status)) {
  ------------------
  |  Branch (2724:12): [True: 0, False: 1.43M]
  ------------------
 2725|      0|            *status = U_ILLEGAL_ARGUMENT_ERROR;
 2726|      0|            return nullptr;
 2727|      0|        }
 2728|  1.43M|        entry = entryOpen(path, canonLocaleID.data(), openType, status);
 2729|  1.43M|    } else {
 2730|   419k|        entry = entryOpenDirect(path, localeID, status);
 2731|   419k|    }
 2732|  1.85M|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (2732:8): [True: 0, False: 1.85M]
  ------------------
 2733|      0|        return nullptr;
 2734|      0|    }
 2735|  1.85M|    if(entry == nullptr) {
  ------------------
  |  Branch (2735:8): [True: 0, False: 1.85M]
  ------------------
 2736|      0|        *status = U_MISSING_RESOURCE_ERROR;
 2737|      0|        return nullptr;
 2738|      0|    }
 2739|       |
 2740|  1.85M|    UBool isStackObject;
 2741|  1.85M|    if(r == nullptr) {
  ------------------
  |  Branch (2741:8): [True: 1.85M, False: 0]
  ------------------
 2742|  1.85M|        r = static_cast<UResourceBundle*>(uprv_malloc(sizeof(UResourceBundle)));
  ------------------
  |  | 1524|  1.85M|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.85M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.85M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.85M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2743|  1.85M|        if(r == nullptr) {
  ------------------
  |  Branch (2743:12): [True: 0, False: 1.85M]
  ------------------
 2744|      0|            entryClose(entry);
 2745|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
 2746|      0|            return nullptr;
 2747|      0|        }
 2748|  1.85M|        isStackObject = false;
 2749|  1.85M|    } else {  // fill-in
 2750|      0|        isStackObject = ures_isStackObject(r);
 2751|      0|        ures_closeBundle(r, false);
 2752|      0|    }
 2753|  1.85M|    uprv_memset(r, 0, sizeof(UResourceBundle));
  ------------------
  |  |  100|  1.85M|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  1.85M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 2754|  1.85M|    ures_setIsStackObject(r, isStackObject);
 2755|       |
 2756|  1.85M|    r->fValidLocaleDataEntry = r->fData = entry;
 2757|  1.85M|    r->fHasFallback = openType != URES_OPEN_DIRECT && !r->getResData().noFallback;
  ------------------
  |  Branch (2757:23): [True: 1.43M, False: 419k]
  |  Branch (2757:55): [True: 1.43M, False: 0]
  ------------------
 2758|  1.85M|    r->fIsTopLevel = true;
 2759|  1.85M|    r->fRes = r->getResData().rootRes;
 2760|  1.85M|    r->fSize = res_countArrayItems(&r->getResData(), r->fRes);
  ------------------
  |  |  197|  1.85M|#define res_countArrayItems U_ICU_ENTRY_POINT_RENAME(res_countArrayItems)
  |  |  ------------------
  |  |  |  |  123|  1.85M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.85M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.85M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2761|  1.85M|    r->fIndex = -1;
 2762|       |
 2763|  1.85M|    ResourceTracer(r).traceOpen();
 2764|       |
 2765|  1.85M|    return r;
 2766|  1.85M|}
uresbund.cpp:_ZL9entryOpenPKcS0_12UResOpenTypeP10UErrorCode:
  812|  1.43M|                                     UResOpenType openType, UErrorCode* status) {
  813|  1.43M|    U_ASSERT(openType != URES_OPEN_DIRECT);
  ------------------
  |  |   35|  1.43M|#   define U_ASSERT(exp) (void)0
  ------------------
  814|  1.43M|    UErrorCode intStatus = U_ZERO_ERROR;
  815|  1.43M|    UResourceDataEntry *r = nullptr;
  816|  1.43M|    UResourceDataEntry *t1 = nullptr;
  817|  1.43M|    UBool isDefault = false;
  818|  1.43M|    UBool isRoot = false;
  819|  1.43M|    UBool hasRealData = false;
  820|  1.43M|    UBool hasChopped = true;
  821|  1.43M|    UBool usingUSRData = U_USE_USRDATA && ( path == nullptr || uprv_strncmp(path,U_ICUDATA_NAME,8) == 0);
  ------------------
  |  |  157|  2.86M|#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|  1.43M|    char name[ULOC_FULLNAME_CAPACITY];
  824|  1.43M|    char usrDataPath[96];
  825|       |
  826|  1.43M|    initCache(status);
  827|       |
  828|  1.43M|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (828:8): [True: 0, False: 1.43M]
  ------------------
  829|      0|        return nullptr;
  830|      0|    }
  831|       |
  832|  1.43M|    uprv_strncpy(name, localeID, sizeof(name) - 1);
  ------------------
  |  |   43|  1.43M|#define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
  |  |  ------------------
  |  |  |  |  393|  1.43M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  833|  1.43M|    name[sizeof(name) - 1] = 0;
  834|       |
  835|  1.43M|    if ( usingUSRData ) {
  ------------------
  |  Branch (835:10): [True: 0, False: 1.43M]
  ------------------
  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|  1.43M|    const char *defaultLocale = uloc_getDefault();
  ------------------
  |  | 1118|  1.43M|#define uloc_getDefault U_ICU_ENTRY_POINT_RENAME(uloc_getDefault)
  |  |  ------------------
  |  |  |  |  123|  1.43M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.43M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.43M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  849|       |
  850|  1.43M|    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|  1.43M|    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|  1.43M|    if (intStatus == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (856:9): [True: 0, False: 1.43M]
  ------------------
  857|      0|        *status = intStatus;
  858|      0|        goto finish;
  859|      0|    }
  860|       |
  861|  1.43M|    if(r != nullptr) { /* if there is one real locale, we can look for parents. */
  ------------------
  |  Branch (861:8): [True: 1.43M, False: 0]
  ------------------
  862|  1.43M|        t1 = r;
  863|  1.43M|        hasRealData = true;
  864|  1.43M|        if ( usingUSRData ) {  /* This code inserts user override data into the inheritance chain */
  ------------------
  |  Branch (864:14): [True: 0, False: 1.43M]
  ------------------
  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|  1.43M|        if ((hasChopped || mayHaveParent(name)) && !isRoot) {
  ------------------
  |  Branch (882:14): [True: 569k, False: 862k]
  |  Branch (882:28): [True: 756, False: 861k]
  |  Branch (882:52): [True: 570k, False: 0]
  ------------------
  883|   570k|            if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) {
  ------------------
  |  |   99|   570k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  |  Branch (883:17): [True: 0, False: 570k]
  ------------------
  884|      0|                goto finish;
  885|      0|            }
  886|   570k|        }
  887|  1.43M|    }
  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|  1.43M|    if(r==nullptr && openType == URES_OPEN_LOCALE_DEFAULT_ROOT && !isDefault && !isRoot) {
  ------------------
  |  Branch (891:8): [True: 0, False: 1.43M]
  |  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|  1.43M|    if(r == nullptr) {
  ------------------
  |  Branch (916:8): [True: 0, False: 1.43M]
  ------------------
  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|  1.43M|    } else if(!isRoot && uprv_strcmp(t1->fName, kRootLocaleName) != 0 &&
  ------------------
  |  |   38|  1.43M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  1.43M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (932:15): [True: 1.43M, False: 1]
  |  Branch (932:26): [True: 1.43M, False: 0]
  ------------------
  933|  1.43M|            t1->fParent == nullptr && !r->fData.noFallback) {
  ------------------
  |  Branch (933:13): [True: 492, False: 1.43M]
  |  Branch (933:39): [True: 492, False: 0]
  ------------------
  934|    492|        if (!insertRootBundle(t1, status)) {
  ------------------
  |  Branch (934:13): [True: 0, False: 492]
  ------------------
  935|      0|            goto finish;
  936|      0|        }
  937|    492|        if(!hasRealData) {
  ------------------
  |  Branch (937:12): [True: 0, False: 492]
  ------------------
  938|      0|            r->fBogus = U_USING_DEFAULT_WARNING;
  939|      0|        }
  940|    492|    }
  941|       |
  942|       |    // TODO: Does this ever loop?
  943|  3.77M|    while(r != nullptr && !isRoot && t1->fParent != nullptr) {
  ------------------
  |  Branch (943:11): [True: 3.77M, False: 0]
  |  Branch (943:27): [True: 3.77M, False: 1]
  |  Branch (943:38): [True: 2.34M, False: 1.43M]
  ------------------
  944|  2.34M|        t1->fParent->fCountExisting++;
  945|  2.34M|        t1 = t1->fParent;
  946|  2.34M|    }
  947|       |
  948|  1.43M|finish:
  949|  1.43M|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (949:8): [True: 1.43M, False: 0]
  ------------------
  950|  1.43M|        if(intStatus != U_ZERO_ERROR) {
  ------------------
  |  Branch (950:12): [True: 697k, False: 735k]
  ------------------
  951|   697k|            *status = intStatus;  
  952|   697k|        }
  953|  1.43M|        return r;
  954|  1.43M|    } else {
  955|      0|        return nullptr;
  956|      0|    }
  957|  1.43M|}
uresbund.cpp:_ZL9initCacheP10UErrorCode:
  483|  1.85M|static void initCache(UErrorCode *status) {
  484|  1.85M|    umtx_initOnce(gCacheInitOnce, &createCache, *status);
  485|  1.85M|}
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|  3.60M|static int32_t U_CALLCONV hashEntry(const UHashTok parm) {
   59|  3.60M|    UResourceDataEntry* b = static_cast<UResourceDataEntry*>(parm.pointer);
   60|  3.60M|    UHashTok namekey, pathkey;
   61|  3.60M|    namekey.pointer = b->fName;
   62|  3.60M|    pathkey.pointer = b->fPath;
   63|  3.60M|    return uhash_hashChars(namekey)+37u*uhash_hashChars(pathkey);
  ------------------
  |  | 1011|  3.60M|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  123|  3.60M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.60M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.60M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return uhash_hashChars(namekey)+37u*uhash_hashChars(pathkey);
  ------------------
  |  | 1011|  3.60M|#define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars)
  |  |  ------------------
  |  |  |  |  123|  3.60M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.60M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.60M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   64|  3.60M|}
uresbund.cpp:_ZL14compareEntries8UElementS_:
   67|  3.59M|static UBool U_CALLCONV compareEntries(const UHashTok p1, const UHashTok p2) {
   68|  3.59M|    UResourceDataEntry* b1 = static_cast<UResourceDataEntry*>(p1.pointer);
   69|  3.59M|    UResourceDataEntry* b2 = static_cast<UResourceDataEntry*>(p2.pointer);
   70|  3.59M|    UHashTok name1, name2, path1, path2;
   71|  3.59M|    name1.pointer = b1->fName;
   72|  3.59M|    name2.pointer = b2->fName;
   73|  3.59M|    path1.pointer = b1->fPath;
   74|  3.59M|    path2.pointer = b2->fPath;
   75|  3.59M|    return uhash_compareChars(name1, name2) && uhash_compareChars(path1, path2);
  ------------------
  |  |  993|  3.59M|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|  3.59M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.59M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.59M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  return uhash_compareChars(name1, name2) && uhash_compareChars(path1, path2);
  ------------------
  |  |  993|  3.59M|#define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars)
  |  |  ------------------
  |  |  |  |  123|  3.59M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.59M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.59M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (75:12): [True: 3.59M, False: 0]
  |  Branch (75:48): [True: 3.59M, False: 0]
  ------------------
   76|  3.59M|}
uresbund.cpp:_ZL17findFirstExistingPKcPcS0_12UResOpenTypePaS3_S3_P10UErrorCode:
  665|  1.43M|                  UBool *isRoot, UBool *foundParent, UBool *isDefault, UErrorCode* status) {
  666|  1.43M|    UResourceDataEntry *r = nullptr;
  667|  1.43M|    UBool hasRealData = false;
  668|  1.43M|    *foundParent = true; /* we're starting with a fresh name */
  669|  1.43M|    char origName[ULOC_FULLNAME_CAPACITY];
  670|       |
  671|  1.43M|    uprv_strcpy(origName, name);
  ------------------
  |  |   36|  1.43M|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  1.43M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  672|  4.60M|    while(*foundParent && !hasRealData) {
  ------------------
  |  Branch (672:11): [True: 3.74M, False: 862k]
  |  Branch (672:27): [True: 3.17M, False: 569k]
  ------------------
  673|  3.17M|        r = init_entry(name, path, status);
  674|       |        /* Null pointer test */
  675|  3.17M|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (675:13): [True: 0, False: 3.17M]
  ------------------
  676|      0|            return nullptr;
  677|      0|        }
  678|  3.17M|        *isDefault = static_cast<UBool>(uprv_strncmp(name, defaultLocale, uprv_strlen(name)) == 0);
  ------------------
  |  |   44|  3.17M|#define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
  |  |  ------------------
  |  |  |  |  393|  3.17M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  679|  3.17M|        hasRealData = static_cast<UBool>(r->fBogus == U_ZERO_ERROR);
  680|  3.17M|        if(!hasRealData) {
  ------------------
  |  Branch (680:12): [True: 1.74M, False: 1.43M]
  ------------------
  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|  1.74M|            r->fCountExisting--;
  687|       |            /*entryCloseInt(r);*/
  688|  1.74M|            r = nullptr;
  689|  1.74M|            *status = U_USING_FALLBACK_WARNING;
  690|  1.74M|        } else {
  691|  1.43M|            uprv_strcpy(name, r->fName); /* this is needed for supporting aliases */
  ------------------
  |  |   36|  1.43M|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  1.43M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  692|  1.43M|        }
  693|       |
  694|  3.17M|        *isRoot = static_cast<UBool>(uprv_strcmp(name, kRootLocaleName) == 0);
  ------------------
  |  |   38|  3.17M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  3.17M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  695|       |
  696|       |        /*Fallback data stuff*/
  697|  3.17M|        if (!hasRealData) {
  ------------------
  |  Branch (697:13): [True: 1.74M, False: 1.43M]
  ------------------
  698|  1.74M|            *foundParent = getParentLocaleID(name, origName, openType);
  699|  1.74M|        } 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|  1.43M|            *foundParent = chopLocale(name);
  703|  1.43M|        }
  704|  3.17M|        if (*foundParent && *name == '\0') {
  ------------------
  |  Branch (704:13): [True: 2.31M, False: 862k]
  |  Branch (704:29): [True: 0, False: 2.31M]
  ------------------
  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|  3.17M|    }
  708|  1.43M|    return r;
  709|  1.43M|}
uresbund.cpp:_ZL17getParentLocaleIDPcPKc12UResOpenType:
  211|  1.74M|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|  1.74M|    size_t nameLen = uprv_strlen(name);
  ------------------
  |  |   37|  1.74M|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.74M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  214|  1.74M|    if (!nameLen || name[nameLen - 1] == '_' || hasVariant(name)) {
  ------------------
  |  Branch (214:9): [True: 0, False: 1.74M]
  |  Branch (214:21): [True: 0, False: 1.74M]
  |  Branch (214:49): [True: 392k, False: 1.35M]
  ------------------
  215|   392k|        return chopLocale(name);
  216|   392k|    }
  217|       |    
  218|  1.35M|    UErrorCode err = U_ZERO_ERROR;
  219|  1.35M|    CharString language;
  220|  1.35M|    CharString script;
  221|  1.35M|    CharString region;
  222|  1.35M|    ulocimp_getSubtags(name, &language, &script, &region, nullptr, nullptr, err);
  ------------------
  |  | 1209|  1.35M|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|       |
  224|  1.35M|    if (U_FAILURE(err)) {
  ------------------
  |  Branch (224:9): [True: 0, False: 1.35M]
  ------------------
  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|  1.35M|    if (openType == URES_OPEN_LOCALE_DEFAULT_ROOT) {
  ------------------
  |  Branch (234:9): [True: 1.35M, False: 0]
  ------------------
  235|  1.35M|        const char* parentID = performFallbackLookup(name, parentLocaleChars, parentLocaleChars, parentLocaleTable, UPRV_LENGTHOF(parentLocaleTable));
  ------------------
  |  |   99|  1.35M|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  236|  1.35M|        if (parentID != nullptr) {
  ------------------
  |  Branch (236:13): [True: 0, False: 1.35M]
  ------------------
  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|  1.35M|    }
  241|       |
  242|  1.35M|    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|  1.35M|    if (!script.isEmpty() && !region.isEmpty()) {
  ------------------
  |  Branch (246:9): [True: 696k, False: 654k]
  |  Branch (246:30): [True: 45.0k, False: 651k]
  ------------------
  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|  45.0k|        if (getDefaultScript(language, region) == script) {
  ------------------
  |  Branch (250:13): [True: 3.21k, False: 41.8k]
  ------------------
  251|  3.21k|            workingLocale.append(language, err).append("_", err).append(region, err);
  252|  41.8k|        } else {
  253|  41.8k|            workingLocale.append(language, err).append("_", err).append(script, err);
  254|  41.8k|        }
  255|  1.30M|    } else if (!region.isEmpty()) {
  ------------------
  |  Branch (255:16): [True: 654k, False: 651k]
  ------------------
  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|   654k|        UErrorCode err = U_ZERO_ERROR;
  260|   654k|        CharString origNameLanguage;
  261|   654k|        CharString origNameScript;
  262|   654k|        ulocimp_getSubtags(origName, &origNameLanguage, &origNameScript, nullptr, nullptr, nullptr, err);
  ------------------
  |  | 1209|   654k|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|   654k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   654k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   654k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  263|   654k|        if (!origNameScript.isEmpty()) {
  ------------------
  |  Branch (263:13): [True: 3.13k, False: 651k]
  ------------------
  264|  3.13k|            workingLocale.append(language, err).append("_", err).append(origNameScript, err);
  265|   651k|        } else {
  266|   651k|            workingLocale.append(language, err).append("_", err).append(getDefaultScript(language, region), err);
  267|   651k|        }
  268|   654k|    } else if (!script.isEmpty()) {
  ------------------
  |  Branch (268:16): [True: 651k, 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|   651k|        if (openType != URES_OPEN_LOCALE_DEFAULT_ROOT || getDefaultScript(language, CharString()) == script) {
  ------------------
  |  Branch (275:13): [True: 0, False: 651k]
  |  Branch (275:13): [True: 651k, False: 0]
  |  Branch (275:58): [True: 651k, False: 0]
  ------------------
  276|   651k|            workingLocale.append(language, err);
  277|   651k|        } else {
  278|      0|            return false;
  279|      0|        }
  280|   651k|    } 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|  1.35M|    if (U_SUCCESS(err) && !workingLocale.isEmpty()) {
  ------------------
  |  Branch (284:9): [True: 1.35M, False: 0]
  |  Branch (284:27): [True: 1.35M, False: 0]
  ------------------
  285|  1.35M|        uprv_strcpy(name, workingLocale.data());
  ------------------
  |  |   36|  1.35M|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  1.35M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  286|  1.35M|        return true;
  287|  1.35M|    } else {
  288|      0|        return false;
  289|      0|    }
  290|  1.35M|}
uresbund.cpp:_ZL10hasVariantPKc:
   94|  1.74M|static UBool hasVariant(const char* localeID) {
   95|  1.74M|    UErrorCode err = U_ZERO_ERROR;
   96|  1.74M|    CheckedArrayByteSink sink(nullptr, 0);
   97|  1.74M|    ulocimp_getSubtags(
  ------------------
  |  | 1209|  1.74M|#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags)
  |  |  ------------------
  |  |  |  |  123|  1.74M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.74M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.74M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|  1.74M|            localeID,
   99|  1.74M|            nullptr,
  100|  1.74M|            nullptr,
  101|  1.74M|            nullptr,
  102|  1.74M|            &sink,
  103|  1.74M|            nullptr,
  104|  1.74M|            err);
  105|  1.74M|    return sink.NumberOfBytesAppended() != 0;
  106|  1.74M|}
uresbund.cpp:_ZL21performFallbackLookupPKcS0_S0_PKii:
  118|  3.39M|                                         int32_t lookupTableLength) {
  119|  3.39M|    const int32_t* bottom = lookupTable;
  120|  3.39M|    const int32_t* top = lookupTable + lookupTableLength;
  121|       |
  122|  33.7M|    while (bottom < top) {
  ------------------
  |  Branch (122:12): [True: 30.6M, False: 3.11M]
  ------------------
  123|       |        // Effectively, divide by 2 and round down to an even index
  124|  30.6M|        const int32_t* middle = bottom + (((top - bottom) / 4) * 2);
  125|  30.6M|        const char* entryKey = &(keyStrs[*middle]);
  126|  30.6M|        int32_t strcmpResult = uprv_strcmp(key, entryKey);
  ------------------
  |  |   38|  30.6M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  30.6M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  127|  30.6M|        if (strcmpResult == 0) {
  ------------------
  |  Branch (127:13): [True: 284k, False: 30.3M]
  ------------------
  128|   284k|            return &(valueStrs[middle[1]]);
  129|  30.3M|        } else if (strcmpResult < 0) {
  ------------------
  |  Branch (129:20): [True: 18.1M, False: 12.1M]
  ------------------
  130|  18.1M|            top = middle;
  131|  18.1M|        } else {
  132|  12.1M|            bottom = middle + 2;
  133|  12.1M|        }
  134|  30.6M|    }
  135|  3.11M|    return nullptr;
  136|  3.39M|}
uresbund.cpp:_ZL16getDefaultScriptRKN6icu_7810CharStringES2_:
  138|  1.34M|static CharString getDefaultScript(const CharString& language, const CharString& region) {
  139|  1.34M|    const char* defaultScript = nullptr;
  140|  1.34M|    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|  1.34M|    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|  1.34M|    if (!region.isEmpty()) {
  ------------------
  |  Branch (147:9): [True: 696k, False: 651k]
  ------------------
  148|   696k|        CharString localeID;
  149|   696k|        localeID.append(language, err).append("_", err).append(region, err);
  150|   696k|        if (U_FAILURE(err)) {
  ------------------
  |  Branch (150:13): [True: 0, False: 696k]
  ------------------
  151|      0|            return result;
  152|      0|        }
  153|   696k|        defaultScript = performFallbackLookup(localeID.data(), dsLocaleIDChars, scriptCodeChars, defaultScriptTable, UPRV_LENGTHOF(defaultScriptTable));
  ------------------
  |  |   99|   696k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  154|   696k|    }
  155|       |    
  156|       |    // if we didn't find anything, look up just the language in the default script table
  157|  1.34M|    if (defaultScript == nullptr) {
  ------------------
  |  Branch (157:9): [True: 1.34M, False: 900]
  ------------------
  158|  1.34M|        defaultScript = performFallbackLookup(language.data(), dsLocaleIDChars, scriptCodeChars, defaultScriptTable, UPRV_LENGTHOF(defaultScriptTable));
  ------------------
  |  |   99|  1.34M|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
  159|  1.34M|    }
  160|       |    
  161|       |    // if either lookup above succeeded, copy the result from "defaultScript" into "result"; otherwise, return "Latn"
  162|  1.34M|    if (defaultScript != nullptr) {
  ------------------
  |  Branch (162:9): [True: 284k, False: 1.06M]
  ------------------
  163|   284k|        result.clear();
  164|   284k|        result.append(defaultScript, err);
  165|   284k|    }
  166|  1.34M|    return result;
  167|  1.34M|}
uresbund.cpp:_ZL10chopLocalePc:
   83|  1.82M|static UBool chopLocale(char *name) {
   84|  1.82M|    char *i = uprv_strrchr(name, '_');
  ------------------
  |  |   42|  1.82M|#define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  1.82M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   85|       |
   86|  1.82M|    if(i != nullptr) {
  ------------------
  |  Branch (86:8): [True: 962k, False: 862k]
  ------------------
   87|   962k|        *i = '\0';
   88|   962k|        return true;
   89|   962k|    }
   90|       |
   91|   862k|    return false;
   92|  1.82M|}
uresbund.cpp:_ZL10init_entryPKcS0_P10UErrorCode:
  514|  3.59M|static UResourceDataEntry *init_entry(const char *localeID, const char *path, UErrorCode *status) {
  515|  3.59M|    UResourceDataEntry *r = nullptr;
  516|  3.59M|    UResourceDataEntry find;
  517|       |    /*int32_t hashValue;*/
  518|  3.59M|    const char *name;
  519|  3.59M|    char aliasName[100] = { 0 };
  520|  3.59M|    int32_t aliasLen = 0;
  521|       |    /*UBool isAlias = false;*/
  522|       |    /*UHashTok hashkey; */
  523|       |
  524|  3.59M|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (524:8): [True: 0, False: 3.59M]
  ------------------
  525|      0|        return nullptr;
  526|      0|    }
  527|       |
  528|       |    /* here we try to deduce the right locale name */
  529|  3.59M|    if(localeID == nullptr) { /* if localeID is nullptr, we're trying to open default locale */
  ------------------
  |  Branch (529:8): [True: 0, False: 3.59M]
  ------------------
  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|  3.59M|    } else if(*localeID == 0) { /* if localeID is "" then we try to open root locale */
  ------------------
  |  Branch (531:15): [True: 1, False: 3.59M]
  ------------------
  532|      1|        name = kRootLocaleName;
  ------------------
  |  |   18|      1|#define kRootLocaleName         "root"
  ------------------
  533|  3.59M|    } else { /* otherwise, we'll open what we're given */
  534|  3.59M|        name = localeID;
  535|  3.59M|    }
  536|       |
  537|  3.59M|    find.fName = const_cast<char*>(name);
  538|  3.59M|    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|  3.59M|    r = static_cast<UResourceDataEntry*>(uhash_get(cache, &find));
  ------------------
  |  | 1007|  3.59M|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|  3.59M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.59M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.59M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  546|  3.59M|    if(r == nullptr) {
  ------------------
  |  Branch (546:8): [True: 1.79k, False: 3.59M]
  ------------------
  547|       |        /* if the entry is not yet in the hash table, we'll try to construct a new one */
  548|  1.79k|        r = static_cast<UResourceDataEntry*>(uprv_malloc(sizeof(UResourceDataEntry)));
  ------------------
  |  | 1524|  1.79k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.79k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.79k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.79k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  549|  1.79k|        if(r == nullptr) {
  ------------------
  |  Branch (549:12): [True: 0, False: 1.79k]
  ------------------
  550|      0|            *status = U_MEMORY_ALLOCATION_ERROR;
  551|      0|            return nullptr;
  552|      0|        }
  553|       |
  554|  1.79k|        uprv_memset(r, 0, sizeof(UResourceDataEntry));
  ------------------
  |  |  100|  1.79k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  1.79k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  555|       |        /*r->fHashKey = hashValue;*/
  556|       |
  557|  1.79k|        setEntryName(r, name, status);
  558|  1.79k|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (558:13): [True: 0, False: 1.79k]
  ------------------
  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|  1.79k|        if(path != nullptr) {
  ------------------
  |  Branch (563:12): [True: 988, False: 802]
  ------------------
  564|    988|            r->fPath = uprv_strdup(path);
  ------------------
  |  | 1541|    988|#define uprv_strdup U_ICU_ENTRY_POINT_RENAME(uprv_strdup)
  |  |  ------------------
  |  |  |  |  123|    988|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    988|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    988|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  565|    988|            if(r->fPath == nullptr) {
  ------------------
  |  Branch (565:16): [True: 0, False: 988]
  ------------------
  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|    988|        }
  571|       |
  572|       |        /* this is the actual loading */
  573|  1.79k|        res_load(&(r->fData), r->fPath, r->fName, status);
  ------------------
  |  |  208|  1.79k|#define res_load U_ICU_ENTRY_POINT_RENAME(res_load)
  |  |  ------------------
  |  |  |  |  123|  1.79k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.79k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.79k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  574|       |
  575|  1.79k|        if (U_FAILURE(*status)) {
  ------------------
  |  Branch (575:13): [True: 469, False: 1.32k]
  ------------------
  576|       |            /* if we failed to load due to an out-of-memory error, exit early. */
  577|    469|            if (*status == U_MEMORY_ALLOCATION_ERROR) {
  ------------------
  |  Branch (577:17): [True: 0, False: 469]
  ------------------
  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|    469|            *status = U_USING_FALLBACK_WARNING;
  583|    469|            r->fBogus = U_USING_FALLBACK_WARNING;
  584|  1.32k|        } else { /* if we have a regular entry */
  585|  1.32k|            Resource aliasres;
  586|  1.32k|            if (r->fData.usesPoolBundle) {
  ------------------
  |  Branch (586:17): [True: 1.31k, False: 6]
  ------------------
  587|  1.31k|                r->fPool = getPoolEntry(r->fPath, status);
  588|  1.31k|                if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (588:21): [True: 1.31k, False: 0]
  ------------------
  589|  1.31k|                    const int32_t *poolIndexes = r->fPool->fData.pRoot + 1;
  590|  1.31k|                    if(r->fData.pRoot[1 + URES_INDEX_POOL_CHECKSUM] == poolIndexes[URES_INDEX_POOL_CHECKSUM]) {
  ------------------
  |  Branch (590:24): [True: 1.31k, False: 0]
  ------------------
  591|  1.31k|                        r->fData.poolBundleKeys = reinterpret_cast<const char*>(poolIndexes + (poolIndexes[URES_INDEX_LENGTH] & 0xff));
  592|  1.31k|                        r->fData.poolBundleStrings = r->fPool->fData.p16BitUnits;
  593|  1.31k|                    } else {
  594|      0|                        r->fBogus = *status = U_INVALID_FORMAT_ERROR;
  595|      0|                    }
  596|  1.31k|                } else {
  597|      0|                    r->fBogus = *status;
  598|      0|                }
  599|  1.31k|            }
  600|  1.32k|            if (U_SUCCESS(*status)) {
  ------------------
  |  Branch (600:17): [True: 1.32k, False: 0]
  ------------------
  601|       |                /* handle the alias by trying to get out the %%Alias tag.*/
  602|       |                /* We'll try to get alias string from the bundle */
  603|  1.32k|                aliasres = res_getResource(&(r->fData), "%%ALIAS");
  ------------------
  |  |  204|  1.32k|#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
  |  |  ------------------
  |  |  |  |  123|  1.32k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.32k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.32k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  604|  1.32k|                if (aliasres != RES_BOGUS) {
  ------------------
  |  |   65|  1.32k|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (604:21): [True: 1, False: 1.32k]
  ------------------
  605|       |                    // No tracing: called during initial data loading
  606|      1|                    const char16_t *alias = res_getStringNoTrace(&(r->fData), aliasres, &aliasLen);
  ------------------
  |  |  205|      1|#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  607|      1|                    if(alias != nullptr && aliasLen > 0) { /* if there is actual alias - unload and load new data */
  ------------------
  |  Branch (607:24): [True: 1, False: 0]
  |  Branch (607:44): [True: 1, False: 0]
  ------------------
  608|      1|                        u_UCharsToChars(alias, aliasName, aliasLen+1);
  ------------------
  |  |  211|      1|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  609|      1|                        r->fAlias = init_entry(aliasName, path, status);
  610|      1|                    }
  611|      1|                }
  612|  1.32k|            }
  613|  1.32k|        }
  614|       |
  615|  1.79k|        {
  616|  1.79k|            UResourceDataEntry *oldR = nullptr;
  617|  1.79k|            if ((oldR = static_cast<UResourceDataEntry*>(uhash_get(cache, r))) == nullptr) { /* if the data is not cached */
  ------------------
  |  | 1007|  1.79k|#define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get)
  |  |  ------------------
  |  |  |  |  123|  1.79k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.79k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.79k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (617:17): [True: 1.79k, False: 0]
  ------------------
  618|       |                /* just insert it in the cache */
  619|  1.79k|                UErrorCode cacheStatus = U_ZERO_ERROR;
  620|  1.79k|                uhash_put(cache, (void *)r, r, &cacheStatus);
  ------------------
  |  | 1032|  1.79k|#define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put)
  |  |  ------------------
  |  |  |  |  123|  1.79k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.79k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.79k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  621|  1.79k|                if (U_FAILURE(cacheStatus)) {
  ------------------
  |  Branch (621:21): [True: 0, False: 1.79k]
  ------------------
  622|      0|                    *status = cacheStatus;
  623|      0|                    free_entry(r);
  624|      0|                    r = nullptr;
  625|      0|                }
  626|  1.79k|            } 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|  1.79k|        }
  633|       |
  634|  1.79k|    }
  635|  3.59M|    if(r != nullptr) {
  ------------------
  |  Branch (635:8): [True: 3.59M, False: 0]
  ------------------
  636|       |        /* return the real bundle */
  637|  3.59M|        while(r->fAlias != nullptr) {
  ------------------
  |  Branch (637:15): [True: 84, False: 3.59M]
  ------------------
  638|     84|            r = r->fAlias;
  639|     84|        }
  640|  3.59M|        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|  3.59M|        if(r->fBogus != U_ZERO_ERROR && U_SUCCESS(*status)) {
  ------------------
  |  Branch (643:12): [True: 1.74M, False: 1.85M]
  |  Branch (643:41): [True: 1.74M, False: 0]
  ------------------
  644|  1.74M|             *status = r->fBogus; /* set the returning status */
  645|  1.74M|        }
  646|  3.59M|    }
  647|  3.59M|    return r;
  648|  3.59M|}
uresbund.cpp:_ZL12setEntryNameP18UResourceDataEntryPKcP10UErrorCode:
  489|  1.79k|static void setEntryName(UResourceDataEntry *res, const char *name, UErrorCode *status) {
  490|  1.79k|    int32_t len = static_cast<int32_t>(uprv_strlen(name));
  ------------------
  |  |   37|  1.79k|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.79k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  491|  1.79k|    if(res->fName != nullptr && res->fName != res->fNameBuffer) {
  ------------------
  |  Branch (491:8): [True: 0, False: 1.79k]
  |  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|  1.79k|    if (len < static_cast<int32_t>(sizeof(res->fNameBuffer))) {
  ------------------
  |  Branch (494:9): [True: 270, False: 1.52k]
  ------------------
  495|    270|        res->fName = res->fNameBuffer;
  496|    270|    }
  497|  1.52k|    else {
  498|  1.52k|        res->fName = static_cast<char*>(uprv_malloc(len + 1));
  ------------------
  |  | 1524|  1.52k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  499|  1.52k|    }
  500|  1.79k|    if(res->fName == nullptr) {
  ------------------
  |  Branch (500:8): [True: 0, False: 1.79k]
  ------------------
  501|      0|        *status = U_MEMORY_ALLOCATION_ERROR;
  502|  1.79k|    } else {
  503|  1.79k|        uprv_strcpy(res->fName, name);
  ------------------
  |  |   36|  1.79k|#define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE  strcpy(dst, src)
  |  |  ------------------
  |  |  |  |  393|  1.79k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  504|  1.79k|    }
  505|  1.79k|}
uresbund.cpp:_ZL12getPoolEntryPKcP10UErrorCode:
  651|  1.31k|getPoolEntry(const char *path, UErrorCode *status) {
  652|  1.31k|    UResourceDataEntry *poolBundle = init_entry(kPoolBundleName, path, status);
  ------------------
  |  |   19|  1.31k|#define kPoolBundleName         "pool"
  ------------------
  653|  1.31k|    if( U_SUCCESS(*status) &&
  ------------------
  |  Branch (653:9): [True: 1.31k, False: 0]
  ------------------
  654|  1.31k|        (poolBundle == nullptr || poolBundle->fBogus != U_ZERO_ERROR || !poolBundle->fData.isPoolBundle)
  ------------------
  |  Branch (654:10): [True: 0, False: 1.31k]
  |  Branch (654:35): [True: 0, False: 1.31k]
  |  Branch (654:73): [True: 0, False: 1.31k]
  ------------------
  655|  1.31k|    ) {
  656|      0|        *status = U_INVALID_FORMAT_ERROR;
  657|      0|    }
  658|  1.31k|    return poolBundle;
  659|  1.31k|}
uresbund.cpp:_ZL13mayHaveParentPc:
  297|   862k|static UBool mayHaveParent(char *name) {
  298|   862k|    return (name[0] != 0 && uprv_strstr("nb nn",name) != nullptr);
  ------------------
  |  |   41|   862k|#define uprv_strstr(s, c) U_STANDARD_CPP_NAMESPACE strstr(s, c)
  |  |  ------------------
  |  |  |  |  393|   862k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (298:13): [True: 862k, False: 0]
  |  Branch (298:29): [True: 760, False: 862k]
  ------------------
  299|   862k|}
uresbund.cpp:_ZL21loadParentsExceptRootRP18UResourceDataEntryPciaS2_P10UErrorCode:
  746|   570k|                      UBool usingUSRData, char usrDataPath[], UErrorCode *status) {
  747|   570k|    if (U_FAILURE(*status)) { return false; }
  ------------------
  |  Branch (747:9): [True: 0, False: 570k]
  ------------------
  748|   570k|    UBool checkParent = true;
  749|   571k|    while (checkParent && t1->fParent == nullptr && !t1->fData.noFallback &&
  ------------------
  |  Branch (749:12): [True: 571k, False: 444]
  |  Branch (749:27): [True: 854, False: 570k]
  |  Branch (749:53): [True: 854, False: 0]
  ------------------
  750|   571k|            res_getResource(&t1->fData,"%%ParentIsRoot") == RES_BOGUS) {
  ------------------
  |  |  204|    854|#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
  |  |  ------------------
  |  |  |  |  123|    854|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    854|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    854|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                          res_getResource(&t1->fData,"%%ParentIsRoot") == RES_BOGUS) {
  ------------------
  |  |   65|    854|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (750:13): [True: 854, False: 0]
  ------------------
  751|    854|        Resource parentRes = res_getResource(&t1->fData, "%%Parent");
  ------------------
  |  |  204|    854|#define res_getResource U_ICU_ENTRY_POINT_RENAME(res_getResource)
  |  |  ------------------
  |  |  |  |  123|    854|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    854|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    854|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  752|    854|        if (parentRes != RES_BOGUS) {  // An explicit parent was found.
  ------------------
  |  |   65|    854|#define RES_BOGUS 0xffffffff
  ------------------
  |  Branch (752:13): [True: 294, False: 560]
  ------------------
  753|    294|            int32_t parentLocaleLen = 0;
  754|       |            // No tracing: called during initial data loading
  755|    294|            const char16_t *parentLocaleName = res_getStringNoTrace(&(t1->fData), parentRes, &parentLocaleLen);
  ------------------
  |  |  205|    294|#define res_getStringNoTrace U_ICU_ENTRY_POINT_RENAME(res_getStringNoTrace)
  |  |  ------------------
  |  |  |  |  123|    294|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    294|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    294|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  756|    294|            if(parentLocaleName != nullptr && 0 < parentLocaleLen && parentLocaleLen < nameCapacity) {
  ------------------
  |  Branch (756:16): [True: 294, False: 0]
  |  Branch (756:47): [True: 294, False: 0]
  |  Branch (756:70): [True: 294, False: 0]
  ------------------
  757|    294|                u_UCharsToChars(parentLocaleName, name, parentLocaleLen + 1);
  ------------------
  |  |  211|    294|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|    294|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    294|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    294|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  758|    294|                if (uprv_strcmp(name, kRootLocaleName) == 0) {
  ------------------
  |  |   38|    294|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|    294|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (758:21): [True: 34, False: 260]
  ------------------
  759|     34|                    return true;
  760|     34|                }
  761|    294|            }
  762|    294|        }
  763|       |        // Insert regular parents.
  764|    820|        UErrorCode parentStatus = U_ZERO_ERROR;
  765|    820|        UResourceDataEntry *t2 = init_entry(name, t1->fPath, &parentStatus);
  766|    820|        if (U_FAILURE(parentStatus)) {
  ------------------
  |  Branch (766:13): [True: 0, False: 820]
  ------------------
  767|      0|            *status = parentStatus;
  768|      0|            return false;
  769|      0|        }
  770|    820|        UResourceDataEntry *u2 = nullptr;
  771|    820|        UErrorCode usrStatus = U_ZERO_ERROR;
  772|    820|        if (usingUSRData) {  // This code inserts user override data into the inheritance chain.
  ------------------
  |  Branch (772:13): [True: 0, False: 820]
  ------------------
  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|    820|        if (usingUSRData && U_SUCCESS(usrStatus) && u2->fBogus == U_ZERO_ERROR) {
  ------------------
  |  Branch (781:13): [True: 0, False: 820]
  |  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|    820|        } else {
  785|    820|            t1->fParent = t2;
  786|    820|            if (usingUSRData) {
  ------------------
  |  Branch (786:17): [True: 0, False: 820]
  ------------------
  787|       |                // The USR override data wasn't found, set it to be deleted.
  788|      0|                u2->fCountExisting = 0;
  789|      0|            }
  790|    820|        }
  791|    820|        t1 = t2;
  792|    820|        checkParent = chopLocale(name) || mayHaveParent(name);
  ------------------
  |  Branch (792:23): [True: 372, False: 448]
  |  Branch (792:43): [True: 4, False: 444]
  ------------------
  793|    820|    }
  794|   570k|    return true;
  795|   570k|}
uresbund.cpp:_ZL16insertRootBundleRP18UResourceDataEntryP10UErrorCode:
  798|    492|insertRootBundle(UResourceDataEntry *&t1, UErrorCode *status) {
  799|    492|    if (U_FAILURE(*status)) { return false; }
  ------------------
  |  Branch (799:9): [True: 0, False: 492]
  ------------------
  800|    492|    UErrorCode parentStatus = U_ZERO_ERROR;
  801|    492|    UResourceDataEntry *t2 = init_entry(kRootLocaleName, t1->fPath, &parentStatus);
  ------------------
  |  |   18|    492|#define kRootLocaleName         "root"
  ------------------
  802|    492|    if (U_FAILURE(parentStatus)) {
  ------------------
  |  Branch (802:9): [True: 0, False: 492]
  ------------------
  803|      0|        *status = parentStatus;
  804|      0|        return false;
  805|      0|    }
  806|    492|    t1->fParent = t2;
  807|    492|    t1 = t2;
  808|    492|    return true;
  809|    492|}
uresbund.cpp:_ZL15entryOpenDirectPKcS0_P10UErrorCode:
  966|   419k|entryOpenDirect(const char* path, const char* localeID, UErrorCode* status) {
  967|   419k|    initCache(status);
  968|   419k|    if(U_FAILURE(*status)) {
  ------------------
  |  Branch (968:8): [True: 0, False: 419k]
  ------------------
  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|   419k|    if (localeID == nullptr) {
  ------------------
  |  Branch (974:9): [True: 0, False: 419k]
  ------------------
  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|   419k|    } else if (*localeID == 0) {
  ------------------
  |  Branch (976:16): [True: 0, False: 419k]
  ------------------
  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|   419k|    Mutex lock(&resbMutex);
  982|       |
  983|       |    // findFirstExisting() without fallbacks.
  984|   419k|    UResourceDataEntry *r = init_entry(localeID, path, status);
  985|   419k|    if(U_SUCCESS(*status)) {
  ------------------
  |  Branch (985:8): [True: 419k, False: 0]
  ------------------
  986|   419k|        if(r->fBogus != U_ZERO_ERROR) {
  ------------------
  |  Branch (986:12): [True: 0, False: 419k]
  ------------------
  987|      0|            r->fCountExisting--;
  988|      0|            r = nullptr;
  989|      0|        }
  990|   419k|    } 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|   419k|    UResourceDataEntry *t1 = r;
  997|   419k|    if(r != nullptr && uprv_strcmp(localeID, kRootLocaleName) != 0 &&  // not root
  ------------------
  |  |   38|   419k|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|   419k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (997:8): [True: 419k, False: 0]
  |  Branch (997:24): [True: 419k, False: 0]
  ------------------
  998|   419k|            r->fParent == nullptr && !r->fData.noFallback &&
  ------------------
  |  Branch (998:13): [True: 419k, False: 0]
  |  Branch (998:38): [True: 0, False: 419k]
  ------------------
  999|   419k|            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|   419k|    if(r != nullptr) {
  ------------------
  |  Branch (1013:8): [True: 419k, False: 0]
  ------------------
 1014|       |        // TODO: Does this ever loop?
 1015|   419k|        while(t1->fParent != nullptr) {
  ------------------
  |  Branch (1015:15): [True: 0, False: 419k]
  ------------------
 1016|      0|            t1->fParent->fCountExisting++;
 1017|      0|            t1 = t1->fParent;
 1018|      0|        }
 1019|   419k|    }
 1020|   419k|    return r;
 1021|   419k|}

res_load_78:
  260|  1.79k|         const char *path, const char *name, UErrorCode *errorCode) {
  261|  1.79k|    UVersionInfo formatVersion;
  262|       |
  263|  1.79k|    uprv_memset(pResData, 0, sizeof(ResourceData));
  ------------------
  |  |  100|  1.79k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  1.79k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  264|       |
  265|       |    /* load the ResourceBundle file */
  266|  1.79k|    pResData->data=udata_openChoice(path, "res", name, isAcceptable, formatVersion, errorCode);
  ------------------
  |  |  894|  1.79k|#define udata_openChoice U_ICU_ENTRY_POINT_RENAME(udata_openChoice)
  |  |  ------------------
  |  |  |  |  123|  1.79k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.79k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.79k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|  1.79k|    if(U_FAILURE(*errorCode)) {
  ------------------
  |  Branch (267:8): [True: 469, False: 1.32k]
  ------------------
  268|    469|        return;
  269|    469|    }
  270|       |
  271|       |    /* get its memory and initialize *pResData */
  272|  1.32k|    res_init(pResData, formatVersion, udata_getMemory(pResData->data), -1, errorCode);
  ------------------
  |  |  891|  1.32k|#define udata_getMemory U_ICU_ENTRY_POINT_RENAME(udata_getMemory)
  |  |  ------------------
  |  |  |  |  123|  1.32k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.32k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.32k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  273|  1.32k|}
res_getStringNoTrace_78:
  311|  3.75M|res_getStringNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength) {
  312|  3.75M|    const char16_t *p;
  313|  3.75M|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|  3.75M|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  314|  3.75M|    int32_t length;
  315|  3.75M|    if(RES_GET_TYPE(res)==URES_STRING_V2) {
  ------------------
  |  |   68|  3.75M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (315:8): [True: 3.75M, False: 0]
  ------------------
  316|  3.75M|        int32_t first;
  317|  3.75M|        if((int32_t)offset<pResData->poolStringIndexLimit) {
  ------------------
  |  Branch (317:12): [True: 1.50M, False: 2.25M]
  ------------------
  318|  1.50M|            p=(const char16_t *)pResData->poolBundleStrings+offset;
  319|  2.25M|        } else {
  320|  2.25M|            p=(const char16_t *)pResData->p16BitUnits+(offset-pResData->poolStringIndexLimit);
  321|  2.25M|        }
  322|  3.75M|        first=*p;
  323|  3.75M|        if(!U16_IS_TRAIL(first)) {
  ------------------
  |  |   67|  3.75M|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  ------------------
  |  Branch (323:12): [True: 3.75M, False: 4.02k]
  ------------------
  324|  3.75M|            length=u_strlen(p);
  ------------------
  |  |  393|  3.75M|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|  3.75M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.75M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.75M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  325|  3.75M|        } else if(first<0xdfef) {
  ------------------
  |  Branch (325:19): [True: 4.02k, False: 0]
  ------------------
  326|  4.02k|            length=first&0x3ff;
  327|  4.02k|            ++p;
  328|  4.02k|        } else if(first<0xdfff) {
  ------------------
  |  Branch (328:19): [True: 0, False: 0]
  ------------------
  329|      0|            length=((first-0xdfef)<<16)|p[1];
  330|      0|            p+=2;
  331|      0|        } else {
  332|      0|            length=((int32_t)p[1]<<16)|p[2];
  333|      0|            p+=3;
  334|      0|        }
  335|  3.75M|    } else if(res==offset) /* RES_GET_TYPE(res)==URES_STRING */ {
  ------------------
  |  Branch (335:15): [True: 0, False: 0]
  ------------------
  336|      0|        const int32_t *p32= res==0 ? &gEmptyString.length : pResData->pRoot+res;
  ------------------
  |  Branch (336:29): [True: 0, False: 0]
  ------------------
  337|      0|        length=*p32++;
  338|      0|        p=(const char16_t *)p32;
  339|      0|    } else {
  340|      0|        p=nullptr;
  341|      0|        length=0;
  342|      0|    }
  343|  3.75M|    if(pLength) {
  ------------------
  |  Branch (343:8): [True: 3.75M, False: 1.29k]
  ------------------
  344|  3.75M|        *pLength=length;
  345|  3.75M|    }
  346|  3.75M|    return p;
  347|  3.75M|}
res_getAlias_78:
  420|  9.28k|res_getAlias(const ResourceData *pResData, Resource res, int32_t *pLength) {
  421|  9.28k|    const char16_t *p;
  422|  9.28k|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|  9.28k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  423|  9.28k|    int32_t length;
  424|  9.28k|    if(RES_GET_TYPE(res)==URES_ALIAS) {
  ------------------
  |  |   68|  9.28k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (424:8): [True: 9.28k, False: 0]
  ------------------
  425|  9.28k|        const int32_t *p32= offset==0 ? &gEmptyString.length : pResData->pRoot+offset;
  ------------------
  |  Branch (425:29): [True: 0, False: 9.28k]
  ------------------
  426|  9.28k|        length=*p32++;
  427|  9.28k|        p=(const char16_t *)p32;
  428|  9.28k|    } else {
  429|      0|        p=nullptr;
  430|      0|        length=0;
  431|      0|    }
  432|  9.28k|    if(pLength) {
  ------------------
  |  Branch (432:8): [True: 9.28k, False: 0]
  ------------------
  433|  9.28k|        *pLength=length;
  434|  9.28k|    }
  435|  9.28k|    return p;
  436|  9.28k|}
res_getIntVectorNoTrace_78:
  459|  46.8k|res_getIntVectorNoTrace(const ResourceData *pResData, Resource res, int32_t *pLength) {
  460|  46.8k|    const int32_t *p;
  461|  46.8k|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|  46.8k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  462|  46.8k|    int32_t length;
  463|  46.8k|    if(RES_GET_TYPE(res)==URES_INT_VECTOR) {
  ------------------
  |  |   68|  46.8k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  |  Branch (463:8): [True: 46.8k, False: 0]
  ------------------
  464|  46.8k|        p= offset==0 ? (const int32_t *)&gEmpty32 : pResData->pRoot+offset;
  ------------------
  |  Branch (464:12): [True: 0, False: 46.8k]
  ------------------
  465|  46.8k|        length=*p++;
  466|  46.8k|    } else {
  467|      0|        p=nullptr;
  468|      0|        length=0;
  469|      0|    }
  470|  46.8k|    if(pLength) {
  ------------------
  |  Branch (470:8): [True: 46.8k, False: 0]
  ------------------
  471|  46.8k|        *pLength=length;
  472|  46.8k|    }
  473|  46.8k|    return p;
  474|  46.8k|}
res_countArrayItems_78:
  477|  6.35M|res_countArrayItems(const ResourceData *pResData, Resource res) {
  478|  6.35M|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|  6.35M|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  479|  6.35M|    switch(RES_GET_TYPE(res)) {
  ------------------
  |  |   68|  6.35M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  480|      0|    case URES_STRING:
  ------------------
  |  Branch (480:5): [True: 0, False: 6.35M]
  ------------------
  481|   471k|    case URES_STRING_V2:
  ------------------
  |  Branch (481:5): [True: 471k, False: 5.88M]
  ------------------
  482|   471k|    case URES_BINARY:
  ------------------
  |  Branch (482:5): [True: 0, False: 6.35M]
  ------------------
  483|   471k|    case URES_ALIAS:
  ------------------
  |  Branch (483:5): [True: 0, False: 6.35M]
  ------------------
  484|   775k|    case URES_INT:
  ------------------
  |  Branch (484:5): [True: 304k, False: 6.05M]
  ------------------
  485|   822k|    case URES_INT_VECTOR:
  ------------------
  |  Branch (485:5): [True: 46.8k, False: 6.31M]
  ------------------
  486|   822k|        return 1;
  487|   249k|    case URES_ARRAY:
  ------------------
  |  Branch (487:5): [True: 249k, False: 6.10M]
  ------------------
  488|   249k|    case URES_TABLE32:
  ------------------
  |  Branch (488:5): [True: 0, False: 6.35M]
  ------------------
  489|   249k|        return offset==0 ? 0 : *(pResData->pRoot+offset);
  ------------------
  |  Branch (489:16): [True: 0, False: 249k]
  ------------------
  490|  4.08M|    case URES_TABLE:
  ------------------
  |  Branch (490:5): [True: 4.08M, False: 2.27M]
  ------------------
  491|  4.08M|        return offset==0 ? 0 : *((const uint16_t *)(pResData->pRoot+offset));
  ------------------
  |  Branch (491:16): [True: 259k, False: 3.82M]
  ------------------
  492|   436k|    case URES_ARRAY16:
  ------------------
  |  Branch (492:5): [True: 436k, False: 5.92M]
  ------------------
  493|  1.20M|    case URES_TABLE16:
  ------------------
  |  Branch (493:5): [True: 767k, False: 5.59M]
  ------------------
  494|  1.20M|        return pResData->p16BitUnits[offset];
  495|      0|    default:
  ------------------
  |  Branch (495:5): [True: 0, False: 6.35M]
  ------------------
  496|      0|        return 0;
  497|  6.35M|    }
  498|  6.35M|}
_ZN6icu_7817ResourceDataValueD2Ev:
  502|   311k|ResourceDataValue::~ResourceDataValue() {}
_ZNK6icu_7817ResourceDataValue9getStringERiR10UErrorCode:
  508|  2.57M|const char16_t *ResourceDataValue::getString(int32_t &length, UErrorCode &errorCode) const {
  509|  2.57M|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (509:8): [True: 0, False: 2.57M]
  ------------------
  510|      0|        return nullptr;
  511|      0|    }
  512|  2.57M|    const char16_t *s = res_getString(fTraceInfo, &getData(), res, &length);
  513|  2.57M|    if(s == nullptr) {
  ------------------
  |  Branch (513:8): [True: 0, False: 2.57M]
  ------------------
  514|      0|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  515|      0|    }
  516|  2.57M|    return s;
  517|  2.57M|}
_ZNK6icu_7817ResourceDataValue8getArrayER10UErrorCode:
  572|      3|ResourceArray ResourceDataValue::getArray(UErrorCode &errorCode) const {
  573|      3|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (573:8): [True: 0, False: 3]
  ------------------
  574|      0|        return {};
  575|      0|    }
  576|      3|    const uint16_t *items16 = nullptr;
  577|      3|    const Resource *items32 = nullptr;
  578|      3|    uint32_t offset=RES_GET_OFFSET(res);
  ------------------
  |  |   69|      3|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  579|      3|    int32_t length = 0;
  580|      3|    switch(RES_GET_TYPE(res)) {
  ------------------
  |  |   68|      3|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  581|      0|    case URES_ARRAY:
  ------------------
  |  Branch (581:5): [True: 0, False: 3]
  ------------------
  582|      0|        if (offset!=0) {  // empty if offset==0
  ------------------
  |  Branch (582:13): [True: 0, False: 0]
  ------------------
  583|      0|            items32 = reinterpret_cast<const Resource*>(getData().pRoot) + offset;
  584|      0|            length = *items32++;
  585|      0|        }
  586|      0|        break;
  587|      3|    case URES_ARRAY16:
  ------------------
  |  Branch (587:5): [True: 3, False: 0]
  ------------------
  588|      3|        items16 = getData().p16BitUnits+offset;
  589|      3|        length = *items16++;
  590|      3|        break;
  591|      0|    default:
  ------------------
  |  Branch (591:5): [True: 0, False: 3]
  ------------------
  592|      0|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  593|      0|        return {};
  594|      3|    }
  595|      3|    return ResourceArray(items16, items32, length, fTraceInfo);
  596|      3|}
_ZNK6icu_7817ResourceDataValue8getTableER10UErrorCode:
  598|   856k|ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const {
  599|   856k|    if(U_FAILURE(errorCode)) {
  ------------------
  |  Branch (599:8): [True: 0, False: 856k]
  ------------------
  600|      0|        return {};
  601|      0|    }
  602|   856k|    const uint16_t *keys16 = nullptr;
  603|   856k|    const int32_t *keys32 = nullptr;
  604|   856k|    const uint16_t *items16 = nullptr;
  605|   856k|    const Resource *items32 = nullptr;
  606|   856k|    uint32_t offset = RES_GET_OFFSET(res);
  ------------------
  |  |   69|   856k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  607|   856k|    int32_t length = 0;
  608|   856k|    switch(RES_GET_TYPE(res)) {
  ------------------
  |  |   68|   856k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  609|   151k|    case URES_TABLE:
  ------------------
  |  Branch (609:5): [True: 151k, False: 705k]
  ------------------
  610|   151k|        if (offset != 0) {  // empty if offset==0
  ------------------
  |  Branch (610:13): [True: 151k, False: 0]
  ------------------
  611|   151k|            keys16 = reinterpret_cast<const uint16_t*>(getData().pRoot + offset);
  612|   151k|            length = *keys16++;
  613|   151k|            items32 = reinterpret_cast<const Resource*>(keys16 + length + (~length & 1));
  614|   151k|        }
  615|   151k|        break;
  616|   705k|    case URES_TABLE16:
  ------------------
  |  Branch (616:5): [True: 705k, False: 151k]
  ------------------
  617|   705k|        keys16 = getData().p16BitUnits+offset;
  618|   705k|        length = *keys16++;
  619|   705k|        items16 = keys16 + length;
  620|   705k|        break;
  621|      0|    case URES_TABLE32:
  ------------------
  |  Branch (621:5): [True: 0, False: 856k]
  ------------------
  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: 856k]
  ------------------
  629|      0|        errorCode = U_RESOURCE_TYPE_MISMATCH;
  630|      0|        return {};
  631|   856k|    }
  632|   856k|    return ResourceTable(keys16, keys32, items16, items32, length, fTraceInfo);
  633|   856k|}
res_getTableItemByKey_78:
  713|  9.04M|                      int32_t *indexR, const char **key) {
  714|  9.04M|    uint32_t offset=RES_GET_OFFSET(table);
  ------------------
  |  |   69|  9.04M|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  715|  9.04M|    int32_t length;
  716|  9.04M|    int32_t idx;
  717|  9.04M|    if(key == nullptr || *key == nullptr) {
  ------------------
  |  Branch (717:8): [True: 0, False: 9.04M]
  |  Branch (717:26): [True: 0, False: 9.04M]
  ------------------
  718|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  719|      0|    }
  720|  9.04M|    switch(RES_GET_TYPE(table)) {
  ------------------
  |  |   68|  9.04M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  721|  8.37M|    case URES_TABLE: {
  ------------------
  |  Branch (721:5): [True: 8.37M, False: 674k]
  ------------------
  722|  8.37M|        if (offset!=0) { /* empty if offset==0 */
  ------------------
  |  Branch (722:13): [True: 7.79M, False: 577k]
  ------------------
  723|  7.79M|            const uint16_t *p= (const uint16_t *)(pResData->pRoot+offset);
  724|  7.79M|            length=*p++;
  725|  7.79M|            *indexR=idx=_res_findTableItem(pResData, p, length, *key, key);
  726|  7.79M|            if(idx>=0) {
  ------------------
  |  Branch (726:16): [True: 5.54M, False: 2.25M]
  ------------------
  727|  5.54M|                const Resource *p32=(const Resource *)(p+length+(~length&1));
  728|  5.54M|                return p32[idx];
  729|  5.54M|            }
  730|  7.79M|        }
  731|  2.82M|        break;
  732|  8.37M|    }
  733|  2.82M|    case URES_TABLE16: {
  ------------------
  |  Branch (733:5): [True: 674k, False: 8.37M]
  ------------------
  734|   674k|        const uint16_t *p=pResData->p16BitUnits+offset;
  735|   674k|        length=*p++;
  736|   674k|        *indexR=idx=_res_findTableItem(pResData, p, length, *key, key);
  737|   674k|        if(idx>=0) {
  ------------------
  |  Branch (737:12): [True: 281k, False: 393k]
  ------------------
  738|   281k|            return makeResourceFrom16(pResData, p[length+idx]);
  739|   281k|        }
  740|   393k|        break;
  741|   674k|    }
  742|   393k|    case URES_TABLE32: {
  ------------------
  |  Branch (742:5): [True: 0, False: 9.04M]
  ------------------
  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: 9.04M]
  ------------------
  754|      0|        break;
  755|  9.04M|    }
  756|  3.22M|    return RES_BOGUS;
  ------------------
  |  |   65|  3.22M|#define RES_BOGUS 0xffffffff
  ------------------
  757|  9.04M|}
res_getTableItemByIndex_78:
  761|  1.29k|                        int32_t indexR, const char **key) {
  762|  1.29k|    uint32_t offset=RES_GET_OFFSET(table);
  ------------------
  |  |   69|  1.29k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  763|  1.29k|    int32_t length;
  764|  1.29k|    if (indexR < 0) {
  ------------------
  |  Branch (764:9): [True: 0, False: 1.29k]
  ------------------
  765|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  766|      0|    }
  767|  1.29k|    switch(RES_GET_TYPE(table)) {
  ------------------
  |  |   68|  1.29k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  768|  1.29k|    case URES_TABLE: {
  ------------------
  |  Branch (768:5): [True: 1.29k, False: 0]
  ------------------
  769|  1.29k|        if (offset != 0) { /* empty if offset==0 */
  ------------------
  |  Branch (769:13): [True: 1.29k, False: 0]
  ------------------
  770|  1.29k|            const uint16_t *p= (const uint16_t *)(pResData->pRoot+offset);
  771|  1.29k|            length=*p++;
  772|  1.29k|            if(indexR<length) {
  ------------------
  |  Branch (772:16): [True: 1.29k, False: 0]
  ------------------
  773|  1.29k|                const Resource *p32=(const Resource *)(p+length+(~length&1));
  774|  1.29k|                if(key!=nullptr) {
  ------------------
  |  Branch (774:20): [True: 1.29k, False: 0]
  ------------------
  775|  1.29k|                    *key=RES_GET_KEY16(pResData, p[indexR]);
  ------------------
  |  |   44|  1.29k|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 1.29k, False: 0]
  |  |  ------------------
  |  |   45|  1.29k|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|  1.29k|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
  776|  1.29k|                }
  777|  1.29k|                return p32[indexR];
  778|  1.29k|            }
  779|  1.29k|        }
  780|      0|        break;
  781|  1.29k|    }
  782|      0|    case URES_TABLE16: {
  ------------------
  |  Branch (782:5): [True: 0, False: 1.29k]
  ------------------
  783|      0|        const uint16_t *p=pResData->p16BitUnits+offset;
  784|      0|        length=*p++;
  785|      0|        if(indexR<length) {
  ------------------
  |  Branch (785:12): [True: 0, False: 0]
  ------------------
  786|      0|            if(key!=nullptr) {
  ------------------
  |  Branch (786:16): [True: 0, False: 0]
  ------------------
  787|      0|                *key=RES_GET_KEY16(pResData, p[indexR]);
  ------------------
  |  |   44|      0|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 0, False: 0]
  |  |  ------------------
  |  |   45|      0|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|      0|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
  788|      0|            }
  789|      0|            return makeResourceFrom16(pResData, p[length+indexR]);
  790|      0|        }
  791|      0|        break;
  792|      0|    }
  793|      0|    case URES_TABLE32: {
  ------------------
  |  Branch (793:5): [True: 0, False: 1.29k]
  ------------------
  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: 1.29k]
  ------------------
  807|      0|        break;
  808|  1.29k|    }
  809|      0|    return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  810|  1.29k|}
res_getResource_78:
  813|  3.02k|res_getResource(const ResourceData *pResData, const char *key) {
  814|  3.02k|    const char *realKey=key;
  815|  3.02k|    int32_t idx;
  816|  3.02k|    return res_getTableItemByKey(pResData, pResData->rootRes, &idx, &realKey);
  ------------------
  |  |  207|  3.02k|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  3.02k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.02k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.02k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  817|  3.02k|}
_ZNK6icu_7813ResourceTable14getKeyAndValueEiRPKcRNS_13ResourceValueE:
  821|  5.60M|                                         const char *&key, icu::ResourceValue &value) const {
  822|  5.60M|    if(0 <= i && i < length) {
  ------------------
  |  Branch (822:8): [True: 5.60M, False: 0]
  |  Branch (822:18): [True: 4.74M, False: 856k]
  ------------------
  823|  4.74M|        icu::ResourceDataValue &rdValue = static_cast<icu::ResourceDataValue &>(value);
  824|  4.74M|        if (keys16 != nullptr) {
  ------------------
  |  Branch (824:13): [True: 4.74M, False: 0]
  ------------------
  825|  4.74M|            key = RES_GET_KEY16(&rdValue.getData(), keys16[i]);
  ------------------
  |  |   44|  4.74M|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 941, False: 4.74M]
  |  |  ------------------
  |  |   45|  4.74M|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|  4.74M|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
  826|  4.74M|        } 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|  4.74M|        Resource res;
  830|  4.74M|        if (items16 != nullptr) {
  ------------------
  |  Branch (830:13): [True: 4.44M, False: 302k]
  ------------------
  831|  4.44M|            res = makeResourceFrom16(&rdValue.getData(), items16[i]);
  832|  4.44M|        } else {
  833|   302k|            res = items32[i];
  834|   302k|        }
  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|  4.74M|        rdValue.setResource(res, ResourceTracer(fTraceInfo, key));
  840|  4.74M|        return true;
  841|  4.74M|    }
  842|   856k|    return false;
  843|  5.60M|}
res_getArrayItem_78:
  869|   558k|res_getArrayItem(const ResourceData *pResData, Resource array, int32_t indexR) {
  870|   558k|    uint32_t offset=RES_GET_OFFSET(array);
  ------------------
  |  |   69|   558k|#define RES_GET_OFFSET(res) ((res)&0x0fffffff)
  ------------------
  871|   558k|    if (indexR < 0) {
  ------------------
  |  Branch (871:9): [True: 0, False: 558k]
  ------------------
  872|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  873|      0|    }
  874|   558k|    switch(RES_GET_TYPE(array)) {
  ------------------
  |  |   68|   558k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  875|   247k|    case URES_ARRAY: {
  ------------------
  |  Branch (875:5): [True: 247k, False: 310k]
  ------------------
  876|   247k|        if (offset!=0) { /* empty if offset==0 */
  ------------------
  |  Branch (876:13): [True: 247k, False: 0]
  ------------------
  877|   247k|            const int32_t *p= pResData->pRoot+offset;
  878|   247k|            if(indexR<*p) {
  ------------------
  |  Branch (878:16): [True: 247k, False: 0]
  ------------------
  879|   247k|                return (Resource)p[1+indexR];
  880|   247k|            }
  881|   247k|        }
  882|      0|        break;
  883|   247k|    }
  884|   310k|    case URES_ARRAY16: {
  ------------------
  |  Branch (884:5): [True: 310k, False: 247k]
  ------------------
  885|   310k|        const uint16_t *p=pResData->p16BitUnits+offset;
  886|   310k|        if(indexR<*p) {
  ------------------
  |  Branch (886:12): [True: 310k, False: 0]
  ------------------
  887|   310k|            return makeResourceFrom16(pResData, p[1+indexR]);
  888|   310k|        }
  889|      0|        break;
  890|   310k|    }
  891|      0|    default:
  ------------------
  |  Branch (891:5): [True: 0, False: 558k]
  ------------------
  892|      0|        break;
  893|   558k|    }
  894|      0|    return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  895|   558k|}
_ZNK6icu_7813ResourceArray19internalGetResourceEPK12ResourceDatai:
  897|     14|uint32_t icu::ResourceArray::internalGetResource(const ResourceData *pResData, int32_t i) const {
  898|     14|    if (items16 != nullptr) {
  ------------------
  |  Branch (898:9): [True: 14, False: 0]
  ------------------
  899|     14|        return makeResourceFrom16(pResData, items16[i]);
  900|     14|    } else {
  901|      0|        return items32[i];
  902|      0|    }
  903|     14|}
_ZNK6icu_7813ResourceArray8getValueEiRNS_13ResourceValueE:
  905|     14|UBool icu::ResourceArray::getValue(int32_t i, icu::ResourceValue &value) const {
  906|     14|    if(0 <= i && i < length) {
  ------------------
  |  Branch (906:8): [True: 14, False: 0]
  |  Branch (906:18): [True: 14, False: 0]
  ------------------
  907|     14|        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|     14|        rdValue.setResource(
  913|     14|            internalGetResource(&rdValue.getData(), i),
  914|     14|            ResourceTracer(fTraceInfo, i));
  915|     14|        return true;
  916|     14|    }
  917|      0|    return false;
  918|     14|}
res_findResource_78:
  921|  1.79M|res_findResource(const ResourceData *pResData, Resource r, char** path, const char** key) {
  922|  1.79M|  char *pathP = *path, *nextSepP = *path;
  923|  1.79M|  char *closeIndex = nullptr;
  924|  1.79M|  Resource t1 = r;
  925|  1.79M|  Resource t2;
  926|  1.79M|  int32_t indexR = 0;
  927|  1.79M|  UResType type = (UResType)RES_GET_TYPE(t1);
  ------------------
  |  |   68|  1.79M|#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|  1.79M|  if(!uprv_strlen(pathP)) {
  ------------------
  |  |   37|  1.79M|#define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str)
  |  |  ------------------
  |  |  |  |  393|  1.79M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  |  Branch (930:6): [True: 0, False: 1.79M]
  ------------------
  931|      0|      return r;
  932|      0|  }
  933|       |
  934|       |  /* one needs to have an aggregate resource in order to search in it */
  935|  1.79M|  if(!URES_IS_CONTAINER(type)) {
  ------------------
  |  |   85|  1.79M|#define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   84|  3.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.79M, False: 246]
  |  |  |  |  |  Branch (84:61): [True: 246, 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|  4.41M|  while(nextSepP && *pathP && t1 != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   65|  7.81M|#define RES_BOGUS 0xffffffff
  ------------------
                while(nextSepP && *pathP && t1 != RES_BOGUS && URES_IS_CONTAINER(type)) {
  ------------------
  |  |   85|  2.62M|#define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type))
  |  |  ------------------
  |  |  |  |   84|  5.24M|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (84:30): [True: 2.59M, False: 24.3k]
  |  |  |  |  |  Branch (84:61): [True: 24.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 (939:9): [True: 3.49M, False: 922k]
  |  Branch (939:21): [True: 3.39M, False: 98.0k]
  |  Branch (939:31): [True: 2.62M, False: 777k]
  ------------------
  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|  2.62M|    nextSepP = uprv_strchr(pathP, RES_PATH_SEPARATOR);
  ------------------
  |  |   40|  2.62M|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|  2.62M|#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|  2.62M|    if(nextSepP != nullptr) {
  ------------------
  |  Branch (947:8): [True: 1.69M, False: 922k]
  ------------------
  948|  1.69M|      if(nextSepP == pathP) {
  ------------------
  |  Branch (948:10): [True: 0, False: 1.69M]
  ------------------
  949|       |        // Empty key string.
  950|      0|        return RES_BOGUS;
  ------------------
  |  |   65|      0|#define RES_BOGUS 0xffffffff
  ------------------
  951|      0|      }
  952|  1.69M|      *nextSepP = 0; /* overwrite the separator with a NUL to terminate the key */
  953|  1.69M|      *path = nextSepP+1;
  954|  1.69M|    } else {
  955|   922k|      *path = uprv_strchr(pathP, 0);
  ------------------
  |  |   40|   922k|#define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
  |  |  ------------------
  |  |  |  |  393|   922k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
  956|   922k|    }
  957|       |
  958|       |    /* if the resource is a table */
  959|       |    /* try the key based access */
  960|  2.62M|    if(URES_IS_TABLE(type)) {
  ------------------
  |  |   84|  2.62M|#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32)
  |  |  ------------------
  |  |  |  Branch (84:30): [True: 2.59M, False: 24.3k]
  |  |  |  Branch (84:61): [True: 24.3k, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  961|  2.62M|      *key = pathP;
  962|  2.62M|      t2 = res_getTableItemByKey(pResData, t1, &indexR, key);
  ------------------
  |  |  207|  2.62M|#define res_getTableItemByKey U_ICU_ENTRY_POINT_RENAME(res_getTableItemByKey)
  |  |  ------------------
  |  |  |  |  123|  2.62M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.62M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.62M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  963|  2.62M|    } 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|  2.62M|    t1 = t2;
  975|  2.62M|    type = (UResType)RES_GET_TYPE(t1);
  ------------------
  |  |   68|  2.62M|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  976|       |    /* position pathP to next resource key/index */
  977|  2.62M|    pathP = *path;
  978|  2.62M|  }
  979|       |
  980|  1.79M|  return t1;
  981|  1.79M|}
uresdata.cpp:_ZL12isAcceptablePvPKcS1_PK9UDataInfo:
  141|  1.32k|             const UDataInfo *pInfo) {
  142|  1.32k|    uprv_memcpy(context, pInfo->formatVersion, 4);
  ------------------
  |  |   42|  1.32k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  1.32k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  1.32k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  1.32k|    _Pragma("clang diagnostic push") \
  |  |   45|  1.32k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  1.32k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.32k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  1.32k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  1.32k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  1.32k|    _Pragma("clang diagnostic pop") \
  |  |   49|  1.32k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  1.32k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  1.32k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  1.32k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  143|  1.32k|    return
  144|  1.32k|        pInfo->size>=20 &&
  ------------------
  |  Branch (144:9): [True: 1.32k, False: 0]
  ------------------
  145|  1.32k|        pInfo->isBigEndian==U_IS_BIG_ENDIAN &&
  ------------------
  |  |  353|  2.64k|#   define U_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
  ------------------
  |  Branch (145:9): [True: 1.32k, False: 0]
  ------------------
  146|  1.32k|        pInfo->charsetFamily==U_CHARSET_FAMILY &&
  ------------------
  |  |  588|  1.32k|#   define U_CHARSET_FAMILY U_ASCII_FAMILY
  |  |  ------------------
  |  |  |  |  531|  2.64k|#define U_ASCII_FAMILY 0
  |  |  ------------------
  ------------------
  |  Branch (146:9): [True: 1.32k, False: 0]
  ------------------
  147|  1.32k|        pInfo->sizeofUChar==U_SIZEOF_UCHAR &&
  ------------------
  |  |  352|  2.64k|#define U_SIZEOF_UCHAR 2
  ------------------
  |  Branch (147:9): [True: 1.32k, False: 0]
  ------------------
  148|  1.32k|        pInfo->dataFormat[0]==0x52 &&   /* dataFormat="ResB" */
  ------------------
  |  Branch (148:9): [True: 1.32k, False: 0]
  ------------------
  149|  1.32k|        pInfo->dataFormat[1]==0x65 &&
  ------------------
  |  Branch (149:9): [True: 1.32k, False: 0]
  ------------------
  150|  1.32k|        pInfo->dataFormat[2]==0x73 &&
  ------------------
  |  Branch (150:9): [True: 1.32k, False: 0]
  ------------------
  151|  1.32k|        pInfo->dataFormat[3]==0x42 &&
  ------------------
  |  Branch (151:9): [True: 1.32k, False: 0]
  ------------------
  152|  1.32k|        (1<=pInfo->formatVersion[0] && pInfo->formatVersion[0]<=3);
  ------------------
  |  Branch (152:10): [True: 1.32k, False: 0]
  |  Branch (152:40): [True: 1.32k, False: 0]
  ------------------
  153|  1.32k|}
uresdata.cpp:_ZL8res_initP12ResourceDataPhPKviP10UErrorCode:
  160|  1.32k|         UErrorCode *errorCode) {
  161|  1.32k|    UResType rootType;
  162|       |
  163|       |    /* get the root resource */
  164|  1.32k|    pResData->pRoot = static_cast<const int32_t*>(inBytes);
  165|  1.32k|    pResData->rootRes = static_cast<Resource>(*pResData->pRoot);
  166|  1.32k|    pResData->p16BitUnits=&gEmpty16;
  167|       |
  168|       |    /* formatVersion 1.1 must have a root item and at least 5 indexes */
  169|  1.32k|    if(length>=0 && (length/4)<((formatVersion[0]==1 && formatVersion[1]==0) ? 1 : 1+5)) {
  ------------------
  |  Branch (169:8): [True: 0, False: 1.32k]
  |  Branch (169:21): [True: 0, False: 0]
  |  Branch (169:34): [True: 0, False: 0]
  |  Branch (169:57): [True: 0, False: 0]
  ------------------
  170|      0|        *errorCode=U_INVALID_FORMAT_ERROR;
  171|      0|        res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  172|      0|        return;
  173|      0|    }
  174|       |
  175|       |    /* currently, we accept only resources that have a Table as their roots */
  176|  1.32k|    rootType = static_cast<UResType>(RES_GET_TYPE(pResData->rootRes));
  ------------------
  |  |   68|  1.32k|#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL))
  ------------------
  177|  1.32k|    if(!URES_IS_TABLE(rootType)) {
  ------------------
  |  |   84|  1.32k|#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.21k, False: 109]
  |  |  |  Branch (84:61): [True: 109, False: 0]
  |  |  |  Branch (84:94): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  178|      0|        *errorCode=U_INVALID_FORMAT_ERROR;
  179|      0|        res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|      0|        return;
  181|      0|    }
  182|       |
  183|  1.32k|    if(formatVersion[0]==1 && formatVersion[1]==0) {
  ------------------
  |  Branch (183:8): [True: 0, False: 1.32k]
  |  Branch (183:31): [True: 0, False: 0]
  ------------------
  184|      0|        pResData->localKeyLimit=0x10000;  /* greater than any 16-bit key string offset */
  185|  1.32k|    } else {
  186|       |        /* bundles with formatVersion 1.1 and later contain an indexes[] array */
  187|  1.32k|        const int32_t *indexes=pResData->pRoot+1;
  188|  1.32k|        int32_t indexLength=indexes[URES_INDEX_LENGTH]&0xff;
  189|  1.32k|        if(indexLength<=URES_INDEX_MAX_TABLE_LENGTH) {
  ------------------
  |  Branch (189:12): [True: 0, False: 1.32k]
  ------------------
  190|      0|            *errorCode=U_INVALID_FORMAT_ERROR;
  191|      0|            res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|      0|            return;
  193|      0|        }
  194|  1.32k|        if( length>=0 &&
  ------------------
  |  Branch (194:13): [True: 0, False: 1.32k]
  ------------------
  195|  1.32k|            (length<((1+indexLength)<<2) ||
  ------------------
  |  Branch (195:14): [True: 0, False: 0]
  ------------------
  196|      0|             length<(indexes[URES_INDEX_BUNDLE_TOP]<<2))
  ------------------
  |  Branch (196:14): [True: 0, False: 0]
  ------------------
  197|  1.32k|        ) {
  198|      0|            *errorCode=U_INVALID_FORMAT_ERROR;
  199|      0|            res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  200|      0|            return;
  201|      0|        }
  202|  1.32k|        if(indexes[URES_INDEX_KEYS_TOP]>(1+indexLength)) {
  ------------------
  |  Branch (202:12): [True: 6, False: 1.31k]
  ------------------
  203|      6|            pResData->localKeyLimit=indexes[URES_INDEX_KEYS_TOP]<<2;
  204|      6|        }
  205|  1.32k|        if(formatVersion[0]>=3) {
  ------------------
  |  Branch (205:12): [True: 944, False: 377]
  ------------------
  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|    944|            pResData->poolStringIndexLimit = static_cast<int32_t>(static_cast<uint32_t>(indexes[URES_INDEX_LENGTH]) >> 8);
  211|    944|        }
  212|  1.32k|        if(indexLength>URES_INDEX_ATTRIBUTES) {
  ------------------
  |  Branch (212:12): [True: 1.32k, False: 0]
  ------------------
  213|  1.32k|            int32_t att=indexes[URES_INDEX_ATTRIBUTES];
  214|  1.32k|            pResData->noFallback = static_cast<UBool>(att & URES_ATT_NO_FALLBACK);
  ------------------
  |  |  148|  1.32k|#define URES_ATT_NO_FALLBACK 1
  ------------------
  215|  1.32k|            pResData->isPoolBundle = static_cast<UBool>((att & URES_ATT_IS_POOL_BUNDLE) != 0);
  ------------------
  |  |  156|  1.32k|#define URES_ATT_IS_POOL_BUNDLE 2
  ------------------
  216|  1.32k|            pResData->usesPoolBundle = static_cast<UBool>((att & URES_ATT_USES_POOL_BUNDLE) != 0);
  ------------------
  |  |  157|  1.32k|#define URES_ATT_USES_POOL_BUNDLE 4
  ------------------
  217|  1.32k|            pResData->poolStringIndexLimit|=(att&0xf000)<<12;  // bits 15..12 -> 27..24
  218|  1.32k|            pResData->poolStringIndex16Limit = static_cast<int32_t>(static_cast<uint32_t>(att) >> 16);
  219|  1.32k|        }
  220|  1.32k|        if((pResData->isPoolBundle || pResData->usesPoolBundle) && indexLength<=URES_INDEX_POOL_CHECKSUM) {
  ------------------
  |  Branch (220:13): [True: 2, False: 1.31k]
  |  Branch (220:39): [True: 1.31k, False: 4]
  |  Branch (220:68): [True: 0, False: 1.31k]
  ------------------
  221|      0|            *errorCode=U_INVALID_FORMAT_ERROR;
  222|      0|            res_unload(pResData);
  ------------------
  |  |  210|      0|#define res_unload U_ICU_ENTRY_POINT_RENAME(res_unload)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|      0|            return;
  224|      0|        }
  225|  1.32k|        if( indexLength>URES_INDEX_16BIT_TOP &&
  ------------------
  |  Branch (225:13): [True: 1.32k, False: 0]
  ------------------
  226|  1.32k|            indexes[URES_INDEX_16BIT_TOP]>indexes[URES_INDEX_KEYS_TOP]
  ------------------
  |  Branch (226:13): [True: 1.32k, False: 0]
  ------------------
  227|  1.32k|        ) {
  228|  1.32k|            pResData->p16BitUnits = reinterpret_cast<const uint16_t*>(pResData->pRoot + indexes[URES_INDEX_KEYS_TOP]);
  229|  1.32k|        }
  230|  1.32k|    }
  231|       |
  232|  1.32k|    if(formatVersion[0]==1 || U_CHARSET_FAMILY==U_ASCII_FAMILY) {
  ------------------
  |  |  588|  1.32k|#   define U_CHARSET_FAMILY U_ASCII_FAMILY
  |  |  ------------------
  |  |  |  |  531|  1.32k|#define U_ASCII_FAMILY 0
  |  |  ------------------
  ------------------
                  if(formatVersion[0]==1 || U_CHARSET_FAMILY==U_ASCII_FAMILY) {
  ------------------
  |  |  531|  1.32k|#define U_ASCII_FAMILY 0
  ------------------
  |  Branch (232:8): [True: 0, False: 1.32k]
  |  Branch (232:31): [Folded - Ignored]
  ------------------
  233|       |        /*
  234|       |         * formatVersion 1: compare key strings in native-charset order
  235|       |         * formatVersion 2 and up: compare key strings in ASCII order
  236|       |         */
  237|  1.32k|        pResData->useNativeStrcmp=true;
  238|  1.32k|    }
  239|  1.32k|}
uresdata.cpp:_ZL18_res_findTableItemPK12ResourceDataPKtiPKcPS5_:
   76|  8.47M|                   const char *key, const char **realKey) {
   77|  8.47M|    const char *tableKey;
   78|  8.47M|    int32_t mid, start, limit;
   79|  8.47M|    int result;
   80|       |
   81|       |    /* do a binary search for the key */
   82|  8.47M|    start=0;
   83|  8.47M|    limit=length;
   84|  24.5M|    while(start<limit) {
  ------------------
  |  Branch (84:11): [True: 21.9M, False: 2.64M]
  ------------------
   85|  21.9M|        mid = (start + limit) / 2;
   86|  21.9M|        tableKey = RES_GET_KEY16(pResData, keyOffsets[mid]);
  ------------------
  |  |   44|  21.9M|    ((keyOffset)<(pResData)->localKeyLimit ? \
  |  |  ------------------
  |  |  |  Branch (44:6): [True: 4.76M, False: 17.1M]
  |  |  ------------------
  |  |   45|  21.9M|        (const char *)(pResData)->pRoot+(keyOffset) : \
  |  |   46|  21.9M|        (pResData)->poolBundleKeys+(keyOffset)-(pResData)->localKeyLimit)
  ------------------
   87|  21.9M|        if (pResData->useNativeStrcmp) {
  ------------------
  |  Branch (87:13): [True: 21.9M, False: 0]
  ------------------
   88|  21.9M|            result = uprv_strcmp(key, tableKey);
  ------------------
  |  |   38|  21.9M|#define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2)
  |  |  ------------------
  |  |  |  |  393|  21.9M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
   89|  21.9M|        } 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|  21.9M|        if (result < 0) {
  ------------------
  |  Branch (92:13): [True: 7.36M, False: 14.5M]
  ------------------
   93|  7.36M|            limit = mid;
   94|  14.5M|        } else if (result > 0) {
  ------------------
  |  Branch (94:20): [True: 8.72M, False: 5.82M]
  ------------------
   95|  8.72M|            start = mid + 1;
   96|  8.72M|        } else {
   97|       |            /* We found it! */
   98|  5.82M|            *realKey=tableKey;
   99|  5.82M|            return mid;
  100|  5.82M|        }
  101|  21.9M|    }
  102|  2.64M|    return URESDATA_ITEM_NOT_FOUND;  /* not found or table is empty. */
  ------------------
  |  |   53|  2.64M|#define URESDATA_ITEM_NOT_FOUND -1
  ------------------
  103|  8.47M|}
uresdata.cpp:_ZL18makeResourceFrom16PK12ResourceDatai:
  700|  5.03M|makeResourceFrom16(const ResourceData *pResData, int32_t res16) {
  701|  5.03M|    if(res16<pResData->poolStringIndex16Limit) {
  ------------------
  |  Branch (701:8): [True: 2.25M, False: 2.78M]
  ------------------
  702|       |        // Pool string, nothing to do.
  703|  2.78M|    } else {
  704|       |        // Local string, adjust the 16-bit offset to a regular one,
  705|       |        // with a larger pool string index limit.
  706|  2.78M|        res16=res16-pResData->poolStringIndex16Limit+pResData->poolStringIndexLimit;
  707|  2.78M|    }
  708|  5.03M|    return URES_MAKE_RESOURCE(URES_STRING_V2, res16);
  ------------------
  |  |   87|  5.03M|#define URES_MAKE_RESOURCE(type, offset) (((Resource)(type)<<28)|(Resource)(offset))
  ------------------
  709|  5.03M|}

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

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

u_strFindFirst_78:
   57|  20.0M|               const char16_t *sub, int32_t subLength) {
   58|  20.0M|    const char16_t *start, *p, *q, *subLimit;
   59|  20.0M|    char16_t c, cs, cq;
   60|       |
   61|  20.0M|    if(sub==nullptr || subLength<-1) {
  ------------------
  |  Branch (61:8): [True: 0, False: 20.0M]
  |  Branch (61:24): [True: 0, False: 20.0M]
  ------------------
   62|      0|        return (char16_t *)s;
   63|      0|    }
   64|  20.0M|    if(s==nullptr || length<-1) {
  ------------------
  |  Branch (64:8): [True: 0, False: 20.0M]
  |  Branch (64:22): [True: 0, False: 20.0M]
  ------------------
   65|      0|        return nullptr;
   66|      0|    }
   67|       |
   68|  20.0M|    start=s;
   69|       |
   70|  20.0M|    if(length<0 && subLength<0) {
  ------------------
  |  Branch (70:8): [True: 0, False: 20.0M]
  |  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|  20.0M|    if(subLength<0) {
  ------------------
  |  Branch (109:8): [True: 390k, False: 19.6M]
  ------------------
  110|   390k|        subLength=u_strlen(sub);
  ------------------
  |  |  393|   390k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|   390k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   390k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   390k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  111|   390k|    }
  112|  20.0M|    if(subLength==0) {
  ------------------
  |  Branch (112:8): [True: 0, False: 20.0M]
  ------------------
  113|      0|        return (char16_t *)s;
  114|      0|    }
  115|       |
  116|       |    /* get sub[0] to search for it fast */
  117|  20.0M|    cs=*sub++;
  118|  20.0M|    --subLength;
  119|  20.0M|    subLimit=sub+subLength;
  120|       |
  121|  20.0M|    if(subLength==0 && !U16_IS_SURROGATE(cs)) {
  ------------------
  |  |   75|  16.3M|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|  16.3M|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  ------------------
  ------------------
  |  Branch (121:8): [True: 16.3M, False: 3.70M]
  |  Branch (121:24): [True: 16.2M, False: 112k]
  ------------------
  122|       |        /* the substring consists of a single, non-surrogate BMP code point */
  123|  16.2M|        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|  16.2M|#define u_memchr U_ICU_ENTRY_POINT_RENAME(u_memchr)
  |  |  ------------------
  |  |  |  |  123|  16.2M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  16.2M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  16.2M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (123:16): [True: 0, False: 16.2M]
  ------------------
  124|  16.2M|    }
  125|       |
  126|  3.81M|    if(length<0) {
  ------------------
  |  Branch (126:8): [True: 0, False: 3.81M]
  ------------------
  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|  3.81M|    } else {
  153|  3.81M|        const char16_t *limit, *preLimit;
  154|       |
  155|       |        /* subLength was decremented above */
  156|  3.81M|        if(length<=subLength) {
  ------------------
  |  Branch (156:12): [True: 276k, False: 3.53M]
  ------------------
  157|   276k|            return nullptr; /* s is shorter than sub */
  158|   276k|        }
  159|       |
  160|  3.53M|        limit=s+length;
  161|       |
  162|       |        /* the substring must start before preLimit */
  163|  3.53M|        preLimit=limit-subLength;
  164|       |
  165|   958M|        while(s!=preLimit) {
  ------------------
  |  Branch (165:15): [True: 958M, False: 692k]
  ------------------
  166|   958M|            c=*s++;
  167|   958M|            if(c==cs) {
  ------------------
  |  Branch (167:16): [True: 9.16M, False: 948M]
  ------------------
  168|       |                /* found first substring char16_t, compare rest */
  169|  9.16M|                p=s;
  170|  9.16M|                q=sub;
  171|  41.2M|                for(;;) {
  172|  41.2M|                    if(q==subLimit) {
  ------------------
  |  Branch (172:24): [True: 2.84M, False: 38.4M]
  ------------------
  173|  2.84M|                        if(isMatchAtCPBoundary(start, s-1, p, limit)) {
  ------------------
  |  Branch (173:28): [True: 2.84M, False: 3.67k]
  ------------------
  174|  2.84M|                            return (char16_t *)(s-1); /* well-formed match */
  175|  2.84M|                        } else {
  176|  3.67k|                            break; /* no match because surrogate pair is split */
  177|  3.67k|                        }
  178|  2.84M|                    }
  179|  38.4M|                    if(*p!=*q) {
  ------------------
  |  Branch (179:24): [True: 6.31M, False: 32.0M]
  ------------------
  180|  6.31M|                        break; /* no match */
  181|  6.31M|                    }
  182|  32.0M|                    ++p;
  183|  32.0M|                    ++q;
  184|  32.0M|                }
  185|  9.16M|            }
  186|   958M|        }
  187|  3.53M|    }
  188|       |
  189|       |    /* not found */
  190|   692k|    return nullptr;
  191|  3.81M|}
u_memchr_78:
  241|  23.8M|u_memchr(const char16_t *s, char16_t c, int32_t count) {
  242|  23.8M|    if(count<=0) {
  ------------------
  |  Branch (242:8): [True: 3.42M, False: 20.4M]
  ------------------
  243|  3.42M|        return nullptr; /* no string */
  244|  20.4M|    } else if(U16_IS_SURROGATE(c)) {
  ------------------
  |  |   75|  20.4M|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|  20.4M|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:27): [True: 0, False: 20.4M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  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|  20.4M|    } else {
  248|       |        /* trivial search for a BMP code point */
  249|  20.4M|        const char16_t *limit=s+count;
  250|  1.44G|        do {
  251|  1.44G|            if(*s==c) {
  ------------------
  |  Branch (251:16): [True: 15.0M, False: 1.43G]
  ------------------
  252|  15.0M|                return (char16_t *)s;
  253|  15.0M|            }
  254|  1.44G|        } while(++s!=limit);
  ------------------
  |  Branch (254:17): [True: 1.42G, False: 5.38M]
  ------------------
  255|  5.38M|        return nullptr;
  256|  20.4M|    }
  257|  23.8M|}
u_strcpy_78:
  969|  1.31M|{
  970|  1.31M|    char16_t *anchor = dst;            /* save a pointer to start of dst */
  971|       |
  972|  5.26M|    while((*(dst++) = *(src++)) != 0) {     /* copy string 2 over              */
  ------------------
  |  Branch (972:11): [True: 3.95M, False: 1.31M]
  ------------------
  973|  3.95M|    }
  974|       |
  975|  1.31M|    return anchor;
  976|  1.31M|}
u_strncpy_78:
  982|   155k|{
  983|   155k|    char16_t *anchor = dst;            /* save a pointer to start of dst */
  984|       |
  985|       |    /* copy string 2 over */
  986|   623k|    while(n > 0 && (*(dst++) = *(src++)) != 0) {
  ------------------
  |  Branch (986:11): [True: 467k, False: 155k]
  |  Branch (986:20): [True: 467k, False: 0]
  ------------------
  987|   467k|        --n;
  988|   467k|    }
  989|       |
  990|   155k|    return anchor;
  991|   155k|}
u_strlen_78:
  995|  13.6M|{
  996|       |#if U_SIZEOF_WCHAR_T == U_SIZEOF_UCHAR
  997|       |    return (int32_t)uprv_wcslen((const wchar_t *)s);
  998|       |#else
  999|  13.6M|    const char16_t *t = s;
 1000|   270M|    while(*t != 0) {
  ------------------
  |  Branch (1000:11): [True: 256M, False: 13.6M]
  ------------------
 1001|   256M|      ++t;
 1002|   256M|    }
 1003|  13.6M|    return t - s;
 1004|  13.6M|#endif
 1005|  13.6M|}
u_countChar32_78:
 1008|  1.66M|u_countChar32(const char16_t *s, int32_t length) {
 1009|  1.66M|    int32_t count;
 1010|       |
 1011|  1.66M|    if(s==nullptr || length<-1) {
  ------------------
  |  Branch (1011:8): [True: 0, False: 1.66M]
  |  Branch (1011:22): [True: 0, False: 1.66M]
  ------------------
 1012|      0|        return 0;
 1013|      0|    }
 1014|       |
 1015|  1.66M|    count=0;
 1016|  1.66M|    if(length>=0) {
  ------------------
  |  Branch (1016:8): [True: 1.66M, False: 0]
  ------------------
 1017|  4.70M|        while(length>0) {
  ------------------
  |  Branch (1017:15): [True: 3.03M, False: 1.66M]
  ------------------
 1018|  3.03M|            ++count;
 1019|  3.03M|            if(U16_IS_LEAD(*s) && length>=2 && U16_IS_TRAIL(*(s+1))) {
  ------------------
  |  |   59|  6.07M|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 15.2k, False: 3.02M]
  |  |  ------------------
  ------------------
                          if(U16_IS_LEAD(*s) && length>=2 && U16_IS_TRAIL(*(s+1))) {
  ------------------
  |  |   67|  15.2k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 15.2k, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1019:35): [True: 15.2k, False: 0]
  ------------------
 1020|  15.2k|                s+=2;
 1021|  15.2k|                length-=2;
 1022|  3.02M|            } else {
 1023|  3.02M|                ++s;
 1024|  3.02M|                --length;
 1025|  3.02M|            }
 1026|  3.03M|        }
 1027|  1.66M|    } 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|  1.66M|    return count;
 1046|  1.66M|}
u_memcpy_78:
 1117|  2.97M|u_memcpy(char16_t *dest, const char16_t *src, int32_t count) {
 1118|  2.97M|    if(count > 0) {
  ------------------
  |  Branch (1118:8): [True: 2.97M, False: 0]
  ------------------
 1119|  2.97M|        uprv_memcpy(dest, src, (size_t)count*U_SIZEOF_UCHAR);
  ------------------
  |  |   42|  2.97M|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.97M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  2.97M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  2.97M|    _Pragma("clang diagnostic push") \
  |  |   45|  2.97M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  2.97M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.97M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  2.97M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  2.97M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  2.97M|    _Pragma("clang diagnostic pop") \
  |  |   49|  2.97M|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  2.97M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  2.97M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.97M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1120|  2.97M|    }
 1121|  2.97M|    return dest;
 1122|  2.97M|}
u_memcmp_78:
 1146|  2.70M|u_memcmp(const char16_t *buf1, const char16_t *buf2, int32_t count) {
 1147|  2.70M|    if(count > 0) {
  ------------------
  |  Branch (1147:8): [True: 2.70M, False: 0]
  ------------------
 1148|  2.70M|        const char16_t *limit = buf1 + count;
 1149|  2.70M|        int32_t result;
 1150|       |
 1151|  68.9M|        while (buf1 < limit) {
  ------------------
  |  Branch (1151:16): [True: 66.9M, False: 1.95M]
  ------------------
 1152|  66.9M|            result = (int32_t)(uint16_t)*buf1 - (int32_t)(uint16_t)*buf2;
 1153|  66.9M|            if (result != 0) {
  ------------------
  |  Branch (1153:17): [True: 756k, False: 66.1M]
  ------------------
 1154|   756k|                return result;
 1155|   756k|            }
 1156|  66.1M|            buf1++;
 1157|  66.1M|            buf2++;
 1158|  66.1M|        }
 1159|  2.70M|    }
 1160|  1.95M|    return 0;
 1161|  2.70M|}
u_unescapeAt_78:
 1216|     10|             void *context) {
 1217|       |
 1218|     10|    int32_t start = *offset;
 1219|     10|    UChar32 c;
 1220|     10|    UChar32 result = 0;
 1221|     10|    int8_t n = 0;
 1222|     10|    int8_t minDig = 0;
 1223|     10|    int8_t maxDig = 0;
 1224|     10|    int8_t bitsPerDigit = 4; 
 1225|     10|    int32_t dig;
 1226|     10|    UBool braces = false;
 1227|       |
 1228|       |    /* Check that offset is in range */
 1229|     10|    if (*offset < 0 || *offset >= length) {
  ------------------
  |  Branch (1229:9): [True: 0, False: 10]
  |  Branch (1229:24): [True: 0, False: 10]
  ------------------
 1230|      0|        goto err;
 1231|      0|    }
 1232|       |
 1233|       |    /* Fetch first char16_t after '\\' */
 1234|     10|    c = charAt((*offset)++, context);
 1235|       |
 1236|       |    /* Convert hexadecimal and octal escapes */
 1237|     10|    switch (c) {
 1238|      9|    case u'u':
  ------------------
  |  Branch (1238:5): [True: 9, False: 1]
  ------------------
 1239|      9|        minDig = maxDig = 4;
 1240|      9|        break;
 1241|      0|    case u'U':
  ------------------
  |  Branch (1241:5): [True: 0, False: 10]
  ------------------
 1242|      0|        minDig = maxDig = 8;
 1243|      0|        break;
 1244|      0|    case u'x':
  ------------------
  |  Branch (1244:5): [True: 0, False: 10]
  ------------------
 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|      1|    default:
  ------------------
  |  Branch (1254:5): [True: 1, False: 9]
  ------------------
 1255|      1|        dig = _digit8(c);
 1256|      1|        if (dig >= 0) {
  ------------------
  |  Branch (1256:13): [True: 0, False: 1]
  ------------------
 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|      1|        break;
 1264|     10|    }
 1265|     10|    if (minDig != 0) {
  ------------------
  |  Branch (1265:9): [True: 9, False: 1]
  ------------------
 1266|     45|        while (*offset < length && n < maxDig) {
  ------------------
  |  Branch (1266:16): [True: 45, False: 0]
  |  Branch (1266:36): [True: 36, False: 9]
  ------------------
 1267|     36|            c = charAt(*offset, context);
 1268|     36|            dig = (bitsPerDigit == 3) ? _digit8(c) : _digit16(c);
  ------------------
  |  Branch (1268:19): [True: 0, False: 36]
  ------------------
 1269|     36|            if (dig < 0) {
  ------------------
  |  Branch (1269:17): [True: 0, False: 36]
  ------------------
 1270|      0|                break;
 1271|      0|            }
 1272|     36|            result = (result << bitsPerDigit) | dig;
 1273|     36|            ++(*offset);
 1274|     36|            ++n;
 1275|     36|        }
 1276|      9|        if (n < minDig) {
  ------------------
  |  Branch (1276:13): [True: 0, False: 9]
  ------------------
 1277|      0|            goto err;
 1278|      0|        }
 1279|      9|        if (braces) {
  ------------------
  |  Branch (1279:13): [True: 0, False: 9]
  ------------------
 1280|      0|            if (c != u'}') {
  ------------------
  |  Branch (1280:17): [True: 0, False: 0]
  ------------------
 1281|      0|                goto err;
 1282|      0|            }
 1283|      0|            ++(*offset);
 1284|      0|        }
 1285|      9|        if (result < 0 || result >= 0x110000) {
  ------------------
  |  Branch (1285:13): [True: 0, False: 9]
  |  Branch (1285:27): [True: 0, False: 9]
  ------------------
 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|      9|        if (*offset < length && U16_IS_LEAD(result)) {
  ------------------
  |  |   59|      9|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 9]
  |  |  ------------------
  ------------------
  |  Branch (1292:13): [True: 9, 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|      9|        return result;
 1311|      9|    }
 1312|       |
 1313|       |    /* Convert C-style escapes in table */
 1314|      1|    for (int32_t i=0; i<UNESCAPE_MAP_LENGTH; i+=2) {
  ------------------
  |  Branch (1314:23): [True: 1, False: 0]
  ------------------
 1315|      1|        if (c == UNESCAPE_MAP[i]) {
  ------------------
  |  Branch (1315:13): [True: 0, False: 1]
  ------------------
 1316|      0|            return UNESCAPE_MAP[i+1];
 1317|      1|        } else if (c < UNESCAPE_MAP[i]) {
  ------------------
  |  Branch (1317:20): [True: 1, False: 0]
  ------------------
 1318|      1|            break;
 1319|      1|        }
 1320|      1|    }
 1321|       |
 1322|       |    /* Map \cX to control-X: X & 0x1F */
 1323|      1|    if (c == u'c' && *offset < length) {
  ------------------
  |  Branch (1323:9): [True: 0, False: 1]
  |  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|      1|    if (U16_IS_LEAD(c) && *offset < length) {
  ------------------
  |  |   59|      2|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  |  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|      1|    return c;
 1346|       |
 1347|      0| err:
 1348|       |    /* Invalid escape sequence */
 1349|      0|    *offset = start; /* Reset to initial value */
 1350|      0|    return (UChar32)0xFFFFFFFF;
 1351|      1|}
u_asciiToUpper_78:
 1461|   250k|u_asciiToUpper(char16_t c) {
 1462|   250k|    if (u'a' <= c && c <= u'z') {
  ------------------
  |  Branch (1462:9): [True: 0, False: 250k]
  |  Branch (1462:22): [True: 0, False: 0]
  ------------------
 1463|      0|        c = c + u'A' - u'a';
 1464|      0|    }
 1465|   250k|    return c;
 1466|   250k|}
u_terminateUChars_78:
 1469|   269k|u_terminateUChars(char16_t *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode) {
 1470|   269k|    __TERMINATE_STRING(dest, destCapacity, length, pErrorCode);
  ------------------
  |  | 1437|   269k|#define __TERMINATE_STRING(dest, destCapacity, length, pErrorCode) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   269k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1438|   269k|    if(pErrorCode!=nullptr && U_SUCCESS(*pErrorCode)) {                    \
  |  |  ------------------
  |  |  |  Branch (1438:8): [True: 269k, False: 0]
  |  |  |  Branch (1438:31): [True: 216k, False: 53.4k]
  |  |  ------------------
  |  | 1439|   216k|        /* not a public function, so no complete argument checking */   \
  |  | 1440|   216k|                                                                        \
  |  | 1441|   216k|        if(length<0) {                                                  \
  |  |  ------------------
  |  |  |  Branch (1441:12): [True: 0, False: 216k]
  |  |  ------------------
  |  | 1442|      0|            /* assume that the caller handles this */                   \
  |  | 1443|   216k|        } else if(length<destCapacity) {                                \
  |  |  ------------------
  |  |  |  Branch (1443:19): [True: 216k, False: 0]
  |  |  ------------------
  |  | 1444|   216k|            /* NUL-terminate the string, the NUL fits */                \
  |  | 1445|   216k|            dest[length]=0;                                             \
  |  | 1446|   216k|            /* unset the not-terminated warning but leave all others */ \
  |  | 1447|   216k|            if(*pErrorCode==U_STRING_NOT_TERMINATED_WARNING) {          \
  |  |  ------------------
  |  |  |  Branch (1447:16): [True: 0, False: 216k]
  |  |  ------------------
  |  | 1448|      0|                *pErrorCode=U_ZERO_ERROR;                               \
  |  | 1449|      0|            }                                                           \
  |  | 1450|   216k|        } 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|   216k|    } \
  |  | 1458|   269k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   269k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1471|   269k|    return length;
 1472|   269k|}
u_terminateChars_78:
 1475|   165k|u_terminateChars(char *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode) {
 1476|   165k|    __TERMINATE_STRING(dest, destCapacity, length, pErrorCode);
  ------------------
  |  | 1437|   165k|#define __TERMINATE_STRING(dest, destCapacity, length, pErrorCode) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   165k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1438|   165k|    if(pErrorCode!=nullptr && U_SUCCESS(*pErrorCode)) {                    \
  |  |  ------------------
  |  |  |  Branch (1438:8): [True: 165k, False: 0]
  |  |  |  Branch (1438:31): [True: 165k, False: 0]
  |  |  ------------------
  |  | 1439|   165k|        /* not a public function, so no complete argument checking */   \
  |  | 1440|   165k|                                                                        \
  |  | 1441|   165k|        if(length<0) {                                                  \
  |  |  ------------------
  |  |  |  Branch (1441:12): [True: 0, False: 165k]
  |  |  ------------------
  |  | 1442|      0|            /* assume that the caller handles this */                   \
  |  | 1443|   165k|        } else if(length<destCapacity) {                                \
  |  |  ------------------
  |  |  |  Branch (1443:19): [True: 165k, False: 3]
  |  |  ------------------
  |  | 1444|   165k|            /* NUL-terminate the string, the NUL fits */                \
  |  | 1445|   165k|            dest[length]=0;                                             \
  |  | 1446|   165k|            /* unset the not-terminated warning but leave all others */ \
  |  | 1447|   165k|            if(*pErrorCode==U_STRING_NOT_TERMINATED_WARNING) {          \
  |  |  ------------------
  |  |  |  Branch (1447:16): [True: 0, False: 165k]
  |  |  ------------------
  |  | 1448|      0|                *pErrorCode=U_ZERO_ERROR;                               \
  |  | 1449|      0|            }                                                           \
  |  | 1450|   165k|        } else if(length==destCapacity) {                               \
  |  |  ------------------
  |  |  |  Branch (1450:19): [True: 1, False: 2]
  |  |  ------------------
  |  | 1451|      1|            /* unable to NUL-terminate, but the string itself fit - set a warning code */ \
  |  | 1452|      1|            *pErrorCode=U_STRING_NOT_TERMINATED_WARNING;                \
  |  | 1453|      2|        } else /* length>destCapacity */ {                              \
  |  | 1454|      2|            /* even the string itself did not fit - set an error code */ \
  |  | 1455|      2|            *pErrorCode=U_BUFFER_OVERFLOW_ERROR;                        \
  |  | 1456|      2|        }                                                               \
  |  | 1457|   165k|    } \
  |  | 1458|   165k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   165k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1477|   165k|    return length;
 1478|   165k|}
ustr_hashUCharsN_78:
 1523|  2.10k|ustr_hashUCharsN(const char16_t *str, int32_t length) {
 1524|  2.10k|    STRING_HASH(char16_t, str, length, *p);
  ------------------
  |  | 1506|  2.10k|#define STRING_HASH(TYPE, STR, STRLEN, DEREF) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  2.10k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1507|  2.10k|    uint32_t hash = 0;                        \
  |  | 1508|  2.10k|    const TYPE *p = (const TYPE*) STR;        \
  |  | 1509|  2.10k|    if (p != nullptr) {                          \
  |  |  ------------------
  |  |  |  Branch (1509:9): [True: 2.10k, False: 0]
  |  |  ------------------
  |  | 1510|  2.10k|        int32_t len = (int32_t)(STRLEN);      \
  |  | 1511|  2.10k|        int32_t inc = ((len - 32) / 32) + 1;  \
  |  | 1512|  2.10k|        const TYPE *limit = p + len;          \
  |  | 1513|  8.18k|        while (p<limit) {                     \
  |  |  ------------------
  |  |  |  Branch (1513:16): [True: 6.08k, False: 2.10k]
  |  |  ------------------
  |  | 1514|  6.08k|            hash = (hash * 37) + DEREF;       \
  |  | 1515|  6.08k|            p += inc;                         \
  |  | 1516|  6.08k|        }                                     \
  |  | 1517|  2.10k|    }                                         \
  |  | 1518|  2.10k|    return static_cast<int32_t>(hash);        \
  |  | 1519|  2.10k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  2.10k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1525|  2.10k|}
ustr_hashCharsN_78:
 1528|  6.74M|ustr_hashCharsN(const char *str, int32_t length) {
 1529|  6.74M|    STRING_HASH(uint8_t, str, length, *p);
  ------------------
  |  | 1506|  6.74M|#define STRING_HASH(TYPE, STR, STRLEN, DEREF) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  6.74M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  | 1507|  6.74M|    uint32_t hash = 0;                        \
  |  | 1508|  6.74M|    const TYPE *p = (const TYPE*) STR;        \
  |  | 1509|  6.74M|    if (p != nullptr) {                          \
  |  |  ------------------
  |  |  |  Branch (1509:9): [True: 6.74M, False: 0]
  |  |  ------------------
  |  | 1510|  6.74M|        int32_t len = (int32_t)(STRLEN);      \
  |  | 1511|  6.74M|        int32_t inc = ((len - 32) / 32) + 1;  \
  |  | 1512|  6.74M|        const TYPE *limit = p + len;          \
  |  | 1513|  73.5M|        while (p<limit) {                     \
  |  |  ------------------
  |  |  |  Branch (1513:16): [True: 66.7M, False: 6.74M]
  |  |  ------------------
  |  | 1514|  66.7M|            hash = (hash * 37) + DEREF;       \
  |  | 1515|  66.7M|            p += inc;                         \
  |  | 1516|  66.7M|        }                                     \
  |  | 1517|  6.74M|    }                                         \
  |  | 1518|  6.74M|    return static_cast<int32_t>(hash);        \
  |  | 1519|  6.74M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  6.74M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1530|  6.74M|}
ustring.cpp:_ZL19isMatchAtCPBoundaryPKDsS0_S0_S0_:
   43|  2.84M|isMatchAtCPBoundary(const char16_t *start, const char16_t *match, const char16_t *matchLimit, const char16_t *limit) {
   44|  2.84M|    if(U16_IS_TRAIL(*match) && start!=match && U16_IS_LEAD(*(match-1))) {
  ------------------
  |  |   67|  5.69M|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 41.7k, False: 2.80M]
  |  |  ------------------
  ------------------
                  if(U16_IS_TRAIL(*match) && start!=match && U16_IS_LEAD(*(match-1))) {
  ------------------
  |  |   59|  41.3k|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 308, False: 41.0k]
  |  |  ------------------
  ------------------
  |  Branch (44:32): [True: 41.3k, False: 376]
  ------------------
   45|       |        /* the leading edge of the match is in the middle of a surrogate pair */
   46|    308|        return false;
   47|    308|    }
   48|  2.84M|    if(U16_IS_LEAD(*(matchLimit-1)) && matchLimit!=limit && U16_IS_TRAIL(*matchLimit)) {
  ------------------
  |  |   59|  5.69M|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 18.2k, False: 2.82M]
  |  |  ------------------
  ------------------
                  if(U16_IS_LEAD(*(matchLimit-1)) && matchLimit!=limit && U16_IS_TRAIL(*matchLimit)) {
  ------------------
  |  |   67|  16.5k|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 3.36k, False: 13.2k]
  |  |  ------------------
  ------------------
  |  Branch (48:40): [True: 16.5k, False: 1.63k]
  ------------------
   49|       |        /* the trailing edge of the match is in the middle of a surrogate pair */
   50|  3.36k|        return false;
   51|  3.36k|    }
   52|  2.84M|    return true;
   53|  2.84M|}
ustring.cpp:_ZL7_digit8Ds:
 1188|      1|static int32_t _digit8(char16_t c) {
 1189|      1|    if (c >= u'0' && c <= u'7') {
  ------------------
  |  Branch (1189:9): [True: 0, False: 1]
  |  Branch (1189:22): [True: 0, False: 0]
  ------------------
 1190|      0|        return c - u'0';
 1191|      0|    }
 1192|      1|    return -1;
 1193|      1|}
ustring.cpp:_ZL8_digit16Ds:
 1196|     36|static int32_t _digit16(char16_t c) {
 1197|     36|    if (c >= u'0' && c <= u'9') {
  ------------------
  |  Branch (1197:9): [True: 36, False: 0]
  |  Branch (1197:22): [True: 32, False: 4]
  ------------------
 1198|     32|        return c - u'0';
 1199|     32|    }
 1200|      4|    if (c >= u'A' && c <= u'F') {
  ------------------
  |  Branch (1200:9): [True: 4, False: 0]
  |  Branch (1200:22): [True: 4, False: 0]
  ------------------
 1201|      4|        return c - (u'A' - 10);
 1202|      4|    }
 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_strToUTF8WithSub_78:
  799|      4|            UErrorCode *pErrorCode){
  800|      4|    int32_t reqLength=0;
  801|      4|    uint32_t ch=0,ch2=0;
  802|      4|    uint8_t *pDest = (uint8_t *)dest;
  803|      4|    uint8_t *pDestLimit = (pDest!=nullptr)?(pDest + destCapacity):nullptr;
  ------------------
  |  Branch (803:27): [True: 2, False: 2]
  ------------------
  804|      4|    int32_t numSubstitutions;
  805|       |
  806|       |    /* args check */
  807|      4|    if(U_FAILURE(*pErrorCode)){
  ------------------
  |  Branch (807:8): [True: 0, False: 4]
  ------------------
  808|      0|        return nullptr;
  809|      0|    }
  810|       |        
  811|      4|    if( (pSrc==nullptr && srcLength!=0) || srcLength < -1 ||
  ------------------
  |  Branch (811:10): [True: 0, False: 4]
  |  Branch (811:27): [True: 0, False: 0]
  |  Branch (811:44): [True: 0, False: 4]
  ------------------
  812|      4|        (destCapacity<0) || (dest == nullptr && destCapacity > 0) ||
  ------------------
  |  Branch (812:9): [True: 0, False: 4]
  |  Branch (812:30): [True: 2, False: 2]
  |  Branch (812:49): [True: 0, False: 2]
  ------------------
  813|      4|        subchar > 0x10ffff || U_IS_SURROGATE(subchar)
  ------------------
  |  |  193|      4|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  ------------------
  |  |  |  Branch (193:27): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  |  Branch (813:9): [True: 0, False: 4]
  ------------------
  814|      4|    ) {
  815|      0|        *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
  816|      0|        return nullptr;
  817|      0|    }
  818|       |
  819|      4|    if(pNumSubstitutions!=nullptr) {
  ------------------
  |  Branch (819:8): [True: 0, False: 4]
  ------------------
  820|      0|        *pNumSubstitutions=0;
  821|      0|    }
  822|      4|    numSubstitutions=0;
  823|       |
  824|      4|    if(srcLength==-1) {
  ------------------
  |  Branch (824:8): [True: 0, False: 4]
  ------------------
  825|      0|        while((ch=*pSrc)!=0) {
  ------------------
  |  Branch (825:15): [True: 0, False: 0]
  ------------------
  826|      0|            ++pSrc;
  827|      0|            if(ch <= 0x7f) {
  ------------------
  |  Branch (827:16): [True: 0, False: 0]
  ------------------
  828|      0|                if(pDest<pDestLimit) {
  ------------------
  |  Branch (828:20): [True: 0, False: 0]
  ------------------
  829|      0|                    *pDest++ = (uint8_t)ch;
  830|      0|                } else {
  831|      0|                    reqLength = 1;
  832|      0|                    break;
  833|      0|                }
  834|      0|            } else if(ch <= 0x7ff) {
  ------------------
  |  Branch (834:23): [True: 0, False: 0]
  ------------------
  835|      0|                if((pDestLimit - pDest) >= 2) {
  ------------------
  |  Branch (835:20): [True: 0, False: 0]
  ------------------
  836|      0|                    *pDest++=(uint8_t)((ch>>6)|0xc0);
  837|      0|                    *pDest++=(uint8_t)((ch&0x3f)|0x80);
  838|      0|                } else {
  839|      0|                    reqLength = 2;
  840|      0|                    break;
  841|      0|                }
  842|      0|            } else if(ch <= 0xd7ff || ch >= 0xe000) {
  ------------------
  |  Branch (842:23): [True: 0, False: 0]
  |  Branch (842:39): [True: 0, False: 0]
  ------------------
  843|      0|                if((pDestLimit - pDest) >= 3) {
  ------------------
  |  Branch (843:20): [True: 0, False: 0]
  ------------------
  844|      0|                    *pDest++=(uint8_t)((ch>>12)|0xe0);
  845|      0|                    *pDest++=(uint8_t)(((ch>>6)&0x3f)|0x80);
  846|      0|                    *pDest++=(uint8_t)((ch&0x3f)|0x80);
  847|      0|                } else {
  848|      0|                    reqLength = 3;
  849|      0|                    break;
  850|      0|                }
  851|      0|            } else /* ch is a surrogate */ {
  852|      0|                int32_t length;
  853|       |
  854|       |                /*need not check for NUL because NUL fails U16_IS_TRAIL() anyway*/
  855|      0|                if(U16_IS_SURROGATE_LEAD(ch) && U16_IS_TRAIL(ch2=*pSrc)) { 
  ------------------
  |  |   84|      0|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  ------------------
  |  |  |  Branch (84:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
                              if(U16_IS_SURROGATE_LEAD(ch) && U16_IS_TRAIL(ch2=*pSrc)) { 
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  856|      0|                    ++pSrc;
  857|      0|                    ch=U16_GET_SUPPLEMENTARY(ch, ch2);
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
  858|      0|                } else if(subchar>=0) {
  ------------------
  |  Branch (858:27): [True: 0, False: 0]
  ------------------
  859|      0|                    ch=subchar;
  860|      0|                    ++numSubstitutions;
  861|      0|                } else {
  862|       |                    /* Unicode 3.2 forbids surrogate code points in UTF-8 */
  863|      0|                    *pErrorCode = U_INVALID_CHAR_FOUND;
  864|      0|                    return nullptr;
  865|      0|                }
  866|       |
  867|      0|                length = U8_LENGTH(ch);
  ------------------
  |  |  200|      0|    ((uint32_t)(c)<=0x7f ? 1 : \
  |  |  ------------------
  |  |  |  Branch (200:6): [True: 0, False: 0]
  |  |  ------------------
  |  |  201|      0|        ((uint32_t)(c)<=0x7ff ? 2 : \
  |  |  ------------------
  |  |  |  Branch (201:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  202|      0|            ((uint32_t)(c)<=0xd7ff ? 3 : \
  |  |  ------------------
  |  |  |  Branch (202:14): [True: 0, False: 0]
  |  |  ------------------
  |  |  203|      0|                ((uint32_t)(c)<=0xdfff || (uint32_t)(c)>0x10ffff ? 0 : \
  |  |  ------------------
  |  |  |  Branch (203:18): [True: 0, False: 0]
  |  |  |  Branch (203:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  204|      0|                    ((uint32_t)(c)<=0xffff ? 3 : 4)\
  |  |  ------------------
  |  |  |  Branch (204:22): [True: 0, False: 0]
  |  |  ------------------
  |  |  205|      0|                ) \
  |  |  206|      0|            ) \
  |  |  207|      0|        ) \
  |  |  208|      0|    )
  ------------------
  868|      0|                if((pDestLimit - pDest) >= length) {
  ------------------
  |  Branch (868:20): [True: 0, False: 0]
  ------------------
  869|       |                    /* convert and append*/
  870|      0|                    pDest=_appendUTF8(pDest, ch);
  871|      0|                } else {
  872|      0|                    reqLength = length;
  873|      0|                    break;
  874|      0|                }
  875|      0|            }
  876|      0|        }
  877|      0|        while((ch=*pSrc++)!=0) {
  ------------------
  |  Branch (877:15): [True: 0, False: 0]
  ------------------
  878|      0|            if(ch<=0x7f) {
  ------------------
  |  Branch (878:16): [True: 0, False: 0]
  ------------------
  879|      0|                ++reqLength;
  880|      0|            } else if(ch<=0x7ff) {
  ------------------
  |  Branch (880:23): [True: 0, False: 0]
  ------------------
  881|      0|                reqLength+=2;
  882|      0|            } else if(!U16_IS_SURROGATE(ch)) {
  ------------------
  |  |   75|      0|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|      0|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  ------------------
  ------------------
  |  Branch (882:23): [True: 0, False: 0]
  ------------------
  883|      0|                reqLength+=3;
  884|      0|            } else if(U16_IS_SURROGATE_LEAD(ch) && U16_IS_TRAIL(ch2=*pSrc)) {
  ------------------
  |  |   84|      0|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  ------------------
  |  |  |  Branch (84:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
                          } else if(U16_IS_SURROGATE_LEAD(ch) && U16_IS_TRAIL(ch2=*pSrc)) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  885|      0|                ++pSrc;
  886|      0|                reqLength+=4;
  887|      0|            } else if(subchar>=0) {
  ------------------
  |  Branch (887:23): [True: 0, False: 0]
  ------------------
  888|      0|                reqLength+=U8_LENGTH(subchar);
  ------------------
  |  |  200|      0|    ((uint32_t)(c)<=0x7f ? 1 : \
  |  |  ------------------
  |  |  |  Branch (200:6): [True: 0, False: 0]
  |  |  ------------------
  |  |  201|      0|        ((uint32_t)(c)<=0x7ff ? 2 : \
  |  |  ------------------
  |  |  |  Branch (201:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  202|      0|            ((uint32_t)(c)<=0xd7ff ? 3 : \
  |  |  ------------------
  |  |  |  Branch (202:14): [True: 0, False: 0]
  |  |  ------------------
  |  |  203|      0|                ((uint32_t)(c)<=0xdfff || (uint32_t)(c)>0x10ffff ? 0 : \
  |  |  ------------------
  |  |  |  Branch (203:18): [True: 0, False: 0]
  |  |  |  Branch (203:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  204|      0|                    ((uint32_t)(c)<=0xffff ? 3 : 4)\
  |  |  ------------------
  |  |  |  Branch (204:22): [True: 0, False: 0]
  |  |  ------------------
  |  |  205|      0|                ) \
  |  |  206|      0|            ) \
  |  |  207|      0|        ) \
  |  |  208|      0|    )
  ------------------
  889|      0|                ++numSubstitutions;
  890|      0|            } else {
  891|       |                /* Unicode 3.2 forbids surrogate code points in UTF-8 */
  892|      0|                *pErrorCode = U_INVALID_CHAR_FOUND;
  893|      0|                return nullptr;
  894|      0|            }
  895|      0|        }
  896|      4|    } else {
  897|      4|        const char16_t *pSrcLimit = (pSrc!=nullptr)?(pSrc+srcLength):nullptr;
  ------------------
  |  Branch (897:37): [True: 4, False: 0]
  ------------------
  898|      4|        int32_t count;
  899|       |
  900|       |        /* Faster loop without ongoing checking for pSrcLimit and pDestLimit. */
  901|      4|        for(;;) {
  902|       |            /*
  903|       |             * Each iteration of the inner loop progresses by at most 3 UTF-8
  904|       |             * bytes and one char16_t, for most characters.
  905|       |             * For supplementary code points (4 & 2), which are rare,
  906|       |             * there is an additional adjustment.
  907|       |             */
  908|      4|            count = (int32_t)((pDestLimit - pDest) / 3);
  909|      4|            srcLength = (int32_t)(pSrcLimit - pSrc);
  910|      4|            if(count > srcLength) {
  ------------------
  |  Branch (910:16): [True: 0, False: 4]
  ------------------
  911|      0|                count = srcLength; /* min(remaining dest/3, remaining src) */
  912|      0|            }
  913|      4|            if(count < 3) {
  ------------------
  |  Branch (913:16): [True: 4, False: 0]
  ------------------
  914|       |                /*
  915|       |                 * Too much overhead if we get near the end of the string,
  916|       |                 * continue with the next loop.
  917|       |                 */
  918|      4|                break;
  919|      4|            }
  920|      0|            do {
  921|      0|                ch=*pSrc++;
  922|      0|                if(ch <= 0x7f) {
  ------------------
  |  Branch (922:20): [True: 0, False: 0]
  ------------------
  923|      0|                    *pDest++ = (uint8_t)ch;
  924|      0|                } else if(ch <= 0x7ff) {
  ------------------
  |  Branch (924:27): [True: 0, False: 0]
  ------------------
  925|      0|                    *pDest++=(uint8_t)((ch>>6)|0xc0);
  926|      0|                    *pDest++=(uint8_t)((ch&0x3f)|0x80);
  927|      0|                } else if(ch <= 0xd7ff || ch >= 0xe000) {
  ------------------
  |  Branch (927:27): [True: 0, False: 0]
  |  Branch (927:43): [True: 0, False: 0]
  ------------------
  928|      0|                    *pDest++=(uint8_t)((ch>>12)|0xe0);
  929|      0|                    *pDest++=(uint8_t)(((ch>>6)&0x3f)|0x80);
  930|      0|                    *pDest++=(uint8_t)((ch&0x3f)|0x80);
  931|      0|                } else /* ch is a surrogate */ {
  932|       |                    /*
  933|       |                     * We will read two UChars and probably output four bytes,
  934|       |                     * which we didn't account for with computing count,
  935|       |                     * so we adjust it here.
  936|       |                     */
  937|      0|                    if(--count == 0) {
  ------------------
  |  Branch (937:24): [True: 0, False: 0]
  ------------------
  938|      0|                        --pSrc; /* undo ch=*pSrc++ for the lead surrogate */
  939|      0|                        break;  /* recompute count */
  940|      0|                    }
  941|       |
  942|      0|                    if(U16_IS_SURROGATE_LEAD(ch) && U16_IS_TRAIL(ch2=*pSrc)) { 
  ------------------
  |  |   84|      0|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  ------------------
  |  |  |  Branch (84:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
                                  if(U16_IS_SURROGATE_LEAD(ch) && U16_IS_TRAIL(ch2=*pSrc)) { 
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  943|      0|                        ++pSrc;
  944|      0|                        ch=U16_GET_SUPPLEMENTARY(ch, ch2);
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
  945|       |
  946|       |                        /* writing 4 bytes per 2 UChars is ok */
  947|      0|                        *pDest++=(uint8_t)((ch>>18)|0xf0);
  948|      0|                        *pDest++=(uint8_t)(((ch>>12)&0x3f)|0x80);
  949|      0|                        *pDest++=(uint8_t)(((ch>>6)&0x3f)|0x80);
  950|      0|                        *pDest++=(uint8_t)((ch&0x3f)|0x80);
  951|      0|                    } else  {
  952|       |                        /* Unicode 3.2 forbids surrogate code points in UTF-8 */
  953|      0|                        if(subchar>=0) {
  ------------------
  |  Branch (953:28): [True: 0, False: 0]
  ------------------
  954|      0|                            ch=subchar;
  955|      0|                            ++numSubstitutions;
  956|      0|                        } else {
  957|      0|                            *pErrorCode = U_INVALID_CHAR_FOUND;
  958|      0|                            return nullptr;
  959|      0|                        }
  960|       |
  961|       |                        /* convert and append*/
  962|      0|                        pDest=_appendUTF8(pDest, ch);
  963|      0|                    }
  964|      0|                }
  965|      0|            } while(--count > 0);
  ------------------
  |  Branch (965:21): [True: 0, False: 0]
  ------------------
  966|      0|        }
  967|       |
  968|      8|        while(pSrc<pSrcLimit) {
  ------------------
  |  Branch (968:15): [True: 6, False: 2]
  ------------------
  969|      6|            ch=*pSrc++;
  970|      6|            if(ch <= 0x7f) {
  ------------------
  |  Branch (970:16): [True: 6, False: 0]
  ------------------
  971|      6|                if(pDest<pDestLimit) {
  ------------------
  |  Branch (971:20): [True: 4, False: 2]
  ------------------
  972|      4|                    *pDest++ = (uint8_t)ch;
  973|      4|                } else {
  974|      2|                    reqLength = 1;
  975|      2|                    break;
  976|      2|                }
  977|      6|            } else if(ch <= 0x7ff) {
  ------------------
  |  Branch (977:23): [True: 0, False: 0]
  ------------------
  978|      0|                if((pDestLimit - pDest) >= 2) {
  ------------------
  |  Branch (978:20): [True: 0, False: 0]
  ------------------
  979|      0|                    *pDest++=(uint8_t)((ch>>6)|0xc0);
  980|      0|                    *pDest++=(uint8_t)((ch&0x3f)|0x80);
  981|      0|                } else {
  982|      0|                    reqLength = 2;
  983|      0|                    break;
  984|      0|                }
  985|      0|            } else if(ch <= 0xd7ff || ch >= 0xe000) {
  ------------------
  |  Branch (985:23): [True: 0, False: 0]
  |  Branch (985:39): [True: 0, False: 0]
  ------------------
  986|      0|                if((pDestLimit - pDest) >= 3) {
  ------------------
  |  Branch (986:20): [True: 0, False: 0]
  ------------------
  987|      0|                    *pDest++=(uint8_t)((ch>>12)|0xe0);
  988|      0|                    *pDest++=(uint8_t)(((ch>>6)&0x3f)|0x80);
  989|      0|                    *pDest++=(uint8_t)((ch&0x3f)|0x80);
  990|      0|                } else {
  991|      0|                    reqLength = 3;
  992|      0|                    break;
  993|      0|                }
  994|      0|            } else /* ch is a surrogate */ {
  995|      0|                int32_t length;
  996|       |
  997|      0|                if(U16_IS_SURROGATE_LEAD(ch) && pSrc<pSrcLimit && U16_IS_TRAIL(ch2=*pSrc)) { 
  ------------------
  |  |   84|      0|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  ------------------
  |  |  |  Branch (84:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
                              if(U16_IS_SURROGATE_LEAD(ch) && pSrc<pSrcLimit && U16_IS_TRAIL(ch2=*pSrc)) { 
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (997:49): [True: 0, False: 0]
  ------------------
  998|      0|                    ++pSrc;
  999|      0|                    ch=U16_GET_SUPPLEMENTARY(ch, ch2);
  ------------------
  |  |  113|      0|    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
  |  |  ------------------
  |  |  |  |   99|      0|#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
  |  |  ------------------
  ------------------
 1000|      0|                } else if(subchar>=0) {
  ------------------
  |  Branch (1000:27): [True: 0, False: 0]
  ------------------
 1001|      0|                    ch=subchar;
 1002|      0|                    ++numSubstitutions;
 1003|      0|                } else {
 1004|       |                    /* Unicode 3.2 forbids surrogate code points in UTF-8 */
 1005|      0|                    *pErrorCode = U_INVALID_CHAR_FOUND;
 1006|      0|                    return nullptr;
 1007|      0|                }
 1008|       |
 1009|      0|                length = U8_LENGTH(ch);
  ------------------
  |  |  200|      0|    ((uint32_t)(c)<=0x7f ? 1 : \
  |  |  ------------------
  |  |  |  Branch (200:6): [True: 0, False: 0]
  |  |  ------------------
  |  |  201|      0|        ((uint32_t)(c)<=0x7ff ? 2 : \
  |  |  ------------------
  |  |  |  Branch (201:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  202|      0|            ((uint32_t)(c)<=0xd7ff ? 3 : \
  |  |  ------------------
  |  |  |  Branch (202:14): [True: 0, False: 0]
  |  |  ------------------
  |  |  203|      0|                ((uint32_t)(c)<=0xdfff || (uint32_t)(c)>0x10ffff ? 0 : \
  |  |  ------------------
  |  |  |  Branch (203:18): [True: 0, False: 0]
  |  |  |  Branch (203:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  204|      0|                    ((uint32_t)(c)<=0xffff ? 3 : 4)\
  |  |  ------------------
  |  |  |  Branch (204:22): [True: 0, False: 0]
  |  |  ------------------
  |  |  205|      0|                ) \
  |  |  206|      0|            ) \
  |  |  207|      0|        ) \
  |  |  208|      0|    )
  ------------------
 1010|      0|                if((pDestLimit - pDest) >= length) {
  ------------------
  |  Branch (1010:20): [True: 0, False: 0]
  ------------------
 1011|       |                    /* convert and append*/
 1012|      0|                    pDest=_appendUTF8(pDest, ch);
 1013|      0|                } else {
 1014|      0|                    reqLength = length;
 1015|      0|                    break;
 1016|      0|                }
 1017|      0|            }
 1018|      6|        }
 1019|      6|        while(pSrc<pSrcLimit) {
  ------------------
  |  Branch (1019:15): [True: 2, False: 4]
  ------------------
 1020|      2|            ch=*pSrc++;
 1021|      2|            if(ch<=0x7f) {
  ------------------
  |  Branch (1021:16): [True: 2, False: 0]
  ------------------
 1022|      2|                ++reqLength;
 1023|      2|            } else if(ch<=0x7ff) {
  ------------------
  |  Branch (1023:23): [True: 0, False: 0]
  ------------------
 1024|      0|                reqLength+=2;
 1025|      0|            } else if(!U16_IS_SURROGATE(ch)) {
  ------------------
  |  |   75|      0|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|      0|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  ------------------
  ------------------
  |  Branch (1025:23): [True: 0, False: 0]
  ------------------
 1026|      0|                reqLength+=3;
 1027|      0|            } else if(U16_IS_SURROGATE_LEAD(ch) && pSrc<pSrcLimit && U16_IS_TRAIL(ch2=*pSrc)) {
  ------------------
  |  |   84|      0|#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  ------------------
  |  |  |  Branch (84:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
                          } else if(U16_IS_SURROGATE_LEAD(ch) && pSrc<pSrcLimit && U16_IS_TRAIL(ch2=*pSrc)) {
  ------------------
  |  |   67|      0|#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
  |  |  ------------------
  |  |  |  Branch (67:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1027:52): [True: 0, False: 0]
  ------------------
 1028|      0|                ++pSrc;
 1029|      0|                reqLength+=4;
 1030|      0|            } else if(subchar>=0) {
  ------------------
  |  Branch (1030:23): [True: 0, False: 0]
  ------------------
 1031|      0|                reqLength+=U8_LENGTH(subchar);
  ------------------
  |  |  200|      0|    ((uint32_t)(c)<=0x7f ? 1 : \
  |  |  ------------------
  |  |  |  Branch (200:6): [True: 0, False: 0]
  |  |  ------------------
  |  |  201|      0|        ((uint32_t)(c)<=0x7ff ? 2 : \
  |  |  ------------------
  |  |  |  Branch (201:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  202|      0|            ((uint32_t)(c)<=0xd7ff ? 3 : \
  |  |  ------------------
  |  |  |  Branch (202:14): [True: 0, False: 0]
  |  |  ------------------
  |  |  203|      0|                ((uint32_t)(c)<=0xdfff || (uint32_t)(c)>0x10ffff ? 0 : \
  |  |  ------------------
  |  |  |  Branch (203:18): [True: 0, False: 0]
  |  |  |  Branch (203:43): [True: 0, False: 0]
  |  |  ------------------
  |  |  204|      0|                    ((uint32_t)(c)<=0xffff ? 3 : 4)\
  |  |  ------------------
  |  |  |  Branch (204:22): [True: 0, False: 0]
  |  |  ------------------
  |  |  205|      0|                ) \
  |  |  206|      0|            ) \
  |  |  207|      0|        ) \
  |  |  208|      0|    )
  ------------------
 1032|      0|                ++numSubstitutions;
 1033|      0|            } else {
 1034|       |                /* Unicode 3.2 forbids surrogate code points in UTF-8 */
 1035|      0|                *pErrorCode = U_INVALID_CHAR_FOUND;
 1036|      0|                return nullptr;
 1037|      0|            }
 1038|      2|        }
 1039|      4|    }
 1040|       |
 1041|      4|    reqLength+=(int32_t)(pDest - (uint8_t *)dest);
 1042|       |
 1043|      4|    if(pNumSubstitutions!=nullptr) {
  ------------------
  |  Branch (1043:8): [True: 0, False: 4]
  ------------------
 1044|      0|        *pNumSubstitutions=numSubstitutions;
 1045|      0|    }
 1046|       |
 1047|      4|    if(pDestLength){
  ------------------
  |  Branch (1047:8): [True: 4, False: 0]
  ------------------
 1048|      4|        *pDestLength = reqLength;
 1049|      4|    }
 1050|       |
 1051|       |    /* Terminate the buffer */
 1052|      4|    u_terminateChars(dest, destCapacity, reqLength, pErrorCode);
  ------------------
  |  |  406|      4|#define u_terminateChars U_ICU_ENTRY_POINT_RENAME(u_terminateChars)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1053|      4|    return dest;
 1054|      4|}
u_strToUTF8_78:
 1062|      4|            UErrorCode *pErrorCode){
 1063|      4|    return u_strToUTF8WithSub(
  ------------------
  |  |  380|      4|#define u_strToUTF8WithSub U_ICU_ENTRY_POINT_RENAME(u_strToUTF8WithSub)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1064|      4|            dest, destCapacity, pDestLength,
 1065|      4|            pSrc, srcLength,
 1066|      4|            U_SENTINEL, nullptr,
  ------------------
  |  |  469|      4|#define U_SENTINEL (-1)
  ------------------
 1067|      4|            pErrorCode);
 1068|      4|}

_ZN6icu_7811ICU_Utility21shouldAlwaysBeEscapedEi:
   72|    172|UBool ICU_Utility::shouldAlwaysBeEscaped(UChar32 c) {
   73|    172|    if (c < 0x20) {
  ------------------
  |  Branch (73:9): [True: 2, False: 170]
  ------------------
   74|      2|        return true;  // C0 control codes
   75|    170|    } else if (c <= 0x7e) {
  ------------------
  |  Branch (75:16): [True: 28, False: 142]
  ------------------
   76|     28|        return false;  // printable ASCII
   77|    142|    } else if (c <= 0x9f) {
  ------------------
  |  Branch (77:16): [True: 0, False: 142]
  ------------------
   78|      0|        return true;  // C1 control codes
   79|    142|    } else if (c < 0xd800) {
  ------------------
  |  Branch (79:16): [True: 84, False: 58]
  ------------------
   80|     84|        return false;  // most of the BMP
   81|     84|    } else if (c <= 0xdfff || (0xfdd0 <= c && c <= 0xfdef) || (c & 0xfffe) == 0xfffe) {
  ------------------
  |  Branch (81:16): [True: 0, False: 58]
  |  Branch (81:32): [True: 56, False: 2]
  |  Branch (81:47): [True: 0, False: 56]
  |  Branch (81:63): [True: 0, False: 58]
  ------------------
   82|      0|        return true;  // surrogate or noncharacter code points
   83|     58|    } else if (c <= 0x10ffff) {
  ------------------
  |  Branch (83:16): [True: 58, False: 0]
  ------------------
   84|     58|        return false;  // all else
   85|     58|    } else {
   86|      0|        return true;  // not a code point
   87|      0|    }
   88|    172|}
_ZN6icu_7811ICU_Utility6escapeERNS_13UnicodeStringEi:
   98|      2|UnicodeString &ICU_Utility::escape(UnicodeString& result, UChar32 c) {
   99|      2|    result.append(BACKSLASH);
  100|      2|    if (c & ~0xFFFF) {
  ------------------
  |  Branch (100:9): [True: 0, False: 2]
  ------------------
  101|      0|        result.append(UPPER_U);
  102|      0|        result.append(DIGITS[0xF&(c>>28)]);
  103|      0|        result.append(DIGITS[0xF&(c>>24)]);
  104|      0|        result.append(DIGITS[0xF&(c>>20)]);
  105|      0|        result.append(DIGITS[0xF&(c>>16)]);
  106|      2|    } else {
  107|      2|        result.append(LOWER_U);
  108|      2|    }
  109|      2|    result.append(DIGITS[0xF&(c>>12)]);
  110|      2|    result.append(DIGITS[0xF&(c>>8)]);
  111|      2|    result.append(DIGITS[0xF&(c>>4)]);
  112|      2|    result.append(DIGITS[0xF&c]);
  113|      2|    return result;
  114|      2|}
_ZN6icu_7811ICU_Utility14skipWhitespaceERKNS_13UnicodeStringERia:
  150|     24|                                    UBool advance) {
  151|     24|    int32_t p = pos;
  152|     24|    const char16_t* s = str.getBuffer();
  153|     24|    p = static_cast<int32_t>(PatternProps::skipWhiteSpace(s + p, str.length() - p) - s);
  154|     24|    if (advance) {
  ------------------
  |  Branch (154:9): [True: 19, False: 5]
  ------------------
  155|     19|        pos = p;
  156|     19|    }
  157|     24|    return p;
  158|     24|}

utrie2_enum_78:
  622|      3|            UTrie2EnumValue *enumValue, UTrie2EnumRange *enumRange, const void *context) {
  623|      3|    enumEitherTrie(trie, 0, 0x110000, enumValue, enumRange, context);
  624|      3|}
utrie2.cpp:_ZL14enumEitherTriePK6UTrie2iiPFjPKvjEPFaS3_iijES3_:
  445|      3|               UTrie2EnumValue *enumValue, UTrie2EnumRange *enumRange, const void *context) {
  446|      3|    const uint32_t *data32;
  447|      3|    const uint16_t *idx;
  448|       |
  449|      3|    uint32_t value, prevValue, initialValue;
  450|      3|    UChar32 c, prev, highStart;
  451|      3|    int32_t j, i2Block, prevI2Block, index2NullOffset, block, prevBlock, nullBlock;
  452|       |
  453|      3|    if(enumRange==nullptr) {
  ------------------
  |  Branch (453:8): [True: 0, False: 3]
  ------------------
  454|      0|        return;
  455|      0|    }
  456|      3|    if(enumValue==nullptr) {
  ------------------
  |  Branch (456:8): [True: 3, False: 0]
  ------------------
  457|      3|        enumValue=enumSameValue;
  458|      3|    }
  459|       |
  460|      3|    if(trie->newTrie==nullptr) {
  ------------------
  |  Branch (460:8): [True: 3, False: 0]
  ------------------
  461|       |        /* frozen trie */
  462|      3|        idx=trie->index;
  463|      3|        U_ASSERT(idx!=nullptr); /* the following code assumes trie->newTrie is not nullptr when idx is nullptr */
  ------------------
  |  |   35|      3|#   define U_ASSERT(exp) (void)0
  ------------------
  464|      3|        data32=trie->data32;
  465|       |
  466|      3|        index2NullOffset=trie->index2NullOffset;
  467|      3|        nullBlock=trie->dataNullOffset;
  468|      3|    } 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|      3|    highStart=trie->highStart;
  479|       |
  480|       |    /* get the enumeration value that corresponds to an initial-value trie data entry */
  481|      3|    initialValue=enumValue(context, trie->initialValue);
  482|       |
  483|       |    /* set variables for previous range */
  484|      3|    prevI2Block=-1;
  485|      3|    prevBlock=-1;
  486|      3|    prev=start;
  487|      3|    prevValue=0;
  488|       |
  489|       |    /* enumerate index-2 blocks */
  490|  1.63k|    for(c=start; c<limit && c<highStart;) {
  ------------------
  |  Branch (490:18): [True: 1.63k, False: 3]
  |  Branch (490:29): [True: 1.63k, False: 0]
  ------------------
  491|       |        /* Code point limit for iterating inside this i2Block. */
  492|  1.63k|        UChar32 tempLimit=c+UTRIE2_CP_PER_INDEX_1_ENTRY;
  493|  1.63k|        if(limit<tempLimit) {
  ------------------
  |  Branch (493:12): [True: 0, False: 1.63k]
  ------------------
  494|      0|            tempLimit=limit;
  495|      0|        }
  496|  1.63k|        if(c<=0xffff) {
  ------------------
  |  Branch (496:12): [True: 99, False: 1.53k]
  ------------------
  497|     99|            if(!U_IS_SURROGATE(c)) {
  ------------------
  |  |  193|     99|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  ------------------
  |  Branch (497:16): [True: 93, False: 6]
  ------------------
  498|     93|                i2Block=c>>UTRIE2_SHIFT_2;
  499|     93|            } else if(U_IS_SURROGATE_LEAD(c)) {
  ------------------
  |  |  202|      6|#define U_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
  |  |  ------------------
  |  |  |  Branch (202:32): [True: 3, False: 3]
  |  |  ------------------
  ------------------
  500|       |                /*
  501|       |                 * Enumerate values for lead surrogate code points, not code units:
  502|       |                 * This special block has half the normal length.
  503|       |                 */
  504|      3|                i2Block=UTRIE2_LSCP_INDEX_2_OFFSET;
  505|      3|                tempLimit=MIN_VALUE(0xdc00, limit);
  ------------------
  |  |  421|      3|#define MIN_VALUE(a, b) ((a)<(b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (421:26): [True: 3, False: 0]
  |  |  ------------------
  ------------------
  506|      3|            } 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|      3|                i2Block=0xd800>>UTRIE2_SHIFT_2;
  512|      3|                tempLimit=MIN_VALUE(0xe000, limit);
  ------------------
  |  |  421|      3|#define MIN_VALUE(a, b) ((a)<(b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (421:26): [True: 3, False: 0]
  |  |  ------------------
  ------------------
  513|      3|            }
  514|  1.53k|        } else {
  515|       |            /* supplementary code points */
  516|  1.53k|            if(idx!=nullptr) {
  ------------------
  |  Branch (516:16): [True: 1.53k, False: 0]
  ------------------
  517|  1.53k|                i2Block=idx[(UTRIE2_INDEX_1_OFFSET-UTRIE2_OMITTED_BMP_INDEX_1_LENGTH)+
  518|  1.53k|                              (c>>UTRIE2_SHIFT_1)];
  519|  1.53k|            } else {
  520|      0|                i2Block=trie->newTrie->index1[c>>UTRIE2_SHIFT_1];
  521|      0|            }
  522|  1.53k|            if(i2Block==prevI2Block && (c-prev)>=UTRIE2_CP_PER_INDEX_1_ENTRY) {
  ------------------
  |  Branch (522:16): [True: 1.35k, False: 181]
  |  Branch (522:40): [True: 1.35k, 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|  1.35k|                c+=UTRIE2_CP_PER_INDEX_1_ENTRY;
  529|  1.35k|                continue;
  530|  1.35k|            }
  531|  1.53k|        }
  532|    280|        prevI2Block=i2Block;
  533|    280|        if(i2Block==index2NullOffset) {
  ------------------
  |  Branch (533:12): [True: 39, False: 241]
  ------------------
  534|       |            /* this is the null index-2 block */
  535|     39|            if(prevValue!=initialValue) {
  ------------------
  |  Branch (535:16): [True: 26, False: 13]
  ------------------
  536|     26|                if(prev<c && !enumRange(context, prev, c-1, prevValue)) {
  ------------------
  |  Branch (536:20): [True: 26, False: 0]
  |  Branch (536:30): [True: 0, False: 26]
  ------------------
  537|      0|                    return;
  538|      0|                }
  539|     26|                prevBlock=nullBlock;
  540|     26|                prev=c;
  541|     26|                prevValue=initialValue;
  542|     26|            }
  543|     39|            c+=UTRIE2_CP_PER_INDEX_1_ENTRY;
  544|    241|        } else {
  545|       |            /* enumerate data blocks for one index-2 block */
  546|    241|            int32_t i2, i2Limit;
  547|    241|            i2=(c>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK;
  548|    241|            if((c>>UTRIE2_SHIFT_1)==(tempLimit>>UTRIE2_SHIFT_1)) {
  ------------------
  |  Branch (548:16): [True: 3, False: 238]
  ------------------
  549|      3|                i2Limit=(tempLimit>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK;
  550|    238|            } else {
  551|    238|                i2Limit=UTRIE2_INDEX_2_BLOCK_LENGTH;
  552|    238|            }
  553|  15.4k|            for(; i2<i2Limit; ++i2) {
  ------------------
  |  Branch (553:19): [True: 15.2k, False: 241]
  ------------------
  554|  15.2k|                if(idx!=nullptr) {
  ------------------
  |  Branch (554:20): [True: 15.2k, False: 0]
  ------------------
  555|  15.2k|                    block = static_cast<int32_t>(idx[i2Block + i2]) << UTRIE2_INDEX_SHIFT;
  556|  15.2k|                } else {
  557|      0|                    block=trie->newTrie->index2[i2Block+i2];
  558|      0|                }
  559|  15.2k|                if(block==prevBlock && (c-prev)>=UTRIE2_DATA_BLOCK_LENGTH) {
  ------------------
  |  Branch (559:20): [True: 12.2k, False: 2.99k]
  |  Branch (559:40): [True: 12.2k, False: 18]
  ------------------
  560|       |                    /* the block is the same as the previous one, and filled with prevValue */
  561|  12.2k|                    c+=UTRIE2_DATA_BLOCK_LENGTH;
  562|  12.2k|                    continue;
  563|  12.2k|                }
  564|  3.01k|                prevBlock=block;
  565|  3.01k|                if(block==nullBlock) {
  ------------------
  |  Branch (565:20): [True: 239, False: 2.77k]
  ------------------
  566|       |                    /* this is the null data block */
  567|    239|                    if(prevValue!=initialValue) {
  ------------------
  |  Branch (567:24): [True: 33, False: 206]
  ------------------
  568|     33|                        if(prev<c && !enumRange(context, prev, c-1, prevValue)) {
  ------------------
  |  Branch (568:28): [True: 33, False: 0]
  |  Branch (568:38): [True: 0, False: 33]
  ------------------
  569|      0|                            return;
  570|      0|                        }
  571|     33|                        prev=c;
  572|     33|                        prevValue=initialValue;
  573|     33|                    }
  574|    239|                    c+=UTRIE2_DATA_BLOCK_LENGTH;
  575|  2.77k|                } else {
  576|  91.5k|                    for(j=0; j<UTRIE2_DATA_BLOCK_LENGTH; ++j) {
  ------------------
  |  Branch (576:30): [True: 88.8k, False: 2.77k]
  ------------------
  577|  88.8k|                        value=enumValue(context, data32!=nullptr ? data32[block+j] : idx[block+j]);
  ------------------
  |  Branch (577:50): [True: 0, False: 88.8k]
  ------------------
  578|  88.8k|                        if(value!=prevValue) {
  ------------------
  |  Branch (578:28): [True: 15.0k, False: 73.7k]
  ------------------
  579|  15.0k|                            if(prev<c && !enumRange(context, prev, c-1, prevValue)) {
  ------------------
  |  Branch (579:32): [True: 15.0k, False: 3]
  |  Branch (579:42): [True: 0, False: 15.0k]
  ------------------
  580|      0|                                return;
  581|      0|                            }
  582|  15.0k|                            prev=c;
  583|  15.0k|                            prevValue=value;
  584|  15.0k|                        }
  585|  88.8k|                        ++c;
  586|  88.8k|                    }
  587|  2.77k|                }
  588|  3.01k|            }
  589|    241|        }
  590|    280|    }
  591|       |
  592|      3|    if(c>limit) {
  ------------------
  |  Branch (592:8): [True: 0, False: 3]
  ------------------
  593|      0|        c=limit;  /* could be higher if in the index2NullOffset */
  594|      3|    } else if(c<limit) {
  ------------------
  |  Branch (594:15): [True: 0, False: 3]
  ------------------
  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|      3|    enumRange(context, prev, c-1, prevValue);
  618|      3|}
utrie2.cpp:_ZL13enumSameValuePKvj:
  425|  88.8k|enumSameValue(const void * /*context*/, uint32_t value) {
  426|  88.8k|    return value;
  427|  88.8k|}

_ZN6icu_787UVectorC2EPFvPvEPFa8UElementS4_ER10UErrorCode:
   41|    717|        UVector(d, c, DEFAULT_CAPACITY, status) {
   42|    717|}
_ZN6icu_787UVectorC2EPFvPvEPFa8UElementS4_EiR10UErrorCode:
   45|  1.43k|    deleter(d),
   46|  1.43k|    comparer(c)
   47|  1.43k|{
   48|  1.43k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (48:9): [True: 0, False: 1.43k]
  ------------------
   49|      0|        return;
   50|      0|    }
   51|       |    // Fix bogus initialCapacity values; avoid malloc(0) and integer overflow
   52|  1.43k|    if ((initialCapacity < 1) || (initialCapacity > static_cast<int32_t>(INT32_MAX / sizeof(UElement)))) {
  ------------------
  |  Branch (52:9): [True: 0, False: 1.43k]
  |  Branch (52:34): [True: 0, False: 1.43k]
  ------------------
   53|      0|        initialCapacity = DEFAULT_CAPACITY;
   54|      0|    }
   55|  1.43k|    elements = static_cast<UElement*>(uprv_malloc(sizeof(UElement) * initialCapacity));
  ------------------
  |  | 1524|  1.43k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  1.43k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.43k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.43k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   56|  1.43k|    if (elements == nullptr) {
  ------------------
  |  Branch (56:9): [True: 0, False: 1.43k]
  ------------------
   57|      0|        status = U_MEMORY_ALLOCATION_ERROR;
   58|  1.43k|    } else {
   59|  1.43k|        capacity = initialCapacity;
   60|  1.43k|    }
   61|  1.43k|}
_ZN6icu_787UVectorD2Ev:
   63|  1.43k|UVector::~UVector() {
   64|  1.43k|    removeAllElements();
   65|  1.43k|    uprv_free(elements);
  ------------------
  |  | 1503|  1.43k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  1.43k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  1.43k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  1.43k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   66|  1.43k|    elements = nullptr;
   67|  1.43k|}
_ZN6icu_787UVector10addElementEPvR10UErrorCode:
  102|      1|void UVector::addElement(void* obj, UErrorCode &status) {
  103|      1|    U_ASSERT(deleter == nullptr);
  ------------------
  |  |   35|      1|#   define U_ASSERT(exp) (void)0
  ------------------
  104|      1|    if (ensureCapacity(count + 1, status)) {
  ------------------
  |  Branch (104:9): [True: 1, False: 0]
  ------------------
  105|      1|        elements[count++].pointer = obj;
  106|      1|    }
  107|      1|}
_ZNK6icu_787UVector9elementAtEi:
  185|     10|void* UVector::elementAt(int32_t index) const {
  186|     10|    return (0 <= index && index < count) ? elements[index].pointer : nullptr;
  ------------------
  |  Branch (186:13): [True: 10, False: 0]
  |  Branch (186:27): [True: 10, False: 0]
  ------------------
  187|     10|}
_ZN6icu_787UVector17removeAllElementsEv:
  251|  1.43k|void UVector::removeAllElements() {
  252|  1.43k|    if (deleter != nullptr) {
  ------------------
  |  Branch (252:9): [True: 717, False: 717]
  ------------------
  253|    717|        for (int32_t i=0; i<count; ++i) {
  ------------------
  |  Branch (253:27): [True: 0, False: 717]
  ------------------
  254|      0|            if (elements[i].pointer != nullptr) {
  ------------------
  |  Branch (254:17): [True: 0, False: 0]
  ------------------
  255|      0|                (*deleter)(elements[i].pointer);
  256|      0|            }
  257|      0|        }
  258|    717|    }
  259|  1.43k|    count = 0;
  260|  1.43k|}
_ZNK6icu_787UVector7indexOfEPvi:
  288|      2|int32_t UVector::indexOf(void* obj, int32_t startIndex) const {
  289|      2|    UElement key;
  290|      2|    key.pointer = obj;
  291|      2|    return indexOf(key, startIndex, HINT_KEY_POINTER);
  292|      2|}
_ZNK6icu_787UVector7indexOfE8UElementia:
  300|      2|int32_t UVector::indexOf(UElement key, int32_t startIndex, int8_t hint) const {
  301|      2|    if (comparer != nullptr) {
  ------------------
  |  Branch (301:9): [True: 2, False: 0]
  ------------------
  302|      3|        for (int32_t i=startIndex; i<count; ++i) {
  ------------------
  |  Branch (302:36): [True: 1, False: 2]
  ------------------
  303|      1|            if ((*comparer)(key, elements[i])) {
  ------------------
  |  Branch (303:17): [True: 0, False: 1]
  ------------------
  304|      0|                return i;
  305|      0|            }
  306|      1|        }
  307|      2|    } else {
  308|      0|        for (int32_t i=startIndex; i<count; ++i) {
  ------------------
  |  Branch (308:36): [True: 0, False: 0]
  ------------------
  309|       |            /* Pointers are not always the same size as ints so to perform
  310|       |             * a valid comparison we need to know whether we are being
  311|       |             * provided an int or a pointer. */
  312|      0|            if (hint & HINT_KEY_POINTER) {
  ------------------
  |  Branch (312:17): [True: 0, False: 0]
  ------------------
  313|      0|                if (key.pointer == elements[i].pointer) {
  ------------------
  |  Branch (313:21): [True: 0, False: 0]
  ------------------
  314|      0|                    return i;
  315|      0|                }
  316|      0|            } else {
  317|      0|                if (key.integer == elements[i].integer) {
  ------------------
  |  Branch (317:21): [True: 0, False: 0]
  ------------------
  318|      0|                    return i;
  319|      0|                }
  320|      0|            }
  321|      0|        }
  322|      0|    }
  323|      2|    return -1;
  324|      2|}
_ZN6icu_787UVector14ensureCapacityEiR10UErrorCode:
  326|      3|UBool UVector::ensureCapacity(int32_t minimumCapacity, UErrorCode &status) {
  327|      3|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (327:9): [True: 0, False: 3]
  ------------------
  328|      0|        return false;
  329|      0|    }
  330|      3|    if (minimumCapacity < 0) {
  ------------------
  |  Branch (330:9): [True: 0, False: 3]
  ------------------
  331|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
  332|      0|        return false;
  333|      0|    }
  334|      3|    if (capacity < minimumCapacity) {
  ------------------
  |  Branch (334:9): [True: 1, False: 2]
  ------------------
  335|      1|        if (capacity > (INT32_MAX - 1) / 2) {        	// integer overflow check
  ------------------
  |  Branch (335:13): [True: 0, False: 1]
  ------------------
  336|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  337|      0|            return false;
  338|      0|        }
  339|      1|        int32_t newCap = capacity * 2;
  340|      1|        if (newCap < minimumCapacity) {
  ------------------
  |  Branch (340:13): [True: 0, False: 1]
  ------------------
  341|      0|            newCap = minimumCapacity;
  342|      0|        }
  343|      1|        if (newCap > static_cast<int32_t>(INT32_MAX / sizeof(UElement))) { // integer overflow check
  ------------------
  |  Branch (343:13): [True: 0, False: 1]
  ------------------
  344|       |            // We keep the original memory contents on bad minimumCapacity.
  345|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
  346|      0|            return false;
  347|      0|        }
  348|      1|        UElement* newElems = static_cast<UElement*>(uprv_realloc(elements, sizeof(UElement) * newCap));
  ------------------
  |  | 1536|      1|#define uprv_realloc U_ICU_ENTRY_POINT_RENAME(uprv_realloc)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  349|      1|        if (newElems == nullptr) {
  ------------------
  |  Branch (349:13): [True: 0, False: 1]
  ------------------
  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|      1|        elements = newElems;
  355|      1|        capacity = newCap;
  356|      1|    }
  357|      3|    return true;
  358|      3|}
_ZN6icu_787UVector12sortedInsertEPvPFi8UElementS2_ER10UErrorCode:
  436|      2|void UVector::sortedInsert(void* obj, UElementComparator *compare, UErrorCode& ec) {
  437|      2|    UElement e;
  438|      2|    e.pointer = obj;
  439|      2|    sortedInsert(e, compare, ec);
  440|      2|}
_ZN6icu_787UVector12sortedInsertE8UElementPFiS1_S1_ER10UErrorCode:
  455|      2|void UVector::sortedInsert(UElement e, UElementComparator *compare, UErrorCode& ec) {
  456|       |    // Perform a binary search for the location to insert tok at.  Tok
  457|       |    // will be inserted between two elements a and b such that a <=
  458|       |    // tok && tok < b, where there is a 'virtual' elements[-1] always
  459|       |    // less than tok and a 'virtual' elements[count] always greater
  460|       |    // than tok.
  461|      2|    if (!ensureCapacity(count + 1, ec)) {
  ------------------
  |  Branch (461:9): [True: 0, False: 2]
  ------------------
  462|      0|        if (deleter != nullptr) {
  ------------------
  |  Branch (462:13): [True: 0, False: 0]
  ------------------
  463|      0|            (*deleter)(e.pointer);
  464|      0|        }
  465|      0|        return;
  466|      0|    }
  467|      2|    int32_t min = 0, max = count;
  468|      3|    while (min != max) {
  ------------------
  |  Branch (468:12): [True: 1, False: 2]
  ------------------
  469|      1|        int32_t probe = (min + max) / 2;
  470|      1|        int32_t c = (*compare)(elements[probe], e);
  471|      1|        if (c > 0) {
  ------------------
  |  Branch (471:13): [True: 0, False: 1]
  ------------------
  472|      0|            max = probe;
  473|      1|        } else {
  474|       |            // assert(c <= 0);
  475|      1|            min = probe + 1;
  476|      1|        }
  477|      1|    }
  478|      2|    for (int32_t i=count; i>min; --i) {
  ------------------
  |  Branch (478:27): [True: 0, False: 2]
  ------------------
  479|      0|        elements[i] = elements[i-1];
  480|      0|    }
  481|      2|    elements[min] = e;
  482|      2|    ++count;
  483|      2|}
_ZN6icu_787UVector4sortEPFi8UElementS1_ER10UErrorCode:
  547|    717|void UVector::sort(UElementComparator *compare, UErrorCode &ec) {
  548|    717|    if (U_SUCCESS(ec)) {
  ------------------
  |  Branch (548:9): [True: 717, False: 0]
  ------------------
  549|    717|        uprv_sortArray(elements, count, sizeof(UElement),
  ------------------
  |  | 1538|    717|#define uprv_sortArray U_ICU_ENTRY_POINT_RENAME(uprv_sortArray)
  |  |  ------------------
  |  |  |  |  123|    717|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    717|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    717|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  550|    717|                       sortComparator, &compare, false, &ec);
  551|    717|    }
  552|    717|}

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

_ZN6icu_7812ChoiceFormatC2ERKNS_13UnicodeStringER10UErrorCode:
   79|  9.53k|: constructorErrorCode(status),
   80|  9.53k|  msgPattern(status)
   81|  9.53k|{
   82|  9.53k|    applyPattern(newPattern, status);
   83|  9.53k|}
_ZN6icu_7812ChoiceFormatD2Ev:
  161|  9.53k|{
  162|  9.53k|}
_ZN6icu_7812ChoiceFormat12applyPatternERKNS_13UnicodeStringER10UErrorCode:
  227|  9.53k|{
  228|  9.53k|    msgPattern.parseChoiceStyle(pattern, nullptr, status);
  229|  9.53k|    constructorErrorCode = status;
  230|  9.53k|}
_ZNK6icu_7812ChoiceFormat5parseERKNS_13UnicodeStringERNS_11FormattableERNS_13ParsePositionE:
  501|    450|{
  502|    450|    result.setDouble(parseArgument(msgPattern, 0, text, pos));
  503|    450|}
_ZN6icu_7812ChoiceFormat13parseArgumentERKNS_14MessagePatternEiRKNS_13UnicodeStringERNS_13ParsePositionE:
  508|    450|        const UnicodeString &source, ParsePosition &pos) {
  509|       |    // find the best number (defined as the one with the longest parse)
  510|    450|    int32_t start = pos.getIndex();
  511|    450|    int32_t furthest = start;
  512|    450|    double bestNumber = uprv_getNaN();
  ------------------
  |  | 1509|    450|#define uprv_getNaN U_ICU_ENTRY_POINT_RENAME(uprv_getNaN)
  |  |  ------------------
  |  |  |  |  123|    450|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    450|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    450|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  513|    450|    double tempNumber = 0.0;
  514|    450|    int32_t count = pattern.countParts();
  515|  20.6k|    while (partIndex < count && pattern.getPartType(partIndex) != UMSGPAT_PART_TYPE_ARG_LIMIT) {
  ------------------
  |  Branch (515:12): [True: 20.1k, False: 450]
  |  Branch (515:33): [True: 20.1k, False: 0]
  ------------------
  516|  20.1k|        tempNumber = pattern.getNumericValue(pattern.getPart(partIndex));
  517|  20.1k|        partIndex += 2;  // skip the numeric part and ignore the ARG_SELECTOR
  518|  20.1k|        int32_t msgLimit = pattern.getLimitPartIndex(partIndex);
  519|  20.1k|        int32_t len = matchStringUntilLimitPart(pattern, partIndex, msgLimit, source, start);
  520|  20.1k|        if (len >= 0) {
  ------------------
  |  Branch (520:13): [True: 268, False: 19.9k]
  ------------------
  521|    268|            int32_t newIndex = start + len;
  522|    268|            if (newIndex > furthest) {
  ------------------
  |  Branch (522:17): [True: 11, False: 257]
  ------------------
  523|     11|                furthest = newIndex;
  524|     11|                bestNumber = tempNumber;
  525|     11|                if (furthest == source.length()) {
  ------------------
  |  Branch (525:21): [True: 0, False: 11]
  ------------------
  526|      0|                    break;
  527|      0|                }
  528|     11|            }
  529|    268|        }
  530|  20.1k|        partIndex = msgLimit + 1;
  531|  20.1k|    }
  532|    450|    if (furthest == start) {
  ------------------
  |  Branch (532:9): [True: 439, False: 11]
  ------------------
  533|    439|        pos.setErrorIndex(start);
  534|    439|    } else {
  535|     11|        pos.setIndex(furthest);
  536|     11|    }
  537|    450|    return bestNumber;
  538|    450|}
_ZN6icu_7812ChoiceFormat25matchStringUntilLimitPartERKNS_14MessagePatternEiiRKNS_13UnicodeStringEi:
  543|  20.1k|        const UnicodeString &source, int32_t sourceOffset) {
  544|  20.1k|    int32_t matchingSourceLength = 0;
  545|  20.1k|    const UnicodeString &msgString = pattern.getPatternString();
  546|  20.1k|    int32_t prevIndex = pattern.getPart(partIndex).getLimit();
  547|  24.6k|    for (;;) {
  548|  24.6k|        const MessagePattern::Part &part = pattern.getPart(++partIndex);
  549|  24.6k|        if (partIndex == limitPartIndex || part.getType() == UMSGPAT_PART_TYPE_SKIP_SYNTAX) {
  ------------------
  |  Branch (549:13): [True: 19.6k, False: 4.91k]
  |  Branch (549:44): [True: 499, False: 4.41k]
  ------------------
  550|  20.1k|            int32_t index = part.getIndex();
  551|  20.1k|            int32_t length = index - prevIndex;
  552|  20.1k|            if (length != 0 && 0 != source.compare(sourceOffset, length, msgString, prevIndex, length)) {
  ------------------
  |  Branch (552:17): [True: 19.9k, False: 255]
  |  Branch (552:32): [True: 19.9k, False: 17]
  ------------------
  553|  19.9k|                return -1;  // mismatch
  554|  19.9k|            }
  555|    272|            matchingSourceLength += length;
  556|    272|            if (partIndex == limitPartIndex) {
  ------------------
  |  Branch (556:17): [True: 268, False: 4]
  ------------------
  557|    268|                return matchingSourceLength;
  558|    268|            }
  559|      4|            prevIndex = part.getLimit();  // SKIP_SYNTAX
  560|      4|        }
  561|  24.6k|    }
  562|  20.1k|}

_ZN6icu_7820CompactDecimalFormat14createInstanceERKNS_6LocaleE19UNumberCompactStyleR10UErrorCode:
   24|  19.0k|                                     UErrorCode& status) {
   25|  19.0k|    return new CompactDecimalFormat(inLocale, style, status);
   26|  19.0k|}
_ZN6icu_7820CompactDecimalFormatC2ERKNS_6LocaleE19UNumberCompactStyleR10UErrorCode:
   30|  19.0k|        : DecimalFormat(new DecimalFormatSymbols(inLocale, status), status) {
   31|  19.0k|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (31:9): [True: 0, False: 19.0k]
  ------------------
   32|       |    // Minimal properties: let the non-shim code path do most of the logic for us.
   33|  19.0k|    fields->properties.compactStyle = style;
   34|  19.0k|    fields->properties.groupingSize = -2; // do not forward grouping information
   35|  19.0k|    fields->properties.minimumGroupingDigits = 2;
   36|  19.0k|    touch(status);
   37|  19.0k|}
_ZN6icu_7820CompactDecimalFormatD2Ev:
   41|  19.0k|CompactDecimalFormat::~CompactDecimalFormat() = default;
_ZNK6icu_7820CompactDecimalFormat5parseERKNS_13UnicodeStringERNS_11FormattableER10UErrorCode:
   63|  19.0k|        UErrorCode& status) const {
   64|  19.0k|    status = U_UNSUPPORTED_ERROR;
   65|  19.0k|}

_ZN6icu_7812CurrencyUnitC2ENS_14ConstChar16PtrER10UErrorCode:
   28|  83.6k|CurrencyUnit::CurrencyUnit(ConstChar16Ptr _isoCode, UErrorCode& ec) {
   29|       |    // The constructor always leaves the CurrencyUnit in a valid state (with a 3-character currency code).
   30|       |    // Note: in ICU4J Currency.getInstance(), we check string length for 3, but in ICU4C we allow a
   31|       |    // non-NUL-terminated string to be passed as an argument, so it is not possible to check length.
   32|       |    // However, we allow a NUL-terminated empty string, which should have the same behavior as nullptr.
   33|       |    // Consider NUL-terminated strings of length 1 or 2 as invalid.
   34|  83.6k|    bool useDefault = false;
   35|  83.6k|    if (U_FAILURE(ec) || _isoCode == nullptr || _isoCode[0] == 0) {
  ------------------
  |  Branch (35:9): [True: 0, False: 83.6k]
  |  Branch (35:26): [True: 0, False: 83.6k]
  |  Branch (35:49): [True: 0, False: 83.6k]
  ------------------
   36|      0|        useDefault = true;
   37|  83.6k|    } else if (_isoCode[1] == 0 || _isoCode[2] == 0) {
  ------------------
  |  Branch (37:16): [True: 0, False: 83.6k]
  |  Branch (37:36): [True: 0, False: 83.6k]
  ------------------
   38|      0|        useDefault = true;
   39|      0|        ec = U_ILLEGAL_ARGUMENT_ERROR;
   40|  83.6k|    } else if (!uprv_isInvariantUString(_isoCode, 3)) {
  ------------------
  |  | 1518|  83.6k|#define uprv_isInvariantUString U_ICU_ENTRY_POINT_RENAME(uprv_isInvariantUString)
  |  |  ------------------
  |  |  |  |  123|  83.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  83.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  83.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (40:16): [True: 0, False: 83.6k]
  ------------------
   41|       |        // TODO: Perform a more strict ASCII check like in ICU4J isAlpha3Code?
   42|      0|        useDefault = true;
   43|      0|        ec = U_INVARIANT_CONVERSION_ERROR;
   44|  83.6k|    } else {
   45|   334k|        for (int32_t i=0; i<3; i++) {
  ------------------
  |  Branch (45:27): [True: 250k, False: 83.6k]
  ------------------
   46|   250k|            isoCode[i] = u_asciiToUpper(_isoCode[i]);
  ------------------
  |  |  212|   250k|#define u_asciiToUpper U_ICU_ENTRY_POINT_RENAME(u_asciiToUpper)
  |  |  ------------------
  |  |  |  |  123|   250k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   250k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   250k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   47|   250k|        }
   48|  83.6k|        isoCode[3] = 0;
   49|  83.6k|    }
   50|  83.6k|    if (useDefault) {
  ------------------
  |  Branch (50:9): [True: 0, False: 83.6k]
  ------------------
   51|      0|        uprv_memcpy(isoCode, kDefaultCurrency, sizeof(char16_t) * 4);
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   52|      0|    }
   53|  83.6k|    char simpleIsoCode[4];
   54|  83.6k|    u_UCharsToChars(isoCode, simpleIsoCode, 4);
  ------------------
  |  |  211|  83.6k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|  83.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  83.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  83.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   55|  83.6k|    initCurrency(simpleIsoCode);
   56|  83.6k|}
_ZN6icu_7812CurrencyUnitC2ERKS0_:
   82|   464k|CurrencyUnit::CurrencyUnit(const CurrencyUnit& other) : MeasureUnit(other) {
   83|   464k|    u_strcpy(isoCode, other.isoCode);
  ------------------
  |  |  390|   464k|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|   464k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   464k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   464k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   84|   464k|}
_ZN6icu_7812CurrencyUnitC2Ev:
   99|   474k|CurrencyUnit::CurrencyUnit() : MeasureUnit() {
  100|   474k|    u_strcpy(isoCode, kDefaultCurrency);
  ------------------
  |  |  390|   474k|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|   474k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   474k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   474k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  101|   474k|    char simpleIsoCode[4];
  102|   474k|    u_UCharsToChars(isoCode, simpleIsoCode, 4);
  ------------------
  |  |  211|   474k|#define u_UCharsToChars U_ICU_ENTRY_POINT_RENAME(u_UCharsToChars)
  |  |  ------------------
  |  |  |  |  123|   474k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   474k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   474k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  103|   474k|    initCurrency(simpleIsoCode);
  104|   474k|}
_ZN6icu_7812CurrencyUnitaSERKS0_:
  106|   162k|CurrencyUnit& CurrencyUnit::operator=(const CurrencyUnit& other) {
  107|   162k|    if (this == &other) {
  ------------------
  |  Branch (107:9): [True: 0, False: 162k]
  ------------------
  108|      0|        return *this;
  109|      0|    }
  110|   162k|    MeasureUnit::operator=(other);
  111|   162k|    u_strcpy(isoCode, other.isoCode);
  ------------------
  |  |  390|   162k|#define u_strcpy U_ICU_ENTRY_POINT_RENAME(u_strcpy)
  |  |  ------------------
  |  |  |  |  123|   162k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   162k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   162k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  112|   162k|    return *this;
  113|   162k|}
_ZN6icu_7812CurrencyUnitD2Ev:
  119|  1.02M|CurrencyUnit::~CurrencyUnit() {
  120|  1.02M|}

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

_ZN6icu_7813DecimalFormatC2ERKNS_13UnicodeStringER10UErrorCode:
   62|  9.53k|        : DecimalFormat(nullptr, status) {
   63|  9.53k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (63:9): [True: 0, False: 9.53k]
  ------------------
   64|  9.53k|    setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status);
   65|  9.53k|    touch(status);
   66|  9.53k|}
_ZN6icu_7813DecimalFormatC2ERKNS_13UnicodeStringEPNS_20DecimalFormatSymbolsE18UNumberFormatStyleR10UErrorCode:
   78|  29.3k|        : DecimalFormat(symbolsToAdopt, status) {
   79|  29.3k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (79:9): [True: 0, False: 29.3k]
  ------------------
   80|       |    // If choice is a currency type, ignore the rounding information.
   81|  29.3k|    if (style == UNumberFormatStyle::UNUM_CURRENCY ||
  ------------------
  |  Branch (81:9): [True: 9.53k, False: 19.8k]
  ------------------
   82|  29.3k|        style == UNumberFormatStyle::UNUM_CURRENCY_ISO ||
  ------------------
  |  Branch (82:9): [True: 0, False: 19.8k]
  ------------------
   83|  29.3k|        style == UNumberFormatStyle::UNUM_CURRENCY_ACCOUNTING ||
  ------------------
  |  Branch (83:9): [True: 0, False: 19.8k]
  ------------------
   84|  29.3k|        style == UNumberFormatStyle::UNUM_CASH_CURRENCY ||
  ------------------
  |  Branch (84:9): [True: 0, False: 19.8k]
  ------------------
   85|  29.3k|        style == UNumberFormatStyle::UNUM_CURRENCY_STANDARD ||
  ------------------
  |  Branch (85:9): [True: 0, False: 19.8k]
  ------------------
   86|  29.3k|        style == UNumberFormatStyle::UNUM_CURRENCY_PLURAL) {
  ------------------
  |  Branch (86:9): [True: 0, False: 19.8k]
  ------------------
   87|  9.53k|        setPropertiesFromPattern(pattern, IGNORE_ROUNDING_ALWAYS, status);
   88|  19.8k|    } else {
   89|  19.8k|        setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status);
   90|  19.8k|    }
   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|  29.3k|    if (style == UNumberFormatStyle::UNUM_CURRENCY_PLURAL) {
  ------------------
  |  Branch (93:9): [True: 0, False: 29.3k]
  ------------------
   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|  29.3k|    touch(status);
  101|  29.3k|}
_ZN6icu_7813DecimalFormatC2EPKNS_20DecimalFormatSymbolsER10UErrorCode:
  103|   141k|DecimalFormat::DecimalFormat(const DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status) {
  104|       |    // we must take ownership of symbolsToAdopt, even in a failure case.
  105|   141k|    LocalPointer<const DecimalFormatSymbols> adoptedSymbols(symbolsToAdopt);
  106|   141k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (106:9): [True: 12, False: 141k]
  ------------------
  107|     12|        return;
  108|     12|    }
  109|   141k|    fields = new DecimalFormatFields();
  110|   141k|    if (fields == nullptr) {
  ------------------
  |  Branch (110:9): [True: 0, False: 141k]
  ------------------
  111|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  112|      0|        return;
  113|      0|    }
  114|   141k|    if (adoptedSymbols.isNull()) {
  ------------------
  |  Branch (114:9): [True: 93.5k, False: 48.4k]
  ------------------
  115|  93.5k|        fields->symbols.adoptInsteadAndCheckErrorCode(new DecimalFormatSymbols(status), status);
  116|  93.5k|    } else {
  117|  48.4k|        fields->symbols.adoptInsteadAndCheckErrorCode(adoptedSymbols.orphan(), status);
  118|  48.4k|    }
  119|   141k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (119:9): [True: 0, False: 141k]
  ------------------
  120|      0|        delete fields;
  121|      0|        fields = nullptr;
  122|      0|    }
  123|   141k|}
_ZN6icu_7813DecimalFormatC2ERKNS_13UnicodeStringERKNS_20DecimalFormatSymbolsER10UErrorCode:
  413|  83.9k|        : DecimalFormat(nullptr, status) {
  414|  83.9k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (414:9): [True: 12, False: 83.9k]
  ------------------
  415|  83.9k|    LocalPointer<DecimalFormatSymbols> dfs(new DecimalFormatSymbols(symbols), status);
  416|  83.9k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (416:9): [True: 0, False: 83.9k]
  ------------------
  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|  83.9k|    fields->symbols.adoptInstead(dfs.orphan());
  425|  83.9k|    setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status);
  426|  83.9k|    touch(status);
  427|  83.9k|}
_ZN6icu_7813DecimalFormatC2ERKS0_:
  429|  9.53k|DecimalFormat::DecimalFormat(const DecimalFormat& source) : NumberFormat(source) {
  430|       |    // If the object that we are copying from is invalid, no point in going further.
  431|  9.53k|    if (source.fields == nullptr) {
  ------------------
  |  Branch (431:9): [True: 0, False: 9.53k]
  ------------------
  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|  9.53k|    fields = new DecimalFormatFields(source.fields->properties);
  438|  9.53k|    if (fields == nullptr) {
  ------------------
  |  Branch (438:9): [True: 0, False: 9.53k]
  ------------------
  439|      0|        return; // no way to report an error.
  440|      0|    }
  441|  9.53k|    UErrorCode status = U_ZERO_ERROR;
  442|  9.53k|    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|  9.53k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (446:9): [True: 0, False: 9.53k]
  ------------------
  447|      0|        delete fields;
  448|      0|        fields = nullptr;
  449|      0|        return;
  450|      0|    }
  451|  9.53k|    touch(status);
  452|  9.53k|}
_ZN6icu_7813DecimalFormatD2Ev:
  480|   150k|DecimalFormat::~DecimalFormat() {
  481|   150k|    if (fields == nullptr) { return; }
  ------------------
  |  Branch (481:9): [True: 12, False: 150k]
  ------------------
  482|       |
  483|   150k|    delete fields->atomicParser.exchange(nullptr);
  484|   150k|    delete fields->atomicCurrencyParser.exchange(nullptr);
  485|   150k|    delete fields;
  486|   150k|}
_ZNK6icu_7813DecimalFormat5cloneEv:
  488|  9.53k|DecimalFormat* DecimalFormat::clone() const {
  489|       |    // can only clone valid objects.
  490|  9.53k|    if (fields == nullptr) {
  ------------------
  |  Branch (490:9): [True: 0, False: 9.53k]
  ------------------
  491|      0|        return nullptr;
  492|      0|    }
  493|  9.53k|    LocalPointer<DecimalFormat> df(new DecimalFormat(*this));
  494|  9.53k|    if (df.isValid() && df->fields != nullptr) {
  ------------------
  |  Branch (494:9): [True: 9.53k, False: 0]
  |  Branch (494:25): [True: 9.53k, False: 0]
  ------------------
  495|  9.53k|        return df.orphan();
  496|  9.53k|    }
  497|      0|    return nullptr;
  498|  9.53k|}
_ZNK6icu_7813DecimalFormat5parseERKNS_13UnicodeStringERNS_11FormattableERNS_13ParsePositionE:
  721|  7.44M|                          ParsePosition& parsePosition) const {
  722|  7.44M|    if (fields == nullptr) {
  ------------------
  |  Branch (722:9): [True: 0, False: 7.44M]
  ------------------
  723|      0|        return;
  724|      0|    }
  725|  7.44M|    if (parsePosition.getIndex() < 0 || parsePosition.getIndex() >= text.length()) {
  ------------------
  |  Branch (725:9): [True: 0, False: 7.44M]
  |  Branch (725:41): [True: 2.28k, False: 7.43M]
  ------------------
  726|  2.28k|        if (parsePosition.getIndex() == text.length()) {
  ------------------
  |  Branch (726:13): [True: 2.28k, False: 0]
  ------------------
  727|       |            // If there is nothing to parse, it is an error
  728|  2.28k|            parsePosition.setErrorIndex(parsePosition.getIndex());
  729|  2.28k|        }
  730|  2.28k|        return;
  731|  2.28k|    }
  732|       |
  733|  7.43M|    ErrorCode status;
  734|  7.43M|    ParsedNumber result;
  735|       |    // Note: if this is a currency instance, currencies will be matched despite the fact that we are not in the
  736|       |    // parseCurrency method (backwards compatibility)
  737|  7.43M|    int32_t startIndex = parsePosition.getIndex();
  738|  7.43M|    const NumberParserImpl* parser = getParser(status);
  739|  7.43M|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (739:9): [True: 0, False: 7.43M]
  ------------------
  740|      0|        return; // unfortunately no way to report back the error.
  741|      0|    }
  742|  7.43M|    parser->parse(text, startIndex, true, result, status);
  743|  7.43M|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (743:9): [True: 0, False: 7.43M]
  ------------------
  744|      0|        return; // unfortunately no way to report back the error.
  745|      0|    }
  746|       |    // TODO: Do we need to check for fImpl->properties->parseAllInput (UCONFIG_HAVE_PARSEALLINPUT) here?
  747|  7.43M|    if (result.success()) {
  ------------------
  |  Branch (747:9): [True: 1.87M, False: 5.56M]
  ------------------
  748|  1.87M|        parsePosition.setIndex(result.charEnd);
  749|  1.87M|        result.populateFormattable(output, parser->getParseFlags());
  750|  5.56M|    } else {
  751|  5.56M|        parsePosition.setErrorIndex(startIndex + result.charEnd);
  752|  5.56M|    }
  753|  7.43M|}
_ZNK6icu_7813DecimalFormat23getDecimalFormatSymbolsEv:
  793|   333k|const DecimalFormatSymbols* DecimalFormat::getDecimalFormatSymbols() const {
  794|   333k|    if (fields == nullptr) {
  ------------------
  |  Branch (794:9): [True: 0, False: 333k]
  ------------------
  795|      0|        return nullptr;
  796|      0|    }
  797|   333k|    if (!fields->symbols.isNull()) {
  ------------------
  |  Branch (797:9): [True: 146k, False: 187k]
  ------------------
  798|   146k|        return fields->symbols.getAlias();
  799|   187k|    } else {
  800|   187k|        return fields->formatter.getDecimalFormatSymbols();
  801|   187k|    }
  802|   333k|}
_ZN6icu_7813DecimalFormat5touchER10UErrorCode:
 1603|   151k|void DecimalFormat::touch(UErrorCode& status) {
 1604|   151k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1604:9): [True: 5.12k, False: 146k]
  ------------------
 1605|  5.12k|        return;
 1606|  5.12k|    }
 1607|   146k|    if (fields == nullptr) {
  ------------------
  |  Branch (1607:9): [True: 0, False: 146k]
  ------------------
 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|   146k|    const DecimalFormatSymbols* symbols = getDecimalFormatSymbols();
 1619|   146k|    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|   146k|    fields->formatter = NumberPropertyMapper::create(
 1632|   146k|        fields->properties, *symbols, fields->warehouse, fields->exportedProperties, status
 1633|   146k|    ).locale(locale);
 1634|   146k|    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|   146k|    setupFastFormat();
 1638|       |
 1639|       |    // Delete the parsers if they were made previously
 1640|   146k|    delete fields->atomicParser.exchange(nullptr);
 1641|   146k|    delete fields->atomicCurrencyParser.exchange(nullptr);
 1642|       |
 1643|       |    // In order for the getters to work, we need to populate some fields in NumberFormat.
 1644|   146k|    NumberFormat::setCurrency(fields->exportedProperties.currency.get(status).getISOCurrency(), status);
 1645|   146k|    NumberFormat::setMaximumIntegerDigits(fields->exportedProperties.maximumIntegerDigits);
 1646|   146k|    NumberFormat::setMinimumIntegerDigits(fields->exportedProperties.minimumIntegerDigits);
 1647|   146k|    NumberFormat::setMaximumFractionDigits(fields->exportedProperties.maximumFractionDigits);
 1648|   146k|    NumberFormat::setMinimumFractionDigits(fields->exportedProperties.minimumFractionDigits);
 1649|       |    // fImpl->properties, not fields->exportedProperties, since this information comes from the pattern:
 1650|   146k|    NumberFormat::setGroupingUsed(fields->properties.groupingUsed);
 1651|   146k|}
_ZN6icu_7813DecimalFormat24setPropertiesFromPatternERKNS_13UnicodeStringEiR10UErrorCode:
 1659|   122k|                                             UErrorCode& status) {
 1660|   122k|    if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1660:9): [True: 122k, False: 0]
  ------------------
 1661|       |        // Cast workaround to get around putting the enum in the public header file
 1662|   122k|        auto actualIgnoreRounding = static_cast<IgnoreRounding>(ignoreRounding);
 1663|   122k|        PatternParser::parseToExistingProperties(pattern, fields->properties,  actualIgnoreRounding, status);
 1664|   122k|    }
 1665|   122k|}
_ZNK6icu_7813DecimalFormat9getParserER10UErrorCode:
 1667|  7.43M|const numparse::impl::NumberParserImpl* DecimalFormat::getParser(UErrorCode& status) const {
 1668|       |    // TODO: Move this into umutex.h? (similar logic also in numrange_fluent.cpp)
 1669|       |    // See ICU-20146
 1670|       |
 1671|  7.43M|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1671:9): [True: 0, False: 7.43M]
  ------------------
 1672|      0|        return nullptr;
 1673|      0|    }
 1674|       |
 1675|       |    // First try to get the pre-computed parser
 1676|  7.43M|    auto* ptr = fields->atomicParser.load();
 1677|  7.43M|    if (ptr != nullptr) {
  ------------------
  |  Branch (1677:9): [True: 7.33M, False: 102k]
  ------------------
 1678|  7.33M|        return ptr;
 1679|  7.33M|    }
 1680|       |
 1681|       |    // Try computing the parser on our own
 1682|   102k|    auto* temp = NumberParserImpl::createParserFromProperties(fields->properties, *getDecimalFormatSymbols(), false, status);
 1683|   102k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1683:9): [True: 0, False: 102k]
  ------------------
 1684|      0|        return nullptr;
 1685|      0|    }
 1686|   102k|    if (temp == nullptr) {
  ------------------
  |  Branch (1686:9): [True: 0, False: 102k]
  ------------------
 1687|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1688|      0|        return nullptr;
 1689|      0|    }
 1690|       |
 1691|       |    // Note: ptr starts as nullptr; during compare_exchange,
 1692|       |    // it is set to what is actually stored in the atomic
 1693|       |    // if another thread beat us to computing the parser object.
 1694|   102k|    auto* nonConstThis = const_cast<DecimalFormat*>(this);
 1695|   102k|    if (!nonConstThis->fields->atomicParser.compare_exchange_strong(ptr, temp)) {
  ------------------
  |  Branch (1695:9): [True: 0, False: 102k]
  ------------------
 1696|       |        // Another thread beat us to computing the parser
 1697|      0|        delete temp;
 1698|      0|        return ptr;
 1699|   102k|    } else {
 1700|       |        // Our copy of the parser got stored in the atomic
 1701|   102k|        return temp;
 1702|   102k|    }
 1703|   102k|}
_ZN6icu_7813DecimalFormat15setupFastFormatEv:
 1767|   146k|void DecimalFormat::setupFastFormat() {
 1768|       |    // Check the majority of properties:
 1769|   146k|    if (!fields->properties.equalsDefaultExceptFastFormat()) {
  ------------------
  |  Branch (1769:9): [True: 50.8k, False: 95.5k]
  ------------------
 1770|  50.8k|        trace("no fast format: equality\n");
  ------------------
  |  | 1765|  50.8k|#define trace(x) void(x)
  ------------------
 1771|  50.8k|        fields->canUseFastFormat = false;
 1772|  50.8k|        return;
 1773|  50.8k|    }
 1774|       |
 1775|       |    // Now check the remaining properties.
 1776|       |    // Nontrivial affixes:
 1777|  95.5k|    UBool trivialPP = fields->properties.positivePrefixPattern.isEmpty();
 1778|  95.5k|    UBool trivialPS = fields->properties.positiveSuffixPattern.isEmpty();
 1779|  95.5k|    UBool trivialNP = fields->properties.negativePrefixPattern.isBogus() || (
  ------------------
  |  Branch (1779:23): [True: 94.2k, False: 1.28k]
  ------------------
 1780|  1.28k|            fields->properties.negativePrefixPattern.length() == 1 &&
  ------------------
  |  Branch (1780:13): [True: 169, False: 1.11k]
  ------------------
 1781|  1.28k|            fields->properties.negativePrefixPattern.charAt(0) == u'-');
  ------------------
  |  Branch (1781:13): [True: 34, False: 135]
  ------------------
 1782|  95.5k|    UBool trivialNS = fields->properties.negativeSuffixPattern.isEmpty();
 1783|  95.5k|    if (!trivialPP || !trivialPS || !trivialNP || !trivialNS) {
  ------------------
  |  Branch (1783:9): [True: 7.08k, False: 88.4k]
  |  Branch (1783:23): [True: 12.9k, False: 75.5k]
  |  Branch (1783:37): [True: 143, False: 75.3k]
  |  Branch (1783:51): [True: 0, False: 75.3k]
  ------------------
 1784|  20.1k|        trace("no fast format: affixes\n");
  ------------------
  |  | 1765|  20.1k|#define trace(x) void(x)
  ------------------
 1785|  20.1k|        fields->canUseFastFormat = false;
 1786|  20.1k|        return;
 1787|  20.1k|    }
 1788|       |
 1789|  75.3k|    const DecimalFormatSymbols* symbols = getDecimalFormatSymbols();
 1790|       |    
 1791|       |    // Grouping (secondary grouping is forbidden in equalsDefaultExceptFastFormat):
 1792|  75.3k|    bool groupingUsed = fields->properties.groupingUsed;
 1793|  75.3k|    int32_t groupingSize = fields->properties.groupingSize;
 1794|  75.3k|    bool unusualGroupingSize = groupingSize > 0 && groupingSize != 3;
  ------------------
  |  Branch (1794:32): [True: 9.09k, False: 66.2k]
  |  Branch (1794:52): [True: 10, False: 9.08k]
  ------------------
 1795|  75.3k|    const UnicodeString& groupingString = symbols->getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol);
 1796|  75.3k|    if (groupingUsed && (unusualGroupingSize || groupingString.length() != 1)) {
  ------------------
  |  Branch (1796:9): [True: 9.28k, False: 66.0k]
  |  Branch (1796:26): [True: 10, False: 9.27k]
  |  Branch (1796:49): [True: 0, False: 9.27k]
  ------------------
 1797|     10|        trace("no fast format: grouping\n");
  ------------------
  |  | 1765|     10|#define trace(x) void(x)
  ------------------
 1798|     10|        fields->canUseFastFormat = false;
 1799|     10|        return;
 1800|     10|    }
 1801|       |
 1802|       |    // Integer length:
 1803|  75.3k|    int32_t minInt = fields->exportedProperties.minimumIntegerDigits;
 1804|  75.3k|    int32_t maxInt = fields->exportedProperties.maximumIntegerDigits;
 1805|       |    // Fastpath supports up to only 10 digits (length of INT32_MIN)
 1806|  75.3k|    if (minInt > 10) {
  ------------------
  |  Branch (1806:9): [True: 7, False: 75.3k]
  ------------------
 1807|      7|        trace("no fast format: integer\n");
  ------------------
  |  | 1765|      7|#define trace(x) void(x)
  ------------------
 1808|      7|        fields->canUseFastFormat = false;
 1809|      7|        return;
 1810|      7|    }
 1811|       |
 1812|       |    // Fraction length (no fraction part allowed in fast path):
 1813|  75.3k|    int32_t minFrac = fields->exportedProperties.minimumFractionDigits;
 1814|  75.3k|    if (minFrac > 0) {
  ------------------
  |  Branch (1814:9): [True: 121, False: 75.2k]
  ------------------
 1815|    121|        trace("no fast format: fraction\n");
  ------------------
  |  | 1765|    121|#define trace(x) void(x)
  ------------------
 1816|    121|        fields->canUseFastFormat = false;
 1817|    121|        return;
 1818|    121|    }
 1819|       |
 1820|       |    // Other symbols:
 1821|  75.2k|    const UnicodeString& minusSignString = symbols->getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol);
 1822|  75.2k|    UChar32 codePointZero = symbols->getCodePointZero();
 1823|  75.2k|    if (minusSignString.length() != 1 || U16_LENGTH(codePointZero) != 1) {
  ------------------
  |  |  141|  69.3k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 66.3k, False: 2.99k]
  |  |  ------------------
  ------------------
  |  Branch (1823:9): [True: 5.88k, False: 69.3k]
  |  Branch (1823:42): [True: 2.99k, False: 66.3k]
  ------------------
 1824|  8.87k|        trace("no fast format: symbols\n");
  ------------------
  |  | 1765|  8.87k|#define trace(x) void(x)
  ------------------
 1825|  8.87k|        fields->canUseFastFormat = false;
 1826|  8.87k|        return;
 1827|  8.87k|    }
 1828|       |
 1829|       |    // Good to go!
 1830|  66.3k|    trace("can use fast format!\n");
  ------------------
  |  | 1765|  66.3k|#define trace(x) void(x)
  ------------------
 1831|  66.3k|    fields->canUseFastFormat = true;
 1832|  66.3k|    fields->fastData.cpZero = static_cast<char16_t>(codePointZero);
 1833|  66.3k|    fields->fastData.cpGroupingSeparator = groupingUsed && groupingSize == 3 ? groupingString.charAt(0) : 0;
  ------------------
  |  Branch (1833:44): [True: 8.18k, False: 58.1k]
  |  Branch (1833:60): [True: 7.99k, False: 189]
  ------------------
 1834|  66.3k|    fields->fastData.cpMinusSign = minusSignString.charAt(0);
 1835|  66.3k|    fields->fastData.minInt = (minInt < 0 || minInt > 127) ? 0 : static_cast<int8_t>(minInt);
  ------------------
  |  Branch (1835:32): [True: 0, False: 66.3k]
  |  Branch (1835:46): [True: 0, False: 66.3k]
  ------------------
 1836|  66.3k|    fields->fastData.maxInt = (maxInt < 0 || maxInt > 127) ? 127 : static_cast<int8_t>(maxInt);
  ------------------
  |  Branch (1836:32): [True: 0, False: 66.3k]
  |  Branch (1836:46): [True: 66.3k, False: 0]
  ------------------
 1837|  66.3k|}

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

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

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

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

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

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

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

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

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

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

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

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

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

_ZN6icu_7811Formattable4initEv:
  104|  31.4M|void  Formattable::init() {
  105|  31.4M|    fValue.fInt64 = 0;
  106|  31.4M|    fType = kLong;
  107|  31.4M|    fDecimalStr = nullptr;
  108|  31.4M|    fDecimalQuantity = nullptr;
  109|  31.4M|    fBogus.setToBogus(); 
  110|  31.4M|}
_ZN6icu_7811FormattableC2Ev:
  116|  31.4M|Formattable::Formattable() {
  117|  31.4M|    init();
  118|  31.4M|}
_ZN6icu_7811FormattableaSERKS0_:
  223|   280k|{
  224|   280k|    if (this != &source)
  ------------------
  |  Branch (224:9): [True: 280k, False: 0]
  ------------------
  225|   280k|    {
  226|       |        // Disposes the current formattable value/setting.
  227|   280k|        dispose();
  228|       |
  229|       |        // Sets the correct data type for this value.
  230|   280k|        fType = source.fType;
  231|   280k|        switch (fType)
  ------------------
  |  Branch (231:17): [True: 0, False: 280k]
  ------------------
  232|   280k|        {
  233|      0|        case kArray:
  ------------------
  |  Branch (233:9): [True: 0, False: 280k]
  ------------------
  234|       |            // Sets each element in the array one by one and records the array count.
  235|      0|            fValue.fArrayAndCount.fCount = source.fValue.fArrayAndCount.fCount;
  236|      0|            fValue.fArrayAndCount.fArray = createArrayCopy(source.fValue.fArrayAndCount.fArray,
  237|      0|                                                           source.fValue.fArrayAndCount.fCount);
  238|      0|            break;
  239|      0|        case kString:
  ------------------
  |  Branch (239:9): [True: 0, False: 280k]
  ------------------
  240|       |            // Sets the string value.
  241|      0|            fValue.fString = new UnicodeString(*source.fValue.fString);
  242|      0|            break;
  243|   277k|        case kDouble:
  ------------------
  |  Branch (243:9): [True: 277k, False: 2.48k]
  ------------------
  244|       |            // Sets the double value.
  245|   277k|            fValue.fDouble = source.fValue.fDouble;
  246|   277k|            break;
  247|  2.48k|        case kLong:
  ------------------
  |  Branch (247:9): [True: 2.48k, False: 277k]
  ------------------
  248|  2.48k|        case kInt64:
  ------------------
  |  Branch (248:9): [True: 0, False: 280k]
  ------------------
  249|       |            // Sets the long value.
  250|  2.48k|            fValue.fInt64 = source.fValue.fInt64;
  251|  2.48k|            break;
  252|      0|        case kDate:
  ------------------
  |  Branch (252:9): [True: 0, False: 280k]
  ------------------
  253|       |            // Sets the Date value.
  254|      0|            fValue.fDate = source.fValue.fDate;
  255|      0|            break;
  256|      0|        case kObject:
  ------------------
  |  Branch (256:9): [True: 0, False: 280k]
  ------------------
  257|      0|            fValue.fObject = objectClone(source.fValue.fObject);
  258|      0|            break;
  259|   280k|        }
  260|       |
  261|   280k|        UErrorCode status = U_ZERO_ERROR;
  262|   280k|        if (source.fDecimalQuantity != nullptr) {
  ------------------
  |  Branch (262:13): [True: 0, False: 280k]
  ------------------
  263|      0|          fDecimalQuantity = new DecimalQuantity(*source.fDecimalQuantity);
  264|      0|        }
  265|   280k|        if (source.fDecimalStr != nullptr) {
  ------------------
  |  Branch (265:13): [True: 0, False: 280k]
  ------------------
  266|      0|            fDecimalStr = new CharString(*source.fDecimalStr, status);
  267|      0|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (267:17): [True: 0, False: 0]
  ------------------
  268|      0|                delete fDecimalStr;
  269|      0|                fDecimalStr = nullptr;
  270|      0|            }
  271|      0|        }
  272|   280k|    }
  273|   280k|    return *this;
  274|   280k|}
_ZN6icu_7811FormattableD2Ev:
  333|  31.4M|{
  334|  31.4M|    dispose();
  335|  31.4M|}
_ZN6icu_7811Formattable7disposeEv:
  340|  79.4M|{
  341|       |    // Deletes the data value if necessary.
  342|  79.4M|    switch (fType) {
  343|      0|    case kString:
  ------------------
  |  Branch (343:5): [True: 0, False: 79.4M]
  ------------------
  344|      0|        delete fValue.fString;
  345|      0|        break;
  346|      0|    case kArray:
  ------------------
  |  Branch (346:5): [True: 0, False: 79.4M]
  ------------------
  347|      0|        delete[] fValue.fArrayAndCount.fArray;
  348|      0|        break;
  349|      0|    case kObject:
  ------------------
  |  Branch (349:5): [True: 0, False: 79.4M]
  ------------------
  350|      0|        delete fValue.fObject;
  351|      0|        break;
  352|  79.4M|    default:
  ------------------
  |  Branch (352:5): [True: 79.4M, False: 0]
  ------------------
  353|  79.4M|        break;
  354|  79.4M|    }
  355|       |
  356|  79.4M|    fType = kLong;
  357|  79.4M|    fValue.fInt64 = 0;
  358|       |
  359|  79.4M|    delete fDecimalStr;
  360|  79.4M|    fDecimalStr = nullptr;
  361|       |
  362|  79.4M|    delete fDecimalQuantity;
  363|  79.4M|    fDecimalQuantity = nullptr;
  364|  79.4M|}
_ZNK6icu_7811Formattable7getTypeEv:
  375|  8.19k|{
  376|  8.19k|    return fType;
  377|  8.19k|}
_ZNK6icu_7811Formattable9getDoubleER10UErrorCode:
  495|  3.75M|{
  496|  3.75M|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (496:9): [True: 0, False: 3.75M]
  ------------------
  497|      0|        return 0;
  498|      0|    }
  499|       |        
  500|  3.75M|    switch (fType) {
  501|  1.59M|    case Formattable::kLong: 
  ------------------
  |  Branch (501:5): [True: 1.59M, False: 2.15M]
  ------------------
  502|  1.60M|    case Formattable::kInt64: // loses precision
  ------------------
  |  Branch (502:5): [True: 7.99k, False: 3.74M]
  ------------------
  503|  1.60M|        return static_cast<double>(fValue.fInt64);
  504|  2.14M|    case Formattable::kDouble:
  ------------------
  |  Branch (504:5): [True: 2.14M, False: 1.60M]
  ------------------
  505|  2.14M|        return fValue.fDouble;
  506|      0|    case Formattable::kObject:
  ------------------
  |  Branch (506:5): [True: 0, False: 3.75M]
  ------------------
  507|      0|        if (fValue.fObject == nullptr) {
  ------------------
  |  Branch (507:13): [True: 0, False: 0]
  ------------------
  508|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  509|      0|            return 0;
  510|      0|        }
  511|       |        // TODO Later replace this with instanceof call
  512|      0|        if (instanceOfMeasure(fValue.fObject)) {
  ------------------
  |  Branch (512:13): [True: 0, False: 0]
  ------------------
  513|      0|            return ((const Measure*) fValue.fObject)->
  514|      0|                getNumber().getDouble(status);
  515|      0|        }
  516|      0|        U_FALLTHROUGH;
  ------------------
  |  |  511|      0|#       define U_FALLTHROUGH [[clang::fallthrough]]
  ------------------
  517|      0|    default:
  ------------------
  |  Branch (517:5): [True: 0, False: 3.75M]
  ------------------
  518|      0|        status = U_INVALID_FORMAT_ERROR;
  519|      0|        return 0;
  520|  3.75M|    }
  521|  3.75M|}
_ZN6icu_7811Formattable9setDoubleEd:
  533|  29.4M|{
  534|  29.4M|    dispose();
  535|  29.4M|    fType = kDouble;
  536|  29.4M|    fValue.fDouble = d;
  537|  29.4M|}
_ZN6icu_7811Formattable7setLongEi:
  544|  18.2M|{
  545|  18.2M|    dispose();
  546|  18.2M|    fType = kLong;
  547|  18.2M|    fValue.fInt64 = l;
  548|  18.2M|}
_ZN6icu_7811Formattable20adoptDecimalQuantityEPNS_6number4impl15DecimalQuantityE:
  777|  1.82M|Formattable::adoptDecimalQuantity(DecimalQuantity *dq) {
  778|  1.82M|    delete fDecimalQuantity;
  779|  1.82M|    fDecimalQuantity = dq;
  780|  1.82M|    if (dq == nullptr) { // allow adoptDigitList(nullptr) to clear
  ------------------
  |  Branch (780:9): [True: 0, False: 1.82M]
  ------------------
  781|      0|        return;
  782|      0|    }
  783|       |
  784|       |    // Set the value into the Union of simple type values.
  785|       |    // Cannot use the set() functions because they would delete the fDecimalNum value.
  786|  1.82M|    if (fDecimalQuantity->fitsInLong()) {
  ------------------
  |  Branch (786:9): [True: 1.61M, False: 208k]
  ------------------
  787|  1.61M|        fValue.fInt64 = fDecimalQuantity->toLong();
  788|  1.61M|        if (fValue.fInt64 <= INT32_MAX && fValue.fInt64 >= INT32_MIN) {
  ------------------
  |  Branch (788:13): [True: 1.60M, False: 9.11k]
  |  Branch (788:43): [True: 1.60M, False: 623]
  ------------------
  789|  1.60M|            fType = kLong;
  790|  1.60M|        } else {
  791|  9.73k|            fType = kInt64;
  792|  9.73k|        }
  793|  1.61M|    } else {
  794|   208k|        fType = kDouble;
  795|   208k|        fValue.fDouble = fDecimalQuantity->toDouble();
  796|   208k|    }
  797|  1.82M|}

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

_ZNK6icu_7822FormattedStringBuilder5FieldeqERKS1_:
  259|  72.3k|inline bool FormattedStringBuilder::Field::operator==(const Field& other) const {
  260|  72.3k|    return bits == other.bits;
  261|  72.3k|}
_ZN6icu_7822FormattedStringBuilder5FieldC2Ehh:
  227|   144k|    : bits((
  228|   144k|        U_ASSERT(category <= 0xf),
  ------------------
  |  |   35|   144k|#   define U_ASSERT(exp) (void)0
  ------------------
  229|   144k|        U_ASSERT(field <= 0xf),
  ------------------
  |  |   35|   144k|#   define U_ASSERT(exp) (void)0
  ------------------
  230|   144k|        static_cast<uint8_t>((category << 4) | field)
  231|   144k|    )) {}

_ZN6icu_7811MeasureUnitC2Ev:
 2566|  1.73M|MeasureUnit::MeasureUnit() : MeasureUnit(kBaseTypeIdx, kBaseSubTypeIdx) {
 2567|  1.73M|}
_ZN6icu_7811MeasureUnitC2Eii:
 2570|  1.73M|        : fImpl(nullptr), fSubTypeId(subTypeId), fTypeId(typeId) {
 2571|  1.73M|}
_ZN6icu_7811MeasureUnitC2ERKS0_:
 2574|   464k|        : fImpl(nullptr) {
 2575|   464k|    *this = other;
 2576|   464k|}
_ZN6icu_7811MeasureUnitC2EOS0_:
 2579|   292k|        : fImpl(other.fImpl),
 2580|   292k|        fSubTypeId(other.fSubTypeId),
 2581|   292k|        fTypeId(other.fTypeId) {
 2582|   292k|    other.fImpl = nullptr;
 2583|   292k|}
_ZN6icu_7811MeasureUnitaSERKS0_:
 2592|   641k|MeasureUnit &MeasureUnit::operator=(const MeasureUnit &other) {
 2593|   641k|    if (this == &other) {
  ------------------
  |  Branch (2593:9): [True: 0, False: 641k]
  ------------------
 2594|      0|        return *this;
 2595|      0|    }
 2596|   641k|    delete fImpl;
 2597|   641k|    if (other.fImpl) {
  ------------------
  |  Branch (2597:9): [True: 5.12k, False: 636k]
  ------------------
 2598|  5.12k|        ErrorCode localStatus;
 2599|  5.12k|        fImpl = new MeasureUnitImpl(other.fImpl->copy(localStatus));
 2600|  5.12k|        if (!fImpl || localStatus.isFailure()) {
  ------------------
  |  Branch (2600:13): [True: 0, False: 5.12k]
  |  Branch (2600:23): [True: 0, False: 5.12k]
  ------------------
 2601|       |            // Unrecoverable allocation error; set to the default unit
 2602|      0|            *this = MeasureUnit();
 2603|      0|            return *this;
 2604|      0|        }
 2605|   636k|    } else {
 2606|   636k|        fImpl = nullptr;
 2607|   636k|    }
 2608|   641k|    fTypeId = other.fTypeId;
 2609|   641k|    fSubTypeId = other.fSubTypeId;
 2610|   641k|    return *this;
 2611|   641k|}
_ZN6icu_7811MeasureUnitaSEOS0_:
 2613|   877k|MeasureUnit &MeasureUnit::operator=(MeasureUnit &&other) noexcept {
 2614|   877k|    if (this == &other) {
  ------------------
  |  Branch (2614:9): [True: 0, False: 877k]
  ------------------
 2615|      0|        return *this;
 2616|      0|    }
 2617|   877k|    delete fImpl;
 2618|   877k|    fImpl = other.fImpl;
 2619|   877k|    other.fImpl = nullptr;
 2620|   877k|    fTypeId = other.fTypeId;
 2621|   877k|    fSubTypeId = other.fSubTypeId;
 2622|   877k|    return *this;
 2623|   877k|}
_ZN6icu_7811MeasureUnitD2Ev:
 2629|  2.49M|MeasureUnit::~MeasureUnit() {
 2630|  2.49M|    if (fImpl != nullptr) {
  ------------------
  |  Branch (2630:9): [True: 6.79k, False: 2.48M]
  ------------------
 2631|  6.79k|        delete fImpl;
 2632|  6.79k|        fImpl = nullptr;
 2633|  6.79k|    }
 2634|  2.49M|}
_ZN6icu_7811MeasureUnit12initCurrencyENS_11StringPieceE:
 2768|   558k|void MeasureUnit::initCurrency(StringPiece isoCurrency) {
 2769|   558k|    int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "currency");
  ------------------
  |  |   99|   558k|#define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
  ------------------
 2770|   558k|    U_ASSERT(result != -1);
  ------------------
  |  |   35|   558k|#   define U_ASSERT(exp) (void)0
  ------------------
 2771|   558k|    fTypeId = result;
 2772|   558k|    result = binarySearch(
 2773|   558k|            gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], isoCurrency);
 2774|   558k|    if (result == -1) {
  ------------------
  |  Branch (2774:9): [True: 1.67k, False: 556k]
  ------------------
 2775|  1.67k|        fImpl = new MeasureUnitImpl(MeasureUnitImpl::forCurrencyCode(isoCurrency));
 2776|  1.67k|        if (fImpl) {
  ------------------
  |  Branch (2776:13): [True: 1.67k, False: 0]
  ------------------
 2777|  1.67k|            fSubTypeId = -1;
 2778|  1.67k|            return;
 2779|  1.67k|        }
 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|   556k|    fSubTypeId = result - gOffsets[fTypeId];
 2786|   556k|}
_ZNK6icu_7815MeasureUnitImpl4copyER10UErrorCode:
 2804|  5.12k|MeasureUnitImpl MeasureUnitImpl::copy(UErrorCode &status) const {
 2805|  5.12k|    MeasureUnitImpl result;
 2806|  5.12k|    result.complexity = complexity;
 2807|  5.12k|    result.identifier.append(identifier, status);
 2808|  5.12k|    result.constantDenominator = constantDenominator;
 2809|  5.12k|    for (int32_t i = 0; i < singleUnits.length(); i++) {
  ------------------
  |  Branch (2809:25): [True: 0, False: 5.12k]
  ------------------
 2810|      0|        SingleUnitImpl *item = result.singleUnits.emplaceBack(*singleUnits[i]);
 2811|      0|        if (!item) {
  ------------------
  |  Branch (2811:13): [True: 0, False: 0]
  ------------------
 2812|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 2813|      0|            return result;
 2814|      0|        }
 2815|      0|    }
 2816|  5.12k|    return result;
 2817|  5.12k|}
measunit.cpp:_ZN6icu_78L12binarySearchEPKPKciiNS_11StringPieceE:
 2550|  1.11M|        const char * const * array, int32_t start, int32_t end, StringPiece key) {
 2551|  4.76M|    while (start < end) {
  ------------------
  |  Branch (2551:12): [True: 4.75M, False: 1.67k]
  ------------------
 2552|  4.75M|        int32_t mid = (start + end) / 2;
 2553|  4.75M|        int32_t cmp = StringPiece(array[mid]).compare(key);
 2554|  4.75M|        if (cmp < 0) {
  ------------------
  |  Branch (2554:13): [True: 2.24M, False: 2.51M]
  ------------------
 2555|  2.24M|            start = mid + 1;
 2556|  2.24M|            continue;
 2557|  2.24M|        }
 2558|  2.51M|        if (cmp == 0) {
  ------------------
  |  Branch (2558:13): [True: 1.11M, False: 1.39M]
  ------------------
 2559|  1.11M|            return mid;
 2560|  1.11M|        }
 2561|  1.39M|        end = mid;
 2562|  1.39M|    }
 2563|  1.67k|    return -1;
 2564|  1.11M|}

_ZN6icu_7815MeasureUnitImpl15forCurrencyCodeENS_11StringPieceE:
  261|  1.67k|    static inline MeasureUnitImpl forCurrencyCode(StringPiece currencyCode) {
  262|  1.67k|        MeasureUnitImpl result;
  263|  1.67k|        UErrorCode localStatus = U_ZERO_ERROR;
  264|  1.67k|        result.identifier.append(currencyCode, localStatus);
  265|       |        // localStatus is not expected to fail since currencyCode should be 3 chars long
  266|  1.67k|        return result;
  267|  1.67k|    }
_ZN6icu_7815MeasureUnitImplC2Ev:
  214|  6.79k|    MeasureUnitImpl() = default;

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

_ZN6icu_789NFRuleSetC2EPNS_21RuleBasedNumberFormatEPNS_13UnicodeStringEiR10UErrorCode:
  137|  99.6k|  : name()
  138|  99.6k|  , rules(0)
  139|  99.6k|  , owner(_owner)
  140|  99.6k|  , fractionRules()
  141|  99.6k|  , fIsFractionRuleSet(false)
  142|  99.6k|  , fIsPublic(false)
  143|  99.6k|  , fIsParseable(true)
  144|  99.6k|{
  145|   697k|    for (int32_t i = 0; i < NON_NUMERICAL_RULE_LENGTH; ++i) {
  ------------------
  |  Branch (145:25): [True: 598k, False: 99.6k]
  ------------------
  146|   598k|        nonNumericalRules[i] = nullptr;
  147|   598k|    }
  148|       |
  149|  99.6k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (149:9): [True: 85.9k, False: 13.7k]
  ------------------
  150|  85.9k|        return;
  151|  85.9k|    }
  152|       |
  153|  13.7k|    UnicodeString& description = descriptions[index]; // !!! make sure index is valid
  154|       |
  155|  13.7k|    if (description.isEmpty()) {
  ------------------
  |  Branch (155:9): [True: 52, False: 13.7k]
  ------------------
  156|       |        // throw new IllegalArgumentException("Empty rule set description");
  157|     52|        status = U_PARSE_ERROR;
  158|     52|        return;
  159|     52|    }
  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|  13.7k|    if (description.charAt(0) == gPercent) {
  ------------------
  |  Branch (165:9): [True: 4.61k, False: 9.12k]
  ------------------
  166|  4.61k|        int32_t pos = description.indexOf(gColon);
  167|  4.61k|        if (pos == -1) {
  ------------------
  |  Branch (167:13): [True: 126, False: 4.48k]
  ------------------
  168|       |            // throw new IllegalArgumentException("Rule set name doesn't end in colon");
  169|    126|            status = U_PARSE_ERROR;
  170|  4.48k|        } else {
  171|  4.48k|            name.setTo(description, 0, pos);
  172|  7.22k|            while (pos < description.length() && PatternProps::isWhiteSpace(description.charAt(++pos))) {
  ------------------
  |  Branch (172:20): [True: 7.22k, False: 0]
  |  Branch (172:50): [True: 2.73k, False: 4.48k]
  ------------------
  173|  2.73k|            }
  174|  4.48k|            description.remove(0, pos);
  175|  4.48k|        }
  176|  9.12k|    } else {
  177|  9.12k|        name.setTo(UNICODE_STRING_SIMPLE("%default"));
  ------------------
  |  |  135|  9.12k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  9.12k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  178|  9.12k|    }
  179|       |
  180|  13.7k|    if (description.isEmpty()) {
  ------------------
  |  Branch (180:9): [True: 34, False: 13.7k]
  ------------------
  181|       |        // throw new IllegalArgumentException("Empty rule set description");
  182|     34|        status = U_PARSE_ERROR;
  183|     34|    }
  184|       |
  185|  13.7k|    fIsPublic = name.indexOf(gPercentPercent, 2, 0) != 0;
  186|       |
  187|  13.7k|    if (name.endsWith(gNoparse, 8)) {
  ------------------
  |  Branch (187:9): [True: 0, False: 13.7k]
  ------------------
  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|  13.7k|}
_ZN6icu_789NFRuleSet10parseRulesERNS_13UnicodeStringER10UErrorCode:
  198|  99.6k|{
  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|  99.6k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (204:9): [True: 87.5k, False: 12.1k]
  ------------------
  205|  87.5k|        return;
  206|  87.5k|    }
  207|       |
  208|       |    // ensure we are starting with an empty rule list
  209|  12.1k|    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|  12.1k|    UnicodeString currentDescription;
  215|  12.1k|    int32_t oldP = 0;
  216|   588k|    while (oldP < description.length()) {
  ------------------
  |  Branch (216:12): [True: 576k, False: 12.1k]
  ------------------
  217|   576k|        int32_t p = description.indexOf(gSemicolon, oldP);
  218|   576k|        if (p == -1) {
  ------------------
  |  Branch (218:13): [True: 8.76k, False: 567k]
  ------------------
  219|  8.76k|            p = description.length();
  220|  8.76k|        }
  221|   576k|        currentDescription.setTo(description, oldP, p - oldP);
  222|   576k|        NFRule::makeRules(currentDescription, this, rules.last(), owner, rules, status);
  223|   576k|        oldP = p + 1;
  224|   576k|    }
  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|  12.1k|    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|  12.1k|    int32_t rulesSize = rules.size();
  236|   390k|    for (int32_t i = 0; i < rulesSize; i++) {
  ------------------
  |  Branch (236:25): [True: 378k, False: 12.1k]
  ------------------
  237|   378k|        NFRule* rule = rules[i];
  238|   378k|        int64_t baseValue = rule->getBaseValue();
  239|       |
  240|   378k|        if (baseValue == 0) {
  ------------------
  |  Branch (240:13): [True: 378k, False: 581]
  ------------------
  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|   378k|            rule->setBaseValue(defaultBaseValue, status);
  247|   378k|        }
  248|    581|        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|    581|            if (baseValue < defaultBaseValue) {
  ------------------
  |  Branch (252:17): [True: 23, False: 558]
  ------------------
  253|       |                // throw new IllegalArgumentException("Rules are not in order");
  254|     23|                status = U_PARSE_ERROR;
  255|     23|                return;
  256|     23|            }
  257|    558|            defaultBaseValue = baseValue;
  258|    558|        }
  259|   378k|        if (!fIsFractionRuleSet) {
  ------------------
  |  Branch (259:13): [True: 378k, False: 0]
  ------------------
  260|   378k|            ++defaultBaseValue;
  261|   378k|        }
  262|   378k|    }
  263|  12.1k|}
_ZN6icu_789NFRuleSetD2Ev:
  330|  99.6k|{
  331|   697k|    for (int i = 0; i < NON_NUMERICAL_RULE_LENGTH; i++) {
  ------------------
  |  Branch (331:21): [True: 598k, False: 99.6k]
  ------------------
  332|   598k|        if (i != IMPROPER_FRACTION_RULE_INDEX
  ------------------
  |  Branch (332:13): [True: 498k, False: 99.6k]
  ------------------
  333|   598k|            && i != PROPER_FRACTION_RULE_INDEX
  ------------------
  |  Branch (333:16): [True: 398k, False: 99.6k]
  ------------------
  334|   598k|            && i != DEFAULT_RULE_INDEX)
  ------------------
  |  Branch (334:16): [True: 299k, False: 99.6k]
  ------------------
  335|   299k|        {
  336|   299k|            delete nonNumericalRules[i];
  337|   299k|        }
  338|       |        // else it will be deleted via NFRuleList fractionRules
  339|   598k|    }
  340|  99.6k|}
_ZNK6icu_789NFRuleSet5parseERKNS_13UnicodeStringERNS_13ParsePositionEdjiRNS_11FormattableE:
  693|  6.08M|{
  694|       |    // try matching each rule in the rule set against the text being
  695|       |    // parsed.  Whichever one matches the most characters is the one
  696|       |    // that determines the value we return.
  697|       |
  698|  6.08M|    result.setLong(0);
  699|       |
  700|       |    // dump out if we've reached the recursion limit
  701|  6.08M|    if (recursionCount >= RECURSION_LIMIT) {
  ------------------
  |  |  405|  6.08M|#define RECURSION_LIMIT 64
  ------------------
  |  Branch (701:9): [True: 37.2k, False: 6.04M]
  ------------------
  702|       |        // stop recursion
  703|  37.2k|        return false;
  704|  37.2k|    }
  705|       |
  706|       |    // dump out if there's no text to parse
  707|  6.04M|    if (text.length() == 0) {
  ------------------
  |  Branch (707:9): [True: 14.6k, False: 6.03M]
  ------------------
  708|  14.6k|        return 0;
  709|  14.6k|    }
  710|       |
  711|  6.03M|    ParsePosition highWaterMark;
  712|  6.03M|    ParsePosition workingPos = pos;
  713|       |
  714|       |#ifdef RBNF_DEBUG
  715|       |    fprintf(stderr, "<nfrs> %x '", this);
  716|       |    dumpUS(stderr, name);
  717|       |    fprintf(stderr, "' text '");
  718|       |    dumpUS(stderr, text);
  719|       |    fprintf(stderr, "'\n");
  720|       |    fprintf(stderr, "  parse negative: %d\n", this, negativeNumberRule != 0);
  721|       |#endif
  722|       |    // Try each of the negative rules, fraction rules, infinity rules and NaN rules
  723|  42.2M|    for (int i = 0; i < NON_NUMERICAL_RULE_LENGTH; i++) {
  ------------------
  |  Branch (723:21): [True: 36.2M, False: 6.03M]
  ------------------
  724|  36.2M|        if (nonNumericalRules[i] && ((nonNumericalExecutedRuleMask >> i) & 1) == 0) {
  ------------------
  |  Branch (724:13): [True: 0, False: 36.2M]
  |  Branch (724:37): [True: 0, False: 0]
  ------------------
  725|       |            // Mark this rule as being executed so that we don't try to execute it again.
  726|      0|            nonNumericalExecutedRuleMask |= 1 << i;
  727|       |
  728|      0|            Formattable tempResult;
  729|      0|            UBool success = nonNumericalRules[i]->doParse(text, workingPos, 0, upperBound, nonNumericalExecutedRuleMask, recursionCount + 1, tempResult);
  730|      0|            if (success && (workingPos.getIndex() > highWaterMark.getIndex())) {
  ------------------
  |  Branch (730:17): [True: 0, False: 0]
  |  Branch (730:28): [True: 0, False: 0]
  ------------------
  731|      0|                result = tempResult;
  732|      0|                highWaterMark = workingPos;
  733|      0|            }
  734|      0|            workingPos = pos;
  735|      0|        }
  736|  36.2M|    }
  737|       |#ifdef RBNF_DEBUG
  738|       |    fprintf(stderr, "<nfrs> continue other with text '");
  739|       |    dumpUS(stderr, text);
  740|       |    fprintf(stderr, "' hwm: %d\n", highWaterMark.getIndex());
  741|       |#endif
  742|       |
  743|       |    // finally, go through the regular rules one at a time.  We start
  744|       |    // at the end of the list because we want to try matching the most
  745|       |    // sigificant rule first (this helps ensure that we parse
  746|       |    // "five thousand three hundred six" as
  747|       |    // "(five thousand) (three hundred) (six)" rather than
  748|       |    // "((five thousand three) hundred) (six)").  Skip rules whose
  749|       |    // base values are higher than the upper bound (again, this helps
  750|       |    // limit ambiguity by making sure the rules that match a rule's
  751|       |    // are less significant than the rule containing the substitutions)/
  752|  6.03M|    {
  753|  6.03M|        int64_t ub = util64_fromDouble(upperBound);
  754|       |#ifdef RBNF_DEBUG
  755|       |        {
  756|       |            char ubstr[64];
  757|       |            util64_toa(ub, ubstr, 64);
  758|       |            char ubstrhex[64];
  759|       |            util64_toa(ub, ubstrhex, 64, 16);
  760|       |            fprintf(stderr, "ub: %g, i64: %s (%s)\n", upperBound, ubstr, ubstrhex);
  761|       |        }
  762|       |#endif
  763|  1.07G|        for (int32_t i = rules.size(); --i >= 0 && highWaterMark.getIndex() < text.length();) {
  ------------------
  |  Branch (763:40): [True: 1.07G, False: 6.03M]
  |  Branch (763:52): [True: 1.07G, False: 0]
  ------------------
  764|  1.07G|            if ((!fIsFractionRuleSet) && (rules[i]->getBaseValue() >= ub)) {
  ------------------
  |  Branch (764:17): [True: 1.07G, False: 0]
  |  Branch (764:42): [True: 1.06G, False: 7.14M]
  ------------------
  765|  1.06G|                continue;
  766|  1.06G|            }
  767|  7.14M|            Formattable tempResult;
  768|  7.14M|            UBool success = rules[i]->doParse(text, workingPos, fIsFractionRuleSet, upperBound, nonNumericalExecutedRuleMask, recursionCount + 1, tempResult);
  769|  7.14M|            if (success && workingPos.getIndex() > highWaterMark.getIndex()) {
  ------------------
  |  Branch (769:17): [True: 7.14M, False: 0]
  |  Branch (769:28): [True: 266k, False: 6.87M]
  ------------------
  770|   266k|                result = tempResult;
  771|   266k|                highWaterMark = workingPos;
  772|   266k|            }
  773|  7.14M|            workingPos = pos;
  774|  7.14M|        }
  775|  6.03M|    }
  776|       |#ifdef RBNF_DEBUG
  777|       |    fprintf(stderr, "<nfrs> exit\n");
  778|       |#endif
  779|       |    // finally, update the parse position we were passed to point to the
  780|       |    // first character we didn't use, and return the result that
  781|       |    // corresponds to that string of characters
  782|  6.03M|    pos = highWaterMark;
  783|       |
  784|  6.03M|    return 1;
  785|  6.04M|}
_ZN6icu_7817util64_fromDoubleEd:
  829|  6.03M|int64_t util64_fromDouble(double d) {
  830|  6.03M|    int64_t result = 0;
  831|  6.03M|    if (!uprv_isNaN(d)) {
  ------------------
  |  | 1519|  6.03M|#define uprv_isNaN U_ICU_ENTRY_POINT_RENAME(uprv_isNaN)
  |  |  ------------------
  |  |  |  |  123|  6.03M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.03M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.03M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (831:9): [True: 6.03M, False: 0]
  ------------------
  832|  6.03M|        double mant = uprv_maxMantissa();
  ------------------
  |  | 1527|  6.03M|#define uprv_maxMantissa U_ICU_ENTRY_POINT_RENAME(uprv_maxMantissa)
  |  |  ------------------
  |  |  |  |  123|  6.03M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.03M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.03M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  833|  6.03M|        if (d < -mant) {
  ------------------
  |  Branch (833:13): [True: 0, False: 6.03M]
  ------------------
  834|      0|            d = -mant;
  835|  6.03M|        } else if (d > mant) {
  ------------------
  |  Branch (835:20): [True: 0, False: 6.03M]
  ------------------
  836|      0|            d = mant;
  837|      0|        }
  838|  6.03M|        UBool neg = d < 0; 
  839|  6.03M|        if (neg) {
  ------------------
  |  Branch (839:13): [True: 0, False: 6.03M]
  ------------------
  840|      0|            d = -d;
  841|      0|        }
  842|  6.03M|        result = static_cast<int64_t>(uprv_floor(d));
  ------------------
  |  | 1499|  6.03M|#define uprv_floor U_ICU_ENTRY_POINT_RENAME(uprv_floor)
  |  |  ------------------
  |  |  |  |  123|  6.03M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  6.03M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  6.03M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  843|  6.03M|        if (neg) {
  ------------------
  |  Branch (843:13): [True: 0, False: 6.03M]
  ------------------
  844|      0|            result = -result;
  845|      0|        }
  846|  6.03M|    }
  847|  6.03M|    return result;
  848|  6.03M|}
_ZN6icu_7810util64_powEjt:
  850|   612k|uint64_t util64_pow(uint32_t base, uint16_t exponent)  {
  851|   612k|    if (base == 0) {
  ------------------
  |  Branch (851:9): [True: 0, False: 612k]
  ------------------
  852|      0|        return 0;
  853|      0|    }
  854|   612k|    uint64_t result = 1;
  855|   612k|    uint64_t pow = base;
  856|  1.24M|    while (true) {
  ------------------
  |  Branch (856:12): [Folded - Ignored]
  ------------------
  857|  1.24M|        if ((exponent & 1) == 1) {
  ------------------
  |  Branch (857:13): [True: 672k, False: 568k]
  ------------------
  858|   672k|            result *= pow;
  859|   672k|        }
  860|  1.24M|        exponent >>= 1;
  861|  1.24M|        if (exponent == 0) {
  ------------------
  |  Branch (861:13): [True: 612k, False: 629k]
  ------------------
  862|   612k|            break;
  863|   612k|        }
  864|   629k|        pow *= pow;
  865|   629k|    }
  866|   612k|    return result;
  867|   612k|}

_ZNK6icu_789NFRuleSet8isPublicEv:
   46|   107k|    UBool isPublic() const { return fIsPublic; }
_ZNK6icu_789NFRuleSet7isNamedERKNS_13UnicodeStringE:
   53|   299k|    UBool isNamed(const UnicodeString& _name) const { return this->name == _name; }
_ZNK6icu_789NFRuleSet11isParseableEv:
   48|  9.28k|    UBool isParseable() const { return fIsParseable; }
_ZNK6icu_789NFRuleSet17isFractionRuleSetEv:
   50|   123k|    UBool isFractionRuleSet() const { return fIsFractionRuleSet; }
_ZNK6icu_789NFRuleSet8getOwnerEv:
   64|  84.0k|    const RuleBasedNumberFormat *getOwner() const { return owner; }

_ZN6icu_786NFRuleC2EPKNS_21RuleBasedNumberFormatERKNS_13UnicodeStringER10UErrorCode:
   38|   399k|  : baseValue(static_cast<int32_t>(0))
   39|   399k|  , radix(10)
   40|   399k|  , exponent(0)
   41|   399k|  , decimalPoint(0)
   42|   399k|  , fRuleText(_ruleText)
   43|   399k|  , sub1(nullptr)
   44|   399k|  , sub2(nullptr)
   45|   399k|  , formatter(_rbnf)
   46|   399k|  , rulePatternFormat(nullptr)
   47|   399k|{
   48|   399k|    if (!fRuleText.isEmpty()) {
  ------------------
  |  Branch (48:9): [True: 398k, False: 1.40k]
  ------------------
   49|   398k|        parseRuleDescriptor(fRuleText, status);
   50|   398k|    }
   51|   399k|}
_ZN6icu_786NFRuleD2Ev:
   54|   399k|{
   55|   399k|    if (sub1 != sub2) {
  ------------------
  |  Branch (55:9): [True: 100k, False: 298k]
  ------------------
   56|   100k|        delete sub2;
   57|   100k|        sub2 = nullptr;
   58|   100k|    }
   59|   399k|    delete sub1;
   60|   399k|    sub1 = nullptr;
   61|   399k|    delete rulePatternFormat;
   62|   399k|    rulePatternFormat = nullptr;
   63|   399k|}
_ZN6icu_786NFRule9makeRulesERNS_13UnicodeStringEPNS_9NFRuleSetEPKS0_PKNS_21RuleBasedNumberFormatERNS_10NFRuleListER10UErrorCode:
  115|   576k|{
  116|   576k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (116:9): [True: 195k, False: 380k]
  ------------------
  117|   195k|        return;
  118|   195k|    }
  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|   380k|    LocalPointer<NFRule> rule1(new NFRule(rbnf, description, status));
  124|   380k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (124:9): [True: 219, False: 380k]
  ------------------
  125|    219|        return;
  126|    219|    }
  127|       |    /* test for nullptr */
  128|   380k|    if (rule1.isNull()) {
  ------------------
  |  Branch (128:9): [True: 0, False: 380k]
  ------------------
  129|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  130|      0|        return;
  131|      0|    }
  132|   380k|    description = rule1->fRuleText;
  133|       |
  134|       |    // check the description to see whether there's text enclosed
  135|       |    // in brackets
  136|   380k|    int32_t brack1 = description.indexOf(gLeftBracket);
  137|   380k|    int32_t brack2 = brack1 < 0 ? -1 : description.indexOf(gRightBracket);
  ------------------
  |  Branch (137:22): [True: 377k, False: 2.67k]
  ------------------
  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|   380k|    if (brack2 < 0 || brack1 > brack2
  ------------------
  |  Branch (143:9): [True: 378k, False: 1.46k]
  |  Branch (143:23): [True: 154, False: 1.31k]
  ------------------
  144|   380k|        || rule1->getType() == kProperFractionRule
  ------------------
  |  Branch (144:12): [True: 0, False: 1.31k]
  ------------------
  145|   380k|        || rule1->getType() == kNegativeNumberRule
  ------------------
  |  Branch (145:12): [True: 0, False: 1.31k]
  ------------------
  146|   380k|        || rule1->getType() == kInfinityRule
  ------------------
  |  Branch (146:12): [True: 0, False: 1.31k]
  ------------------
  147|   380k|        || rule1->getType() == kNaNRule)
  ------------------
  |  Branch (147:12): [True: 0, False: 1.31k]
  ------------------
  148|   378k|    {
  149|   378k|        rule1->extractSubstitutions(owner, description, predecessor, status);
  150|   378k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (150:13): [True: 648, False: 378k]
  ------------------
  151|    648|            return;
  152|    648|        }
  153|   378k|    }
  154|  1.31k|    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|  1.31k|        LocalPointer<NFRule> rule2;
  158|  1.31k|        UnicodeString sbuf;
  159|  1.31k|        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|  1.31k|        if ((rule1->baseValue > 0
  ------------------
  |  Branch (164:14): [True: 74, False: 1.23k]
  ------------------
  165|  1.31k|            && (rule1->radix != 0) // ICU-23109 Ensure next line won't "% 0"
  ------------------
  |  Branch (165:16): [True: 74, False: 0]
  ------------------
  166|  1.31k|            && (rule1->baseValue % util64_pow(rule1->radix, rule1->exponent)) == 0)
  ------------------
  |  Branch (166:16): [True: 42, False: 32]
  ------------------
  167|  1.31k|            || rule1->getType() == kImproperFractionRule
  ------------------
  |  Branch (167:16): [True: 0, False: 1.26k]
  ------------------
  168|  1.31k|            || rule1->getType() == kDefaultRule) {
  ------------------
  |  Branch (168:16): [True: 0, False: 1.26k]
  ------------------
  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|     42|            rule2.adoptInstead(new NFRule(rbnf, UnicodeString(), status));
  176|     42|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (176:17): [True: 0, False: 42]
  ------------------
  177|      0|                return;
  178|      0|            }
  179|       |            /* test for nullptr */
  180|     42|            if (rule2.isNull()) {
  ------------------
  |  Branch (180:17): [True: 0, False: 42]
  ------------------
  181|      0|                status = U_MEMORY_ALLOCATION_ERROR;
  182|      0|                return;
  183|      0|            }
  184|     42|            if (rule1->baseValue >= 0) {
  ------------------
  |  Branch (184:17): [True: 42, False: 0]
  ------------------
  185|     42|                rule2->baseValue = rule1->baseValue;
  186|     42|                if (!owner->isFractionRuleSet()) {
  ------------------
  |  Branch (186:21): [True: 42, False: 0]
  ------------------
  187|     42|                    ++rule1->baseValue;
  188|     42|                }
  189|     42|            }
  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|     42|            rule2->radix = rule1->radix;
  209|     42|            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|     42|            sbuf.append(description, 0, brack1);
  215|     42|            if (orElseOp >= 0) {
  ------------------
  |  Branch (215:17): [True: 37, False: 5]
  ------------------
  216|     37|                sbuf.append(description, orElseOp + 1, brack2 - orElseOp - 1);
  217|     37|            }
  218|     42|            if (brack2 + 1 < description.length()) {
  ------------------
  |  Branch (218:17): [True: 35, False: 7]
  ------------------
  219|     35|                sbuf.append(description, brack2 + 1, description.length() - brack2 - 1);
  220|     35|            }
  221|     42|            rule2->extractSubstitutions(owner, sbuf, predecessor, status);
  222|     42|            if (U_FAILURE(status)) {
  ------------------
  |  Branch (222:17): [True: 19, False: 23]
  ------------------
  223|     19|                return;
  224|     19|            }
  225|     42|        }
  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|  1.29k|        sbuf.setTo(description, 0, brack1);
  231|  1.29k|        if (orElseOp >= 0) {
  ------------------
  |  Branch (231:13): [True: 500, False: 791]
  ------------------
  232|    500|            sbuf.append(description, brack1 + 1, orElseOp - brack1 - 1);
  233|    500|        }
  234|    791|        else {
  235|    791|            sbuf.append(description, brack1 + 1, brack2 - brack1 - 1);
  236|    791|        }
  237|  1.29k|        if (brack2 + 1 < description.length()) {
  ------------------
  |  Branch (237:13): [True: 675, False: 616]
  ------------------
  238|    675|            sbuf.append(description, brack2 + 1, description.length() - brack2 - 1);
  239|    675|        }
  240|  1.29k|        rule1->extractSubstitutions(owner, sbuf, predecessor, status);
  241|  1.29k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (241:13): [True: 28, False: 1.26k]
  ------------------
  242|     28|            return;
  243|     28|        }
  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|  1.26k|        if (!rule2.isNull()) {
  ------------------
  |  Branch (250:13): [True: 21, False: 1.24k]
  ------------------
  251|     21|            if (rule2->baseValue >= kNoBase) {
  ------------------
  |  Branch (251:17): [True: 21, False: 0]
  ------------------
  252|     21|                rules.add(rule2.orphan());
  253|     21|            }
  254|      0|            else {
  255|      0|                owner->setNonNumericalRule(rule2.orphan());
  256|      0|            }
  257|     21|        }
  258|  1.26k|    }
  259|   379k|    if (rule1->baseValue >= kNoBase) {
  ------------------
  |  Branch (259:9): [True: 379k, False: 0]
  ------------------
  260|   379k|        rules.add(rule1.orphan());
  261|   379k|    }
  262|      0|    else {
  263|      0|        owner->setNonNumericalRule(rule1.orphan());
  264|      0|    }
  265|   379k|}
_ZN6icu_786NFRule19parseRuleDescriptorERNS_13UnicodeStringER10UErrorCode:
  281|   398k|{
  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|   398k|    int32_t p = description.indexOf(gColon);
  286|   398k|    if (p != -1) {
  ------------------
  |  Branch (286:9): [True: 57.5k, False: 340k]
  ------------------
  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|  57.5k|        UnicodeString descriptor;
  291|  57.5k|        descriptor.setTo(description, 0, p);
  292|       |
  293|  57.5k|        ++p;
  294|  81.1k|        while (p < description.length() && PatternProps::isWhiteSpace(description.charAt(p))) {
  ------------------
  |  Branch (294:16): [True: 69.4k, False: 11.7k]
  |  Branch (294:44): [True: 23.5k, False: 45.8k]
  ------------------
  295|  23.5k|            ++p;
  296|  23.5k|        }
  297|  57.5k|        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|  57.5k|        int descriptorLength = descriptor.length();
  303|  57.5k|        char16_t firstChar = descriptor.charAt(0);
  304|  57.5k|        char16_t lastChar = descriptor.charAt(descriptorLength - 1);
  305|  57.5k|        if (firstChar >= gZero && firstChar <= gNine && lastChar != gX) {
  ------------------
  |  Branch (305:13): [True: 50.5k, False: 7.04k]
  |  Branch (305:35): [True: 1.23k, False: 49.2k]
  |  Branch (305:57): [True: 1.23k, False: 1]
  ------------------
  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|  1.23k|            int64_t val = 0;
  311|  1.23k|            p = 0;
  312|  1.23k|            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|  9.52k|            while (p < descriptorLength) {
  ------------------
  |  Branch (318:20): [True: 8.69k, False: 827]
  ------------------
  319|  8.69k|                c = descriptor.charAt(p);
  320|  8.69k|                if (c >= gZero && c <= gNine) {
  ------------------
  |  Branch (320:21): [True: 8.07k, False: 618]
  |  Branch (320:35): [True: 7.69k, False: 378]
  ------------------
  321|  7.69k|                    int64_t digit = static_cast<int64_t>(c - gZero);
  322|  7.69k|                    if ((val > 0 && val > (INT64_MAX - digit) / 10) ||
  ------------------
  |  Branch (322:26): [True: 5.49k, False: 2.19k]
  |  Branch (322:37): [True: 21, False: 5.47k]
  ------------------
  323|  7.69k|                        (val < 0 && val < (INT64_MIN - digit) / 10)) {
  ------------------
  |  Branch (323:26): [True: 0, False: 7.67k]
  |  Branch (323:37): [True: 0, False: 0]
  ------------------
  324|       |                        // out of int64_t range
  325|     21|                        status = U_PARSE_ERROR;
  326|     21|                        return;
  327|     21|                    }
  328|  7.67k|                    val = val * 10 + digit;
  329|  7.67k|                }
  330|    996|                else if (c == gSlash || c == gGreaterThan) {
  ------------------
  |  Branch (330:26): [True: 257, False: 739]
  |  Branch (330:41): [True: 45, False: 694]
  ------------------
  331|    302|                    break;
  332|    302|                }
  333|    694|                else if (PatternProps::isWhiteSpace(c) || c == gComma || c == gDot) {
  ------------------
  |  Branch (333:26): [True: 432, False: 262]
  |  Branch (333:59): [True: 114, False: 148]
  |  Branch (333:74): [True: 68, False: 80]
  ------------------
  334|    614|                }
  335|     80|                else {
  336|       |                    // throw new IllegalArgumentException("Illegal character in rule descriptor");
  337|     80|                    status = U_PARSE_ERROR;
  338|     80|                    return;
  339|     80|                }
  340|  8.29k|                ++p;
  341|  8.29k|            }
  342|       |
  343|       |            // we have the base value, so set it
  344|  1.12k|            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|  1.12k|            if (c == gSlash) {
  ------------------
  |  Branch (350:17): [True: 257, False: 872]
  ------------------
  351|    257|                val = 0;
  352|    257|                ++p;
  353|  1.97k|                while (p < descriptorLength) {
  ------------------
  |  Branch (353:24): [True: 1.80k, False: 171]
  ------------------
  354|  1.80k|                    c = descriptor.charAt(p);
  355|  1.80k|                    if (c >= gZero && c <= gNine) {
  ------------------
  |  Branch (355:25): [True: 1.62k, False: 182]
  |  Branch (355:39): [True: 1.49k, False: 127]
  ------------------
  356|  1.49k|                        int64_t digit = static_cast<int64_t>(c - gZero);
  357|  1.49k|                        if ((val > 0 && val > (INT64_MAX - digit) / 10) ||
  ------------------
  |  Branch (357:30): [True: 1.05k, False: 444]
  |  Branch (357:41): [True: 13, False: 1.04k]
  ------------------
  358|  1.49k|                            (val < 0 && val < (INT64_MIN - digit) / 10)) {
  ------------------
  |  Branch (358:30): [True: 0, False: 1.48k]
  |  Branch (358:41): [True: 0, False: 0]
  ------------------
  359|       |                            // out of int64_t range
  360|     13|                            status = U_PARSE_ERROR;
  361|     13|                            return;
  362|     13|                        }
  363|  1.48k|                        val = val * 10 + digit;
  364|  1.48k|                    }
  365|    309|                    else if (c == gGreaterThan) {
  ------------------
  |  Branch (365:30): [True: 6, False: 303]
  ------------------
  366|      6|                        break;
  367|      6|                    }
  368|    303|                    else if (PatternProps::isWhiteSpace(c) || c == gComma || c == gDot) {
  ------------------
  |  Branch (368:30): [True: 96, False: 207]
  |  Branch (368:63): [True: 101, False: 106]
  |  Branch (368:78): [True: 39, False: 67]
  ------------------
  369|    236|                    }
  370|     67|                    else {
  371|       |                        // throw new IllegalArgumentException("Illegal character is rule descriptor");
  372|     67|                        status = U_PARSE_ERROR;
  373|     67|                        return;
  374|     67|                    }
  375|  1.72k|                    ++p;
  376|  1.72k|                }
  377|       |
  378|       |                // tempValue now contain's the rule's radix.  Set it
  379|       |                // accordingly, and recalculate the rule's exponent
  380|    177|                radix = static_cast<int32_t>(val);
  381|    177|                if (radix == 0) {
  ------------------
  |  Branch (381:21): [True: 2, False: 175]
  ------------------
  382|       |                    // throw new IllegalArgumentException("Rule can't have radix of 0");
  383|      2|                    status = U_PARSE_ERROR;
  384|      2|                }
  385|       |
  386|    177|                exponent = expectedExponent();
  387|    177|            }
  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|  1.04k|            if (c == gGreaterThan) {
  ------------------
  |  Branch (394:17): [True: 51, False: 998]
  ------------------
  395|    111|                while (p < descriptor.length()) {
  ------------------
  |  Branch (395:24): [True: 96, False: 15]
  ------------------
  396|     96|                    c = descriptor.charAt(p);
  397|     96|                    if (c == gGreaterThan && exponent > 0) {
  ------------------
  |  Branch (397:25): [True: 70, False: 26]
  |  Branch (397:46): [True: 60, False: 10]
  ------------------
  398|     60|                        --exponent;
  399|     60|                    } else {
  400|       |                        // throw new IllegalArgumentException("Illegal character in rule descriptor");
  401|     36|                        status = U_PARSE_ERROR;
  402|     36|                        return;
  403|     36|                    }
  404|     60|                    ++p;
  405|     60|                }
  406|     51|            }
  407|  1.04k|        }
  408|  56.3k|        else if (0 == descriptor.compare(gMinusX, 2)) {
  ------------------
  |  Branch (408:18): [True: 0, False: 56.3k]
  ------------------
  409|      0|            setType(kNegativeNumberRule);
  410|      0|        }
  411|  56.3k|        else if (descriptorLength == 3) {
  ------------------
  |  Branch (411:18): [True: 23.4k, False: 32.9k]
  ------------------
  412|  23.4k|            if (firstChar == gZero && lastChar == gX) {
  ------------------
  |  Branch (412:17): [True: 0, False: 23.4k]
  |  Branch (412:39): [True: 0, False: 0]
  ------------------
  413|      0|                setBaseValue(kProperFractionRule, status);
  414|      0|                decimalPoint = descriptor.charAt(1);
  415|      0|            }
  416|  23.4k|            else if (firstChar == gX && lastChar == gX) {
  ------------------
  |  Branch (416:22): [True: 1, False: 23.4k]
  |  Branch (416:41): [True: 0, False: 1]
  ------------------
  417|      0|                setBaseValue(kImproperFractionRule, status);
  418|      0|                decimalPoint = descriptor.charAt(1);
  419|      0|            }
  420|  23.4k|            else if (firstChar == gX && lastChar == gZero) {
  ------------------
  |  Branch (420:22): [True: 1, False: 23.4k]
  |  Branch (420:41): [True: 0, False: 1]
  ------------------
  421|      0|                setBaseValue(kDefaultRule, status);
  422|      0|                decimalPoint = descriptor.charAt(1);
  423|      0|            }
  424|  23.4k|            else if (descriptor.compare(gNaN, 3) == 0) {
  ------------------
  |  Branch (424:22): [True: 9.53k, False: 13.8k]
  ------------------
  425|  9.53k|                setBaseValue(kNaNRule, status);
  426|  9.53k|            }
  427|  13.8k|            else if (descriptor.compare(gInf, 3) == 0) {
  ------------------
  |  Branch (427:22): [True: 9.53k, False: 4.35k]
  ------------------
  428|  9.53k|                setBaseValue(kInfinityRule, status);
  429|  9.53k|            }
  430|  23.4k|        }
  431|  57.5k|    }
  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|   397k|    if (!description.isEmpty() && description.charAt(0) == gTick) {
  ------------------
  |  Branch (437:9): [True: 386k, False: 11.6k]
  |  Branch (437:35): [True: 1.24k, False: 385k]
  ------------------
  438|  1.24k|        description.removeBetween(0, 1);
  439|  1.24k|    }
  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|   397k|}
_ZN6icu_786NFRule20extractSubstitutionsEPKNS_9NFRuleSetERKNS_13UnicodeStringEPKS0_R10UErrorCode:
  459|   380k|{
  460|   380k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (460:9): [True: 0, False: 380k]
  ------------------
  461|      0|        return;
  462|      0|    }
  463|   380k|    fRuleText = ruleText;
  464|   380k|    sub1 = extractSubstitution(ruleSet, predecessor, status);
  465|   380k|    if (sub1 == nullptr) {
  ------------------
  |  Branch (465:9): [True: 279k, False: 100k]
  ------------------
  466|       |        // Small optimization. There is no need to create a redundant NullSubstitution.
  467|   279k|        sub2 = nullptr;
  468|   279k|    }
  469|   100k|    else {
  470|   100k|        sub2 = extractSubstitution(ruleSet, predecessor, status);
  471|   100k|    }
  472|   380k|    int32_t pluralRuleStart = fRuleText.indexOf(gDollarOpenParenthesis, -1, 0);
  473|   380k|    int32_t pluralRuleEnd = (pluralRuleStart >= 0 ? fRuleText.indexOf(gClosedParenthesisDollar, -1, pluralRuleStart) : -1);
  ------------------
  |  Branch (473:30): [True: 521, False: 379k]
  ------------------
  474|   380k|    if (pluralRuleEnd >= 0) {
  ------------------
  |  Branch (474:9): [True: 51, False: 380k]
  ------------------
  475|     51|        int32_t endType = fRuleText.indexOf(gComma, pluralRuleStart);
  476|     51|        if (endType < 0) {
  ------------------
  |  Branch (476:13): [True: 18, False: 33]
  ------------------
  477|     18|            status = U_PARSE_ERROR;
  478|     18|            return;
  479|     18|        }
  480|     33|        UnicodeString type(fRuleText.tempSubString(pluralRuleStart + 2, endType - pluralRuleStart - 2));
  481|     33|        UPluralType pluralType;
  482|     33|        if (type.startsWith(UNICODE_STRING_SIMPLE("cardinal"))) {
  ------------------
  |  |  135|     33|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|     33|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  |  Branch (482:13): [True: 0, False: 33]
  ------------------
  483|      0|            pluralType = UPLURAL_TYPE_CARDINAL;
  484|      0|        }
  485|     33|        else if (type.startsWith(UNICODE_STRING_SIMPLE("ordinal"))) {
  ------------------
  |  |  135|     33|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|     33|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
  |  Branch (485:18): [True: 0, False: 33]
  ------------------
  486|      0|            pluralType = UPLURAL_TYPE_ORDINAL;
  487|      0|        }
  488|     33|        else {
  489|     33|            status = U_ILLEGAL_ARGUMENT_ERROR;
  490|     33|            return;
  491|     33|        }
  492|      0|        rulePatternFormat = formatter->createPluralFormat(pluralType,
  493|      0|                fRuleText.tempSubString(endType + 1, pluralRuleEnd - endType - 1), status);
  494|      0|    }
  495|   380k|}
_ZN6icu_786NFRule19extractSubstitutionEPKNS_9NFRuleSetEPKS0_R10UErrorCode:
  513|   481k|{
  514|   481k|    NFSubstitution* result = nullptr;
  515|       |
  516|       |    // search the rule's rule text for the first two characters of
  517|       |    // a substitution token
  518|   481k|    int32_t subStart = indexOfAnyRulePrefix();
  519|   481k|    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|   481k|    if (subStart == -1) {
  ------------------
  |  Branch (523:9): [True: 327k, False: 153k]
  ------------------
  524|   327k|        return nullptr;
  525|   327k|    }
  526|       |
  527|       |    // special-case the ">>>" token, since searching for the > at the
  528|       |    // end will actually find the > in the middle
  529|   153k|    if (fRuleText.indexOf(gGreaterGreaterGreater, 3, 0) == subStart) {
  ------------------
  |  Branch (529:9): [True: 31.2k, False: 122k]
  ------------------
  530|  31.2k|        subEnd = subStart + 2;
  531|       |
  532|       |        // otherwise the substitution token ends with the same character
  533|       |        // it began with
  534|   122k|    } else {
  535|   122k|        char16_t c = fRuleText.charAt(subStart);
  536|   122k|        subEnd = fRuleText.indexOf(c, subStart + 1);
  537|       |        // special case for '<%foo<<'
  538|   122k|        if (c == gLessThan && subEnd != -1 && subEnd < fRuleText.length() - 1 && fRuleText.charAt(subEnd+1) == c) {
  ------------------
  |  Branch (538:13): [True: 58.1k, False: 64.3k]
  |  Branch (538:31): [True: 46.8k, False: 11.3k]
  |  Branch (538:47): [True: 41.0k, False: 5.78k]
  |  Branch (538:82): [True: 1.22k, False: 39.8k]
  ------------------
  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|  1.22k|            ++subEnd;
  544|  1.22k|        }
  545|   122k|   }
  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|   153k|    if (subEnd == -1) {
  ------------------
  |  Branch (550:9): [True: 29.2k, False: 124k]
  ------------------
  551|  29.2k|        return nullptr;
  552|  29.2k|    }
  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|   124k|    UnicodeString subToken;
  558|   124k|    subToken.setTo(fRuleText, subStart, subEnd + 1 - subStart);
  559|   124k|    result = NFSubstitution::makeSubstitution(subStart, this, predecessor, ruleSet,
  560|   124k|        this->formatter, subToken, status);
  561|       |
  562|       |    // remove the substitution from the rule text
  563|   124k|    fRuleText.removeBetween(subStart, subEnd+1);
  564|       |
  565|   124k|    return result;
  566|   153k|}
_ZN6icu_786NFRule12setBaseValueElR10UErrorCode:
  577|   398k|{
  578|       |    // set the base value
  579|   398k|    baseValue = newBaseValue;
  580|   398k|    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|   398k|    if (baseValue >= 1) {
  ------------------
  |  Branch (587:9): [True: 367k, False: 30.4k]
  ------------------
  588|   367k|        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|   367k|        if (sub1 != nullptr) {
  ------------------
  |  Branch (594:13): [True: 98.1k, False: 269k]
  ------------------
  595|  98.1k|            sub1->setDivisor(radix, exponent, status);
  596|  98.1k|        }
  597|   367k|        if (sub2 != nullptr) {
  ------------------
  |  Branch (597:13): [True: 23.0k, False: 344k]
  ------------------
  598|  23.0k|            sub2->setDivisor(radix, exponent, status);
  599|  23.0k|        }
  600|       |
  601|       |        // if this is a special rule, its radix and exponent are basically
  602|       |        // ignored.  Set them to "safe" default values
  603|   367k|    } else {
  604|  30.4k|        exponent = 0;
  605|  30.4k|    }
  606|   398k|}
_ZNK6icu_786NFRule16expectedExponentEv:
  615|   368k|{
  616|       |    // since the log of 0, or the log base 0 of something, causes an
  617|       |    // error, declare the exponent in these cases to be 0 (we also
  618|       |    // deal with the special-rule identifiers here)
  619|   368k|    if (radix == 0 || baseValue < 1) {
  ------------------
  |  Branch (619:9): [True: 2, False: 368k]
  |  Branch (619:23): [True: 7, False: 368k]
  ------------------
  620|      9|        return 0;
  621|      9|    }
  622|       |
  623|       |    // we get rounding error in some cases-- for example, log 1000 / log 10
  624|       |    // gives us 1.9999999996 instead of 2.  The extra logic here is to take
  625|       |    // that into account
  626|   368k|    int16_t tempResult = static_cast<int16_t>(uprv_log(static_cast<double>(baseValue)) /
  ------------------
  |  | 1523|   368k|#define uprv_log U_ICU_ENTRY_POINT_RENAME(uprv_log)
  |  |  ------------------
  |  |  |  |  123|   368k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   368k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   368k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  627|   368k|                                              uprv_log(static_cast<double>(radix)));
  ------------------
  |  | 1523|   368k|#define uprv_log U_ICU_ENTRY_POINT_RENAME(uprv_log)
  |  |  ------------------
  |  |  |  |  123|   368k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   368k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   368k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  628|   368k|    int64_t temp = util64_pow(radix, tempResult + 1);
  629|   368k|    if (temp <= baseValue) {
  ------------------
  |  Branch (629:9): [True: 701, False: 367k]
  ------------------
  630|    701|        tempResult += 1;
  631|    701|    }
  632|   368k|    return tempResult;
  633|   368k|}
_ZNK6icu_786NFRule20indexOfAnyRulePrefixEv:
  644|   481k|{
  645|   481k|    int result = -1;
  646|  5.77M|    for (int i = 0; RULE_PREFIXES[i]; i++) {
  ------------------
  |  Branch (646:21): [True: 5.29M, False: 481k]
  ------------------
  647|  5.29M|        int32_t pos = fRuleText.indexOf(*RULE_PREFIXES[i]);
  648|  5.29M|        if (pos != -1 && (result == -1 || pos < result)) {
  ------------------
  |  Branch (648:13): [True: 707k, False: 4.58M]
  |  Branch (648:27): [True: 153k, False: 553k]
  |  Branch (648:43): [True: 1.76k, False: 551k]
  ------------------
  649|   155k|            result = pos;
  650|   155k|        }
  651|  5.29M|    }
  652|   481k|    return result;
  653|   481k|}
_ZNK6icu_786NFRule10getDivisorEv:
  763|   123k|{
  764|   123k|    return util64_pow(radix, exponent);
  765|   123k|}
_ZNK6icu_786NFRule7doParseERKNS_13UnicodeStringERNS_13ParsePositionEadjiRNS_11FormattableE:
  957|  26.4M|{
  958|       |    // internally we operate on a copy of the string being parsed
  959|       |    // (because we're going to change it) and use our own ParsePosition
  960|  26.4M|    ParsePosition pp;
  961|  26.4M|    UnicodeString workText(text);
  962|       |
  963|  26.4M|    int32_t sub1Pos = sub1 != nullptr ? sub1->getPos() : fRuleText.length();
  ------------------
  |  Branch (963:23): [True: 24.4M, False: 2.03M]
  ------------------
  964|  26.4M|    int32_t sub2Pos = sub2 != nullptr ? sub2->getPos() : fRuleText.length();
  ------------------
  |  Branch (964:23): [True: 10.7M, False: 15.7M]
  ------------------
  965|       |
  966|       |    // check to see whether the text before the first substitution
  967|       |    // matches the text at the beginning of the string being
  968|       |    // parsed.  If it does, strip that off the front of workText;
  969|       |    // otherwise, dump out with a mismatch
  970|  26.4M|    UnicodeString prefix;
  971|  26.4M|    prefix.setTo(fRuleText, 0, sub1Pos);
  972|       |
  973|       |#ifdef RBNF_DEBUG
  974|       |    fprintf(stderr, "doParse %p ", this);
  975|       |    {
  976|       |        UnicodeString rt;
  977|       |        _appendRuleText(rt);
  978|       |        dumpUS(stderr, rt);
  979|       |    }
  980|       |
  981|       |    fprintf(stderr, " text: '");
  982|       |    dumpUS(stderr, text);
  983|       |    fprintf(stderr, "' prefix: '");
  984|       |    dumpUS(stderr, prefix);
  985|       |#endif
  986|  26.4M|    stripPrefix(workText, prefix, pp);
  987|  26.4M|    int32_t prefixLength = text.length() - workText.length();
  988|       |
  989|       |#ifdef RBNF_DEBUG
  990|       |    fprintf(stderr, "' pl: %d ppi: %d s1p: %d\n", prefixLength, pp.getIndex(), sub1Pos);
  991|       |#endif
  992|       |
  993|  26.4M|    if (pp.getIndex() == 0 && sub1Pos != 0) {
  ------------------
  |  Branch (993:9): [True: 24.5M, False: 1.95M]
  |  Branch (993:31): [True: 789k, False: 23.7M]
  ------------------
  994|       |        // commented out because ParsePosition doesn't have error index in 1.1.x
  995|       |        // restored for ICU4C port
  996|   789k|        parsePosition.setErrorIndex(pp.getErrorIndex());
  997|   789k|        resVal.setLong(0);
  998|   789k|        return true;
  999|   789k|    }
 1000|  25.6M|    if (baseValue == kInfinityRule) {
  ------------------
  |  Branch (1000:9): [True: 0, False: 25.6M]
  ------------------
 1001|       |        // If you match this, don't try to perform any calculations on it.
 1002|      0|        parsePosition.setIndex(pp.getIndex());
 1003|      0|        resVal.setDouble(uprv_getInfinity());
  ------------------
  |  | 1506|      0|#define uprv_getInfinity U_ICU_ENTRY_POINT_RENAME(uprv_getInfinity)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1004|      0|        return true;
 1005|      0|    }
 1006|  25.6M|    if (baseValue == kNaNRule) {
  ------------------
  |  Branch (1006:9): [True: 0, False: 25.6M]
  ------------------
 1007|       |        // If you match this, don't try to perform any calculations on it.
 1008|      0|        parsePosition.setIndex(pp.getIndex());
 1009|      0|        resVal.setDouble(uprv_getNaN());
  ------------------
  |  | 1509|      0|#define uprv_getNaN U_ICU_ENTRY_POINT_RENAME(uprv_getNaN)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1010|      0|        return true;
 1011|      0|    }
 1012|       |
 1013|       |    // this is the fun part.  The basic guts of the rule-matching
 1014|       |    // logic is matchToDelimiter(), which is called twice.  The first
 1015|       |    // time it searches the input string for the rule text BETWEEN
 1016|       |    // the substitutions and tries to match the intervening text
 1017|       |    // in the input string with the first substitution.  If that
 1018|       |    // succeeds, it then calls it again, this time to look for the
 1019|       |    // rule text after the second substitution and to match the
 1020|       |    // intervening input text against the second substitution.
 1021|       |    //
 1022|       |    // For example, say we have a rule that looks like this:
 1023|       |    //    first << middle >> last;
 1024|       |    // and input text that looks like this:
 1025|       |    //    first one middle two last
 1026|       |    // First we use stripPrefix() to match "first " in both places and
 1027|       |    // strip it off the front, leaving
 1028|       |    //    one middle two last
 1029|       |    // Then we use matchToDelimiter() to match " middle " and try to
 1030|       |    // match "one" against a substitution.  If it's successful, we now
 1031|       |    // have
 1032|       |    //    two last
 1033|       |    // We use matchToDelimiter() a second time to match " last" and
 1034|       |    // try to match "two" against a substitution.  If "two" matches
 1035|       |    // the substitution, we have a successful parse.
 1036|       |    //
 1037|       |    // Since it's possible in many cases to find multiple instances
 1038|       |    // of each of these pieces of rule text in the input string,
 1039|       |    // we need to try all the possible combinations of these
 1040|       |    // locations.  This prevents us from prematurely declaring a mismatch,
 1041|       |    // and makes sure we match as much input text as we can.
 1042|  25.6M|    int highWaterMark = 0;
 1043|  25.6M|    double result = 0;
 1044|  25.6M|    int start = 0;
 1045|  25.6M|    double tempBaseValue = static_cast<double>(baseValue <= 0 ? 0 : baseValue);
  ------------------
  |  Branch (1045:48): [True: 6.98M, False: 18.6M]
  ------------------
 1046|       |
 1047|  25.6M|    UnicodeString temp;
 1048|  25.6M|    do {
 1049|       |        // our partial parse result starts out as this rule's base
 1050|       |        // value.  If it finds a successful match, matchToDelimiter()
 1051|       |        // will compose this in some way with what it gets back from
 1052|       |        // the substitution, giving us a new partial parse result
 1053|  25.6M|        pp.setIndex(0);
 1054|       |
 1055|  25.6M|        temp.setTo(fRuleText, sub1Pos, sub2Pos - sub1Pos);
 1056|  25.6M|        double partialResult = matchToDelimiter(workText, start, tempBaseValue,
 1057|  25.6M|            temp, pp, sub1,
 1058|  25.6M|            nonNumericalExecutedRuleMask,
 1059|  25.6M|            recursionCount,
 1060|  25.6M|            upperBound);
 1061|       |
 1062|       |        // if we got a successful match (or were trying to match a
 1063|       |        // null substitution), pp is now pointing at the first unmatched
 1064|       |        // character.  Take note of that, and try matchToDelimiter()
 1065|       |        // on the input text again
 1066|  25.6M|        if (pp.getIndex() != 0 || sub1 == nullptr) {
  ------------------
  |  Branch (1066:13): [True: 710k, False: 24.9M]
  |  Branch (1066:35): [True: 1.63M, False: 23.3M]
  ------------------
 1067|  2.34M|            start = pp.getIndex();
 1068|       |
 1069|  2.34M|            UnicodeString workText2;
 1070|  2.34M|            workText2.setTo(workText, pp.getIndex(), workText.length() - pp.getIndex());
 1071|  2.34M|            ParsePosition pp2;
 1072|       |
 1073|       |            // the second matchToDelimiter() will compose our previous
 1074|       |            // partial result with whatever it gets back from its
 1075|       |            // substitution if there's a successful match, giving us
 1076|       |            // a real result
 1077|  2.34M|            temp.setTo(fRuleText, sub2Pos, fRuleText.length() - sub2Pos);
 1078|  2.34M|            partialResult = matchToDelimiter(workText2, 0, partialResult,
 1079|  2.34M|                temp, pp2, sub2,
 1080|  2.34M|                nonNumericalExecutedRuleMask,
 1081|  2.34M|                recursionCount,
 1082|  2.34M|                upperBound);
 1083|       |
 1084|       |            // if we got a successful match on this second
 1085|       |            // matchToDelimiter() call, update the high-water mark
 1086|       |            // and result (if necessary)
 1087|  2.34M|            if (pp2.getIndex() != 0 || sub2 == nullptr) {
  ------------------
  |  Branch (1087:17): [True: 1.05k, False: 2.34M]
  |  Branch (1087:40): [True: 2.06M, False: 283k]
  ------------------
 1088|  2.06M|                if (prefixLength + pp.getIndex() + pp2.getIndex() > highWaterMark) {
  ------------------
  |  Branch (1088:21): [True: 2.03M, False: 34.2k]
  ------------------
 1089|  2.03M|                    highWaterMark = prefixLength + pp.getIndex() + pp2.getIndex();
 1090|  2.03M|                    result = partialResult;
 1091|  2.03M|                }
 1092|  2.06M|            }
 1093|   283k|            else {
 1094|       |                // commented out because ParsePosition doesn't have error index in 1.1.x
 1095|       |                // restored for ICU4C port
 1096|   283k|                int32_t i_temp = pp2.getErrorIndex() + sub1Pos + pp.getIndex();
 1097|   283k|                if (i_temp> parsePosition.getErrorIndex()) {
  ------------------
  |  Branch (1097:21): [True: 152k, False: 130k]
  ------------------
 1098|   152k|                    parsePosition.setErrorIndex(i_temp);
 1099|   152k|                }
 1100|   283k|            }
 1101|  2.34M|        }
 1102|  23.3M|        else {
 1103|       |            // commented out because ParsePosition doesn't have error index in 1.1.x
 1104|       |            // restored for ICU4C port
 1105|  23.3M|            int32_t i_temp = sub1Pos + pp.getErrorIndex();
 1106|  23.3M|            if (i_temp > parsePosition.getErrorIndex()) {
  ------------------
  |  Branch (1106:17): [True: 10.3M, False: 13.0M]
  ------------------
 1107|  10.3M|                parsePosition.setErrorIndex(i_temp);
 1108|  10.3M|            }
 1109|  23.3M|        }
 1110|       |        // keep trying to match things until the outer matchToDelimiter()
 1111|       |        // call fails to make a match (each time, it picks up where it
 1112|       |        // left off the previous time)
 1113|  25.6M|    } while (sub1Pos != sub2Pos
  ------------------
  |  Branch (1113:14): [True: 3.70M, False: 21.9M]
  ------------------
 1114|  25.6M|        && pp.getIndex() > 0
  ------------------
  |  Branch (1114:12): [True: 48.5k, False: 3.65M]
  ------------------
 1115|  25.6M|        && pp.getIndex() < workText.length()
  ------------------
  |  Branch (1115:12): [True: 48.2k, False: 292]
  ------------------
 1116|  25.6M|        && pp.getIndex() != start);
  ------------------
  |  Branch (1116:12): [True: 0, False: 48.2k]
  ------------------
 1117|       |
 1118|       |    // update the caller's ParsePosition with our high-water mark
 1119|       |    // (i.e., it now points at the first character this function
 1120|       |    // didn't match-- the ParsePosition is therefore unchanged if
 1121|       |    // we didn't match anything)
 1122|  25.6M|    parsePosition.setIndex(highWaterMark);
 1123|       |    // commented out because ParsePosition doesn't have error index in 1.1.x
 1124|       |    // restored for ICU4C port
 1125|  25.6M|    if (highWaterMark > 0) {
  ------------------
  |  Branch (1125:9): [True: 2.03M, False: 23.6M]
  ------------------
 1126|  2.03M|        parsePosition.setErrorIndex(0);
 1127|  2.03M|    }
 1128|       |
 1129|       |    // this is a hack for one unusual condition: Normally, whether this
 1130|       |    // rule belong to a fraction rule set or not is handled by its
 1131|       |    // substitutions.  But if that rule HAS NO substitutions, then
 1132|       |    // we have to account for it here.  By definition, if the matching
 1133|       |    // rule in a fraction rule set has no substitutions, its numerator
 1134|       |    // is 1, and so the result is the reciprocal of its base value.
 1135|  25.6M|    if (isFractionRule && highWaterMark > 0 && sub1 == nullptr) {
  ------------------
  |  Branch (1135:9): [True: 0, False: 25.6M]
  |  Branch (1135:27): [True: 0, False: 0]
  |  Branch (1135:48): [True: 0, False: 0]
  ------------------
 1136|      0|        result = 1 / result;
 1137|      0|    }
 1138|       |
 1139|  25.6M|    resVal.setDouble(result);
 1140|  25.6M|    return true; // ??? do we need to worry if it is a long or a double?
 1141|  25.6M|}
_ZNK6icu_786NFRule11stripPrefixERNS_13UnicodeStringERKS1_RNS_13ParsePositionE:
 1161|  26.4M|{
 1162|       |    // if the prefix text is empty, dump out without doing anything
 1163|  26.4M|    if (prefix.length() != 0) {
  ------------------
  |  Branch (1163:9): [True: 2.74M, False: 23.7M]
  ------------------
 1164|  2.74M|    	UErrorCode status = U_ZERO_ERROR;
 1165|       |        // use prefixLength() to match the beginning of
 1166|       |        // "text" against "prefix".  This function returns the
 1167|       |        // number of characters from "text" that matched (or 0 if
 1168|       |        // we didn't match the whole prefix)
 1169|  2.74M|        int32_t pfl = prefixLength(text, prefix, status);
 1170|  2.74M|        if (U_FAILURE(status)) { // Memory allocation error.
  ------------------
  |  Branch (1170:13): [True: 0, False: 2.74M]
  ------------------
 1171|      0|        	return;
 1172|      0|        }
 1173|  2.74M|        if (pfl != 0) {
  ------------------
  |  Branch (1173:13): [True: 1.95M, False: 789k]
  ------------------
 1174|       |            // if we got a successful match, update the parse position
 1175|       |            // and strip the prefix off of "text"
 1176|  1.95M|            pp.setIndex(pp.getIndex() + pfl);
 1177|  1.95M|            text.remove(0, pfl);
 1178|  1.95M|        }
 1179|  2.74M|    }
 1180|  26.4M|}
_ZNK6icu_786NFRule16matchToDelimiterERKNS_13UnicodeStringEidS3_RNS_13ParsePositionEPKNS_14NFSubstitutionEjid:
 1221|  28.0M|{
 1222|  28.0M|	UErrorCode status = U_ZERO_ERROR;
 1223|       |    // if "delimiter" contains real (i.e., non-ignorable) text, search
 1224|       |    // it for "delimiter" beginning at "start".  If that succeeds, then
 1225|       |    // use "sub"'s doParse() method to match the text before the
 1226|       |    // instance of "delimiter" we just found.
 1227|  28.0M|    if (!allIgnorable(delimiter, status)) {
  ------------------
  |  Branch (1227:9): [True: 3.92M, False: 24.0M]
  ------------------
 1228|  3.92M|    	if (U_FAILURE(status)) { //Memory allocation error.
  ------------------
  |  Branch (1228:10): [True: 0, False: 3.92M]
  ------------------
 1229|      0|    		return 0;
 1230|      0|    	}
 1231|  3.92M|        ParsePosition tempPP;
 1232|  3.92M|        Formattable result;
 1233|       |
 1234|       |        // use findText() to search for "delimiter".  It returns a two-
 1235|       |        // element array: element 0 is the position of the match, and
 1236|       |        // element 1 is the number of characters that matched
 1237|       |        // "delimiter".
 1238|  3.92M|        int32_t dLen;
 1239|  3.92M|        int32_t dPos = findText(text, delimiter, startPos, &dLen);
 1240|       |
 1241|       |        // if findText() succeeded, isolate the text preceding the
 1242|       |        // match, and use "sub" to match that text
 1243|  19.2M|        while (dPos >= 0) {
  ------------------
  |  Branch (1243:16): [True: 15.4M, False: 3.87M]
  ------------------
 1244|  15.4M|            UnicodeString subText;
 1245|  15.4M|            subText.setTo(text, 0, dPos);
 1246|  15.4M|            if (subText.length() > 0) {
  ------------------
  |  Branch (1246:17): [True: 12.4M, False: 3.00M]
  ------------------
 1247|  12.4M|                UBool success = sub->doParse(subText, tempPP, _baseValue, upperBound,
 1248|       |#if UCONFIG_NO_COLLATION
 1249|       |                    false,
 1250|       |#else
 1251|  12.4M|                    formatter->isLenient(),
 1252|  12.4M|#endif
 1253|  12.4M|                    nonNumericalExecutedRuleMask,
 1254|  12.4M|                    recursionCount,
 1255|  12.4M|                    result);
 1256|       |
 1257|       |                // if the substitution could match all the text up to
 1258|       |                // where we found "delimiter", then this function has
 1259|       |                // a successful match.  Bump the caller's parse position
 1260|       |                // to point to the first character after the text
 1261|       |                // that matches "delimiter", and return the result
 1262|       |                // we got from parsing the substitution.
 1263|  12.4M|                if (success && tempPP.getIndex() == dPos) {
  ------------------
  |  Branch (1263:21): [True: 3.82M, False: 8.57M]
  |  Branch (1263:32): [True: 48.5k, False: 3.77M]
  ------------------
 1264|  48.5k|                    pp.setIndex(dPos + dLen);
 1265|  48.5k|                    return result.getDouble();
 1266|  48.5k|                }
 1267|  12.3M|                else {
 1268|       |                    // commented out because ParsePosition doesn't have error index in 1.1.x
 1269|       |                    // restored for ICU4C port
 1270|  12.3M|                    if (tempPP.getErrorIndex() > 0) {
  ------------------
  |  Branch (1270:25): [True: 650k, False: 11.7M]
  ------------------
 1271|   650k|                        pp.setErrorIndex(tempPP.getErrorIndex());
 1272|  11.7M|                    } else {
 1273|  11.7M|                        pp.setErrorIndex(tempPP.getIndex());
 1274|  11.7M|                    }
 1275|  12.3M|                }
 1276|  12.4M|            }
 1277|       |
 1278|       |            // if we didn't match the substitution, search for another
 1279|       |            // copy of "delimiter" in "text" and repeat the loop if
 1280|       |            // we find it
 1281|  15.3M|            tempPP.setIndex(0);
 1282|  15.3M|            dPos = findText(text, delimiter, dPos + dLen, &dLen);
 1283|  15.3M|        }
 1284|       |        // if we make it here, this was an unsuccessful match, and we
 1285|       |        // leave pp unchanged and return 0
 1286|  3.87M|        pp.setIndex(0);
 1287|  3.87M|        return 0;
 1288|       |
 1289|       |        // if "delimiter" is empty, or consists only of ignorable characters
 1290|       |        // (i.e., is semantically empty), thwe we obviously can't search
 1291|       |        // for "delimiter".  Instead, just use "sub" to parse as much of
 1292|       |        // "text" as possible.
 1293|  3.92M|    }
 1294|  24.0M|    else if (sub == nullptr) {
  ------------------
  |  Branch (1294:14): [True: 3.70M, False: 20.3M]
  ------------------
 1295|  3.70M|        return _baseValue;
 1296|  3.70M|    }
 1297|  20.3M|    else {
 1298|  20.3M|        ParsePosition tempPP;
 1299|  20.3M|        Formattable result;
 1300|       |
 1301|       |        // try to match the whole string against the substitution
 1302|  20.3M|        UBool success = sub->doParse(text, tempPP, _baseValue, upperBound,
 1303|       |#if UCONFIG_NO_COLLATION
 1304|       |            false,
 1305|       |#else
 1306|  20.3M|            formatter->isLenient(),
 1307|  20.3M|#endif
 1308|  20.3M|            nonNumericalExecutedRuleMask,
 1309|  20.3M|            recursionCount,
 1310|  20.3M|            result);
 1311|  20.3M|        if (success && (tempPP.getIndex() != 0)) {
  ------------------
  |  Branch (1311:13): [True: 17.6M, False: 2.77M]
  |  Branch (1311:24): [True: 663k, False: 16.9M]
  ------------------
 1312|       |            // if there's a successful match (or it's a null
 1313|       |            // substitution), update pp to point to the first
 1314|       |            // character we didn't match, and pass the result from
 1315|       |            // sub.doParse() on through to the caller
 1316|   663k|            pp.setIndex(tempPP.getIndex());
 1317|   663k|            return result.getDouble();
 1318|   663k|        }
 1319|  19.7M|        else {
 1320|       |            // commented out because ParsePosition doesn't have error index in 1.1.x
 1321|       |            // restored for ICU4C port
 1322|  19.7M|            pp.setErrorIndex(tempPP.getErrorIndex());
 1323|  19.7M|        }
 1324|       |
 1325|       |        // and if we get to here, then nothing matched, so we return
 1326|       |        // 0 and leave pp alone
 1327|  19.7M|        return 0;
 1328|  20.3M|    }
 1329|  28.0M|}
_ZNK6icu_786NFRule12prefixLengthERKNS_13UnicodeStringES3_R10UErrorCode:
 1347|  2.74M|{
 1348|       |    // if we're looking for an empty prefix, it obviously matches
 1349|       |    // zero characters.  Just go ahead and return 0.
 1350|  2.74M|    if (prefix.length() == 0) {
  ------------------
  |  Branch (1350:9): [True: 0, False: 2.74M]
  ------------------
 1351|      0|        return 0;
 1352|      0|    }
 1353|       |
 1354|  2.74M|#if !UCONFIG_NO_COLLATION
 1355|       |    // go through all this grief if we're in lenient-parse mode
 1356|  2.74M|    if (formatter->isLenient()) {
  ------------------
  |  Branch (1356:9): [True: 0, False: 2.74M]
  ------------------
 1357|       |        // Check if non-lenient rule finds the text before call lenient parsing
 1358|      0|        if (str.startsWith(prefix)) {
  ------------------
  |  Branch (1358:13): [True: 0, False: 0]
  ------------------
 1359|      0|            return prefix.length();
 1360|      0|        }
 1361|       |        // get the formatter's collator and use it to create two
 1362|       |        // collation element iterators, one over the target string
 1363|       |        // and another over the prefix (right now, we'll throw an
 1364|       |        // exception if the collator we get back from the formatter
 1365|       |        // isn't a RuleBasedCollator, because RuleBasedCollator defines
 1366|       |        // the CollationElementIterator protocol.  Hopefully, this
 1367|       |        // will change someday.)
 1368|      0|        const RuleBasedCollator* collator = formatter->getCollator();
 1369|      0|        if (collator == nullptr) {
  ------------------
  |  Branch (1369:13): [True: 0, False: 0]
  ------------------
 1370|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1371|      0|            return 0;
 1372|      0|        }
 1373|      0|        LocalPointer<CollationElementIterator> strIter(collator->createCollationElementIterator(str));
 1374|      0|        LocalPointer<CollationElementIterator> prefixIter(collator->createCollationElementIterator(prefix));
 1375|       |        // Check for memory allocation error.
 1376|      0|        if (strIter.isNull() || prefixIter.isNull()) {
  ------------------
  |  Branch (1376:13): [True: 0, False: 0]
  |  Branch (1376:33): [True: 0, False: 0]
  ------------------
 1377|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1378|      0|            return 0;
 1379|      0|        }
 1380|       |
 1381|      0|        UErrorCode err = U_ZERO_ERROR;
 1382|       |
 1383|       |        // The original code was problematic.  Consider this match:
 1384|       |        // prefix = "fifty-"
 1385|       |        // string = " fifty-7"
 1386|       |        // The intent is to match string up to the '7', by matching 'fifty-' at position 1
 1387|       |        // in the string.  Unfortunately, we were getting a match, and then computing where
 1388|       |        // the match terminated by rematching the string.  The rematch code was using as an
 1389|       |        // initial guess the substring of string between 0 and prefix.length.  Because of
 1390|       |        // the leading space and trailing hyphen (both ignorable) this was succeeding, leaving
 1391|       |        // the position before the hyphen in the string.  Recursing down, we then parsed the
 1392|       |        // remaining string '-7' as numeric.  The resulting number turned out as 43 (50 - 7).
 1393|       |        // This was not pretty, especially since the string "fifty-7" parsed just fine.
 1394|       |        //
 1395|       |        // We have newer APIs now, so we can use calls on the iterator to determine what we
 1396|       |        // matched up to.  If we terminate because we hit the last element in the string,
 1397|       |        // our match terminates at this length.  If we terminate because we hit the last element
 1398|       |        // in the target, our match terminates at one before the element iterator position.
 1399|       |
 1400|       |        // match collation elements between the strings
 1401|      0|        int32_t oStr = strIter->next(err);
 1402|      0|        int32_t oPrefix = prefixIter->next(err);
 1403|       |
 1404|      0|        while (oPrefix != CollationElementIterator::NULLORDER) {
  ------------------
  |  Branch (1404:16): [True: 0, False: 0]
  ------------------
 1405|       |            // skip over ignorable characters in the target string
 1406|      0|            while (CollationElementIterator::primaryOrder(oStr) == 0
  ------------------
  |  Branch (1406:20): [True: 0, False: 0]
  ------------------
 1407|      0|                && oStr != CollationElementIterator::NULLORDER) {
  ------------------
  |  Branch (1407:20): [True: 0, False: 0]
  ------------------
 1408|      0|                oStr = strIter->next(err);
 1409|      0|            }
 1410|       |
 1411|       |            // skip over ignorable characters in the prefix
 1412|      0|            while (CollationElementIterator::primaryOrder(oPrefix) == 0
  ------------------
  |  Branch (1412:20): [True: 0, False: 0]
  ------------------
 1413|      0|                && oPrefix != CollationElementIterator::NULLORDER) {
  ------------------
  |  Branch (1413:20): [True: 0, False: 0]
  ------------------
 1414|      0|                oPrefix = prefixIter->next(err);
 1415|      0|            }
 1416|       |
 1417|       |            // dlf: move this above following test, if we consume the
 1418|       |            // entire target, aren't we ok even if the source was also
 1419|       |            // entirely consumed?
 1420|       |
 1421|       |            // if skipping over ignorables brought to the end of
 1422|       |            // the prefix, we DID match: drop out of the loop
 1423|      0|            if (oPrefix == CollationElementIterator::NULLORDER) {
  ------------------
  |  Branch (1423:17): [True: 0, False: 0]
  ------------------
 1424|      0|                break;
 1425|      0|            }
 1426|       |
 1427|       |            // if skipping over ignorables brought us to the end
 1428|       |            // of the target string, we didn't match and return 0
 1429|      0|            if (oStr == CollationElementIterator::NULLORDER) {
  ------------------
  |  Branch (1429:17): [True: 0, False: 0]
  ------------------
 1430|      0|                return 0;
 1431|      0|            }
 1432|       |
 1433|       |            // match collation elements from the two strings
 1434|       |            // (considering only primary differences).  If we
 1435|       |            // get a mismatch, dump out and return 0
 1436|      0|            if (CollationElementIterator::primaryOrder(oStr)
  ------------------
  |  Branch (1436:17): [True: 0, False: 0]
  ------------------
 1437|      0|                != CollationElementIterator::primaryOrder(oPrefix)) {
 1438|      0|                return 0;
 1439|       |
 1440|       |                // otherwise, advance to the next character in each string
 1441|       |                // and loop (we drop out of the loop when we exhaust
 1442|       |                // collation elements in the prefix)
 1443|      0|            } else {
 1444|      0|                oStr = strIter->next(err);
 1445|      0|                oPrefix = prefixIter->next(err);
 1446|      0|            }
 1447|      0|        }
 1448|       |
 1449|      0|        int32_t result = strIter->getOffset();
 1450|      0|        if (oStr != CollationElementIterator::NULLORDER) {
  ------------------
  |  Branch (1450:13): [True: 0, False: 0]
  ------------------
 1451|      0|            --result; // back over character that we don't want to consume;
 1452|      0|        }
 1453|       |
 1454|       |#ifdef RBNF_DEBUG
 1455|       |        fprintf(stderr, "prefix length: %d\n", result);
 1456|       |#endif
 1457|      0|        return result;
 1458|       |#if 0
 1459|       |        //----------------------------------------------------------------
 1460|       |        // JDK 1.2-specific API call
 1461|       |        // return strIter.getOffset();
 1462|       |        //----------------------------------------------------------------
 1463|       |        // JDK 1.1 HACK (take out for 1.2-specific code)
 1464|       |
 1465|       |        // if we make it to here, we have a successful match.  Now we
 1466|       |        // have to find out HOW MANY characters from the target string
 1467|       |        // matched the prefix (there isn't necessarily a one-to-one
 1468|       |        // mapping between collation elements and characters).
 1469|       |        // In JDK 1.2, there's a simple getOffset() call we can use.
 1470|       |        // In JDK 1.1, on the other hand, we have to go through some
 1471|       |        // ugly contortions.  First, use the collator to compare the
 1472|       |        // same number of characters from the prefix and target string.
 1473|       |        // If they're equal, we're done.
 1474|       |        collator->setStrength(Collator::PRIMARY);
 1475|       |        if (str.length() >= prefix.length()) {
 1476|       |            UnicodeString temp;
 1477|       |            temp.setTo(str, 0, prefix.length());
 1478|       |            if (collator->equals(temp, prefix)) {
 1479|       |#ifdef RBNF_DEBUG
 1480|       |                fprintf(stderr, "returning: %d\n", prefix.length());
 1481|       |#endif
 1482|       |                return prefix.length();
 1483|       |            }
 1484|       |        }
 1485|       |
 1486|       |        // if they're not equal, then we have to compare successively
 1487|       |        // larger and larger substrings of the target string until we
 1488|       |        // get to one that matches the prefix.  At that point, we know
 1489|       |        // how many characters matched the prefix, and we can return.
 1490|       |        int32_t p = 1;
 1491|       |        while (p <= str.length()) {
 1492|       |            UnicodeString temp;
 1493|       |            temp.setTo(str, 0, p);
 1494|       |            if (collator->equals(temp, prefix)) {
 1495|       |                return p;
 1496|       |            } else {
 1497|       |                ++p;
 1498|       |            }
 1499|       |        }
 1500|       |
 1501|       |        // SHOULD NEVER GET HERE!!!
 1502|       |        return 0;
 1503|       |        //----------------------------------------------------------------
 1504|       |#endif
 1505|       |
 1506|       |        // If lenient parsing is turned off, forget all that crap above.
 1507|       |        // Just use String.startsWith() and be done with it.
 1508|      0|  } else
 1509|  2.74M|#endif
 1510|  2.74M|  {
 1511|  2.74M|      if (str.startsWith(prefix)) {
  ------------------
  |  Branch (1511:11): [True: 1.95M, False: 789k]
  ------------------
 1512|  1.95M|          return prefix.length();
 1513|  1.95M|      } else {
 1514|   789k|          return 0;
 1515|   789k|      }
 1516|  2.74M|  }
 1517|  2.74M|}
_ZNK6icu_786NFRule8findTextERKNS_13UnicodeStringES3_iPi:
 1539|  19.2M|{
 1540|  19.2M|    if (rulePatternFormat) {
  ------------------
  |  Branch (1540:9): [True: 0, False: 19.2M]
  ------------------
 1541|      0|        Formattable result;
 1542|      0|        FieldPosition position(UNUM_INTEGER_FIELD);
 1543|      0|        position.setBeginIndex(startingAt);
 1544|      0|        rulePatternFormat->parseType(str, this, result, position);
 1545|      0|        int start = position.getBeginIndex();
 1546|      0|        if (start >= 0) {
  ------------------
  |  Branch (1546:13): [True: 0, False: 0]
  ------------------
 1547|      0|            int32_t pluralRuleStart = fRuleText.indexOf(gDollarOpenParenthesis, -1, 0);
 1548|      0|            int32_t pluralRuleSuffix = fRuleText.indexOf(gClosedParenthesisDollar, -1, pluralRuleStart) + 2;
 1549|      0|            int32_t matchLen = position.getEndIndex() - start;
 1550|      0|            UnicodeString prefix(fRuleText.tempSubString(0, pluralRuleStart));
 1551|      0|            UnicodeString suffix(fRuleText.tempSubString(pluralRuleSuffix));
 1552|      0|            if (str.compare(start - prefix.length(), prefix.length(), prefix, 0, prefix.length()) == 0
  ------------------
  |  Branch (1552:17): [True: 0, False: 0]
  ------------------
 1553|      0|                    && str.compare(start + matchLen, suffix.length(), suffix, 0, suffix.length()) == 0)
  ------------------
  |  Branch (1553:24): [True: 0, False: 0]
  ------------------
 1554|      0|            {
 1555|      0|                *length = matchLen + prefix.length() + suffix.length();
 1556|      0|                return start - prefix.length();
 1557|      0|            }
 1558|      0|        }
 1559|      0|        *length = 0;
 1560|      0|        return -1;
 1561|      0|    }
 1562|  19.2M|    if (!formatter->isLenient()) {
  ------------------
  |  Branch (1562:9): [True: 19.2M, False: 0]
  ------------------
 1563|       |        // if lenient parsing is turned off, this is easy: just call
 1564|       |        // String.indexOf() and we're done
 1565|  19.2M|        *length = key.length();
 1566|  19.2M|        return str.indexOf(key, startingAt);
 1567|  19.2M|    }
 1568|      0|    else {
 1569|       |        // Check if non-lenient rule finds the text before call lenient parsing
 1570|      0|        *length = key.length();
 1571|      0|        int32_t pos = str.indexOf(key, startingAt);
 1572|      0|        if(pos >= 0) {
  ------------------
  |  Branch (1572:12): [True: 0, False: 0]
  ------------------
 1573|      0|            return pos;
 1574|      0|        } else {
 1575|       |            // but if lenient parsing is turned ON, we've got some work ahead of us
 1576|      0|            return findTextLenient(str, key, startingAt, length);
 1577|      0|        }
 1578|      0|    }
 1579|  19.2M|}
_ZNK6icu_786NFRule12allIgnorableERKNS_13UnicodeStringER10UErrorCode:
 1636|  28.0M|{
 1637|       |    // if the string is empty, we can just return true
 1638|  28.0M|    if (str.length() == 0) {
  ------------------
  |  Branch (1638:9): [True: 24.0M, False: 3.92M]
  ------------------
 1639|  24.0M|        return true;
 1640|  24.0M|    }
 1641|       |
 1642|  3.92M|#if !UCONFIG_NO_COLLATION
 1643|       |    // if lenient parsing is turned on, walk through the string with
 1644|       |    // a collation element iterator and make sure each collation
 1645|       |    // element is 0 (ignorable) at the primary level
 1646|  3.92M|    if (formatter->isLenient()) {
  ------------------
  |  Branch (1646:9): [True: 0, False: 3.92M]
  ------------------
 1647|      0|        const RuleBasedCollator* collator = formatter->getCollator();
 1648|      0|        if (collator == nullptr) {
  ------------------
  |  Branch (1648:13): [True: 0, False: 0]
  ------------------
 1649|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1650|      0|            return false;
 1651|      0|        }
 1652|      0|        LocalPointer<CollationElementIterator> iter(collator->createCollationElementIterator(str));
 1653|       |
 1654|       |        // Memory allocation error check.
 1655|      0|        if (iter.isNull()) {
  ------------------
  |  Branch (1655:13): [True: 0, False: 0]
  ------------------
 1656|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1657|      0|            return false;
 1658|      0|        }
 1659|       |
 1660|      0|        UErrorCode err = U_ZERO_ERROR;
 1661|      0|        int32_t o = iter->next(err);
 1662|      0|        while (o != CollationElementIterator::NULLORDER
  ------------------
  |  Branch (1662:16): [True: 0, False: 0]
  ------------------
 1663|      0|            && CollationElementIterator::primaryOrder(o) == 0) {
  ------------------
  |  Branch (1663:16): [True: 0, False: 0]
  ------------------
 1664|      0|            o = iter->next(err);
 1665|      0|        }
 1666|       |
 1667|      0|        return o == CollationElementIterator::NULLORDER;
 1668|      0|    }
 1669|  3.92M|#endif
 1670|       |
 1671|       |    // if lenient parsing is turned off, there is no such thing as
 1672|       |    // an ignorable character: return true only if the string is empty
 1673|  3.92M|    return false;
 1674|  3.92M|}

_ZNK6icu_786NFRule7getTypeEv:
   60|  7.77k|    ERuleType getType() const { return (baseValue <= kNoBase ? static_cast<ERuleType>(baseValue) : kOtherRule); }
  ------------------
  |  Branch (60:41): [True: 7.41k, False: 360]
  ------------------
_ZNK6icu_786NFRule12getBaseValueEv:
   63|  1.07G|    int64_t getBaseValue() const { return baseValue; }

_ZN6icu_7821SameValueSubstitutionD2Ev:
   72|    826|SameValueSubstitution::~SameValueSubstitution() {}
_ZN6icu_7822MultiplierSubstitutionD2Ev:
  142|  46.8k|MultiplierSubstitution::~MultiplierSubstitution() {}
_ZN6icu_7819ModulusSubstitutionD2Ev:
  198|  76.8k|ModulusSubstitution::~ModulusSubstitution() {}
_ZN6icu_7814NFSubstitution16makeSubstitutionEiPKNS_6NFRuleES3_PKNS_9NFRuleSetEPKNS_21RuleBasedNumberFormatERKNS_13UnicodeStringER10UErrorCode:
  343|   124k|{
  344|       |    // if the description is empty, return a NullSubstitution
  345|   124k|    if (description.length() == 0) {
  ------------------
  |  Branch (345:9): [True: 0, False: 124k]
  ------------------
  346|      0|        return nullptr;
  347|      0|    }
  348|       |
  349|   124k|    switch (description.charAt(0)) {
  350|       |        // if the description begins with '<'...
  351|  46.8k|    case gLessThan:
  ------------------
  |  Branch (351:5): [True: 46.8k, False: 77.7k]
  ------------------
  352|       |        // throw an exception if the rule is a negative number
  353|       |        // rule
  354|  46.8k|        if (rule->getBaseValue() == NFRule::kNegativeNumberRule) {
  ------------------
  |  Branch (354:13): [True: 0, False: 46.8k]
  ------------------
  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|  46.8k|        else if (rule->getBaseValue() == NFRule::kImproperFractionRule
  ------------------
  |  Branch (362:18): [True: 0, False: 46.8k]
  ------------------
  363|  46.8k|            || rule->getBaseValue() == NFRule::kProperFractionRule
  ------------------
  |  Branch (363:16): [True: 0, False: 46.8k]
  ------------------
  364|  46.8k|            || rule->getBaseValue() == NFRule::kDefaultRule) {
  ------------------
  |  Branch (364:16): [True: 0, False: 46.8k]
  ------------------
  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|  46.8k|        else if (ruleSet->isFractionRuleSet()) {
  ------------------
  |  Branch (370:18): [True: 0, False: 46.8k]
  ------------------
  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|  46.8k|        else {
  377|  46.8k|            return new MultiplierSubstitution(pos, rule, ruleSet,
  378|  46.8k|                description, status);
  379|  46.8k|        }
  380|       |
  381|       |        // if the description begins with '>'...
  382|  76.8k|    case gGreaterThan:
  ------------------
  |  Branch (382:5): [True: 76.8k, False: 47.6k]
  ------------------
  383|       |        // if the rule is a negative-number rule, return
  384|       |        // an AbsoluteValueSubstitution
  385|  76.8k|        if (rule->getBaseValue() == NFRule::kNegativeNumberRule) {
  ------------------
  |  Branch (385:13): [True: 0, False: 76.8k]
  ------------------
  386|      0|            return new AbsoluteValueSubstitution(pos, ruleSet, description, status);
  387|      0|        }
  388|       |
  389|       |        // if the rule is a fraction rule, return a
  390|       |        // FractionalPartSubstitution
  391|  76.8k|        else if (rule->getBaseValue() == NFRule::kImproperFractionRule
  ------------------
  |  Branch (391:18): [True: 0, False: 76.8k]
  ------------------
  392|  76.8k|            || rule->getBaseValue() == NFRule::kProperFractionRule
  ------------------
  |  Branch (392:16): [True: 0, False: 76.8k]
  ------------------
  393|  76.8k|            || rule->getBaseValue() == NFRule::kDefaultRule) {
  ------------------
  |  Branch (393:16): [True: 0, False: 76.8k]
  ------------------
  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|  76.8k|        else if (ruleSet->isFractionRuleSet()) {
  ------------------
  |  Branch (399:18): [True: 0, False: 76.8k]
  ------------------
  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|  76.8k|        else {
  407|  76.8k|            return new ModulusSubstitution(pos, rule, predecessor,
  408|  76.8k|                ruleSet, description, status);
  409|  76.8k|        }
  410|       |
  411|       |        // if the description begins with '=', always return a
  412|       |        // SameValueSubstitution
  413|    826|    case gEquals:
  ------------------
  |  Branch (413:5): [True: 826, False: 123k]
  ------------------
  414|    826|        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: 124k]
  ------------------
  418|       |        // throw new IllegalArgumentException("Illegal substitution character");
  419|      0|        status = U_PARSE_ERROR;
  420|   124k|    }
  421|      0|    return nullptr;
  422|   124k|}
_ZN6icu_7814NFSubstitutionC2EiPKNS_9NFRuleSetERKNS_13UnicodeStringER10UErrorCode:
  428|   124k|                               : pos(_pos), ruleSet(nullptr), numberFormat(nullptr)
  429|   124k|{
  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|   124k|    UnicodeString workingDescription(description);
  435|   124k|    if (description.length() >= 2
  ------------------
  |  Branch (435:9): [True: 124k, False: 0]
  ------------------
  436|   124k|        && description.charAt(0) == description.charAt(description.length() - 1))
  ------------------
  |  Branch (436:12): [True: 124k, False: 0]
  ------------------
  437|   124k|    {
  438|   124k|        workingDescription.remove(description.length() - 1, 1);
  439|   124k|        workingDescription.remove(0, 1);
  440|   124k|    }
  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|   124k|    if (workingDescription.length() == 0) {
  ------------------
  |  Branch (447:9): [True: 8.43k, False: 116k]
  ------------------
  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|  8.43k|        this->ruleSet = _ruleSet;
  452|  8.43k|    }
  453|   116k|    else if (workingDescription.charAt(0) == gPercent) {
  ------------------
  |  Branch (453:14): [True: 49, False: 116k]
  ------------------
  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|     49|        this->ruleSet = _ruleSet->getOwner()->findRuleSet(workingDescription, status);
  458|     49|    }
  459|   116k|    else if (workingDescription.charAt(0) == gPound || workingDescription.charAt(0) ==gZero) {
  ------------------
  |  Branch (459:14): [True: 38.2k, False: 77.7k]
  |  Branch (459:56): [True: 45.6k, False: 32.0k]
  ------------------
  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|  83.9k|        const DecimalFormatSymbols* sym = _ruleSet->getOwner()->getDecimalFormatSymbols();
  465|  83.9k|        if (!sym) {
  ------------------
  |  Branch (465:13): [True: 0, False: 83.9k]
  ------------------
  466|      0|            status = U_MISSING_RESOURCE_ERROR;
  467|      0|            return;
  468|      0|        }
  469|  83.9k|        DecimalFormat *tempNumberFormat = new DecimalFormat(workingDescription, *sym, status);
  470|       |        /* test for nullptr */
  471|  83.9k|        if (!tempNumberFormat) {
  ------------------
  |  Branch (471:13): [True: 0, False: 83.9k]
  ------------------
  472|      0|            status = U_MEMORY_ALLOCATION_ERROR;
  473|      0|            return;
  474|      0|        }
  475|  83.9k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (475:13): [True: 100, False: 83.8k]
  ------------------
  476|    100|            delete tempNumberFormat;
  477|    100|            return;
  478|    100|        }
  479|  83.8k|        this->numberFormat = tempNumberFormat;
  480|  83.8k|    }
  481|  32.0k|    else if (workingDescription.charAt(0) == gGreaterThan) {
  ------------------
  |  Branch (481:14): [True: 31.4k, False: 598]
  ------------------
  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|  31.4k|        this->ruleSet = _ruleSet;
  491|  31.4k|        this->numberFormat = nullptr;
  492|  31.4k|    }
  493|    598|    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|    598|        status = U_PARSE_ERROR;
  498|    598|    }
  499|   124k|}
_ZN6icu_7814NFSubstitutionD2Ev:
  502|   124k|{
  503|   124k|    delete numberFormat;
  504|   124k|    numberFormat = nullptr;
  505|   124k|}
_ZN6icu_7814NFSubstitution10setDivisorEisR10UErrorCode:
  515|    709|NFSubstitution::setDivisor(int32_t /*radix*/, int16_t /*exponent*/, UErrorCode& /*status*/) {
  516|       |  // a no-op for all substitutions except multiplier and modulus substitutions
  517|    709|}
_ZNK6icu_7814NFSubstitution7doParseERKNS_13UnicodeStringERNS_13ParsePositionEddajiRNS_11FormattableE:
  714|  13.4M|{
  715|       |#ifdef RBNF_DEBUG
  716|       |    fprintf(stderr, "<nfsubs> %x bv: %g ub: %g\n", this, baseValue, upperBound);
  717|       |#endif
  718|       |    // figure out the highest base value a rule can have and match
  719|       |    // the text being parsed (this varies according to the type of
  720|       |    // substitutions: multiplier, modulus, and numerator substitutions
  721|       |    // restrict the search to rules with base values lower than their
  722|       |    // own; same-value substitutions leave the upper bound wherever
  723|       |    // it was, and the others allow any rule to match
  724|  13.4M|    upperBound = calcUpperBound(upperBound);
  725|       |
  726|       |    // use our rule set to parse the text.  If that fails and
  727|       |    // lenient parsing is enabled (this is always false if the
  728|       |    // formatter's lenient-parsing mode is off, but it may also
  729|       |    // be false even when the formatter's lenient-parse mode is
  730|       |    // on), then also try parsing the text using a default-
  731|       |    // constructed NumberFormat
  732|  13.4M|    if (ruleSet != nullptr) {
  ------------------
  |  Branch (732:9): [True: 6.07M, False: 7.39M]
  ------------------
  733|  6.07M|        ruleSet->parse(text, parsePosition, upperBound, nonNumericalExecutedRuleMask, recursionCount, result);
  734|  6.07M|        if (lenientParse && !ruleSet->isFractionRuleSet() && parsePosition.getIndex() == 0) {
  ------------------
  |  Branch (734:13): [True: 0, False: 6.07M]
  |  Branch (734:29): [True: 0, False: 0]
  |  Branch (734:62): [True: 0, False: 0]
  ------------------
  735|      0|            UErrorCode status = U_ZERO_ERROR;
  736|      0|            NumberFormat* fmt = NumberFormat::createInstance(status);
  737|      0|            if (U_SUCCESS(status)) {
  ------------------
  |  Branch (737:17): [True: 0, False: 0]
  ------------------
  738|      0|                fmt->parse(text, result, parsePosition);
  739|      0|            }
  740|      0|            delete fmt;
  741|      0|        }
  742|       |
  743|       |        // ...or use our DecimalFormat to parse the text
  744|  7.39M|    } else if (numberFormat != nullptr) {
  ------------------
  |  Branch (744:16): [True: 7.39M, False: 0]
  ------------------
  745|  7.39M|        numberFormat->parse(text, result, parsePosition);
  746|  7.39M|    }
  747|       |
  748|       |    // if the parse was successful, we've already advanced the caller's
  749|       |    // parse position (this is the one function that doesn't have one
  750|       |    // of its own).  Derive a parse result and return it as a Long,
  751|       |    // if possible, or a Double
  752|  13.4M|    if (parsePosition.getIndex() != 0) {
  ------------------
  |  Branch (752:9): [True: 2.12M, False: 11.3M]
  ------------------
  753|  2.12M|        UErrorCode status = U_ZERO_ERROR;
  754|  2.12M|        double tempResult = result.getDouble(status);
  755|       |
  756|       |        // composeRuleValue() produces a full parse result from
  757|       |        // the partial parse result passed to this function from
  758|       |        // the caller (this is either the owning rule's base value
  759|       |        // or the partial result obtained from composing the
  760|       |        // owning rule's base value with its other substitution's
  761|       |        // parse result) and the partial parse result obtained by
  762|       |        // matching the substitution (which will be the same value
  763|       |        // the caller would get by parsing just this part of the
  764|       |        // text with RuleBasedNumberFormat.parse() ).  How the two
  765|       |        // values are used to derive the full parse result depends
  766|       |        // on the types of substitutions: For a regular rule, the
  767|       |        // ultimate result is its multiplier substitution's result
  768|       |        // times the rule's divisor (or the rule's base value) plus
  769|       |        // the modulus substitution's result (which will actually
  770|       |        // supersede part of the rule's base value).  For a negative-
  771|       |        // number rule, the result is the negative of its substitution's
  772|       |        // result.  For a fraction rule, it's the sum of its two
  773|       |        // substitution results.  For a rule in a fraction rule set,
  774|       |        // it's the numerator substitution's result divided by
  775|       |        // the rule's base value.  Results from same-value substitutions
  776|       |        // propagate back upard, and null substitutions don't affect
  777|       |        // the result.
  778|  2.12M|        tempResult = composeRuleValue(tempResult, baseValue);
  779|  2.12M|        result.setDouble(tempResult);
  780|  2.12M|        return true;
  781|       |        // if the parse was UNsuccessful, return 0
  782|  11.3M|    } else {
  783|  11.3M|        result.setLong(0);
  784|  11.3M|        return false;
  785|  11.3M|    }
  786|  13.4M|}
_ZN6icu_7821SameValueSubstitutionC2EiPKNS_9NFRuleSetERKNS_13UnicodeStringER10UErrorCode:
  811|    826|: NFSubstitution(_pos, _ruleSet, description, status)
  812|    826|{
  813|    826|    if (0 == description.compare(gEqualsEquals, 2)) {
  ------------------
  |  Branch (813:9): [True: 17, False: 809]
  ------------------
  814|       |        // throw new IllegalArgumentException("== is not a legal token");
  815|     17|        status = U_PARSE_ERROR;
  816|     17|    }
  817|    826|}
_ZN6icu_7819ModulusSubstitutionC2EiPKNS_6NFRuleES3_PKNS_9NFRuleSetERKNS_13UnicodeStringER10UErrorCode:
  849|  76.8k| : NFSubstitution(_pos, _ruleSet, description, status)
  850|  76.8k| , divisor(rule->getDivisor())
  851|  76.8k| , ruleToUse(nullptr)
  852|  76.8k|{
  853|       |  // the owning rule's divisor controls the behavior of this
  854|       |  // substitution: rather than keeping a backpointer to the rule,
  855|       |  // we keep a copy of the divisor
  856|       |
  857|  76.8k|  if (divisor == 0) {
  ------------------
  |  Branch (857:7): [True: 0, False: 76.8k]
  ------------------
  858|      0|      status = U_PARSE_ERROR;
  859|      0|  }
  860|       |
  861|  76.8k|  if (0 == description.compare(gGreaterGreaterGreaterThan, 3)) {
  ------------------
  |  Branch (861:7): [True: 31.2k, False: 45.6k]
  ------------------
  862|       |    // the >>> token doesn't alter how this substitution calculates the
  863|       |    // values it uses for formatting and parsing, but it changes
  864|       |    // what's done with that value after it's obtained: >>> short-
  865|       |    // circuits the rule-search process and goes straight to the
  866|       |    // specified rule to format the substitution value
  867|  31.2k|    ruleToUse = predecessor;
  868|  31.2k|  }
  869|  76.8k|}
_ZNK6icu_7819ModulusSubstitution7doParseERKNS_13UnicodeStringERNS_13ParsePositionEddajiRNS_11FormattableE:
  958|  29.8M|{
  959|       |    // if this isn't a >>> substitution, we can just use the
  960|       |    // inherited parse() routine to do the parsing
  961|  29.8M|    if (ruleToUse == nullptr) {
  ------------------
  |  Branch (961:9): [True: 10.4M, False: 19.3M]
  ------------------
  962|  10.4M|        return NFSubstitution::doParse(text, parsePosition, baseValue, upperBound, lenientParse, nonNumericalExecutedRuleMask, recursionCount, result);
  963|       |
  964|       |        // but if it IS a >>> substitution, we have to do it here: we
  965|       |        // use the specific rule's doParse() method, and then we have to
  966|       |        // do some of the other work of NFRuleSet.parse()
  967|  19.3M|    } else {
  968|  19.3M|        ruleToUse->doParse(text, parsePosition, false, upperBound, nonNumericalExecutedRuleMask, recursionCount, result);
  969|       |
  970|  19.3M|        if (parsePosition.getIndex() != 0) {
  ------------------
  |  Branch (970:13): [True: 1.63M, False: 17.6M]
  ------------------
  971|  1.63M|            UErrorCode status = U_ZERO_ERROR;
  972|  1.63M|            double tempResult = result.getDouble(status);
  973|  1.63M|            tempResult = composeRuleValue(tempResult, baseValue);
  974|  1.63M|            result.setDouble(tempResult);
  975|  1.63M|        }
  976|       |
  977|  19.3M|        return true;
  978|  19.3M|    }
  979|  29.8M|}
_ZN6icu_7822MultiplierSubstitutionC2EiPKNS_6NFRuleEPKNS_9NFRuleSetERKNS_13UnicodeStringER10UErrorCode:
   84|  46.8k|        : NFSubstitution(_pos, _ruleSet, description, status), divisor(rule->getDivisor()), owningRule(rule)
   85|  46.8k|    {
   86|  46.8k|        if (divisor == 0) {
  ------------------
  |  Branch (86:13): [True: 0, False: 46.8k]
  ------------------
   87|      0|            status = U_PARSE_ERROR;
   88|      0|        }
   89|  46.8k|    }
_ZNK6icu_7821SameValueSubstitution16composeRuleValueEdd:
   63|  73.4k|    virtual double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const override { return newRuleValue; }
_ZNK6icu_7821SameValueSubstitution14calcUpperBoundEd:
   64|   101k|    virtual double calcUpperBound(double oldUpperBound) const override { return oldUpperBound; }
_ZN6icu_7822MultiplierSubstitution10setDivisorEisR10UErrorCode:
   92|  45.1k|    virtual void setDivisor(int32_t radix, int16_t exponent, UErrorCode& status) override {
   93|  45.1k|        divisor = util64_pow(radix, exponent);
   94|       |
   95|  45.1k|        if(divisor == 0) {
  ------------------
  |  Branch (95:12): [True: 0, False: 45.1k]
  ------------------
   96|      0|            status = U_PARSE_ERROR;
   97|      0|        }
   98|  45.1k|    }
_ZNK6icu_7822MultiplierSubstitution16composeRuleValueEdd:
  129|   467k|    virtual double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const override {
  130|   467k|        return newRuleValue * divisor;
  131|   467k|    }
_ZNK6icu_7822MultiplierSubstitution14calcUpperBoundEd:
  133|  2.88M|    virtual double calcUpperBound(double /*oldUpperBound*/) const override { return static_cast<double>(divisor); }
_ZN6icu_7819ModulusSubstitution10setDivisorEisR10UErrorCode:
  156|  75.3k|    virtual void setDivisor(int32_t radix, int16_t exponent, UErrorCode& status) override {
  157|  75.3k|        divisor = util64_pow(radix, exponent);
  158|       |
  159|  75.3k|        if (divisor == 0) {
  ------------------
  |  Branch (159:13): [True: 0, False: 75.3k]
  ------------------
  160|      0|            status = U_PARSE_ERROR;
  161|      0|        }
  162|  75.3k|    }
_ZNK6icu_7819ModulusSubstitution16composeRuleValueEdd:
  181|  3.21M|    virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const override {
  182|  3.21M|        return oldRuleValue - uprv_fmod(oldRuleValue, static_cast<double>(divisor)) + newRuleValue;
  ------------------
  |  | 1502|  3.21M|#define uprv_fmod U_ICU_ENTRY_POINT_RENAME(uprv_fmod)
  |  |  ------------------
  |  |  |  |  123|  3.21M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  3.21M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  3.21M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  183|  3.21M|    }
_ZNK6icu_7819ModulusSubstitution14calcUpperBoundEd:
  185|  10.4M|    virtual double calcUpperBound(double /*oldUpperBound*/) const override { return static_cast<double>(divisor); }

_ZNK6icu_7814NFSubstitution6getPosEv:
  231|  35.1M|    int32_t getPos() const { return pos; }

_ZN6icu_786number4impl13TokenConsumerD2Ev:
   16|   159k|TokenConsumer::~TokenConsumer() = default;
_ZN6icu_786number4impl10AffixUtils14estimateLengthERKNS_13UnicodeStringER10UErrorCode:
   19|  4.24k|int32_t AffixUtils::estimateLength(const UnicodeString &patternString, UErrorCode &status) {
   20|  4.24k|    AffixPatternState state = STATE_BASE;
   21|  4.24k|    int32_t offset = 0;
   22|  4.24k|    int32_t length = 0;
   23|  2.28M|    for (; offset < patternString.length();) {
  ------------------
  |  Branch (23:12): [True: 2.27M, False: 4.24k]
  ------------------
   24|  2.27M|        UChar32 cp = patternString.char32At(offset);
   25|       |
   26|  2.27M|        switch (state) {
   27|  2.26M|            case STATE_BASE:
  ------------------
  |  Branch (27:13): [True: 2.26M, False: 11.8k]
  ------------------
   28|  2.26M|                if (cp == u'\'') {
  ------------------
  |  Branch (28:21): [True: 172, False: 2.26M]
  ------------------
   29|       |                    // First quote
   30|    172|                    state = STATE_FIRST_QUOTE;
   31|  2.26M|                } else {
   32|       |                    // Unquoted symbol
   33|  2.26M|                    length++;
   34|  2.26M|                }
   35|  2.26M|                break;
   36|    172|            case STATE_FIRST_QUOTE:
  ------------------
  |  Branch (36:13): [True: 172, False: 2.27M]
  ------------------
   37|    172|                if (cp == u'\'') {
  ------------------
  |  Branch (37:21): [True: 109, False: 63]
  ------------------
   38|       |                    // Repeated quote
   39|    109|                    length++;
   40|    109|                    state = STATE_BASE;
   41|    109|                } else {
   42|       |                    // Quoted code point
   43|     63|                    length++;
   44|     63|                    state = STATE_INSIDE_QUOTE;
   45|     63|                }
   46|    172|                break;
   47|  7.71k|            case STATE_INSIDE_QUOTE:
  ------------------
  |  Branch (47:13): [True: 7.71k, False: 2.27M]
  ------------------
   48|  7.71k|                if (cp == u'\'') {
  ------------------
  |  Branch (48:21): [True: 477, False: 7.23k]
  ------------------
   49|       |                    // End of quoted sequence
   50|    477|                    state = STATE_AFTER_QUOTE;
   51|  7.23k|                } else {
   52|       |                    // Quoted code point
   53|  7.23k|                    length++;
   54|  7.23k|                }
   55|  7.71k|                break;
   56|  4.00k|            case STATE_AFTER_QUOTE:
  ------------------
  |  Branch (56:13): [True: 4.00k, False: 2.27M]
  ------------------
   57|  4.00k|                if (cp == u'\'') {
  ------------------
  |  Branch (57:21): [True: 414, False: 3.59k]
  ------------------
   58|       |                    // Double quote inside of quoted sequence
   59|    414|                    length++;
   60|    414|                    state = STATE_INSIDE_QUOTE;
   61|  3.59k|                } else {
   62|       |                    // Unquoted symbol
   63|  3.59k|                    length++;
   64|  3.59k|                }
   65|  4.00k|                break;
   66|      0|            default:
  ------------------
  |  Branch (66:13): [True: 0, False: 2.27M]
  ------------------
   67|      0|                UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
   68|  2.27M|        }
   69|       |
   70|  2.27M|        offset += U16_LENGTH(cp);
  ------------------
  |  |  141|  2.27M|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 2.27M, False: 81]
  |  |  ------------------
  ------------------
   71|  2.27M|    }
   72|       |
   73|  4.24k|    switch (state) {
   74|      0|        case STATE_FIRST_QUOTE:
  ------------------
  |  Branch (74:9): [True: 0, False: 4.24k]
  ------------------
   75|      0|        case STATE_INSIDE_QUOTE:
  ------------------
  |  Branch (75:9): [True: 0, False: 4.24k]
  ------------------
   76|      0|            status = U_ILLEGAL_ARGUMENT_ERROR;
   77|      0|            break;
   78|  4.24k|        default:
  ------------------
  |  Branch (78:9): [True: 4.24k, False: 0]
  ------------------
   79|  4.24k|            break;
   80|  4.24k|    }
   81|       |
   82|  4.24k|    return length;
   83|  4.24k|}
_ZN6icu_786number4impl10AffixUtils6escapeERKNS_13UnicodeStringE:
   85|   996k|UnicodeString AffixUtils::escape(const UnicodeString &input) {
   86|   996k|    AffixPatternState state = STATE_BASE;
   87|   996k|    int32_t offset = 0;
   88|   996k|    UnicodeString output;
   89|   996k|    for (; offset < input.length();) {
  ------------------
  |  Branch (89:12): [True: 0, False: 996k]
  ------------------
   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|   996k|    if (state == STATE_INSIDE_QUOTE) {
  ------------------
  |  Branch (124:9): [True: 0, False: 996k]
  ------------------
  125|      0|        output.append(u'\'');
  126|      0|    }
  127|       |
  128|   996k|    return output;
  129|   996k|}
_ZN6icu_786number4impl10AffixUtils15getFieldForTypeENS1_16AffixPatternTypeE:
  131|  72.3k|Field AffixUtils::getFieldForType(AffixPatternType type) {
  132|  72.3k|    switch (type) {
  133|  8.04k|        case TYPE_MINUS_SIGN:
  ------------------
  |  Branch (133:9): [True: 8.04k, False: 64.3k]
  ------------------
  134|  8.04k|            return {UFIELD_CATEGORY_NUMBER, UNUM_SIGN_FIELD};
  135|  4.80k|        case TYPE_PLUS_SIGN:
  ------------------
  |  Branch (135:9): [True: 4.80k, False: 67.5k]
  ------------------
  136|  4.80k|            return {UFIELD_CATEGORY_NUMBER, UNUM_SIGN_FIELD};
  137|    469|        case TYPE_APPROXIMATELY_SIGN:
  ------------------
  |  Branch (137:9): [True: 469, False: 71.9k]
  ------------------
  138|    469|            return {UFIELD_CATEGORY_NUMBER, UNUM_APPROXIMATELY_SIGN_FIELD};
  139|  28.6k|        case TYPE_PERCENT:
  ------------------
  |  Branch (139:9): [True: 28.6k, False: 43.7k]
  ------------------
  140|  28.6k|            return {UFIELD_CATEGORY_NUMBER, UNUM_PERCENT_FIELD};
  141|    903|        case TYPE_PERMILLE:
  ------------------
  |  Branch (141:9): [True: 903, False: 71.4k]
  ------------------
  142|    903|            return {UFIELD_CATEGORY_NUMBER, UNUM_PERMILL_FIELD};
  143|  28.4k|        case TYPE_CURRENCY_SINGLE:
  ------------------
  |  Branch (143:9): [True: 28.4k, False: 43.9k]
  ------------------
  144|  28.4k|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  145|    839|        case TYPE_CURRENCY_DOUBLE:
  ------------------
  |  Branch (145:9): [True: 839, False: 71.5k]
  ------------------
  146|    839|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  147|    152|        case TYPE_CURRENCY_TRIPLE:
  ------------------
  |  Branch (147:9): [True: 152, False: 72.2k]
  ------------------
  148|    152|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  149|     56|        case TYPE_CURRENCY_QUAD:
  ------------------
  |  Branch (149:9): [True: 56, False: 72.3k]
  ------------------
  150|     56|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  151|     42|        case TYPE_CURRENCY_QUINT:
  ------------------
  |  Branch (151:9): [True: 42, False: 72.3k]
  ------------------
  152|     42|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  153|      0|        case TYPE_CURRENCY_OVERFLOW:
  ------------------
  |  Branch (153:9): [True: 0, False: 72.3k]
  ------------------
  154|      0|            return {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD};
  155|      0|        default:
  ------------------
  |  Branch (155:9): [True: 0, False: 72.3k]
  ------------------
  156|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  157|  72.3k|    }
  158|  72.3k|}
_ZN6icu_786number4impl10AffixUtils12containsTypeERKNS_13UnicodeStringENS1_16AffixPatternTypeER10UErrorCode:
  204|  4.10k|AffixUtils::containsType(const UnicodeString &affixPattern, AffixPatternType type, UErrorCode &status) {
  205|  4.10k|    if (affixPattern.length() == 0) {
  ------------------
  |  Branch (205:9): [True: 942, False: 3.16k]
  ------------------
  206|    942|        return false;
  207|    942|    }
  208|  3.16k|    AffixTag tag;
  209|  7.41M|    while (hasNext(tag, affixPattern)) {
  ------------------
  |  Branch (209:12): [True: 7.41M, False: 1.44k]
  ------------------
  210|  7.41M|        tag = nextToken(tag, affixPattern, status);
  211|  7.41M|        if (U_FAILURE(status)) { return false; }
  ------------------
  |  Branch (211:13): [True: 0, False: 7.41M]
  ------------------
  212|  7.41M|        if (tag.type == type) {
  ------------------
  |  Branch (212:13): [True: 1.72k, False: 7.41M]
  ------------------
  213|  1.72k|            return true;
  214|  1.72k|        }
  215|  7.41M|    }
  216|  1.44k|    return false;
  217|  3.16k|}
_ZN6icu_786number4impl10AffixUtils18hasCurrencySymbolsERKNS_13UnicodeStringER10UErrorCode:
  219|   926k|bool AffixUtils::hasCurrencySymbols(const UnicodeString &affixPattern, UErrorCode &status) {
  220|   926k|    if (affixPattern.length() == 0) {
  ------------------
  |  Branch (220:9): [True: 853k, False: 72.9k]
  ------------------
  221|   853k|        return false;
  222|   853k|    }
  223|  72.9k|    AffixTag tag;
  224|  70.2M|    while (hasNext(tag, affixPattern)) {
  ------------------
  |  Branch (224:12): [True: 70.1M, False: 43.4k]
  ------------------
  225|  70.1M|        tag = nextToken(tag, affixPattern, status);
  226|  70.1M|        if (U_FAILURE(status)) { return false; }
  ------------------
  |  Branch (226:13): [True: 0, False: 70.1M]
  ------------------
  227|  70.1M|        if (tag.type < 0 && getFieldForType(tag.type) == Field(UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD)) {
  ------------------
  |  Branch (227:13): [True: 72.3k, False: 70.1M]
  |  Branch (227:13): [True: 29.4k, False: 70.1M]
  |  Branch (227:29): [True: 29.4k, False: 42.9k]
  ------------------
  228|  29.4k|            return true;
  229|  29.4k|        }
  230|  70.1M|    }
  231|  43.4k|    return false;
  232|  72.9k|}
_ZN6icu_786number4impl10AffixUtils19iterateWithConsumerERKNS_13UnicodeStringERNS1_13TokenConsumerER10UErrorCode:
  268|   159k|                                     UErrorCode& status) {
  269|   159k|    if (affixPattern.length() == 0) {
  ------------------
  |  Branch (269:9): [True: 0, False: 159k]
  ------------------
  270|      0|        return;
  271|      0|    }
  272|   159k|    AffixTag tag;
  273|  66.9M|    while (hasNext(tag, affixPattern)) {
  ------------------
  |  Branch (273:12): [True: 66.7M, False: 159k]
  ------------------
  274|  66.7M|        tag = nextToken(tag, affixPattern, status);
  275|  66.7M|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (275:13): [True: 0, False: 66.7M]
  ------------------
  276|  66.7M|        consumer.consumeToken(tag.type, tag.codePoint, status);
  277|  66.7M|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (277:13): [True: 0, False: 66.7M]
  ------------------
  278|  66.7M|    }
  279|   159k|}
_ZN6icu_786number4impl10AffixUtils9nextTokenENS1_8AffixTagERKNS_13UnicodeStringER10UErrorCode:
  281|   144M|AffixTag AffixUtils::nextToken(AffixTag tag, const UnicodeString &patternString, UErrorCode &status) {
  282|   144M|    int32_t offset = tag.offset;
  283|   144M|    int32_t state = tag.state;
  284|   145M|    for (; offset < patternString.length();) {
  ------------------
  |  Branch (284:12): [True: 145M, False: 39.7k]
  ------------------
  285|   145M|        UChar32 cp = patternString.char32At(offset);
  286|   145M|        int32_t count = U16_LENGTH(cp);
  ------------------
  |  |  141|   145M|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 145M, False: 16.6k]
  |  |  ------------------
  ------------------
  287|       |
  288|   145M|        switch (state) {
  289|   139M|            case STATE_BASE:
  ------------------
  |  Branch (289:13): [True: 139M, False: 5.46M]
  ------------------
  290|   139M|                switch (cp) {
  291|   322k|                    case u'\'':
  ------------------
  |  Branch (291:21): [True: 322k, False: 139M]
  ------------------
  292|   322k|                        state = STATE_FIRST_QUOTE;
  293|   322k|                        offset += count;
  294|       |                        // continue to the next code point
  295|   322k|                        break;
  296|   118k|                    case u'-':
  ------------------
  |  Branch (296:21): [True: 118k, False: 139M]
  ------------------
  297|   118k|                        return makeTag(offset + count, TYPE_MINUS_SIGN, STATE_BASE, 0);
  298|  10.2k|                    case u'+':
  ------------------
  |  Branch (298:21): [True: 10.2k, False: 139M]
  ------------------
  299|  10.2k|                        return makeTag(offset + count, TYPE_PLUS_SIGN, STATE_BASE, 0);
  300|    469|                    case u'~':
  ------------------
  |  Branch (300:21): [True: 469, False: 139M]
  ------------------
  301|    469|                        return makeTag(offset + count, TYPE_APPROXIMATELY_SIGN, STATE_BASE, 0);
  302|  58.7k|                    case u'%':
  ------------------
  |  Branch (302:21): [True: 58.7k, False: 139M]
  ------------------
  303|  58.7k|                        return makeTag(offset + count, TYPE_PERCENT, STATE_BASE, 0);
  304|  1.79k|                    case u'‰':
  ------------------
  |  Branch (304:21): [True: 1.79k, False: 139M]
  ------------------
  305|  1.79k|                        return makeTag(offset + count, TYPE_PERMILLE, STATE_BASE, 0);
  306|  73.3k|                    case u'¤':
  ------------------
  |  Branch (306:21): [True: 73.3k, False: 139M]
  ------------------
  307|  73.3k|                        state = STATE_FIRST_CURR;
  308|  73.3k|                        offset += count;
  309|       |                        // continue to the next code point
  310|  73.3k|                        break;
  311|   139M|                    default:
  ------------------
  |  Branch (311:21): [True: 139M, False: 585k]
  ------------------
  312|   139M|                        return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
  313|   139M|                }
  314|   395k|                break;
  315|   395k|            case STATE_FIRST_QUOTE:
  ------------------
  |  Branch (315:13): [True: 322k, False: 144M]
  ------------------
  316|   322k|                if (cp == u'\'') {
  ------------------
  |  Branch (316:21): [True: 265k, False: 57.2k]
  ------------------
  317|   265k|                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
  318|   265k|                } else {
  319|  57.2k|                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
  320|  57.2k|                }
  321|  4.76M|            case STATE_INSIDE_QUOTE:
  ------------------
  |  Branch (321:13): [True: 4.76M, False: 140M]
  ------------------
  322|  4.76M|                if (cp == u'\'') {
  ------------------
  |  Branch (322:21): [True: 328k, False: 4.43M]
  ------------------
  323|   328k|                    state = STATE_AFTER_QUOTE;
  324|   328k|                    offset += count;
  325|       |                    // continue to the next code point
  326|   328k|                    break;
  327|  4.43M|                } else {
  328|  4.43M|                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
  329|  4.43M|                }
  330|   328k|            case STATE_AFTER_QUOTE:
  ------------------
  |  Branch (330:13): [True: 328k, False: 144M]
  ------------------
  331|   328k|                if (cp == u'\'') {
  ------------------
  |  Branch (331:21): [True: 271k, False: 56.8k]
  ------------------
  332|   271k|                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
  333|   271k|                } else {
  334|  56.8k|                    state = STATE_BASE;
  335|       |                    // re-evaluate this code point
  336|  56.8k|                    break;
  337|  56.8k|                }
  338|  34.4k|            case STATE_FIRST_CURR:
  ------------------
  |  Branch (338:13): [True: 34.4k, False: 145M]
  ------------------
  339|  34.4k|                if (cp == u'¤') {
  ------------------
  |  Branch (339:21): [True: 6.43k, False: 28.0k]
  ------------------
  340|  6.43k|                    state = STATE_SECOND_CURR;
  341|  6.43k|                    offset += count;
  342|       |                    // continue to the next code point
  343|  6.43k|                    break;
  344|  28.0k|                } else {
  345|  28.0k|                    return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0);
  346|  28.0k|                }
  347|  5.75k|            case STATE_SECOND_CURR:
  ------------------
  |  Branch (347:13): [True: 5.75k, False: 145M]
  ------------------
  348|  5.75k|                if (cp == u'¤') {
  ------------------
  |  Branch (348:21): [True: 4.10k, False: 1.65k]
  ------------------
  349|  4.10k|                    state = STATE_THIRD_CURR;
  350|  4.10k|                    offset += count;
  351|       |                    // continue to the next code point
  352|  4.10k|                    break;
  353|  4.10k|                } else {
  354|  1.65k|                    return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0);
  355|  1.65k|                }
  356|  3.92k|            case STATE_THIRD_CURR:
  ------------------
  |  Branch (356:13): [True: 3.92k, False: 145M]
  ------------------
  357|  3.92k|                if (cp == u'¤') {
  ------------------
  |  Branch (357:21): [True: 1.56k, False: 2.36k]
  ------------------
  358|  1.56k|                    state = STATE_FOURTH_CURR;
  359|  1.56k|                    offset += count;
  360|       |                    // continue to the next code point
  361|  1.56k|                    break;
  362|  2.36k|                } else {
  363|  2.36k|                    return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0);
  364|  2.36k|                }
  365|  1.48k|            case STATE_FOURTH_CURR:
  ------------------
  |  Branch (365:13): [True: 1.48k, False: 145M]
  ------------------
  366|  1.48k|                if (cp == u'¤') {
  ------------------
  |  Branch (366:21): [True: 961, False: 525]
  ------------------
  367|    961|                    state = STATE_FIFTH_CURR;
  368|    961|                    offset += count;
  369|       |                    // continue to the next code point
  370|    961|                    break;
  371|    961|                } else {
  372|    525|                    return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0);
  373|    525|                }
  374|    949|            case STATE_FIFTH_CURR:
  ------------------
  |  Branch (374:13): [True: 949, False: 145M]
  ------------------
  375|    949|                if (cp == u'¤') {
  ------------------
  |  Branch (375:21): [True: 0, False: 949]
  ------------------
  376|      0|                    state = STATE_OVERFLOW_CURR;
  377|      0|                    offset += count;
  378|       |                    // continue to the next code point
  379|      0|                    break;
  380|    949|                } else {
  381|    949|                    return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0);
  382|    949|                }
  383|      0|            case STATE_OVERFLOW_CURR:
  ------------------
  |  Branch (383:13): [True: 0, False: 145M]
  ------------------
  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: 145M]
  ------------------
  392|      0|                UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  393|   145M|        }
  394|   145M|    }
  395|       |    // End of string
  396|  39.7k|    switch (state) {
  397|      0|        case STATE_BASE:
  ------------------
  |  Branch (397:9): [True: 0, False: 39.7k]
  ------------------
  398|       |            // No more tokens in string.
  399|      0|            return {-1};
  400|      0|        case STATE_FIRST_QUOTE:
  ------------------
  |  Branch (400:9): [True: 0, False: 39.7k]
  ------------------
  401|      0|        case STATE_INSIDE_QUOTE:
  ------------------
  |  Branch (401:9): [True: 0, False: 39.7k]
  ------------------
  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: 39.7k]
  ------------------
  406|       |            // No more tokens in string.
  407|      0|            return {-1};
  408|  38.8k|        case STATE_FIRST_CURR:
  ------------------
  |  Branch (408:9): [True: 38.8k, False: 944]
  ------------------
  409|  38.8k|            return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0);
  410|    672|        case STATE_SECOND_CURR:
  ------------------
  |  Branch (410:9): [True: 672, False: 39.0k]
  ------------------
  411|    672|            return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0);
  412|    186|        case STATE_THIRD_CURR:
  ------------------
  |  Branch (412:9): [True: 186, False: 39.5k]
  ------------------
  413|    186|            return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0);
  414|     74|        case STATE_FOURTH_CURR:
  ------------------
  |  Branch (414:9): [True: 74, False: 39.6k]
  ------------------
  415|     74|            return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0);
  416|     12|        case STATE_FIFTH_CURR:
  ------------------
  |  Branch (416:9): [True: 12, False: 39.7k]
  ------------------
  417|     12|            return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0);
  418|      0|        case STATE_OVERFLOW_CURR:
  ------------------
  |  Branch (418:9): [True: 0, False: 39.7k]
  ------------------
  419|      0|            return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
  420|      0|        default:
  ------------------
  |  Branch (420:9): [True: 0, False: 39.7k]
  ------------------
  421|      0|            UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  422|  39.7k|    }
  423|  39.7k|}
_ZN6icu_786number4impl10AffixUtils7hasNextERKNS1_8AffixTagERKNS_13UnicodeStringE:
  425|   144M|bool AffixUtils::hasNext(const AffixTag &tag, const UnicodeString &string) {
  426|       |    // First check for the {-1} and default initializer syntax.
  427|   144M|    if (tag.offset < 0) {
  ------------------
  |  Branch (427:9): [True: 0, False: 144M]
  ------------------
  428|      0|        return false;
  429|   144M|    } else if (tag.offset == 0) {
  ------------------
  |  Branch (429:16): [True: 235k, False: 144M]
  ------------------
  430|   235k|        return string.length() > 0;
  431|   235k|    }
  432|       |    // The rest of the fields are safe to use now.
  433|       |    // Special case: the last character in string is an end quote.
  434|   144M|    if (tag.state == STATE_INSIDE_QUOTE && tag.offset == string.length() - 1 &&
  ------------------
  |  Branch (434:9): [True: 4.76M, False: 139M]
  |  Branch (434:44): [True: 411, False: 4.76M]
  ------------------
  435|   144M|        string.charAt(tag.offset) == u'\'') {
  ------------------
  |  Branch (435:9): [True: 411, False: 0]
  ------------------
  436|    411|        return false;
  437|   144M|    } else if (tag.state != STATE_BASE) {
  ------------------
  |  Branch (437:16): [True: 4.76M, False: 139M]
  ------------------
  438|  4.76M|        return true;
  439|   139M|    } else {
  440|   139M|        return tag.offset < string.length();
  441|   139M|    }
  442|   144M|}

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

_ZN6icu_786number4impl15CurrencySymbolsC2ENS_12CurrencyUnitERKNS_6LocaleER10UErrorCode:
   21|   102k|        : fCurrency(currency), fLocaleName(locale.getName(), status) {
   22|   102k|    fCurrencySymbol.setToBogus();
   23|   102k|    fIntlCurrencySymbol.setToBogus();
   24|   102k|}
_ZN6icu_786number4impl15CurrencySymbolsC2ENS_12CurrencyUnitERKNS_6LocaleERKNS_20DecimalFormatSymbolsER10UErrorCode:
   28|   102k|        : CurrencySymbols(currency, locale, status) {
   29|       |    // If either of the overrides is present, save it in the local UnicodeString.
   30|   102k|    if (symbols.isCustomCurrencySymbol()) {
  ------------------
  |  Branch (30:9): [True: 0, False: 102k]
  ------------------
   31|      0|        fCurrencySymbol = symbols.getConstSymbol(DecimalFormatSymbols::kCurrencySymbol);
   32|      0|    }
   33|   102k|    if (symbols.isCustomIntlCurrencySymbol()) {
  ------------------
  |  Branch (33:9): [True: 0, False: 102k]
  ------------------
   34|      0|        fIntlCurrencySymbol = symbols.getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol);
   35|      0|    }
   36|   102k|}
_ZNK6icu_786number4impl15CurrencySymbols10getIsoCodeEv:
   38|  55.4k|const char16_t* CurrencySymbols::getIsoCode() const {
   39|  55.4k|    return fCurrency.getISOCurrency();
   40|  55.4k|}
_ZNK6icu_786number4impl15CurrencySymbols17getCurrencySymbolER10UErrorCode:
   57|  55.4k|UnicodeString CurrencySymbols::getCurrencySymbol(UErrorCode& status) const {
   58|  55.4k|    if (!fCurrencySymbol.isBogus()) {
  ------------------
  |  Branch (58:9): [True: 0, False: 55.4k]
  ------------------
   59|      0|        return fCurrencySymbol;
   60|      0|    }
   61|  55.4k|    return loadSymbol(UCURR_SYMBOL_NAME, status);
   62|  55.4k|}
_ZNK6icu_786number4impl15CurrencySymbols10loadSymbolE14UCurrNameStyleR10UErrorCode:
   64|  55.4k|UnicodeString CurrencySymbols::loadSymbol(UCurrNameStyle selector, UErrorCode& status) const {
   65|  55.4k|    const char16_t* isoCode = fCurrency.getISOCurrency();
   66|  55.4k|    int32_t symbolLen = 0;
   67|  55.4k|    const char16_t* symbol = ucurr_getName(
  ------------------
  |  |  837|  55.4k|#define ucurr_getName U_ICU_ENTRY_POINT_RENAME(ucurr_getName)
  |  |  ------------------
  |  |  |  |  123|  55.4k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  55.4k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  55.4k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   68|  55.4k|            isoCode,
   69|  55.4k|            fLocaleName.data(),
   70|  55.4k|            selector,
   71|  55.4k|            nullptr /* isChoiceFormat */,
   72|  55.4k|            &symbolLen,
   73|  55.4k|            &status);
   74|       |    // If given an unknown currency, ucurr_getName returns the input string, which we can't alias safely!
   75|       |    // Otherwise, symbol points to a resource bundle, and we can use readonly-aliasing constructor.
   76|  55.4k|    if (symbol == isoCode) {
  ------------------
  |  Branch (76:9): [True: 696, False: 54.7k]
  ------------------
   77|    696|        return UnicodeString(isoCode, 3);
   78|  54.7k|    } else {
   79|  54.7k|        return UnicodeString(true, symbol, symbolLen);
   80|  54.7k|    }
   81|  55.4k|}
_ZNK6icu_786number4impl15CurrencySymbols21getIntlCurrencySymbolER10UErrorCode:
   83|  55.4k|UnicodeString CurrencySymbols::getIntlCurrencySymbol(UErrorCode&) const {
   84|  55.4k|    if (!fIntlCurrencySymbol.isBogus()) {
  ------------------
  |  Branch (84:9): [True: 0, False: 55.4k]
  ------------------
   85|      0|        return fIntlCurrencySymbol;
   86|      0|    }
   87|       |    // Note: Not safe to use readonly-aliasing constructor here because the buffer belongs to this object,
   88|       |    // which could be destructed or moved during the lifetime of the return value.
   89|  55.4k|    return UnicodeString(fCurrency.getISOCurrency(), 3);
   90|  55.4k|}
_ZNK6icu_786number4impl15CurrencySymbols13getPluralNameENS_14StandardPlural4FormER10UErrorCode:
   92|   443k|UnicodeString CurrencySymbols::getPluralName(StandardPlural::Form plural, UErrorCode& status) const {
   93|   443k|    const char16_t* isoCode = fCurrency.getISOCurrency();
   94|   443k|    int32_t symbolLen = 0;
   95|   443k|    const char16_t* symbol = ucurr_getPluralName(
  ------------------
  |  |  839|   443k|#define ucurr_getPluralName U_ICU_ENTRY_POINT_RENAME(ucurr_getPluralName)
  |  |  ------------------
  |  |  |  |  123|   443k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   443k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   443k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   96|   443k|            isoCode,
   97|   443k|            fLocaleName.data(),
   98|   443k|            nullptr /* isChoiceFormat */,
   99|   443k|            StandardPlural::getKeyword(plural),
  100|   443k|            &symbolLen,
  101|   443k|            &status);
  102|       |    // If given an unknown currency, ucurr_getName returns the input string, which we can't alias safely!
  103|       |    // Otherwise, symbol points to a resource bundle, and we can use readonly-aliasing constructor.
  104|   443k|    if (symbol == isoCode) {
  ------------------
  |  Branch (104:9): [True: 5.56k, False: 438k]
  ------------------
  105|  5.56k|        return UnicodeString(isoCode, 3);
  106|   438k|    } else {
  107|   438k|        return UnicodeString(true, symbol, symbolLen);
  108|   438k|    }
  109|   443k|}
_ZNK6icu_786number4impl15CurrencySymbols22hasEmptyCurrencySymbolEv:
  111|  41.5k|bool CurrencySymbols::hasEmptyCurrencySymbol() const {
  112|  41.5k|    return !fCurrencySymbol.isBogus() && fCurrencySymbol.isEmpty();
  ------------------
  |  Branch (112:12): [True: 0, False: 41.5k]
  |  Branch (112:42): [True: 0, False: 0]
  ------------------
  113|  41.5k|}
_ZN6icu_786number4impl15resolveCurrencyERKNS1_23DecimalFormatPropertiesERKNS_6LocaleER10UErrorCode:
  118|   118k|                                   UErrorCode& status) {
  119|   118k|    if (!properties.currency.isNull()) {
  ------------------
  |  Branch (119:9): [True: 0, False: 118k]
  ------------------
  120|      0|        return properties.currency.getNoError();
  121|   118k|    } else {
  122|   118k|        UErrorCode localStatus = U_ZERO_ERROR;
  123|   118k|        char16_t buf[4] = {};
  124|   118k|        ucurr_forLocale(locale.getName(), buf, 4, &localStatus);
  ------------------
  |  |  832|   118k|#define ucurr_forLocale U_ICU_ENTRY_POINT_RENAME(ucurr_forLocale)
  |  |  ------------------
  |  |  |  |  123|   118k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   118k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   118k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  125|   118k|        if (U_SUCCESS(localStatus)) {
  ------------------
  |  Branch (125:13): [True: 83.6k, False: 34.7k]
  ------------------
  126|  83.6k|            return CurrencyUnit(buf, status);
  127|  83.6k|        } else {
  128|       |            // Default currency (XXX)
  129|  34.7k|            return {};
  130|  34.7k|        }
  131|   118k|    }
  132|   118k|}

_ZN6icu_7813IFixedDecimalD2Ev:
   73|  12.4M|icu::IFixedDecimal::~IFixedDecimal() = default;
_ZN6icu_786number4impl15DecimalQuantityC2Ev:
   75|  10.5M|DecimalQuantity::DecimalQuantity() {
   76|  10.5M|    setBcdToZero();
   77|  10.5M|    flags = 0;
   78|  10.5M|}
_ZN6icu_786number4impl15DecimalQuantityD2Ev:
   80|  12.4M|DecimalQuantity::~DecimalQuantity() {
   81|  12.4M|    if (usingBytes) {
  ------------------
  |  Branch (81:9): [True: 326k, False: 12.1M]
  ------------------
   82|   326k|        uprv_free(fBCD.bcdBytes.ptr);
  ------------------
  |  | 1503|   326k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|   326k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   326k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   326k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   83|   326k|        fBCD.bcdBytes.ptr = nullptr;
   84|   326k|        usingBytes = false;
   85|   326k|    }
   86|  12.4M|}
_ZN6icu_786number4impl15DecimalQuantityC2ERKS2_:
   88|  1.90M|DecimalQuantity::DecimalQuantity(const DecimalQuantity &other) {
   89|  1.90M|    *this = other;
   90|  1.90M|}
_ZN6icu_786number4impl15DecimalQuantityaSERKS2_:
   96|  4.02M|DecimalQuantity &DecimalQuantity::operator=(const DecimalQuantity &other) {
   97|  4.02M|    if (this == &other) {
  ------------------
  |  Branch (97:9): [True: 0, False: 4.02M]
  ------------------
   98|      0|        return *this;
   99|      0|    }
  100|  4.02M|    copyBcdFrom(other);
  101|  4.02M|    copyFieldsFrom(other);
  102|  4.02M|    return *this;
  103|  4.02M|}
_ZN6icu_786number4impl15DecimalQuantity14copyFieldsFromERKS2_:
  114|  4.02M|void DecimalQuantity::copyFieldsFrom(const DecimalQuantity& other) {
  115|  4.02M|    bogus = other.bogus;
  116|  4.02M|    lReqPos = other.lReqPos;
  117|  4.02M|    rReqPos = other.rReqPos;
  118|  4.02M|    scale = other.scale;
  119|  4.02M|    precision = other.precision;
  120|  4.02M|    flags = other.flags;
  121|  4.02M|    origDouble = other.origDouble;
  122|  4.02M|    origDelta = other.origDelta;
  123|  4.02M|    isApproximate = other.isApproximate;
  124|  4.02M|    exponent = other.exponent;
  125|  4.02M|}
_ZN6icu_786number4impl15DecimalQuantity5clearEv:
  127|  2.36M|void DecimalQuantity::clear() {
  128|  2.36M|    lReqPos = 0;
  129|  2.36M|    rReqPos = 0;
  130|  2.36M|    flags = 0;
  131|  2.36M|    setBcdToZero(); // sets scale, precision, hasDouble, origDouble, origDelta, and BCD data
  132|  2.36M|}
_ZN6icu_786number4impl15DecimalQuantity6negateEv:
  243|  32.8k|void DecimalQuantity::negate() {
  244|  32.8k|    flags ^= NEGATIVE_FLAG;
  245|  32.8k|}
_ZNK6icu_786number4impl15DecimalQuantity12getMagnitudeEv:
  247|  1.86M|int32_t DecimalQuantity::getMagnitude() const {
  248|  1.86M|    U_ASSERT(precision != 0);
  ------------------
  |  |   35|  1.86M|#   define U_ASSERT(exp) (void)0
  ------------------
  249|  1.86M|    return scale + precision - 1;
  250|  1.86M|}
_ZN6icu_786number4impl15DecimalQuantity15adjustMagnitudeEi:
  252|  2.72M|bool DecimalQuantity::adjustMagnitude(int32_t delta) {
  253|  2.72M|    if (precision != 0) {
  ------------------
  |  Branch (253:9): [True: 2.47M, False: 253k]
  ------------------
  254|       |        // i.e., scale += delta; origDelta += delta
  255|  2.47M|        bool overflow = uprv_add32_overflow(scale, delta, &scale);
  ------------------
  |  | 1394|  2.47M|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|  2.47M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.47M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.47M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|  2.47M|        overflow = uprv_add32_overflow(origDelta, delta, &origDelta) || overflow;
  ------------------
  |  | 1394|  2.47M|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|  2.47M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.47M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.47M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (256:20): [True: 6, False: 2.47M]
  |  Branch (256:73): [True: 5, False: 2.47M]
  ------------------
  257|       |        // Make sure that precision + scale won't overflow, either
  258|  2.47M|        int32_t dummy;
  259|  2.47M|        overflow = overflow || uprv_add32_overflow(scale, precision, &dummy);
  ------------------
  |  | 1394|  2.47M|#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
  |  |  ------------------
  |  |  |  |  123|  2.47M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.47M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.47M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (259:20): [True: 11, False: 2.47M]
  |  Branch (259:32): [True: 4, False: 2.47M]
  ------------------
  260|  2.47M|        return overflow;
  261|  2.47M|    }
  262|   253k|    return false;
  263|  2.72M|}
_ZN6icu_786number4impl15DecimalQuantity17adjustToZeroScaleEv:
  265|  5.71k|int32_t DecimalQuantity::adjustToZeroScale() {
  266|  5.71k|    int32_t retval = scale;
  267|  5.71k|    scale = 0;
  268|  5.71k|    return retval;
  269|  5.71k|}
_ZNK6icu_786number4impl15DecimalQuantity8getDigitEi:
  335|  3.00k|int8_t DecimalQuantity::getDigit(int32_t magnitude) const {
  336|       |    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
  337|       |    // See the comment at the top of this file explaining the "isApproximate" field.
  338|  3.00k|    U_ASSERT(!isApproximate);
  ------------------
  |  |   35|  3.00k|#   define U_ASSERT(exp) (void)0
  ------------------
  339|       |
  340|  3.00k|    return getDigitPos(magnitude - scale);
  341|  3.00k|}
_ZNK6icu_786number4impl15DecimalQuantity10isNegativeEv:
  353|  2.33M|bool DecimalQuantity::isNegative() const {
  354|  2.33M|    return (flags & NEGATIVE_FLAG) != 0;
  355|  2.33M|}
_ZNK6icu_786number4impl15DecimalQuantity10isInfiniteEv:
  371|  2.32M|bool DecimalQuantity::isInfinite() const {
  372|  2.32M|    return (flags & INFINITY_FLAG) != 0;
  373|  2.32M|}
_ZNK6icu_786number4impl15DecimalQuantity5isNaNEv:
  375|  2.32M|bool DecimalQuantity::isNaN() const {
  376|  2.32M|    return (flags & NAN_FLAG) != 0;
  377|  2.32M|}
_ZNK6icu_786number4impl15DecimalQuantity9isZeroishEv:
  379|  4.56M|bool DecimalQuantity::isZeroish() const {
  380|  4.56M|    return precision == 0;
  381|  4.56M|}
_ZN6icu_786number4impl15DecimalQuantity9setToLongEl:
  408|  5.68k|DecimalQuantity &DecimalQuantity::setToLong(int64_t n) {
  409|  5.68k|    setBcdToZero();
  410|  5.68k|    flags = 0;
  411|  5.68k|    if (n < 0 && n > INT64_MIN) {
  ------------------
  |  Branch (411:9): [True: 0, False: 5.68k]
  |  Branch (411:18): [True: 0, False: 0]
  ------------------
  412|      0|        flags |= NEGATIVE_FLAG;
  413|      0|        n = -n;
  414|      0|    }
  415|  5.68k|    if (n != 0) {
  ------------------
  |  Branch (415:9): [True: 5.66k, False: 21]
  ------------------
  416|  5.66k|        _setToLong(n);
  417|  5.66k|        compact();
  418|  5.66k|    }
  419|  5.68k|    return *this;
  420|  5.68k|}
_ZN6icu_786number4impl15DecimalQuantity10_setToLongEl:
  422|  11.3k|void DecimalQuantity::_setToLong(int64_t n) {
  423|  11.3k|    if (n == INT64_MIN) {
  ------------------
  |  Branch (423:9): [True: 0, False: 11.3k]
  ------------------
  424|      0|        DecNum decnum;
  425|      0|        UErrorCode localStatus = U_ZERO_ERROR;
  426|      0|        decnum.setTo("9.223372036854775808E+18", localStatus);
  427|      0|        if (U_FAILURE(localStatus)) { return; } // unexpected
  ------------------
  |  Branch (427:13): [True: 0, False: 0]
  ------------------
  428|      0|        flags |= NEGATIVE_FLAG;
  429|      0|        readDecNumberToBcd(decnum);
  430|  11.3k|    } else if (n <= INT32_MAX) {
  ------------------
  |  Branch (430:16): [True: 6.13k, False: 5.22k]
  ------------------
  431|  6.13k|        readIntToBcd(static_cast<int32_t>(n));
  432|  6.13k|    } else {
  433|  5.22k|        readLongToBcd(n);
  434|  5.22k|    }
  435|  11.3k|}
_ZN6icu_786number4impl15DecimalQuantity11setToDoubleEd:
  437|  5.71k|DecimalQuantity &DecimalQuantity::setToDouble(double n) {
  438|  5.71k|    setBcdToZero();
  439|  5.71k|    flags = 0;
  440|       |    // signbit() from <math.h> handles +0.0 vs -0.0
  441|  5.71k|    if (std::signbit(n)) {
  ------------------
  |  Branch (441:9): [True: 0, False: 5.71k]
  ------------------
  442|      0|        flags |= NEGATIVE_FLAG;
  443|      0|        n = -n;
  444|      0|    }
  445|  5.71k|    if (std::isnan(n) != 0) {
  ------------------
  |  Branch (445:9): [True: 0, False: 5.71k]
  ------------------
  446|      0|        flags |= NAN_FLAG;
  447|  5.71k|    } else if (std::isfinite(n) == 0) {
  ------------------
  |  Branch (447:16): [True: 21, False: 5.69k]
  ------------------
  448|     21|        flags |= INFINITY_FLAG;
  449|  5.69k|    } else if (n != 0) {
  ------------------
  |  Branch (449:16): [True: 5.69k, False: 0]
  ------------------
  450|  5.69k|        _setToDoubleFast(n);
  451|  5.69k|        compact();
  452|  5.69k|    }
  453|  5.71k|    return *this;
  454|  5.71k|}
_ZN6icu_786number4impl15DecimalQuantity16_setToDoubleFastEd:
  456|  5.69k|void DecimalQuantity::_setToDoubleFast(double n) {
  457|  5.69k|    isApproximate = true;
  458|  5.69k|    origDouble = n;
  459|  5.69k|    origDelta = 0;
  460|       |
  461|       |    // Make sure the double is an IEEE 754 double.  If not, fall back to the slow path right now.
  462|       |    // TODO: Make a fast path for other types of doubles.
  463|  5.69k|    if (!std::numeric_limits<double>::is_iec559) {
  ------------------
  |  Branch (463:9): [Folded - Ignored]
  ------------------
  464|      0|        convertToAccurateDouble();
  465|      0|        return;
  466|      0|    }
  467|       |
  468|       |    // To get the bits from the double, use memcpy, which takes care of endianness.
  469|  5.69k|    uint64_t ieeeBits;
  470|  5.69k|    uprv_memcpy(&ieeeBits, &n, sizeof(n));
  ------------------
  |  |   42|  5.69k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  5.69k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  5.69k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  5.69k|    _Pragma("clang diagnostic push") \
  |  |   45|  5.69k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  5.69k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  5.69k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  5.69k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  5.69k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  5.69k|    _Pragma("clang diagnostic pop") \
  |  |   49|  5.69k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  5.69k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  5.69k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  5.69k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  471|  5.69k|    int32_t exponent = static_cast<int32_t>((ieeeBits & 0x7ff0000000000000L) >> 52) - 0x3ff;
  472|       |
  473|       |    // Not all integers can be represented exactly for exponent > 52
  474|  5.69k|    if (exponent <= 52 && static_cast<int64_t>(n) == n) {
  ------------------
  |  Branch (474:9): [True: 3.72k, False: 1.96k]
  |  Branch (474:27): [True: 3.10k, False: 621]
  ------------------
  475|  3.10k|        _setToLong(static_cast<int64_t>(n));
  476|  3.10k|        return;
  477|  3.10k|    }
  478|       |
  479|  2.58k|    if (exponent == -1023 || exponent == 1024) {
  ------------------
  |  Branch (479:9): [True: 0, False: 2.58k]
  |  Branch (479:30): [True: 0, False: 2.58k]
  ------------------
  480|       |        // The extreme values of exponent are special; use slow path.
  481|      0|        convertToAccurateDouble();
  482|      0|        return;
  483|      0|    }
  484|       |
  485|       |    // 3.3219... is log2(10)
  486|  2.58k|    auto fracLength = static_cast<int32_t> ((52 - exponent) / 3.32192809488736234787031942948939017586);
  487|  2.58k|    if (fracLength >= 0) {
  ------------------
  |  Branch (487:9): [True: 733, False: 1.85k]
  ------------------
  488|    733|        int32_t i = fracLength;
  489|       |        // 1e22 is the largest exact double.
  490|    814|        for (; i >= 22; i -= 22) n *= 1e22;
  ------------------
  |  Branch (490:16): [True: 81, False: 733]
  ------------------
  491|    733|        n *= DOUBLE_MULTIPLIERS[i];
  492|  1.85k|    } else {
  493|  1.85k|        int32_t i = fracLength;
  494|       |        // 1e22 is the largest exact double.
  495|  2.42k|        for (; i <= -22; i += 22) n /= 1e22;
  ------------------
  |  Branch (495:16): [True: 570, False: 1.85k]
  ------------------
  496|  1.85k|        n /= DOUBLE_MULTIPLIERS[-i];
  497|  1.85k|    }
  498|  2.58k|    auto result = static_cast<int64_t>(uprv_round(n));
  ------------------
  |  | 1537|  2.58k|#define uprv_round U_ICU_ENTRY_POINT_RENAME(uprv_round)
  |  |  ------------------
  |  |  |  |  123|  2.58k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  2.58k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  2.58k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  499|  2.58k|    if (result != 0) {
  ------------------
  |  Branch (499:9): [True: 2.58k, False: 0]
  ------------------
  500|  2.58k|        _setToLong(result);
  501|  2.58k|        scale -= fracLength;
  502|  2.58k|    }
  503|  2.58k|}
_ZN6icu_786number4impl15DecimalQuantity23convertToAccurateDoubleEv:
  505|  5.69k|void DecimalQuantity::convertToAccurateDouble() {
  506|  5.69k|    U_ASSERT(origDouble != 0);
  ------------------
  |  |   35|  5.69k|#   define U_ASSERT(exp) (void)0
  ------------------
  507|  5.69k|    int32_t delta = origDelta;
  508|       |
  509|       |    // Call the slow oracle function (Double.toString in Java, DoubleToAscii in C++).
  510|  5.69k|    char buffer[DoubleToStringConverter::kBase10MaximalLength + 1];
  511|  5.69k|    bool sign; // unused; always positive
  512|  5.69k|    int32_t length;
  513|  5.69k|    int32_t point;
  514|  5.69k|    DoubleToStringConverter::DoubleToAscii(
  515|  5.69k|        origDouble,
  516|  5.69k|        DoubleToStringConverter::DtoaMode::SHORTEST,
  517|  5.69k|        0,
  518|  5.69k|        buffer,
  519|  5.69k|        sizeof(buffer),
  520|  5.69k|        &sign,
  521|  5.69k|        &length,
  522|  5.69k|        &point
  523|  5.69k|    );
  524|       |
  525|  5.69k|    setBcdToZero();
  526|  5.69k|    readDoubleConversionToBcd(buffer, length, point);
  527|  5.69k|    scale += delta;
  528|  5.69k|    explicitExactDouble = true;
  529|  5.69k|}
_ZNK6icu_786number4impl15DecimalQuantity6toLongEb:
  625|  1.89M|int64_t DecimalQuantity::toLong(bool truncateIfOverflow) const {
  626|       |    // NOTE: Call sites should be guarded by fitsInLong(), like this:
  627|       |    // if (dq.fitsInLong()) { /* use dq.toLong() */ } else { /* use some fallback */ }
  628|       |    // Fallback behavior upon truncateIfOverflow is to truncate at 17 digits.
  629|  1.89M|    uint64_t result = 0L;
  630|  1.89M|    int32_t upperMagnitude = exponent + scale + precision - 1;
  631|  1.89M|    if (truncateIfOverflow) {
  ------------------
  |  Branch (631:9): [True: 0, False: 1.89M]
  ------------------
  632|      0|        upperMagnitude = std::min(upperMagnitude, 17);
  633|      0|    }
  634|  7.77M|    for (int32_t magnitude = upperMagnitude; magnitude >= 0; magnitude--) {
  ------------------
  |  Branch (634:46): [True: 5.88M, False: 1.89M]
  ------------------
  635|  5.88M|        result = result * 10 + getDigitPos(magnitude - scale - exponent);
  636|  5.88M|    }
  637|  1.89M|    if (isNegative()) {
  ------------------
  |  Branch (637:9): [True: 1.48k, False: 1.89M]
  ------------------
  638|  1.48k|        return static_cast<int64_t>(0LL - result); // i.e., -result
  639|  1.48k|    }
  640|  1.89M|    return static_cast<int64_t>(result);
  641|  1.89M|}
_ZNK6icu_786number4impl15DecimalQuantity10fitsInLongEb:
  662|  2.09M|bool DecimalQuantity::fitsInLong(bool ignoreFraction) const {
  663|  2.09M|    if (isInfinite() || isNaN()) {
  ------------------
  |  Branch (663:9): [True: 0, False: 2.09M]
  |  Branch (663:25): [True: 0, False: 2.09M]
  ------------------
  664|      0|        return false;
  665|      0|    }
  666|  2.09M|    if (isZeroish()) {
  ------------------
  |  Branch (666:9): [True: 194k, False: 1.90M]
  ------------------
  667|   194k|        return true;
  668|   194k|    }
  669|  1.90M|    if (exponent + scale < 0 && !ignoreFraction) {
  ------------------
  |  Branch (669:9): [True: 39.9k, False: 1.86M]
  |  Branch (669:33): [True: 39.9k, False: 0]
  ------------------
  670|  39.9k|        return false;
  671|  39.9k|    }
  672|  1.86M|    int magnitude = getMagnitude();
  673|  1.86M|    if (magnitude < 18) {
  ------------------
  |  Branch (673:9): [True: 1.69M, False: 171k]
  ------------------
  674|  1.69M|        return true;
  675|  1.69M|    }
  676|   171k|    if (magnitude > 18) {
  ------------------
  |  Branch (676:9): [True: 169k, False: 1.80k]
  ------------------
  677|   169k|        return false;
  678|   169k|    }
  679|       |    // Hard case: the magnitude is 10^18.
  680|       |    // The largest int64 is: 9,223,372,036,854,775,807
  681|  3.35k|    for (int p = 0; p < precision; p++) {
  ------------------
  |  Branch (681:21): [True: 3.00k, False: 351]
  ------------------
  682|  3.00k|        int8_t digit = getDigit(18 - p);
  683|  3.00k|        static int8_t INT64_BCD[] = { 9, 2, 2, 3, 3, 7, 2, 0, 3, 6, 8, 5, 4, 7, 7, 5, 8, 0, 8 };
  684|  3.00k|        if (digit < INT64_BCD[p]) {
  ------------------
  |  Branch (684:13): [True: 1.16k, False: 1.83k]
  ------------------
  685|  1.16k|            return true;
  686|  1.83k|        } else if (digit > INT64_BCD[p]) {
  ------------------
  |  Branch (686:20): [True: 285, False: 1.55k]
  ------------------
  687|    285|            return false;
  688|    285|        }
  689|  3.00k|    }
  690|       |    // Exactly equal to max long plus one.
  691|    351|    return isNegative();
  692|  1.80k|}
_ZNK6icu_786number4impl15DecimalQuantity8toDoubleEv:
  694|   220k|double DecimalQuantity::toDouble() const {
  695|       |    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
  696|       |    // See the comment in the header file explaining the "isApproximate" field.
  697|   220k|    U_ASSERT(!isApproximate);
  ------------------
  |  |   35|   220k|#   define U_ASSERT(exp) (void)0
  ------------------
  698|       |
  699|   220k|    if (isNaN()) {
  ------------------
  |  Branch (699:9): [True: 0, False: 220k]
  ------------------
  700|      0|        return NAN;
  701|   220k|    } else if (isInfinite()) {
  ------------------
  |  Branch (701:16): [True: 0, False: 220k]
  ------------------
  702|      0|        return isNegative() ? -INFINITY : INFINITY;
  ------------------
  |  Branch (702:16): [True: 0, False: 0]
  ------------------
  703|      0|    }
  704|       |
  705|       |    // We are processing well-formed input, so we don't need any special options to StringToDoubleConverter.
  706|   220k|    StringToDoubleConverter converter(0, 0, 0, "", "");
  707|   220k|    UnicodeString numberString = this->toScientificString();
  708|   220k|    int32_t count;
  709|   220k|    return converter.StringToDouble(
  710|   220k|            reinterpret_cast<const uint16_t*>(numberString.getBuffer()),
  711|   220k|            numberString.length(),
  712|   220k|            &count);
  713|   220k|}
_ZN6icu_786number4impl15DecimalQuantity15roundToInfinityEv:
  954|  5.71k|void DecimalQuantity::roundToInfinity() {
  955|  5.71k|    if (isApproximate) {
  ------------------
  |  Branch (955:9): [True: 5.69k, False: 21]
  ------------------
  956|  5.69k|        convertToAccurateDouble();
  957|  5.69k|    }
  958|  5.71k|}
_ZN6icu_786number4impl15DecimalQuantity11appendDigitEaib:
  960|  88.7M|void DecimalQuantity::appendDigit(int8_t value, int32_t leadingZeros, bool appendAsInteger) {
  961|  88.7M|    U_ASSERT(leadingZeros >= 0);
  ------------------
  |  |   35|  88.7M|#   define U_ASSERT(exp) (void)0
  ------------------
  962|       |
  963|       |    // Zero requires special handling to maintain the invariant that the least-significant digit
  964|       |    // in the BCD is nonzero.
  965|  88.7M|    if (value == 0) {
  ------------------
  |  Branch (965:9): [True: 47.3M, False: 41.3M]
  ------------------
  966|  47.3M|        if (appendAsInteger && precision != 0) {
  ------------------
  |  Branch (966:13): [True: 47.3M, False: 0]
  |  Branch (966:32): [True: 46.6M, False: 734k]
  ------------------
  967|  46.6M|            scale += leadingZeros + 1;
  968|  46.6M|        }
  969|  47.3M|        return;
  970|  47.3M|    }
  971|       |
  972|       |    // Deal with trailing zeros
  973|  41.3M|    if (scale > 0) {
  ------------------
  |  Branch (973:9): [True: 1.14M, False: 40.2M]
  ------------------
  974|  1.14M|        leadingZeros += scale;
  975|  1.14M|        if (appendAsInteger) {
  ------------------
  |  Branch (975:13): [True: 1.14M, False: 24]
  ------------------
  976|  1.14M|            scale = 0;
  977|  1.14M|        }
  978|  1.14M|    }
  979|       |
  980|       |    // Append digit
  981|  41.3M|    shiftLeft(leadingZeros + 1);
  982|  41.3M|    setDigitPos(0, value);
  983|       |
  984|       |    // Fix scale if in integer mode
  985|  41.3M|    if (appendAsInteger) {
  ------------------
  |  Branch (985:9): [True: 40.7M, False: 588k]
  ------------------
  986|  40.7M|        scale += leadingZeros + 1;
  987|  40.7M|    }
  988|  41.3M|}
_ZNK6icu_786number4impl15DecimalQuantity18toScientificStringEv:
 1062|   220k|UnicodeString DecimalQuantity::toScientificString() const {
 1063|   220k|    U_ASSERT(!isApproximate);
  ------------------
  |  |   35|   220k|#   define U_ASSERT(exp) (void)0
  ------------------
 1064|   220k|    UnicodeString result;
 1065|   220k|    if (isNegative()) {
  ------------------
  |  Branch (1065:9): [True: 2.62k, False: 217k]
  ------------------
 1066|  2.62k|        result.append(u'-');
 1067|  2.62k|    }
 1068|   220k|    if (precision == 0) {
  ------------------
  |  Branch (1068:9): [True: 21, False: 220k]
  ------------------
 1069|     21|        result.append(u"0E+0", -1);
 1070|     21|        return result;
 1071|     21|    }
 1072|   220k|    int32_t upperPos = precision - 1;
 1073|   220k|    int32_t lowerPos = 0;
 1074|   220k|    int32_t p = upperPos;
 1075|   220k|    result.append(u'0' + getDigitPos(p));
 1076|   220k|    if ((--p) >= lowerPos) {
  ------------------
  |  Branch (1076:9): [True: 144k, False: 75.8k]
  ------------------
 1077|   144k|        result.append(u'.');
 1078|  30.6M|        for (; p >= lowerPos; p--) {
  ------------------
  |  Branch (1078:16): [True: 30.5M, False: 144k]
  ------------------
 1079|  30.5M|            result.append(u'0' + getDigitPos(p));
 1080|  30.5M|        }
 1081|   144k|    }
 1082|   220k|    result.append(u'E');
 1083|   220k|    int32_t _scale = upperPos + scale + exponent;
 1084|   220k|    if (_scale == INT32_MIN) {
  ------------------
  |  Branch (1084:9): [True: 2, False: 220k]
  ------------------
 1085|      2|        result.append(u"-2147483648");
 1086|      2|        return result;
 1087|   220k|    } else if (_scale < 0) {
  ------------------
  |  Branch (1087:16): [True: 14.3k, False: 205k]
  ------------------
 1088|  14.3k|        _scale *= -1;
 1089|  14.3k|        result.append(u'-');
 1090|   205k|    } else {
 1091|   205k|        result.append(u'+');
 1092|   205k|    }
 1093|   220k|    if (_scale == 0) {
  ------------------
  |  Branch (1093:9): [True: 8.45k, False: 211k]
  ------------------
 1094|  8.45k|        result.append(u'0');
 1095|  8.45k|    }
 1096|   220k|    int32_t insertIndex = result.length();
 1097|  1.11M|    while (_scale > 0) {
  ------------------
  |  Branch (1097:12): [True: 895k, False: 220k]
  ------------------
 1098|   895k|        std::div_t res = std::div(_scale, 10);
 1099|   895k|        result.insert(insertIndex, u'0' + res.rem);
 1100|   895k|        _scale = res.quot;
 1101|   895k|    }
 1102|   220k|    return result;
 1103|   220k|}
_ZNK6icu_786number4impl15DecimalQuantity11getDigitPosEi:
 1110|  36.6M|int8_t DecimalQuantity::getDigitPos(int32_t position) const {
 1111|  36.6M|    if (usingBytes) {
  ------------------
  |  Branch (1111:9): [True: 30.4M, False: 6.24M]
  ------------------
 1112|  30.4M|        if (position < 0 || position >= precision) { return 0; }
  ------------------
  |  Branch (1112:13): [True: 366, False: 30.4M]
  |  Branch (1112:29): [True: 0, False: 30.4M]
  ------------------
 1113|  30.4M|        return fBCD.bcdBytes.ptr[position];
 1114|  30.4M|    } else {
 1115|  6.24M|        if (position < 0 || position >= 16) { return 0; }
  ------------------
  |  Branch (1115:13): [True: 315k, False: 5.93M]
  |  Branch (1115:29): [True: 0, False: 5.93M]
  ------------------
 1116|  5.93M|        return static_cast<int8_t>((fBCD.bcdLong >> (position * 4)) & 0xf);
 1117|  6.24M|    }
 1118|  36.6M|}
_ZN6icu_786number4impl15DecimalQuantity11setDigitPosEia:
 1120|  41.3M|void DecimalQuantity::setDigitPos(int32_t position, int8_t value) {
 1121|  41.3M|    U_ASSERT(position >= 0);
  ------------------
  |  |   35|  41.3M|#   define U_ASSERT(exp) (void)0
  ------------------
 1122|  41.3M|    if (usingBytes) {
  ------------------
  |  Branch (1122:9): [True: 33.5M, False: 7.77M]
  ------------------
 1123|  33.5M|        ensureCapacity(position + 1);
 1124|  33.5M|        fBCD.bcdBytes.ptr[position] = value;
 1125|  33.5M|    } else if (position >= 16) {
  ------------------
  |  Branch (1125:16): [True: 0, False: 7.77M]
  ------------------
 1126|      0|        switchStorage();
 1127|      0|        ensureCapacity(position + 1);
 1128|      0|        fBCD.bcdBytes.ptr[position] = value;
 1129|  7.77M|    } else {
 1130|  7.77M|        int shift = position * 4;
 1131|  7.77M|        fBCD.bcdLong = (fBCD.bcdLong & ~(0xfL << shift)) | (static_cast<long>(value) << shift);
 1132|  7.77M|    }
 1133|  41.3M|}
_ZN6icu_786number4impl15DecimalQuantity9shiftLeftEi:
 1135|  41.3M|void DecimalQuantity::shiftLeft(int32_t numDigits) {
 1136|  41.3M|    if (!usingBytes && precision + numDigits >= 16) {
  ------------------
  |  Branch (1136:9): [True: 7.89M, False: 33.4M]
  |  Branch (1136:24): [True: 112k, False: 7.77M]
  ------------------
 1137|   112k|        switchStorage();
 1138|   112k|    }
 1139|  41.3M|    if (usingBytes) {
  ------------------
  |  Branch (1139:9): [True: 33.5M, False: 7.77M]
  ------------------
 1140|  33.5M|        ensureCapacity(precision + numDigits);
 1141|  33.5M|        uprv_memmove(fBCD.bcdBytes.ptr + numDigits, fBCD.bcdBytes.ptr, precision);
  ------------------
  |  |   51|  33.5M|#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  33.5M|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   52|  33.5M|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   53|  33.5M|    _Pragma("clang diagnostic push") \
  |  |   54|  33.5M|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   55|  33.5M|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  33.5M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   56|  33.5M|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  33.5M|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   57|  33.5M|    _Pragma("clang diagnostic pop") \
  |  |   58|  33.5M|    U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  33.5M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   59|  33.5M|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  33.5M|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1142|  33.5M|        uprv_memset(fBCD.bcdBytes.ptr, 0, numDigits);
  ------------------
  |  |  100|  33.5M|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  33.5M|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1143|  33.5M|    } else {
 1144|  7.77M|        fBCD.bcdLong <<= (numDigits * 4);
 1145|  7.77M|    }
 1146|  41.3M|    scale -= numDigits;
 1147|  41.3M|    precision += numDigits;
 1148|  41.3M|}
_ZN6icu_786number4impl15DecimalQuantity10shiftRightEi:
 1150|  1.00k|void DecimalQuantity::shiftRight(int32_t numDigits) {
 1151|  1.00k|    if (usingBytes) {
  ------------------
  |  Branch (1151:9): [True: 1.00k, False: 0]
  ------------------
 1152|  1.00k|        int i = 0;
 1153|  17.5k|        for (; i < precision - numDigits; i++) {
  ------------------
  |  Branch (1153:16): [True: 16.5k, False: 1.00k]
  ------------------
 1154|  16.5k|            fBCD.bcdBytes.ptr[i] = fBCD.bcdBytes.ptr[i + numDigits];
 1155|  16.5k|        }
 1156|  1.62k|        for (; i < precision; i++) {
  ------------------
  |  Branch (1156:16): [True: 618, False: 1.00k]
  ------------------
 1157|    618|            fBCD.bcdBytes.ptr[i] = 0;
 1158|    618|        }
 1159|  1.00k|    } else {
 1160|      0|        fBCD.bcdLong >>= (numDigits * 4);
 1161|      0|    }
 1162|  1.00k|    scale += numDigits;
 1163|  1.00k|    precision -= numDigits;
 1164|  1.00k|}
_ZN6icu_786number4impl15DecimalQuantity12setBcdToZeroEv:
 1179|  16.9M|void DecimalQuantity::setBcdToZero() {
 1180|  16.9M|    if (usingBytes) {
  ------------------
  |  Branch (1180:9): [True: 852, False: 16.9M]
  ------------------
 1181|    852|        uprv_free(fBCD.bcdBytes.ptr);
  ------------------
  |  | 1503|    852|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|    852|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    852|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    852|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1182|    852|        fBCD.bcdBytes.ptr = nullptr;
 1183|    852|        usingBytes = false;
 1184|    852|    }
 1185|  16.9M|    fBCD.bcdLong = 0L;
 1186|  16.9M|    scale = 0;
 1187|  16.9M|    precision = 0;
 1188|  16.9M|    isApproximate = false;
 1189|  16.9M|    origDouble = 0;
 1190|  16.9M|    origDelta = 0;
 1191|  16.9M|    exponent = 0;
 1192|  16.9M|}
_ZN6icu_786number4impl15DecimalQuantity12readIntToBcdEi:
 1194|  6.13k|void DecimalQuantity::readIntToBcd(int32_t n) {
 1195|  6.13k|    U_ASSERT(n != 0);
  ------------------
  |  |   35|  6.13k|#   define U_ASSERT(exp) (void)0
  ------------------
 1196|       |    // ints always fit inside the long implementation.
 1197|  6.13k|    uint64_t result = 0L;
 1198|  6.13k|    int i = 16;
 1199|  18.1k|    for (; n != 0; n /= 10, i--) {
  ------------------
  |  Branch (1199:12): [True: 11.9k, False: 6.13k]
  ------------------
 1200|  11.9k|        result = (result >> 4) + ((static_cast<uint64_t>(n) % 10) << 60);
 1201|  11.9k|    }
 1202|  6.13k|    U_ASSERT(!usingBytes);
  ------------------
  |  |   35|  6.13k|#   define U_ASSERT(exp) (void)0
  ------------------
 1203|  6.13k|    fBCD.bcdLong = result >> (i * 4);
 1204|  6.13k|    scale = 0;
 1205|  6.13k|    precision = 16 - i;
 1206|  6.13k|}
_ZN6icu_786number4impl15DecimalQuantity13readLongToBcdEl:
 1208|  5.22k|void DecimalQuantity::readLongToBcd(int64_t n) {
 1209|  5.22k|    U_ASSERT(n != 0);
  ------------------
  |  |   35|  5.22k|#   define U_ASSERT(exp) (void)0
  ------------------
 1210|  5.22k|    if (n >= 10000000000000000L) {
  ------------------
  |  Branch (1210:9): [True: 1.00k, False: 4.21k]
  ------------------
 1211|  1.00k|        ensureCapacity();
 1212|  1.00k|        int i = 0;
 1213|  18.1k|        for (; n != 0L; n /= 10L, i++) {
  ------------------
  |  Branch (1213:16): [True: 17.1k, False: 1.00k]
  ------------------
 1214|  17.1k|            fBCD.bcdBytes.ptr[i] = static_cast<int8_t>(n % 10);
 1215|  17.1k|        }
 1216|  1.00k|        U_ASSERT(usingBytes);
  ------------------
  |  |   35|  1.00k|#   define U_ASSERT(exp) (void)0
  ------------------
 1217|  1.00k|        scale = 0;
 1218|  1.00k|        precision = i;
 1219|  4.21k|    } else {
 1220|  4.21k|        uint64_t result = 0L;
 1221|  4.21k|        int i = 16;
 1222|  69.5k|        for (; n != 0L; n /= 10L, i--) {
  ------------------
  |  Branch (1222:16): [True: 65.3k, False: 4.21k]
  ------------------
 1223|  65.3k|            result = (result >> 4) + ((n % 10) << 60);
 1224|  65.3k|        }
 1225|  4.21k|        U_ASSERT(i >= 0);
  ------------------
  |  |   35|  4.21k|#   define U_ASSERT(exp) (void)0
  ------------------
 1226|  4.21k|        U_ASSERT(!usingBytes);
  ------------------
  |  |   35|  4.21k|#   define U_ASSERT(exp) (void)0
  ------------------
 1227|  4.21k|        fBCD.bcdLong = result >> (i * 4);
 1228|  4.21k|        scale = 0;
 1229|  4.21k|        precision = 16 - i;
 1230|  4.21k|    }
 1231|  5.22k|}
_ZN6icu_786number4impl15DecimalQuantity25readDoubleConversionToBcdEPKcii:
 1252|  5.69k|        const char* buffer, int32_t length, int32_t point) {
 1253|       |    // NOTE: Despite the fact that double-conversion's API is called
 1254|       |    // "DoubleToAscii", they actually use '0' (as opposed to u8'0').
 1255|  5.69k|    if (length > 16) {
  ------------------
  |  Branch (1255:9): [True: 376, False: 5.31k]
  ------------------
 1256|    376|        ensureCapacity(length);
 1257|  6.76k|        for (int32_t i = 0; i < length; i++) {
  ------------------
  |  Branch (1257:29): [True: 6.39k, False: 376]
  ------------------
 1258|  6.39k|            fBCD.bcdBytes.ptr[i] = buffer[length-i-1] - '0';
 1259|  6.39k|        }
 1260|  5.31k|    } else {
 1261|  5.31k|        uint64_t result = 0L;
 1262|  42.7k|        for (int32_t i = 0; i < length; i++) {
  ------------------
  |  Branch (1262:29): [True: 37.4k, False: 5.31k]
  ------------------
 1263|  37.4k|            result |= static_cast<uint64_t>(buffer[length-i-1] - '0') << (4 * i);
 1264|  37.4k|        }
 1265|  5.31k|        fBCD.bcdLong = result;
 1266|  5.31k|    }
 1267|  5.69k|    scale = point - length;
 1268|  5.69k|    precision = length;
 1269|  5.69k|}
_ZN6icu_786number4impl15DecimalQuantity7compactEv:
 1271|  11.3k|void DecimalQuantity::compact() {
 1272|  11.3k|    if (usingBytes) {
  ------------------
  |  Branch (1272:9): [True: 1.00k, False: 10.3k]
  ------------------
 1273|  1.00k|        int32_t delta = 0;
 1274|  1.62k|        for (; delta < precision && fBCD.bcdBytes.ptr[delta] == 0; delta++);
  ------------------
  |  Branch (1274:16): [True: 1.62k, False: 0]
  |  Branch (1274:37): [True: 618, False: 1.00k]
  ------------------
 1275|  1.00k|        if (delta == precision) {
  ------------------
  |  Branch (1275:13): [True: 0, False: 1.00k]
  ------------------
 1276|       |            // Number is zero
 1277|      0|            setBcdToZero();
 1278|      0|            return;
 1279|  1.00k|        } else {
 1280|       |            // Remove trailing zeros
 1281|  1.00k|            shiftRight(delta);
 1282|  1.00k|        }
 1283|       |
 1284|       |        // Compute precision
 1285|  1.00k|        int32_t leading = precision - 1;
 1286|  1.00k|        for (; leading >= 0 && fBCD.bcdBytes.ptr[leading] == 0; leading--);
  ------------------
  |  Branch (1286:16): [True: 1.00k, False: 0]
  |  Branch (1286:32): [True: 0, False: 1.00k]
  ------------------
 1287|  1.00k|        precision = leading + 1;
 1288|       |
 1289|       |        // Switch storage mechanism if possible
 1290|  1.00k|        if (precision <= 16) {
  ------------------
  |  Branch (1290:13): [True: 90, False: 919]
  ------------------
 1291|     90|            switchStorage();
 1292|     90|        }
 1293|       |
 1294|  10.3k|    } else {
 1295|  10.3k|        if (fBCD.bcdLong == 0L) {
  ------------------
  |  Branch (1295:13): [True: 0, False: 10.3k]
  ------------------
 1296|       |            // Number is zero
 1297|      0|            setBcdToZero();
 1298|      0|            return;
 1299|      0|        }
 1300|       |
 1301|       |        // Compact the number (remove trailing zeros)
 1302|       |        // TODO: Use a more efficient algorithm here and below. There is a logarithmic one.
 1303|  10.3k|        int32_t delta = 0;
 1304|  16.5k|        for (; delta < precision && getDigitPos(delta) == 0; delta++);
  ------------------
  |  Branch (1304:16): [True: 16.5k, False: 0]
  |  Branch (1304:37): [True: 6.18k, False: 10.3k]
  ------------------
 1305|  10.3k|        fBCD.bcdLong >>= delta * 4;
 1306|  10.3k|        scale += delta;
 1307|       |
 1308|       |        // Compute precision
 1309|  10.3k|        int32_t leading = precision - 1;
 1310|  16.5k|        for (; leading >= 0 && getDigitPos(leading) == 0; leading--);
  ------------------
  |  Branch (1310:16): [True: 16.5k, False: 0]
  |  Branch (1310:32): [True: 6.18k, False: 10.3k]
  ------------------
 1311|  10.3k|        precision = leading + 1;
 1312|  10.3k|    }
 1313|  11.3k|}
_ZN6icu_786number4impl15DecimalQuantity14ensureCapacityEv:
 1315|   113k|void DecimalQuantity::ensureCapacity() {
 1316|   113k|    ensureCapacity(40);
 1317|   113k|}
_ZN6icu_786number4impl15DecimalQuantity14ensureCapacityEi:
 1319|  67.4M|void DecimalQuantity::ensureCapacity(int32_t capacity) {
 1320|  67.4M|    if (capacity == 0) { return; }
  ------------------
  |  Branch (1320:9): [True: 0, False: 67.4M]
  ------------------
 1321|  67.4M|    int32_t oldCapacity = usingBytes ? fBCD.bcdBytes.len : 0;
  ------------------
  |  Branch (1321:27): [True: 67.1M, False: 327k]
  ------------------
 1322|  67.4M|    if (!usingBytes) {
  ------------------
  |  Branch (1322:9): [True: 327k, False: 67.1M]
  ------------------
 1323|       |        // TODO: There is nothing being done to check for memory allocation failures.
 1324|       |        // TODO: Consider indexing by nybbles instead of bytes in C++, so that we can
 1325|       |        // make these arrays half the size.
 1326|   327k|        fBCD.bcdBytes.ptr = static_cast<int8_t*>(uprv_malloc(capacity * sizeof(int8_t)));
  ------------------
  |  | 1524|   327k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|   327k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   327k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   327k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1327|   327k|        fBCD.bcdBytes.len = capacity;
 1328|       |        // Initialize the byte array to zeros (this is done automatically in Java)
 1329|   327k|        uprv_memset(fBCD.bcdBytes.ptr, 0, capacity * sizeof(int8_t));
  ------------------
  |  |  100|   327k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|   327k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1330|  67.1M|    } else if (oldCapacity < capacity) {
  ------------------
  |  Branch (1330:16): [True: 154k, False: 66.9M]
  ------------------
 1331|   154k|        auto* bcd1 = static_cast<int8_t*>(uprv_malloc(capacity * 2 * sizeof(int8_t)));
  ------------------
  |  | 1524|   154k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1332|   154k|        uprv_memcpy(bcd1, fBCD.bcdBytes.ptr, oldCapacity * sizeof(int8_t));
  ------------------
  |  |   42|   154k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   154k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   154k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   154k|    _Pragma("clang diagnostic push") \
  |  |   45|   154k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   154k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   154k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   154k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   154k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   154k|    _Pragma("clang diagnostic pop") \
  |  |   49|   154k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   154k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   154k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   154k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1333|       |        // Initialize the rest of the byte array to zeros (this is done automatically in Java)
 1334|   154k|        uprv_memset(bcd1 + oldCapacity, 0, (capacity - oldCapacity) * sizeof(int8_t));
  ------------------
  |  |  100|   154k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|   154k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1335|   154k|        uprv_free(fBCD.bcdBytes.ptr);
  ------------------
  |  | 1503|   154k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1336|   154k|        fBCD.bcdBytes.ptr = bcd1;
 1337|   154k|        fBCD.bcdBytes.len = capacity * 2;
 1338|   154k|    }
 1339|  67.4M|    usingBytes = true;
 1340|  67.4M|}
_ZN6icu_786number4impl15DecimalQuantity13switchStorageEv:
 1342|   112k|void DecimalQuantity::switchStorage() {
 1343|   112k|    if (usingBytes) {
  ------------------
  |  Branch (1343:9): [True: 90, False: 112k]
  ------------------
 1344|       |        // Change from bytes to long
 1345|     90|        uint64_t bcdLong = 0L;
 1346|  1.00k|        for (int i = precision - 1; i >= 0; i--) {
  ------------------
  |  Branch (1346:37): [True: 912, False: 90]
  ------------------
 1347|    912|            bcdLong <<= 4;
 1348|    912|            bcdLong |= fBCD.bcdBytes.ptr[i];
 1349|    912|        }
 1350|     90|        uprv_free(fBCD.bcdBytes.ptr);
  ------------------
  |  | 1503|     90|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|     90|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|     90|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|     90|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1351|     90|        fBCD.bcdBytes.ptr = nullptr;
 1352|     90|        fBCD.bcdLong = bcdLong;
 1353|     90|        usingBytes = false;
 1354|   112k|    } else {
 1355|       |        // Change from long to bytes
 1356|       |        // Copy the long into a local variable since it will get munged when we allocate the bytes
 1357|   112k|        uint64_t bcdLong = fBCD.bcdLong;
 1358|   112k|        ensureCapacity();
 1359|  1.78M|        for (int i = 0; i < precision; i++) {
  ------------------
  |  Branch (1359:25): [True: 1.66M, False: 112k]
  ------------------
 1360|  1.66M|            fBCD.bcdBytes.ptr[i] = static_cast<int8_t>(bcdLong & 0xf);
 1361|  1.66M|            bcdLong >>= 4;
 1362|  1.66M|        }
 1363|   112k|        U_ASSERT(usingBytes);
  ------------------
  |  |   35|   112k|#   define U_ASSERT(exp) (void)0
  ------------------
 1364|   112k|    }
 1365|   112k|}
_ZN6icu_786number4impl15DecimalQuantity11copyBcdFromERKS2_:
 1367|  4.02M|void DecimalQuantity::copyBcdFrom(const DecimalQuantity &other) {
 1368|  4.02M|    setBcdToZero();
 1369|  4.02M|    if (other.usingBytes) {
  ------------------
  |  Branch (1369:9): [True: 213k, False: 3.81M]
  ------------------
 1370|   213k|        ensureCapacity(other.precision);
 1371|   213k|        uprv_memcpy(fBCD.bcdBytes.ptr, other.fBCD.bcdBytes.ptr, other.precision * sizeof(int8_t));
  ------------------
  |  |   42|   213k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   213k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   213k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   213k|    _Pragma("clang diagnostic push") \
  |  |   45|   213k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   213k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   213k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   213k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   213k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   213k|    _Pragma("clang diagnostic pop") \
  |  |   49|   213k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   213k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   213k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   213k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1372|  3.81M|    } else {
 1373|  3.81M|        fBCD.bcdLong = other.fBCD.bcdLong;
 1374|  3.81M|    }
 1375|  4.02M|}

_ZN6icu_786number4impl23DecimalFormatPropertiesC2Ev:
   31|   293k|DecimalFormatProperties::DecimalFormatProperties() {
   32|   293k|    clear();
   33|   293k|}
_ZN6icu_786number4impl23DecimalFormatProperties5clearEv:
   35|   293k|void DecimalFormatProperties::clear() {
   36|   293k|    compactStyle.nullify();
   37|   293k|    currency.nullify();
   38|   293k|    currencyPluralInfo.fPtr.adoptInstead(nullptr);
   39|   293k|    currencyUsage.nullify();
   40|   293k|    decimalPatternMatchRequired = false;
   41|   293k|    decimalSeparatorAlwaysShown = false;
   42|   293k|    exponentSignAlwaysShown = false;
   43|   293k|    currencyAsDecimal = false;
   44|   293k|    formatFailIfMoreThanMaxDigits = false;
   45|   293k|    formatWidth = -1;
   46|   293k|    groupingSize = -1;
   47|   293k|    groupingUsed = true;
   48|   293k|    magnitudeMultiplier = 0;
   49|   293k|    maximumFractionDigits = -1;
   50|   293k|    maximumIntegerDigits = -1;
   51|   293k|    maximumSignificantDigits = -1;
   52|   293k|    minimumExponentDigits = -1;
   53|   293k|    minimumFractionDigits = -1;
   54|   293k|    minimumGroupingDigits = -1;
   55|   293k|    minimumIntegerDigits = -1;
   56|   293k|    minimumSignificantDigits = -1;
   57|   293k|    multiplier = 1;
   58|   293k|    multiplierScale = 0;
   59|   293k|    negativePrefix.setToBogus();
   60|   293k|    negativePrefixPattern.setToBogus();
   61|   293k|    negativeSuffix.setToBogus();
   62|   293k|    negativeSuffixPattern.setToBogus();
   63|   293k|    padPosition.nullify();
   64|   293k|    padString.setToBogus();
   65|   293k|    parseCaseSensitive = false;
   66|   293k|    parseIntegerOnly = false;
   67|   293k|    parseMode.nullify();
   68|   293k|    parseNoExponent = false;
   69|   293k|    parseToBigDecimal = false;
   70|   293k|    parseAllInput = UNUM_MAYBE;
   71|   293k|    positivePrefix.setToBogus();
   72|   293k|    positivePrefixPattern.setToBogus();
   73|   293k|    positiveSuffix.setToBogus();
   74|   293k|    positiveSuffixPattern.setToBogus();
   75|   293k|    roundingIncrement = 0.0;
   76|   293k|    roundingMode.nullify();
   77|   293k|    secondaryGroupingSize = -1;
   78|   293k|    signAlwaysShown = false;
   79|   293k|}
_ZNK6icu_786number4impl23DecimalFormatProperties7_equalsERKS2_b:
   82|   146k|DecimalFormatProperties::_equals(const DecimalFormatProperties& other, bool ignoreForFastFormat) const {
   83|   146k|    bool eq = true;
   84|       |
   85|       |    // Properties that must be equal both normally and for fast-path formatting
   86|   146k|    eq = eq && compactStyle == other.compactStyle;
  ------------------
  |  Branch (86:10): [True: 146k, False: 0]
  |  Branch (86:16): [True: 127k, False: 19.0k]
  ------------------
   87|   146k|    eq = eq && currency == other.currency;
  ------------------
  |  Branch (87:10): [True: 127k, False: 19.0k]
  |  Branch (87:16): [True: 127k, False: 0]
  ------------------
   88|   146k|    eq = eq && currencyPluralInfo.fPtr.getAlias() == other.currencyPluralInfo.fPtr.getAlias();
  ------------------
  |  Branch (88:10): [True: 127k, False: 19.0k]
  |  Branch (88:16): [True: 127k, False: 0]
  ------------------
   89|   146k|    eq = eq && currencyUsage == other.currencyUsage;
  ------------------
  |  Branch (89:10): [True: 127k, False: 19.0k]
  |  Branch (89:16): [True: 127k, False: 0]
  ------------------
   90|   146k|    eq = eq && decimalSeparatorAlwaysShown == other.decimalSeparatorAlwaysShown;
  ------------------
  |  Branch (90:10): [True: 127k, False: 19.0k]
  |  Branch (90:16): [True: 127k, False: 56]
  ------------------
   91|   146k|    eq = eq && exponentSignAlwaysShown == other.exponentSignAlwaysShown;
  ------------------
  |  Branch (91:10): [True: 127k, False: 19.1k]
  |  Branch (91:16): [True: 127k, False: 120]
  ------------------
   92|   146k|    eq = eq && currencyAsDecimal == other.currencyAsDecimal;
  ------------------
  |  Branch (92:10): [True: 127k, False: 19.2k]
  |  Branch (92:16): [True: 126k, False: 546]
  ------------------
   93|   146k|    eq = eq && formatFailIfMoreThanMaxDigits == other.formatFailIfMoreThanMaxDigits;
  ------------------
  |  Branch (93:10): [True: 126k, False: 19.7k]
  |  Branch (93:16): [True: 126k, False: 0]
  ------------------
   94|   146k|    eq = eq && formatWidth == other.formatWidth;
  ------------------
  |  Branch (94:10): [True: 126k, False: 19.7k]
  |  Branch (94:16): [True: 124k, False: 2.12k]
  ------------------
   95|   146k|    eq = eq && magnitudeMultiplier == other.magnitudeMultiplier;
  ------------------
  |  Branch (95:10): [True: 124k, False: 21.9k]
  |  Branch (95:16): [True: 113k, False: 11.2k]
  ------------------
   96|   146k|    eq = eq && maximumSignificantDigits == other.maximumSignificantDigits;
  ------------------
  |  Branch (96:10): [True: 113k, False: 33.1k]
  |  Branch (96:16): [True: 113k, False: 58]
  ------------------
   97|   146k|    eq = eq && minimumExponentDigits == other.minimumExponentDigits;
  ------------------
  |  Branch (97:10): [True: 113k, False: 33.2k]
  |  Branch (97:16): [True: 101k, False: 12.0k]
  ------------------
   98|   146k|    eq = eq && minimumGroupingDigits == other.minimumGroupingDigits;
  ------------------
  |  Branch (98:10): [True: 101k, False: 45.2k]
  |  Branch (98:16): [True: 101k, False: 0]
  ------------------
   99|   146k|    eq = eq && minimumSignificantDigits == other.minimumSignificantDigits;
  ------------------
  |  Branch (99:10): [True: 101k, False: 45.2k]
  |  Branch (99:16): [True: 101k, False: 0]
  ------------------
  100|   146k|    eq = eq && multiplier == other.multiplier;
  ------------------
  |  Branch (100:10): [True: 101k, False: 45.2k]
  |  Branch (100:16): [True: 101k, False: 0]
  ------------------
  101|   146k|    eq = eq && multiplierScale == other.multiplierScale;
  ------------------
  |  Branch (101:10): [True: 101k, False: 45.2k]
  |  Branch (101:16): [True: 101k, False: 0]
  ------------------
  102|   146k|    eq = eq && negativePrefix == other.negativePrefix;
  ------------------
  |  Branch (102:10): [True: 101k, False: 45.2k]
  |  Branch (102:16): [True: 101k, False: 0]
  ------------------
  103|   146k|    eq = eq && negativeSuffix == other.negativeSuffix;
  ------------------
  |  Branch (103:10): [True: 101k, False: 45.2k]
  |  Branch (103:16): [True: 101k, False: 0]
  ------------------
  104|   146k|    eq = eq && padPosition == other.padPosition;
  ------------------
  |  Branch (104:10): [True: 101k, False: 45.2k]
  |  Branch (104:16): [True: 101k, False: 0]
  ------------------
  105|   146k|    eq = eq && padString == other.padString;
  ------------------
  |  Branch (105:10): [True: 101k, False: 45.2k]
  |  Branch (105:16): [True: 101k, False: 0]
  ------------------
  106|   146k|    eq = eq && positivePrefix == other.positivePrefix;
  ------------------
  |  Branch (106:10): [True: 101k, False: 45.2k]
  |  Branch (106:16): [True: 101k, False: 0]
  ------------------
  107|   146k|    eq = eq && positiveSuffix == other.positiveSuffix;
  ------------------
  |  Branch (107:10): [True: 101k, False: 45.2k]
  |  Branch (107:16): [True: 101k, False: 0]
  ------------------
  108|   146k|    eq = eq && roundingIncrement == other.roundingIncrement;
  ------------------
  |  Branch (108:10): [True: 101k, False: 45.2k]
  |  Branch (108:16): [True: 97.6k, False: 3.43k]
  ------------------
  109|   146k|    eq = eq && roundingMode == other.roundingMode;
  ------------------
  |  Branch (109:10): [True: 97.6k, False: 48.7k]
  |  Branch (109:16): [True: 97.6k, False: 0]
  ------------------
  110|   146k|    eq = eq && secondaryGroupingSize == other.secondaryGroupingSize;
  ------------------
  |  Branch (110:10): [True: 97.6k, False: 48.7k]
  |  Branch (110:16): [True: 95.5k, False: 2.08k]
  ------------------
  111|   146k|    eq = eq && signAlwaysShown == other.signAlwaysShown;
  ------------------
  |  Branch (111:10): [True: 95.5k, False: 50.8k]
  |  Branch (111:16): [True: 95.5k, False: 0]
  ------------------
  112|       |
  113|   146k|    if (ignoreForFastFormat) {
  ------------------
  |  Branch (113:9): [True: 146k, False: 0]
  ------------------
  114|   146k|        return eq;
  115|   146k|    }
  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|   146k|}
_ZNK6icu_786number4impl23DecimalFormatProperties29equalsDefaultExceptFastFormatEv:
  142|   146k|bool DecimalFormatProperties::equalsDefaultExceptFastFormat() const {
  143|   146k|    UErrorCode localStatus = U_ZERO_ERROR;
  144|   146k|    umtx_initOnce(gDefaultPropertiesInitOnce, &initDefaultProperties, localStatus);
  145|   146k|    return _equals(*reinterpret_cast<DecimalFormatProperties*>(kRawDefaultProperties), true);
  146|   146k|}
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|  9.53k|    CurrencyPluralInfoWrapper(const CurrencyPluralInfoWrapper& other) {
   40|  9.53k|        if (!other.fPtr.isNull()) {
  ------------------
  |  Branch (40:13): [True: 0, False: 9.53k]
  ------------------
   41|      0|            fPtr.adoptInstead(new CurrencyPluralInfo(*other.fPtr));
   42|      0|        }
   43|  9.53k|    }
_ZN6icu_786number4impl25CurrencyPluralInfoWrapperC2Ev:
   37|   293k|    CurrencyPluralInfoWrapper() = default;

_ZNO6icu_786number23NumberFormatterSettingsINS0_26UnlocalizedNumberFormatterEE6macrosEONS0_4impl10MacroPropsE:
  383|   146k|Derived NumberFormatterSettings<Derived>::macros(impl::MacroProps&& macros)&& {
  384|   146k|    Derived move(std::move(*this));
  385|   146k|    move.fMacros = std::move(macros);
  386|   146k|    return move;
  387|   146k|}
_ZN6icu_786number15NumberFormatter4withEv:
  409|   146k|UnlocalizedNumberFormatter NumberFormatter::with() {
  410|   146k|    UnlocalizedNumberFormatter result;
  411|   146k|    return result;
  412|   146k|}
_ZN6icu_786number26UnlocalizedNumberFormatterC2EONS0_23NumberFormatterSettingsIS1_EE:
  446|   146k|        : NFS<UNF>(std::move(src)) {
  447|       |    // No additional fields to assign
  448|   146k|}
_ZN6icu_786number24LocalizedNumberFormatteraSEOS1_:
  488|   146k|LocalizedNumberFormatter& LocalizedNumberFormatter::operator=(LNF&& src) noexcept {
  489|   146k|    NFS<LNF>::operator=(static_cast<NFS<LNF>&&>(src));
  490|   146k|    lnfMoveHelper(std::move(src));
  491|   146k|    return *this;
  492|   146k|}
_ZN6icu_786number24LocalizedNumberFormatter13resetCompiledEv:
  494|   146k|void LocalizedNumberFormatter::resetCompiled() {
  495|   146k|    auto* callCount = reinterpret_cast<u_atomic_int32_t*>(fUnsafeCallCount);
  496|   146k|    umtx_storeRelease(*callCount, 0);
  497|   146k|    fCompiled = nullptr;
  498|   146k|}
_ZN6icu_786number24LocalizedNumberFormatter13lnfMoveHelperEOS1_:
  500|   146k|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|   146k|    delete fCompiled;
  505|   146k|    if (src.fCompiled != nullptr) {
  ------------------
  |  Branch (505:9): [True: 0, False: 146k]
  ------------------
  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|   146k|    } else {
  512|   146k|        resetCompiled();
  513|   146k|    }
  514|       |
  515|       |    // Unconditionally move the warehouse
  516|   146k|    delete fWarehouse;
  517|   146k|    fWarehouse = src.fWarehouse;
  518|   146k|    src.fWarehouse = nullptr;
  519|   146k|}
_ZN6icu_786number24LocalizedNumberFormatterD2Ev:
  551|   297k|LocalizedNumberFormatter::~LocalizedNumberFormatter() {
  552|   297k|    delete fCompiled;
  553|   297k|    delete fWarehouse;
  554|   297k|}
_ZN6icu_786number24LocalizedNumberFormatterC2EONS0_4impl10MacroPropsERKNS_6LocaleE:
  561|   146k|LocalizedNumberFormatter::LocalizedNumberFormatter(MacroProps&& macros, const Locale& locale) {
  562|   146k|    fMacros = std::move(macros);
  563|   146k|    fMacros.locale = locale;
  564|   146k|}
_ZNO6icu_786number26UnlocalizedNumberFormatter6localeERKNS_6LocaleE:
  570|   146k|LocalizedNumberFormatter UnlocalizedNumberFormatter::locale(const Locale& locale)&& {
  571|   146k|    return LocalizedNumberFormatter(std::move(fMacros), locale);
  572|   146k|}
_ZNK6icu_786number24LocalizedNumberFormatter23getDecimalFormatSymbolsEv:
  749|   187k|const DecimalFormatSymbols* LocalizedNumberFormatter::getDecimalFormatSymbols() const {
  750|   187k|    return fMacros.symbols.getDecimalFormatSymbols();
  751|   187k|}

_ZN6icu_786number4impl7Grouper11forStrategyE23UNumberGroupingStrategy:
   37|   172k|Grouper Grouper::forStrategy(UNumberGroupingStrategy grouping) {
   38|   172k|    switch (grouping) {
   39|   172k|    case UNUM_GROUPING_OFF:
  ------------------
  |  Branch (39:5): [True: 172k, False: 0]
  ------------------
   40|   172k|        return {-1, -1, -2, grouping};
   41|      0|    case UNUM_GROUPING_AUTO:
  ------------------
  |  Branch (41:5): [True: 0, False: 172k]
  ------------------
   42|      0|        return {-2, -2, -2, grouping};
   43|      0|    case UNUM_GROUPING_MIN2:
  ------------------
  |  Branch (43:5): [True: 0, False: 172k]
  ------------------
   44|      0|        return {-2, -2, -3, grouping};
   45|      0|    case UNUM_GROUPING_ON_ALIGNED:
  ------------------
  |  Branch (45:5): [True: 0, False: 172k]
  ------------------
   46|      0|        return {-4, -4, 1, grouping};
   47|      0|    case UNUM_GROUPING_THOUSANDS:
  ------------------
  |  Branch (47:5): [True: 0, False: 172k]
  ------------------
   48|      0|        return {3, 3, 1, grouping};
   49|      0|    default:
  ------------------
  |  Branch (49:5): [True: 0, False: 172k]
  ------------------
   50|      0|        UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
   51|   172k|    }
   52|   172k|}
_ZN6icu_786number4impl7Grouper13forPropertiesERKNS1_23DecimalFormatPropertiesE:
   54|   249k|Grouper Grouper::forProperties(const DecimalFormatProperties& properties) {
   55|   249k|    if (!properties.groupingUsed) {
  ------------------
  |  Branch (55:9): [True: 172k, False: 76.8k]
  ------------------
   56|   172k|        return forStrategy(UNUM_GROUPING_OFF);
   57|   172k|    }
   58|  76.8k|    auto grouping1 = static_cast<int16_t>(properties.groupingSize);
   59|  76.8k|    auto grouping2 = static_cast<int16_t>(properties.secondaryGroupingSize);
   60|  76.8k|    auto minGrouping = static_cast<int16_t>(properties.minimumGroupingDigits);
   61|  76.8k|    grouping1 = grouping1 > 0 ? grouping1 : grouping2 > 0 ? grouping2 : grouping1;
  ------------------
  |  Branch (61:17): [True: 57.5k, False: 19.2k]
  |  Branch (61:45): [True: 0, False: 19.2k]
  ------------------
   62|  76.8k|    grouping2 = grouping2 > 0 ? grouping2 : grouping1;
  ------------------
  |  Branch (62:17): [True: 4.86k, False: 71.9k]
  ------------------
   63|  76.8k|    return {grouping1, grouping2, minGrouping, UNUM_GROUPING_COUNT};
   64|   249k|}
_ZNK6icu_786number4impl7Grouper10getPrimaryEv:
  101|   308k|int16_t Grouper::getPrimary() const {
  102|   308k|    return fGrouping1;
  103|   308k|}
_ZNK6icu_786number4impl7Grouper12getSecondaryEv:
  105|   205k|int16_t Grouper::getSecondary() const {
  106|   205k|    return fGrouping2;
  107|   205k|}

_ZN6icu_786number12IntegerWidthC2Essb:
   16|   148k|IntegerWidth::IntegerWidth(digits_t minInt, digits_t maxInt, bool formatFailIfMoreThanMaxDigits) {
   17|   148k|    fUnion.minMaxInt.fMinInt = minInt;
   18|   148k|    fUnion.minMaxInt.fMaxInt = maxInt;
   19|   148k|    fUnion.minMaxInt.fFormatFailIfMoreThanMaxDigits = formatFailIfMoreThanMaxDigits;
   20|   148k|}
_ZN6icu_786number12IntegerWidth10zeroFillToEi:
   22|  1.28k|IntegerWidth IntegerWidth::zeroFillTo(int32_t minInt) {
   23|  1.28k|    if (minInt >= 0 && minInt <= kMaxIntFracSig) {
  ------------------
  |  Branch (23:9): [True: 1.28k, False: 0]
  |  Branch (23:24): [True: 1.28k, False: 0]
  ------------------
   24|  1.28k|        return {static_cast<digits_t>(minInt), -1, false};
   25|  1.28k|    } else {
   26|      0|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
   27|      0|    }
   28|  1.28k|}
_ZN6icu_786number12IntegerWidth10truncateAtEi:
   30|  1.28k|IntegerWidth IntegerWidth::truncateAt(int32_t maxInt) {
   31|  1.28k|    if (fHasError) { return *this; }  // No-op on error
  ------------------
  |  Branch (31:9): [True: 0, False: 1.28k]
  ------------------
   32|  1.28k|    digits_t minInt = fUnion.minMaxInt.fMinInt;
   33|  1.28k|    if (maxInt >= 0 && maxInt <= kMaxIntFracSig && minInt <= maxInt) {
  ------------------
  |  Branch (33:9): [True: 1.28k, False: 0]
  |  Branch (33:24): [True: 1.28k, False: 0]
  |  Branch (33:52): [True: 1.28k, False: 0]
  ------------------
   34|  1.28k|        return {minInt, static_cast<digits_t>(maxInt), false};
   35|  1.28k|    } else if (maxInt == -1) {
  ------------------
  |  Branch (35:16): [True: 0, False: 0]
  ------------------
   36|      0|        return {minInt, -1, false};
   37|      0|    } else {
   38|      0|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
   39|      0|    }
   40|  1.28k|}

_ZN6icu_786number4impl20NumberPropertyMapper6createERKNS1_23DecimalFormatPropertiesERKNS_20DecimalFormatSymbolsERNS1_22DecimalFormatWarehouseERS3_R10UErrorCode:
   33|   146k|                                                        UErrorCode& status) {
   34|   146k|    return NumberFormatter::with().macros(
   35|   146k|            oldToNew(
   36|   146k|                    properties, symbols, warehouse, &exportedProperties, status));
   37|   146k|}
_ZN6icu_786number4impl20NumberPropertyMapper8oldToNewERKNS1_23DecimalFormatPropertiesERKNS_20DecimalFormatSymbolsERNS1_22DecimalFormatWarehouseEPS3_R10UErrorCode:
   43|   146k|                                          UErrorCode& status) {
   44|   146k|    MacroProps macros;
   45|   146k|    Locale locale = symbols.getLocale();
   46|       |
   47|       |    /////////////
   48|       |    // SYMBOLS //
   49|       |    /////////////
   50|       |
   51|   146k|    macros.symbols.setTo(symbols);
   52|       |
   53|       |    //////////////////
   54|       |    // PLURAL RULES //
   55|       |    //////////////////
   56|       |
   57|   146k|    if (!properties.currencyPluralInfo.fPtr.isNull()) {
  ------------------
  |  Branch (57:9): [True: 0, False: 146k]
  ------------------
   58|      0|        macros.rules = properties.currencyPluralInfo.fPtr->getPluralRules();
   59|      0|    }
   60|       |
   61|       |    /////////////
   62|       |    // AFFIXES //
   63|       |    /////////////
   64|       |
   65|   146k|    warehouse.affixProvider.setTo(properties, status);
   66|   146k|    macros.affixProvider = &warehouse.affixProvider.get();
   67|       |
   68|       |    ///////////
   69|       |    // UNITS //
   70|       |    ///////////
   71|       |
   72|   146k|    bool useCurrency = (
   73|   146k|            !properties.currency.isNull() ||
  ------------------
  |  Branch (73:13): [True: 0, False: 146k]
  ------------------
   74|   146k|            !properties.currencyPluralInfo.fPtr.isNull() ||
  ------------------
  |  Branch (74:13): [True: 0, False: 146k]
  ------------------
   75|   146k|            !properties.currencyUsage.isNull() ||
  ------------------
  |  Branch (75:13): [True: 0, False: 146k]
  ------------------
   76|   146k|            warehouse.affixProvider.get().hasCurrencySign());
  ------------------
  |  Branch (76:13): [True: 15.6k, False: 130k]
  ------------------
   77|   146k|    CurrencyUnit currency;
   78|   146k|    UCurrencyUsage currencyUsage;
   79|   146k|    if (useCurrency) {
  ------------------
  |  Branch (79:9): [True: 15.6k, False: 130k]
  ------------------
   80|  15.6k|        currency = resolveCurrency(properties, locale, status);
   81|  15.6k|        currencyUsage = properties.currencyUsage.getOrDefault(UCURR_USAGE_STANDARD);
   82|       |        // NOTE: Slicing is OK.
   83|  15.6k|        macros.unit = currency; // NOLINT
   84|  15.6k|    }
   85|       |
   86|       |    ///////////////////////
   87|       |    // ROUNDING STRATEGY //
   88|       |    ///////////////////////
   89|       |
   90|   146k|    int32_t maxInt = properties.maximumIntegerDigits;
   91|   146k|    int32_t minInt = properties.minimumIntegerDigits;
   92|   146k|    int32_t maxFrac = properties.maximumFractionDigits;
   93|   146k|    int32_t minFrac = properties.minimumFractionDigits;
   94|   146k|    int32_t minSig = properties.minimumSignificantDigits;
   95|   146k|    int32_t maxSig = properties.maximumSignificantDigits;
   96|   146k|    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|   146k|    RoundingMode roundingMode = properties.roundingMode.getOrDefault(UNUM_ROUND_HALFEVEN);
  100|   146k|    bool explicitMinMaxFrac = minFrac != -1 || maxFrac != -1;
  ------------------
  |  Branch (100:31): [True: 111k, False: 34.9k]
  |  Branch (100:48): [True: 0, False: 34.9k]
  ------------------
  101|   146k|    bool explicitMinMaxSig = minSig != -1 || maxSig != -1;
  ------------------
  |  Branch (101:30): [True: 61, False: 146k]
  |  Branch (101:46): [True: 0, False: 146k]
  ------------------
  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|   146k|    if (useCurrency && (minFrac == -1 || maxFrac == -1)) {
  ------------------
  |  Branch (106:9): [True: 15.6k, False: 130k]
  |  Branch (106:25): [True: 15.6k, False: 62]
  |  Branch (106:42): [True: 0, False: 62]
  ------------------
  107|  15.6k|        int32_t digits = ucurr_getDefaultFractionDigitsForUsage(
  ------------------
  |  |  835|  15.6k|#define ucurr_getDefaultFractionDigitsForUsage U_ICU_ENTRY_POINT_RENAME(ucurr_getDefaultFractionDigitsForUsage)
  |  |  ------------------
  |  |  |  |  123|  15.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  15.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  15.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  108|  15.6k|                currency.getISOCurrency(), currencyUsage, &status);
  109|  15.6k|        if (minFrac == -1 && maxFrac == -1) {
  ------------------
  |  Branch (109:13): [True: 15.6k, False: 0]
  |  Branch (109:30): [True: 15.6k, False: 0]
  ------------------
  110|  15.6k|            minFrac = digits;
  111|  15.6k|            maxFrac = digits;
  112|  15.6k|        } 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|  15.6k|    }
  118|       |    // Validate min/max int/frac.
  119|       |    // For backwards compatibility, minimum overrides maximum if the two conflict.
  120|   146k|    if (minInt == 0 && maxFrac != 0) {
  ------------------
  |  Branch (120:9): [True: 9.59k, False: 136k]
  |  Branch (120:24): [True: 192, False: 9.40k]
  ------------------
  121|    192|        minFrac = (minFrac < 0 || (minFrac == 0 && maxInt == 0)) ? 1 : minFrac;
  ------------------
  |  Branch (121:20): [True: 1, False: 191]
  |  Branch (121:36): [True: 0, False: 191]
  |  Branch (121:52): [True: 0, False: 0]
  ------------------
  122|    192|        maxFrac = maxFrac < 0 ? -1 : maxFrac < minFrac ? minFrac : maxFrac;
  ------------------
  |  Branch (122:19): [True: 1, False: 191]
  |  Branch (122:38): [True: 0, False: 191]
  ------------------
  123|    192|        minInt = 0;
  124|    192|        maxInt = maxInt < 0 ? -1 : maxInt > kMaxIntFracSig ? -1 : maxInt;
  ------------------
  |  Branch (124:18): [True: 191, False: 1]
  |  Branch (124:36): [True: 0, False: 1]
  ------------------
  125|   146k|    } else {
  126|       |        // Force a digit before the decimal point.
  127|   146k|        minFrac = minFrac < 0 ? 0 : minFrac;
  ------------------
  |  Branch (127:19): [True: 19.3k, False: 126k]
  ------------------
  128|   146k|        maxFrac = maxFrac < 0 ? -1 : maxFrac < minFrac ? minFrac : maxFrac;
  ------------------
  |  Branch (128:19): [True: 19.3k, False: 126k]
  |  Branch (128:38): [True: 0, False: 126k]
  ------------------
  129|   146k|        minInt = minInt <= 0 ? 1 : minInt > kMaxIntFracSig ? 1 : minInt;
  ------------------
  |  Branch (129:18): [True: 28.6k, False: 117k]
  |  Branch (129:36): [True: 11, False: 117k]
  ------------------
  130|   146k|        maxInt = maxInt < 0 ? -1 : maxInt < minInt ? minInt : maxInt > kMaxIntFracSig ? -1 : maxInt;
  ------------------
  |  Branch (130:18): [True: 133k, False: 12.1k]
  |  Branch (130:36): [True: 1, False: 12.1k]
  |  Branch (130:63): [True: 0, False: 12.1k]
  ------------------
  131|   146k|    }
  132|   146k|    Precision precision;
  133|   146k|    if (!properties.currencyUsage.isNull()) {
  ------------------
  |  Branch (133:9): [True: 0, False: 146k]
  ------------------
  134|      0|        U_ASSERT(useCurrency);
  ------------------
  |  |   35|      0|#   define U_ASSERT(exp) (void)0
  ------------------
  135|      0|        precision = Precision::constructCurrency(currencyUsage).withCurrency(currency);
  136|   146k|    } else if (roundingIncrement != 0.0) {
  ------------------
  |  Branch (136:16): [True: 5.71k, False: 140k]
  ------------------
  137|  5.71k|        if (PatternStringUtils::ignoreRoundingIncrement(roundingIncrement, maxFrac)) {
  ------------------
  |  Branch (137:13): [True: 0, False: 5.71k]
  ------------------
  138|      0|            precision = Precision::constructFraction(minFrac, maxFrac);
  139|  5.71k|        } else {
  140|       |            // Convert the double increment to an integer increment
  141|  5.71k|            precision = Precision::increment(roundingIncrement).withMinFraction(minFrac);
  142|  5.71k|        }
  143|   140k|    } else if (explicitMinMaxSig) {
  ------------------
  |  Branch (143:16): [True: 61, False: 140k]
  ------------------
  144|     61|        minSig = minSig < 1 ? 1 : minSig > kMaxIntFracSig ? kMaxIntFracSig : minSig;
  ------------------
  |  Branch (144:18): [True: 0, False: 61]
  |  Branch (144:35): [True: 4, False: 57]
  ------------------
  145|     61|        maxSig = maxSig < 0 ? kMaxIntFracSig : maxSig < minSig ? minSig : maxSig > kMaxIntFracSig
  ------------------
  |  Branch (145:18): [True: 0, False: 61]
  |  Branch (145:48): [True: 0, False: 61]
  |  Branch (145:75): [True: 4, False: 57]
  ------------------
  146|     61|                                                                          ? kMaxIntFracSig : maxSig;
  147|     61|        precision = Precision::constructSignificant(minSig, maxSig);
  148|   140k|    } else if (explicitMinMaxFrac) {
  ------------------
  |  Branch (148:16): [True: 105k, False: 34.8k]
  ------------------
  149|   105k|        precision = Precision::constructFraction(minFrac, maxFrac);
  150|   105k|    } else if (useCurrency) {
  ------------------
  |  Branch (150:16): [True: 15.6k, False: 19.2k]
  ------------------
  151|  15.6k|        precision = Precision::constructCurrency(currencyUsage);
  152|  15.6k|    }
  153|   146k|    if (!precision.isBogus()) {
  ------------------
  |  Branch (153:9): [True: 127k, False: 19.2k]
  ------------------
  154|   127k|        macros.roundingMode = roundingMode;
  155|   127k|        macros.precision = precision;
  156|   127k|    }
  157|       |
  158|       |    ///////////////////
  159|       |    // INTEGER WIDTH //
  160|       |    ///////////////////
  161|       |
  162|   146k|    macros.integerWidth = IntegerWidth(
  163|   146k|            static_cast<digits_t>(minInt),
  164|   146k|            static_cast<digits_t>(maxInt),
  165|   146k|            properties.formatFailIfMoreThanMaxDigits);
  166|       |
  167|       |    ///////////////////////
  168|       |    // GROUPING STRATEGY //
  169|       |    ///////////////////////
  170|       |
  171|   146k|    macros.grouper = Grouper::forProperties(properties);
  172|       |
  173|       |    /////////////
  174|       |    // PADDING //
  175|       |    /////////////
  176|       |
  177|   146k|    if (properties.formatWidth > 0) {
  ------------------
  |  Branch (177:9): [True: 2.10k, False: 144k]
  ------------------
  178|  2.10k|        macros.padder = Padder::forProperties(properties);
  179|  2.10k|    }
  180|       |
  181|       |    ///////////////////////////////
  182|       |    // DECIMAL MARK ALWAYS SHOWN //
  183|       |    ///////////////////////////////
  184|       |
  185|   146k|    macros.decimal = properties.decimalSeparatorAlwaysShown ? UNUM_DECIMAL_SEPARATOR_ALWAYS
  ------------------
  |  Branch (185:22): [True: 56, False: 146k]
  ------------------
  186|   146k|                                                            : UNUM_DECIMAL_SEPARATOR_AUTO;
  187|       |
  188|       |    ///////////////////////
  189|       |    // SIGN ALWAYS SHOWN //
  190|       |    ///////////////////////
  191|       |
  192|   146k|    macros.sign = properties.signAlwaysShown ? UNUM_SIGN_ALWAYS : UNUM_SIGN_AUTO;
  ------------------
  |  Branch (192:19): [True: 0, False: 146k]
  ------------------
  193|       |
  194|       |    /////////////////////////
  195|       |    // SCIENTIFIC NOTATION //
  196|       |    /////////////////////////
  197|       |
  198|   146k|    if (properties.minimumExponentDigits != -1) {
  ------------------
  |  Branch (198:9): [True: 12.1k, False: 134k]
  ------------------
  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|  12.1k|        if (maxInt > 8) {
  ------------------
  |  Branch (202:13): [True: 1.28k, False: 10.9k]
  ------------------
  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|  1.28k|            maxInt = minInt;
  206|  1.28k|            macros.integerWidth = IntegerWidth::zeroFillTo(minInt).truncateAt(maxInt);
  207|  10.9k|        } else if (maxInt > minInt && minInt > 1) {
  ------------------
  |  Branch (207:20): [True: 45, False: 10.8k]
  |  Branch (207:39): [True: 2, False: 43]
  ------------------
  208|       |            // Bug #13289: if maxInt > minInt > 1, then minInt should be 1.
  209|      2|            minInt = 1;
  210|      2|            macros.integerWidth = IntegerWidth::zeroFillTo(minInt).truncateAt(maxInt);
  211|      2|        }
  212|  12.1k|        int engineering = maxInt < 0 ? -1 : maxInt;
  ------------------
  |  Branch (212:27): [True: 0, False: 12.1k]
  ------------------
  213|  12.1k|        macros.notation = ScientificNotation(
  214|       |                // Engineering interval:
  215|  12.1k|                static_cast<int8_t>(engineering),
  216|       |                // Enforce minimum integer digits (for patterns like "000.00E0"):
  217|  12.1k|                (engineering == minInt),
  218|       |                // Minimum exponent digits:
  219|  12.1k|                static_cast<digits_t>(properties.minimumExponentDigits),
  220|       |                // Exponent sign always shown:
  221|  12.1k|                properties.exponentSignAlwaysShown ? UNUM_SIGN_ALWAYS : UNUM_SIGN_AUTO);
  ------------------
  |  Branch (221:17): [True: 120, False: 12.0k]
  ------------------
  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|  12.1k|        if (macros.precision.fType == Precision::PrecisionType::RND_FRACTION) {
  ------------------
  |  Branch (224:13): [True: 9.94k, False: 2.24k]
  ------------------
  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|  9.94k|            int maxInt_ = properties.maximumIntegerDigits;
  228|  9.94k|            int minInt_ = properties.minimumIntegerDigits;
  229|  9.94k|            int minFrac_ = properties.minimumFractionDigits;
  230|  9.94k|            int maxFrac_ = properties.maximumFractionDigits;
  231|  9.94k|            if (minInt_ == 0 && maxFrac_ == 0) {
  ------------------
  |  Branch (231:17): [True: 9.40k, False: 541]
  |  Branch (231:33): [True: 9.40k, False: 1]
  ------------------
  232|       |                // Patterns like "#E0" and "##E0", which mean no rounding!
  233|  9.40k|                macros.precision = Precision::unlimited();
  234|  9.40k|            } else if (minInt_ == 0 && minFrac_ == 0) {
  ------------------
  |  Branch (234:24): [True: 1, False: 541]
  |  Branch (234:40): [True: 0, False: 1]
  ------------------
  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|    542|            } else {
  238|    542|                int maxSig_ = minInt_ + maxFrac_;
  239|       |                // Bug #20058: if maxInt_ > minInt_ > 1, then minInt_ should be 1.
  240|    542|                if (maxInt_ > minInt_ && minInt_ > 1) {
  ------------------
  |  Branch (240:21): [True: 10, False: 532]
  |  Branch (240:42): [True: 0, False: 10]
  ------------------
  241|      0|                    minInt_ = 1;
  242|      0|                }
  243|    542|                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|    542|                macros.precision = Precision::constructSignificant(minSig_, maxSig_);
  247|    542|            }
  248|  9.94k|            macros.roundingMode = roundingMode;
  249|  9.94k|        }
  250|  12.1k|    }
  251|       |
  252|       |    //////////////////////
  253|       |    // COMPACT NOTATION //
  254|       |    //////////////////////
  255|       |
  256|   146k|    if (!properties.compactStyle.isNull()) {
  ------------------
  |  Branch (256:9): [True: 19.0k, False: 127k]
  ------------------
  257|  19.0k|        if (properties.compactStyle.getNoError() == UNumberCompactStyle::UNUM_LONG) {
  ------------------
  |  Branch (257:13): [True: 9.53k, False: 9.53k]
  ------------------
  258|  9.53k|            macros.notation = Notation::compactLong();
  259|  9.53k|        } else {
  260|  9.53k|            macros.notation = Notation::compactShort();
  261|  9.53k|        }
  262|  19.0k|    }
  263|       |
  264|       |    /////////////////
  265|       |    // MULTIPLIERS //
  266|       |    /////////////////
  267|       |
  268|   146k|    macros.scale = scaleFromProperties(properties);
  269|       |
  270|       |    //////////////////////
  271|       |    // PROPERTY EXPORTS //
  272|       |    //////////////////////
  273|       |
  274|   146k|    if (exportedProperties != nullptr) {
  ------------------
  |  Branch (274:9): [True: 146k, False: 0]
  ------------------
  275|       |
  276|   146k|        exportedProperties->currency = currency;
  277|   146k|        exportedProperties->roundingMode = roundingMode;
  278|   146k|        exportedProperties->minimumIntegerDigits = minInt;
  279|   146k|        exportedProperties->maximumIntegerDigits = maxInt == -1 ? INT32_MAX : maxInt;
  ------------------
  |  Branch (279:52): [True: 134k, False: 12.1k]
  ------------------
  280|       |
  281|   146k|        Precision rounding_;
  282|   146k|        if (useCurrency && precision.fType == Precision::PrecisionType::RND_CURRENCY) {
  ------------------
  |  Branch (282:13): [True: 15.6k, False: 130k]
  |  Branch (282:28): [True: 15.6k, False: 72]
  ------------------
  283|  15.6k|            rounding_ = precision.withCurrency(currency, status);
  284|   130k|        } else {
  285|   130k|            rounding_ = precision;
  286|   130k|        }
  287|   146k|        int minFrac_ = minFrac;
  288|   146k|        int maxFrac_ = maxFrac;
  289|   146k|        int minSig_ = minSig;
  290|   146k|        int maxSig_ = maxSig;
  291|   146k|        double increment_ = 0.0;
  292|   146k|        if (rounding_.fType == Precision::PrecisionType::RND_FRACTION) {
  ------------------
  |  Branch (292:13): [True: 121k, False: 25.0k]
  ------------------
  293|   121k|            minFrac_ = rounding_.fUnion.fracSig.fMinFrac;
  294|   121k|            maxFrac_ = rounding_.fUnion.fracSig.fMaxFrac;
  295|   121k|        } else if (rounding_.fType == Precision::PrecisionType::RND_INCREMENT
  ------------------
  |  Branch (295:20): [True: 4.62k, False: 20.4k]
  ------------------
  296|  25.0k|                || rounding_.fType == Precision::PrecisionType::RND_INCREMENT_ONE
  ------------------
  |  Branch (296:20): [True: 1.00k, False: 19.3k]
  ------------------
  297|  25.0k|                || rounding_.fType == Precision::PrecisionType::RND_INCREMENT_FIVE) {
  ------------------
  |  Branch (297:20): [True: 61, False: 19.3k]
  ------------------
  298|  5.68k|            minFrac_ = rounding_.fUnion.increment.fMinFrac;
  299|       |            // If incrementRounding is used, maxFrac is set equal to minFrac
  300|  5.68k|            maxFrac_ = rounding_.fUnion.increment.fMinFrac;
  301|       |            // Convert the integer increment to a double
  302|  5.68k|            DecimalQuantity dq;
  303|  5.68k|            dq.setToLong(rounding_.fUnion.increment.fIncrement);
  304|  5.68k|            dq.adjustMagnitude(rounding_.fUnion.increment.fIncrementMagnitude);
  305|  5.68k|            increment_ = dq.toDouble();
  306|  19.3k|        } else if (rounding_.fType == Precision::PrecisionType::RND_SIGNIFICANT) {
  ------------------
  |  Branch (306:20): [True: 61, False: 19.2k]
  ------------------
  307|     61|            minSig_ = rounding_.fUnion.fracSig.fMinSig;
  308|     61|            maxSig_ = rounding_.fUnion.fracSig.fMaxSig;
  309|     61|        }
  310|       |
  311|   146k|        exportedProperties->minimumFractionDigits = minFrac_;
  312|   146k|        exportedProperties->maximumFractionDigits = maxFrac_;
  313|   146k|        exportedProperties->minimumSignificantDigits = minSig_;
  314|   146k|        exportedProperties->maximumSignificantDigits = maxSig_;
  315|   146k|        exportedProperties->roundingIncrement = increment_;
  316|   146k|    }
  317|       |
  318|   146k|    return macros;
  319|   146k|}
_ZN6icu_786number4impl30PropertiesAffixPatternProvider5setToERKNS1_23DecimalFormatPropertiesER10UErrorCode:
  322|   249k|void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& properties, UErrorCode& status) {
  323|   249k|    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|   249k|    UnicodeString ppo = AffixUtils::escape(properties.positivePrefix);
  340|   249k|    UnicodeString pso = AffixUtils::escape(properties.positiveSuffix);
  341|   249k|    UnicodeString npo = AffixUtils::escape(properties.negativePrefix);
  342|   249k|    UnicodeString nso = AffixUtils::escape(properties.negativeSuffix);
  343|   249k|    const UnicodeString& ppp = properties.positivePrefixPattern;
  344|   249k|    const UnicodeString& psp = properties.positiveSuffixPattern;
  345|   249k|    const UnicodeString& npp = properties.negativePrefixPattern;
  346|   249k|    const UnicodeString& nsp = properties.negativeSuffixPattern;
  347|       |
  348|   249k|    if (!properties.positivePrefix.isBogus()) {
  ------------------
  |  Branch (348:9): [True: 0, False: 249k]
  ------------------
  349|      0|        posPrefix = ppo;
  350|   249k|    } else if (!ppp.isBogus()) {
  ------------------
  |  Branch (350:16): [True: 229k, False: 19.2k]
  ------------------
  351|   229k|        posPrefix = ppp;
  352|   229k|    } else {
  353|       |        // UTS 35: Default positive prefix is empty string.
  354|  19.2k|        posPrefix = u"";
  355|  19.2k|    }
  356|       |
  357|   249k|    if (!properties.positiveSuffix.isBogus()) {
  ------------------
  |  Branch (357:9): [True: 0, False: 249k]
  ------------------
  358|      0|        posSuffix = pso;
  359|   249k|    } else if (!psp.isBogus()) {
  ------------------
  |  Branch (359:16): [True: 229k, False: 19.2k]
  ------------------
  360|   229k|        posSuffix = psp;
  361|   229k|    } else {
  362|       |        // UTS 35: Default positive suffix is empty string.
  363|  19.2k|        posSuffix = u"";
  364|  19.2k|    }
  365|       |
  366|   249k|    if (!properties.negativePrefix.isBogus()) {
  ------------------
  |  Branch (366:9): [True: 0, False: 249k]
  ------------------
  367|      0|        negPrefix = npo;
  368|   249k|    } else if (!npp.isBogus()) {
  ------------------
  |  Branch (368:16): [True: 2.97k, False: 246k]
  ------------------
  369|  2.97k|        negPrefix = npp;
  370|   246k|    } else {
  371|       |        // UTS 35: Default negative prefix is "-" with positive prefix.
  372|       |        // Important: We prepend the "-" to the pattern, not the override!
  373|   246k|        negPrefix = ppp.isBogus() ? u"-" : u"-" + ppp;
  ------------------
  |  Branch (373:21): [True: 19.2k, False: 226k]
  ------------------
  374|   246k|    }
  375|       |
  376|   249k|    if (!properties.negativeSuffix.isBogus()) {
  ------------------
  |  Branch (376:9): [True: 0, False: 249k]
  ------------------
  377|      0|        negSuffix = nso;
  378|   249k|    } else if (!nsp.isBogus()) {
  ------------------
  |  Branch (378:16): [True: 2.97k, False: 246k]
  ------------------
  379|  2.97k|        negSuffix = nsp;
  380|   246k|    } else {
  381|       |        // UTS 35: Default negative prefix is the positive prefix.
  382|   246k|        negSuffix = psp.isBogus() ? u"" : psp;
  ------------------
  |  Branch (382:21): [True: 19.2k, False: 226k]
  ------------------
  383|   246k|    }
  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|   249k|    isCurrencyPattern = (
  388|   249k|        AffixUtils::hasCurrencySymbols(ppp, status) ||
  ------------------
  |  Branch (388:9): [True: 11.1k, False: 237k]
  ------------------
  389|   249k|        AffixUtils::hasCurrencySymbols(psp, status) ||
  ------------------
  |  Branch (389:9): [True: 18.2k, False: 219k]
  ------------------
  390|   249k|        AffixUtils::hasCurrencySymbols(npp, status) ||
  ------------------
  |  Branch (390:9): [True: 56, False: 219k]
  ------------------
  391|   249k|        AffixUtils::hasCurrencySymbols(nsp, status) ||
  ------------------
  |  Branch (391:9): [True: 68, False: 219k]
  ------------------
  392|   249k|        properties.currencyAsDecimal);
  ------------------
  |  Branch (392:9): [True: 46, False: 219k]
  ------------------
  393|       |
  394|   249k|    fCurrencyAsDecimal = properties.currencyAsDecimal;
  395|   249k|}
_ZNK6icu_786number4impl30PropertiesAffixPatternProvider6charAtEii:
  397|  66.9M|char16_t PropertiesAffixPatternProvider::charAt(int flags, int i) const {
  398|  66.9M|    return getStringInternal(flags).charAt(i);
  399|  66.9M|}
_ZNK6icu_786number4impl30PropertiesAffixPatternProvider6lengthEi:
  401|   410k|int PropertiesAffixPatternProvider::length(int flags) const {
  402|   410k|    return getStringInternal(flags).length();
  403|   410k|}
_ZNK6icu_786number4impl30PropertiesAffixPatternProvider9getStringEi:
  405|   208k|UnicodeString PropertiesAffixPatternProvider::getString(int32_t flags) const {
  406|   208k|    return getStringInternal(flags);
  407|   208k|}
_ZNK6icu_786number4impl30PropertiesAffixPatternProvider17getStringInternalEi:
  409|  67.6M|const UnicodeString& PropertiesAffixPatternProvider::getStringInternal(int32_t flags) const {
  410|  67.6M|    bool prefix = (flags & AFFIX_PREFIX) != 0;
  411|  67.6M|    bool negative = (flags & AFFIX_NEGATIVE_SUBPATTERN) != 0;
  412|  67.6M|    if (prefix && negative) {
  ------------------
  |  Branch (412:9): [True: 50.5M, False: 17.0M]
  |  Branch (412:19): [True: 2.54M, False: 47.9M]
  ------------------
  413|  2.54M|        return negPrefix;
  414|  65.0M|    } else if (prefix) {
  ------------------
  |  Branch (414:16): [True: 47.9M, False: 17.0M]
  ------------------
  415|  47.9M|        return posPrefix;
  416|  47.9M|    } else if (negative) {
  ------------------
  |  Branch (416:16): [True: 1.30M, False: 15.7M]
  ------------------
  417|  1.30M|        return negSuffix;
  418|  15.7M|    } else {
  419|  15.7M|        return posSuffix;
  420|  15.7M|    }
  421|  67.6M|}
_ZNK6icu_786number4impl30PropertiesAffixPatternProvider21hasNegativeSubpatternEv:
  430|   513k|bool PropertiesAffixPatternProvider::hasNegativeSubpattern() const {
  431|   513k|    return (
  432|   513k|        (negSuffix != posSuffix) ||
  ------------------
  |  Branch (432:9): [True: 1.30k, False: 512k]
  ------------------
  433|   513k|        negPrefix.tempSubString(1) != posPrefix ||
  ------------------
  |  Branch (433:9): [True: 5.79k, False: 506k]
  ------------------
  434|   513k|        negPrefix.charAt(0) != u'-'
  ------------------
  |  Branch (434:9): [True: 145, False: 506k]
  ------------------
  435|   513k|    );
  436|   513k|}
_ZNK6icu_786number4impl30PropertiesAffixPatternProvider20negativeHasMinusSignEv:
  438|  2.89k|bool PropertiesAffixPatternProvider::negativeHasMinusSign() const {
  439|  2.89k|    ErrorCode localStatus;
  440|  2.89k|    return AffixUtils::containsType(negPrefix, TYPE_MINUS_SIGN, localStatus) ||
  ------------------
  |  Branch (440:12): [True: 1.68k, False: 1.21k]
  ------------------
  441|  2.89k|           AffixUtils::containsType(negSuffix, TYPE_MINUS_SIGN, localStatus);
  ------------------
  |  Branch (441:12): [True: 46, False: 1.16k]
  ------------------
  442|  2.89k|}
_ZNK6icu_786number4impl30PropertiesAffixPatternProvider15hasCurrencySignEv:
  444|   659k|bool PropertiesAffixPatternProvider::hasCurrencySign() const {
  445|   659k|    return isCurrencyPattern;
  446|   659k|}

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

_ZN6icu_786number5ScaleC2EiPNS0_4impl6DecNumE:
   26|   249k|        : fMagnitude(magnitude), fArbitrary(arbitraryToAdopt), fError(U_ZERO_ERROR) {
   27|   249k|    if (fArbitrary != nullptr) {
  ------------------
  |  Branch (27:9): [True: 0, False: 249k]
  ------------------
   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|   249k|}
_ZN6icu_786number5ScaleC2ERKS1_:
   41|  10.3k|        : fMagnitude(other.fMagnitude), fArbitrary(nullptr), fError(other.fError) {
   42|  10.3k|    if (other.fArbitrary != nullptr) {
  ------------------
  |  Branch (42:9): [True: 0, False: 10.3k]
  ------------------
   43|      0|        UErrorCode localStatus = U_ZERO_ERROR;
   44|      0|        fArbitrary = new DecNum(*other.fArbitrary, localStatus);
   45|      0|    }
   46|  10.3k|}
_ZN6icu_786number5ScaleC2EOS1_:
   62|   156k|        : fMagnitude(src.fMagnitude), fArbitrary(src.fArbitrary), fError(src.fError) {
   63|       |    // Take ownership away from src if necessary
   64|   156k|    src.fArbitrary = nullptr;
   65|   156k|}
_ZN6icu_786number5ScaleaSEOS1_:
   67|   595k|Scale& Scale::operator=(Scale&& src) noexcept {
   68|   595k|    fMagnitude = src.fMagnitude;
   69|   595k|    delete fArbitrary;
   70|   595k|    fArbitrary = src.fArbitrary;
   71|   595k|    fError = src.fError;
   72|       |    // Take ownership away from src if necessary
   73|   595k|    src.fArbitrary = nullptr;
   74|   595k|    return *this;
   75|   595k|}
_ZN6icu_786number5ScaleD2Ev:
   77|  1.10M|Scale::~Scale() {
   78|  1.10M|    delete fArbitrary;
   79|  1.10M|}
_ZN6icu_786number5Scale4noneEv:
   82|   227k|Scale Scale::none() {
   83|   227k|    return {0, nullptr};
   84|   227k|}
_ZN6icu_786number5Scale10powerOfTenEi:
   86|  21.5k|Scale Scale::powerOfTen(int32_t power) {
   87|  21.5k|    return {power, nullptr};
   88|  21.5k|}
_ZNK6icu_786number5Scale17applyReciprocalToERNS0_4impl15DecimalQuantityE:
  137|  87.2k|void Scale::applyReciprocalTo(impl::DecimalQuantity& quantity) const {
  138|  87.2k|    quantity.adjustMagnitude(-fMagnitude);
  139|  87.2k|    if (fArbitrary != nullptr) {
  ------------------
  |  Branch (139:9): [True: 0, False: 87.2k]
  ------------------
  140|      0|        UErrorCode localStatus = U_ZERO_ERROR;
  141|      0|        quantity.divideBy(*fArbitrary, localStatus);
  142|      0|    }
  143|  87.2k|}

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

_ZN6icu_786number18ScientificNotationC2Eabs18UNumberSignDisplay:
   41|  12.1k|                                       UNumberSignDisplay fExponentSignDisplay) {
   42|  12.1k|    ScientificSettings settings;
   43|  12.1k|    settings.fEngineeringInterval = fEngineeringInterval;
   44|  12.1k|    settings.fRequireMinInt = fRequireMinInt;
   45|  12.1k|    settings.fMinExponentDigits = fMinExponentDigits;
   46|  12.1k|    settings.fExponentSignDisplay = fExponentSignDisplay;
   47|  12.1k|    NotationUnion union_;
   48|  12.1k|    union_.scientific = settings;
   49|  12.1k|    *this = {NTN_SCIENTIFIC, union_};
   50|  12.1k|}
_ZN6icu_786number8Notation12compactShortEv:
   52|  9.53k|Notation Notation::compactShort() {
   53|  9.53k|    NotationUnion union_;
   54|  9.53k|    union_.compactStyle = CompactStyle::UNUM_SHORT;
   55|  9.53k|    return {NTN_COMPACT, union_};
   56|  9.53k|}
_ZN6icu_786number8Notation11compactLongEv:
   58|  9.53k|Notation Notation::compactLong() {
   59|  9.53k|    NotationUnion union_;
   60|  9.53k|    union_.compactStyle = CompactStyle::UNUM_LONG;
   61|  9.53k|    return {NTN_COMPACT, union_};
   62|  9.53k|}

_ZN6icu_786number4impl6PadderC2Eii24UNumberFormatPadPosition:
   31|  2.10k|Padder::Padder(UChar32 cp, int32_t width, UNumberFormatPadPosition position) : fWidth(width) {
   32|       |    // TODO(13034): Consider making this a string instead of code point.
   33|  2.10k|    fUnion.padding.fCp = cp;
   34|  2.10k|    fUnion.padding.fPosition = position;
   35|  2.10k|}
_ZN6icu_786number4impl6Padder13forPropertiesERKNS1_23DecimalFormatPropertiesE:
   52|  2.10k|Padder Padder::forProperties(const DecimalFormatProperties& properties) {
   53|  2.10k|    UChar32 padCp;
   54|  2.10k|    if (properties.padString.length() > 0) {
  ------------------
  |  Branch (54:9): [True: 2.10k, False: 0]
  ------------------
   55|  2.10k|        padCp = properties.padString.char32At(0);
   56|  2.10k|    } else {
   57|      0|        padCp = kFallbackPaddingString[0];
   58|      0|    }
   59|  2.10k|    return {padCp, properties.formatWidth, properties.padPosition.getOrDefault(UNUM_PAD_BEFORE_PREFIX)};
   60|  2.10k|}

_ZN6icu_786number4impl20AffixPatternProviderD2Ev:
   20|  2.65M|AffixPatternProvider::~AffixPatternProvider() = default;

_ZN6icu_786number4impl13PatternParser18parseToPatternInfoERKNS_13UnicodeStringERNS1_17ParsedPatternInfoER10UErrorCode:
   26|   122k|                                       UErrorCode& status) {
   27|   122k|    patternInfo.consumePattern(patternString, status);
   28|   122k|}
_ZN6icu_786number4impl13PatternParser25parseToExistingPropertiesERKNS_13UnicodeStringERNS1_23DecimalFormatPropertiesENS1_14IgnoreRoundingER10UErrorCode:
   45|   122k|                                         IgnoreRounding ignoreRounding, UErrorCode& status) {
   46|   122k|    parseToExistingPropertiesImpl(pattern, properties, ignoreRounding, status);
   47|   122k|}
_ZNK6icu_786number4impl17ParsedPatternInfo9getStringEi:
   66|   240k|UnicodeString ParsedPatternInfo::getString(int32_t flags) const {
   67|   240k|    const Endpoints& endpoints = getEndpoints(flags);
   68|   240k|    if (endpoints.start == endpoints.end) {
  ------------------
  |  Branch (68:9): [True: 197k, False: 42.6k]
  ------------------
   69|   197k|        return {};
   70|   197k|    }
   71|       |    // Create a new UnicodeString
   72|  42.6k|    return UnicodeString(pattern, endpoints.start, endpoints.end - endpoints.start);
   73|   240k|}
_ZNK6icu_786number4impl17ParsedPatternInfo12getEndpointsEi:
   75|   240k|const Endpoints& ParsedPatternInfo::getEndpoints(int32_t flags) const {
   76|   240k|    bool prefix = (flags & AFFIX_PREFIX) != 0;
   77|   240k|    bool isNegative = (flags & AFFIX_NEGATIVE_SUBPATTERN) != 0;
   78|   240k|    bool padding = (flags & AFFIX_PADDING) != 0;
   79|   240k|    if (isNegative && padding) {
  ------------------
  |  Branch (79:9): [True: 2.99k, False: 237k]
  |  Branch (79:23): [True: 0, False: 2.99k]
  ------------------
   80|      0|        return negative.paddingEndpoints;
   81|   240k|    } else if (padding) {
  ------------------
  |  Branch (81:16): [True: 2.12k, False: 238k]
  ------------------
   82|  2.12k|        return positive.paddingEndpoints;
   83|   238k|    } else if (prefix && isNegative) {
  ------------------
  |  Branch (83:16): [True: 119k, False: 119k]
  |  Branch (83:26): [True: 1.49k, False: 117k]
  ------------------
   84|  1.49k|        return negative.prefixEndpoints;
   85|   236k|    } else if (prefix) {
  ------------------
  |  Branch (85:16): [True: 117k, False: 119k]
  ------------------
   86|   117k|        return positive.prefixEndpoints;
   87|   119k|    } else if (isNegative) {
  ------------------
  |  Branch (87:16): [True: 1.49k, False: 117k]
  ------------------
   88|  1.49k|        return negative.suffixEndpoints;
   89|   117k|    } else {
   90|   117k|        return positive.suffixEndpoints;
   91|   117k|    }
   92|   240k|}
_ZN6icu_786number4impl17ParsedPatternInfo11ParserState4peekEv:
  126|   201M|UChar32 ParsedPatternInfo::ParserState::peek() {
  127|   201M|    if (offset == pattern.length()) {
  ------------------
  |  Branch (127:9): [True: 859k, False: 200M]
  ------------------
  128|   859k|        return -1;
  129|   200M|    } else {
  130|   200M|        return pattern.char32At(offset);
  131|   200M|    }
  132|   201M|}
_ZN6icu_786number4impl17ParsedPatternInfo11ParserState5peek2Ev:
  134|    645|UChar32 ParsedPatternInfo::ParserState::peek2() {
  135|    645|    if (offset == pattern.length()) {
  ------------------
  |  Branch (135:9): [True: 0, False: 645]
  ------------------
  136|      0|        return -1;
  137|      0|    }
  138|    645|    int32_t cp1 = pattern.char32At(offset);
  139|    645|    int32_t offset2 = offset + U16_LENGTH(cp1);
  ------------------
  |  |  141|    645|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 645, False: 0]
  |  |  ------------------
  ------------------
  140|    645|    if (offset2 == pattern.length()) {
  ------------------
  |  Branch (140:9): [True: 23, False: 622]
  ------------------
  141|     23|        return -1;
  142|     23|    }
  143|    622|    return pattern.char32At(offset2);
  144|    645|}
_ZN6icu_786number4impl17ParsedPatternInfo11ParserState4nextEv:
  146|  51.6M|UChar32 ParsedPatternInfo::ParserState::next() {
  147|  51.6M|    int32_t codePoint = peek();
  148|  51.6M|    offset += U16_LENGTH(codePoint);
  ------------------
  |  |  141|  51.6M|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 51.6M, False: 4.97k]
  |  |  ------------------
  ------------------
  149|  51.6M|    return codePoint;
  150|  51.6M|}
_ZN6icu_786number4impl17ParsedPatternInfo14consumePatternERKNS_13UnicodeStringER10UErrorCode:
  152|   122k|void ParsedPatternInfo::consumePattern(const UnicodeString& patternString, UErrorCode& status) {
  153|   122k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (153:9): [True: 0, False: 122k]
  ------------------
  154|   122k|    this->pattern = patternString;
  155|       |
  156|       |    // This class is not intended for writing twice!
  157|       |    // Use move assignment to overwrite instead.
  158|   122k|    U_ASSERT(state.offset == 0);
  ------------------
  |  |   35|   122k|#   define U_ASSERT(exp) (void)0
  ------------------
  159|       |
  160|       |    // pattern := subpattern (';' subpattern)?
  161|   122k|    currentSubpattern = &positive;
  162|   122k|    consumeSubpattern(status);
  163|   122k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (163:9): [True: 1.05k, False: 121k]
  ------------------
  164|   121k|    if (state.peek() == u';') {
  ------------------
  |  Branch (164:9): [True: 3.34k, False: 118k]
  ------------------
  165|  3.34k|        state.next(); // consume the ';'
  166|       |        // Don't consume the negative subpattern if it is empty (trailing ';')
  167|  3.34k|        if (state.peek() != -1) {
  ------------------
  |  Branch (167:13): [True: 3.33k, False: 15]
  ------------------
  168|  3.33k|            fHasNegativeSubpattern = true;
  169|  3.33k|            currentSubpattern = &negative;
  170|  3.33k|            consumeSubpattern(status);
  171|  3.33k|            if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (171:17): [True: 17, False: 3.31k]
  ------------------
  172|  3.33k|        }
  173|  3.34k|    }
  174|   121k|    if (state.peek() != -1) {
  ------------------
  |  Branch (174:9): [True: 4.05k, False: 117k]
  ------------------
  175|  4.05k|        state.toParseException(u"Found unquoted special character");
  176|  4.05k|        status = U_UNQUOTED_SPECIAL;
  177|  4.05k|    }
  178|   121k|}
_ZN6icu_786number4impl17ParsedPatternInfo17consumeSubpatternER10UErrorCode:
  180|   126k|void ParsedPatternInfo::consumeSubpattern(UErrorCode& status) {
  181|       |    // subpattern := literals? number exponent? literals?
  182|   126k|    consumePadding(PadPosition::UNUM_PAD_BEFORE_PREFIX, status);
  183|   126k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (183:9): [True: 9, False: 125k]
  ------------------
  184|   125k|    consumeAffix(currentSubpattern->prefixEndpoints, status);
  185|   125k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (185:9): [True: 101, False: 125k]
  ------------------
  186|   125k|    consumePadding(PadPosition::UNUM_PAD_AFTER_PREFIX, status);
  187|   125k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (187:9): [True: 2, False: 125k]
  ------------------
  188|   125k|    consumeFormat(status);
  189|   125k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (189:9): [True: 825, False: 125k]
  ------------------
  190|   125k|    consumeExponent(status);
  191|   125k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (191:9): [True: 1, False: 125k]
  ------------------
  192|   125k|    consumePadding(PadPosition::UNUM_PAD_BEFORE_SUFFIX, status);
  193|   125k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (193:9): [True: 2, False: 125k]
  ------------------
  194|   125k|    consumeAffix(currentSubpattern->suffixEndpoints, status);
  195|   125k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (195:9): [True: 121, False: 124k]
  ------------------
  196|   124k|    consumePadding(PadPosition::UNUM_PAD_AFTER_SUFFIX, status);
  197|   124k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (197:9): [True: 6, False: 124k]
  ------------------
  198|   124k|}
_ZN6icu_786number4impl17ParsedPatternInfo14consumePaddingE24UNumberFormatPadPositionR10UErrorCode:
  200|   501k|void ParsedPatternInfo::consumePadding(PadPosition paddingLocation, UErrorCode& status) {
  201|   501k|    if (state.peek() != u'*') {
  ------------------
  |  Branch (201:9): [True: 499k, False: 2.23k]
  ------------------
  202|   499k|        return;
  203|   499k|    }
  204|  2.23k|    if (currentSubpattern->hasPadding) {
  ------------------
  |  Branch (204:9): [True: 6, False: 2.22k]
  ------------------
  205|      6|        state.toParseException(u"Cannot have multiple pad specifiers");
  206|      6|        status = U_MULTIPLE_PAD_SPECIFIERS;
  207|      6|        return;
  208|      6|    }
  209|  2.22k|    currentSubpattern->paddingLocation = paddingLocation;
  210|  2.22k|    currentSubpattern->hasPadding = true;
  211|  2.22k|    state.next(); // consume the '*'
  212|  2.22k|    currentSubpattern->paddingEndpoints.start = state.offset;
  213|  2.22k|    consumeLiteral(status);
  214|  2.22k|    currentSubpattern->paddingEndpoints.end = state.offset;
  215|  2.22k|}
_ZN6icu_786number4impl17ParsedPatternInfo12consumeAffixERNS1_9EndpointsER10UErrorCode:
  217|   251k|void ParsedPatternInfo::consumeAffix(Endpoints& endpoints, UErrorCode& status) {
  218|       |    // literals := { literal }
  219|   251k|    endpoints.start = state.offset;
  220|  44.9M|    while (true) {
  ------------------
  |  Branch (220:12): [Folded - Ignored]
  ------------------
  221|  44.9M|        switch (state.peek()) {
  222|  69.2k|            case u'#':
  ------------------
  |  Branch (222:13): [True: 69.2k, False: 44.8M]
  ------------------
  223|  69.4k|            case u'@':
  ------------------
  |  Branch (223:13): [True: 189, False: 44.9M]
  ------------------
  224|  76.5k|            case u';':
  ------------------
  |  Branch (224:13): [True: 7.06k, False: 44.9M]
  ------------------
  225|  78.6k|            case u'*':
  ------------------
  |  Branch (225:13): [True: 2.09k, False: 44.9M]
  ------------------
  226|  79.0k|            case u'.':
  ------------------
  |  Branch (226:13): [True: 372, False: 44.9M]
  ------------------
  227|  79.2k|            case u',':
  ------------------
  |  Branch (227:13): [True: 209, False: 44.9M]
  ------------------
  228|   127k|            case u'0':
  ------------------
  |  Branch (228:13): [True: 48.5k, False: 44.8M]
  ------------------
  229|   129k|            case u'1':
  ------------------
  |  Branch (229:13): [True: 1.45k, False: 44.9M]
  ------------------
  230|   130k|            case u'2':
  ------------------
  |  Branch (230:13): [True: 846, False: 44.9M]
  ------------------
  231|   130k|            case u'3':
  ------------------
  |  Branch (231:13): [True: 417, False: 44.9M]
  ------------------
  232|   130k|            case u'4':
  ------------------
  |  Branch (232:13): [True: 455, False: 44.9M]
  ------------------
  233|   131k|            case u'5':
  ------------------
  |  Branch (233:13): [True: 363, False: 44.9M]
  ------------------
  234|   131k|            case u'6':
  ------------------
  |  Branch (234:13): [True: 685, False: 44.9M]
  ------------------
  235|   132k|            case u'7':
  ------------------
  |  Branch (235:13): [True: 760, False: 44.9M]
  ------------------
  236|   132k|            case u'8':
  ------------------
  |  Branch (236:13): [True: 282, False: 44.9M]
  ------------------
  237|   133k|            case u'9':
  ------------------
  |  Branch (237:13): [True: 450, False: 44.9M]
  ------------------
  238|   250k|            case -1:
  ------------------
  |  Branch (238:13): [True: 117k, False: 44.8M]
  ------------------
  239|       |                // Characters that cannot appear unquoted in a literal
  240|       |                // break outer;
  241|   250k|                goto after_outer;
  242|       |
  243|  15.5k|            case u'%':
  ------------------
  |  Branch (243:13): [True: 15.5k, False: 44.9M]
  ------------------
  244|  15.5k|                currentSubpattern->hasPercentSign = true;
  245|  15.5k|                break;
  246|       |
  247|    568|            case u'‰':
  ------------------
  |  Branch (247:13): [True: 568, False: 44.9M]
  ------------------
  248|    568|                currentSubpattern->hasPerMilleSign = true;
  249|    568|                break;
  250|       |
  251|  31.4k|            case u'¤':
  ------------------
  |  Branch (251:13): [True: 31.4k, False: 44.8M]
  ------------------
  252|  31.4k|                currentSubpattern->hasCurrencySign = true;
  253|  31.4k|                break;
  254|       |
  255|  25.9k|            case u'-':
  ------------------
  |  Branch (255:13): [True: 25.9k, False: 44.8M]
  ------------------
  256|  25.9k|                currentSubpattern->hasMinusSign = true;
  257|  25.9k|                break;
  258|       |
  259|  3.09k|            case u'+':
  ------------------
  |  Branch (259:13): [True: 3.09k, False: 44.9M]
  ------------------
  260|  3.09k|                currentSubpattern->hasPlusSign = true;
  261|  3.09k|                break;
  262|       |
  263|  44.5M|            default:
  ------------------
  |  Branch (263:13): [True: 44.5M, False: 327k]
  ------------------
  264|  44.5M|                break;
  265|  44.9M|        }
  266|  44.6M|        consumeLiteral(status);
  267|  44.6M|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (267:13): [True: 222, False: 44.6M]
  ------------------
  268|  44.6M|    }
  269|   250k|    after_outer:
  270|   250k|    endpoints.end = state.offset;
  271|   250k|}
_ZN6icu_786number4impl17ParsedPatternInfo14consumeLiteralER10UErrorCode:
  273|  44.6M|void ParsedPatternInfo::consumeLiteral(UErrorCode& status) {
  274|  44.6M|    if (state.peek() == -1) {
  ------------------
  |  Branch (274:9): [True: 12, False: 44.6M]
  ------------------
  275|     12|        state.toParseException(u"Expected unquoted literal but found EOL");
  276|     12|        status = U_PATTERN_SYNTAX_ERROR;
  277|     12|        return;
  278|  44.6M|    } else if (state.peek() == u'\'') {
  ------------------
  |  Branch (278:16): [True: 310k, False: 44.3M]
  ------------------
  279|   310k|        state.next(); // consume the starting quote
  280|  5.49M|        while (state.peek() != u'\'') {
  ------------------
  |  Branch (280:16): [True: 5.18M, False: 310k]
  ------------------
  281|  5.18M|            if (state.peek() == -1) {
  ------------------
  |  Branch (281:17): [True: 223, False: 5.18M]
  ------------------
  282|    223|                state.toParseException(u"Expected quoted literal but found EOL");
  283|    223|                status = U_PATTERN_SYNTAX_ERROR;
  284|    223|                return;
  285|  5.18M|            } else {
  286|  5.18M|                state.next(); // consume a quoted character
  287|  5.18M|            }
  288|  5.18M|        }
  289|   310k|        state.next(); // consume the ending quote
  290|  44.3M|    } else {
  291|       |        // consume a non-quoted literal character
  292|  44.3M|        state.next();
  293|  44.3M|    }
  294|  44.6M|}
_ZN6icu_786number4impl17ParsedPatternInfo13consumeFormatER10UErrorCode:
  296|   125k|void ParsedPatternInfo::consumeFormat(UErrorCode& status) {
  297|   125k|    consumeIntegerFormat(status);
  298|   125k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (298:9): [True: 824, False: 125k]
  ------------------
  299|   125k|    if (state.peek() == u'.') {
  ------------------
  |  Branch (299:9): [True: 12.2k, False: 112k]
  ------------------
  300|  12.2k|        state.next(); // consume the decimal point
  301|  12.2k|        currentSubpattern->hasDecimal = true;
  302|  12.2k|        currentSubpattern->widthExceptAffixes += 1;
  303|  12.2k|        consumeFractionFormat(status);
  304|  12.2k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (304:13): [True: 1, False: 12.2k]
  ------------------
  305|   112k|    } else if (state.peek() == u'¤') {
  ------------------
  |  Branch (305:16): [True: 645, False: 112k]
  ------------------
  306|       |        // Check if currency is a decimal separator
  307|    645|        switch (state.peek2()) {
  308|      3|            case u'#':
  ------------------
  |  Branch (308:13): [True: 3, False: 642]
  ------------------
  309|      8|            case u'0':
  ------------------
  |  Branch (309:13): [True: 5, False: 640]
  ------------------
  310|    556|            case u'1':
  ------------------
  |  Branch (310:13): [True: 548, False: 97]
  ------------------
  311|    565|            case u'2':
  ------------------
  |  Branch (311:13): [True: 9, False: 636]
  ------------------
  312|    566|            case u'3':
  ------------------
  |  Branch (312:13): [True: 1, False: 644]
  ------------------
  313|    567|            case u'4':
  ------------------
  |  Branch (313:13): [True: 1, False: 644]
  ------------------
  314|    570|            case u'5':
  ------------------
  |  Branch (314:13): [True: 3, False: 642]
  ------------------
  315|    573|            case u'6':
  ------------------
  |  Branch (315:13): [True: 3, False: 642]
  ------------------
  316|    575|            case u'7':
  ------------------
  |  Branch (316:13): [True: 2, False: 643]
  ------------------
  317|    576|            case u'8':
  ------------------
  |  Branch (317:13): [True: 1, False: 644]
  ------------------
  318|    577|            case u'9':
  ------------------
  |  Branch (318:13): [True: 1, False: 644]
  ------------------
  319|    577|                break;
  320|     68|            default:
  ------------------
  |  Branch (320:13): [True: 68, False: 577]
  ------------------
  321|       |                // Currency symbol followed by a non-numeric character;
  322|       |                // treat as a normal affix.
  323|     68|                return;
  324|    645|        }
  325|       |        // Currency symbol is followed by a numeric character;
  326|       |        // treat as a decimal separator.
  327|    577|        currentSubpattern->hasCurrencySign = true;
  328|    577|        currentSubpattern->hasCurrencyDecimal = true;
  329|    577|        currentSubpattern->hasDecimal = true;
  330|    577|        currentSubpattern->widthExceptAffixes += 1;
  331|    577|        state.next(); // consume the symbol
  332|    577|        consumeFractionFormat(status);
  333|    577|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (333:13): [True: 0, False: 577]
  ------------------
  334|    577|    }
  335|   125k|}
_ZN6icu_786number4impl17ParsedPatternInfo20consumeIntegerFormatER10UErrorCode:
  337|   125k|void ParsedPatternInfo::consumeIntegerFormat(UErrorCode& status) {
  338|       |    // Convenience reference:
  339|   125k|    ParsedSubpatternInfo& result = *currentSubpattern;
  340|       |
  341|   770k|    while (true) {
  ------------------
  |  Branch (341:12): [Folded - Ignored]
  ------------------
  342|   770k|        switch (state.peek()) {
  343|  23.1k|            case u',':
  ------------------
  |  Branch (343:13): [True: 23.1k, False: 747k]
  ------------------
  344|  23.1k|                result.widthExceptAffixes += 1;
  345|  23.1k|                result.groupingSizes <<= 16;
  346|  23.1k|                break;
  347|       |
  348|   113k|            case u'#':
  ------------------
  |  Branch (348:13): [True: 113k, False: 657k]
  ------------------
  349|   113k|                if (result.integerNumerals > 0) {
  ------------------
  |  Branch (349:21): [True: 700, False: 112k]
  ------------------
  350|    700|                    state.toParseException(u"# cannot follow 0 before decimal point");
  351|    700|                    status = U_UNEXPECTED_TOKEN;
  352|    700|                    return;
  353|    700|                }
  354|   112k|                result.widthExceptAffixes += 1;
  355|   112k|                result.groupingSizes += 1;
  356|   112k|                if (result.integerAtSigns > 0) {
  ------------------
  |  Branch (356:21): [True: 37, False: 112k]
  ------------------
  357|     37|                    result.integerTrailingHashSigns += 1;
  358|   112k|                } else {
  359|   112k|                    result.integerLeadingHashSigns += 1;
  360|   112k|                }
  361|   112k|                result.integerTotal += 1;
  362|   112k|                break;
  363|       |
  364|  12.6k|            case u'@':
  ------------------
  |  Branch (364:13): [True: 12.6k, False: 757k]
  ------------------
  365|  12.6k|                if (result.integerNumerals > 0) {
  ------------------
  |  Branch (365:21): [True: 3, False: 12.6k]
  ------------------
  366|      3|                    state.toParseException(u"Cannot mix 0 and @");
  367|      3|                    status = U_UNEXPECTED_TOKEN;
  368|      3|                    return;
  369|      3|                }
  370|  12.6k|                if (result.integerTrailingHashSigns > 0) {
  ------------------
  |  Branch (370:21): [True: 3, False: 12.6k]
  ------------------
  371|      3|                    state.toParseException(u"Cannot nest # inside of a run of @");
  372|      3|                    status = U_UNEXPECTED_TOKEN;
  373|      3|                    return;
  374|      3|                }
  375|  12.6k|                result.widthExceptAffixes += 1;
  376|  12.6k|                result.groupingSizes += 1;
  377|  12.6k|                result.integerAtSigns += 1;
  378|  12.6k|                result.integerTotal += 1;
  379|  12.6k|                break;
  380|       |
  381|   172k|            case u'0':
  ------------------
  |  Branch (381:13): [True: 172k, False: 598k]
  ------------------
  382|   196k|            case u'1':
  ------------------
  |  Branch (382:13): [True: 24.1k, False: 746k]
  ------------------
  383|   274k|            case u'2':
  ------------------
  |  Branch (383:13): [True: 78.0k, False: 692k]
  ------------------
  384|   283k|            case u'3':
  ------------------
  |  Branch (384:13): [True: 8.66k, False: 761k]
  ------------------
  385|   364k|            case u'4':
  ------------------
  |  Branch (385:13): [True: 81.7k, False: 688k]
  ------------------
  386|   367k|            case u'5':
  ------------------
  |  Branch (386:13): [True: 2.08k, False: 768k]
  ------------------
  387|   380k|            case u'6':
  ------------------
  |  Branch (387:13): [True: 13.8k, False: 756k]
  ------------------
  388|   415k|            case u'7':
  ------------------
  |  Branch (388:13): [True: 34.7k, False: 735k]
  ------------------
  389|   421k|            case u'8':
  ------------------
  |  Branch (389:13): [True: 6.25k, False: 764k]
  ------------------
  390|   496k|            case u'9':
  ------------------
  |  Branch (390:13): [True: 74.2k, False: 696k]
  ------------------
  391|   496k|                if (result.integerAtSigns > 0) {
  ------------------
  |  Branch (391:21): [True: 3, False: 496k]
  ------------------
  392|      3|                    state.toParseException(u"Cannot mix @ and 0");
  393|      3|                    status = U_UNEXPECTED_TOKEN;
  394|      3|                    return;
  395|      3|                }
  396|   496k|                result.widthExceptAffixes += 1;
  397|   496k|                result.groupingSizes += 1;
  398|   496k|                result.integerNumerals += 1;
  399|   496k|                result.integerTotal += 1;
  400|   496k|                if (!result.rounding.isZeroish() || state.peek() != u'0') {
  ------------------
  |  Branch (400:21): [True: 413k, False: 82.9k]
  |  Branch (400:53): [True: 9.18k, False: 73.7k]
  ------------------
  401|   422k|                    result.rounding.appendDigit(static_cast<int8_t>(state.peek() - u'0'), 0, true);
  402|   422k|                }
  403|   496k|                break;
  404|       |
  405|   125k|            default:
  ------------------
  |  Branch (405:13): [True: 125k, False: 645k]
  ------------------
  406|   125k|                goto after_outer;
  407|   770k|        }
  408|   644k|        state.next(); // consume the symbol
  409|   644k|    }
  410|       |
  411|   125k|    after_outer:
  412|       |    // Disallow patterns with a trailing ',' or with two ',' next to each other
  413|   125k|    auto grouping1 = static_cast<int16_t> (result.groupingSizes & 0xffff);
  414|   125k|    auto grouping2 = static_cast<int16_t> ((result.groupingSizes >> 16) & 0xffff);
  415|   125k|    auto grouping3 = static_cast<int16_t> ((result.groupingSizes >> 32) & 0xffff);
  416|   125k|    if (grouping1 == 0 && grouping2 != -1) {
  ------------------
  |  Branch (416:9): [True: 4.63k, False: 120k]
  |  Branch (416:27): [True: 113, False: 4.51k]
  ------------------
  417|    113|        state.toParseException(u"Trailing grouping separator is invalid");
  418|    113|        status = U_UNEXPECTED_TOKEN;
  419|    113|        return;
  420|    113|    }
  421|   125k|    if (grouping2 == 0 && grouping3 != -1) {
  ------------------
  |  Branch (421:9): [True: 69, False: 124k]
  |  Branch (421:27): [True: 2, False: 67]
  ------------------
  422|      2|        state.toParseException(u"Grouping width of zero is invalid");
  423|      2|        status = U_PATTERN_SYNTAX_ERROR;
  424|      2|        return;
  425|      2|    }
  426|   125k|}
_ZN6icu_786number4impl17ParsedPatternInfo21consumeFractionFormatER10UErrorCode:
  428|  12.7k|void ParsedPatternInfo::consumeFractionFormat(UErrorCode& status) {
  429|       |    // Convenience reference:
  430|  12.7k|    ParsedSubpatternInfo& result = *currentSubpattern;
  431|       |
  432|  12.7k|    int32_t zeroCounter = 0;
  433|   755k|    while (true) {
  ------------------
  |  Branch (433:12): [Folded - Ignored]
  ------------------
  434|   755k|        switch (state.peek()) {
  435|  2.32k|            case u'#':
  ------------------
  |  Branch (435:13): [True: 2.32k, False: 752k]
  ------------------
  436|  2.32k|                result.widthExceptAffixes += 1;
  437|  2.32k|                result.fractionHashSigns += 1;
  438|  2.32k|                result.fractionTotal += 1;
  439|  2.32k|                zeroCounter++;
  440|  2.32k|                break;
  441|       |
  442|   151k|            case u'0':
  ------------------
  |  Branch (442:13): [True: 151k, False: 603k]
  ------------------
  443|   242k|            case u'1':
  ------------------
  |  Branch (443:13): [True: 91.2k, False: 664k]
  ------------------
  444|   282k|            case u'2':
  ------------------
  |  Branch (444:13): [True: 40.3k, False: 714k]
  ------------------
  445|   283k|            case u'3':
  ------------------
  |  Branch (445:13): [True: 417, False: 754k]
  ------------------
  446|   324k|            case u'4':
  ------------------
  |  Branch (446:13): [True: 40.7k, False: 714k]
  ------------------
  447|   324k|            case u'5':
  ------------------
  |  Branch (447:13): [True: 419, False: 754k]
  ------------------
  448|   414k|            case u'6':
  ------------------
  |  Branch (448:13): [True: 89.6k, False: 665k]
  ------------------
  449|   687k|            case u'7':
  ------------------
  |  Branch (449:13): [True: 273k, False: 481k]
  ------------------
  450|   687k|            case u'8':
  ------------------
  |  Branch (450:13): [True: 418, False: 754k]
  ------------------
  451|   740k|            case u'9':
  ------------------
  |  Branch (451:13): [True: 52.1k, False: 703k]
  ------------------
  452|   740k|                if (result.fractionHashSigns > 0) {
  ------------------
  |  Branch (452:21): [True: 1, False: 740k]
  ------------------
  453|      1|                    state.toParseException(u"0 cannot follow # after decimal point");
  454|      1|                    status = U_UNEXPECTED_TOKEN;
  455|      1|                    return;
  456|      1|                }
  457|   740k|                result.widthExceptAffixes += 1;
  458|   740k|                result.fractionNumerals += 1;
  459|   740k|                result.fractionTotal += 1;
  460|   740k|                if (state.peek() == u'0') {
  ------------------
  |  Branch (460:21): [True: 151k, False: 588k]
  ------------------
  461|   151k|                    zeroCounter++;
  462|   588k|                } else {
  463|   588k|                    result.rounding
  464|   588k|                            .appendDigit(static_cast<int8_t>(state.peek() - u'0'), zeroCounter, false);
  465|   588k|                    zeroCounter = 0;
  466|   588k|                }
  467|   740k|                break;
  468|       |
  469|  12.7k|            default:
  ------------------
  |  Branch (469:13): [True: 12.7k, False: 742k]
  ------------------
  470|  12.7k|                return;
  471|   755k|        }
  472|   742k|        state.next(); // consume the symbol
  473|   742k|    }
  474|  12.7k|}
_ZN6icu_786number4impl17ParsedPatternInfo15consumeExponentER10UErrorCode:
  476|   125k|void ParsedPatternInfo::consumeExponent(UErrorCode& status) {
  477|       |    // Convenience reference:
  478|   125k|    ParsedSubpatternInfo& result = *currentSubpattern;
  479|       |
  480|   125k|    if (state.peek() != u'E') {
  ------------------
  |  Branch (480:9): [True: 112k, False: 12.9k]
  ------------------
  481|   112k|        return;
  482|   112k|    }
  483|  12.9k|    if ((result.groupingSizes & 0xffff0000L) != 0xffff0000L) {
  ------------------
  |  Branch (483:9): [True: 1, False: 12.9k]
  ------------------
  484|      1|        state.toParseException(u"Cannot have grouping separator in scientific notation");
  485|      1|        status = U_MALFORMED_EXPONENTIAL_PATTERN;
  486|      1|        return;
  487|      1|    }
  488|  12.9k|    state.next(); // consume the E
  489|  12.9k|    result.widthExceptAffixes++;
  490|  12.9k|    if (state.peek() == u'+') {
  ------------------
  |  Branch (490:9): [True: 140, False: 12.8k]
  ------------------
  491|    140|        state.next(); // consume the +
  492|    140|        result.exponentHasPlusSign = true;
  493|    140|        result.widthExceptAffixes++;
  494|    140|    }
  495|  26.0k|    while (state.peek() == u'0') {
  ------------------
  |  Branch (495:12): [True: 13.0k, False: 12.9k]
  ------------------
  496|  13.0k|        state.next(); // consume the 0
  497|  13.0k|        result.exponentZeros += 1;
  498|  13.0k|        result.widthExceptAffixes++;
  499|  13.0k|    }
  500|  12.9k|}
_ZN6icu_786number4impl13PatternParser29parseToExistingPropertiesImplERKNS_13UnicodeStringERNS1_23DecimalFormatPropertiesENS1_14IgnoreRoundingER10UErrorCode:
  508|   122k|                                                  IgnoreRounding ignoreRounding, UErrorCode& status) {
  509|   122k|    if (pattern.length() == 0) {
  ------------------
  |  Branch (509:9): [True: 189, False: 122k]
  ------------------
  510|       |        // Backwards compatibility requires that we reset to the default values.
  511|       |        // TODO: Only overwrite the properties that "saveToProperties" normally touches?
  512|    189|        properties.clear();
  513|    189|        return;
  514|    189|    }
  515|       |
  516|   122k|    ParsedPatternInfo patternInfo;
  517|   122k|    parseToPatternInfo(pattern, patternInfo, status);
  518|   122k|    if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (518:9): [True: 5.12k, False: 117k]
  ------------------
  519|   117k|    patternInfoToProperties(properties, patternInfo, ignoreRounding, status);
  520|   117k|}
_ZN6icu_786number4impl13PatternParser23patternInfoToPropertiesERNS1_23DecimalFormatPropertiesERNS1_17ParsedPatternInfoENS1_14IgnoreRoundingER10UErrorCode:
  524|   117k|                                       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|   117k|    const ParsedSubpatternInfo& positive = patternInfo.positive;
  529|       |
  530|   117k|    bool ignoreRounding;
  531|   117k|    if (_ignoreRounding == IGNORE_ROUNDING_NEVER) {
  ------------------
  |  Branch (531:9): [True: 0, False: 117k]
  ------------------
  532|      0|        ignoreRounding = false;
  533|   117k|    } else if (_ignoreRounding == IGNORE_ROUNDING_IF_CURRENCY) {
  ------------------
  |  Branch (533:16): [True: 108k, False: 9.53k]
  ------------------
  534|   108k|        ignoreRounding = positive.hasCurrencySign;
  535|   108k|    } else {
  536|  9.53k|        U_ASSERT(_ignoreRounding == IGNORE_ROUNDING_ALWAYS);
  ------------------
  |  |   35|  9.53k|#   define U_ASSERT(exp) (void)0
  ------------------
  537|  9.53k|        ignoreRounding = true;
  538|  9.53k|    }
  539|       |
  540|       |    // Grouping settings
  541|   117k|    auto grouping1 = static_cast<int16_t> (positive.groupingSizes & 0xffff);
  542|   117k|    auto grouping2 = static_cast<int16_t> ((positive.groupingSizes >> 16) & 0xffff);
  543|   117k|    auto grouping3 = static_cast<int16_t> ((positive.groupingSizes >> 32) & 0xffff);
  544|   117k|    if (grouping2 != -1) {
  ------------------
  |  Branch (544:9): [True: 20.0k, False: 97.4k]
  ------------------
  545|  20.0k|        properties.groupingSize = grouping1;
  546|  20.0k|        properties.groupingUsed = true;
  547|  97.4k|    } else {
  548|  97.4k|        properties.groupingSize = -1;
  549|  97.4k|        properties.groupingUsed = false;
  550|  97.4k|    }
  551|   117k|    if (grouping3 != -1) {
  ------------------
  |  Branch (551:9): [True: 1.44k, False: 116k]
  ------------------
  552|  1.44k|        properties.secondaryGroupingSize = grouping2;
  553|   116k|    } else {
  554|   116k|        properties.secondaryGroupingSize = -1;
  555|   116k|    }
  556|       |
  557|       |    // For backwards compatibility, require that the pattern emit at least one min digit.
  558|   117k|    int minInt, minFrac;
  559|   117k|    if (positive.integerTotal == 0 && positive.fractionTotal > 0) {
  ------------------
  |  Branch (559:9): [True: 2.15k, False: 115k]
  |  Branch (559:39): [True: 190, False: 1.96k]
  ------------------
  560|       |        // patterns like ".##"
  561|    190|        minInt = 0;
  562|    190|        minFrac = uprv_max(1, positive.fractionNumerals);
  ------------------
  |  | 1526|    190|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|    190|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    190|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    190|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  563|   117k|    } else if (positive.integerNumerals == 0 && positive.fractionNumerals == 0) {
  ------------------
  |  Branch (563:16): [True: 49.7k, False: 67.6k]
  |  Branch (563:49): [True: 49.7k, False: 2]
  ------------------
  564|       |        // patterns like "#.##"
  565|  49.7k|        minInt = 1;
  566|  49.7k|        minFrac = 0;
  567|  67.6k|    } else {
  568|  67.6k|        minInt = positive.integerNumerals;
  569|  67.6k|        minFrac = positive.fractionNumerals;
  570|  67.6k|    }
  571|       |
  572|       |    // Rounding settings
  573|       |    // Don't set basic rounding when there is a currency sign; defer to CurrencyUsage
  574|   117k|    if (positive.integerAtSigns > 0) {
  ------------------
  |  Branch (574:9): [True: 61, False: 117k]
  ------------------
  575|     61|        properties.minimumFractionDigits = -1;
  576|     61|        properties.maximumFractionDigits = -1;
  577|     61|        properties.roundingIncrement = 0.0;
  578|     61|        properties.minimumSignificantDigits = positive.integerAtSigns;
  579|     61|        properties.maximumSignificantDigits = positive.integerAtSigns + positive.integerTrailingHashSigns;
  580|   117k|    } else if (!positive.rounding.isZeroish()) {
  ------------------
  |  Branch (580:16): [True: 6.54k, False: 110k]
  ------------------
  581|  6.54k|        if (!ignoreRounding) {
  ------------------
  |  Branch (581:13): [True: 5.71k, False: 832]
  ------------------
  582|  5.71k|            properties.minimumFractionDigits = minFrac;
  583|  5.71k|            properties.maximumFractionDigits = positive.fractionTotal;
  584|  5.71k|            properties.roundingIncrement = positive.rounding.toDouble();
  585|  5.71k|        } else {
  586|    832|            properties.minimumFractionDigits = -1;
  587|    832|            properties.maximumFractionDigits = -1;
  588|    832|            properties.roundingIncrement = 0.0;
  589|    832|        }
  590|  6.54k|        properties.minimumSignificantDigits = -1;
  591|  6.54k|        properties.maximumSignificantDigits = -1;
  592|   110k|    } else {
  593|   110k|        if (!ignoreRounding) {
  ------------------
  |  Branch (593:13): [True: 96.1k, False: 14.7k]
  ------------------
  594|  96.1k|            properties.minimumFractionDigits = minFrac;
  595|  96.1k|            properties.maximumFractionDigits = positive.fractionTotal;
  596|  96.1k|            properties.roundingIncrement = 0.0;
  597|  96.1k|        } else {
  598|  14.7k|            properties.minimumFractionDigits = -1;
  599|  14.7k|            properties.maximumFractionDigits = -1;
  600|  14.7k|            properties.roundingIncrement = 0.0;
  601|  14.7k|        }
  602|   110k|        properties.minimumSignificantDigits = -1;
  603|   110k|        properties.maximumSignificantDigits = -1;
  604|   110k|    }
  605|       |
  606|       |    // If the pattern ends with a '.' then force the decimal point.
  607|   117k|    if (positive.hasDecimal && positive.fractionTotal == 0) {
  ------------------
  |  Branch (607:9): [True: 11.7k, False: 105k]
  |  Branch (607:32): [True: 56, False: 11.7k]
  ------------------
  608|     56|        properties.decimalSeparatorAlwaysShown = true;
  609|   117k|    } else {
  610|   117k|        properties.decimalSeparatorAlwaysShown = false;
  611|   117k|    }
  612|       |
  613|       |    // Persist the currency as decimal separator
  614|   117k|    properties.currencyAsDecimal = positive.hasCurrencyDecimal;
  615|       |
  616|       |    // Scientific notation settings
  617|   117k|    if (positive.exponentZeros > 0) {
  ------------------
  |  Branch (617:9): [True: 12.1k, False: 105k]
  ------------------
  618|  12.1k|        properties.exponentSignAlwaysShown = positive.exponentHasPlusSign;
  619|  12.1k|        properties.minimumExponentDigits = positive.exponentZeros;
  620|  12.1k|        if (positive.integerAtSigns == 0) {
  ------------------
  |  Branch (620:13): [True: 12.1k, False: 0]
  ------------------
  621|       |            // patterns without '@' can define max integer digits, used for engineering notation
  622|  12.1k|            properties.minimumIntegerDigits = positive.integerNumerals;
  623|  12.1k|            properties.maximumIntegerDigits = positive.integerTotal;
  624|  12.1k|        } else {
  625|       |            // patterns with '@' cannot define max integer digits
  626|      0|            properties.minimumIntegerDigits = 1;
  627|      0|            properties.maximumIntegerDigits = -1;
  628|      0|        }
  629|   105k|    } else {
  630|   105k|        properties.exponentSignAlwaysShown = false;
  631|   105k|        properties.minimumExponentDigits = -1;
  632|   105k|        properties.minimumIntegerDigits = minInt;
  633|   105k|        properties.maximumIntegerDigits = -1;
  634|   105k|    }
  635|       |
  636|       |    // Compute the affix patterns (required for both padding and affixes)
  637|   117k|    UnicodeString posPrefix = patternInfo.getString(AffixPatternProvider::AFFIX_PREFIX);
  638|   117k|    UnicodeString posSuffix = patternInfo.getString(0);
  639|       |
  640|       |    // Padding settings
  641|   117k|    if (positive.hasPadding) {
  ------------------
  |  Branch (641:9): [True: 2.12k, False: 115k]
  ------------------
  642|       |        // The width of the positive prefix and suffix templates are included in the padding
  643|  2.12k|        int paddingWidth = positive.widthExceptAffixes +
  644|  2.12k|                           AffixUtils::estimateLength(posPrefix, status) +
  645|  2.12k|                           AffixUtils::estimateLength(posSuffix, status);
  646|  2.12k|        properties.formatWidth = paddingWidth;
  647|  2.12k|        UnicodeString rawPaddingString = patternInfo.getString(AffixPatternProvider::AFFIX_PADDING);
  648|  2.12k|        if (rawPaddingString.length() == 1) {
  ------------------
  |  Branch (648:13): [True: 2.08k, False: 41]
  ------------------
  649|  2.08k|            properties.padString = rawPaddingString;
  650|  2.08k|        } else if (rawPaddingString.length() == 2) {
  ------------------
  |  Branch (650:20): [True: 12, False: 29]
  ------------------
  651|     12|            if (rawPaddingString.charAt(0) == u'\'') {
  ------------------
  |  Branch (651:17): [True: 7, False: 5]
  ------------------
  652|      7|                properties.padString.setTo(u"'", -1);
  653|      7|            } else {
  654|      5|                properties.padString = rawPaddingString;
  655|      5|            }
  656|     29|        } else {
  657|     29|            properties.padString = UnicodeString(rawPaddingString, 1, rawPaddingString.length() - 2);
  658|     29|        }
  659|  2.12k|        properties.padPosition = positive.paddingLocation;
  660|   115k|    } else {
  661|   115k|        properties.formatWidth = -1;
  662|   115k|        properties.padString.setToBogus();
  663|   115k|        properties.padPosition.nullify();
  664|   115k|    }
  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|   117k|    properties.positivePrefixPattern = posPrefix;
  670|   117k|    properties.positiveSuffixPattern = posSuffix;
  671|   117k|    if (patternInfo.fHasNegativeSubpattern) {
  ------------------
  |  Branch (671:9): [True: 1.49k, False: 116k]
  ------------------
  672|  1.49k|        properties.negativePrefixPattern = patternInfo.getString(
  673|  1.49k|                AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN | AffixPatternProvider::AFFIX_PREFIX);
  674|  1.49k|        properties.negativeSuffixPattern = patternInfo.getString(
  675|  1.49k|                AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN);
  676|   116k|    } else {
  677|   116k|        properties.negativePrefixPattern.setToBogus();
  678|   116k|        properties.negativeSuffixPattern.setToBogus();
  679|   116k|    }
  680|       |
  681|       |    // Set the magnitude multiplier
  682|   117k|    if (positive.hasPercentSign) {
  ------------------
  |  Branch (682:9): [True: 11.1k, False: 106k]
  ------------------
  683|  11.1k|        properties.magnitudeMultiplier = 2;
  684|   106k|    } else if (positive.hasPerMilleSign) {
  ------------------
  |  Branch (684:16): [True: 129, False: 106k]
  ------------------
  685|    129|        properties.magnitudeMultiplier = 3;
  686|   106k|    } else {
  687|   106k|        properties.magnitudeMultiplier = 0;
  688|   106k|    }
  689|   117k|}
_ZN6icu_786number4impl18PatternStringUtils23ignoreRoundingIncrementEdi:
  704|  5.71k|bool PatternStringUtils::ignoreRoundingIncrement(double roundIncr, int32_t maxFrac) {
  705|  5.71k|    if (maxFrac < 0) {
  ------------------
  |  Branch (705:9): [True: 0, False: 5.71k]
  ------------------
  706|      0|        return false;
  707|      0|    }
  708|  5.71k|    int32_t frac = 0;
  709|  5.71k|    roundIncr *= 2.0;
  710|  7.62k|    for (frac = 0; frac <= maxFrac && roundIncr <= 1.0; frac++, roundIncr *= 10.0);
  ------------------
  |  Branch (710:20): [True: 7.62k, False: 0]
  |  Branch (710:39): [True: 1.91k, False: 5.71k]
  ------------------
  711|  5.71k|    return (frac > maxFrac);
  712|  5.71k|}
_ZN6icu_786number4impl18PatternStringUtils26patternInfoToStringBuilderERKNS1_20AffixPatternProviderEbNS1_15PatternSignTypeEbNS_14StandardPlural4FormEbbRNS_13UnicodeStringE:
 1061|   410k|                                                    UnicodeString& output) {
 1062|       |
 1063|       |    // Should the output render '+' where '-' would normally appear in the pattern?
 1064|   410k|    bool plusReplacesMinusSign = (patternSignType == PATTERN_SIGN_TYPE_POS_SIGN)
  ------------------
  |  Branch (1064:34): [True: 0, False: 410k]
  ------------------
 1065|   410k|        && !patternInfo.positiveHasPlusSign();
  ------------------
  |  Branch (1065:12): [True: 0, False: 0]
  ------------------
 1066|       |
 1067|       |    // Should we use the affix from the negative subpattern?
 1068|       |    // (If not, we will use the positive subpattern.)
 1069|   410k|    bool useNegativeAffixPattern = patternInfo.hasNegativeSubpattern()
  ------------------
  |  Branch (1069:36): [True: 5.78k, False: 405k]
  ------------------
 1070|   410k|        && (patternSignType == PATTERN_SIGN_TYPE_NEG
  ------------------
  |  Branch (1070:13): [True: 2.89k, False: 2.89k]
  ------------------
 1071|  5.78k|            || (patternInfo.negativeHasMinusSign() && (plusReplacesMinusSign || approximately)));
  ------------------
  |  Branch (1071:17): [True: 1.72k, False: 1.16k]
  |  Branch (1071:56): [True: 0, False: 1.72k]
  |  Branch (1071:81): [True: 0, False: 1.72k]
  ------------------
 1072|       |
 1073|       |    // Resolve the flags for the affix pattern.
 1074|   410k|    int flags = 0;
 1075|   410k|    if (useNegativeAffixPattern) {
  ------------------
  |  Branch (1075:9): [True: 2.89k, False: 407k]
  ------------------
 1076|  2.89k|        flags |= AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN;
 1077|  2.89k|    }
 1078|   410k|    if (isPrefix) {
  ------------------
  |  Branch (1078:9): [True: 205k, False: 205k]
  ------------------
 1079|   205k|        flags |= AffixPatternProvider::AFFIX_PREFIX;
 1080|   205k|    }
 1081|   410k|    if (plural != StandardPlural::Form::COUNT) {
  ------------------
  |  Branch (1081:9): [True: 410k, False: 0]
  ------------------
 1082|   410k|        U_ASSERT(plural == (AffixPatternProvider::AFFIX_PLURAL_MASK & plural));
  ------------------
  |  |   35|   410k|#   define U_ASSERT(exp) (void)0
  ------------------
 1083|   410k|        flags |= plural;
 1084|   410k|    }
 1085|       |
 1086|       |    // Should we prepend a sign to the pattern?
 1087|   410k|    bool prependSign;
 1088|   410k|    if (!isPrefix || useNegativeAffixPattern) {
  ------------------
  |  Branch (1088:9): [True: 205k, False: 205k]
  |  Branch (1088:22): [True: 1.44k, False: 203k]
  ------------------
 1089|   206k|        prependSign = false;
 1090|   206k|    } else if (patternSignType == PATTERN_SIGN_TYPE_NEG) {
  ------------------
  |  Branch (1090:16): [True: 101k, False: 102k]
  ------------------
 1091|   101k|        prependSign = true;
 1092|   102k|    } else {
 1093|   102k|        prependSign = plusReplacesMinusSign || approximately;
  ------------------
  |  Branch (1093:23): [True: 0, False: 102k]
  |  Branch (1093:48): [True: 0, False: 102k]
  ------------------
 1094|   102k|    }
 1095|       |
 1096|       |    // What symbols should take the place of the sign placeholder?
 1097|   410k|    const char16_t* signSymbols = u"-";
 1098|   410k|    if (approximately) {
  ------------------
  |  Branch (1098:9): [True: 0, False: 410k]
  ------------------
 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|   410k|    } else if (plusReplacesMinusSign) {
  ------------------
  |  Branch (1106:16): [True: 0, False: 410k]
  ------------------
 1107|      0|        signSymbols = u"+";
 1108|      0|    }
 1109|       |
 1110|       |    // Compute the number of tokens in the affix pattern (signSymbols is considered one token).
 1111|   410k|    int length = patternInfo.length(flags) + (prependSign ? 1 : 0);
  ------------------
  |  Branch (1111:47): [True: 101k, False: 309k]
  ------------------
 1112|       |
 1113|       |    // Finally, set the result into the StringBuilder.
 1114|   410k|    output.remove();
 1115|  67.4M|    for (int index = 0; index < length; index++) {
  ------------------
  |  Branch (1115:25): [True: 67.0M, False: 410k]
  ------------------
 1116|  67.0M|        char16_t candidate;
 1117|  67.0M|        if (prependSign && index == 0) {
  ------------------
  |  Branch (1117:13): [True: 23.7M, False: 43.2M]
  |  Branch (1117:28): [True: 101k, False: 23.6M]
  ------------------
 1118|   101k|            candidate = u'-';
 1119|  66.9M|        } else if (prependSign) {
  ------------------
  |  Branch (1119:20): [True: 23.6M, False: 43.2M]
  ------------------
 1120|  23.6M|            candidate = patternInfo.charAt(flags, index - 1);
 1121|  43.2M|        } else {
 1122|  43.2M|            candidate = patternInfo.charAt(flags, index);
 1123|  43.2M|        }
 1124|  67.0M|        if (candidate == u'-') {
  ------------------
  |  Branch (1124:13): [True: 110k, False: 66.9M]
  ------------------
 1125|   110k|            if (u_strlen(signSymbols) == 1) {
  ------------------
  |  |  393|   110k|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|   110k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   110k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   110k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1125:17): [True: 110k, False: 0]
  ------------------
 1126|   110k|                candidate = signSymbols[0];
 1127|   110k|            } else {
 1128|      0|                output.append(signSymbols[0]);
 1129|      0|                candidate = signSymbols[1];
 1130|      0|            }
 1131|   110k|        }
 1132|  67.0M|        if (perMilleReplacesPercent && candidate == u'%') {
  ------------------
  |  Branch (1132:13): [True: 0, False: 67.0M]
  |  Branch (1132:40): [True: 0, False: 0]
  ------------------
 1133|      0|            candidate = u'‰';
 1134|      0|        }
 1135|  67.0M|        if (dropCurrencySymbols && candidate == u'\u00A4') {
  ------------------
  |  Branch (1135:13): [True: 0, False: 67.0M]
  |  Branch (1135:36): [True: 0, False: 0]
  ------------------
 1136|      0|            continue;
 1137|      0|        }
 1138|  67.0M|        output.append(candidate);
 1139|  67.0M|    }
 1140|   410k|}

_ZN6icu_786number4impl17ParsedPatternInfoC2Ev:
   81|   122k|            : state(this->pattern), currentSubpattern(nullptr) {}
_ZN6icu_786number4impl17ParsedPatternInfo11ParserStateC2ERKNS_13UnicodeStringE:
  116|   122k|                : pattern(_pattern) {}
_ZN6icu_786number4impl17ParsedPatternInfo11ParserState16toParseExceptionEPKDs:
  136|  5.12k|        inline void toParseException(const char16_t* message) { (void) message; }
_ZN6icu_786number4impl17ParsedPatternInfoD2Ev:
   83|   122k|    ~ParsedPatternInfo() override = default;

_ZN6icu_786number9Precision9unlimitedEv:
   94|  9.40k|Precision Precision::unlimited() {
   95|  9.40k|    return Precision(RND_NONE, {});
   96|  9.40k|}
_ZN6icu_786number9Precision13fixedFractionEi:
  102|  15.6k|FractionPrecision Precision::fixedFraction(int32_t minMaxFractionPlaces) {
  103|  15.6k|    if (minMaxFractionPlaces >= 0 && minMaxFractionPlaces <= kMaxIntFracSig) {
  ------------------
  |  Branch (103:9): [True: 15.6k, False: 0]
  |  Branch (103:38): [True: 15.6k, False: 0]
  ------------------
  104|  15.6k|        return constructFraction(minMaxFractionPlaces, minMaxFractionPlaces);
  105|  15.6k|    } else {
  106|      0|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
  107|      0|    }
  108|  15.6k|}
_ZN6icu_786number9Precision9incrementEd:
  174|  5.71k|IncrementPrecision Precision::increment(double roundingIncrement) {
  175|  5.71k|    if (roundingIncrement > 0.0) {
  ------------------
  |  Branch (175:9): [True: 5.71k, False: 0]
  ------------------
  176|  5.71k|        DecimalQuantity dq;
  177|  5.71k|        dq.setToDouble(roundingIncrement);
  178|  5.71k|        dq.roundToInfinity();
  179|  5.71k|        int32_t magnitude = dq.adjustToZeroScale();
  180|  5.71k|        return constructIncrement(dq.toLong(), magnitude);
  181|  5.71k|    } else {
  182|      0|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
  183|      0|    }
  184|  5.71k|}
_ZNK6icu_786number9Precision12withCurrencyERKNS_12CurrencyUnitER10UErrorCode:
  245|  15.6k|Precision Precision::withCurrency(const CurrencyUnit &currency, UErrorCode &status) const {
  246|  15.6k|    if (fType == RND_ERROR) { return *this; } // no-op in error state
  ------------------
  |  Branch (246:9): [True: 0, False: 15.6k]
  ------------------
  247|  15.6k|    U_ASSERT(fType == RND_CURRENCY);
  ------------------
  |  |   35|  15.6k|#   define U_ASSERT(exp) (void)0
  ------------------
  248|  15.6k|    const char16_t *isoCode = currency.getISOCurrency();
  249|  15.6k|    double increment = ucurr_getRoundingIncrementForUsage(isoCode, fUnion.currencyUsage, &status);
  ------------------
  |  |  841|  15.6k|#define ucurr_getRoundingIncrementForUsage U_ICU_ENTRY_POINT_RENAME(ucurr_getRoundingIncrementForUsage)
  |  |  ------------------
  |  |  |  |  123|  15.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  15.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  15.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|  15.6k|    int32_t minMaxFrac = ucurr_getDefaultFractionDigitsForUsage(
  ------------------
  |  |  835|  15.6k|#define ucurr_getDefaultFractionDigitsForUsage U_ICU_ENTRY_POINT_RENAME(ucurr_getDefaultFractionDigitsForUsage)
  |  |  ------------------
  |  |  |  |  123|  15.6k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  15.6k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  15.6k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  251|  15.6k|            isoCode, fUnion.currencyUsage, &status);
  252|  15.6k|    Precision retval = (increment != 0.0)
  ------------------
  |  Branch (252:24): [True: 0, False: 15.6k]
  ------------------
  253|  15.6k|        ? Precision::increment(increment)
  254|  15.6k|        : static_cast<Precision>(Precision::fixedFraction(minMaxFrac));
  255|  15.6k|    retval.fTrailingZeroDisplay = fTrailingZeroDisplay;
  256|  15.6k|    return retval;
  257|  15.6k|}
_ZNK6icu_786number18IncrementPrecision15withMinFractionEi:
  269|  5.71k|Precision IncrementPrecision::withMinFraction(int32_t minFrac) const {
  270|  5.71k|    if (fType == RND_ERROR) { return *this; } // no-op in error state
  ------------------
  |  Branch (270:9): [True: 0, False: 5.71k]
  ------------------
  271|  5.71k|    if (minFrac >= 0 && minFrac <= kMaxIntFracSig) {
  ------------------
  |  Branch (271:9): [True: 5.71k, False: 0]
  |  Branch (271:25): [True: 5.68k, False: 25]
  ------------------
  272|  5.68k|        IncrementPrecision copy = *this;
  273|  5.68k|        copy.fUnion.increment.fMinFrac = minFrac;
  274|  5.68k|        return copy;
  275|  5.68k|    } else {
  276|     25|        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
  277|     25|    }
  278|  5.71k|}
_ZN6icu_786number9Precision17constructFractionEii:
  280|   121k|FractionPrecision Precision::constructFraction(int32_t minFrac, int32_t maxFrac) {
  281|   121k|    FractionSignificantSettings settings{};
  282|   121k|    settings.fMinFrac = static_cast<digits_t>(minFrac);
  283|   121k|    settings.fMaxFrac = static_cast<digits_t>(maxFrac);
  284|   121k|    settings.fMinSig = -1;
  285|   121k|    settings.fMaxSig = -1;
  286|   121k|    PrecisionUnion union_{};
  287|   121k|    union_.fracSig = settings;
  288|   121k|    return {RND_FRACTION, union_};
  289|   121k|}
_ZN6icu_786number9Precision20constructSignificantEii:
  291|    603|Precision Precision::constructSignificant(int32_t minSig, int32_t maxSig) {
  292|    603|    FractionSignificantSettings settings{};
  293|    603|    settings.fMinFrac = -1;
  294|    603|    settings.fMaxFrac = -1;
  295|    603|    settings.fMinSig = static_cast<digits_t>(minSig);
  296|    603|    settings.fMaxSig = static_cast<digits_t>(maxSig);
  297|    603|    PrecisionUnion union_{};
  298|    603|    union_.fracSig = settings;
  299|    603|    return {RND_SIGNIFICANT, union_};
  300|    603|}
_ZN6icu_786number9Precision18constructIncrementEms:
  319|  5.71k|IncrementPrecision Precision::constructIncrement(uint64_t increment, digits_t magnitude) {
  320|  5.71k|    IncrementSettings settings{};
  321|       |    // Note: For number formatting, fIncrement is used for RND_INCREMENT but not
  322|       |    // RND_INCREMENT_ONE or RND_INCREMENT_FIVE. However, fIncrement is used in all
  323|       |    // three when constructing a skeleton.
  324|  5.71k|    settings.fIncrement = increment;
  325|  5.71k|    settings.fIncrementMagnitude = magnitude;
  326|  5.71k|    settings.fMinFrac = magnitude > 0 ? 0 : -magnitude;
  ------------------
  |  Branch (326:25): [True: 2.05k, False: 3.65k]
  ------------------
  327|  5.71k|    PrecisionUnion union_{};
  328|  5.71k|    union_.increment = settings;
  329|  5.71k|    if (increment == 1) {
  ------------------
  |  Branch (329:9): [True: 1.00k, False: 4.70k]
  ------------------
  330|       |        // NOTE: In C++, we must return the correct value type with the correct union.
  331|       |        // It would be invalid to return a RND_FRACTION here because the methods on the
  332|       |        // IncrementPrecision type assume that the union is backed by increment data.
  333|  1.00k|        return {RND_INCREMENT_ONE, union_};
  334|  4.70k|    } else if (increment == 5) {
  ------------------
  |  Branch (334:16): [True: 61, False: 4.64k]
  ------------------
  335|     61|        return {RND_INCREMENT_FIVE, union_};
  336|  4.64k|    } else {
  337|  4.64k|        return {RND_INCREMENT, union_};
  338|  4.64k|    }
  339|  5.71k|}
_ZN6icu_786number9Precision17constructCurrencyE14UCurrencyUsage:
  341|  15.6k|CurrencyPrecision Precision::constructCurrency(UCurrencyUsage usage) {
  342|  15.6k|    PrecisionUnion union_{};
  343|  15.6k|    union_.currencyUsage = usage;
  344|  15.6k|    return {RND_CURRENCY, union_};
  345|  15.6k|}

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

_ZN6icu_786number4impl13NullableValueI19UNumberCompactStyleEaSERKS3_:
  331|  19.0k|    NullableValue<T>& operator=(const T& other) {
  332|  19.0k|        fValue = other;
  333|  19.0k|        fNull = false;
  334|  19.0k|        return *this;
  335|  19.0k|    }
_ZN6icu_786number4impl13NullableValueINS_12CurrencyUnitEEC2ERKS4_:
  316|  9.53k|    NullableValue(const NullableValue<T>& other) = default;
_ZN6icu_786number4impl13NullableValueI25UNumberFormatRoundingModeEaSERKS3_:
  331|   146k|    NullableValue<T>& operator=(const T& other) {
  332|   146k|        fValue = other;
  333|   146k|        fNull = false;
  334|   146k|        return *this;
  335|   146k|    }
_ZN6icu_786number4impl13NullableValueI24UNumberFormatPadPositionEaSERKS3_:
  331|  2.12k|    NullableValue<T>& operator=(const T& other) {
  332|  2.12k|        fValue = other;
  333|  2.12k|        fNull = false;
  334|  2.12k|        return *this;
  335|  2.12k|    }
_ZNK6icu_786number4impl13NullableValueINS_12CurrencyUnitEE6isNullEv:
  347|   264k|    bool isNull() const {
  348|   264k|        return fNull;
  349|   264k|    }
_ZNK6icu_786number4impl13NullableValueI14UCurrencyUsageE6isNullEv:
  347|   292k|    bool isNull() const {
  348|   292k|        return fNull;
  349|   292k|    }
_ZN6icu_786number4impl13NullableValueINS_12CurrencyUnitEEaSERKS3_:
  331|   146k|    NullableValue<T>& operator=(const T& other) {
  332|   146k|        fValue = other;
  333|   146k|        fNull = false;
  334|   146k|        return *this;
  335|   146k|    }
_ZNK6icu_786number4impl13NullableValueINS_12CurrencyUnitEE3getER10UErrorCode:
  351|   146k|    T get(UErrorCode& status) const {
  352|   146k|        if (fNull) {
  ------------------
  |  Branch (352:13): [True: 0, False: 146k]
  ------------------
  353|      0|            status = U_UNDEFINED_VARIABLE;
  354|      0|        }
  355|   146k|        return fValue;
  356|   146k|    }
_ZN6icu_786number4impl13NullableValueI19UNumberCompactStyleEC2Ev:
  314|   293k|            : fNull(true) {}
_ZN6icu_786number4impl13NullableValueINS_12CurrencyUnitEEC2Ev:
  314|   293k|            : fNull(true) {}
_ZN6icu_786number4impl13NullableValueI14UCurrencyUsageEC2Ev:
  314|   293k|            : fNull(true) {}
_ZN6icu_786number4impl13NullableValueI24UNumberFormatPadPositionEC2Ev:
  314|   293k|            : fNull(true) {}
_ZN6icu_786number4impl13NullableValueINS1_9ParseModeEEC2Ev:
  314|   293k|            : fNull(true) {}
_ZN6icu_786number4impl13NullableValueI25UNumberFormatRoundingModeEC2Ev:
  314|   293k|            : fNull(true) {}
_ZN6icu_786number4impl13NullableValueI19UNumberCompactStyleE7nullifyEv:
  342|   293k|    void nullify() {
  343|       |        // TODO: It might be nice to call the destructor here.
  344|   293k|        fNull = true;
  345|   293k|    }
_ZN6icu_786number4impl13NullableValueINS_12CurrencyUnitEE7nullifyEv:
  342|   293k|    void nullify() {
  343|       |        // TODO: It might be nice to call the destructor here.
  344|   293k|        fNull = true;
  345|   293k|    }
_ZN6icu_786number4impl13NullableValueI14UCurrencyUsageE7nullifyEv:
  342|   293k|    void nullify() {
  343|       |        // TODO: It might be nice to call the destructor here.
  344|   293k|        fNull = true;
  345|   293k|    }
_ZN6icu_786number4impl13NullableValueI24UNumberFormatPadPositionE7nullifyEv:
  342|   408k|    void nullify() {
  343|       |        // TODO: It might be nice to call the destructor here.
  344|   408k|        fNull = true;
  345|   408k|    }
_ZN6icu_786number4impl13NullableValueINS1_9ParseModeEE7nullifyEv:
  342|   293k|    void nullify() {
  343|       |        // TODO: It might be nice to call the destructor here.
  344|   293k|        fNull = true;
  345|   293k|    }
_ZN6icu_786number4impl13NullableValueI25UNumberFormatRoundingModeE7nullifyEv:
  342|   293k|    void nullify() {
  343|       |        // TODO: It might be nice to call the destructor here.
  344|   293k|        fNull = true;
  345|   293k|    }
_ZNK6icu_786number4impl13NullableValueI19UNumberCompactStyleEeqERKS4_:
  337|   146k|    bool operator==(const NullableValue& other) const {
  338|       |        // "fValue == other.fValue" returns UBool, not bool (causes compiler warnings)
  339|   146k|        return fNull ? other.fNull : (other.fNull ? false : static_cast<bool>(fValue == other.fValue));
  ------------------
  |  Branch (339:16): [True: 127k, False: 19.0k]
  |  Branch (339:39): [True: 19.0k, False: 0]
  ------------------
  340|   146k|    }
_ZNK6icu_786number4impl13NullableValueINS_12CurrencyUnitEEeqERKS4_:
  337|   127k|    bool operator==(const NullableValue& other) const {
  338|       |        // "fValue == other.fValue" returns UBool, not bool (causes compiler warnings)
  339|   127k|        return fNull ? other.fNull : (other.fNull ? false : static_cast<bool>(fValue == other.fValue));
  ------------------
  |  Branch (339:16): [True: 127k, False: 0]
  |  Branch (339:39): [True: 0, False: 0]
  ------------------
  340|   127k|    }
_ZNK6icu_786number4impl13NullableValueI14UCurrencyUsageEeqERKS4_:
  337|   127k|    bool operator==(const NullableValue& other) const {
  338|       |        // "fValue == other.fValue" returns UBool, not bool (causes compiler warnings)
  339|   127k|        return fNull ? other.fNull : (other.fNull ? false : static_cast<bool>(fValue == other.fValue));
  ------------------
  |  Branch (339:16): [True: 127k, False: 0]
  |  Branch (339:39): [True: 0, False: 0]
  ------------------
  340|   127k|    }
_ZNK6icu_786number4impl13NullableValueI24UNumberFormatPadPositionEeqERKS4_:
  337|   101k|    bool operator==(const NullableValue& other) const {
  338|       |        // "fValue == other.fValue" returns UBool, not bool (causes compiler warnings)
  339|   101k|        return fNull ? other.fNull : (other.fNull ? false : static_cast<bool>(fValue == other.fValue));
  ------------------
  |  Branch (339:16): [True: 101k, False: 0]
  |  Branch (339:39): [True: 0, False: 0]
  ------------------
  340|   101k|    }
_ZNK6icu_786number4impl13NullableValueI25UNumberFormatRoundingModeEeqERKS4_:
  337|  97.6k|    bool operator==(const NullableValue& other) const {
  338|       |        // "fValue == other.fValue" returns UBool, not bool (causes compiler warnings)
  339|  97.6k|        return fNull ? other.fNull : (other.fNull ? false : static_cast<bool>(fValue == other.fValue));
  ------------------
  |  Branch (339:16): [True: 97.6k, False: 0]
  |  Branch (339:39): [True: 0, False: 0]
  ------------------
  340|  97.6k|    }
_ZNK6icu_786number4impl13NullableValueI14UCurrencyUsageE12getOrDefaultES3_:
  362|  15.6k|    T getOrDefault(T defaultValue) const {
  363|  15.6k|        return fNull ? defaultValue : fValue;
  ------------------
  |  Branch (363:16): [True: 15.6k, False: 0]
  ------------------
  364|  15.6k|    }
_ZNK6icu_786number4impl13NullableValueI25UNumberFormatRoundingModeE12getOrDefaultES3_:
  362|   146k|    T getOrDefault(T defaultValue) const {
  363|   146k|        return fNull ? defaultValue : fValue;
  ------------------
  |  Branch (363:16): [True: 146k, False: 0]
  ------------------
  364|   146k|    }
_ZNK6icu_786number4impl13NullableValueI19UNumberCompactStyleE6isNullEv:
  347|   146k|    bool isNull() const {
  348|   146k|        return fNull;
  349|   146k|    }
_ZNK6icu_786number4impl13NullableValueI19UNumberCompactStyleE10getNoErrorEv:
  358|  19.0k|    T getNoError() const {
  359|  19.0k|        return fValue;
  360|  19.0k|    }
_ZNK6icu_786number4impl13NullableValueI24UNumberFormatPadPositionE12getOrDefaultES3_:
  362|  2.10k|    T getOrDefault(T defaultValue) const {
  363|  2.10k|        return fNull ? defaultValue : fValue;
  ------------------
  |  Branch (363:16): [True: 0, False: 2.10k]
  ------------------
  364|  2.10k|    }
_ZNK6icu_786number4impl13NullableValueINS1_9ParseModeEE12getOrDefaultES3_:
  362|   102k|    T getOrDefault(T defaultValue) const {
  363|   102k|        return fNull ? defaultValue : fValue;
  ------------------
  |  Branch (363:16): [True: 102k, False: 0]
  ------------------
  364|   102k|    }

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

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

_ZN6icu_7812NumberFormatC2Ev:
  232|   160k|:   fGroupingUsed(true),
  233|   160k|    fMaxIntegerDigits(gDefaultMaxIntegerDigits),
  234|   160k|    fMinIntegerDigits(1),
  235|   160k|    fMaxFractionDigits(3), // invariant, >= minFractionDigits
  236|   160k|    fMinFractionDigits(0),
  237|   160k|    fParseIntegerOnly(false),
  238|   160k|    fLenient(false),
  239|   160k|    fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
  240|   160k|{
  241|   160k|    fCurrency[0] = 0;
  242|   160k|}
_ZN6icu_7812NumberFormatD2Ev:
  247|   169k|{
  248|   169k|}
_ZN6icu_7812NumberFormatC2ERKS0_:
  258|  9.53k|:   Format(source)
  259|  9.53k|{
  260|  9.53k|    *this = source;
  261|  9.53k|}
_ZN6icu_7812NumberFormataSERKS0_:
  268|  9.53k|{
  269|  9.53k|    if (this != &rhs)
  ------------------
  |  Branch (269:9): [True: 9.53k, False: 0]
  ------------------
  270|  9.53k|    {
  271|  9.53k|        Format::operator=(rhs);
  272|  9.53k|        fGroupingUsed = rhs.fGroupingUsed;
  273|  9.53k|        fMaxIntegerDigits = rhs.fMaxIntegerDigits;
  274|  9.53k|        fMinIntegerDigits = rhs.fMinIntegerDigits;
  275|  9.53k|        fMaxFractionDigits = rhs.fMaxFractionDigits;
  276|  9.53k|        fMinFractionDigits = rhs.fMinFractionDigits;
  277|  9.53k|        fParseIntegerOnly = rhs.fParseIntegerOnly;
  278|  9.53k|        u_strncpy(fCurrency, rhs.fCurrency, 3);
  ------------------
  |  |  398|  9.53k|#define u_strncpy U_ICU_ENTRY_POINT_RENAME(u_strncpy)
  |  |  ------------------
  |  |  |  |  123|  9.53k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.53k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.53k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  279|  9.53k|        fCurrency[3] = 0;
  280|  9.53k|        fLenient = rhs.fLenient;
  281|  9.53k|        fCapitalizationContext = rhs.fCapitalizationContext;
  282|  9.53k|    }
  283|  9.53k|    return *this;
  284|  9.53k|}
_ZNK6icu_7812NumberFormat5parseERKNS_13UnicodeStringERNS_11FormattableER10UErrorCode:
  719|  51.2k|{
  720|  51.2k|    if (U_FAILURE(status)) return;
  ------------------
  |  Branch (720:9): [True: 0, False: 51.2k]
  ------------------
  721|       |
  722|  51.2k|    ParsePosition parsePosition(0);
  723|  51.2k|    parse(text, result, parsePosition);
  724|  51.2k|    if (parsePosition.getIndex() == 0) {
  ------------------
  |  Branch (724:9): [True: 34.2k, False: 16.9k]
  ------------------
  725|  34.2k|        status = U_INVALID_FORMAT_ERROR;
  726|  34.2k|    }
  727|  51.2k|}
_ZN6icu_7812NumberFormat14createInstanceERKNS_6LocaleER10UErrorCode:
  783|  9.53k|{
  784|  9.53k|    return createInstance(inLocale, UNUM_DECIMAL, status);
  785|  9.53k|}
_ZN6icu_7812NumberFormat22createCurrencyInstanceERKNS_6LocaleER10UErrorCode:
  801|  9.53k|{
  802|  9.53k|    return createInstance(inLocale, UNUM_CURRENCY, status);
  803|  9.53k|}
_ZN6icu_7812NumberFormat21createPercentInstanceERKNS_6LocaleER10UErrorCode:
  819|  9.53k|{
  820|  9.53k|    return createInstance(inLocale, UNUM_PERCENT, status);
  821|  9.53k|}
_ZN6icu_7812NumberFormat24createScientificInstanceERKNS_6LocaleER10UErrorCode:
  837|  9.53k|{
  838|  9.53k|    return createInstance(inLocale, UNUM_SCIENTIFIC, status);
  839|  9.53k|}
_ZN6icu_7812NumberFormat22internalCreateInstanceERKNS_6LocaleE18UNumberFormatStyleR10UErrorCode:
 1038|  29.3k|NumberFormat::internalCreateInstance(const Locale& loc, UNumberFormatStyle kind, UErrorCode& status) {
 1039|  29.3k|    if (kind == UNUM_CURRENCY) {
  ------------------
  |  Branch (1039:9): [True: 9.53k, False: 19.8k]
  ------------------
 1040|  9.53k|        char cfKeyValue[kKeyValueLenMax] = {0};
 1041|  9.53k|        UErrorCode kvStatus = U_ZERO_ERROR;
 1042|  9.53k|        int32_t kLen = loc.getKeywordValue("cf", cfKeyValue, kKeyValueLenMax, kvStatus);
 1043|  9.53k|        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: 9.53k, False: 0]
  |  Branch (1043:36): [True: 0, False: 9.53k]
  |  Branch (1043:48): [True: 0, False: 0]
  ------------------
 1044|      0|            kind = UNUM_CURRENCY_ACCOUNTING;
 1045|      0|        }
 1046|  9.53k|    }
 1047|  29.3k|#if !UCONFIG_NO_SERVICE
 1048|  29.3k|    if (haveService()) {
  ------------------
  |  Branch (1048:9): [True: 0, False: 29.3k]
  ------------------
 1049|      0|        return (NumberFormat*)gService->get(loc, kind, status);
 1050|      0|    }
 1051|  29.3k|#endif
 1052|  29.3k|    return makeInstance(loc, kind, status);
 1053|  29.3k|}
_ZN6icu_7812NumberFormat14createInstanceERKNS_6LocaleE18UNumberFormatStyleR10UErrorCode:
 1056|  38.1k|NumberFormat::createInstance(const Locale& loc, UNumberFormatStyle kind, UErrorCode& status) {
 1057|  38.1k|    if (kind != UNUM_DECIMAL) {
  ------------------
  |  Branch (1057:9): [True: 28.5k, False: 9.53k]
  ------------------
 1058|  28.5k|        return internalCreateInstance(loc, kind, status);
 1059|  28.5k|    }
 1060|  9.53k|    const SharedNumberFormat *shared = createSharedInstance(loc, kind, status);
 1061|  9.53k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1061:9): [True: 0, False: 9.53k]
  ------------------
 1062|      0|        return nullptr;
 1063|      0|    }
 1064|  9.53k|    NumberFormat *result = (*shared)->clone();
 1065|  9.53k|    shared->removeRef();
 1066|  9.53k|    if (result == nullptr) {
  ------------------
  |  Branch (1066:9): [True: 0, False: 9.53k]
  ------------------
 1067|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1068|      0|    }
 1069|  9.53k|    return result;
 1070|  9.53k|}
_ZN6icu_7812NumberFormat15setGroupingUsedEa:
 1089|   146k|{
 1090|   146k|    fGroupingUsed = newValue;
 1091|   146k|}
_ZN6icu_7812NumberFormat23setMaximumIntegerDigitsEi:
 1108|   146k|{
 1109|   146k|    fMaxIntegerDigits = uprv_max(0, uprv_min(newValue, gDefaultMaxIntegerDigits));
  ------------------
  |  | 1526|   146k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|   146k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   146k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   146k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  fMaxIntegerDigits = uprv_max(0, uprv_min(newValue, gDefaultMaxIntegerDigits));
  ------------------
  |  | 1529|   146k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|   146k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   146k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   146k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1110|   146k|    if(fMinIntegerDigits > fMaxIntegerDigits)
  ------------------
  |  Branch (1110:8): [True: 1, False: 146k]
  ------------------
 1111|      1|        fMinIntegerDigits = fMaxIntegerDigits;
 1112|   146k|}
_ZN6icu_7812NumberFormat23setMinimumIntegerDigitsEi:
 1130|   146k|{
 1131|   146k|    fMinIntegerDigits = uprv_max(0, uprv_min(newValue, gDefaultMinIntegerDigits));
  ------------------
  |  | 1526|   146k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|   146k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   146k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   146k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  fMinIntegerDigits = uprv_max(0, uprv_min(newValue, gDefaultMinIntegerDigits));
  ------------------
  |  | 1529|   146k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|   146k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   146k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   146k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1132|   146k|    if(fMinIntegerDigits > fMaxIntegerDigits)
  ------------------
  |  Branch (1132:8): [True: 0, False: 146k]
  ------------------
 1133|      0|        fMaxIntegerDigits = fMinIntegerDigits;
 1134|   146k|}
_ZN6icu_7812NumberFormat24setMaximumFractionDigitsEi:
 1152|   146k|{
 1153|   146k|    fMaxFractionDigits = uprv_max(0, uprv_min(newValue, gDefaultMaxIntegerDigits));
  ------------------
  |  | 1526|   146k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|   146k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   146k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   146k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  fMaxFractionDigits = uprv_max(0, uprv_min(newValue, gDefaultMaxIntegerDigits));
  ------------------
  |  | 1529|   146k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|   146k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   146k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   146k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1154|   146k|    if(fMaxFractionDigits < fMinFractionDigits)
  ------------------
  |  Branch (1154:8): [True: 0, False: 146k]
  ------------------
 1155|      0|        fMinFractionDigits = fMaxFractionDigits;
 1156|   146k|}
_ZN6icu_7812NumberFormat24setMinimumFractionDigitsEi:
 1174|   146k|{
 1175|   146k|    fMinFractionDigits = uprv_max(0, uprv_min(newValue, gDefaultMinIntegerDigits));
  ------------------
  |  | 1526|   146k|#define uprv_max U_ICU_ENTRY_POINT_RENAME(uprv_max)
  |  |  ------------------
  |  |  |  |  123|   146k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   146k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   146k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  fMinFractionDigits = uprv_max(0, uprv_min(newValue, gDefaultMinIntegerDigits));
  ------------------
  |  | 1529|   146k|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|   146k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   146k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   146k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1176|   146k|    if (fMaxFractionDigits < fMinFractionDigits)
  ------------------
  |  Branch (1176:9): [True: 1, False: 146k]
  ------------------
 1177|      1|        fMaxFractionDigits = fMinFractionDigits;
 1178|   146k|}
_ZN6icu_7812NumberFormat11setCurrencyEPKDsR10UErrorCode:
 1182|   146k|void NumberFormat::setCurrency(const char16_t* theCurrency, UErrorCode& ec) {
 1183|   146k|    if (U_FAILURE(ec)) {
  ------------------
  |  Branch (1183:9): [True: 0, False: 146k]
  ------------------
 1184|      0|        return;
 1185|      0|    }
 1186|   146k|    if (theCurrency) {
  ------------------
  |  Branch (1186:9): [True: 146k, False: 0]
  ------------------
 1187|   146k|        u_strncpy(fCurrency, theCurrency, 3);
  ------------------
  |  |  398|   146k|#define u_strncpy U_ICU_ENTRY_POINT_RENAME(u_strncpy)
  |  |  ------------------
  |  |  |  |  123|   146k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|   146k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|   146k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1188|   146k|        fCurrency[3] = 0;
 1189|   146k|    } else {
 1190|      0|        fCurrency[0] = 0;
 1191|      0|    }
 1192|   146k|}
_ZNK6icu_7814LocaleCacheKeyINS_18SharedNumberFormatEE12createObjectEPKvR10UErrorCode:
 1261|    760|        const void * /*unused*/, UErrorCode &status) const {
 1262|    760|    const char *localeId = fLoc.getName();
 1263|    760|    NumberFormat *nf = NumberFormat::internalCreateInstance(
 1264|    760|            localeId, UNUM_DECIMAL, status);
 1265|    760|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1265:9): [True: 0, False: 760]
  ------------------
 1266|      0|        return nullptr;
 1267|      0|    }
 1268|    760|    SharedNumberFormat *result = new SharedNumberFormat(nf);
 1269|    760|    if (result == nullptr) {
  ------------------
  |  Branch (1269:9): [True: 0, False: 760]
  ------------------
 1270|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1271|      0|        delete nf;
 1272|      0|        return nullptr;
 1273|      0|    }
 1274|    760|    result->addRef();
 1275|    760|    return result;
 1276|    760|}
_ZN6icu_7812NumberFormat20createSharedInstanceERKNS_6LocaleE18UNumberFormatStyleR10UErrorCode:
 1279|  9.53k|NumberFormat::createSharedInstance(const Locale& loc, UNumberFormatStyle kind, UErrorCode& status) {
 1280|  9.53k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1280:9): [True: 0, False: 9.53k]
  ------------------
 1281|      0|        return nullptr;
 1282|      0|    }
 1283|  9.53k|    if (kind != UNUM_DECIMAL) {
  ------------------
  |  Branch (1283:9): [True: 0, False: 9.53k]
  ------------------
 1284|      0|        status = U_UNSUPPORTED_ERROR;
 1285|      0|        return nullptr;
 1286|      0|    }
 1287|  9.53k|    const SharedNumberFormat *result = nullptr;
 1288|  9.53k|    UnifiedCache::getByLocale(loc, result, status);
 1289|  9.53k|    return result;
 1290|  9.53k|}
_ZN6icu_7812NumberFormat16isStyleSupportedE18UNumberFormatStyle:
 1293|  29.3k|NumberFormat::isStyleSupported(UNumberFormatStyle style) {
 1294|  29.3k|    return gLastResortNumberPatterns[style] != nullptr;
 1295|  29.3k|}
_ZN6icu_7812NumberFormat12makeInstanceERKNS_6LocaleE18UNumberFormatStyleR10UErrorCode:
 1300|  29.3k|                           UErrorCode& status) {
 1301|  29.3k|  return makeInstance(desiredLocale, style, false, status);
 1302|  29.3k|}
_ZN6icu_7812NumberFormat12makeInstanceERKNS_6LocaleE18UNumberFormatStyleaR10UErrorCode:
 1308|  29.3k|                           UErrorCode& status) {
 1309|  29.3k|    if (U_FAILURE(status)) return nullptr;
  ------------------
  |  Branch (1309:9): [True: 0, False: 29.3k]
  ------------------
 1310|       |
 1311|  29.3k|    if (style < 0 || style >= UNUM_FORMAT_STYLE_COUNT) {
  ------------------
  |  Branch (1311:9): [True: 0, False: 29.3k]
  |  Branch (1311:22): [True: 0, False: 29.3k]
  ------------------
 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|  29.3k|    if (style == UNUM_NUMBERING_SYSTEM) {
  ------------------
  |  Branch (1320:9): [True: 0, False: 29.3k]
  ------------------
 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|  29.3k|    if (!isStyleSupported(style)) {
  ------------------
  |  Branch (1330:9): [True: 0, False: 29.3k]
  ------------------
 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|  29.3k|    umtx_initOnce(gNSCacheInitOnce, &nscacheInit);
 1371|       |
 1372|       |    // Get cached numbering system
 1373|  29.3k|    LocalPointer<NumberingSystem> ownedNs;
 1374|  29.3k|    NumberingSystem *ns = nullptr;
 1375|  29.3k|    if (NumberingSystem_cache != nullptr) {
  ------------------
  |  Branch (1375:9): [True: 29.3k, False: 0]
  ------------------
 1376|       |        // TODO: Bad hash key usage, see ticket #8504.
 1377|  29.3k|        int32_t hashKey = desiredLocale.hashCode();
 1378|       |
 1379|  29.3k|        static UMutex nscacheMutex;
 1380|  29.3k|        Mutex lock(&nscacheMutex);
 1381|  29.3k|        ns = static_cast<NumberingSystem*>(uhash_iget(NumberingSystem_cache, hashKey));
  ------------------
  |  | 1019|  29.3k|#define uhash_iget U_ICU_ENTRY_POINT_RENAME(uhash_iget)
  |  |  ------------------
  |  |  |  |  123|  29.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  29.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  29.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1382|  29.3k|        if (ns == nullptr) {
  ------------------
  |  Branch (1382:13): [True: 760, False: 28.5k]
  ------------------
 1383|    760|            ns = NumberingSystem::createInstance(desiredLocale,status);
 1384|    760|            uhash_iput(NumberingSystem_cache, hashKey, (void*)ns, &status);
  ------------------
  |  | 1024|    760|#define uhash_iput U_ICU_ENTRY_POINT_RENAME(uhash_iput)
  |  |  ------------------
  |  |  |  |  123|    760|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    760|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    760|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1385|    760|        }
 1386|  29.3k|    } 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|  29.3k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1392:9): [True: 0, False: 29.3k]
  ------------------
 1393|      0|        return nullptr;
 1394|      0|    }
 1395|       |
 1396|  29.3k|    if (mustBeDecimalFormat && ns->isAlgorithmic()) {
  ------------------
  |  Branch (1396:9): [True: 0, False: 29.3k]
  |  Branch (1396:32): [True: 0, False: 0]
  ------------------
 1397|      0|        status = U_UNSUPPORTED_ERROR;
 1398|      0|        return nullptr;
 1399|      0|    }
 1400|       |
 1401|  29.3k|    LocalPointer<DecimalFormatSymbols> symbolsToAdopt;
 1402|  29.3k|    UnicodeString pattern;
 1403|  29.3k|    LocalUResourceBundlePointer ownedResource(ures_open(nullptr, desiredLocale.getName(), &status));
  ------------------
  |  | 1691|  29.3k|#define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open)
  |  |  ------------------
  |  |  |  |  123|  29.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  29.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  29.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1404|  29.3k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1404:9): [True: 0, False: 29.3k]
  ------------------
 1405|      0|        return nullptr;
 1406|      0|    }
 1407|  29.3k|    else {
 1408|       |        // Loads the decimal symbols of the desired locale.
 1409|  29.3k|        symbolsToAdopt.adoptInsteadAndCheckErrorCode(new DecimalFormatSymbols(desiredLocale, status), status);
 1410|  29.3k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1410:13): [True: 0, False: 29.3k]
  ------------------
 1411|      0|            return nullptr;
 1412|      0|        }
 1413|       |
 1414|       |        // Load the pattern from data using the common library function
 1415|  29.3k|        const char16_t* patternPtr = number::impl::utils::getPatternForStyle(
 1416|  29.3k|                desiredLocale,
 1417|  29.3k|                ns->getName(),
 1418|  29.3k|                gFormatCldrStyles[style],
 1419|  29.3k|                status);
 1420|  29.3k|        pattern = UnicodeString(true, patternPtr, -1);
 1421|  29.3k|    }
 1422|  29.3k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1422:9): [True: 0, False: 29.3k]
  ------------------
 1423|      0|        return nullptr;
 1424|      0|    }
 1425|  29.3k|    if(style==UNUM_CURRENCY || style == UNUM_CURRENCY_ISO || style == UNUM_CURRENCY_ACCOUNTING 
  ------------------
  |  Branch (1425:8): [True: 9.53k, False: 19.8k]
  |  Branch (1425:32): [True: 0, False: 19.8k]
  |  Branch (1425:62): [True: 0, False: 19.8k]
  ------------------
 1426|  29.3k|        || style == UNUM_CASH_CURRENCY || style == UNUM_CURRENCY_STANDARD){
  ------------------
  |  Branch (1426:12): [True: 0, False: 19.8k]
  |  Branch (1426:43): [True: 0, False: 19.8k]
  ------------------
 1427|  9.53k|        const char16_t* currPattern = symbolsToAdopt->getCurrencyPattern();
 1428|  9.53k|        if(currPattern!=nullptr){
  ------------------
  |  Branch (1428:12): [True: 283, False: 9.24k]
  ------------------
 1429|    283|            pattern.setTo(currPattern, u_strlen(currPattern));
  ------------------
  |  |  393|    283|#define u_strlen U_ICU_ENTRY_POINT_RENAME(u_strlen)
  |  |  ------------------
  |  |  |  |  123|    283|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|    283|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|    283|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1430|    283|        }
 1431|  9.53k|    }
 1432|       |
 1433|  29.3k|    LocalPointer<NumberFormat> f;
 1434|  29.3k|    if (ns->isAlgorithmic()) {
  ------------------
  |  Branch (1434:9): [True: 0, False: 29.3k]
  ------------------
 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|  29.3k|    } else {
 1470|       |        // replace single currency sign in the pattern with double currency sign
 1471|       |        // if the style is UNUM_CURRENCY_ISO
 1472|  29.3k|        if (style == UNUM_CURRENCY_ISO) {
  ------------------
  |  Branch (1472:13): [True: 0, False: 29.3k]
  ------------------
 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|  29.3k|        DecimalFormatSymbols *syms = symbolsToAdopt.getAlias();
 1480|  29.3k|        LocalPointer<DecimalFormat> df(new DecimalFormat(pattern, syms, style, status));
 1481|       |
 1482|  29.3k|        if (df.isValid()) {
  ------------------
  |  Branch (1482:13): [True: 29.3k, False: 0]
  ------------------
 1483|       |            // if the DecimalFormat object was successfully new'ed, then it will own symbolsToAdopt, even if the status is a failure.
 1484|  29.3k|            symbolsToAdopt.orphan();
 1485|  29.3k|        }
 1486|      0|        else {
 1487|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1488|      0|        }
 1489|       |
 1490|  29.3k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1490:13): [True: 0, False: 29.3k]
  ------------------
 1491|      0|            return nullptr;
 1492|      0|        }
 1493|       |
 1494|       |        // if it is cash currency style, setCurrencyUsage with usage
 1495|  29.3k|        if (style == UNUM_CASH_CURRENCY){
  ------------------
  |  Branch (1495:13): [True: 0, False: 29.3k]
  ------------------
 1496|      0|            df->setCurrencyUsage(UCURR_USAGE_CASH, &status);
 1497|      0|        }
 1498|       |
 1499|  29.3k|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (1499:13): [True: 0, False: 29.3k]
  ------------------
 1500|      0|            return nullptr;
 1501|      0|        }
 1502|       |
 1503|  29.3k|        f.adoptInstead(df.orphan());
 1504|  29.3k|    }
 1505|       |
 1506|  29.3k|    f->setLocaleIDs(ures_getLocaleByType(ownedResource.getAlias(), ULOC_VALID_LOCALE, &status),
  ------------------
  |  | 1669|  29.3k|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|  29.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  29.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  29.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1507|  29.3k|                    ures_getLocaleByType(ownedResource.getAlias(), ULOC_ACTUAL_LOCALE, &status));
  ------------------
  |  | 1669|  29.3k|#define ures_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ures_getLocaleByType)
  |  |  ------------------
  |  |  |  |  123|  29.3k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  29.3k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  29.3k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1508|  29.3k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1508:9): [True: 0, False: 29.3k]
  ------------------
 1509|      0|        return nullptr;
 1510|      0|    }
 1511|  29.3k|    return f.orphan();
 1512|  29.3k|}
numfmt.cpp:_ZN6icu_78L11haveServiceEv:
  982|  29.3k|static UBool haveService() {
  983|  29.3k|    return !gServiceInitOnce.isReset() && (getNumberFormatService() != nullptr);
  ------------------
  |  Branch (983:12): [True: 0, False: 29.3k]
  |  Branch (983:43): [True: 0, False: 0]
  ------------------
  984|  29.3k|}
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_788numparse4impl26AffixPatternMatcherBuilderC2ERKNS_13UnicodeStringERNS1_26AffixTokenMatcherWarehouseEPNS1_17IgnorablesMatcherE:
   64|   159k|        : fMatchersLen(0),
   65|   159k|          fLastTypeOrCp(0),
   66|   159k|          fPattern(pattern),
   67|   159k|          fWarehouse(warehouse),
   68|   159k|          fIgnorables(ignorables) {}
_ZN6icu_788numparse4impl26AffixPatternMatcherBuilder12consumeTokenENS_6number4impl16AffixPatternTypeEiR10UErrorCode:
   70|  66.7M|void AffixPatternMatcherBuilder::consumeToken(AffixPatternType type, UChar32 cp, UErrorCode& status) {
   71|       |    // This is called by AffixUtils.iterateWithConsumer() for each token.
   72|       |
   73|       |    // Add an ignorables matcher between tokens except between two literals, and don't put two
   74|       |    // ignorables matchers in a row.
   75|  66.7M|    if (fIgnorables != nullptr && fMatchersLen > 0 &&
  ------------------
  |  Branch (75:9): [True: 0, False: 66.7M]
  |  Branch (75:35): [True: 0, False: 0]
  ------------------
   76|  66.7M|        (fLastTypeOrCp < 0 || !fIgnorables->getSet()->contains(fLastTypeOrCp))) {
  ------------------
  |  Branch (76:10): [True: 0, False: 0]
  |  Branch (76:31): [True: 0, False: 0]
  ------------------
   77|      0|        addMatcher(*fIgnorables);
   78|      0|    }
   79|       |
   80|  66.7M|    if (type != TYPE_CODEPOINT) {
  ------------------
  |  Branch (80:9): [True: 181k, False: 66.5M]
  ------------------
   81|       |        // Case 1: the token is a symbol.
   82|   181k|        switch (type) {
   83|   108k|            case TYPE_MINUS_SIGN:
  ------------------
  |  Branch (83:13): [True: 108k, False: 72.5k]
  ------------------
   84|   108k|                addMatcher(fWarehouse.minusSign());
   85|   108k|                break;
   86|  5.40k|            case TYPE_PLUS_SIGN:
  ------------------
  |  Branch (86:13): [True: 5.40k, False: 175k]
  ------------------
   87|  5.40k|                addMatcher(fWarehouse.plusSign());
   88|  5.40k|                break;
   89|  24.6k|            case TYPE_PERCENT:
  ------------------
  |  Branch (89:13): [True: 24.6k, False: 156k]
  ------------------
   90|  24.6k|                addMatcher(fWarehouse.percent());
   91|  24.6k|                break;
   92|    874|            case TYPE_PERMILLE:
  ------------------
  |  Branch (92:13): [True: 874, False: 180k]
  ------------------
   93|    874|                addMatcher(fWarehouse.permille());
   94|    874|                break;
   95|  36.7k|            case TYPE_CURRENCY_SINGLE:
  ------------------
  |  Branch (95:13): [True: 36.7k, False: 144k]
  ------------------
   96|  38.1k|            case TYPE_CURRENCY_DOUBLE:
  ------------------
  |  Branch (96:13): [True: 1.33k, False: 179k]
  ------------------
   97|  40.4k|            case TYPE_CURRENCY_TRIPLE:
  ------------------
  |  Branch (97:13): [True: 2.30k, False: 179k]
  ------------------
   98|  40.9k|            case TYPE_CURRENCY_QUAD:
  ------------------
  |  Branch (98:13): [True: 525, False: 180k]
  ------------------
   99|  41.6k|            case TYPE_CURRENCY_QUINT:
  ------------------
  |  Branch (99:13): [True: 669, False: 180k]
  ------------------
  100|       |                // All currency symbols use the same matcher
  101|  41.6k|                addMatcher(fWarehouse.currency(status));
  102|  41.6k|                break;
  103|      0|            default:
  ------------------
  |  Branch (103:13): [True: 0, False: 181k]
  ------------------
  104|      0|                UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  105|   181k|        }
  106|       |
  107|  66.5M|    } else if (fIgnorables != nullptr && fIgnorables->getSet()->contains(cp)) {
  ------------------
  |  Branch (107:16): [True: 0, False: 66.5M]
  |  Branch (107:42): [True: 0, False: 0]
  ------------------
  108|       |        // Case 2: the token is an ignorable literal.
  109|       |        // No action necessary: the ignorables matcher has already been added.
  110|       |
  111|  66.5M|    } else {
  112|       |        // Case 3: the token is a non-ignorable literal.
  113|  66.5M|        if (auto* ptr = fWarehouse.nextCodePointMatcher(cp, status)) {
  ------------------
  |  Branch (113:19): [True: 66.5M, False: 0]
  ------------------
  114|  66.5M|            addMatcher(*ptr);
  115|  66.5M|        } else {
  116|       |            // OOM; unwind the stack
  117|      0|            return;
  118|      0|        }
  119|  66.5M|    }
  120|  66.7M|    fLastTypeOrCp = type != TYPE_CODEPOINT ? type : cp;
  ------------------
  |  Branch (120:21): [True: 181k, False: 66.5M]
  ------------------
  121|  66.7M|}
_ZN6icu_788numparse4impl26AffixPatternMatcherBuilder10addMatcherERNS1_18NumberParseMatcherE:
  123|  66.7M|void AffixPatternMatcherBuilder::addMatcher(NumberParseMatcher& matcher) {
  124|  66.7M|    if (fMatchersLen >= fMatchers.getCapacity()) {
  ------------------
  |  Branch (124:9): [True: 35.1k, False: 66.7M]
  ------------------
  125|  35.1k|        fMatchers.resize(fMatchersLen * 2, fMatchersLen);
  126|  35.1k|    }
  127|  66.7M|    fMatchers[fMatchersLen++] = &matcher;
  128|  66.7M|}
_ZN6icu_788numparse4impl26AffixPatternMatcherBuilder5buildER10UErrorCode:
  130|   159k|AffixPatternMatcher AffixPatternMatcherBuilder::build(UErrorCode& status) {
  131|   159k|    return AffixPatternMatcher(fMatchers, fMatchersLen, fPattern, status);
  132|   159k|}
_ZN6icu_788numparse4impl26AffixTokenMatcherWarehouseC2EPKNS1_26AffixTokenMatcherSetupDataE:
  135|   102k|        : fSetupData(setupData) {}
_ZN6icu_788numparse4impl26AffixTokenMatcherWarehouse9minusSignEv:
  137|   108k|NumberParseMatcher& AffixTokenMatcherWarehouse::minusSign() {
  138|   108k|    return fMinusSign = {fSetupData->dfs, true};
  139|   108k|}
_ZN6icu_788numparse4impl26AffixTokenMatcherWarehouse8plusSignEv:
  141|  5.40k|NumberParseMatcher& AffixTokenMatcherWarehouse::plusSign() {
  142|  5.40k|    return fPlusSign = {fSetupData->dfs, true};
  143|  5.40k|}
_ZN6icu_788numparse4impl26AffixTokenMatcherWarehouse7percentEv:
  145|  24.6k|NumberParseMatcher& AffixTokenMatcherWarehouse::percent() {
  146|  24.6k|    return fPercent = {fSetupData->dfs};
  147|  24.6k|}
_ZN6icu_788numparse4impl26AffixTokenMatcherWarehouse8permilleEv:
  149|    874|NumberParseMatcher& AffixTokenMatcherWarehouse::permille() {
  150|    874|    return fPermille = {fSetupData->dfs};
  151|    874|}
_ZN6icu_788numparse4impl26AffixTokenMatcherWarehouse8currencyER10UErrorCode:
  153|  41.6k|NumberParseMatcher& AffixTokenMatcherWarehouse::currency(UErrorCode& status) {
  154|  41.6k|    return fCurrency = {fSetupData->currencySymbols, fSetupData->dfs, fSetupData->parseFlags, status};
  155|  41.6k|}
_ZN6icu_788numparse4impl26AffixTokenMatcherWarehouse20nextCodePointMatcherEiR10UErrorCode:
  161|  66.5M|NumberParseMatcher* AffixTokenMatcherWarehouse::nextCodePointMatcher(UChar32 cp, UErrorCode& status) {
  162|  66.5M|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (162:9): [True: 0, False: 66.5M]
  ------------------
  163|      0|        return nullptr;
  164|      0|    }
  165|  66.5M|    auto* result = fCodePoints.create(cp);
  166|  66.5M|    if (result == nullptr) {
  ------------------
  |  Branch (166:9): [True: 0, False: 66.5M]
  ------------------
  167|      0|        status = U_MEMORY_ALLOCATION_ERROR;
  168|      0|    }
  169|  66.5M|    return result;
  170|  66.5M|}
_ZNK6icu_788numparse4impl26AffixTokenMatcherWarehouse22hasEmptyCurrencySymbolEv:
  172|  41.5k|bool AffixTokenMatcherWarehouse::hasEmptyCurrencySymbol() const {
  173|  41.5k|    return fSetupData->currencySymbols.hasEmptyCurrencySymbol();
  174|  41.5k|}
_ZN6icu_788numparse4impl16CodePointMatcherC2Ei:
  178|  66.5M|        : fCp(cp) {}
_ZNK6icu_788numparse4impl16CodePointMatcher5matchERNS_13StringSegmentERNS1_12ParsedNumberER10UErrorCode:
  180|  23.1M|bool CodePointMatcher::match(StringSegment& segment, ParsedNumber& result, UErrorCode&) const {
  181|  23.1M|    if (segment.startsWith(fCp)) {
  ------------------
  |  Branch (181:9): [True: 23.1M, False: 2.37k]
  ------------------
  182|  23.1M|        segment.adjustOffsetByCodePoint();
  183|  23.1M|        result.setCharsConsumed(segment);
  184|  23.1M|    }
  185|  23.1M|    return false;
  186|  23.1M|}
_ZNK6icu_788numparse4impl16CodePointMatcher9smokeTestERKNS_13StringSegmentE:
  188|  2.93M|bool CodePointMatcher::smokeTest(const StringSegment& segment) const {
  189|  2.93M|    return segment.startsWith(fCp);
  190|  2.93M|}
_ZN6icu_788numparse4impl19AffixPatternMatcher16fromAffixPatternERKNS_13UnicodeStringERNS1_26AffixTokenMatcherWarehouseEiPbR10UErrorCode:
  200|   410k|                                                          UErrorCode& status) {
  201|   410k|    if (affixPattern.isEmpty()) {
  ------------------
  |  Branch (201:9): [True: 251k, False: 159k]
  ------------------
  202|   251k|        *success = false;
  203|   251k|        return {};
  204|   251k|    }
  205|   159k|    *success = true;
  206|       |
  207|   159k|    IgnorablesMatcher* ignorables;
  208|   159k|    if (0 != (parseFlags & PARSE_FLAG_EXACT_AFFIX)) {
  ------------------
  |  Branch (208:9): [True: 159k, False: 0]
  ------------------
  209|   159k|        ignorables = nullptr;
  210|   159k|    } else {
  211|      0|        ignorables = &tokenWarehouse.ignorables();
  212|      0|    }
  213|       |
  214|   159k|    AffixPatternMatcherBuilder builder(affixPattern, tokenWarehouse, ignorables);
  215|   159k|    AffixUtils::iterateWithConsumer(affixPattern, builder, status);
  216|   159k|    return builder.build(status);
  217|   410k|}
_ZN6icu_788numparse4impl19AffixPatternMatcherC2ERNS_15MaybeStackArrayIPKNS1_18NumberParseMatcherELi3EEEiRKNS_13UnicodeStringER10UErrorCode:
  221|   159k|    : ArraySeriesMatcher(matchers, matchersLen), fPattern(pattern, status) {
  222|   159k|}
_ZNK6icu_788numparse4impl19AffixPatternMatcher10getPatternEv:
  224|  9.10M|UnicodeString AffixPatternMatcher::getPattern() const {
  225|  9.10M|    return fPattern.toAliasedUnicodeString();
  226|  9.10M|}
_ZNK6icu_788numparse4impl19AffixPatternMatchereqERKS2_:
  228|  9.07k|bool AffixPatternMatcher::operator==(const AffixPatternMatcher& other) const {
  229|  9.07k|    return fPattern == other.fPattern;
  230|  9.07k|}
_ZN6icu_788numparse4impl21AffixMatcherWarehouseC2EPNS1_26AffixTokenMatcherWarehouseE:
  234|   102k|        : fTokenWarehouse(tokenWarehouse) {
  235|   102k|}
_ZN6icu_788numparse4impl21AffixMatcherWarehouse13isInterestingERKNS_6number4impl20AffixPatternProviderERKNS1_17IgnorablesMatcherEiR10UErrorCode:
  239|   102k|                                          UErrorCode& status) {
  240|   102k|    UnicodeString posPrefixString = patternInfo.getString(AffixPatternProvider::AFFIX_POS_PREFIX);
  241|   102k|    UnicodeString posSuffixString = patternInfo.getString(AffixPatternProvider::AFFIX_POS_SUFFIX);
  242|   102k|    UnicodeString negPrefixString;
  243|   102k|    UnicodeString negSuffixString;
  244|   102k|    if (patternInfo.hasNegativeSubpattern()) {
  ------------------
  |  Branch (244:9): [True: 1.44k, False: 101k]
  ------------------
  245|  1.44k|        negPrefixString = patternInfo.getString(AffixPatternProvider::AFFIX_NEG_PREFIX);
  246|  1.44k|        negSuffixString = patternInfo.getString(AffixPatternProvider::AFFIX_NEG_SUFFIX);
  247|  1.44k|    }
  248|       |
  249|   102k|    if (0 == (parseFlags & PARSE_FLAG_USE_FULL_AFFIXES) &&
  ------------------
  |  Branch (249:9): [True: 0, False: 102k]
  ------------------
  250|   102k|        AffixUtils::containsOnlySymbolsAndIgnorables(posPrefixString, *ignorables.getSet(), status) &&
  ------------------
  |  Branch (250:9): [True: 0, False: 0]
  ------------------
  251|   102k|        AffixUtils::containsOnlySymbolsAndIgnorables(posSuffixString, *ignorables.getSet(), status) &&
  ------------------
  |  Branch (251:9): [True: 0, False: 0]
  ------------------
  252|   102k|        AffixUtils::containsOnlySymbolsAndIgnorables(negPrefixString, *ignorables.getSet(), status) &&
  ------------------
  |  Branch (252:9): [True: 0, False: 0]
  ------------------
  253|   102k|        AffixUtils::containsOnlySymbolsAndIgnorables(negSuffixString, *ignorables.getSet(), status)
  ------------------
  |  Branch (253:9): [True: 0, False: 0]
  ------------------
  254|       |        // HACK: Plus and minus sign are a special case: we accept them trailing only if they are
  255|       |        // trailing in the pattern string.
  256|   102k|        && !AffixUtils::containsType(posSuffixString, TYPE_PLUS_SIGN, status) &&
  ------------------
  |  Branch (256:12): [True: 0, False: 0]
  ------------------
  257|   102k|        !AffixUtils::containsType(posSuffixString, TYPE_MINUS_SIGN, status) &&
  ------------------
  |  Branch (257:9): [True: 0, False: 0]
  ------------------
  258|   102k|        !AffixUtils::containsType(negSuffixString, TYPE_PLUS_SIGN, status) &&
  ------------------
  |  Branch (258:9): [True: 0, False: 0]
  ------------------
  259|   102k|        !AffixUtils::containsType(negSuffixString, TYPE_MINUS_SIGN, status)) {
  ------------------
  |  Branch (259:9): [True: 0, False: 0]
  ------------------
  260|       |        // The affixes contain only symbols and ignorables.
  261|       |        // No need to generate affix matchers.
  262|      0|        return false;
  263|      0|    }
  264|   102k|    return true;
  265|   102k|}
_ZN6icu_788numparse4impl21AffixMatcherWarehouse19createAffixMatchersERKNS_6number4impl20AffixPatternProviderERNS1_24MutableMatcherCollectionERKNS1_17IgnorablesMatcherEiR10UErrorCode:
  270|   102k|                                                parse_flags_t parseFlags, UErrorCode& status) {
  271|   102k|    if (!isInteresting(patternInfo, ignorables, parseFlags, status)) {
  ------------------
  |  Branch (271:9): [True: 0, False: 102k]
  ------------------
  272|      0|        return;
  273|      0|    }
  274|       |
  275|       |    // The affixes have interesting characters, or we are in strict mode.
  276|       |    // Use initial capacity of 6, the highest possible number of AffixMatchers.
  277|   102k|    UnicodeString sb;
  278|   102k|    bool includeUnpaired = 0 != (parseFlags & PARSE_FLAG_INCLUDE_UNPAIRED_AFFIXES);
  279|       |
  280|   102k|    int32_t numAffixMatchers = 0;
  281|   102k|    int32_t numAffixPatternMatchers = 0;
  282|       |
  283|   102k|    AffixPatternMatcher* posPrefix = nullptr;
  284|   102k|    AffixPatternMatcher* posSuffix = nullptr;
  285|       |
  286|       |    // Pre-process the affix strings to resolve LDML rules like sign display.
  287|   719k|    for (int8_t typeInt = 0; typeInt < PATTERN_SIGN_TYPE_COUNT * 2; typeInt++) {
  ------------------
  |  Branch (287:30): [True: 616k, False: 102k]
  ------------------
  288|   616k|        auto type = static_cast<PatternSignType>(typeInt / 2);
  289|   616k|        bool dropCurrencySymbols = (typeInt % 2) == 1;
  290|       |
  291|   616k|        if (dropCurrencySymbols && !patternInfo.hasCurrencySign()) {
  ------------------
  |  Branch (291:13): [True: 308k, False: 308k]
  |  Branch (291:36): [True: 266k, False: 41.5k]
  ------------------
  292|   266k|            continue;
  293|   266k|        }
  294|   349k|        if (dropCurrencySymbols && !fTokenWarehouse->hasEmptyCurrencySymbol()) {
  ------------------
  |  Branch (294:13): [True: 41.5k, False: 308k]
  |  Branch (294:36): [True: 41.5k, False: 0]
  ------------------
  295|  41.5k|            continue;
  296|  41.5k|        }
  297|       |
  298|       |        // Skip affixes in some cases
  299|   308k|        if (type == PATTERN_SIGN_TYPE_POS
  ------------------
  |  Branch (299:13): [True: 102k, False: 205k]
  ------------------
  300|   308k|                && 0 != (parseFlags & PARSE_FLAG_PLUS_SIGN_ALLOWED)) {
  ------------------
  |  Branch (300:20): [True: 0, False: 102k]
  ------------------
  301|      0|            continue;
  302|      0|        }
  303|   308k|        if (type == PATTERN_SIGN_TYPE_POS_SIGN
  ------------------
  |  Branch (303:13): [True: 102k, False: 205k]
  ------------------
  304|   308k|                && 0 == (parseFlags & PARSE_FLAG_PLUS_SIGN_ALLOWED)) {
  ------------------
  |  Branch (304:20): [True: 102k, False: 0]
  ------------------
  305|   102k|            continue;
  306|   102k|        }
  307|       |
  308|       |        // Generate Prefix
  309|       |        // TODO: Handle approximately sign?
  310|   205k|        bool hasPrefix = false;
  311|   205k|        PatternStringUtils::patternInfoToStringBuilder(
  312|   205k|                patternInfo, true, type, false, StandardPlural::OTHER, false, dropCurrencySymbols, sb);
  313|   205k|        fAffixPatternMatchers[numAffixPatternMatchers] = AffixPatternMatcher::fromAffixPattern(
  314|   205k|                sb, *fTokenWarehouse, parseFlags, &hasPrefix, status);
  315|   205k|        AffixPatternMatcher* prefix = hasPrefix ? &fAffixPatternMatchers[numAffixPatternMatchers++]
  ------------------
  |  Branch (315:39): [True: 111k, False: 93.7k]
  ------------------
  316|   205k|                                                : nullptr;
  317|       |
  318|       |        // Generate Suffix
  319|       |        // TODO: Handle approximately sign?
  320|   205k|        bool hasSuffix = false;
  321|   205k|        PatternStringUtils::patternInfoToStringBuilder(
  322|   205k|                patternInfo, false, type, false, StandardPlural::OTHER, false, dropCurrencySymbols, sb);
  323|   205k|        fAffixPatternMatchers[numAffixPatternMatchers] = AffixPatternMatcher::fromAffixPattern(
  324|   205k|                sb, *fTokenWarehouse, parseFlags, &hasSuffix, status);
  325|   205k|        AffixPatternMatcher* suffix = hasSuffix ? &fAffixPatternMatchers[numAffixPatternMatchers++]
  ------------------
  |  Branch (325:39): [True: 48.0k, False: 157k]
  ------------------
  326|   205k|                                                : nullptr;
  327|       |
  328|   205k|        if (type == PATTERN_SIGN_TYPE_POS) {
  ------------------
  |  Branch (328:13): [True: 102k, False: 102k]
  ------------------
  329|   102k|            posPrefix = prefix;
  330|   102k|            posSuffix = suffix;
  331|   102k|        } else if (equals(prefix, posPrefix) && equals(suffix, posSuffix)) {
  ------------------
  |  Branch (331:20): [True: 115, False: 102k]
  |  Branch (331:49): [True: 16, False: 99]
  ------------------
  332|       |            // Skip adding these matchers (we already have equivalents)
  333|     16|            continue;
  334|     16|        }
  335|       |
  336|       |        // Flags for setting in the ParsedNumber; the token matchers may add more.
  337|   205k|        int flags = (type == PATTERN_SIGN_TYPE_NEG) ? FLAG_NEGATIVE : 0;
  ------------------
  |  Branch (337:21): [True: 102k, False: 102k]
  ------------------
  338|       |
  339|       |        // Note: it is indeed possible for posPrefix and posSuffix to both be null.
  340|       |        // We still need to add that matcher for strict mode to work.
  341|   205k|        fAffixMatchers[numAffixMatchers++] = {prefix, suffix, flags};
  342|   205k|        if (includeUnpaired && prefix != nullptr && suffix != nullptr) {
  ------------------
  |  Branch (342:13): [True: 0, False: 205k]
  |  Branch (342:32): [True: 0, False: 0]
  |  Branch (342:53): [True: 0, False: 0]
  ------------------
  343|       |            // The following if statements are designed to prevent adding two identical matchers.
  344|      0|            if (type == PATTERN_SIGN_TYPE_POS || !equals(prefix, posPrefix)) {
  ------------------
  |  Branch (344:17): [True: 0, False: 0]
  |  Branch (344:50): [True: 0, False: 0]
  ------------------
  345|      0|                fAffixMatchers[numAffixMatchers++] = {prefix, nullptr, flags};
  346|      0|            }
  347|      0|            if (type == PATTERN_SIGN_TYPE_POS || !equals(suffix, posSuffix)) {
  ------------------
  |  Branch (347:17): [True: 0, False: 0]
  |  Branch (347:50): [True: 0, False: 0]
  ------------------
  348|      0|                fAffixMatchers[numAffixMatchers++] = {nullptr, suffix, flags};
  349|      0|            }
  350|      0|        }
  351|   205k|    }
  352|       |
  353|       |    // Put the AffixMatchers in order, and then add them to the output.
  354|       |    // Since there are at most 9 elements, do a simple-to-implement bubble sort.
  355|   102k|    bool madeChanges;
  356|   205k|    do {
  357|   205k|        madeChanges = false;
  358|   410k|        for (int32_t i = 1; i < numAffixMatchers; i++) {
  ------------------
  |  Branch (358:29): [True: 205k, False: 205k]
  ------------------
  359|   205k|            if (fAffixMatchers[i - 1].compareTo(fAffixMatchers[i]) > 0) {
  ------------------
  |  Branch (359:17): [True: 102k, False: 102k]
  ------------------
  360|   102k|                madeChanges = true;
  361|   102k|                AffixMatcher temp = std::move(fAffixMatchers[i - 1]);
  362|   102k|                fAffixMatchers[i - 1] = std::move(fAffixMatchers[i]);
  363|   102k|                fAffixMatchers[i] = std::move(temp);
  364|   102k|            }
  365|   205k|        }
  366|   205k|    } while (madeChanges);
  ------------------
  |  Branch (366:14): [True: 102k, False: 102k]
  ------------------
  367|       |
  368|   308k|    for (int32_t i = 0; i < numAffixMatchers; i++) {
  ------------------
  |  Branch (368:25): [True: 205k, False: 102k]
  ------------------
  369|       |        // Enable the following line to debug affixes
  370|       |        //std::cout << "Adding affix matcher: " << CStr(fAffixMatchers[i].toString())() << std::endl;
  371|   205k|        output.addMatcher(fAffixMatchers[i]);
  372|   205k|    }
  373|   102k|}
_ZN6icu_788numparse4impl12AffixMatcherC2EPNS1_19AffixPatternMatcherES4_i:
  377|   205k|        : fPrefix(prefix), fSuffix(suffix), fFlags(flags) {}
_ZNK6icu_788numparse4impl12AffixMatcher5matchERNS_13StringSegmentERNS1_12ParsedNumberER10UErrorCode:
  379|   107k|bool AffixMatcher::match(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const {
  380|   107k|    if (!result.seenNumber()) {
  ------------------
  |  Branch (380:9): [True: 71.0k, False: 36.0k]
  ------------------
  381|       |        // Prefix
  382|       |        // Do not match if:
  383|       |        // 1. We have already seen a prefix (result.prefix != null)
  384|       |        // 2. The prefix in this AffixMatcher is empty (prefix == null)
  385|  71.0k|        if (!result.prefix.isBogus() || fPrefix == nullptr) {
  ------------------
  |  Branch (385:13): [True: 4.03k, False: 67.0k]
  |  Branch (385:41): [True: 5.67k, False: 61.3k]
  ------------------
  386|  9.71k|            return false;
  387|  9.71k|        }
  388|       |
  389|       |        // Attempt to match the prefix.
  390|  61.3k|        int initialOffset = segment.getOffset();
  391|  61.3k|        bool maybeMore = fPrefix->match(segment, result, status);
  392|  61.3k|        if (initialOffset != segment.getOffset()) {
  ------------------
  |  Branch (392:13): [True: 36.1k, False: 25.1k]
  ------------------
  393|  36.1k|            result.prefix = fPrefix->getPattern();
  394|  36.1k|        }
  395|  61.3k|        return maybeMore;
  396|       |
  397|  71.0k|    } else {
  398|       |        // Suffix
  399|       |        // Do not match if:
  400|       |        // 1. We have already seen a suffix (result.suffix != null)
  401|       |        // 2. The suffix in this AffixMatcher is empty (suffix == null)
  402|       |        // 3. The matched prefix does not equal this AffixMatcher's prefix
  403|  36.0k|        if (!result.suffix.isBogus() || fSuffix == nullptr || !matched(fPrefix, result.prefix)) {
  ------------------
  |  Branch (403:13): [True: 201, False: 35.8k]
  |  Branch (403:41): [True: 5.89k, False: 29.9k]
  |  Branch (403:63): [True: 15.1k, False: 14.8k]
  ------------------
  404|  21.2k|            return false;
  405|  21.2k|        }
  406|       |
  407|       |        // Attempt to match the suffix.
  408|  14.8k|        int initialOffset = segment.getOffset();
  409|  14.8k|        bool maybeMore = fSuffix->match(segment, result, status);
  410|  14.8k|        if (initialOffset != segment.getOffset()) {
  ------------------
  |  Branch (410:13): [True: 2.84k, False: 11.9k]
  ------------------
  411|  2.84k|            result.suffix = fSuffix->getPattern();
  412|  2.84k|        }
  413|  14.8k|        return maybeMore;
  414|  36.0k|    }
  415|   107k|}
_ZNK6icu_788numparse4impl12AffixMatcher9smokeTestERKNS_13StringSegmentE:
  417|  19.9M|bool AffixMatcher::smokeTest(const StringSegment& segment) const {
  418|  19.9M|    return (fPrefix != nullptr && fPrefix->smokeTest(segment)) ||
  ------------------
  |  Branch (418:13): [True: 9.99M, False: 9.91M]
  |  Branch (418:35): [True: 69.2k, False: 9.92M]
  ------------------
  419|  19.9M|           (fSuffix != nullptr && fSuffix->smokeTest(segment));
  ------------------
  |  Branch (419:13): [True: 2.95M, False: 16.8M]
  |  Branch (419:35): [True: 37.8k, False: 2.91M]
  ------------------
  420|  19.9M|}
_ZNK6icu_788numparse4impl12AffixMatcher11postProcessERNS1_12ParsedNumberE:
  422|  14.8M|void AffixMatcher::postProcess(ParsedNumber& result) const {
  423|       |    // Check to see if our affix is the one that was matched. If so, set the flags in the result.
  424|  14.8M|    if (matched(fPrefix, result.prefix) && matched(fSuffix, result.suffix)) {
  ------------------
  |  Branch (424:9): [True: 7.43M, False: 7.44M]
  |  Branch (424:44): [True: 6.27M, False: 1.15M]
  ------------------
  425|       |        // Fill in the result prefix and suffix with non-null values (empty string).
  426|       |        // Used by strict mode to determine whether an entire affix pair was matched.
  427|  6.27M|        if (result.prefix.isBogus()) {
  ------------------
  |  Branch (427:13): [True: 6.24M, False: 34.7k]
  ------------------
  428|  6.24M|            result.prefix = UnicodeString();
  429|  6.24M|        }
  430|  6.27M|        if (result.suffix.isBogus()) {
  ------------------
  |  Branch (430:13): [True: 6.27M, False: 2.84k]
  ------------------
  431|  6.27M|            result.suffix = UnicodeString();
  432|  6.27M|        }
  433|  6.27M|        result.flags |= fFlags;
  434|  6.27M|        if (fPrefix != nullptr) {
  ------------------
  |  Branch (434:13): [True: 34.7k, False: 6.24M]
  ------------------
  435|  34.7k|            fPrefix->postProcess(result);
  436|  34.7k|        }
  437|  6.27M|        if (fSuffix != nullptr) {
  ------------------
  |  Branch (437:13): [True: 2.84k, False: 6.27M]
  ------------------
  438|  2.84k|            fSuffix->postProcess(result);
  439|  2.84k|        }
  440|  6.27M|    }
  441|  14.8M|}
_ZNK6icu_788numparse4impl12AffixMatcher9compareToERKS2_:
  443|   205k|int8_t AffixMatcher::compareTo(const AffixMatcher& rhs) const {
  444|   205k|    const AffixMatcher& lhs = *this;
  445|   205k|    if (length(lhs.fPrefix) != length(rhs.fPrefix)) {
  ------------------
  |  Branch (445:9): [True: 204k, False: 331]
  ------------------
  446|   204k|        return length(lhs.fPrefix) > length(rhs.fPrefix) ? -1 : 1;
  ------------------
  |  Branch (446:16): [True: 102k, False: 102k]
  ------------------
  447|   204k|    } else if (length(lhs.fSuffix) != length(rhs.fSuffix)) {
  ------------------
  |  Branch (447:16): [True: 203, False: 128]
  ------------------
  448|    203|        return length(lhs.fSuffix) > length(rhs.fSuffix) ? -1 : 1;
  ------------------
  |  Branch (448:16): [True: 111, False: 92]
  ------------------
  449|    203|    } else {
  450|    128|        return 0;
  451|    128|    }
  452|   205k|}
numparse_affixes.cpp:_ZN12_GLOBAL__N_16equalsEPKN6icu_788numparse4impl19AffixPatternMatcherES5_:
   48|   102k|bool equals(const AffixPatternMatcher* lhs, const AffixPatternMatcher* rhs) {
   49|   102k|    if (lhs == nullptr && rhs == nullptr) {
  ------------------
  |  Branch (49:9): [True: 88, False: 102k]
  |  Branch (49:27): [True: 82, False: 6]
  ------------------
   50|     82|        return true;
   51|     82|    }
   52|   102k|    if (lhs == nullptr || rhs == nullptr) {
  ------------------
  |  Branch (52:9): [True: 6, False: 102k]
  |  Branch (52:27): [True: 93.6k, False: 9.07k]
  ------------------
   53|  93.6k|        return false;
   54|  93.6k|    }
   55|  9.07k|    return *lhs == *rhs;
   56|   102k|}
numparse_affixes.cpp:_ZN12_GLOBAL__N_17matchedEPKN6icu_788numparse4impl19AffixPatternMatcherERKNS0_13UnicodeStringE:
   32|  22.3M|bool matched(const AffixPatternMatcher* affix, const UnicodeString& patternString) {
   33|  22.3M|    return (affix == nullptr && patternString.isBogus()) ||
  ------------------
  |  Branch (33:13): [True: 13.7M, False: 8.62M]
  |  Branch (33:33): [True: 13.6M, False: 34.3k]
  ------------------
   34|  22.3M|           (affix != nullptr && affix->getPattern() == patternString);
  ------------------
  |  Branch (34:13): [True: 8.62M, False: 34.3k]
  |  Branch (34:33): [True: 40.0k, False: 8.58M]
  ------------------
   35|  22.3M|}
numparse_affixes.cpp:_ZN12_GLOBAL__N_16lengthEPKN6icu_788numparse4impl19AffixPatternMatcherE:
   40|   820k|int32_t length(const AffixPatternMatcher* matcher) {
   41|   820k|    return matcher == nullptr ? 0 : matcher->getPattern().length();
  ------------------
  |  Branch (41:12): [True: 375k, False: 445k]
  ------------------
   42|   820k|}

_ZN6icu_788numparse4impl21AffixMatcherWarehouseC2Ev:
  198|   102k|    AffixMatcherWarehouse() = default;  // WARNING: Leaves the object in an unusable state
_ZN6icu_788numparse4impl12AffixMatcherC2Ev:
  172|  3.69M|    AffixMatcher() = default;  // WARNING: Leaves the object in an unusable state
_ZN6icu_788numparse4impl19AffixPatternMatcherC2Ev:
  149|  2.71M|    AffixPatternMatcher() = default;  // WARNING: Leaves the object in an unusable state
_ZN6icu_788numparse4impl26AffixTokenMatcherWarehouseC2Ev:
   84|   102k|    AffixTokenMatcherWarehouse() = default;  // WARNING: Leaves the object in an unusable state

_ZNK6icu_788numparse4impl13SeriesMatcher5matchERNS_13StringSegmentERNS1_12ParsedNumberER10UErrorCode:
   22|  76.1k|bool SeriesMatcher::match(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const {
   23|  76.1k|    ParsedNumber backup(result);
   24|       |
   25|  76.1k|    int32_t initialOffset = segment.getOffset();
   26|  76.1k|    bool maybeMore = true;
   27|  23.3M|    for (const auto* it = begin(); it < end();) {
  ------------------
  |  Branch (27:36): [True: 23.2M, False: 39.0k]
  ------------------
   28|  23.2M|        const NumberParseMatcher* matcher = *it;
   29|  23.2M|        int matcherOffset = segment.getOffset();
   30|  23.2M|        if (segment.length() != 0) {
  ------------------
  |  Branch (30:13): [True: 23.2M, False: 47]
  ------------------
   31|  23.2M|            maybeMore = matcher->match(segment, result, status);
   32|  23.2M|        } else {
   33|       |            // Nothing for this matcher to match; ask for more.
   34|     47|            maybeMore = true;
   35|     47|        }
   36|       |
   37|  23.2M|        bool success = (segment.getOffset() != matcherOffset);
   38|  23.2M|        bool isFlexible = matcher->isFlexible();
   39|  23.2M|        if (success && isFlexible) {
  ------------------
  |  Branch (39:13): [True: 23.2M, False: 37.1k]
  |  Branch (39:24): [True: 0, False: 23.2M]
  ------------------
   40|       |            // Match succeeded, and this is a flexible matcher. Re-run it.
   41|  23.2M|        } else if (success) {
  ------------------
  |  Branch (41:20): [True: 23.2M, False: 37.1k]
  ------------------
   42|       |            // Match succeeded, and this is NOT a flexible matcher. Proceed to the next matcher.
   43|  23.2M|            it++;
   44|       |            // Small hack: if there is another matcher coming, do not accept trailing weak chars.
   45|       |            // Needed for proper handling of currency spacing.
   46|  23.2M|            if (it < end() && segment.getOffset() != result.charEnd && result.charEnd > matcherOffset) {
  ------------------
  |  Branch (46:17): [True: 23.1M, False: 39.0k]
  |  Branch (46:31): [True: 1, False: 23.1M]
  |  Branch (46:72): [True: 1, False: 0]
  ------------------
   47|      1|                segment.setOffset(result.charEnd);
   48|      1|            }
   49|  23.2M|        } else if (isFlexible) {
  ------------------
  |  Branch (49:20): [True: 0, False: 37.1k]
  ------------------
   50|       |            // Match failed, and this is a flexible matcher. Try again with the next matcher.
   51|      0|            it++;
   52|  37.1k|        } else {
   53|       |            // Match failed, and this is NOT a flexible matcher. Exit.
   54|  37.1k|            segment.setOffset(initialOffset);
   55|  37.1k|            result = backup;
   56|  37.1k|            return maybeMore;
   57|  37.1k|        }
   58|  23.2M|    }
   59|       |
   60|       |    // All matchers in the series succeeded.
   61|  39.0k|    return maybeMore;
   62|  76.1k|}
_ZNK6icu_788numparse4impl13SeriesMatcher9smokeTestERKNS_13StringSegmentE:
   64|  12.9M|bool SeriesMatcher::smokeTest(const StringSegment& segment) const {
   65|       |    // NOTE: The range-based for loop calls the virtual begin() and end() methods.
   66|       |    // NOTE: We only want the first element. Use the for loop for boundary checking.
   67|  12.9M|    for (const auto& matcher : *this) {
  ------------------
  |  Branch (67:30): [True: 12.9M, False: 0]
  ------------------
   68|       |        // SeriesMatchers are never allowed to start with a Flexible matcher.
   69|  12.9M|        U_ASSERT(!matcher->isFlexible());
  ------------------
  |  |   35|  12.9M|#   define U_ASSERT(exp) (void)0
  ------------------
   70|  12.9M|        return matcher->smokeTest(segment);
   71|  12.9M|    }
   72|      0|    return false;
   73|  12.9M|}
_ZNK6icu_788numparse4impl13SeriesMatcher11postProcessERNS1_12ParsedNumberE:
   75|  37.6k|void SeriesMatcher::postProcess(ParsedNumber& result) const {
   76|       |    // NOTE: The range-based for loop calls the virtual begin() and end() methods.
   77|  19.3M|    for (const auto* matcher : *this) {
  ------------------
  |  Branch (77:30): [True: 19.3M, False: 37.6k]
  ------------------
   78|  19.3M|        matcher->postProcess(result);
   79|  19.3M|    }
   80|  37.6k|}
_ZN6icu_788numparse4impl18ArraySeriesMatcherC2Ev:
   84|  2.71M|        : fMatchersLen(0) {
   85|  2.71M|}
_ZN6icu_788numparse4impl18ArraySeriesMatcherC2ERNS_15MaybeStackArrayIPKNS1_18NumberParseMatcherELi3EEEi:
   88|   159k|        : fMatchers(std::move(matchers)), fMatchersLen(matchersLen) {
   89|   159k|}
_ZNK6icu_788numparse4impl18ArraySeriesMatcher5beginEv:
   95|  13.0M|const NumberParseMatcher* const* ArraySeriesMatcher::begin() const {
   96|  13.0M|    return fMatchers.getAlias();
   97|  13.0M|}
_ZNK6icu_788numparse4impl18ArraySeriesMatcher3endEv:
   99|  59.5M|const NumberParseMatcher* const* ArraySeriesMatcher::end() const {
  100|  59.5M|    return fMatchers.getAlias() + fMatchersLen;
  101|  59.5M|}

_ZN6icu_788numparse4impl13SeriesMatcherC2Ev:
   85|  2.87M|    SeriesMatcher() = default;
_ZN6icu_788numparse4impl18CompositionMatcherC2Ev:
   30|  2.87M|    CompositionMatcher() = default;

_ZN6icu_788numparse4impl23CombinedCurrencyMatcherC2ERKNS_6number4impl15CurrencySymbolsERKNS_20DecimalFormatSymbolsEiR10UErrorCode:
   26|  55.4k|        : fCurrency1(currencySymbols.getCurrencySymbol(status)),
   27|  55.4k|          fCurrency2(currencySymbols.getIntlCurrencySymbol(status)),
   28|  55.4k|          fUseFullCurrencyData(0 == (parseFlags & PARSE_FLAG_NO_FOREIGN_CURRENCY)),
   29|  55.4k|          afterPrefixInsert(dfs.getPatternForCurrencySpacing(UNUM_CURRENCY_INSERT, false, status)),
   30|  55.4k|          beforeSuffixInsert(dfs.getPatternForCurrencySpacing(UNUM_CURRENCY_INSERT, true, status)),
   31|  55.4k|          fLocaleName(dfs.getLocale().getName(), -1, status) {
   32|  55.4k|    utils::copyCurrencyCode(fCurrencyCode, currencySymbols.getIsoCode());
   33|       |
   34|       |    // Pre-load the long names for the current locale and currency
   35|       |    // if we are parsing without the full currency data.
   36|  55.4k|    if (!fUseFullCurrencyData) {
  ------------------
  |  Branch (36:9): [True: 55.4k, False: 0]
  ------------------
   37|   499k|        for (int32_t i=0; i<StandardPlural::COUNT; i++) {
  ------------------
  |  Branch (37:27): [True: 443k, False: 55.4k]
  ------------------
   38|   443k|            auto plural = static_cast<StandardPlural::Form>(i);
   39|   443k|            fLocalLongNames[i] = currencySymbols.getPluralName(plural, status);
   40|   443k|        }
   41|  55.4k|    }
   42|       |
   43|       |    // TODO: Figure out how to make this faster and re-enable.
   44|       |    // Computing the "lead code points" set for fastpathing is too slow to use in production.
   45|       |    // See https://unicode-org.atlassian.net/browse/ICU-13584
   46|       |//    // Compute the full set of characters that could be the first in a currency to allow for
   47|       |//    // efficient smoke test.
   48|       |//    fLeadCodePoints.add(fCurrency1.char32At(0));
   49|       |//    fLeadCodePoints.add(fCurrency2.char32At(0));
   50|       |//    fLeadCodePoints.add(beforeSuffixInsert.char32At(0));
   51|       |//    uprv_currencyLeads(fLocaleName.data(), fLeadCodePoints, status);
   52|       |//    // Always apply case mapping closure for currencies
   53|       |//    fLeadCodePoints.closeOver(USET_ADD_CASE_MAPPINGS);
   54|       |//    fLeadCodePoints.freeze();
   55|  55.4k|}
_ZNK6icu_788numparse4impl23CombinedCurrencyMatcher5matchERNS_13StringSegmentERNS1_12ParsedNumberER10UErrorCode:
   58|   722k|CombinedCurrencyMatcher::match(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const {
   59|   722k|    if (result.currencyCode[0] != 0) {
  ------------------
  |  Branch (59:9): [True: 748, False: 721k]
  ------------------
   60|    748|        return false;
   61|    748|    }
   62|       |
   63|       |    // Try to match a currency spacing separator.
   64|   721k|    int32_t initialOffset = segment.getOffset();
   65|   721k|    bool maybeMore = false;
   66|   721k|    if (result.seenNumber() && !beforeSuffixInsert.isEmpty()) {
  ------------------
  |  Branch (66:9): [True: 16.9k, False: 704k]
  |  Branch (66:32): [True: 16.9k, False: 0]
  ------------------
   67|  16.9k|        int32_t overlap = segment.getCommonPrefixLength(beforeSuffixInsert);
   68|  16.9k|        if (overlap == beforeSuffixInsert.length()) {
  ------------------
  |  Branch (68:13): [True: 4, False: 16.9k]
  ------------------
   69|      4|            segment.adjustOffset(overlap);
   70|       |            // Note: let currency spacing be a weak match. Don't update chars consumed.
   71|      4|        }
   72|  16.9k|        maybeMore = maybeMore || overlap == segment.length();
  ------------------
  |  Branch (72:21): [True: 0, False: 16.9k]
  |  Branch (72:34): [True: 3, False: 16.9k]
  ------------------
   73|  16.9k|    }
   74|       |
   75|       |    // Match the currency string, and reset if we didn't find one.
   76|   721k|    maybeMore = maybeMore || matchCurrency(segment, result, status);
  ------------------
  |  Branch (76:17): [True: 3, False: 721k]
  |  Branch (76:30): [True: 186, False: 721k]
  ------------------
   77|   721k|    if (result.currencyCode[0] == 0) {
  ------------------
  |  Branch (77:9): [True: 721k, False: 764]
  ------------------
   78|   721k|        segment.setOffset(initialOffset);
   79|   721k|        return maybeMore;
   80|   721k|    }
   81|       |
   82|       |    // Try to match a currency spacing separator.
   83|    764|    if (!result.seenNumber() && !afterPrefixInsert.isEmpty()) {
  ------------------
  |  Branch (83:9): [True: 558, False: 206]
  |  Branch (83:33): [True: 558, False: 0]
  ------------------
   84|    558|        int32_t overlap = segment.getCommonPrefixLength(afterPrefixInsert);
   85|    558|        if (overlap == afterPrefixInsert.length()) {
  ------------------
  |  Branch (85:13): [True: 2, False: 556]
  ------------------
   86|      2|            segment.adjustOffset(overlap);
   87|       |            // Note: let currency spacing be a weak match. Don't update chars consumed.
   88|      2|        }
   89|    558|        maybeMore = maybeMore || overlap == segment.length();
  ------------------
  |  Branch (89:21): [True: 21, False: 537]
  |  Branch (89:34): [True: 0, False: 537]
  ------------------
   90|    558|    }
   91|       |
   92|    764|    return maybeMore;
   93|   721k|}
_ZNK6icu_788numparse4impl23CombinedCurrencyMatcher13matchCurrencyERNS_13StringSegmentERNS1_12ParsedNumberER10UErrorCode:
   96|   721k|                                            UErrorCode& status) const {
   97|   721k|    bool maybeMore = false;
   98|       |
   99|   721k|    int32_t overlap1;
  100|   721k|    if (!fCurrency1.isEmpty()) {
  ------------------
  |  Branch (100:9): [True: 721k, False: 0]
  ------------------
  101|   721k|        overlap1 = segment.getCaseSensitivePrefixLength(fCurrency1);
  102|   721k|    } else {
  103|      0|        overlap1 = -1;
  104|      0|    }
  105|   721k|    maybeMore = maybeMore || overlap1 == segment.length();
  ------------------
  |  Branch (105:17): [True: 0, False: 721k]
  |  Branch (105:30): [True: 27, False: 721k]
  ------------------
  106|   721k|    if (overlap1 == fCurrency1.length()) {
  ------------------
  |  Branch (106:9): [True: 761, False: 721k]
  ------------------
  107|    761|        utils::copyCurrencyCode(result.currencyCode, fCurrencyCode);
  108|    761|        segment.adjustOffset(overlap1);
  109|    761|        result.setCharsConsumed(segment);
  110|    761|        return maybeMore;
  111|    761|    }
  112|       |
  113|   721k|    int32_t overlap2;
  114|   721k|    if (!fCurrency2.isEmpty()) {
  ------------------
  |  Branch (114:9): [True: 721k, False: 0]
  ------------------
  115|       |        // ISO codes should be accepted case-insensitive.
  116|       |        // https://unicode-org.atlassian.net/browse/ICU-13696
  117|   721k|        overlap2 = segment.getCommonPrefixLength(fCurrency2);
  118|   721k|    } else {
  119|      0|        overlap2 = -1;
  120|      0|    }
  121|   721k|    maybeMore = maybeMore || overlap2 == segment.length();
  ------------------
  |  Branch (121:17): [True: 8, False: 721k]
  |  Branch (121:30): [True: 12, False: 721k]
  ------------------
  122|   721k|    if (overlap2 == fCurrency2.length()) {
  ------------------
  |  Branch (122:9): [True: 3, False: 721k]
  ------------------
  123|      3|        utils::copyCurrencyCode(result.currencyCode, fCurrencyCode);
  124|      3|        segment.adjustOffset(overlap2);
  125|      3|        result.setCharsConsumed(segment);
  126|      3|        return maybeMore;
  127|      3|    }
  128|       |
  129|   721k|    if (fUseFullCurrencyData) {
  ------------------
  |  Branch (129:9): [True: 0, False: 721k]
  ------------------
  130|       |        // Use the full currency data.
  131|       |        // NOTE: This call site should be improved with #13584.
  132|      0|        const UnicodeString segmentString = segment.toTempUnicodeString();
  133|       |
  134|       |        // Try to parse the currency
  135|      0|        ParsePosition ppos(0);
  136|      0|        int32_t partialMatchLen = 0;
  137|      0|        uprv_parseCurrency(
  ------------------
  |  | 1532|      0|#define uprv_parseCurrency U_ICU_ENTRY_POINT_RENAME(uprv_parseCurrency)
  |  |  ------------------
  |  |  |  |  123|      0|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|      0|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|      0|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  138|      0|                fLocaleName.data(),
  139|      0|                segmentString,
  140|      0|                ppos,
  141|      0|                UCURR_SYMBOL_NAME, // checks for both UCURR_SYMBOL_NAME and UCURR_LONG_NAME
  142|      0|                &partialMatchLen,
  143|      0|                result.currencyCode,
  144|      0|                status);
  145|      0|        maybeMore = maybeMore || partialMatchLen == segment.length();
  ------------------
  |  Branch (145:21): [True: 0, False: 0]
  |  Branch (145:34): [True: 0, False: 0]
  ------------------
  146|       |
  147|      0|        if (U_SUCCESS(status) && ppos.getIndex() != 0) {
  ------------------
  |  Branch (147:13): [True: 0, False: 0]
  |  Branch (147:34): [True: 0, False: 0]
  ------------------
  148|       |            // Complete match.
  149|       |            // NOTE: The currency code should already be saved in the ParsedNumber.
  150|      0|            segment.adjustOffset(ppos.getIndex());
  151|      0|            result.setCharsConsumed(segment);
  152|      0|            return maybeMore;
  153|      0|        }
  154|       |
  155|   721k|    } else {
  156|       |        // Use the locale long names.
  157|   721k|        int32_t longestFullMatch = 0;
  158|  6.49M|        for (int32_t i=0; i<StandardPlural::COUNT; i++) {
  ------------------
  |  Branch (158:27): [True: 5.76M, False: 721k]
  ------------------
  159|  5.76M|            const UnicodeString& name = fLocalLongNames[i];
  160|  5.76M|            int32_t overlap = segment.getCommonPrefixLength(name);
  161|  5.76M|            if (overlap == name.length() && name.length() > longestFullMatch) {
  ------------------
  |  Branch (161:17): [True: 0, False: 5.76M]
  |  Branch (161:45): [True: 0, False: 0]
  ------------------
  162|      0|                longestFullMatch = name.length();
  163|      0|            }
  164|  5.76M|            maybeMore = maybeMore || overlap > 0;
  ------------------
  |  Branch (164:25): [True: 1.09k, False: 5.76M]
  |  Branch (164:38): [True: 147, False: 5.76M]
  ------------------
  165|  5.76M|        }
  166|   721k|        if (longestFullMatch > 0) {
  ------------------
  |  Branch (166:13): [True: 0, False: 721k]
  ------------------
  167|      0|            utils::copyCurrencyCode(result.currencyCode, fCurrencyCode);
  168|      0|            segment.adjustOffset(longestFullMatch);
  169|      0|            result.setCharsConsumed(segment);
  170|      0|            return maybeMore;
  171|      0|        }
  172|   721k|    }
  173|       |
  174|       |    // No match found.
  175|   721k|    return maybeMore;
  176|   721k|}
_ZNK6icu_788numparse4impl23CombinedCurrencyMatcher9smokeTestERKNS_13StringSegmentE:
  178|   726k|bool CombinedCurrencyMatcher::smokeTest(const StringSegment&) const {
  179|       |    // TODO: See constructor
  180|   726k|    return true;
  181|       |    //return segment.startsWith(fLeadCodePoints);
  182|   726k|}

_ZN6icu_788numparse4impl23CombinedCurrencyMatcherC2Ev:
   35|   308k|    CombinedCurrencyMatcher() = default;  // WARNING: Leaves the object in an unusable state

_ZN6icu_788numparse4impl14DecimalMatcherC2ERKNS_20DecimalFormatSymbolsERKNS_6number4impl7GrouperEi:
   27|   205k|                               parse_flags_t parseFlags) {
   28|   205k|    if (0 != (parseFlags & PARSE_FLAG_MONETARY_SEPARATORS)) {
  ------------------
  |  Branch (28:9): [True: 13.8k, False: 191k]
  ------------------
   29|  13.8k|        groupingSeparator = symbols.getConstSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol);
   30|  13.8k|        decimalSeparator = symbols.getConstSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol);
   31|   191k|    } else {
   32|   191k|        groupingSeparator = symbols.getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol);
   33|   191k|        decimalSeparator = symbols.getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol);
   34|   191k|    }
   35|   205k|    bool strictSeparators = 0 != (parseFlags & PARSE_FLAG_STRICT_SEPARATORS);
   36|   205k|    unisets::Key groupingKey = strictSeparators ? unisets::STRICT_ALL_SEPARATORS
  ------------------
  |  Branch (36:32): [True: 102k, False: 102k]
  ------------------
   37|   205k|                                                : unisets::ALL_SEPARATORS;
   38|       |
   39|       |    // Attempt to find separators in the static cache
   40|       |
   41|   205k|    groupingUniSet = unisets::get(groupingKey);
   42|   205k|    unisets::Key decimalKey = unisets::chooseFrom(
   43|   205k|            decimalSeparator,
   44|   205k|            strictSeparators ? unisets::STRICT_COMMA : unisets::COMMA,
  ------------------
  |  Branch (44:13): [True: 102k, False: 102k]
  ------------------
   45|   205k|            strictSeparators ? unisets::STRICT_PERIOD : unisets::PERIOD);
  ------------------
  |  Branch (45:13): [True: 102k, False: 102k]
  ------------------
   46|   205k|    if (decimalKey >= 0) {
  ------------------
  |  Branch (46:9): [True: 204k, False: 873]
  ------------------
   47|   204k|        decimalUniSet = unisets::get(decimalKey);
   48|   204k|    } else if (!decimalSeparator.isEmpty()) {
  ------------------
  |  Branch (48:16): [True: 873, False: 0]
  ------------------
   49|    873|        auto* set = new UnicodeSet();
   50|    873|        set->add(decimalSeparator.char32At(0));
   51|    873|        set->freeze();
   52|    873|        decimalUniSet = set;
   53|    873|        fLocalDecimalUniSet.adoptInstead(set);
   54|    873|    } else {
   55|      0|        decimalUniSet = unisets::get(unisets::EMPTY);
   56|      0|    }
   57|       |
   58|   205k|    if (groupingKey >= 0 && decimalKey >= 0) {
  ------------------
  |  Branch (58:9): [True: 205k, False: 0]
  |  Branch (58:29): [True: 204k, False: 873]
  ------------------
   59|       |        // Everything is available in the static cache
   60|   204k|        separatorSet = groupingUniSet;
   61|   204k|        leadSet = unisets::get(
   62|   204k|                strictSeparators ? unisets::DIGITS_OR_ALL_SEPARATORS
  ------------------
  |  Branch (62:17): [True: 101k, False: 102k]
  ------------------
   63|   204k|                                 : unisets::DIGITS_OR_STRICT_ALL_SEPARATORS);
   64|   204k|    } else {
   65|    873|        auto* set = new UnicodeSet();
   66|    873|        set->addAll(*groupingUniSet);
   67|    873|        set->addAll(*decimalUniSet);
   68|    873|        set->freeze();
   69|    873|        separatorSet = set;
   70|    873|        fLocalSeparatorSet.adoptInstead(set);
   71|    873|        leadSet = nullptr;
   72|    873|    }
   73|       |
   74|   205k|    UChar32 cpZero = symbols.getCodePointZero();
   75|   205k|    if (cpZero == -1 || !u_isdigit(cpZero) || u_digit(cpZero, 10) != 0) {
  ------------------
  |  |  315|   205k|#define u_isdigit U_ICU_ENTRY_POINT_RENAME(u_isdigit)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                  if (cpZero == -1 || !u_isdigit(cpZero) || u_digit(cpZero, 10) != 0) {
  ------------------
  |  |  229|   205k|#define u_digit U_ICU_ENTRY_POINT_RENAME(u_digit)
  |  |  ------------------
  |  |  |  |  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
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (75:9): [True: 0, False: 205k]
  |  Branch (75:25): [True: 0, False: 205k]
  |  Branch (75:47): [True: 0, False: 205k]
  ------------------
   76|       |        // Uncommon case: okay to allocate.
   77|      0|        auto* digitStrings = new UnicodeString[10];
   78|      0|        fLocalDigitStrings.adoptInstead(digitStrings);
   79|      0|        for (int32_t i = 0; i <= 9; i++) {
  ------------------
  |  Branch (79:29): [True: 0, False: 0]
  ------------------
   80|      0|            digitStrings[i] = symbols.getConstDigitSymbol(i);
   81|      0|        }
   82|      0|    }
   83|       |
   84|   205k|    requireGroupingMatch = 0 != (parseFlags & PARSE_FLAG_STRICT_GROUPING_SIZE);
   85|   205k|    groupingDisabled = 0 != (parseFlags & PARSE_FLAG_GROUPING_DISABLED);
   86|   205k|    integerOnly = 0 != (parseFlags & PARSE_FLAG_INTEGER_ONLY);
   87|   205k|    grouping1 = grouper.getPrimary();
   88|   205k|    grouping2 = grouper.getSecondary();
   89|       |
   90|       |    // Fraction grouping parsing is disabled for now but could be enabled later.
   91|       |    // See https://unicode-org.atlassian.net/browse/ICU-10794
   92|       |    // fractionGrouping = 0 != (parseFlags & PARSE_FLAG_FRACTION_GROUPING_ENABLED);
   93|   205k|}
_ZNK6icu_788numparse4impl14DecimalMatcher5matchERNS_13StringSegmentERNS1_12ParsedNumberER10UErrorCode:
   95|  2.67M|bool DecimalMatcher::match(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const {
   96|  2.67M|    return match(segment, result, 0, status);
   97|  2.67M|}
_ZNK6icu_788numparse4impl14DecimalMatcher5matchERNS_13StringSegmentERNS1_12ParsedNumberEaR10UErrorCode:
  100|  3.03M|                           UErrorCode&) const {
  101|  3.03M|    if (result.seenNumber() && exponentSign == 0) {
  ------------------
  |  Branch (101:9): [True: 551k, False: 2.48M]
  |  Branch (101:32): [True: 188k, False: 362k]
  ------------------
  102|       |        // A number has already been consumed.
  103|   188k|        return false;
  104|  2.84M|    } else if (exponentSign != 0) {
  ------------------
  |  Branch (104:16): [True: 362k, False: 2.48M]
  ------------------
  105|       |        // scientific notation always comes after the number
  106|   362k|        U_ASSERT(!result.quantity.bogus);
  ------------------
  |  |   35|   362k|#   define U_ASSERT(exp) (void)0
  ------------------
  107|   362k|    }
  108|       |
  109|       |    // Initial offset before any character consumption.
  110|  2.84M|    int32_t initialOffset = segment.getOffset();
  111|       |
  112|       |    // Return value: whether to ask for more characters.
  113|  2.84M|    bool maybeMore = false;
  114|       |
  115|       |    // All digits consumed so far.
  116|  2.84M|    number::impl::DecimalQuantity digitsConsumed;
  117|  2.84M|    digitsConsumed.bogus = true;
  118|       |
  119|       |    // The total number of digits after the decimal place, used for scaling the result.
  120|  2.84M|    int32_t digitsAfterDecimalPlace = 0;
  121|       |
  122|       |    // The actual grouping and decimal separators used in the string.
  123|       |    // If non-null, we have seen that token.
  124|  2.84M|    UnicodeString actualGroupingString;
  125|  2.84M|    UnicodeString actualDecimalString;
  126|  2.84M|    actualGroupingString.setToBogus();
  127|  2.84M|    actualDecimalString.setToBogus();
  128|       |
  129|       |    // Information for two groups: the previous group and the current group.
  130|       |    //
  131|       |    // Each group has three pieces of information:
  132|       |    //
  133|       |    // Offset: the string position of the beginning of the group, including a leading separator
  134|       |    // if there was a leading separator. This is needed in case we need to rewind the parse to
  135|       |    // that position.
  136|       |    //
  137|       |    // Separator type:
  138|       |    // 0 => beginning of string
  139|       |    // 1 => lead separator is a grouping separator
  140|       |    // 2 => lead separator is a decimal separator
  141|       |    //
  142|       |    // Count: the number of digits in the group. If -1, the group has been validated.
  143|  2.84M|    int32_t currGroupOffset = 0;
  144|  2.84M|    int32_t currGroupSepType = 0;
  145|  2.84M|    int32_t currGroupCount = 0;
  146|  2.84M|    int32_t prevGroupOffset = -1;
  147|  2.84M|    int32_t prevGroupSepType = -1;
  148|  2.84M|    int32_t prevGroupCount = -1;
  149|       |
  150|  90.6M|    while (segment.length() > 0) {
  ------------------
  |  Branch (150:12): [True: 90.6M, False: 10.6k]
  ------------------
  151|  90.6M|        maybeMore = false;
  152|       |
  153|       |        // Attempt to match a digit.
  154|  90.6M|        int8_t digit = -1;
  155|       |
  156|       |        // Try by code point digit value.
  157|  90.6M|        UChar32 cp = segment.getCodePoint();
  158|  90.6M|        if (u_isdigit(cp)) {
  ------------------
  |  |  315|  90.6M|#define u_isdigit U_ICU_ENTRY_POINT_RENAME(u_isdigit)
  |  |  ------------------
  |  |  |  |  123|  90.6M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  90.6M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  90.6M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (158:13): [True: 87.7M, False: 2.95M]
  ------------------
  159|  87.7M|            segment.adjustOffset(U16_LENGTH(cp));
  ------------------
  |  |  141|  87.7M|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 87.6M, False: 12.7k]
  |  |  ------------------
  ------------------
  160|  87.7M|            digit = static_cast<int8_t>(u_digit(cp, 10));
  ------------------
  |  |  229|  87.7M|#define u_digit U_ICU_ENTRY_POINT_RENAME(u_digit)
  |  |  ------------------
  |  |  |  |  123|  87.7M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  87.7M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  87.7M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  161|  87.7M|        }
  162|       |
  163|       |        // Try by digit string.
  164|  90.6M|        if (digit == -1 && !fLocalDigitStrings.isNull()) {
  ------------------
  |  Branch (164:13): [True: 2.95M, False: 87.7M]
  |  Branch (164:28): [True: 0, False: 2.95M]
  ------------------
  165|      0|            for (int32_t i = 0; i < 10; i++) {
  ------------------
  |  Branch (165:33): [True: 0, False: 0]
  ------------------
  166|      0|                const UnicodeString& str = fLocalDigitStrings[i];
  167|      0|                if (str.isEmpty()) {
  ------------------
  |  Branch (167:21): [True: 0, False: 0]
  ------------------
  168|      0|                    continue;
  169|      0|                }
  170|      0|                int32_t overlap = segment.getCommonPrefixLength(str);
  171|      0|                if (overlap == str.length()) {
  ------------------
  |  Branch (171:21): [True: 0, False: 0]
  ------------------
  172|      0|                    segment.adjustOffset(overlap);
  173|      0|                    digit = static_cast<int8_t>(i);
  174|      0|                    break;
  175|      0|                }
  176|      0|                maybeMore = maybeMore || (overlap == segment.length());
  ------------------
  |  Branch (176:29): [True: 0, False: 0]
  |  Branch (176:42): [True: 0, False: 0]
  ------------------
  177|      0|            }
  178|      0|        }
  179|       |
  180|  90.6M|        if (digit >= 0) {
  ------------------
  |  Branch (180:13): [True: 87.7M, False: 2.95M]
  ------------------
  181|       |            // Digit was found.
  182|  87.7M|            if (digitsConsumed.bogus) {
  ------------------
  |  Branch (182:17): [True: 2.36M, False: 85.3M]
  ------------------
  183|  2.36M|                digitsConsumed.bogus = false;
  184|  2.36M|                digitsConsumed.clear();
  185|  2.36M|            }
  186|  87.7M|            digitsConsumed.appendDigit(digit, 0, true);
  187|  87.7M|            currGroupCount++;
  188|  87.7M|            if (!actualDecimalString.isBogus()) {
  ------------------
  |  Branch (188:17): [True: 3.91M, False: 83.7M]
  ------------------
  189|  3.91M|                digitsAfterDecimalPlace++;
  190|  3.91M|            }
  191|  87.7M|            continue;
  192|  87.7M|        }
  193|       |
  194|       |        // Attempt to match a literal grouping or decimal separator.
  195|  2.95M|        bool isDecimal = false;
  196|  2.95M|        bool isGrouping = false;
  197|       |
  198|       |        // 1) Attempt the decimal separator string literal.
  199|       |        // if (we have not seen a decimal separator yet) { ... }
  200|  2.95M|        if (actualDecimalString.isBogus() && !decimalSeparator.isEmpty()) {
  ------------------
  |  Branch (200:13): [True: 2.84M, False: 113k]
  |  Branch (200:46): [True: 2.84M, False: 0]
  ------------------
  201|  2.84M|            int32_t overlap = segment.getCommonPrefixLength(decimalSeparator);
  202|  2.84M|            maybeMore = maybeMore || (overlap == segment.length());
  ------------------
  |  Branch (202:25): [True: 0, False: 2.84M]
  |  Branch (202:38): [True: 61, False: 2.84M]
  ------------------
  203|  2.84M|            if (overlap == decimalSeparator.length()) {
  ------------------
  |  Branch (203:17): [True: 111k, False: 2.72M]
  ------------------
  204|   111k|                isDecimal = true;
  205|   111k|                actualDecimalString = decimalSeparator;
  206|   111k|            }
  207|  2.84M|        }
  208|       |
  209|       |        // 2) Attempt to match the actual grouping string literal.
  210|  2.95M|        if (!actualGroupingString.isBogus()) {
  ------------------
  |  Branch (210:13): [True: 3.78k, False: 2.95M]
  ------------------
  211|  3.78k|            int32_t overlap = segment.getCommonPrefixLength(actualGroupingString);
  212|  3.78k|            maybeMore = maybeMore || (overlap == segment.length());
  ------------------
  |  Branch (212:25): [True: 18, False: 3.76k]
  |  Branch (212:38): [True: 98, False: 3.67k]
  ------------------
  213|  3.78k|            if (overlap == actualGroupingString.length()) {
  ------------------
  |  Branch (213:17): [True: 2.47k, False: 1.31k]
  ------------------
  214|  2.47k|                isGrouping = true;
  215|  2.47k|            }
  216|  3.78k|        }
  217|       |
  218|       |        // 2.5) Attempt to match a new the grouping separator string literal.
  219|       |        // if (we have not seen a grouping or decimal separator yet) { ... }
  220|  2.95M|        if (!groupingDisabled && actualGroupingString.isBogus() && actualDecimalString.isBogus() &&
  ------------------
  |  Branch (220:13): [True: 51.4k, False: 2.90M]
  |  Branch (220:34): [True: 47.6k, False: 3.78k]
  |  Branch (220:68): [True: 19.5k, False: 28.1k]
  ------------------
  221|  2.95M|            !groupingSeparator.isEmpty()) {
  ------------------
  |  Branch (221:13): [True: 19.5k, False: 0]
  ------------------
  222|  19.5k|            int32_t overlap = segment.getCommonPrefixLength(groupingSeparator);
  223|  19.5k|            maybeMore = maybeMore || (overlap == segment.length());
  ------------------
  |  Branch (223:25): [True: 0, False: 19.5k]
  |  Branch (223:38): [True: 10, False: 19.5k]
  ------------------
  224|  19.5k|            if (overlap == groupingSeparator.length()) {
  ------------------
  |  Branch (224:17): [True: 1.75k, False: 17.7k]
  ------------------
  225|  1.75k|                isGrouping = true;
  226|  1.75k|                actualGroupingString = groupingSeparator;
  227|  1.75k|            }
  228|  19.5k|        }
  229|       |
  230|       |        // 3) Attempt to match a decimal separator from the equivalence set.
  231|       |        // if (we have not seen a decimal separator yet) { ... }
  232|       |        // The !isGrouping is to confirm that we haven't yet matched the current character.
  233|  2.95M|        if (!isGrouping && actualDecimalString.isBogus()) {
  ------------------
  |  Branch (233:13): [True: 2.94M, False: 4.22k]
  |  Branch (233:28): [True: 2.72M, False: 224k]
  ------------------
  234|  2.72M|            if (decimalUniSet->contains(cp)) {
  ------------------
  |  Branch (234:17): [True: 4.63k, False: 2.72M]
  ------------------
  235|  4.63k|                isDecimal = true;
  236|  4.63k|                actualDecimalString = UnicodeString(cp);
  237|  4.63k|            }
  238|  2.72M|        }
  239|       |
  240|       |        // 4) Attempt to match a grouping separator from the equivalence set.
  241|       |        // if (we have not seen a grouping or decimal separator yet) { ... }
  242|  2.95M|        if (!groupingDisabled && actualGroupingString.isBogus() && actualDecimalString.isBogus()) {
  ------------------
  |  Branch (242:13): [True: 51.4k, False: 2.90M]
  |  Branch (242:34): [True: 45.9k, False: 5.54k]
  |  Branch (242:68): [True: 17.6k, False: 28.2k]
  ------------------
  243|  17.6k|            if (groupingUniSet->contains(cp)) {
  ------------------
  |  Branch (243:17): [True: 1.53k, False: 16.1k]
  ------------------
  244|  1.53k|                isGrouping = true;
  245|  1.53k|                actualGroupingString = UnicodeString(cp);
  246|  1.53k|            }
  247|  17.6k|        }
  248|       |
  249|       |        // Leave if we failed to match this as a separator.
  250|  2.95M|        if (!isDecimal && !isGrouping) {
  ------------------
  |  Branch (250:13): [True: 2.83M, False: 115k]
  |  Branch (250:27): [True: 2.83M, False: 5.75k]
  ------------------
  251|  2.83M|            break;
  252|  2.83M|        }
  253|       |
  254|       |        // Check for conditions when we don't want to accept the separator.
  255|   121k|        if (isDecimal && integerOnly) {
  ------------------
  |  Branch (255:13): [True: 115k, False: 5.75k]
  |  Branch (255:26): [True: 770, False: 115k]
  ------------------
  256|    770|            break;
  257|   120k|        } else if (currGroupSepType == 2 && isGrouping) {
  ------------------
  |  Branch (257:20): [True: 0, False: 120k]
  |  Branch (257:45): [True: 0, False: 0]
  ------------------
  258|       |            // Fraction grouping
  259|      0|            break;
  260|      0|        }
  261|       |
  262|       |        // Validate intermediate grouping sizes.
  263|   120k|        bool prevValidSecondary = validateGroup(prevGroupSepType, prevGroupCount, false);
  264|   120k|        bool currValidPrimary = validateGroup(currGroupSepType, currGroupCount, true);
  265|   120k|        if (!prevValidSecondary || (isDecimal && !currValidPrimary)) {
  ------------------
  |  Branch (265:13): [True: 1.20k, False: 119k]
  |  Branch (265:37): [True: 115k, False: 4.56k]
  |  Branch (265:50): [True: 8, False: 115k]
  ------------------
  266|       |            // Invalid grouping sizes.
  267|  1.21k|            if (isGrouping && currGroupCount == 0) {
  ------------------
  |  Branch (267:17): [True: 1.18k, False: 27]
  |  Branch (267:31): [True: 124, False: 1.06k]
  ------------------
  268|       |                // Trailing grouping separators: these are taken care of below
  269|    124|                U_ASSERT(currGroupSepType == 1);
  ------------------
  |  |   35|    124|#   define U_ASSERT(exp) (void)0
  ------------------
  270|  1.09k|            } else if (requireGroupingMatch) {
  ------------------
  |  Branch (270:24): [True: 1.09k, False: 0]
  ------------------
  271|       |                // Strict mode: reject the parse
  272|  1.09k|                digitsConsumed.clear();
  273|  1.09k|                digitsConsumed.bogus = true;
  274|  1.09k|            }
  275|  1.21k|            break;
  276|   119k|        } else if (requireGroupingMatch && currGroupCount == 0 && currGroupSepType == 1) {
  ------------------
  |  Branch (276:20): [True: 119k, False: 0]
  |  Branch (276:44): [True: 88.9k, False: 30.6k]
  |  Branch (276:67): [True: 53, False: 88.8k]
  ------------------
  277|     53|            break;
  278|   119k|        } else {
  279|       |            // Grouping sizes OK so far.
  280|   119k|            prevGroupOffset = currGroupOffset;
  281|   119k|            prevGroupCount = currGroupCount;
  282|   119k|            if (isDecimal) {
  ------------------
  |  Branch (282:17): [True: 115k, False: 4.51k]
  ------------------
  283|       |                // Do not validate this group any more.
  284|   115k|                prevGroupSepType = -1;
  285|   115k|            } else {
  286|  4.51k|                prevGroupSepType = currGroupSepType;
  287|  4.51k|            }
  288|   119k|        }
  289|       |
  290|       |        // OK to accept the separator.
  291|       |        // Special case: don't update currGroup if it is empty; this allows two grouping
  292|       |        // separators in a row in lenient mode.
  293|   119k|        if (currGroupCount != 0) {
  ------------------
  |  Branch (293:13): [True: 30.6k, False: 88.8k]
  ------------------
  294|  30.6k|            currGroupOffset = segment.getOffset();
  295|  30.6k|        }
  296|   119k|        currGroupSepType = isGrouping ? 1 : 2;
  ------------------
  |  Branch (296:28): [True: 4.51k, False: 115k]
  ------------------
  297|   119k|        currGroupCount = 0;
  298|   119k|        if (isGrouping) {
  ------------------
  |  Branch (298:13): [True: 4.51k, False: 115k]
  ------------------
  299|  4.51k|            segment.adjustOffset(actualGroupingString.length());
  300|   115k|        } else {
  301|   115k|            segment.adjustOffset(actualDecimalString.length());
  302|   115k|        }
  303|   119k|    }
  304|       |
  305|       |    // End of main loop.
  306|       |    // Back up if there was a trailing grouping separator.
  307|       |    // Shift prev -> curr so we can check it as a final group.
  308|  2.84M|    if (currGroupSepType != 2 && currGroupCount == 0) {
  ------------------
  |  Branch (308:9): [True: 2.73M, False: 115k]
  |  Branch (308:34): [True: 480k, False: 2.24M]
  ------------------
  309|   480k|        maybeMore = true;
  310|   480k|        segment.setOffset(currGroupOffset);
  311|   480k|        currGroupOffset = prevGroupOffset;
  312|   480k|        currGroupSepType = prevGroupSepType;
  313|   480k|        currGroupCount = prevGroupCount;
  314|   480k|        prevGroupOffset = -1;
  315|   480k|        prevGroupSepType = 0;
  316|   480k|        prevGroupCount = 1;
  317|   480k|    }
  318|       |
  319|       |    // Validate final grouping sizes.
  320|  2.84M|    bool prevValidSecondary = validateGroup(prevGroupSepType, prevGroupCount, false);
  321|  2.84M|    bool currValidPrimary = validateGroup(currGroupSepType, currGroupCount, true);
  322|  2.84M|    if (!requireGroupingMatch) {
  ------------------
  |  Branch (322:9): [True: 362k, False: 2.48M]
  ------------------
  323|       |        // The cases we need to handle here are lone digits.
  324|       |        // Examples: "1,1"  "1,1,"  "1,1,1"  "1,1,1,"  ",1" (all parse as 1)
  325|       |        // See more examples in numberformattestspecification.txt
  326|   362k|        int32_t digitsToRemove = 0;
  327|   362k|        if (!prevValidSecondary) {
  ------------------
  |  Branch (327:13): [True: 0, False: 362k]
  ------------------
  328|      0|            segment.setOffset(prevGroupOffset);
  329|      0|            digitsToRemove += prevGroupCount;
  330|      0|            digitsToRemove += currGroupCount;
  331|   362k|        } else if (!currValidPrimary && (prevGroupSepType != 0 || prevGroupCount != 0)) {
  ------------------
  |  Branch (331:20): [True: 0, False: 362k]
  |  Branch (331:42): [True: 0, False: 0]
  |  Branch (331:67): [True: 0, False: 0]
  ------------------
  332|      0|            maybeMore = true;
  333|      0|            segment.setOffset(currGroupOffset);
  334|      0|            digitsToRemove += currGroupCount;
  335|      0|        }
  336|   362k|        if (digitsToRemove != 0) {
  ------------------
  |  Branch (336:13): [True: 0, False: 362k]
  ------------------
  337|      0|            digitsConsumed.adjustMagnitude(-digitsToRemove);
  338|      0|            digitsConsumed.truncate();
  339|      0|        }
  340|   362k|        prevValidSecondary = true;
  341|   362k|        currValidPrimary = true;
  342|   362k|    }
  343|  2.84M|    if (currGroupSepType != 2 && (!prevValidSecondary || !currValidPrimary)) {
  ------------------
  |  Branch (343:9): [True: 2.73M, False: 115k]
  |  Branch (343:35): [True: 393k, False: 2.33M]
  |  Branch (343:58): [True: 540, False: 2.33M]
  ------------------
  344|       |        // Grouping failure.
  345|   394k|        digitsConsumed.bogus = true;
  346|   394k|    }
  347|       |
  348|       |    // Strings that start with a separator but have no digits,
  349|       |    // or strings that failed a grouping size check.
  350|  2.84M|    if (digitsConsumed.bogus) {
  ------------------
  |  Branch (350:9): [True: 482k, False: 2.36M]
  ------------------
  351|   482k|        maybeMore = maybeMore || (segment.length() == 0);
  ------------------
  |  Branch (351:21): [True: 480k, False: 2.34k]
  |  Branch (351:34): [True: 613, False: 1.73k]
  ------------------
  352|   482k|        segment.setOffset(initialOffset);
  353|   482k|        return maybeMore;
  354|   482k|    }
  355|       |
  356|       |    // We passed all inspections. Start post-processing.
  357|       |
  358|       |    // Adjust for fraction part.
  359|  2.36M|    digitsConsumed.adjustMagnitude(-digitsAfterDecimalPlace);
  360|       |
  361|       |    // Set the digits, either normal or exponent.
  362|  2.36M|    if (exponentSign != 0 && segment.getOffset() != initialOffset) {
  ------------------
  |  Branch (362:9): [True: 275k, False: 2.08M]
  |  Branch (362:30): [True: 275k, False: 0]
  ------------------
  363|   275k|        bool overflow = false;
  364|   275k|        if (digitsConsumed.fitsInLong()) {
  ------------------
  |  Branch (364:13): [True: 274k, False: 1.00k]
  ------------------
  365|   274k|            int64_t exponentLong = digitsConsumed.toLong(false);
  366|   274k|            U_ASSERT(exponentLong >= 0);
  ------------------
  |  |   35|   274k|#   define U_ASSERT(exp) (void)0
  ------------------
  367|   274k|            if (exponentLong <= INT32_MAX) {
  ------------------
  |  Branch (367:17): [True: 274k, False: 707]
  ------------------
  368|   274k|                auto exponentInt = static_cast<int32_t>(exponentLong);
  369|   274k|                if (result.quantity.adjustMagnitude(exponentSign * exponentInt)) {
  ------------------
  |  Branch (369:21): [True: 12, False: 274k]
  ------------------
  370|     12|                    overflow = true;
  371|     12|                }
  372|   274k|            } else {
  373|    707|                overflow = true;
  374|    707|            }
  375|   274k|        } else {
  376|  1.00k|            overflow = true;
  377|  1.00k|        }
  378|   275k|        if (overflow) {
  ------------------
  |  Branch (378:13): [True: 1.71k, False: 274k]
  ------------------
  379|  1.71k|            if (exponentSign == -1) {
  ------------------
  |  Branch (379:17): [True: 1.06k, False: 658]
  ------------------
  380|       |                // Set to zero
  381|  1.06k|                result.quantity.clear();
  382|  1.06k|            } else {
  383|       |                // Set to infinity
  384|    658|                result.quantity.bogus = true;
  385|    658|                result.flags |= FLAG_INFINITY;
  386|    658|            }
  387|  1.71k|        }
  388|  2.08M|    } else {
  389|  2.08M|        result.quantity = digitsConsumed;
  390|  2.08M|    }
  391|       |
  392|       |    // Set other information into the result and return.
  393|  2.36M|    if (!actualDecimalString.isBogus()) {
  ------------------
  |  Branch (393:9): [True: 114k, False: 2.24M]
  ------------------
  394|   114k|        result.flags |= FLAG_HAS_DECIMAL_SEPARATOR;
  395|   114k|    }
  396|  2.36M|    result.setCharsConsumed(segment);
  397|  2.36M|    return segment.length() == 0 || maybeMore;
  ------------------
  |  Branch (397:12): [True: 9.89k, False: 2.35M]
  |  Branch (397:37): [True: 250, False: 2.35M]
  ------------------
  398|  2.84M|}
_ZNK6icu_788numparse4impl14DecimalMatcher13validateGroupEiib:
  400|  5.93M|bool DecimalMatcher::validateGroup(int32_t sepType, int32_t count, bool isPrimary) const {
  401|  5.93M|    if (requireGroupingMatch) {
  ------------------
  |  Branch (401:9): [True: 5.20M, False: 725k]
  ------------------
  402|  5.20M|        if (sepType == -1) {
  ------------------
  |  Branch (402:13): [True: 2.59M, False: 2.60M]
  ------------------
  403|       |            // No such group (prevGroup before first shift).
  404|  2.59M|            return true;
  405|  2.60M|        } else if (sepType == 0) {
  ------------------
  |  Branch (405:20): [True: 2.48M, False: 121k]
  ------------------
  406|       |            // First group.
  407|  2.48M|            if (isPrimary) {
  ------------------
  |  Branch (407:17): [True: 2.09M, False: 396k]
  ------------------
  408|       |                // No grouping separators is OK.
  409|  2.09M|                return true;
  410|  2.09M|            } else {
  411|   396k|                return count != 0 && count <= grouping2;
  ------------------
  |  Branch (411:24): [True: 394k, False: 1.68k]
  |  Branch (411:38): [True: 2.36k, False: 392k]
  ------------------
  412|   396k|            }
  413|  2.48M|        } else if (sepType == 1) {
  ------------------
  |  Branch (413:20): [True: 6.05k, False: 115k]
  ------------------
  414|       |            // Middle group.
  415|  6.05k|            if (isPrimary) {
  ------------------
  |  Branch (415:17): [True: 4.77k, False: 1.27k]
  ------------------
  416|  4.77k|                return count == grouping1;
  417|  4.77k|            } else {
  418|  1.27k|                return count == grouping2;
  419|  1.27k|            }
  420|   115k|        } else {
  421|   115k|            U_ASSERT(sepType == 2);
  ------------------
  |  |   35|   115k|#   define U_ASSERT(exp) (void)0
  ------------------
  422|       |            // After the decimal separator.
  423|   115k|            return true;
  424|   115k|        }
  425|  5.20M|    } else {
  426|   725k|        if (sepType == 1) {
  ------------------
  |  Branch (426:13): [True: 0, False: 725k]
  ------------------
  427|       |            // #11230: don't accept middle groups with only 1 digit.
  428|      0|            return count != 1;
  429|   725k|        } else {
  430|   725k|            return true;
  431|   725k|        }
  432|   725k|    }
  433|  5.93M|}
_ZNK6icu_788numparse4impl14DecimalMatcher9smokeTestERKNS_13StringSegmentE:
  435|  9.79M|bool DecimalMatcher::smokeTest(const StringSegment& segment) const {
  436|       |    // The common case uses a static leadSet for efficiency.
  437|  9.79M|    if (fLocalDigitStrings.isNull() && leadSet != nullptr) {
  ------------------
  |  Branch (437:9): [True: 9.79M, False: 0]
  |  Branch (437:40): [True: 9.75M, False: 33.7k]
  ------------------
  438|  9.75M|        return segment.startsWith(*leadSet);
  439|  9.75M|    }
  440|  33.7k|    if (segment.startsWith(*separatorSet) || u_isdigit(segment.getCodePoint())) {
  ------------------
  |  |  315|  33.7k|#define u_isdigit U_ICU_ENTRY_POINT_RENAME(u_isdigit)
  |  |  ------------------
  |  |  |  |  123|  33.7k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  33.7k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  33.7k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (440:9): [True: 4, False: 33.7k]
  |  Branch (440:46): [True: 5, False: 33.7k]
  ------------------
  441|      9|        return true;
  442|      9|    }
  443|  33.7k|    if (fLocalDigitStrings.isNull()) {
  ------------------
  |  Branch (443:9): [True: 33.7k, False: 0]
  ------------------
  444|  33.7k|        return false;
  445|  33.7k|    }
  446|      0|    for (int32_t i = 0; i < 10; i++) {
  ------------------
  |  Branch (446:25): [True: 0, False: 0]
  ------------------
  447|      0|        if (segment.startsWith(fLocalDigitStrings[i])) {
  ------------------
  |  Branch (447:13): [True: 0, False: 0]
  ------------------
  448|      0|            return true;
  449|      0|        }
  450|      0|    }
  451|      0|    return false;
  452|      0|}

_ZN6icu_788numparse4impl14DecimalMatcherC2Ev:
   20|   205k|    DecimalMatcher() = default;  // WARNING: Leaves the object in an unusable state

_ZN6icu_788numparse4impl18NumberParseMatcherD2Ev:
   32|  77.4M|NumberParseMatcher::~NumberParseMatcher() = default;
_ZN6icu_788numparse4impl16NumberParserImpl26createParserFromPropertiesERKNS_6number4impl23DecimalFormatPropertiesERKNS_20DecimalFormatSymbolsEbR10UErrorCode:
   84|   102k|                                             UErrorCode& status) {
   85|   102k|    Locale locale = symbols.getLocale();
   86|   102k|    AutoAffixPatternProvider affixProvider(properties, status);
   87|   102k|    if (U_FAILURE(status)) { return nullptr; }
  ------------------
  |  Branch (87:9): [True: 0, False: 102k]
  ------------------
   88|   102k|    CurrencyUnit currency = resolveCurrency(properties, locale, status);
   89|   102k|    CurrencySymbols currencySymbols(currency, locale, symbols, status);
   90|   102k|    bool isStrict = properties.parseMode.getOrDefault(PARSE_MODE_STRICT) == PARSE_MODE_STRICT;
   91|   102k|    Grouper grouper = Grouper::forProperties(properties);
   92|   102k|    int parseFlags = 0;
   93|   102k|    if (U_FAILURE(status)) { return nullptr; }
  ------------------
  |  Branch (93:9): [True: 0, False: 102k]
  ------------------
   94|   102k|    if (!properties.parseCaseSensitive) {
  ------------------
  |  Branch (94:9): [True: 102k, False: 0]
  ------------------
   95|   102k|        parseFlags |= PARSE_FLAG_IGNORE_CASE;
   96|   102k|    }
   97|   102k|    if (properties.parseIntegerOnly) {
  ------------------
  |  Branch (97:9): [True: 0, False: 102k]
  ------------------
   98|      0|        parseFlags |= PARSE_FLAG_INTEGER_ONLY;
   99|      0|    }
  100|   102k|    if (properties.signAlwaysShown) {
  ------------------
  |  Branch (100:9): [True: 0, False: 102k]
  ------------------
  101|      0|        parseFlags |= PARSE_FLAG_PLUS_SIGN_ALLOWED;
  102|      0|    }
  103|   102k|    if (isStrict) {
  ------------------
  |  Branch (103:9): [True: 102k, False: 0]
  ------------------
  104|   102k|        parseFlags |= PARSE_FLAG_STRICT_GROUPING_SIZE;
  105|   102k|        parseFlags |= PARSE_FLAG_STRICT_SEPARATORS;
  106|   102k|        parseFlags |= PARSE_FLAG_USE_FULL_AFFIXES;
  107|   102k|        parseFlags |= PARSE_FLAG_EXACT_AFFIX;
  108|   102k|        parseFlags |= PARSE_FLAG_STRICT_IGNORABLES;
  109|   102k|    } else {
  110|      0|        parseFlags |= PARSE_FLAG_INCLUDE_UNPAIRED_AFFIXES;
  111|      0|    }
  112|   102k|    if (grouper.getPrimary() <= 0) {
  ------------------
  |  Branch (112:9): [True: 74.6k, False: 28.0k]
  ------------------
  113|  74.6k|        parseFlags |= PARSE_FLAG_GROUPING_DISABLED;
  114|  74.6k|    }
  115|   102k|    if (parseCurrency || affixProvider.get().hasCurrencySign()) {
  ------------------
  |  Branch (115:9): [True: 0, False: 102k]
  |  Branch (115:26): [True: 13.8k, False: 88.8k]
  ------------------
  116|  13.8k|        parseFlags |= PARSE_FLAG_MONETARY_SEPARATORS;
  117|  13.8k|    }
  118|   102k|    if (!parseCurrency) {
  ------------------
  |  Branch (118:9): [True: 102k, False: 0]
  ------------------
  119|   102k|        parseFlags |= PARSE_FLAG_NO_FOREIGN_CURRENCY;
  120|   102k|    }
  121|       |
  122|   102k|    LocalPointer<NumberParserImpl> parser(new NumberParserImpl(parseFlags));
  123|       |
  124|   102k|    parser->fLocalMatchers.ignorables = {parseFlags};
  125|   102k|    IgnorablesMatcher& ignorables = parser->fLocalMatchers.ignorables;
  126|       |
  127|       |    //////////////////////
  128|       |    /// AFFIX MATCHERS ///
  129|       |    //////////////////////
  130|       |
  131|       |    // The following statements set up the affix matchers.
  132|   102k|    AffixTokenMatcherSetupData affixSetupData = {
  133|   102k|            currencySymbols, symbols, ignorables, locale, parseFlags};
  134|   102k|    parser->fLocalMatchers.affixTokenMatcherWarehouse = {&affixSetupData};
  135|   102k|    parser->fLocalMatchers.affixMatcherWarehouse = {&parser->fLocalMatchers.affixTokenMatcherWarehouse};
  136|   102k|    parser->fLocalMatchers.affixMatcherWarehouse.createAffixMatchers(
  137|   102k|            affixProvider.get(), *parser, ignorables, parseFlags, status);
  138|       |
  139|       |    ////////////////////////
  140|       |    /// CURRENCY MATCHER ///
  141|       |    ////////////////////////
  142|       |
  143|   102k|    if (parseCurrency || affixProvider.get().hasCurrencySign()) {
  ------------------
  |  Branch (143:9): [True: 0, False: 102k]
  |  Branch (143:26): [True: 13.8k, False: 88.8k]
  ------------------
  144|  13.8k|        parser->addMatcher(parser->fLocalMatchers.currency = {currencySymbols, symbols, parseFlags, status});
  145|  13.8k|    }
  146|       |
  147|       |    ///////////////
  148|       |    /// PERCENT ///
  149|       |    ///////////////
  150|       |
  151|       |    // ICU-TC meeting, April 11, 2018: accept percent/permille only if it is in the pattern,
  152|       |    // and to maintain regressive behavior, divide by 100 even if no percent sign is present.
  153|   102k|    if (!isStrict && affixProvider.get().containsSymbolType(AffixPatternType::TYPE_PERCENT, status)) {
  ------------------
  |  Branch (153:9): [True: 0, False: 102k]
  |  Branch (153:22): [True: 0, False: 0]
  ------------------
  154|      0|        parser->addMatcher(parser->fLocalMatchers.percent = {symbols});
  155|      0|    }
  156|   102k|    if (!isStrict && affixProvider.get().containsSymbolType(AffixPatternType::TYPE_PERMILLE, status)) {
  ------------------
  |  Branch (156:9): [True: 0, False: 102k]
  |  Branch (156:22): [True: 0, False: 0]
  ------------------
  157|      0|        parser->addMatcher(parser->fLocalMatchers.permille = {symbols});
  158|      0|    }
  159|       |
  160|       |    ///////////////////////////////
  161|       |    /// OTHER STANDARD MATCHERS ///
  162|       |    ///////////////////////////////
  163|       |
  164|   102k|    if (!isStrict) {
  ------------------
  |  Branch (164:9): [True: 0, False: 102k]
  ------------------
  165|      0|        parser->addMatcher(parser->fLocalMatchers.plusSign = {symbols, false});
  166|      0|        parser->addMatcher(parser->fLocalMatchers.minusSign = {symbols, false});
  167|      0|    }
  168|   102k|    parser->addMatcher(parser->fLocalMatchers.nan = {symbols});
  169|   102k|    parser->addMatcher(parser->fLocalMatchers.infinity = {symbols});
  170|   102k|    UnicodeString padString = properties.padString;
  171|   102k|    if (!padString.isBogus() && !ignorables.getSet()->contains(padString)) {
  ------------------
  |  Branch (171:9): [True: 1.55k, False: 101k]
  |  Branch (171:33): [True: 1.55k, False: 1]
  ------------------
  172|  1.55k|        parser->addMatcher(parser->fLocalMatchers.padding = {padString});
  173|  1.55k|    }
  174|   102k|    parser->addMatcher(parser->fLocalMatchers.ignorables);
  175|   102k|    parser->addMatcher(parser->fLocalMatchers.decimal = {symbols, grouper, parseFlags});
  176|       |    // NOTE: parseNoExponent doesn't disable scientific parsing if we have a scientific formatter
  177|   102k|    if (!properties.parseNoExponent || properties.minimumExponentDigits > 0) {
  ------------------
  |  Branch (177:9): [True: 102k, False: 0]
  |  Branch (177:40): [True: 0, False: 0]
  ------------------
  178|   102k|        parser->addMatcher(parser->fLocalMatchers.scientific = {symbols, grouper});
  179|   102k|    }
  180|       |
  181|       |    //////////////////
  182|       |    /// VALIDATORS ///
  183|       |    //////////////////
  184|       |
  185|   102k|    parser->addMatcher(parser->fLocalValidators.number = {});
  186|   102k|    if (isStrict) {
  ------------------
  |  Branch (186:9): [True: 102k, False: 0]
  ------------------
  187|   102k|        parser->addMatcher(parser->fLocalValidators.affix = {});
  188|   102k|    }
  189|   102k|    if (parseCurrency) {
  ------------------
  |  Branch (189:9): [True: 0, False: 102k]
  ------------------
  190|      0|        parser->addMatcher(parser->fLocalValidators.currency = {});
  191|      0|    }
  192|   102k|    if (properties.decimalPatternMatchRequired) {
  ------------------
  |  Branch (192:9): [True: 0, False: 102k]
  ------------------
  193|      0|        bool patternHasDecimalSeparator =
  194|      0|                properties.decimalSeparatorAlwaysShown || properties.maximumFractionDigits != 0;
  ------------------
  |  Branch (194:17): [True: 0, False: 0]
  |  Branch (194:59): [True: 0, False: 0]
  ------------------
  195|      0|        parser->addMatcher(parser->fLocalValidators.decimalSeparator = {patternHasDecimalSeparator});
  196|      0|    }
  197|       |    // The multiplier takes care of scaling percentages.
  198|   102k|    Scale multiplier = scaleFromProperties(properties);
  199|   102k|    if (multiplier.isValid()) {
  ------------------
  |  Branch (199:9): [True: 10.3k, False: 92.4k]
  ------------------
  200|  10.3k|        parser->addMatcher(parser->fLocalValidators.multiplier = {multiplier});
  201|  10.3k|    }
  202|       |
  203|   102k|    parser->freeze();
  204|   102k|    return parser.orphan();
  205|   102k|}
_ZN6icu_788numparse4impl16NumberParserImplC2Ei:
  208|   102k|        : fParseFlags(parseFlags) {
  209|   102k|}
_ZN6icu_788numparse4impl16NumberParserImplD2Ev:
  211|   102k|NumberParserImpl::~NumberParserImpl() {
  212|   102k|    fNumMatchers = 0;
  213|   102k|}
_ZN6icu_788numparse4impl16NumberParserImpl10addMatcherERNS1_18NumberParseMatcherE:
  215|   950k|void NumberParserImpl::addMatcher(NumberParseMatcher& matcher) {
  216|   950k|    if (fNumMatchers + 1 > fMatchers.getCapacity()) {
  ------------------
  |  Branch (216:9): [True: 21, False: 950k]
  ------------------
  217|     21|        fMatchers.resize(fNumMatchers * 2, fNumMatchers);
  218|     21|    }
  219|   950k|    fMatchers[fNumMatchers] = &matcher;
  220|   950k|    fNumMatchers++;
  221|   950k|}
_ZN6icu_788numparse4impl16NumberParserImpl6freezeEv:
  223|   102k|void NumberParserImpl::freeze() {
  224|   102k|    fFrozen = true;
  225|   102k|}
_ZNK6icu_788numparse4impl16NumberParserImpl13getParseFlagsEv:
  227|  1.87M|parse_flags_t NumberParserImpl::getParseFlags() const {
  228|  1.87M|    return fParseFlags;
  229|  1.87M|}
_ZNK6icu_788numparse4impl16NumberParserImpl5parseERKNS_13UnicodeStringEibRNS1_12ParsedNumberER10UErrorCode:
  237|  7.43M|                             UErrorCode& status) const {
  238|  7.43M|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (238:9): [True: 0, False: 7.43M]
  ------------------
  239|      0|        return;
  240|      0|    }
  241|  7.43M|    U_ASSERT(fFrozen);
  ------------------
  |  |   35|  7.43M|#   define U_ASSERT(exp) (void)0
  ------------------
  242|       |    // TODO: Check start >= 0 and start < input.length()
  243|  7.43M|    StringSegment segment(input, 0 != (fParseFlags & PARSE_FLAG_IGNORE_CASE));
  244|  7.43M|    segment.adjustOffset(start);
  245|  7.43M|    if (greedy) {
  ------------------
  |  Branch (245:9): [True: 7.43M, False: 0]
  ------------------
  246|  7.43M|        parseGreedy(segment, result, status);
  247|  7.43M|    } else if (0 != (fParseFlags & PARSE_FLAG_ALLOW_INFINITE_RECURSION)) {
  ------------------
  |  Branch (247:16): [True: 0, False: 0]
  ------------------
  248|       |        // Start at 1 so that recursionLevels never gets to 0
  249|      0|        parseLongestRecursive(segment, result, 1, status);
  250|      0|    } else {
  251|       |        // Arbitrary recursion safety limit: 100 levels.
  252|      0|        parseLongestRecursive(segment, result, -100, status);
  253|      0|    }
  254|  75.3M|    for (int32_t i = 0; i < fNumMatchers; i++) {
  ------------------
  |  Branch (254:25): [True: 67.8M, False: 7.43M]
  ------------------
  255|  67.8M|        fMatchers[i]->postProcess(result);
  256|  67.8M|    }
  257|  7.43M|    result.postProcess();
  258|  7.43M|}
_ZNK6icu_788numparse4impl16NumberParserImpl11parseGreedyERNS_13StringSegmentERNS1_12ParsedNumberER10UErrorCode:
  261|  7.43M|                                            UErrorCode& status) const {
  262|       |    // Note: this method is not recursive in order to avoid stack overflow.
  263|  90.4M|    for (int i = 0; i <fNumMatchers;) {
  ------------------
  |  Branch (263:21): [True: 82.9M, False: 7.42M]
  ------------------
  264|       |        // Base Case
  265|  82.9M|        if (segment.length() == 0) {
  ------------------
  |  Branch (265:13): [True: 11.7k, False: 82.9M]
  ------------------
  266|  11.7k|            return;
  267|  11.7k|        }
  268|  82.9M|        const NumberParseMatcher* matcher = fMatchers[i];
  269|  82.9M|        if (!matcher->smokeTest(segment)) {
  ------------------
  |  Branch (269:13): [True: 78.7M, False: 4.20M]
  ------------------
  270|       |            // Matcher failed smoke test: try the next one
  271|  78.7M|            i++;
  272|  78.7M|            continue;
  273|  78.7M|        }
  274|  4.20M|        int32_t initialOffset = segment.getOffset();
  275|  4.20M|        matcher->match(segment, result, status);
  276|  4.20M|        if (U_FAILURE(status)) {
  ------------------
  |  Branch (276:13): [True: 0, False: 4.20M]
  ------------------
  277|      0|            return;
  278|      0|        }
  279|  4.20M|        if (segment.getOffset() != initialOffset) {
  ------------------
  |  Branch (279:13): [True: 2.54M, False: 1.65M]
  ------------------
  280|       |            // Greedy heuristic: accept the match and loop back
  281|  2.54M|            i = 0;
  282|  2.54M|            continue;
  283|  2.54M|        } else {
  284|       |            // Matcher did not match: try the next one
  285|  1.65M|            i++;
  286|  1.65M|            continue;
  287|  1.65M|        }
  288|  4.20M|        UPRV_UNREACHABLE_EXIT;
  ------------------
  |  |   68|      0|#   define UPRV_UNREACHABLE_EXIT abort()
  ------------------
  289|  4.20M|    }
  290|       |
  291|       |    // NOTE: If we get here, the greedy parse completed without consuming the entire string.
  292|  7.43M|}

_ZN6icu_788numparse4impl12ParsedNumberC2Ev:
   25|  7.43M|ParsedNumber::ParsedNumber() {
   26|  7.43M|    clear();
   27|  7.43M|}
_ZN6icu_788numparse4impl12ParsedNumber5clearEv:
   29|  7.43M|void ParsedNumber::clear() {
   30|  7.43M|    quantity.bogus = true;
   31|  7.43M|    charEnd = 0;
   32|  7.43M|    flags = 0;
   33|  7.43M|    prefix.setToBogus();
   34|  7.43M|    suffix.setToBogus();
   35|  7.43M|    currencyCode[0] = 0;
   36|  7.43M|}
_ZN6icu_788numparse4impl12ParsedNumber16setCharsConsumedERKNS_13StringSegmentE:
   38|  25.6M|void ParsedNumber::setCharsConsumed(const StringSegment& segment) {
   39|  25.6M|    charEnd = segment.getOffset();
   40|  25.6M|}
_ZN6icu_788numparse4impl12ParsedNumber11postProcessEv:
   42|  7.43M|void ParsedNumber::postProcess() {
   43|  7.43M|    if (!quantity.bogus && 0 != (flags & FLAG_NEGATIVE)) {
  ------------------
  |  Branch (43:9): [True: 2.08M, False: 5.35M]
  |  Branch (43:28): [True: 32.8k, False: 2.05M]
  ------------------
   44|  32.8k|        quantity.negate();
   45|  32.8k|    }
   46|  7.43M|}
_ZNK6icu_788numparse4impl12ParsedNumber7successEv:
   48|  7.43M|bool ParsedNumber::success() const {
   49|  7.43M|    return charEnd > 0 && 0 == (flags & FLAG_FAIL);
  ------------------
  |  Branch (49:12): [True: 2.11M, False: 5.32M]
  |  Branch (49:27): [True: 1.87M, False: 238k]
  ------------------
   50|  7.43M|}
_ZNK6icu_788numparse4impl12ParsedNumber10seenNumberEv:
   52|  11.8M|bool ParsedNumber::seenNumber() const {
   53|  11.8M|    return !quantity.bogus || 0 != (flags & FLAG_NAN) || 0 != (flags & FLAG_INFINITY);
  ------------------
  |  Branch (53:12): [True: 3.16M, False: 8.72M]
  |  Branch (53:31): [True: 21.8k, False: 8.70M]
  |  Branch (53:58): [True: 504, False: 8.70M]
  ------------------
   54|  11.8M|}
_ZNK6icu_788numparse4impl12ParsedNumber19populateFormattableERNS_11FormattableEi:
   88|  1.87M|void ParsedNumber::populateFormattable(Formattable& output, parse_flags_t parseFlags) const {
   89|  1.87M|    bool sawNaN = 0 != (flags & FLAG_NAN);
   90|  1.87M|    bool sawInfinity = 0 != (flags & FLAG_INFINITY);
   91|  1.87M|    bool integerOnly = 0 != (parseFlags & PARSE_FLAG_INTEGER_ONLY);
   92|       |
   93|       |    // Check for NaN, infinity, and -0.0
   94|  1.87M|    if (sawNaN) {
  ------------------
  |  Branch (94:9): [True: 21.5k, False: 1.85M]
  ------------------
   95|       |        // Can't use NAN or std::nan because the byte pattern is platform-dependent;
   96|       |        // MSVC sets the sign bit, but Clang and GCC do not
   97|  21.5k|        output.setDouble(uprv_getNaN());
  ------------------
  |  | 1509|  21.5k|#define uprv_getNaN U_ICU_ENTRY_POINT_RENAME(uprv_getNaN)
  |  |  ------------------
  |  |  |  |  123|  21.5k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  21.5k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  21.5k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|  21.5k|        return;
   99|  21.5k|    }
  100|  1.85M|    if (sawInfinity) {
  ------------------
  |  Branch (100:9): [True: 1.01k, False: 1.85M]
  ------------------
  101|  1.01k|        if (0 != (flags & FLAG_NEGATIVE)) {
  ------------------
  |  Branch (101:13): [True: 514, False: 496]
  ------------------
  102|    514|            output.setDouble(-INFINITY);
  103|    514|            return;
  104|    514|        } else {
  105|    496|            output.setDouble(INFINITY);
  106|    496|            return;
  107|    496|        }
  108|  1.01k|    }
  109|  1.85M|    U_ASSERT(!quantity.bogus);
  ------------------
  |  |   35|  1.85M|#   define U_ASSERT(exp) (void)0
  ------------------
  110|  1.85M|    if (quantity.isZeroish() && quantity.isNegative() && !integerOnly) {
  ------------------
  |  Branch (110:9): [True: 221k, False: 1.62M]
  |  Branch (110:33): [True: 27.6k, False: 194k]
  |  Branch (110:58): [True: 27.6k, False: 0]
  ------------------
  111|  27.6k|        output.setDouble(-0.0);
  112|  27.6k|        return;
  113|  27.6k|    }
  114|       |
  115|       |    // All other numbers
  116|  1.82M|    output.adoptDecimalQuantity(new DecimalQuantity(quantity));
  117|  1.82M|}

_ZN6icu_788numparse4impl17ScientificMatcherC2ERKNS_20DecimalFormatSymbolsERKNS_6number4impl7GrouperE:
   36|   102k|        : fExponentSeparatorString(dfs.getConstSymbol(DecimalFormatSymbols::kExponentialSymbol)),
   37|   102k|          fExponentMatcher(dfs, grouper, PARSE_FLAG_INTEGER_ONLY | PARSE_FLAG_GROUPING_DISABLED),
   38|   102k|          fIgnorablesMatcher(PARSE_FLAG_STRICT_IGNORABLES) {
   39|       |
   40|   102k|    const UnicodeString& minusSign = dfs.getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol);
   41|   102k|    if (minusSignSet().contains(minusSign)) {
  ------------------
  |  Branch (41:9): [True: 94.1k, False: 8.56k]
  ------------------
   42|  94.1k|        fCustomMinusSign.setToBogus();
   43|  94.1k|    } else {
   44|  8.56k|        fCustomMinusSign = minusSign;
   45|  8.56k|    }
   46|       |
   47|   102k|    const UnicodeString& plusSign = dfs.getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol);
   48|   102k|    if (plusSignSet().contains(plusSign)) {
  ------------------
  |  Branch (48:9): [True: 94.1k, False: 8.56k]
  ------------------
   49|  94.1k|        fCustomPlusSign.setToBogus();
   50|  94.1k|    } else {
   51|  8.56k|        fCustomPlusSign = plusSign;
   52|  8.56k|    }
   53|   102k|}
_ZNK6icu_788numparse4impl17ScientificMatcher5matchERNS_13StringSegmentERNS1_12ParsedNumberER10UErrorCode:
   55|   565k|bool ScientificMatcher::match(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const {
   56|       |    // Only accept scientific notation after the mantissa.
   57|   565k|    if (!result.seenNumber()) {
  ------------------
  |  Branch (57:9): [True: 95.2k, False: 470k]
  ------------------
   58|  95.2k|        return false;
   59|  95.2k|    }
   60|       |
   61|       |    // Only accept one exponent per string.
   62|   470k|    if (0 != (result.flags & FLAG_HAS_EXPONENT)) {
  ------------------
  |  Branch (62:9): [True: 106k, False: 364k]
  ------------------
   63|   106k|        return false;
   64|   106k|    }
   65|       |
   66|       |    // First match the scientific separator, and then match another number after it.
   67|       |    // NOTE: This is guarded by the smoke test; no need to check fExponentSeparatorString length again.
   68|   364k|    int32_t initialOffset = segment.getOffset();
   69|   364k|    int32_t overlap = segment.getCommonPrefixLength(fExponentSeparatorString);
   70|   364k|    if (overlap == fExponentSeparatorString.length()) {
  ------------------
  |  Branch (70:9): [True: 363k, False: 507]
  ------------------
   71|       |        // Full exponent separator match.
   72|       |
   73|       |        // First attempt to get a code point, returning true if we can't get one.
   74|   363k|        if (segment.length() == overlap) {
  ------------------
  |  Branch (74:13): [True: 127, False: 363k]
  ------------------
   75|    127|            return true;
   76|    127|        }
   77|   363k|        segment.adjustOffset(overlap);
   78|       |
   79|       |        // Allow ignorables before the sign.
   80|       |        // Note: call site is guarded by the segment.length() check above.
   81|       |        // Note: the ignorables matcher should not touch the result.
   82|   363k|        fIgnorablesMatcher.match(segment, result, status);
   83|   363k|        if (segment.length() == 0) {
  ------------------
  |  Branch (83:13): [True: 6, False: 363k]
  ------------------
   84|      6|            segment.setOffset(initialOffset);
   85|      6|            return true;
   86|      6|        }
   87|       |
   88|       |        // Allow a sign, and then try to match digits.
   89|   363k|        int8_t exponentSign = 1;
   90|   363k|        if (segment.startsWith(minusSignSet())) {
  ------------------
  |  Branch (90:13): [True: 97.1k, False: 266k]
  ------------------
   91|  97.1k|            exponentSign = -1;
   92|  97.1k|            segment.adjustOffsetByCodePoint();
   93|   266k|        } else if (segment.startsWith(plusSignSet())) {
  ------------------
  |  Branch (93:20): [True: 1.47k, False: 264k]
  ------------------
   94|  1.47k|            segment.adjustOffsetByCodePoint();
   95|   264k|        } else if (segment.startsWith(fCustomMinusSign)) {
  ------------------
  |  Branch (95:20): [True: 455, False: 264k]
  ------------------
   96|    455|            overlap = segment.getCommonPrefixLength(fCustomMinusSign);
   97|    455|            if (overlap != fCustomMinusSign.length()) {
  ------------------
  |  Branch (97:17): [True: 203, False: 252]
  ------------------
   98|       |                // Partial custom sign match
   99|    203|                segment.setOffset(initialOffset);
  100|    203|                return true;
  101|    203|            }
  102|    252|            exponentSign = -1;
  103|    252|            segment.adjustOffset(overlap);
  104|   264k|        } else if (segment.startsWith(fCustomPlusSign)) {
  ------------------
  |  Branch (104:20): [True: 0, False: 264k]
  ------------------
  105|      0|            overlap = segment.getCommonPrefixLength(fCustomPlusSign);
  106|      0|            if (overlap != fCustomPlusSign.length()) {
  ------------------
  |  Branch (106:17): [True: 0, False: 0]
  ------------------
  107|       |                // Partial custom sign match
  108|      0|                segment.setOffset(initialOffset);
  109|      0|                return true;
  110|      0|            }
  111|      0|            segment.adjustOffset(overlap);
  112|      0|        }
  113|       |
  114|       |        // Return true if the segment is empty.
  115|   363k|        if (segment.length() == 0) {
  ------------------
  |  Branch (115:13): [True: 334, False: 362k]
  ------------------
  116|    334|            segment.setOffset(initialOffset);
  117|    334|            return true;
  118|    334|        }
  119|       |
  120|       |        // Allow ignorables after the sign.
  121|       |        // Note: call site is guarded by the segment.length() check above.
  122|       |        // Note: the ignorables matcher should not touch the result.
  123|   362k|        fIgnorablesMatcher.match(segment, result, status);
  124|   362k|        if (segment.length() == 0) {
  ------------------
  |  Branch (124:13): [True: 5, False: 362k]
  ------------------
  125|      5|            segment.setOffset(initialOffset);
  126|      5|            return true;
  127|      5|        }
  128|       |
  129|       |        // We are supposed to accept E0 after NaN, so we need to make sure result.quantity is available.
  130|   362k|        bool wasBogus = result.quantity.bogus;
  131|   362k|        result.quantity.bogus = false;
  132|   362k|        int digitsOffset = segment.getOffset();
  133|   362k|        bool digitsReturnValue = fExponentMatcher.match(segment, result, exponentSign, status);
  134|   362k|        result.quantity.bogus = wasBogus;
  135|       |
  136|   362k|        if (segment.getOffset() != digitsOffset) {
  ------------------
  |  Branch (136:13): [True: 275k, False: 87.2k]
  ------------------
  137|       |            // At least one exponent digit was matched.
  138|   275k|            result.flags |= FLAG_HAS_EXPONENT;
  139|   275k|        } else {
  140|       |            // No exponent digits were matched
  141|  87.2k|            segment.setOffset(initialOffset);
  142|  87.2k|        }
  143|   362k|        return digitsReturnValue;
  144|       |
  145|   362k|    } else if (overlap == segment.length()) {
  ------------------
  |  Branch (145:16): [True: 0, False: 507]
  ------------------
  146|       |        // Partial exponent separator match
  147|      0|        return true;
  148|      0|    }
  149|       |
  150|       |    // No match
  151|    507|    return false;
  152|   364k|}
_ZNK6icu_788numparse4impl17ScientificMatcher9smokeTestERKNS_13StringSegmentE:
  154|  7.70M|bool ScientificMatcher::smokeTest(const StringSegment& segment) const {
  155|  7.70M|    return segment.startsWith(fExponentSeparatorString);
  156|  7.70M|}
numparse_scientific.cpp:_ZN12_GLOBAL__N_112minusSignSetEv:
   24|   466k|inline const UnicodeSet& minusSignSet() {
   25|   466k|    return *unisets::get(unisets::MINUS_SIGN);
   26|   466k|}
numparse_scientific.cpp:_ZN12_GLOBAL__N_111plusSignSetEv:
   28|   369k|inline const UnicodeSet& plusSignSet() {
   29|   369k|    return *unisets::get(unisets::PLUS_SIGN);
   30|   369k|}

_ZN6icu_788numparse4impl17ScientificMatcherC2Ev:
   22|   102k|    ScientificMatcher() = default;  // WARNING: Leaves the object in an unusable state

_ZN6icu_788numparse4impl13SymbolMatcherC2ERKNS_13UnicodeStringENS_7unisets3KeyE:
   22|   552k|SymbolMatcher::SymbolMatcher(const UnicodeString& symbolString, unisets::Key key) {
   23|   552k|    fUniSet = unisets::get(key);
   24|   552k|    if (fUniSet->contains(symbolString)) {
  ------------------
  |  Branch (24:9): [True: 221k, False: 330k]
  ------------------
   25|   221k|        fString.setToBogus();
   26|   330k|    } else {
   27|   330k|        fString = symbolString;
   28|   330k|    }
   29|   552k|}
_ZNK6icu_788numparse4impl13SymbolMatcher6getSetEv:
   31|  1.55k|const UnicodeSet* SymbolMatcher::getSet() const {
   32|  1.55k|    return fUniSet;
   33|  1.55k|}
_ZNK6icu_788numparse4impl13SymbolMatcher5matchERNS_13StringSegmentERNS1_12ParsedNumberER10UErrorCode:
   35|   933k|bool SymbolMatcher::match(StringSegment& segment, ParsedNumber& result, UErrorCode&) const {
   36|       |    // Smoke test first; this matcher might be disabled.
   37|   933k|    if (isDisabled(result)) {
  ------------------
  |  Branch (37:9): [True: 405, False: 933k]
  ------------------
   38|    405|        return false;
   39|    405|    }
   40|       |
   41|       |    // Test the string first in order to consume trailing chars greedily.
   42|   933k|    int overlap = 0;
   43|   933k|    if (!fString.isEmpty()) {
  ------------------
  |  Branch (43:9): [True: 38.8k, False: 894k]
  ------------------
   44|  38.8k|        overlap = segment.getCommonPrefixLength(fString);
   45|  38.8k|        if (overlap == fString.length()) {
  ------------------
  |  Branch (45:13): [True: 22.8k, False: 16.0k]
  ------------------
   46|  22.8k|            segment.adjustOffset(fString.length());
   47|  22.8k|            accept(segment, result);
   48|  22.8k|            return false;
   49|  22.8k|        }
   50|  38.8k|    }
   51|       |
   52|   910k|    int cp = segment.getCodePoint();
   53|   910k|    if (cp != -1 && fUniSet->contains(cp)) {
  ------------------
  |  Branch (53:9): [True: 909k, False: 670]
  |  Branch (53:21): [True: 156k, False: 753k]
  ------------------
   54|   156k|        segment.adjustOffset(U16_LENGTH(cp));
  ------------------
  |  |  141|   156k|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 156k, False: 0]
  |  |  ------------------
  ------------------
   55|   156k|        accept(segment, result);
   56|   156k|        return false;
   57|   156k|    }
   58|       |
   59|   754k|    return overlap == segment.length();
   60|   910k|}
_ZNK6icu_788numparse4impl13SymbolMatcher9smokeTestERKNS_13StringSegmentE:
   62|  39.8M|bool SymbolMatcher::smokeTest(const StringSegment& segment) const {
   63|  39.8M|    return segment.startsWith(*fUniSet) || segment.startsWith(fString);
  ------------------
  |  Branch (63:12): [True: 154k, False: 39.7M]
  |  Branch (63:44): [True: 48.0k, False: 39.6M]
  ------------------
   64|  39.8M|}
_ZN6icu_788numparse4impl17IgnorablesMatcherC2Ei:
   73|   205k|        SymbolMatcher(
   74|   205k|            {},
   75|   205k|            (0 != (parseFlags & PARSE_FLAG_STRICT_IGNORABLES)) ?
  ------------------
  |  Branch (75:13): [True: 205k, False: 0]
  ------------------
   76|   205k|                unisets::STRICT_IGNORABLES :
   77|   205k|                unisets::DEFAULT_IGNORABLES) {
   78|   205k|}
_ZNK6icu_788numparse4impl17IgnorablesMatcher10isDisabledERKNS1_12ParsedNumberE:
   88|   844k|bool IgnorablesMatcher::isDisabled(const ParsedNumber&) const {
   89|   844k|    return false;
   90|   844k|}
_ZNK6icu_788numparse4impl17IgnorablesMatcher6acceptERNS_13StringSegmentERNS1_12ParsedNumberE:
   92|   118k|void IgnorablesMatcher::accept(StringSegment&, ParsedNumber&) const {
   93|       |    // No-op
   94|   118k|}
_ZN6icu_788numparse4impl15InfinityMatcherC2ERKNS_20DecimalFormatSymbolsE:
   98|   102k|        : SymbolMatcher(dfs.getConstSymbol(DecimalFormatSymbols::kInfinitySymbol), unisets::INFINITY_SIGN) {
   99|   102k|}
_ZNK6icu_788numparse4impl15InfinityMatcher10isDisabledERKNS1_12ParsedNumberE:
  101|    736|bool InfinityMatcher::isDisabled(const ParsedNumber& result) const {
  102|    736|    return 0 != (result.flags & FLAG_INFINITY);
  103|    736|}
_ZNK6icu_788numparse4impl15InfinityMatcher6acceptERNS_13StringSegmentERNS1_12ParsedNumberE:
  105|    501|void InfinityMatcher::accept(StringSegment& segment, ParsedNumber& result) const {
  106|    501|    result.flags |= FLAG_INFINITY;
  107|    501|    result.setCharsConsumed(segment);
  108|    501|}
_ZN6icu_788numparse4impl16MinusSignMatcherC2ERKNS_20DecimalFormatSymbolsEb:
  112|   108k|        : SymbolMatcher(dfs.getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol), unisets::MINUS_SIGN),
  113|   108k|          fAllowTrailing(allowTrailing) {
  114|   108k|}
_ZNK6icu_788numparse4impl16MinusSignMatcher10isDisabledERKNS1_12ParsedNumberE:
  116|  52.8k|bool MinusSignMatcher::isDisabled(const ParsedNumber& result) const {
  117|  52.8k|    return !fAllowTrailing && result.seenNumber();
  ------------------
  |  Branch (117:12): [True: 0, False: 52.8k]
  |  Branch (117:31): [True: 0, False: 0]
  ------------------
  118|  52.8k|}
_ZNK6icu_788numparse4impl16MinusSignMatcher6acceptERNS_13StringSegmentERNS1_12ParsedNumberE:
  120|  35.6k|void MinusSignMatcher::accept(StringSegment& segment, ParsedNumber& result) const {
  121|  35.6k|    result.flags |= FLAG_NEGATIVE;
  122|  35.6k|    result.setCharsConsumed(segment);
  123|  35.6k|}
_ZN6icu_788numparse4impl10NanMatcherC2ERKNS_20DecimalFormatSymbolsE:
  127|   102k|        : SymbolMatcher(dfs.getConstSymbol(DecimalFormatSymbols::kNaNSymbol), unisets::EMPTY) {
  128|   102k|}
_ZNK6icu_788numparse4impl10NanMatcher10isDisabledERKNS1_12ParsedNumberE:
  130|  22.4k|bool NanMatcher::isDisabled(const ParsedNumber& result) const {
  131|  22.4k|    return result.seenNumber();
  132|  22.4k|}
_ZNK6icu_788numparse4impl10NanMatcher6acceptERNS_13StringSegmentERNS1_12ParsedNumberE:
  134|  21.6k|void NanMatcher::accept(StringSegment& segment, ParsedNumber& result) const {
  135|  21.6k|    result.flags |= FLAG_NAN;
  136|  21.6k|    result.setCharsConsumed(segment);
  137|  21.6k|}
_ZN6icu_788numparse4impl14PaddingMatcherC2ERKNS_13UnicodeStringE:
  141|  1.55k|        : SymbolMatcher(padString, unisets::EMPTY) {}
_ZNK6icu_788numparse4impl14PaddingMatcher10isDisabledERKNS1_12ParsedNumberE:
  147|  1.13k|bool PaddingMatcher::isDisabled(const ParsedNumber&) const {
  148|  1.13k|    return false;
  149|  1.13k|}
_ZNK6icu_788numparse4impl14PaddingMatcher6acceptERNS_13StringSegmentERNS1_12ParsedNumberE:
  151|  1.13k|void PaddingMatcher::accept(StringSegment&, ParsedNumber&) const {
  152|       |    // No-op
  153|  1.13k|}
_ZN6icu_788numparse4impl14PercentMatcherC2ERKNS_20DecimalFormatSymbolsE:
  157|  24.6k|        : SymbolMatcher(dfs.getConstSymbol(DecimalFormatSymbols::kPercentSymbol), unisets::PERCENT_SIGN) {
  158|  24.6k|}
_ZNK6icu_788numparse4impl14PercentMatcher10isDisabledERKNS1_12ParsedNumberE:
  160|  1.34k|bool PercentMatcher::isDisabled(const ParsedNumber& result) const {
  161|  1.34k|    return 0 != (result.flags & FLAG_PERCENT);
  162|  1.34k|}
_ZNK6icu_788numparse4impl14PercentMatcher6acceptERNS_13StringSegmentERNS1_12ParsedNumberE:
  164|    540|void PercentMatcher::accept(StringSegment& segment, ParsedNumber& result) const {
  165|    540|    result.flags |= FLAG_PERCENT;
  166|    540|    result.setCharsConsumed(segment);
  167|    540|}
_ZN6icu_788numparse4impl15PermilleMatcherC2ERKNS_20DecimalFormatSymbolsE:
  171|    874|        : SymbolMatcher(dfs.getConstSymbol(DecimalFormatSymbols::kPerMillSymbol), unisets::PERMILLE_SIGN) {
  172|    874|}
_ZNK6icu_788numparse4impl15PermilleMatcher10isDisabledERKNS1_12ParsedNumberE:
  174|  9.52k|bool PermilleMatcher::isDisabled(const ParsedNumber& result) const {
  175|  9.52k|    return 0 != (result.flags & FLAG_PERMILLE);
  176|  9.52k|}
_ZNK6icu_788numparse4impl15PermilleMatcher6acceptERNS_13StringSegmentERNS1_12ParsedNumberE:
  178|     29|void PermilleMatcher::accept(StringSegment& segment, ParsedNumber& result) const {
  179|     29|    result.flags |= FLAG_PERMILLE;
  180|     29|    result.setCharsConsumed(segment);
  181|     29|}
_ZN6icu_788numparse4impl15PlusSignMatcherC2ERKNS_20DecimalFormatSymbolsEb:
  185|  5.40k|        : SymbolMatcher(dfs.getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol), unisets::PLUS_SIGN),
  186|  5.40k|          fAllowTrailing(allowTrailing) {
  187|  5.40k|}
_ZNK6icu_788numparse4impl15PlusSignMatcher10isDisabledERKNS1_12ParsedNumberE:
  189|    878|bool PlusSignMatcher::isDisabled(const ParsedNumber& result) const {
  190|    878|    return !fAllowTrailing && result.seenNumber();
  ------------------
  |  Branch (190:12): [True: 0, False: 878]
  |  Branch (190:31): [True: 0, False: 0]
  ------------------
  191|    878|}
_ZNK6icu_788numparse4impl15PlusSignMatcher6acceptERNS_13StringSegmentERNS1_12ParsedNumberE:
  193|    878|void PlusSignMatcher::accept(StringSegment& segment, ParsedNumber& result) const {
  194|    878|    result.setCharsConsumed(segment);
  195|    878|}

_ZN6icu_788numparse4impl17IgnorablesMatcherC2Ev:
   50|   205k|    IgnorablesMatcher() = default;  // WARNING: Leaves the object in an unusable state
_ZN6icu_788numparse4impl13SymbolMatcherC2Ev:
   25|  1.74M|    SymbolMatcher() = default;  // WARNING: Leaves the object in an unusable state
_ZN6icu_788numparse4impl15InfinityMatcherC2Ev:
   67|   102k|    InfinityMatcher() = default;  // WARNING: Leaves the object in an unusable state
_ZN6icu_788numparse4impl16MinusSignMatcherC2Ev:
   81|   308k|    MinusSignMatcher() = default;  // WARNING: Leaves the object in an unusable state
_ZN6icu_788numparse4impl10NanMatcherC2Ev:
   97|   102k|    NanMatcher() = default;  // WARNING: Leaves the object in an unusable state
_ZN6icu_788numparse4impl14PaddingMatcherC2Ev:
  110|   102k|    PaddingMatcher() = default;  // WARNING: Leaves the object in an unusable state
_ZN6icu_788numparse4impl14PercentMatcherC2Ev:
  126|   308k|    PercentMatcher() = default;  // WARNING: Leaves the object in an unusable state
_ZN6icu_788numparse4impl15PermilleMatcherC2Ev:
  139|   308k|    PermilleMatcher() = default;  // WARNING: Leaves the object in an unusable state
_ZN6icu_788numparse4impl15PlusSignMatcherC2Ev:
  153|   308k|    PlusSignMatcher() = default;  // WARNING: Leaves the object in an unusable state

_ZNK6icu_788numparse4impl18NumberParseMatcher10isFlexibleEv:
  198|  23.2M|    virtual bool isFlexible() const {
  199|  23.2M|        return false;
  200|  23.2M|    }
_ZNK6icu_788numparse4impl18NumberParseMatcher11postProcessERNS1_12ParsedNumberE:
  241|  57.3M|    virtual void postProcess(ParsedNumber&) const {
  242|       |        // Default implementation: no-op
  243|  57.3M|    }
_ZN6icu_788numparse4impl18NumberParseMatcherC2Ev:
  250|  77.3M|    NumberParseMatcher() = default;
_ZN6icu_788numparse4impl20CompactUnicodeStringILi4EEC2Ev:
   61|  2.71M|    CompactUnicodeString() {
   62|  2.71M|        static_assert(stackCapacity > 0, "cannot have zero space on stack");
   63|  2.71M|        fBuffer[0] = 0;
   64|  2.71M|    }
_ZN6icu_788numparse4impl24MutableMatcherCollectionD2Ev:
  260|   262k|    virtual ~MutableMatcherCollection() = default;
_ZN6icu_788numparse4impl12ParsedNumberC2ERKS2_:
  131|  76.1k|    ParsedNumber(const ParsedNumber& other) = default;
_ZN6icu_788numparse4impl12ParsedNumberaSERKS2_:
  133|  37.1k|    ParsedNumber& operator=(const ParsedNumber& other) = default;
_ZN6icu_788numparse4impl20CompactUnicodeStringILi4EEC2ERKNS_13UnicodeStringER10UErrorCode:
   67|   159k|            : fBuffer(text.length() + 1, status) {
   68|   159k|        if (U_FAILURE(status)) { return; }
  ------------------
  |  Branch (68:13): [True: 0, False: 159k]
  ------------------
   69|   159k|        uprv_memcpy(fBuffer.getAlias(), text.getBuffer(), sizeof(char16_t) * text.length());
  ------------------
  |  |   42|   159k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|   159k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|   159k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|   159k|    _Pragma("clang diagnostic push") \
  |  |   45|   159k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|   159k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|   159k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|   159k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|   159k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|   159k|    _Pragma("clang diagnostic pop") \
  |  |   49|   159k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|   159k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|   159k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|   159k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   70|   159k|        fBuffer[text.length()] = 0;
   71|   159k|    }
_ZNK6icu_788numparse4impl20CompactUnicodeStringILi4EE22toAliasedUnicodeStringEv:
   73|  9.12M|    inline UnicodeString toAliasedUnicodeString() const {
   74|  9.12M|        return UnicodeString(true, fBuffer.getAlias(), -1);
   75|  9.12M|    }
_ZNK6icu_788numparse4impl20CompactUnicodeStringILi4EEeqERKS3_:
   77|  9.07k|    bool operator==(const CompactUnicodeString& other) const {
   78|       |        // Use the alias-only constructor and then call UnicodeString operator==
   79|  9.07k|        return toAliasedUnicodeString() == other.toAliasedUnicodeString();
   80|  9.07k|    }

numparse_currency.cpp:_ZN6icu_788numparse4impl5utilsL16copyCurrencyCodeEPDsPKDs:
   29|  56.2k|inline static void copyCurrencyCode(char16_t* dest, const char16_t* src) {
   30|  56.2k|    uprv_memcpy(dest, src, sizeof(char16_t) * 3);
  ------------------
  |  |   42|  56.2k|#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \
  |  |  ------------------
  |  |  |  |  169|  56.2k|#define UPRV_BLOCK_MACRO_BEGIN do
  |  |  ------------------
  |  |   43|  56.2k|    /* Suppress warnings about addresses that will never be NULL */ \
  |  |   44|  56.2k|    _Pragma("clang diagnostic push") \
  |  |   45|  56.2k|    _Pragma("clang diagnostic ignored \"-Waddress\"") \
  |  |   46|  56.2k|    U_ASSERT(dst != NULL); \
  |  |  ------------------
  |  |  |  |   35|  56.2k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   47|  56.2k|    U_ASSERT(src != NULL); \
  |  |  ------------------
  |  |  |  |   35|  56.2k|#   define U_ASSERT(exp) (void)0
  |  |  ------------------
  |  |   48|  56.2k|    _Pragma("clang diagnostic pop") \
  |  |   49|  56.2k|    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \
  |  |  ------------------
  |  |  |  |  393|  56.2k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  |  |   50|  56.2k|} UPRV_BLOCK_MACRO_END
  |  |  ------------------
  |  |  |  |  178|  56.2k|#define UPRV_BLOCK_MACRO_END while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (178:37): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   31|  56.2k|    dest[3] = 0;
   32|  56.2k|}

_ZNK6icu_788numparse4impl21RequireAffixValidator11postProcessERNS1_12ParsedNumberE:
   21|  7.43M|void RequireAffixValidator::postProcess(ParsedNumber& result) const {
   22|  7.43M|    if (result.prefix.isBogus() || result.suffix.isBogus()) {
  ------------------
  |  Branch (22:9): [True: 1.16M, False: 6.27M]
  |  Branch (22:36): [True: 1.38k, False: 6.27M]
  ------------------
   23|       |        // We saw a prefix or a suffix but not both. Fail the parse.
   24|  1.16M|        result.flags |= FLAG_FAIL;
   25|  1.16M|    }
   26|  7.43M|}
_ZNK6icu_788numparse4impl22RequireNumberValidator11postProcessERNS1_12ParsedNumberE:
   61|  7.43M|void RequireNumberValidator::postProcess(ParsedNumber& result) const {
   62|       |    // Require that a number is matched.
   63|  7.43M|    if (!result.seenNumber()) {
  ------------------
  |  Branch (63:9): [True: 5.33M, False: 2.10M]
  ------------------
   64|  5.33M|        result.flags |= FLAG_FAIL;
   65|  5.33M|    }
   66|  7.43M|}
_ZN6icu_788numparse4impl22MultiplierParseHandlerC2ENS_6number5ScaleE:
   73|  10.3k|        : fMultiplier(std::move(multiplier)) {}
_ZNK6icu_788numparse4impl22MultiplierParseHandler11postProcessERNS1_12ParsedNumberE:
   75|   112k|void MultiplierParseHandler::postProcess(ParsedNumber& result) const {
   76|   112k|    if (!result.quantity.bogus) {
  ------------------
  |  Branch (76:9): [True: 87.2k, False: 25.7k]
  ------------------
   77|  87.2k|        fMultiplier.applyReciprocalTo(result.quantity);
   78|       |        // NOTE: It is okay if the multiplier was negative.
   79|  87.2k|    }
   80|   112k|}

_ZNK6icu_788numparse4impl17ValidationMatcher9smokeTestERKNS_13StringSegmentE:
   23|  14.9M|    bool smokeTest(const StringSegment&) const override {
   24|       |        // No-op
   25|  14.9M|        return false;
   26|  14.9M|    }
_ZN6icu_788numparse4impl32RequireDecimalSeparatorValidatorC2Ev:
   50|   102k|    RequireDecimalSeparatorValidator() = default;  // leaves instance in valid but undefined state
_ZN6icu_788numparse4impl22MultiplierParseHandlerC2Ev:
   76|   102k|    MultiplierParseHandler() = default;  // leaves instance in valid but undefined state

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

_ZN6icu_7821RuleBasedNumberFormatC2ERKNS_13UnicodeStringERKNS_6LocaleER11UParseErrorR10UErrorCode:
  788|  9.53k|  : fRuleSets(nullptr)
  789|  9.53k|  , ruleSetDescriptions(nullptr)
  790|  9.53k|  , numRuleSets(0)
  791|  9.53k|  , defaultRuleSet(nullptr)
  792|  9.53k|  , locale(aLocale)
  793|  9.53k|  , collator(nullptr)
  794|  9.53k|  , decimalFormatSymbols(nullptr)
  795|  9.53k|  , defaultInfinityRule(nullptr)
  796|  9.53k|  , defaultNaNRule(nullptr)
  797|  9.53k|  , fRoundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary)
  798|  9.53k|  , lenient(false)
  799|  9.53k|  , lenientParseRules(nullptr)
  800|  9.53k|  , localizations(nullptr)
  801|  9.53k|  , capitalizationInfoSet(false)
  802|  9.53k|  , capitalizationForUIListMenu(false)
  803|  9.53k|  , capitalizationForStandAlone(false)
  804|  9.53k|  , capitalizationBrkIter(nullptr)
  805|  9.53k|{
  806|  9.53k|    init(description, nullptr, perror, status);
  807|  9.53k|}
_ZN6icu_7821RuleBasedNumberFormatD2Ev:
  929|  9.53k|{
  930|  9.53k|    dispose();
  931|  9.53k|}
_ZNK6icu_7821RuleBasedNumberFormat11findRuleSetERKNS_13UnicodeStringER10UErrorCode:
 1106|     49|{
 1107|     49|    if (U_SUCCESS(status) && fRuleSets) {
  ------------------
  |  Branch (1107:9): [True: 44, False: 5]
  |  Branch (1107:30): [True: 44, False: 0]
  ------------------
 1108|    569|        for (NFRuleSet** p = fRuleSets; *p; ++p) {
  ------------------
  |  Branch (1108:41): [True: 526, False: 43]
  ------------------
 1109|    526|            NFRuleSet* rs = *p;
 1110|    526|            if (rs->isNamed(name)) {
  ------------------
  |  Branch (1110:17): [True: 1, False: 525]
  ------------------
 1111|      1|                return rs;
 1112|      1|            }
 1113|    526|        }
 1114|     43|        status = U_ILLEGAL_ARGUMENT_ERROR;
 1115|     43|    }
 1116|     48|    return nullptr;
 1117|     49|}
_ZNK6icu_7821RuleBasedNumberFormat5parseERKNS_13UnicodeStringERNS_11FormattableERNS_13ParsePositionE:
 1347|  8.19k|{
 1348|  8.19k|    if (!fRuleSets) {
  ------------------
  |  Branch (1348:9): [True: 0, False: 8.19k]
  ------------------
 1349|      0|        parsePosition.setErrorIndex(0);
 1350|      0|        return;
 1351|      0|    }
 1352|       |
 1353|  8.19k|    UnicodeString workingText(text, parsePosition.getIndex());
 1354|  8.19k|    ParsePosition workingPos(0);
 1355|       |
 1356|  8.19k|    ParsePosition high_pp(0);
 1357|  8.19k|    Formattable high_result;
 1358|       |
 1359|  15.2k|    for (NFRuleSet** p = fRuleSets; *p; ++p) {
  ------------------
  |  Branch (1359:37): [True: 10.9k, False: 4.26k]
  ------------------
 1360|  10.9k|        NFRuleSet *rp = *p;
 1361|  10.9k|        if (rp->isPublic() && rp->isParseable()) {
  ------------------
  |  Branch (1361:13): [True: 9.28k, False: 1.68k]
  |  Branch (1361:31): [True: 9.28k, False: 0]
  ------------------
 1362|  9.28k|            ParsePosition working_pp(0);
 1363|  9.28k|            Formattable working_result;
 1364|       |
 1365|  9.28k|            rp->parse(workingText, working_pp, kMaxDouble, 0, 0, working_result);
  ------------------
  |  |   67|  9.28k|#define kMaxDouble (kHalfMaxDouble * kHalfMaxDouble)
  |  |  ------------------
  |  |  |  |   66|  9.28k|#define kHalfMaxDouble (double)(1 << kSomeNumberOfBitsDiv2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   65|  9.28k|#define kSomeNumberOfBitsDiv2 22
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define kMaxDouble (kHalfMaxDouble * kHalfMaxDouble)
  |  |  ------------------
  |  |  |  |   66|  9.28k|#define kHalfMaxDouble (double)(1 << kSomeNumberOfBitsDiv2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   65|  9.28k|#define kSomeNumberOfBitsDiv2 22
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1366|  9.28k|            if (working_pp.getIndex() > high_pp.getIndex()) {
  ------------------
  |  Branch (1366:17): [True: 5.71k, False: 3.56k]
  ------------------
 1367|  5.71k|                high_pp = working_pp;
 1368|  5.71k|                high_result = working_result;
 1369|       |
 1370|  5.71k|                if (high_pp.getIndex() == workingText.length()) {
  ------------------
  |  Branch (1370:21): [True: 3.93k, False: 1.78k]
  ------------------
 1371|  3.93k|                    break;
 1372|  3.93k|                }
 1373|  5.71k|            }
 1374|  9.28k|        }
 1375|  10.9k|    }
 1376|       |
 1377|  8.19k|    int32_t startIndex = parsePosition.getIndex();
 1378|  8.19k|    parsePosition.setIndex(startIndex + high_pp.getIndex());
 1379|  8.19k|    if (high_pp.getIndex() > 0) {
  ------------------
  |  Branch (1379:9): [True: 5.71k, False: 2.48k]
  ------------------
 1380|  5.71k|        parsePosition.setErrorIndex(-1);
 1381|  5.71k|    } else {
 1382|  2.48k|        int32_t errorIndex = (high_pp.getErrorIndex()>0)? high_pp.getErrorIndex(): 0;
  ------------------
  |  Branch (1382:30): [True: 0, False: 2.48k]
  ------------------
 1383|  2.48k|        parsePosition.setErrorIndex(startIndex + errorIndex);
 1384|  2.48k|    }
 1385|  8.19k|    result = high_result;
 1386|  8.19k|    if (result.getType() == Formattable::kDouble) {
  ------------------
  |  Branch (1386:9): [True: 5.71k, False: 2.48k]
  ------------------
 1387|  5.71k|        double d = result.getDouble();
 1388|  5.71k|        if (!uprv_isNaN(d) && d == uprv_trunc(d) && INT32_MIN <= d && d <= INT32_MAX) {
  ------------------
  |  | 1519|  5.71k|#define uprv_isNaN U_ICU_ENTRY_POINT_RENAME(uprv_isNaN)
  |  |  ------------------
  |  |  |  |  123|  5.71k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.71k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.71k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
                      if (!uprv_isNaN(d) && d == uprv_trunc(d) && INT32_MIN <= d && d <= INT32_MAX) {
  ------------------
  |  | 1548|  5.70k|#define uprv_trunc U_ICU_ENTRY_POINT_RENAME(uprv_trunc)
  |  |  ------------------
  |  |  |  |  123|  5.70k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  5.70k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  5.70k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1388:13): [True: 5.70k, False: 3]
  |  Branch (1388:31): [True: 5.68k, False: 22]
  |  Branch (1388:53): [True: 5.68k, False: 1]
  |  Branch (1388:71): [True: 5.63k, False: 48]
  ------------------
 1389|       |            // Note: casting a double to an int when the double is too large or small
 1390|       |            //       to fit the destination is undefined behavior. The explicit range checks,
 1391|       |            //       above, are required. Just casting and checking the result value is undefined.
 1392|  5.63k|            result.setLong(static_cast<int32_t>(d));
 1393|  5.63k|        }
 1394|  5.71k|    }
 1395|  8.19k|}
_ZN6icu_7821RuleBasedNumberFormat18initDefaultRuleSetEv:
 1445|  9.34k|{
 1446|  9.34k|    defaultRuleSet = nullptr;
 1447|  9.34k|    if (!fRuleSets) {
  ------------------
  |  Branch (1447:9): [True: 0, False: 9.34k]
  ------------------
 1448|      0|        return;
 1449|      0|    }
 1450|       |
 1451|  9.34k|    const UnicodeString spellout(UNICODE_STRING_SIMPLE("%spellout-numbering"));
  ------------------
  |  |  135|  9.34k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  9.34k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
 1452|  9.34k|    const UnicodeString ordinal(UNICODE_STRING_SIMPLE("%digits-ordinal"));
  ------------------
  |  |  135|  9.34k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  9.34k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
 1453|  9.34k|    const UnicodeString duration(UNICODE_STRING_SIMPLE("%duration"));
  ------------------
  |  |  135|  9.34k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  9.34k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
 1454|       |
 1455|  9.34k|    NFRuleSet**p = &fRuleSets[0];
 1456|   109k|    while (*p) {
  ------------------
  |  Branch (1456:12): [True: 99.6k, False: 9.34k]
  ------------------
 1457|  99.6k|        if ((*p)->isNamed(spellout) || (*p)->isNamed(ordinal) || (*p)->isNamed(duration)) {
  ------------------
  |  Branch (1457:13): [True: 0, False: 99.6k]
  |  Branch (1457:40): [True: 0, False: 99.6k]
  |  Branch (1457:66): [True: 0, False: 99.6k]
  ------------------
 1458|      0|            defaultRuleSet = *p;
 1459|      0|            return;
 1460|  99.6k|        } else {
 1461|  99.6k|            ++p;
 1462|  99.6k|        }
 1463|  99.6k|    }
 1464|       |
 1465|  9.34k|    defaultRuleSet = *--p;
 1466|  9.34k|    if (!defaultRuleSet->isPublic()) {
  ------------------
  |  Branch (1466:9): [True: 149, False: 9.19k]
  ------------------
 1467|  87.4k|        while (p != fRuleSets) {
  ------------------
  |  Branch (1467:16): [True: 87.4k, False: 65]
  ------------------
 1468|  87.4k|            if ((*--p)->isPublic()) {
  ------------------
  |  Branch (1468:17): [True: 84, False: 87.3k]
  ------------------
 1469|     84|                defaultRuleSet = *p;
 1470|     84|                break;
 1471|     84|            }
 1472|  87.4k|        }
 1473|    149|    }
 1474|  9.34k|}
_ZN6icu_7821RuleBasedNumberFormat4initERKNS_13UnicodeStringEPNS_16LocalizationInfoER11UParseErrorR10UErrorCode:
 1480|  9.53k|{
 1481|       |    // TODO: implement UParseError
 1482|  9.53k|    uprv_memset(&pErr, 0, sizeof(UParseError));
  ------------------
  |  |  100|  9.53k|#define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size)
  |  |  ------------------
  |  |  |  |  393|  9.53k|#define U_STANDARD_CPP_NAMESPACE        ::
  |  |  ------------------
  ------------------
 1483|       |    // Note: this can leave ruleSets == nullptr, so remaining code should check
 1484|  9.53k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1484:9): [True: 0, False: 9.53k]
  ------------------
 1485|      0|        return;
 1486|      0|    }
 1487|       |
 1488|  9.53k|    initializeDecimalFormatSymbols(status);
 1489|  9.53k|    initializeDefaultInfinityRule(status);
 1490|  9.53k|    initializeDefaultNaNRule(status);
 1491|  9.53k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1491:9): [True: 0, False: 9.53k]
  ------------------
 1492|      0|        return;
 1493|      0|    }
 1494|       |
 1495|  9.53k|    this->localizations = localizationInfos == nullptr ? nullptr : localizationInfos->ref();
  ------------------
  |  Branch (1495:27): [True: 9.53k, False: 0]
  ------------------
 1496|       |
 1497|  9.53k|    UnicodeString description(rules);
 1498|  9.53k|    if (!description.length()) {
  ------------------
  |  Branch (1498:9): [True: 189, False: 9.34k]
  ------------------
 1499|    189|        status = U_MEMORY_ALLOCATION_ERROR;
 1500|    189|        return;
 1501|    189|    }
 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|  9.34k|    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|  9.34k|    int32_t lp = description.indexOf(gLenientParse, -1, 0);
 1515|  9.34k|    if (lp != -1) {
  ------------------
  |  Branch (1515:9): [True: 0, False: 9.34k]
  ------------------
 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|  9.34k|    numRuleSets = 0;
 1551|  99.6k|    for (int32_t p = description.indexOf(gSemiPercent, 2, 0); p != -1; p = description.indexOf(gSemiPercent, 2, p)) {
  ------------------
  |  Branch (1551:63): [True: 90.3k, False: 9.34k]
  ------------------
 1552|  90.3k|        ++numRuleSets;
 1553|  90.3k|        ++p;
 1554|  90.3k|    }
 1555|  9.34k|    ++numRuleSets;
 1556|       |
 1557|       |    // our rule list is an array of the appropriate size
 1558|  9.34k|    fRuleSets = static_cast<NFRuleSet**>(uprv_malloc((numRuleSets + 1) * sizeof(NFRuleSet*)));
  ------------------
  |  | 1524|  9.34k|#define uprv_malloc U_ICU_ENTRY_POINT_RENAME(uprv_malloc)
  |  |  ------------------
  |  |  |  |  123|  9.34k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.34k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.34k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1559|       |    /* test for nullptr */
 1560|  9.34k|    if (fRuleSets == nullptr) {
  ------------------
  |  Branch (1560:9): [True: 0, False: 9.34k]
  ------------------
 1561|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1562|      0|        return;
 1563|      0|    }
 1564|       |
 1565|   118k|    for (int i = 0; i <= numRuleSets; ++i) {
  ------------------
  |  Branch (1565:21): [True: 109k, False: 9.34k]
  ------------------
 1566|   109k|        fRuleSets[i] = nullptr;
 1567|   109k|    }
 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|  9.34k|    if (!numRuleSets) {
  ------------------
  |  Branch (1576:9): [True: 0, False: 9.34k]
  ------------------
 1577|      0|        status = U_ILLEGAL_ARGUMENT_ERROR;
 1578|      0|        return;
 1579|      0|    }
 1580|       |
 1581|  9.34k|    ruleSetDescriptions = new UnicodeString[numRuleSets];
 1582|  9.34k|    if (ruleSetDescriptions == nullptr) {
  ------------------
  |  Branch (1582:9): [True: 0, False: 9.34k]
  ------------------
 1583|      0|        status = U_MEMORY_ALLOCATION_ERROR;
 1584|      0|        return;
 1585|      0|    }
 1586|       |
 1587|  9.34k|    {
 1588|  9.34k|        int curRuleSet = 0;
 1589|  9.34k|        int32_t start = 0;
 1590|  99.6k|        for (int32_t p = description.indexOf(gSemiPercent, 2, 0); p != -1; p = description.indexOf(gSemiPercent, 2, start)) {
  ------------------
  |  Branch (1590:67): [True: 90.3k, False: 9.34k]
  ------------------
 1591|  90.3k|            ruleSetDescriptions[curRuleSet].setTo(description, start, p + 1 - start);
 1592|  90.3k|            fRuleSets[curRuleSet] = new NFRuleSet(this, ruleSetDescriptions, curRuleSet, status);
 1593|  90.3k|            if (fRuleSets[curRuleSet] == nullptr) {
  ------------------
  |  Branch (1593:17): [True: 0, False: 90.3k]
  ------------------
 1594|      0|                status = U_MEMORY_ALLOCATION_ERROR;
 1595|      0|                return;
 1596|      0|            }
 1597|  90.3k|            ++curRuleSet;
 1598|  90.3k|            start = p + 1;
 1599|  90.3k|        }
 1600|  9.34k|        ruleSetDescriptions[curRuleSet].setTo(description, start, description.length() - start);
 1601|  9.34k|        fRuleSets[curRuleSet] = new NFRuleSet(this, ruleSetDescriptions, curRuleSet, status);
 1602|  9.34k|        if (fRuleSets[curRuleSet] == nullptr) {
  ------------------
  |  Branch (1602:13): [True: 0, False: 9.34k]
  ------------------
 1603|      0|            status = U_MEMORY_ALLOCATION_ERROR;
 1604|      0|            return;
 1605|      0|        }
 1606|  9.34k|    }
 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|  9.34k|    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|  9.34k|    {
 1623|   109k|        for (int i = 0; i < numRuleSets; i++) {
  ------------------
  |  Branch (1623:25): [True: 99.6k, False: 9.34k]
  ------------------
 1624|  99.6k|            fRuleSets[i]->parseRules(ruleSetDescriptions[i], status);
 1625|  99.6k|        }
 1626|  9.34k|    }
 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|  9.34k|    if (localizationInfos) {
  ------------------
  |  Branch (1635:9): [True: 0, False: 9.34k]
  ------------------
 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|  9.34k|    } else {
 1649|  9.34k|        defaultRuleSet = getDefaultRuleSet();
 1650|  9.34k|    }
 1651|  9.34k|    originalDescription = rules;
 1652|  9.34k|}
_ZN6icu_7821RuleBasedNumberFormat15stripWhitespaceERNS_13UnicodeStringE:
 1704|  9.34k|{
 1705|       |    // iterate through the characters...
 1706|  9.34k|    UnicodeString result;
 1707|       |
 1708|  9.34k|    int start = 0;
 1709|  9.34k|    UChar ch;
 1710|   681k|    while (start < description.length()) {
  ------------------
  |  Branch (1710:12): [True: 681k, False: 339]
  ------------------
 1711|       |        // Seek to the first non-whitespace character...
 1712|       |        // If the first non-whitespace character is semicolon, skip it and continue
 1713|   720k|        while (start < description.length()
  ------------------
  |  Branch (1713:16): [True: 720k, False: 60]
  ------------------
 1714|   720k|            && (PatternProps::isWhiteSpace(ch = description.charAt(start)) || ch == gSemiColon))
  ------------------
  |  Branch (1714:17): [True: 5.29k, False: 715k]
  |  Branch (1714:79): [True: 34.0k, False: 680k]
  ------------------
 1715|  39.3k|        {
 1716|  39.3k|            ++start;
 1717|  39.3k|        }
 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|   681k|        int32_t p = description.indexOf(gSemiColon, start);
 1722|   681k|        if (p == -1) {
  ------------------
  |  Branch (1722:13): [True: 9.00k, False: 672k]
  ------------------
 1723|       |            // or if we don't find a semicolon, just copy the rest of
 1724|       |            // the string into the result
 1725|  9.00k|            result.append(description, start, description.length() - start);
 1726|  9.00k|            break;
 1727|  9.00k|        }
 1728|   672k|        else if (p < description.length()) {
  ------------------
  |  Branch (1728:18): [True: 672k, False: 0]
  ------------------
 1729|   672k|            result.append(description, start, p + 1 - start);
 1730|   672k|            start = p + 1;
 1731|   672k|        }
 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|   681k|    }
 1737|       |
 1738|  9.34k|    description.setTo(result);
 1739|  9.34k|}
_ZN6icu_7821RuleBasedNumberFormat7disposeEv:
 1744|  9.53k|{
 1745|  9.53k|    if (fRuleSets) {
  ------------------
  |  Branch (1745:9): [True: 9.34k, False: 189]
  ------------------
 1746|   109k|        for (NFRuleSet** p = fRuleSets; *p; ++p) {
  ------------------
  |  Branch (1746:41): [True: 99.6k, False: 9.34k]
  ------------------
 1747|  99.6k|            delete *p;
 1748|  99.6k|        }
 1749|  9.34k|        uprv_free(fRuleSets);
  ------------------
  |  | 1503|  9.34k|#define uprv_free U_ICU_ENTRY_POINT_RENAME(uprv_free)
  |  |  ------------------
  |  |  |  |  123|  9.34k|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  9.34k|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  9.34k|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1750|  9.34k|        fRuleSets = nullptr;
 1751|  9.34k|    }
 1752|       |
 1753|  9.53k|    if (ruleSetDescriptions) {
  ------------------
  |  Branch (1753:9): [True: 9.34k, False: 189]
  ------------------
 1754|  9.34k|        delete [] ruleSetDescriptions;
 1755|  9.34k|        ruleSetDescriptions = nullptr;
 1756|  9.34k|    }
 1757|       |
 1758|  9.53k|#if !UCONFIG_NO_COLLATION
 1759|  9.53k|    delete collator;
 1760|  9.53k|#endif
 1761|  9.53k|    collator = nullptr;
 1762|       |
 1763|  9.53k|    delete decimalFormatSymbols;
 1764|  9.53k|    decimalFormatSymbols = nullptr;
 1765|       |
 1766|  9.53k|    delete defaultInfinityRule;
 1767|  9.53k|    defaultInfinityRule = nullptr;
 1768|       |
 1769|  9.53k|    delete defaultNaNRule;
 1770|  9.53k|    defaultNaNRule = nullptr;
 1771|       |
 1772|  9.53k|    delete lenientParseRules;
 1773|  9.53k|    lenientParseRules = nullptr;
 1774|       |
 1775|  9.53k|#if !UCONFIG_NO_BREAK_ITERATION
 1776|  9.53k|    delete capitalizationBrkIter;
 1777|  9.53k|    capitalizationBrkIter = nullptr;
 1778|  9.53k|#endif
 1779|       |
 1780|  9.53k|    if (localizations) {
  ------------------
  |  Branch (1780:9): [True: 0, False: 9.53k]
  ------------------
 1781|      0|        localizations = localizations->unref();
 1782|      0|    }
 1783|  9.53k|}
_ZN6icu_7821RuleBasedNumberFormat30initializeDecimalFormatSymbolsER10UErrorCode:
 1848|  9.53k|{
 1849|       |    // lazy-evaluate the DecimalFormatSymbols object.  This object
 1850|       |    // is shared by all DecimalFormat instances belonging to this
 1851|       |    // formatter
 1852|  9.53k|    if (decimalFormatSymbols == nullptr) {
  ------------------
  |  Branch (1852:9): [True: 9.53k, False: 0]
  ------------------
 1853|  9.53k|        LocalPointer<DecimalFormatSymbols> temp(new DecimalFormatSymbols(locale, status), status);
 1854|  9.53k|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1854:13): [True: 9.53k, False: 0]
  ------------------
 1855|  9.53k|            decimalFormatSymbols = temp.orphan();
 1856|  9.53k|        }
 1857|  9.53k|    }
 1858|  9.53k|    return decimalFormatSymbols;
 1859|  9.53k|}
_ZNK6icu_7821RuleBasedNumberFormat23getDecimalFormatSymbolsEv:
 1867|   103k|{
 1868|   103k|    return decimalFormatSymbols;
 1869|   103k|}
_ZN6icu_7821RuleBasedNumberFormat29initializeDefaultInfinityRuleER10UErrorCode:
 1873|  9.53k|{
 1874|  9.53k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1874:9): [True: 0, False: 9.53k]
  ------------------
 1875|      0|        return nullptr;
 1876|      0|    }
 1877|  9.53k|    if (defaultInfinityRule == nullptr) {
  ------------------
  |  Branch (1877:9): [True: 9.53k, False: 0]
  ------------------
 1878|  9.53k|        UnicodeString rule(UNICODE_STRING_SIMPLE("Inf: "));
  ------------------
  |  |  135|  9.53k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  9.53k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
 1879|  9.53k|        rule.append(getDecimalFormatSymbols()->getSymbol(DecimalFormatSymbols::kInfinitySymbol));
 1880|  9.53k|        LocalPointer<NFRule> temp(new NFRule(this, rule, status), status);
 1881|  9.53k|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1881:13): [True: 9.53k, False: 0]
  ------------------
 1882|  9.53k|            defaultInfinityRule = temp.orphan();
 1883|  9.53k|        }
 1884|  9.53k|    }
 1885|  9.53k|    return defaultInfinityRule;
 1886|  9.53k|}
_ZN6icu_7821RuleBasedNumberFormat24initializeDefaultNaNRuleER10UErrorCode:
 1896|  9.53k|{
 1897|  9.53k|    if (U_FAILURE(status)) {
  ------------------
  |  Branch (1897:9): [True: 0, False: 9.53k]
  ------------------
 1898|      0|        return nullptr;
 1899|      0|    }
 1900|  9.53k|    if (defaultNaNRule == nullptr) {
  ------------------
  |  Branch (1900:9): [True: 9.53k, False: 0]
  ------------------
 1901|  9.53k|        UnicodeString rule(UNICODE_STRING_SIMPLE("NaN: "));
  ------------------
  |  |  135|  9.53k|#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
  |  |  ------------------
  |  |  |  |  121|  9.53k|# define UNICODE_STRING(cs, _length) icu::UnicodeString(true, u ## cs, _length)
  |  |  ------------------
  ------------------
 1902|  9.53k|        rule.append(getDecimalFormatSymbols()->getSymbol(DecimalFormatSymbols::kNaNSymbol));
 1903|  9.53k|        LocalPointer<NFRule> temp(new NFRule(this, rule, status), status);
 1904|  9.53k|        if (U_SUCCESS(status)) {
  ------------------
  |  Branch (1904:13): [True: 9.53k, False: 0]
  ------------------
 1905|  9.53k|            defaultNaNRule = temp.orphan();
 1906|  9.53k|        }
 1907|  9.53k|    }
 1908|  9.53k|    return defaultNaNRule;
 1909|  9.53k|}

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

_ZN6icu_7814StandardPlural10getKeywordENS0_4FormE:
   29|   443k|const char *StandardPlural::getKeyword(Form p) {
   30|   443k|    U_ASSERT(ZERO <= p && p < COUNT);
  ------------------
  |  |   35|   443k|#   define U_ASSERT(exp) (void)0
  ------------------
   31|   443k|    return gKeywords[p];
   32|   443k|}

_ZN6icu_7813StringSegmentC2ERKNS_13UnicodeStringEb:
   22|  7.43M|        : fStr(str), fStart(0), fEnd(str.length()),
   23|  7.43M|          fFoldCase(ignoreCase) {}
_ZNK6icu_7813StringSegment9getOffsetEv:
   25|   108M|int32_t StringSegment::getOffset() const {
   26|   108M|    return fStart;
   27|   108M|}
_ZN6icu_7813StringSegment9setOffsetEi:
   29|  1.80M|void StringSegment::setOffset(int32_t start) {
   30|  1.80M|    fStart = start;
   31|  1.80M|}
_ZN6icu_7813StringSegment12adjustOffsetEi:
   33|  95.8M|void StringSegment::adjustOffset(int32_t delta) {
   34|  95.8M|    fStart += delta;
   35|  95.8M|}
_ZN6icu_7813StringSegment23adjustOffsetByCodePointEv:
   37|  23.2M|void StringSegment::adjustOffsetByCodePoint() {
   38|  23.2M|    fStart += U16_LENGTH(getCodePoint());
  ------------------
  |  |  141|  23.2M|#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
  |  |  ------------------
  |  |  |  Branch (141:24): [True: 23.2M, False: 3.60k]
  |  |  ------------------
  ------------------
   39|  23.2M|}
_ZNK6icu_7813StringSegment6lengthEv:
   49|   235M|int32_t StringSegment::length() const {
   50|   235M|    return fEnd - fStart;
   51|   235M|}
_ZNK6icu_7813StringSegment6charAtEi:
   53|  10.5M|char16_t StringSegment::charAt(int32_t index) const {
   54|  10.5M|    return fStr.charAt(index + fStart);
   55|  10.5M|}
_ZNK6icu_7813StringSegment12getCodePointEv:
   70|   209M|UChar32 StringSegment::getCodePoint() const {
   71|   209M|    char16_t lead = fStr.charAt(fStart);
   72|   209M|    if (U16_IS_LEAD(lead) && fStart + 1 < fEnd) {
  ------------------
  |  |   59|   419M|#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
  |  |  ------------------
  |  |  |  Branch (59:24): [True: 5.45M, False: 204M]
  |  |  ------------------
  ------------------
  |  Branch (72:30): [True: 5.45M, False: 1.77k]
  ------------------
   73|  5.45M|        return fStr.char32At(fStart);
   74|   204M|    } else if (U16_IS_SURROGATE(lead)) {
  ------------------
  |  |   75|   204M|#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
  |  |  ------------------
  |  |  |  |  193|   204M|#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (193:27): [True: 8.99k, False: 204M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|  8.99k|        return -1;
   76|   204M|    } else {
   77|   204M|        return lead;
   78|   204M|    }
   79|   209M|}
_ZNK6icu_7813StringSegment10startsWithEi:
   81|  26.1M|bool StringSegment::startsWith(UChar32 otherCp) const {
   82|  26.1M|    return codePointsEqual(getCodePoint(), otherCp, fFoldCase);
   83|  26.1M|}
_ZNK6icu_7813StringSegment10startsWithERKNS_10UnicodeSetE:
   85|  50.3M|bool StringSegment::startsWith(const UnicodeSet& uniset) const {
   86|       |    // TODO: Move UnicodeSet case-folding logic here.
   87|       |    // TODO: Handle string matches here instead of separately.
   88|  50.3M|    UChar32 cp = getCodePoint();
   89|  50.3M|    if (cp == -1) {
  ------------------
  |  Branch (89:9): [True: 4.86k, False: 50.3M]
  ------------------
   90|  4.86k|        return false;
   91|  4.86k|    }
   92|  50.3M|    return uniset.contains(cp);
   93|  50.3M|}
_ZNK6icu_7813StringSegment10startsWithERKNS_13UnicodeStringE:
   95|  47.9M|bool StringSegment::startsWith(const UnicodeString& other) const {
   96|  47.9M|    if (other.isBogus() || other.length() == 0 || length() == 0) {
  ------------------
  |  Branch (96:9): [True: 19.9M, False: 28.0M]
  |  Branch (96:28): [True: 9.79M, False: 18.2M]
  |  Branch (96:51): [True: 0, False: 18.2M]
  ------------------
   97|  29.7M|        return false;
   98|  29.7M|    }
   99|  18.2M|    int cp1 = getCodePoint();
  100|  18.2M|    int cp2 = other.char32At(0);
  101|  18.2M|    return codePointsEqual(cp1, cp2, fFoldCase);
  102|  47.9M|}
_ZN6icu_7813StringSegment21getCommonPrefixLengthERKNS_13UnicodeStringE:
  104|  9.77M|int32_t StringSegment::getCommonPrefixLength(const UnicodeString& other) {
  105|  9.77M|    return getPrefixLengthInternal(other, fFoldCase);
  106|  9.77M|}
_ZN6icu_7813StringSegment28getCaseSensitivePrefixLengthERKNS_13UnicodeStringE:
  108|   721k|int32_t StringSegment::getCaseSensitivePrefixLength(const UnicodeString& other) {
  109|   721k|    return getPrefixLengthInternal(other, false);
  110|   721k|}
_ZN6icu_7813StringSegment23getPrefixLengthInternalERKNS_13UnicodeStringEb:
  112|  10.4M|int32_t StringSegment::getPrefixLengthInternal(const UnicodeString& other, bool foldCase) {
  113|  10.4M|    U_ASSERT(other.length() > 0);
  ------------------
  |  |   35|  10.4M|#   define U_ASSERT(exp) (void)0
  ------------------
  114|  10.4M|    int32_t offset = 0;
  115|  11.0M|    for (; offset < uprv_min(length(), other.length());) {
  ------------------
  |  | 1529|  11.0M|#define uprv_min U_ICU_ENTRY_POINT_RENAME(uprv_min)
  |  |  ------------------
  |  |  |  |  123|  11.0M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  11.0M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  11.0M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (115:12): [True: 10.5M, False: 503k]
  ------------------
  116|       |        // TODO: case-fold code points, not chars
  117|  10.5M|        char16_t c1 = charAt(offset);
  118|  10.5M|        char16_t c2 = other.charAt(offset);
  119|  10.5M|        if (!codePointsEqual(c1, c2, foldCase)) {
  ------------------
  |  Branch (119:13): [True: 9.99M, False: 564k]
  ------------------
  120|  9.99M|            break;
  121|  9.99M|        }
  122|   564k|        offset++;
  123|   564k|    }
  124|  10.4M|    return offset;
  125|  10.4M|}
_ZN6icu_7813StringSegment15codePointsEqualEiib:
  127|  54.9M|bool StringSegment::codePointsEqual(UChar32 cp1, UChar32 cp2, bool foldCase) {
  128|  54.9M|    if (cp1 == cp2) {
  ------------------
  |  Branch (128:9): [True: 23.6M, False: 31.2M]
  ------------------
  129|  23.6M|        return true;
  130|  23.6M|    }
  131|  31.2M|    if (!foldCase) {
  ------------------
  |  Branch (131:9): [True: 721k, False: 30.5M]
  ------------------
  132|   721k|        return false;
  133|   721k|    }
  134|  30.5M|    cp1 = u_foldCase(cp1, true);
  ------------------
  |  |  250|  30.5M|#define u_foldCase U_ICU_ENTRY_POINT_RENAME(u_foldCase)
  |  |  ------------------
  |  |  |  |  123|  30.5M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  30.5M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  30.5M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  135|  30.5M|    cp2 = u_foldCase(cp2, true);
  ------------------
  |  |  250|  30.5M|#define u_foldCase U_ICU_ENTRY_POINT_RENAME(u_foldCase)
  |  |  ------------------
  |  |  |  |  123|  30.5M|#       define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)
  |  |  |  |  ------------------
  |  |  |  |  |  |  122|  30.5M|#       define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  121|  30.5M|#       define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  136|  30.5M|    return cp1 == cp2;
  137|  31.2M|}

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

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

_ZNK6icu_7820DecimalFormatSymbols22isCustomCurrencySymbolEv:
  401|   102k|    inline UBool isCustomCurrencySymbol() const {
  402|   102k|        return fIsCustomCurrencySymbol;
  403|   102k|    }
_ZNK6icu_7820DecimalFormatSymbols26isCustomIntlCurrencySymbolEv:
  408|   102k|    inline UBool isCustomIntlCurrencySymbol() const {
  409|   102k|        return fIsCustomIntlCurrencySymbol;
  410|   102k|    }
_ZNK6icu_7820DecimalFormatSymbols16getCodePointZeroEv:
  415|   280k|    inline UChar32 getCodePointZero() const {
  416|   280k|        return fCodePointZero;
  417|   280k|    }
_ZNK6icu_7820DecimalFormatSymbols9getSymbolENS0_19ENumberFormatSymbolE:
  522|  19.0k|DecimalFormatSymbols::getSymbol(ENumberFormatSymbol symbol) const {
  523|  19.0k|    const UnicodeString *strPtr;
  524|  19.0k|    if(symbol < kFormatSymbolCount) {
  ------------------
  |  Branch (524:8): [True: 19.0k, False: 0]
  ------------------
  525|  19.0k|        strPtr = &fSymbols[symbol];
  526|  19.0k|    } else {
  527|      0|        strPtr = &fNoSymbol;
  528|      0|    }
  529|  19.0k|    return *strPtr;
  530|  19.0k|}
_ZNK6icu_7820DecimalFormatSymbols14getConstSymbolENS0_19ENumberFormatSymbolE:
  534|  1.21M|DecimalFormatSymbols::getConstSymbol(ENumberFormatSymbol symbol) const {
  535|  1.21M|    const UnicodeString *strPtr;
  536|  1.21M|    if(symbol < kFormatSymbolCount) {
  ------------------
  |  Branch (536:8): [True: 1.21M, False: 0]
  ------------------
  537|  1.21M|        strPtr = &fSymbols[symbol];
  538|  1.21M|    } else {
  539|      0|        strPtr = &fNoSymbol;
  540|      0|    }
  541|  1.21M|    return *strPtr;
  542|  1.21M|}
_ZNK6icu_7820DecimalFormatSymbols19getConstDigitSymbolEi:
  545|  1.51M|inline const UnicodeString& DecimalFormatSymbols::getConstDigitSymbol(int32_t digit) const {
  546|  1.51M|    if (digit < 0 || digit > 9) {
  ------------------
  |  Branch (546:9): [True: 0, False: 1.51M]
  |  Branch (546:22): [True: 0, False: 1.51M]
  ------------------
  547|      0|        digit = 0;
  548|      0|    }
  549|  1.51M|    if (digit == 0) {
  ------------------
  |  Branch (549:9): [True: 151k, False: 1.36M]
  ------------------
  550|   151k|        return fSymbols[kZeroDigitSymbol];
  551|   151k|    }
  552|  1.36M|    ENumberFormatSymbol key = static_cast<ENumberFormatSymbol>(kOneDigitSymbol + digit - 1);
  553|  1.36M|    return fSymbols[key];
  554|  1.51M|}
_ZN6icu_7820DecimalFormatSymbols9setSymbolENS0_19ENumberFormatSymbolERKNS_13UnicodeStringEa:
  560|  1.96M|DecimalFormatSymbols::setSymbol(ENumberFormatSymbol symbol, const UnicodeString &value, const UBool propagateDigits = true) {
  561|  1.96M|    if (symbol == kCurrencySymbol) {
  ------------------
  |  Branch (561:9): [True: 0, False: 1.96M]
  ------------------
  562|      0|        fIsCustomCurrencySymbol = true;
  563|      0|    }
  564|  1.96M|    else if (symbol == kIntlCurrencySymbol) {
  ------------------
  |  Branch (564:14): [True: 0, False: 1.96M]
  ------------------
  565|      0|        fIsCustomIntlCurrencySymbol = true;
  566|      0|    }
  567|  1.96M|    if(symbol<kFormatSymbolCount) {
  ------------------
  |  Branch (567:8): [True: 1.96M, False: 0]
  ------------------
  568|  1.96M|        fSymbols[symbol]=value;
  569|  1.96M|    }
  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|  1.96M|    if (symbol == kZeroDigitSymbol) {
  ------------------
  |  Branch (574:9): [True: 0, False: 1.96M]
  ------------------
  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|  1.96M|    } else if (symbol >= kOneDigitSymbol && symbol <= kNineDigitSymbol) {
  ------------------
  |  Branch (585:16): [True: 302k, False: 1.66M]
  |  Branch (585:45): [True: 0, False: 302k]
  ------------------
  586|      0|        fCodePointZero = -1;
  587|      0|    }
  588|  1.96M|}
_ZNK6icu_7820DecimalFormatSymbols9getLocaleEv:
  593|   450k|DecimalFormatSymbols::getLocale() const {
  594|   450k|    return locale;
  595|   450k|}
_ZNK6icu_7820DecimalFormatSymbols18getCurrencyPatternEv:
  599|  9.53k|DecimalFormatSymbols::getCurrencyPattern() const {
  600|  9.53k|    return currPattern;
  601|  9.53k|}

_ZNK6icu_7811Formattable9getDoubleEv:
  292|   717k|    double getDouble() const { return fValue.fDouble; }

_ZN6icu_786number8NotationC2ERKNS1_12NotationTypeERKNS1_13NotationUnionE:
  376|  31.2k|    Notation(const NotationType &type, const NotationUnion &union_) : fType(type), fUnion(union_) {}
_ZN6icu_786number8NotationC2Ev:
  382|   602k|    Notation() : fType(NTN_SIMPLE), fUnion() {}
_ZN6icu_786number9PrecisionC2ERKNS1_13PrecisionTypeERKNS1_14PrecisionUnionE:
  767|   152k|            : fType(type), fUnion(union_) {}
_ZN6icu_786number9PrecisionC2E10UErrorCode:
  769|     25|    Precision(UErrorCode errorCode) : fType(RND_ERROR) {
  770|     25|        fUnion.errorCode = errorCode;
  771|     25|    }
_ZN6icu_786number9PrecisionC2Ev:
  773|   883k|    Precision() : fType(RND_BOGUS) {}
_ZNK6icu_786number9Precision7isBogusEv:
  775|   146k|    bool isBogus() const {
  776|   146k|        return fType == RND_BOGUS;
  777|   146k|    }
_ZN6icu_786number12IntegerWidthC2Ev:
 1035|   590k|    IntegerWidth() { // NOLINT
 1036|   590k|        fUnion.minMaxInt.fMinInt = -1;
 1037|   590k|    }
_ZN6icu_786number5ScaleC2Ev:
 1170|   693k|    Scale() : fMagnitude(0), fArbitrary(nullptr), fError(U_ZERO_ERROR) {}
_ZNK6icu_786number5Scale7isValidEv:
 1172|   102k|    bool isValid() const {
 1173|   102k|        return fMagnitude != 0 || fArbitrary != nullptr;
  ------------------
  |  Branch (1173:16): [True: 10.3k, False: 92.4k]
  |  Branch (1173:35): [True: 0, False: 92.4k]
  ------------------
 1174|   102k|    }
_ZN6icu_786number4impl10StringPropC2Ev:
 1256|  1.18M|    StringProp() : fValue(nullptr), fLength(0), fError(U_ZERO_ERROR) {
 1257|  1.18M|    }
_ZN6icu_786number4impl14SymbolsWrapperC2Ev:
 1284|   590k|    SymbolsWrapper() : fType(SYMPTR_NONE), fPtr{nullptr} {}
_ZN6icu_786number4impl7GrouperC2Esss23UNumberGroupingStrategy:
 1388|   249k|            : fGrouping1(grouping1),
 1389|   249k|              fGrouping2(grouping2),
 1390|   249k|              fMinGrouping(minGrouping),
 1391|   249k|              fStrategy(strategy) {}
_ZN6icu_786number4impl7GrouperC2Ev:
 1427|   590k|    Grouper() : fGrouping1(-3) {}
_ZN6icu_786number4impl6PadderC2Ev:
 1487|   590k|    Padder() : fWidth(-2) {} // NOLINT
_ZN6icu_786number24LocalizedNumberFormatterC2Ev:
 2634|   151k|    LocalizedNumberFormatter() = default;
_ZN6icu_786number23NumberFormatterSettingsINS0_24LocalizedNumberFormatterEEC2Ev:
 2408|   297k|    NumberFormatterSettings() = default;
_ZN6icu_786number26UnlocalizedNumberFormatterC2Ev:
 2464|   146k|    UnlocalizedNumberFormatter() = default;
_ZN6icu_786number23NumberFormatterSettingsINS0_26UnlocalizedNumberFormatterEEC2Ev:
 2408|   146k|    NumberFormatterSettings() = default;

_ZNK6icu_7821RuleBasedNumberFormat9isLenientEv:
 1167|  58.7M|RuleBasedNumberFormat::isLenient() const {
 1168|  58.7M|    return lenient;
 1169|  58.7M|}
_ZNK6icu_7821RuleBasedNumberFormat17getDefaultRuleSetEv:
 1174|  9.34k|RuleBasedNumberFormat::getDefaultRuleSet() const {
 1175|  9.34k|    return defaultRuleSet;
 1176|  9.34k|}

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

LLVMFuzzerTestOneInput:
   20|  9.53k|extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   21|  9.53k|  UErrorCode status = U_ZERO_ERROR;
   22|  9.53k|  uint16_t rnd = 0;
   23|       |
   24|  9.53k|  if (size < 2) {
  ------------------
  |  Branch (24:7): [True: 1, False: 9.53k]
  ------------------
   25|      1|    return 0;
   26|      1|  }
   27|       |
   28|  9.53k|  rnd = *(reinterpret_cast<const uint16_t *>(data));
   29|  9.53k|  data = data + 2;
   30|  9.53k|  size = size - 2;
   31|       |
   32|  9.53k|  size_t unistr_size = size/2;
   33|  9.53k|  std::unique_ptr<char16_t[]> fuzzbuff(new char16_t[unistr_size]);
   34|  9.53k|  std::memcpy(fuzzbuff.get(), data, unistr_size * 2);
   35|       |
   36|  9.53k|  const icu::Locale& locale = GetRandomLocale(rnd);
   37|       |
   38|  9.53k|  icu::UnicodeString fuzzstr(false, fuzzbuff.get(), unistr_size);
   39|  9.53k|  icu::Formattable result;
   40|  9.53k|  std::unique_ptr<icu::NumberFormat> fmt(
   41|  9.53k|      icu::NumberFormat::createInstance(locale, status));
   42|  9.53k|  if (U_SUCCESS(status)) {
  ------------------
  |  Branch (42:7): [True: 9.53k, False: 0]
  ------------------
   43|  9.53k|      fmt->parse(fuzzstr, result, status);
   44|  9.53k|  }
   45|       |
   46|  9.53k|  status = U_ZERO_ERROR;
   47|  9.53k|  fmt.reset(icu::NumberFormat::createCurrencyInstance(locale, status));
   48|  9.53k|  if (U_SUCCESS(status)) {
  ------------------
  |  Branch (48:7): [True: 9.53k, False: 0]
  ------------------
   49|  9.53k|      fmt->parse(fuzzstr, result, status);
   50|  9.53k|  }
   51|       |
   52|  9.53k|  status = U_ZERO_ERROR;
   53|  9.53k|  fmt.reset(icu::NumberFormat::createPercentInstance(locale, status));
   54|  9.53k|  if (U_SUCCESS(status)) {
  ------------------
  |  Branch (54:7): [True: 9.53k, False: 0]
  ------------------
   55|  9.53k|      fmt->parse(fuzzstr, result, status);
   56|  9.53k|  }
   57|       |
   58|  9.53k|  status = U_ZERO_ERROR;
   59|  9.53k|  fmt.reset(icu::NumberFormat::createScientificInstance(locale, status));
   60|  9.53k|  if (U_SUCCESS(status)) {
  ------------------
  |  Branch (60:7): [True: 9.53k, False: 0]
  ------------------
   61|  9.53k|      fmt->parse(fuzzstr, result, status);
   62|  9.53k|  }
   63|       |
   64|  9.53k|  status = U_ZERO_ERROR;
   65|  9.53k|  icu::ChoiceFormat cfmt(fuzzstr, status);
   66|  9.53k|  if (U_SUCCESS(status)) {
  ------------------
  |  Branch (66:7): [True: 450, False: 9.08k]
  ------------------
   67|    450|      cfmt.parse(fuzzstr, result, status);
   68|    450|  }
   69|       |
   70|  9.53k|  UParseError perror;
   71|  9.53k|  status = U_ZERO_ERROR;
   72|  9.53k|  icu::RuleBasedNumberFormat rbfmt(fuzzstr, locale, perror, status);
   73|  9.53k|  if (U_SUCCESS(status)) {
  ------------------
  |  Branch (73:7): [True: 8.19k, False: 1.33k]
  ------------------
   74|  8.19k|      rbfmt.parse(fuzzstr, result, status);
   75|  8.19k|  }
   76|       |
   77|  9.53k|  status = U_ZERO_ERROR;
   78|  9.53k|  icu::DecimalFormat dfmt(fuzzstr, status);
   79|  9.53k|  if (U_SUCCESS(status)) {
  ------------------
  |  Branch (79:7): [True: 4.49k, False: 5.03k]
  ------------------
   80|  4.49k|      dfmt.parse(fuzzstr, result, status);
   81|  4.49k|  }
   82|       |
   83|  9.53k|  status = U_ZERO_ERROR;
   84|  9.53k|  fmt.reset(icu::CompactDecimalFormat::createInstance(locale, UNUM_SHORT, status));
   85|  9.53k|  if (U_SUCCESS(status)) {
  ------------------
  |  Branch (85:7): [True: 9.53k, False: 0]
  ------------------
   86|  9.53k|      fmt->parse(fuzzstr, result, status);
   87|  9.53k|  }
   88|       |
   89|  9.53k|  status = U_ZERO_ERROR;
   90|  9.53k|  fmt.reset(icu::CompactDecimalFormat::createInstance(locale, UNUM_LONG, status));
   91|  9.53k|  if (U_SUCCESS(status)) {
  ------------------
  |  Branch (91:7): [True: 9.53k, False: 0]
  ------------------
   92|  9.53k|      fmt->parse(fuzzstr, result, status);
   93|  9.53k|  }
   94|  9.53k|  return 0;
   95|  9.53k|}

